Importa comandi precedenti per il comando modificato


1

Sto giocando con zsh per modificare il tempo di modifica dell'immagine in base all'attributo exif 'Data / Ora originale'.

Per questo ho un comando che faccio:

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

Ho ottenuto alcune immagini con valore errato 'Data / Ora originale', quindi queste immagini non sono state elaborate.

Quindi sto lavorando per ottenere la data dal nome del file delle immagini e ho ottenuto

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

dove logfile è un file contenente messaggi exiftool di valore arbitrario non corretto ecc.

Ora il secondo comando snippet non funziona perché ho bisogno di sostituire la sed come nel primo frammento.

La mia domanda è: pur essendo nella modalità interattiva zsh vi, come posso ottenere l'accesso al primo frammento che è nella cronologia, senza perdere il contenuto del comando corrente?

Immagino di dover modificare il comando corrente in vi (come posso farlo quando premo il carattere 'v' nella modalità di controllo zsh vi), ottenendo il comando di cronologia elencato e scegliendo uno di essi e verrà incollato nella riga sottostante.

Risposte:


2

C'è zsh-cmd-architetto creato appositamente per fare ciò che descrivi. Visualizza il comando corrente, consente di spostare i blocchi a sinistra e a destra e visualizza anche la cronologia ricercabile, dalla quale è possibile scegliere i blocchi di comandi lì.


0

Stai usando zsh nella modalità vi.

Per risolvere il tuo problema dividiamo il problema in due parti

1. parte - stampa le righe della cronologia dei comandi che corrispondono a un modello

Per questo creiamo un file ~/bin/history-print-regexp.sh contenente:

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

Ora dobbiamo farlo funzionare insieme al tuo attuale comando. Per questo facciamo:

Mentre sei nella modalità normale di zsh vi premi il tasto v pulsante due volte e si apre la finestra vi.

Nel tuo file ~ / .vimrc inserisci questa funzione

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

:cnoremap ch call ShowHistoryMatching

L'uso di questo script è, mentre si è nel totale di zsh dell'editor vi che si modifica il comando presente che si preme :ch che è esteso a: chiama ShowHistoryMatching e aggiungi ("pattern") a questo e premi Invio e i risultati si apriranno nella finestra sopra. Da lì puoi facilmente copiare una linea desiderata nella tua seconda finestra.

C-w,q chiude una finestra C-w,j va alla finestra qui sotto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.