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 .