¿Puedo navegar por el menú de finalización de pestañas de zsh con teclas hjkl tipo vi?

12

Uso la finalización de pestañas basada en menús de zsh. Presiono Tabuna vez y aparece una lista de posibles finalizaciones. Si presiono Tabnuevamente, puedo navegar por esta lista con las teclas de flecha. Sin embargo, es posible navegar con las vi-como H, J, K, Lllaves en su lugar?

Uso el modo emacs para la entrada de línea de comandos, con bindkey -ein ~/.zshrc. También uso zim con zsh. Si es relevante, los comandos que especifican el sistema de finalización de tabulación están aquí .

Gavilán
fuente

Respuestas:

15

Sí, puedes habilitar menu select:

zstyle ':completion:*' menu select
zmodload zsh/complist
...
# use the vi navigation keys in menu completion
bindkey -M menuselect 'h' vi-backward-char
bindkey -M menuselect 'k' vi-up-line-or-history
bindkey -M menuselect 'l' vi-forward-char
bindkey -M menuselect 'j' vi-down-line-or-history
jasonwryan
fuente
+1 Esto funciona bien si ejecuto manualmente los bindkeycomandos en la terminal, pero falla si los pongo al final de ~/.zshrc, con /home/sparhawk/.zshrc:bindkey:186: no such keymap `menuselect'.
Sparhawk
¿Habilitaste los scripts de finalización? Vea el comando antes de las elipses ...
jasonwryan
¿Te refieres a la zstylelínea? Sí, yo también tuve eso ~/.zshrc.
Sparhawk
Tienes que habilitarlo también . Vea mi .zshrc como ejemplo .
jasonwryan
Agregar autoload -Uz compinity compinitno funcionó, pero no estoy seguro si habilitarlo es el problema, porque (a) la selección del menú funciona bien en un sentido general, y siempre lo ha hecho, y (b) puedo ejecutar manualmente las bindkeylíneas más tarde, lo que trabajos. Además, me di cuenta de que (b) solo funciona si presiono la pestaña primero , presumiblemente para inicializar el sistema de finalización y luego ejecutarlo bindkey…. De lo contrario, falla como arriba ( bindkey: no such keymap `menuselect').
Sparhawk
3

Lo más cerca que he llegado a esto es usar CTRL- Ny CTRL- Ppara avanzar y retroceder a través de la lista de posibles finalizaciones, en lugar de Taby Shift- Tab. Esta es una vinavegación más parecida.

En un .zsharchivo de configuración lo logro con:

bindkey '^n' expand-or-complete
bindkey '^p' reverse-menu-complete

Y relacionado:

bindkey '^k' up-history
bindkey '^j' down-history
bindkey '^h' backward-delete-char
bindkey '^w' backward-kill-word
bindkey '^r' history-incremental-search-backward

Aquí están los documentos para los enlaces .

Effel
fuente
2
Es genial, gracias. también, -M menuselectse puede agregar al bindkeycomando para restringir el modo aquí.