Автодополнение zsh ( compctl ) не срабатывает для имен команд, содержащих дефисы

Автодополнение zsh ( compctl ) не срабатывает для имен команд, содержащих дефисы

Я использовал zsh compctl с давних пор (с конца 90-х или начала 00-х), но, как ни странно, никогда раньше с этим не сталкивался. Сегодня я понял, что когда я собирался сделать конфигурацию compctl для update-alternativesэтого, мои дополнения вообще не срабатывали, они просто использовали мое стандартное резервное дополнение (файлы)... так что вот очень урезанный простой пример, демонстрирующий проблему:

Это работает отлично:

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

Но вместо этого вот эти полные файлы:

# 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

Как видно, используется стандартное завершение (перечисление текущего каталога), а не то, которое я добавил с помощью compctl ...

Я не смог найти ничего об этом в man-странице (man zshcompctl) или в Интернете... так что, пожалуйста, есть ли у кого-нибудь идея, как заставить compctl сопоставлять команды с дефисами в имени?

ТИА

решение1

Получил подтверждение в[email protected]mailing-list сообщил, что это ошибка, и получил предложение по ее устранению:

--- 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

Я протестировал это, применив изменение в качестве патча к исходному пакету Debian zsh_5.9-4, пересобрав и установив его... и это решило мою проблему.

Я продолжу его использовать, и если он не сломает ничего другого, я позабочусь о том, чтобы он был применен в zsh upstream, ожидая, что в конечном итоге он распространится на все другие дистрибутивы.

Если у вас проблема сейчас, и вы не можете дождаться, когда она упадет на ваш дистрибутив, скачайте исходный код zsh 5.9.4, пропатчите его с помощью вышеуказанного патча и соберите локально. Если вы хотите интегрировать его в свой дистрибутивный пакет, вот как это сделать для Debian (должно работать для большинства дистрибутивов на основе 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

Будем надеяться, что это будет исправлено в основной ветке разработки и достигнет вашего дистрибутива до следующего обновления пакета, в противном случае вам придется повторить это (или заблокировать версию пакета zsh) до тех пор, пока это не произойдет :-)

Связанный контент