Importiere vorherige Befehle in einen bearbeiteten Befehl

393
Jakub

Ich spiele mit zsh, um die Bildänderungszeit entsprechend dem Exif-Attribut "Date / Time Original" zu ändern.

Für diesen einen Befehl mache ich:

PDATE=$(exiftool -p '$DateTimeOriginal' $PIC | sed 's/[: ]//g') touch -t $(echo $PDATE | sed 's/\(..$\)/\.\1/') $PIC

Ich habe einige Bilder mit dem falschen Wert für "Datum / Uhrzeit-Original" erhalten, daher wurden diese Bilder nicht verarbeitet.

Also arbeite ich daran, das Datum aus dem Dateinamen der Bilder zu bekommen, und ich bekam es

for i in `grep -E -o 'IMG\S+jpg' logfile`; do  dte=$(echo $i | grep -E -o '20.' | tr -d '_');  touch -t $dte $i;  done 

Logdatei ist eine Datei, die Exiftool-Nachrichten mit nicht korrektem Wert für die Sammlung usw. enthält.

Nun funktioniert der zweite Befehl des letzten Snippets nicht, da ich wie im ersten Snippet die Sed-Substitution vornehmen muss.

Meine Frage ist: Wie kann ich im interaktiven zsh vi-Modus den Zugriff auf den ersten Ausschnitt der Historie erhalten, ohne den Inhalt des aktuellen Befehls zu verlieren?

Ich kann mir vorstellen, den aktuellen Befehl in vi zu bearbeiten (da ich dies auch tun kann, wenn ich im zsh vi-Steuerungsmodus auf das Zeichen 'v' drücke), den Verlaufsbefehl auflisten lassen und einen von ihnen auswählen, der dann in die folgende Zeile eingefügt wird.

1

2 Antworten auf die Frage

2
One Other

Es gibt einen zsh-cmd-architect, der speziell für das, was Sie beschreiben, erstellt wurde. Es zeigt Ihnen den aktuellen Befehl an, ermöglicht das Verschieben von Blöcken nach links und rechts und zeigt den durchsuchbaren Verlauf an, aus dem Sie dort Befehlsblöcke auswählen können.

0
Jakub

Sie verwenden zsh im vi-Modus.

Um Ihr Problem zu lösen, teilen wir das Problem in zwei Teile

1. Teil - Befehlsprotokollzeilen, die einem Muster entsprechen

Dazu erstellen wir eine Datei ~/bin/history-print-regexp.sh mit:

#!/bin/zsh # command 'regular-expression' number-of-lines(counting from the end of the file) nmbr=15 if [ "$#" -eq 2 ]; then nmbr=$2 fi if [ "$#" -eq 0 ]; then echo "You need at least one argument" echo "Usage command regexp outputlinesCount" fi #tac - reverse print, grep -E - use extended regexp, cut -d ';' use ; as delimiter #and print second field (-f 2), uniq -u print only unique lines tac ~/.histfile | grep -E $1 | cut -d ';' -f 2 | uniq -u | head -n $nmbr 

Jetzt müssen wir es mit Ihrem gegenwärtigen Befehl zusammenarbeiten lassen. Dafür tun wir:

Wenn Sie sich im zsh vi Normal-Modus befinden, drücken Sie vzweimal die Taste. Das vi-Fenster wird geöffnet.

In Ihre ~ / .vimrc-Datei setzen Sie diese Funktion

function! ShowHistoryMatching(pattern) 10new exe 'r!' . "history-print-regexp.sh " . a:pattern call cursor(1,1) endfunction  :cnoremap ch call ShowHistoryMatching 

Die Verwendung dieses Skripts ist, während Sie sich im Editor zsh total vi befinden und den aktuellen Befehl bearbeiten, den Sie drücken. Dieser Befehl :chwird erweitert: Rufen Sie ShowHistoryMatching auf, fügen Sie ("Muster") hinzu und drücken Sie die Eingabetaste. Die Ergebnisse werden oben im Fenster geöffnet. Von dort können Sie einfach eine gewünschte Zeile in Ihr zweites Fenster kopieren.

C-w,qschließt ein Fenster, C-w,jdas zum unteren Fenster geht.