![Importar comandos anteriores al comando editado](https://rvso.com/image/1481857/Importar%20comandos%20anteriores%20al%20comando%20editado.png)
Estoy jugando con zsh para cambiar la hora de modificación de la imagen de acuerdo con el atributo exif 'Fecha/Hora original'.
Para esto hago un comando:
PDATE=$(exiftool -p '$DateTimeOriginal' $PIC | sed 's/[: ]//g') touch -t $(echo $PDATE | sed 's/\(..$\)/\.\1/') $PIC
Obtuve algunas imágenes con un valor de 'Fecha/Hora original' incorrecto, por lo que no se procesaron.
Así que estoy trabajando para obtener la fecha del nombre del archivo de imágenes y obtuve
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
donde el archivo de registro es un archivo que contiene mensajes exiftool con un valor de atributo incorrecto, etc.
Ahora el último comando del segundo fragmento no funciona porque necesito realizar la sustitución de sed como en el primer fragmento.
Mi pregunta es: mientras estoy en el modo interactivo zsh vi, ¿cómo puedo obtener acceso al primer fragmento que está en el historial, sin perder el contenido del comando actual?
Me imagino editando el comando actual en vi (como puedo hacerlo cuando presiono el carácter 'v' en el modo de control zsh vi), obteniendo el comando histórico en la lista y eligiendo uno de ellos y se pegará en la línea siguiente.
Respuesta1
Hayzsh-cmd-arquitectocreado específicamente para hacer lo que usted describe. Muestra su comando actual, permite mover bloques de izquierda a derecha y también muestra el historial de búsqueda, desde el cual puede elegir bloques de comandos allí.
Respuesta2
Estás usando zsh en el modo vi.
Para resolver tu problema dividimos el problema en dos partes.
1. parte: imprimir líneas del historial de comandos que coincidan con un patrón
Para ello creamos un archivo ~/bin/history-print-regexp.sh
que contiene:
#!/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
Ahora necesitamos que funcione junto con su comando actual. Para esto hacemos:
Mientras está en el modo normal zsh vi, presiona el v
botón dos veces y se abre la ventana vi.
En tu archivo ~/.vimrc pones esta función
function! ShowHistoryMatching(pattern)
10new
exe 'r!' . "history-print-regexp.sh " . a:pattern
call cursor(1,1)
endfunction
:cnoremap ch call ShowHistoryMatching
El uso de este script es que, mientras está en el editor zsh total vi editando su comando actual, presiona :ch
el cual se extiende a: llamar a ShowHistoryMatching y agrega ("patrón") a esto y presiona Enter y los resultados se abren en la ventana de arriba. Desde allí puede copiar fácilmente la línea deseada a su segunda ventana.
C-w,q
cierra una ventana
C-w,j
va a la ventana de abajo.