Importe comandos anteriores para comando editado

Importe comandos anteriores para comando editado

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

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 vbotã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 :cho 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,qfecha uma janela C-w,jvai para a janela abaixo.

informação relacionada