¿Cómo puedo buscar el historial con el texto ya ingresado en el indicador en zsh?


59

En zsh, sé que puedo buscar en el historial con Ctrl+ r. Sin embargo, a menudo empiezo a escribir un comando directamente en el indicador, pero luego me doy cuenta de que debería estar buscando en el historial. Cuando presiono Ctrl+ r, aparece un mensaje de búsqueda de historial en blanco como este:

solicitud de búsqueda de historial no rellenada previamente

Observe cómo hay texto en mi solicitud pero no en la búsqueda de historial. ¿Cómo comienzo la búsqueda del historial con el texto que ya está en la solicitud, para que se vea así:

solicitud de búsqueda de historial precargada

Respuestas:


44

Puede usar lahistory-search funcionalidad de zle :

bindkey "^[[A" history-beginning-search-backward
bindkey "^[[B" history-beginning-search-forward

Esto enlaza Upy Down(ajusta sus propias secuencias de escape) a una búsqueda de historial, hacia atrás y hacia adelante, en función de lo que ya se ha ingresado en la solicitud.

Por lo tanto, si ingresa "vim" y presiona Up, zsh recorrerá su historial hacia atrás solo para aquellos comandos que comiencen con "vim".

Además, puede colocar el cursor al final de la línea una vez que haya seleccionado el comando deseado del historial de zsh utilizando la función de búsqueda de historial de finalización (típicamente ubicada en /usr/share/zsh/functions/Zle/) y agregando -endal final de cada línea, de esta manera:

