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.