Reconstruir índice de autocompletar (o como se llame) y binarios en caché $ PATH en zsh

75

Después de instalar un nuevo software, un terminal ya abierto con zsh no sabrá acerca de los nuevos comandos y no puede generar el autocompletado para esos. Aparentemente, abrir un nuevo terminal soluciona el problema, pero ¿se puede reconstruir el índice (o como se llame) para que el autocompletado funcione en el antiguo terminal?

Lo intenté compinitpero eso no ayudó. Además, ¿hay alguna forma que no sea dependiente de shell? Es bueno tener una manera de verificar la respuesta también (excepto desinstalar algo y reinstalarlo).

Lo que quiero decir es que después de escribir algunos caracteres del nombre de un comando, puedo presionar Tab, y zshdebería hacer el resto para extraer el nombre completo.

phunehehe
fuente
1
Hay dos tipos de autocompletado a los que podría referirse cuando dice que un shell existente "no puede generar autocompletado para [los nuevos comandos]": "completado de comando", intentando obtener el shell para sugerir el nombre del nuevo comando al completar en la posición del comando y "finalización de argumento", intentando obtener el shell para sugerir opciones / argumentos para el nuevo comando una vez que ya ha escrito su nombre. ¿Qué te está dando problemas?
Chris Johnsen
1
¡Buena pregunta! Siempre supuse que no podía hacerse, no pensé en comprobarlo
Michael Mrozek
1
offtopic - las personas son tan volubles 4 personas favoritas pero solo 2 votos a favor ... Me parece extraño la poca gente que vota cosas.
xenoterracide
@Chris Me refiero a que después de escribir algunos caracteres del nombre de un comando y presionar tab, zsh debería hacer el resto y extraer el nombre completo.
phunehehe
@xeno también lo noté; es bastante inusual preferir algo pero no votarlo
Michael Mrozek

Respuestas:

76

Para reconstruir el caché de comandos ejecutables, use rehasho hash -rf.

Asegúrese de no haber deshabilitado la hash_list_allopción (causa aún menos accesos al disco, pero hace que la memoria caché se actualice con menos frecuencia).

Si no desea tener que escribir un comando, puede decirle a zsh que no confíe en su caché al completar colocando la siguiente línea en su ~/.zshrc¹:

zstyle ":completion:*:commands" rehash 1

Hay un costo de rendimiento, pero hoy en día es insignificante en una configuración de escritorio típica. (No lo es si tiene $PATHun NFS o un sistema sin RAM).

El zstylecomando en sí está documentado en la zshmodulepágina del manual. Los valores de estilos se documentan en las páginas man zshcompsysy zshcompwid, o puede leer la fuente (aquí, de la _command_namesfunción). Si quería documentación legible ... si encuentra alguna, ¡hágamelo saber!

¹ requiere zsh≥4.3.3, gracias Chris Johnsen

Gilles 'SO- deja de ser malvado'
fuente
3
Cualquiera de los encantos de repetición debería permitir la finalización del nombre de comando de los "nuevos comandos" en shells que previamente estaban completamente en hash. Establecer RUTA (o ruta) también causará una repetición; así PATH="$PATH"también haría el trabajo. HASH_LIST_ALLse muestra como predeterminado en mi documentación.
Chris Johnsen
Esa es la respuesta para mí.
BaiJiFeiLong
13

Si tiene problemas para que la "finalización de argumentos" funcione para los nuevos comandos, entonces compinit es probablemente el comando que necesita, sin embargo, tiene un mecanismo de almacenamiento en caché que podría estar causando su problema.

La documentación de mi versión (4.3.10) dice que compinit utiliza un "archivo de volcado" en caché .zcompdump, para almacenar funciones de finalización compiladas para acelerar las invocaciones posteriores. Solo invalida el archivo de volcado cuando nota un cambio en el número de archivos de finalización ( fpatharchivos de elementos que comienzan con #compdef …o #autoload …). Presumiblemente, la instalación de un nuevo software cambiaría el número de dichos archivos de finalización (suponiendo que también instaló sus archivos de autocompletar zsh en el lugar correcto), por lo que esperaría que un simple compinittrabajo funcione. Si se encuentra en una situación en la que no funciona, es posible que deba omitir o invalidar manualmente el archivo de volcado.

Para omitir el uso del archivo de volcado, use compinit -D; Esto solo afectará al shell actual.

Para reconstruir el archivo de volcado, elimínelo y vuelva a ejecutar compinit:

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

Esto afectará el shell actual, los shells existentes que se ejecutan sin formato compinity cualquier shells futuros.

Chris Johnsen
fuente
Algunos frameworks zsh como zimpermiten el uso de archivos de volcado por host. En ese caso, también eliminar $zcompdump_filejunto con .zcompdump.
sebastian