autoload -U history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^[[A" history-beginning-search-backward-end
bindkey "^[[B" history-beginning-search-forward-end

Genial, gracias. Sin embargo, tuve que eliminar el "-end" para ambos comandos de bindkey para que funcionen. No he editado su respuesta porque tal vez haya alguna situación en la que sean necesarias.
Sean Mackesey

No hay problema: actualizó la respuesta con los detalles que quería aclarar.
jasonwryan

Esto solía funcionar para mí hasta finales de noviembre, diciembre de 2015, cuando actualicé a la última versión de oh my zsh. ¿Algunas ideas? ¿sugerencia? ¿Alguien más está viendo esto? ¿Cómo depurar?
Hani exclamó el

2
@hanielabed Oh-my-Zsh es un clusterfsck; No estoy del todo sorprendido de que rompa algo tan fundamental como la búsqueda de la historia ...
Jason

1
¿Hay alguna forma de que el cursor salte al final de una búsqueda de historial vacía, pero permanezca en la misma posición para una búsqueda parcial? Esto es lo que sucede en bash actualmente.
CMCDragonkai

19

Otra opción útil es history | grep

Asignar un alias, p. Ej.

alias hg='history | grep'

entonces puede escribir hg whateverpara buscar los comandos que ha utilizado, por ejemplo

$ hg chmod                                                                                                       
 1309  chmod +x rotate_files.sh 
 1385  chmod +x rotate_files_270.sh 
 1512  chmod +x testy.sh 
 1528  chmod +x act_on_2_numbers.sh 
 2142  chmod +x ~/bin/display_tmux_pane_pwd.sh
 4532  chmod +x cat_files.rb 

Puse este alias en mis archivos de puntos.


17
¿Qué hgme recuerda a ... Oh sí, Mercurial!

12

Si está utilizando oh-my-zsh , agréguelo history-substring-searcha la plugins=(...)línea.

Luego añade

bindkey "^[[A" history-substring-search-up
bindkey "^[[B" history-substring-search-down

en algún lugar debajo de la línea que lee source $ZSH/oh-my-zsh.sh. Guarde y encienda una nueva terminal o ejecute source ~/.zshrcen la terminal actual.

Nota: ^[[A es la secuencia de escape para la flecha hacia arriba en el terminal que uso (kitty) y muchos otros. Para registrar su terminal de elección, escriba showkey -ay luego presione la tecla para la que desea encontrar la secuencia de escape.


No está claro qué hace este mapeo de teclas, la respuesta anterior explica "Esto une arriba y abajo (ajuste para sus propias secuencias de escape) a una búsqueda de historial, hacia atrás y hacia adelante, en función de lo que ya se ha ingresado en el mensaje".
Colin D

@ColinD agregó una nota para aclarar
joelostblom

1
la búsqueda de subcadenas es la mejor, comienza con un superconjunto de comandos. para implementar sin ser un usuario de oh-my-zsh que hice brew install zsh-history-substring-search, revisé el archivo readme del repositorio para obtener instrucciones, simplemente seguiré adelante y crearé una respuesta Estoy muy contento con el resultado.
Merlín


4

Me gustaría recomendar encarecidamente el uso de "$terminfo[kcuu1]"o "$key[Up]"en lugar de material codificado como el "^[[A"que puede o no puede funcionar en cualquier sistema en particular.

Echa un vistazo /etc/zsh/zshrcpara más llaves. Así es como se ve en mi sistema. Creo que terminfoes más probable que se definan las claves.

key=(
    BackSpace  "${terminfo[kbs]}"
    Home       "${terminfo[khome]}"
    End        "${terminfo[kend]}"
    Insert     "${terminfo[kich1]}"
    Delete     "${terminfo[kdch1]}"
    Up         "${terminfo[kcuu1]}"
    Down       "${terminfo[kcud1]}"
    Left       "${terminfo[kcub1]}"
    Right      "${terminfo[kcuf1]}"
    PageUp     "${terminfo[kpp]}"
    PageDown   "${terminfo[knp]}"
)

4

¿Qué hay de usar zsh-autosuggestions?

La cuestión es que, para cada comando que escriba, este complemento le mostrará algunas sugerencias que podrían aceptarse o no. Pruébalo y danos tu opinión.

Sin complementos, podemos presionar Ctrlrpara realizar una búsqueda inversa en el historial, tan pronto como comience a escribir, los comandos coincidentes aparecerán como sugerencias.


2

Yo uso el complemento vi-mode . Y luego en mi ~ / .zshrc tengo los siguientes enlaces:

bindkey "^P" history-beginning-search-backward
bindkey "^N" history-beginning-search-forward

Eso me permite utilizar el ^Py ^Ncomo hacia atrás y hacia delante normal de buscar si no introducir cualquier texto y, como filtrada de búsqueda si lo hago.


1

Estoy de acuerdo con cheflo en que la búsqueda de "subcadenas" es más útil. No puedo comentar allí, así que comencé una nueva respuesta. Uso oh-my-zsh y agrego "history-substring-search" a los complementos = (...) de ~ / .zshrc. Entonces fuente ~ / .zshrc. No es necesario agregar nada más. Use "bindkey" para verificar:

"^ [OA" history-substring-search-up
"^ [OB" history-substring-search-down

Más tarde, escriba "a" y la flecha hacia arriba, aparecerá "historial" y se resaltará "a" (si utilizó el comando "historial" antes).


1

En su lugar, podría usar zaw , que reemplaza completamente su búsqueda con una súper búsqueda de palabras clave mucho mejor, y también soluciona su problema: el historial de búsqueda es solo una de las cosas que zaw puede buscar.

Pequeña introducción / discusión aquí


0

Debido a que uso oh-my-zsh, y uso la solución de subcadena de joelostblom, James, modifico el .zshrc de esta manera: (que en la línea 13, encuentra la línea "source $ ZSH / oh-my-zsh.sh" , luego modifique el código que lo rodea.)

plugins=(
  git
  history-substring-search
)

source $ZSH/oh-my-zsh.sh

bindkey -v
bindkey "^[[A" history-substring-search-up
bindkey "^[[B" history-substring-search-down

bindkey -vromperá ctrl-a, ctrl-e. Lo más probable es que todos los comandos ctrl.
Michael Ozeryansky

0

Respuesta que no es Oh-My-Zsh

Esto funcionó para mí (en macOS) para que el historial de subcadenas sea fácilmente accesible a través de la flecha arriba / abajo. La atadura de teclas depende de usted.

El historial de búsqueda de subcadenas es mejor que simplemente acceder a comandos que comienzan con una cadena. Esto es más parecido a ctrl-r en la mayoría de los casos, aquellos sin glob o coincidencia de expresiones regulares.

A partir de las instrucciones en zsh-users / zsh-history-substring-search

brew install zsh-history-substring-search

# add the following to .zshrc
source /usr/local/share/zsh-history-substring-search/zsh-history-substring-search.zsh
bindkey '^[[A' history-substring-search-up
bindkey '^[[B' history-substring-search-down

Ahora disfrutando esto a fondo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.