Importar comandos anteriores para o comando editado

1

Estou jogando com o zsh para alterar o tempo de modificação da 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/\(..$\)/\./') $PIC

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

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 não arribute, etc.

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

A minha pergunta é: enquanto estiver no modo interativo do zsh vi, como posso obter o acesso ao primeiro fragmento 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 history listado e escolhendo um deles e ele será colado no linha abaixo.

    
por Jakub 27.01.2016 / 00:38

2 respostas

0

Você está usando o zsh no modo vi.

Para resolver seu problema, dividimos o problema em duas partes

1. part - linhas de histórico de comando de impressão 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 trabalhar com o seu comando atual. Para isso fazemos:

Enquanto estiver no modo normal zsh vi, pressione o botão v duas vezes e a janela vi será 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 , 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.

    
por 30.01.2016 / 16:56
2

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.

    
por 29.04.2016 / 16:17