Zaimportuj poprzednie polecenia do edytowanego polecenia

1

Gram z zsh, aby zmienić czas modyfikacji obrazu zgodnie z atrybutem exif „Oryginalna data / godzina”.

W tym celu wykonuję jedno polecenie:

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

Mam kilka zdjęć z niewłaściwą wartością „Oryginalna data / czas”, więc te obrazy nie zostały przetworzone.

Pracuję więc nad pobraniem daty z nazwy pliku obrazów i mam

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

gdzie plik dziennika jest plikiem zawierającym komunikaty exiftool o niepoprawnej wartości atrybutu itp.

Teraz ostatnie polecenie drugiego fragmentu nie działa, ponieważ muszę dokonać podstawienia sed jak w pierwszym fragmencie.

Moje pytanie brzmi: będąc w trybie interaktywnym zsh vi, jak mogę uzyskać dostęp do pierwszego fragmentu kodu, który jest w historii, bez utraty treści bieżącego polecenia?

Wyobrażam sobie edycję bieżącego polecenia w vi (ponieważ mogę to zrobić, gdy naciskam znak „v” w trybie sterowania zsh vi), wyświetlenie polecenia historii na liście i wybranie jednego z nich, a zostanie ono wklejone w poniższym wierszu.

Kuba
źródło

Odpowiedzi:

2

Istnieje architekt zsh-cmd- stworzony specjalnie do robienia tego, co opisujesz. Wyświetla bieżące polecenie, pozwala przenosić jego bloki w lewo i prawo, a także wyświetla historię do przeszukiwania, z której można wybrać bloki poleceń.

Jeden inny
źródło
0

Używasz Zsh w trybie vi.

Aby rozwiązać problem, podzieliliśmy go na dwie części

1. część - drukuj wiersze historii poleceń pasujące do wzorca

W tym celu tworzymy plik ~/bin/history-print-regexp.sh zawierający:

#!/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

Teraz musimy sprawić, by działał razem z twoim obecnym poleceniem. W tym celu wykonujemy:

Będąc w trybie normalnym zsh vi, naciśnij vdwukrotnie przycisk i otworzy się okno vi.

W pliku ~ / .vimrc umieścisz tę funkcję

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

:cnoremap ch call ShowHistoryMatching

Użycie tego skryptu polega na tym, że będąc w edytorze zsh total vi edytując bieżące polecenie, naciskasz, :chktóry jest rozszerzony na: wywołujesz ShowHistoryMatching i dodajesz („wzorzec”) do tego i naciskasz Enter, a wyniki otwierają się w oknie powyżej. Stamtąd możesz łatwo skopiować żądaną linię do drugiego okna.

C-w,qzamyka okno C-w,jprzechodzi do okna poniżej.

Kuba
źródło