Zsh auto complete sugiere funciones completas (_git _vim, etc.)

9

Tengo una pequeña molestia con respecto a cómo zshhacer sugerencias completas para mis comandos.

Si escribo el comienzo de un comando que no tengo instalado y tablo presiono, sugeriré la función de finalización que está instalada.

Digamos que quiero ejecutar vimpero no está instalado, sugerirá _vim.

¿Hay alguna forma de apagar esto? ¿O he hecho algo mal en mi configuración?

Todos mis dotfiles son públicos en github.com/henrikbjorn/castle.

Henrik Bjørnskov
fuente
He visto este comportamiento antes, pero en mi configuración actual no parece estar presente. Lamentablemente, no tengo idea, cuál de mis configuraciones cambió ese comportamiento.
Personalizador

Respuestas:

8

De manera predeterminada, el motor de finalización de zsh solo intenta agregar algo a lo que escribe. Lo configuró para intentar agregar un prefijo también. El motor de configuración de finalización interactiva simple ( compinstall) ofrece esto en "control de coincidencia → finalización de subcadena". Esto inserta una línea como esta en su .zshrc:

zstyle ':completion:*' matcher-list '' 'l:|=* r:|=*'

La zstyleconfiguración integrada (en su mayoría) de finalización establece. El matcher-listestilo de finalización es una lista de formas de intentar en sucesión, deteniéndose cuando hay al menos una coincidencia. La cadena vacía significa la finalización predeterminada (solo sufijos). El conjuro de control de coincidencial:|=* r:|=* significa probar una coincidencia de prefijo *y una coincidencia de sufijo *, es decir, cualquier prefijo y sufijo.

Puede prohibir prefijos que comiencen por _completo. Esto todavía permite completar palabras que comienzan con _, y completar agregando un prefijo, pero el prefijo puede no comenzar con _.

zstyle ':completion:*' matcher-list '' 'l:|=[^_]* r:|=*'

Esto se aplica a todas las terminaciones, no solo a las terminaciones de nombres de comandos. No sé cómo restringir esto a los nombres de comandos.

Debería haber una manera de excluir con mayor precisión los nombres de comandos que comienzan con _, pero no sé cómo. Un primer comienzo es con el ignored-patternsestilo de finalización.

zstyle ':completion:*:*:-command-:*:*' ignored-patterns '_*'       

Esto excluye las coincidencias que comienzan con _; sin embargo, si no hay coincidencias, zsh intenta nuevamente sin las reglas de ignorar. Lo bueno de esto es que si el comando comenzó con un guión bajo en primer lugar, se completará en este segundo paso. La parte mala es que zsh intentará agregar un guión bajo de todos modos si no hay coincidencias, por lo que si tiene viy viewno vimpresionando Tabdespués vise ofrecerá viy viewno _vim, pero si escribe, vimse completará la oferta _vim.

Gilles 'SO- deja de ser malvado'
fuente
Gracias parece funcionar al hacer una de las soluciones que especificó, también aprendí un montón sobre cómo funciona.
Henrik Bjørnskov
2
La solución ignore-patternsfunciona bien para mí, incluso si no hay coincidencias. Solo tenía que asegurarme de que completerno contiene _ignored.
Adaephon