web-development-kb-pt.site

Reconstrua o índice de preenchimento automático (ou o que for chamado) e binários no cache $ PATH no zsh

Após a instalação do novo software, um terminal já aberto com o zsh não saberá sobre os novos comandos e não poderá gerar o preenchimento automático para eles. Aparentemente, a abertura de um novo terminal resolve o problema, mas o índice (ou o que você chamar) pode ser reconstruído para que o preenchimento automático funcione no terminal antigo?

Eu tentei com compinit mas isso não ajudou. Além disso, existe uma maneira que não depende do Shell? É bom ter uma maneira de verificar a resposta também (exceto para desinstalar algo e reinstalá-lo).

O que quero dizer é que depois de digitar alguns caracteres do nome de um comando, posso pressionar Tab, e zsh devem fazer o resto para exibir o nome completo.

80
phunehehe

Para reconstruir o cache de comandos executáveis, use rehash ou hash -rf.

Verifique se você não desmarcou o hash_list_all opção (causa menos acessos ao disco, mas faz com que o cache seja atualizado com menos frequência).

Se não quiser digitar um comando, você pode dizer ao zsh para não confiar no cache ao concluir, colocando a seguinte linha no seu ~/.zshrc¹:

zstyle ":completion:*:commands" rehash 1

Existe um custo de desempenho, mas hoje é insignificante em uma configuração típica de área de trabalho. (Não é se você tiver $PATH no NFS ou em um sistema sem memória RAM.)

O comando zstyle está documentado na página do manual zshmodule. Os valores dos estilos estão documentados nas páginas de manual zshcompsys e zshcompwid, ou você pode ler a fonte (aqui, das _command_names função). Se você quiser alguma documentação legível ... se você encontrar alguma, me avise!

¹ requer zsh≥4.3.3, obrigado Chris Johnsen

81

Se você está tendo problemas para obter a "conclusão de argumento" trabalhando para os novos comandos, então compinit provavelmente é o comando que você precisa, no entanto, ele possui um mecanismo de cache que pode estar causando o seu problema.

A documentação da minha versão (4.3.10) diz que compinit usa um "arquivo de despejo" em cache, .zcompdump, para armazenar funções de conclusão compiladas para acelerar chamadas subseqüentes. Só invalida o arquivo de despejo quando percebe uma alteração no número de arquivos de conclusão (fpath arquivos de elemento que começam com #compdef … ou #autoload …). Presumivelmente, a instalação de um novo software alteraria o número desses arquivos de conclusão (supondo que ele também instalasse seus zsh arquivos de preenchimento automático no lugar certo), então eu esperaria que compinit simples trabalhos. Se você estiver em uma situação em que não funcione, pode ser necessário ignorar ou invalidar manualmente o arquivo de despejo.

Para pular usando o arquivo de despejo, use compinit -D; isso afetará apenas o atual Shell.

Para recriar o arquivo de despejo, remova-o e execute novamente compinit:

rm -i ${ZDOTDIR:-${HOME:?No ZDOTDIR or HOME}}/.zcompdump &&
compinit

Isso afetará o Shell atual, os shells existentes que executam compinit simples e quaisquer shells futuros.

13
Chris Johnsen

Descobri que ao lidar com/desenvolvendo conclusões que vivem em um arquivo com um #compdef _foo foo que preciso usar em cada edição:

unfunction _foo && compinit

para ver o comando foo atualizado sendo concluído com as alterações atualizadas.

0
Micah Elliott