%20%D0%BD%D0%B5%20%D1%81%D1%80%D0%B0%D0%B1%D0%B0%D1%82%D1%8B%D0%B2%D0%B0%D0%B5%D1%82%20%D0%B4%D0%BB%D1%8F%20%D0%B8%D0%BC%D0%B5%D0%BD%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%2C%20%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D1%89%D0%B8%D1%85%20%D0%B4%D0%B5%D1%84%D0%B8%D1%81%D1%8B.png)
Я использовал 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) до тех пор, пока это не произойдет :-)