ZSH: historial de búsqueda en teclas arriba y abajo?


22

Actualmente, tengo lo siguiente en mi .zshrc:

bindkey '^[[A' up-line-or-search
bindkey '^[[B' down-line-or-search

Sin embargo, esto solo parece coincidir con el contenido de mi entrada actual antes de que ocurra un carácter de espacio. Por ejemplo, sudo ls /coincidirá con cada línea de mi historial que comience sudo, mientras que me gustaría que solo coincida con las líneas que coinciden con toda mi entrada. (es decir sudo ls /etc, coincidiría, pero no sudo cat /var/log/messages)

¿Qué necesito cambiar para obtener el comportamiento deseado?

Aquí está mi .zshrc completo en caso de que sea relevante: https://gist.github.com/919566

Respuestas:


9

Este es el comportamiento documentado :

down-line-or-search
Mueva hacia abajo una línea en el búfer, o si ya está en la línea inferior, busque en el historial una línea que comience con la primera palabra en el búfer.

Parece que no hay un widget existente que haga exactamente lo que desea, por lo que tendrá que hacer el suyo. Aquí se explica cómo definir un widget que se comporte como up-line-or-search, pero utilizando el comienzo de la línea (hasta el cursor) en lugar de la primera palabra como cadena de búsqueda. No se ha probado realmente, especialmente no en la entrada multilínea.

up-line-or-search-prefix () {
  local CURSOR_before_search=$CURSOR
  zle up-line-or-search "$LBUFFER"
  CURSOR=$CURSOR_before_search
}
zle -N up-line-or-search-prefix

Se debe usar un enfoque alternativo history-beginning-search-backward, pero solo se llama si el cursor está en la primera línea. No probado

up-line-or-history-beginning-search () {
  if [[ -n $PREBUFFER ]]; then
    zle up-line-or-history
  else
    zle history-beginning-search-backward
  fi
}
zle -N up-line-or-history-beginning-search

Gracias, Gilles, tu primera solución funciona bastante bien, pero hay un problema y espero que puedas ayudarme a resolverlo. Cuando invoco el prefijo up-line-or-search-search en una entrada vacía, me da el último comando de ejecución: el comportamiento deseado. Sin embargo, cuando ejecuto up-line-or-search-prefix nuevamente, se realiza una línea ascendente o búsqueda en el primer carácter de mi entrada. ¿Es posible cambiar las cosas de alguna manera para que presionar la flecha hacia arriba con una entrada vacía se desplace por mi historial?
rps

@rps Ah, entiendo, estaba captando la primera palabra porque faltaba el argumento (en lugar de estar vacío como debería). Usa mi versión editada.
Gilles 'SO- deja de ser malvado'

33

zsh proporciona esta funcionalidad utilizando

history-beginning-search-backward
history-beginning-search-forward

Ex.

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

Encuentra el código clave exacto por
ctrl+vKEY

Ex.
ctrl+ vUP
ctrl+ vDOWN
ctrl+ vPageUp
ctrl+ vPageDown
etc.


1
En zprezto [ 1 ] se puede encontrar una alternativa para códigos clave que podrían funcionar en diferentes terminales . <kbd> Arriba </kbd> es $terminfo[kcuu1], <kbd> Abajo </kbd> es $terminfo[kcud1].
Justin C

8

Esta publicación de blog de 2013 recomienda un par de combinaciones de teclas que coinciden con todas las palabras antes del cursor.

# Cycle through history based on characters already typed on the line
autoload -U up-line-or-beginning-search
autoload -U down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "$key[Up]" up-line-or-beginning-search
bindkey "$key[Down]" down-line-or-beginning-search

(En una versión anterior de esta respuesta, había utilizado $terminfocomo se recomienda en uno de los comentarios en la publicación del blog. Algunos valores de terminfo se enumeran aquí ).


1
zsh también proporciona estos alias más amigables (al menos en el paquete ubuntu) en /etc/zsh/zshrc, como $key[Up].
zzxyz

Si lo usa $terminfo, deberá cambiar los modos del terminal. Ver aquí .
Tom Hale

He editado la respuesta para usar en $key[]lugar de $terminfo[]. ¡Espero que esto funcione bien para los lectores!
joeytwiddle

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.