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

9

Eu tenho um pequeno aborrecimento com o zsh fazendo sugestões completas para meus comandos.

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

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

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

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

    
por Henrik Bjørnskov 20.02.2014 / 21:49

1 resposta

6

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 .

    
por 21.02.2014 / 02:26