%20n%C3%A3o%20aciona%20nomes%20de%20comandos%20contendo%20travess%C3%B5es.png)
Eu uso zsh compctl desde sempre (final dos anos 90 ou início dos anos 2000), mas estranhamente nunca encontrei isso antes. Percebi hoje, quando pretendia fazer alguma configuração compctl para update-alternatives
que minhas conclusões não fossem acionadas, apenas usava minha conclusão de fallback padrão (arquivos) ... então, um exemplo simples e simplificado para mostrar o problema:
Isso funciona bem:
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
Mas estes arquivos completos:
# 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 visto, o preenchimento padrão (listando o diretório atual) é usado em vez daquele que adicionei com compctl ...
Eu realmente não consegui encontrar nada sobre isso na página de manual (man zshcompctl) ou online ... alguém, por favor, tem uma idéia de como obter comandos de correspondência compctl com traços no nome?
TIA
Responder1
Confirmei isso no[e-mail protegido]mailing-list que isso é um bug e recebeu uma sugestão de patch:
--- 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
Eu testei aplicando a mudança como um patch de quilt ao pacote fonte Debian zsh_5.9-4 reconstruído e instalei ... e resolveu meu problema.
Continuarei a executá-lo agora e se ele não parecer quebrar mais nada, garantirei que seja aplicado no zsh upstream, esperando que eventualmente se espalhe por todas as distribuições diferentes.
Se você tiver o problema agora e não puder esperar para resolver sua distribuição, baixe o código-fonte zsh 5.9.4 e corrija-o com o patch acima e construa-o localmente. Se você quiser integrá-lo em seu pacote de distribuição, veja como fazê-lo no Debian (deve funcionar para a maioria das distribuições baseadas em pacotes 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
Esperamos que isso seja corrigido no upstream e chegue à sua distribuição antes que o pacote seja atualizado em seguida, caso contrário você terá que repeti-lo (ou bloquear a versão do pacote zsh) até que seja :-)