Importar comandos anteriores para o comando editado

1

Eu estou jogando com zsh para alterar o tempo de modificação de imagem de acordo com o atributo exif 'Date / Time Original'.

Para isso eu faço um comando:

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

Eu tenho algumas imagens com valor errado 'Data / Hora Original', então essas imagens não foram processadas.

Então, estou trabalhando para obter a data do nome do arquivo de imagens e recebi

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

onde logfile é um arquivo contendo mensagens exiftool de valor de arribução não correto, etc.

Agora o segundo comando do último snippet não está funcionando porque preciso fazer a substituição do sed no primeiro snippet.

A minha pergunta é: enquanto estiver no modo interativo zsh vi, como posso obter o acesso ao primeiro trecho que está no histórico, sem perder o conteúdo do comando atual?

Eu imaginaria editar o comando atual no vi (como eu posso fazer quando eu pressiono o caractere 'v' no modo de controle zsh vi), obtendo o comando histórico listado e escolhendo um deles e ele será colado na linha abaixo.

Jakub
fonte

Respostas:

2

Há sim zsh-cmd-architect criado especificamente para fazer o que você descreve. Ele exibe seu comando atual, permite mover blocos dele para a esquerda e para a direita e também exibe um histórico pesquisável, a partir do qual você pode escolher blocos de comandos.

One Other
fonte
0

Você está usando o zsh no modo vi.

Para resolver o seu problema, dividimos o problema em duas partes

1. linhas do histórico de comandos part-print correspondentes a um padrão

Para isso, criamos um arquivo ~/bin/history-print-regexp.sh contendo:

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

Agora precisamos fazê-lo funcionar em conjunto com o seu comando atual. Para isso fazemos:

Enquanto estiver no modo normal zsh vi, pressione o v botão duas vezes e a janela vi se abre.

No seu arquivo ~ / .vimrc você coloca essa função

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

:cnoremap ch call ShowHistoryMatching

O uso deste script é, enquanto estiver no editor zsh total vi editando seu comando atual, você pressiona :ch que é estendido para: chamar ShowHistoryMatching e você adiciona ("padrão") a isto e aperta Enter e os resultados abrem na janela acima. De lá você pode facilmente copiar uma linha desejada para sua segunda janela.

C-w,q fecha uma janela C-w,j vai para a janela abaixo.

Jakub
fonte