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

70

Após instalar o novo software, um terminal já aberto com o zsh não saberá sobre os novos comandos e não poderá gerar auto-completar para eles. Aparentemente, a abertura de um novo terminal corrige o problema, mas o índice (ou o que você quiser) pode ser recriado 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 é dependente do shell? É bom ter uma maneira de verificar a resposta também (exceto para desinstalar algo e reinstalá-lo).

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

    
por phunehehe 17.09.2010 / 08:50

2 respostas

71

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

Certifique-se de não desanexar a opção hash_list_all (isso causa ainda menos acessos ao disco, mas torna a atualização do cache menos frequente).

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

zstyle ":completion:*:commands" rehash 1

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

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

¹ requer zsh≥4.3.3, obrigado Chris Johnsen

    
por 17.09.2010 / 09:25
13

Se você está tendo problemas para obter o "argumento de conclusão" trabalhando para os novos comandos, então compinit é provavelmente o comando que você precisa, mas tem 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” armazenado em cache, .zcompdump , para armazenar as funções de conclusão compiladas para acelerar as chamadas subsequentes. Isso apenas invalida o arquivo de despejo quando percebe uma alteração no número de arquivos de conclusão ( fpath arquivos de elementos 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 arquivos auto-complete zsh no lugar certo), portanto, esperaria que um compinit simples funcionasse. Se você estiver em uma situação em que não funciona, 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 shell atual.

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

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

Isso afetará o shell atual, os shells existentes que são executados em compinit e quaisquer shells futuros.

    
por 17.09.2010 / 13:22