Ricostruisci l'indice di completamento automatico (o come viene chiamato) e i binari nella cache $ PATH in zsh


75

Dopo aver installato il nuovo software, un terminale già aperto con zsh non conoscerà i nuovi comandi e non potrà generare il completamento automatico per quelli. Apparentemente l'apertura di un nuovo terminale risolve il problema, ma l'indice (o come lo chiami) può essere ricostruito in modo che il completamento automatico funzioni sul vecchio terminale?

Ci ho provato compinitma non è stato d'aiuto. Inoltre, esiste un modo che non dipende dalla shell? È bello avere anche un modo per verificare la risposta (tranne che per disinstallare qualcosa e reinstallarlo).

Quello che voglio dire è dopo aver digitato alcuni caratteri del nome di un comando, posso premere Tabe zshdovrei fare il resto per recuperare il nome completo.


1
Esistono due tipi di completamento automatico che potresti intendere quando dici che una shell esistente "non può generare il completamento automatico per [i nuovi comandi]": "completamento dei comandi": provare a ottenere la shell per suggerire il nome del nuovo comando al completamento nella posizione di comando, e "completamento argomento", cercando di indurre la shell a suggerire opzioni / argomenti per il nuovo comando dopo averne digitato il nome. Quale ti sta dando problemi?
Chris Johnsen,

1
Buona domanda! Avevo sempre pensato che non si potesse fare, non pensavo di controllare
Michael Mrozek

1
offtopic - le persone sono così volubili 4 persone favorite ma solo 2 voti ... Trovo strano quanto poche persone votino cose.
xenoterracide,

@Chris intendo dopo aver digitato alcuni caratteri del nome di un comando e premere tab, zsh dovrebbe fare il resto e recuperare il nome completo.
phunehehe,

@xeno L'ho notato anch'io; è piuttosto insolito preferire qualcosa ma non votarlo
Michael Mrozek

Risposte:


76

Per ricostruire la cache dei comandi eseguibili, utilizzare rehasho hash -rf.

Assicurati di non aver disattivato l' hash_list_allopzione (causa ancora meno accessi al disco ma rende l'aggiornamento della cache meno frequente).

Se non vuoi digitare un comando, puoi dire a zsh di non fidarsi della sua cache durante il completamento inserendo la seguente riga nel tuo ~/.zshrc¹:

zstyle ":completion:*:commands" rehash 1

C'è un costo prestazionale, ma oggi è trascurabile su una tipica impostazione desktop. (Non è se hai $PATHsu NFS o un sistema affamato di RAM.)

Il zstylecomando stesso è documentato nella zshmodulepagina man. I valori degli stili sono documentati nelle pagine man zshcompsyse zshcompwid, oppure puoi leggere la fonte (qui, della _command_namesfunzione). Se volevi della documentazione leggibile ... se la trovi, fammi sapere!

¹ richiede zsh≥4.3.3, grazie Chris Johnsen


3
Entrambi gli incantesimi di rehash dovrebbero consentire il completamento di nomi di comandi di "nuovi comandi" in shell che in precedenza erano state completamente hash. L'impostazione di PATH (o percorso) provocherà anche una rehash; quindi PATH="$PATH"farebbe anche il lavoro. HASH_LIST_ALLè mostrato come predefinito nella mia documentazione.
Chris Johnsen,

Questa è la risposta per me.
BaiJiFeiLong

13

Se riscontri problemi nel far funzionare il "completamento dell'argomento" per i nuovi comandi, probabilmente compinit è il comando di cui hai bisogno, tuttavia ha un meccanismo di memorizzazione nella cache che potrebbe causare il tuo problema.

La documentazione per la mia versione (4.3.10) afferma che compinit utilizza un "file di dump" memorizzato nella cache .zcompdump, per memorizzare le funzioni di completamento compilate per accelerare le successive invocazioni. Invalida il file di dump solo quando rileva una modifica del numero di file di completamento ( fpathfile di elementi che iniziano con #compdef …o #autoload …). Presumibilmente l'installazione di nuovo software cambierebbe il numero di tali file di completamento (supponendo che abbia installato anche i suoi file di completamento automatico zsh nel posto giusto), quindi mi aspetto che un piano compinitfunzioni. Se ti trovi in ​​una situazione in cui non funziona, potresti dover bypassare o invalidare manualmente il file di dump.

Per saltare usando il file dump, usare compinit -D; questo influenzerà solo la shell corrente.

Per ricostruire il file di dump, rimuoverlo ed eseguire nuovamente compinit:

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

Ciò influirà sulla shell corrente, sulle shell esistenti che funzionano in modo normale compinite su eventuali shell future.


Alcuni framework zsh come zimconsentono l'uso di file di dump per host. In tal caso, rimuovere anche $zcompdump_fileinsieme a .zcompdump.
sebastian,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.