Por padrão, o mecanismo de conclusão do zsh apenas tenta acrescentar algo ao que você digita. Você configurou para tentar adicionar um prefixo também. O mecanismo de configuração de conclusão interativa simples ( compinstall
) oferece isso em “controle de correspondência → conclusão de substring”. Isso insere uma linha como essa no seu .zshrc
:
zstyle ':completion:*' matcher-list '' 'l:|=* r:|=*'
O zstyle
define internamente (principalmente) as configurações de conclusão. O estilo de conclusão matcher-list
é uma lista de maneiras de tente em sucessão, parando quando houver pelo menos uma partida. A cadeia vazia significa a conclusão padrão (apenas sufixos). O controle de correspondência incantation l:|=* r:|=*
significa tentar um prefixo correspondente a *
e um sufixo correspondendo *
, ou seja, qualquer prefixo e sufixo.
Você pode proibir os prefixos que começam com _
. Isso ainda permite a conclusão de palavras que começam com _
e a conclusão adicionando um prefixo, mas o prefixo pode não começar com _
.
zstyle ':completion:*' matcher-list '' 'l:|=[^_]* r:|=*'
Isso se aplica a todas as conclusões, não apenas à conclusão de nomes de comandos. Eu não sei como restringir isso aos nomes dos comandos.
Deve haver uma maneira de excluir com mais precisão nomes de comandos que começam com _
, mas não sei como. Uma primeira etapa é com o estilo de conclusão ignored-patterns
.
zstyle ':completion:*:*:-command-:*:*' ignored-patterns '_*'
Isso exclui correspondências que começam com _
; no entanto, se não houver correspondências, zsh tentará novamente sem as regras de ignorar. O bom disso é que se o comando começou com um sublinhado em primeiro lugar, ele será completado neste segundo passe. A parte ruim é que o zsh tentará adicionar um sublinhado mesmo assim se não houver correspondências, então se você tiver vi
e view
mas não vim
então pressionar Tab depois de vi
ofereça vi
e view
, mas não _vim
, mas se você digitar vim
, a conclusão oferecerá _vim
.