![Importe comandos anteriores para comando editado](https://rvso.com/image/1481857/Importe%20comandos%20anteriores%20para%20comando%20editado.png)
Estou brincando com o zsh para alterar o horário de modificação da imagem de acordo com o atributo exif 'Data/Hora Original'.
Para isso eu faço um comando:
PDATE=$(exiftool -p '$DateTimeOriginal' $PIC | sed 's/[: ]//g') touch -t $(echo $PDATE | sed 's/\(..$\)/\.\1/') $PIC
Recebi algumas imagens com valor errado de 'Data/Hora Original', portanto essas imagens não foram processadas.
Então, estou trabalhando para obter a data do nome do arquivo das imagens e consegui
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 com valor de atributo incorreto, etc.
Agora o último comando do segundo trecho não está funcionando porque preciso fazer a substituição do sed como no primeiro trecho.
Minha dúvida é: estando no modo interativo do zsh vi, como posso obter acesso ao primeiro trecho que está na história, sem perder o conteúdo do comando atual?
Eu imagino editar o comando atual no vi (como posso fazer quando pressiono o caractere 'v' no modo de controle zsh vi), listar os comandos do histórico e escolher um deles e ele será colado na linha abaixo.
Responder1
Háarquiteto zsh-cmdcriado especificamente para fazer o que você descreve. Ele exibe o comando atual, permite mover blocos para a esquerda e para a direita e também exibe um histórico pesquisável, no qual você pode escolher blocos de comandos.
Responder2
Você está usando zsh no modo vi.
Para resolver o seu problema dividimos o problema em duas partes
1. parte - imprime linhas do histórico de comando que correspondem 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 junto com seu comando atual. Para isso fazemos:
Enquanto estiver no modo normal do zsh vi, você pressiona o v
botão duas vezes e a janela do vi é aberta.
No seu arquivo ~/.vimrc você coloca esta 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
o qual é estendido para :call ShowHistoryMatching e adiciona ("padrão") a isso e pressiona Enter e os resultados são abertos na janela acima. A partir daí você pode copiar facilmente uma linha desejada para sua segunda janela.
C-w,q
fecha uma janela
C-w,j
vai para a janela abaixo.