O Zsh auto complete sugere funções completas (_git _vim etc)

9

Eu tenho um pequeno aborrecimento em como zshestá fazendo sugestões completas para meus comandos.

Se eu digitar o início de um comando que não tenho instalado e pressionar, tabele sugerirá a função de conclusão que está instalada.

Digamos que eu queira executar, vimmas não está instalado, ele sugerirá _vim.

Existe uma maneira de desativar isso? Ou fiz algo errado na minha configuração?

Todos os meus arquivos de ponto são públicos em github.com/henrikbjorn/castle.

Henrik Bjørnskov
fonte
Já vi esse comportamento antes, mas na minha configuração atual não parece estar presente. Infelizmente, eu não tenho idéia, quais das minhas configurações mudaram esse comportamento.
Customizer

Respostas:

8

Por padrão, o mecanismo de conclusão do zsh tenta apenas acrescentar algo ao que você digita. Você o configurou para tentar adicionar um prefixo também. O mecanismo simples de configuração de conclusão interativa ( compinstall) oferece isso em "controle correspondente → conclusão da substring". Isso insere uma linha como esta no seu .zshrc:

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

O zstylebuilt-in define (principalmente) as configurações de conclusão. O matcher-listestilo de conclusão é uma lista de maneiras de tentar em sucessão, parando quando houver pelo menos uma correspondência. A cadeia vazia significa a conclusão padrão (apenas sufixos). O encantamento de controle correspondentel:|=* r:|=* significa tentar uma correspondência de prefixo *e de sufixo *, ou seja, qualquer prefixo e sufixo.

Você pode proibir prefixos que começam por _completo. Isso ainda permite a conclusão de palavras que começam com _e a adição de um prefixo, mas o prefixo pode não começar _.

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

Isso se aplica a todas as conclusões, não apenas às conclusões de nomes de comandos. Não sei como restringir isso a nomes de comandos.

Deve haver uma maneira de excluir com mais precisão os nomes de comandos que começam com _, mas não sei como. Uma primeira partida é com o ignored-patternsestilo de conclusão.

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

Isso exclui correspondências que começam com _; no entanto, se não houver correspondências, o zsh tenta novamente sem as regras de ignorar. O bom disso é que, se o comando começar com um sublinhado em primeiro lugar, ele será concluído nesta segunda passagem. A parte ruim é que o zsh tentará adicionar um sublinhado de qualquer maneira, se não houver correspondências; portanto, se você tiver vie, viewmas não vim, pressionar Tabdepois vi, a oferta será oferecida vie, viewmas não _vim, mas se você digitar vim, a conclusão será oferecida _vim.

Gilles 'SO- parar de ser mau'
fonte
Obrigado parece funcionar, fazendo uma das soluções que você especificou, também eu aprendi um monte sobre a forma como ele funciona.
Henrik Bjørnskov 21/02
2
A solução ignore-patternsfunciona bem para mim, mesmo que não haja correspondências. Só tinha que ter certeza de que completernão contém _ignored.
Adaephon