%20no%20activa%20los%20nombres%20de%20comandos%20que%20contienen%20guiones.png)
He usado zsh compctl desde siempre (finales de los 90 o principios de los 2000), pero curiosamente nunca antes me había encontrado con esto. Hoy me di cuenta de que tenía la intención de hacer alguna configuración compctl para update-alternatives
que mis terminaciones no se activaran en absoluto, solo usaba mi finalización alternativa estándar (archivos)... así que un ejemplo simple y muy simplificado para mostrar el problema:
Esto funciona bien:
zshprompt% compctl -k '(arg1 arg2 arg3)' nodash
# typing 'nodash ' and hitting [Tab] once:
zshprompt% nodash arg
# hitting [Tab again]
zshprompt% nodash arg
arg1 arg2 arg3
Pero estos archivos completos en su lugar:
# just showing the current dir for reference:
zshprompt% ls .
file2.txt myfile1.txt
zshprompt% compctl -k '(arg1 arg2 arg3)' with-dash
# typing 'with-dash ' and hitting [Tab] once:
zshprompt% with-dash
file2.txt myfile1.txt
Como se ve, se usa la finalización estándar (enumerar el directorio actual) en lugar del que agregué con compctl...
Realmente no pude encontrar nada sobre esto en la página de manual (man zshcompctl) o en línea... entonces, ¿alguien, por favor, tiene una idea sobre cómo obtener comandos de coincidencia compctl con guiones en el nombre?
tia
Respuesta1
Lo tengo confirmado en el[correo electrónico protegido]lista de correo que esto es un error y obtuve un parche sugerido:
--- zsh-5.9.orig/Src/Zle/zle_tricky.c
+++ zsh-5.9/Src/Zle/zle_tricky.c
@@ -1315,6 +1315,8 @@ get_comp_string(void)
ins = (tok == REPEAT ? 2 : (tok != STRING && tok != TYPESET));
zsfree(cmdstr);
cmdstr = ztrdup(tokstr);
+ untokenize(cmdstr);
+ remnulargs(cmdstr);
cmdtok = tok;
/*
* If everything before is a redirection, or anything
Lo probé aplicando el cambio como un parche de tejido al paquete fuente Debian zsh_5.9-4 reconstruido y lo instalé... y resolvió mi problema.
Continuaré ejecutándolo ahora y si no parece romper nada más, me aseguraré de que se aplique en zsh upstream esperando que eventualmente se distribuya a todas las diferentes distribuciones.
Si tiene el problema ahora y no puede esperar a que se reduzca su distribución, descargue la fuente zsh 5.9.4, parcheelo con el parche anterior y compílelo localmente. Si desea integrarlo en su paquete de distribución, aquí le explicamos cómo hacerlo para Debian (debería funcionar para la mayoría de las distribuciones basadas en paquetes Deb):
sudo apt install devscripts libcap-dev libelf-dev libgdbm-dev cm-super-minimal texinfo yodl quilt
mkdir /tmp/zsh_5.9
cd /tmp/zsh_5.9
apt source zsh=5.9-4
/bin/echo -e "1317a1318,1319\n> \t untokenize(cmdstr);\n> \t remnulargs(cmdstr);" > compctl-dash.diff
cd zsh-5.9
export QUILT_PATCHES=debian/patches
export QUILT_REFRESH_ARGS="-p ab --no-timestamps --no-index"
quilt push -a
quilt new compctl-dash.diff
quilt add Src/Zle/zle_tricky.c
patch Src/Zle/zle_tricky.c ../compctl-dash.diff
quilt refresh
quilt pop -a
debuild -b -uc -us
sudo dpkg -i ../zsh_5.9-4_amd64.deb
Con suerte, esto se solucionará en sentido ascendente y habrá llegado a su distribución antes de que el paquete se actualice a continuación; de lo contrario, tendrá que repetirlo (o bloquear la versión del paquete zsh) hasta que sea :-)