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

75

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, compinitmas isso não ajudou. Além disso, existe uma maneira que não depende de 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 Tabe zshfazer o resto para obter o nome completo.

phunehehe
fonte
1
Existem dois tipos de preenchimento automático que você pode dizer quando diz que um shell existente “não pode gerar o preenchimento automático para [os novos comandos]”: “conclusão do comando” - tentando fazer com que o shell sugira o nome do novo comando ao concluir na posição de comando e “conclusão de argumento” - tentando obter o shell para sugerir opções / argumentos para o novo comando depois de digitar seu nome. O que está lhe dando problemas?
Chris Johnsen
1
Boa pergunta! Eu sempre presumi que isso não poderia ser feito, não pensei em verificar
Michael Mrozek
1
offtopic - as pessoas são tão inconstantes 4 pessoas são favorecidas, mas apenas 2 votaram ... Acho estranho como poucas pessoas votam nas coisas.
Xenoterracide
@ Chris, quero dizer, depois de digitar alguns caracteres do nome de um comando e pressionar tab, o zsh deve fazer o resto e abrir o nome completo.
phunehehe
@ xeno notei isso também; é bastante incomum escolher algo favorito, mas não voto a favor #
Michael Mrozek

Respostas:

76

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

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

Se você não quiser digitar um comando, 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 é insignificante em uma configuração típica da área de trabalho hoje. (Não é se você tiver $PATHNFS ou um sistema com falta de RAM.)

O zstylecomando em si está documentado na zshmodulepágina do manual. Os valores dos estilos estão documentados nas páginas zshcompsyse zshcompwidman, ou você pode ler a fonte (aqui, da _command_namesfunção). Se você quiser alguma documentação legível ... se você encontrar alguma, me avise!

¹ requer zsh≥4.3.3, obrigado Chris Johnsen

Gilles
fonte
3
Qualquer encantamento de rehash deve permitir a conclusão do nome de comando de "novos comandos" em shells que foram previamente totalmente hash. Definir PATH (ou caminho) também causará uma nova refazer; assim PATH="$PATH"também faria o trabalho. HASH_LIST_ALLé mostrado como padrão na minha documentação.
Chris Johnsen
Essa é a resposta para mim.
BaiJiFeiLong
13

Se você está tendo problemas para que a "conclusão de argumento" funcione para os novos comandos, 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 o compinit usa um "arquivo de despejo" em cache .zcompdumppara armazenar funções de conclusão compiladas para acelerar as chamadas subseqüentes. Só invalida o arquivo de despejo quando percebe uma alteração no número de arquivos de conclusão ( fpatharquivos 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 os arquivos de preenchimento automático do zsh no lugar certo), então eu esperaria que um compinittrabalho simples . Se você estiver em uma situação em que não funcione, talvez seja 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 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 funcionam normalmente compinite quaisquer shells futuros.

Chris Johnsen
fonte
Algumas estruturas zsh, como zimpermitem o uso de arquivos de despejo por host. Nesse caso, também remova $zcompdump_filejunto com .zcompdump.
sebastian