it-swarm-es.tech

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

Después de instalar un nuevo software, un terminal ya abierto con zsh no sabrá acerca de los nuevos comandos y no puede generar autocompletar para ellos. 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?

Intenté con compinit pero 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 zsh debería hacer el resto para extraer el nombre completo.

80
phunehehe

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

Asegúrate de no haber desarmado el hash_list_all opció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 es insignificante en una configuración de escritorio típica. (No lo es si tienes $PATH en NFS, o un sistema sin RAM.)

El comando zstyle está documentado en la página del manual zshmodule. Los valores de estilos se documentan en las páginas de comando man zshcompsys y zshcompwid, o puede leer la fuente (aquí, de la _command_names función). Si quería documentación legible ... si encuentra alguna, ¡hágamelo saber!

¹ requiere zsh≥4.3.3, gracias Chris Johnsen

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 usa 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 (fpath archivos 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 zsh autocompletar en el lugar correcto), por lo que esperaría un simple compinit a trabajo. 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 compinit y cualquier shells futuros.

13
Chris Johnsen

He encontrado que al tratar/desarrollar complementos que viven en un archivo con un #compdef _foo foo que necesito usar en cada edición:

unfunction _foo && compinit

para ver el comando actualizado foo completo con los cambios actualizados.

0
Micah Elliott