A conclusão do zsh ( compctl ) não aciona nomes de comandos contendo travessões

A conclusão do zsh ( compctl ) não aciona nomes de comandos contendo travessões

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-alternativesque 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 :-)

informação relacionada