zsh 補完 (compctl) はダッシュを含むコマンド名ではトリガーされません。

zsh 補完 (compctl) はダッシュを含むコマンド名ではトリガーされません。

私はずっと前から (90 年代後半または 00 年代前半) zsh compctl を使ってきましたが、不思議なことにこれまでこの問題に遭遇したことはありませんでした。今日、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 zshcompctl) やオンラインでは何も見つけられませんでした... 名前にダッシュを含む compctl マッチ コマンドを取得する方法について、誰かアイデアをお持ちですか?

ティア

答え1

確認しました[メールアドレス]メーリングリストでこれがバグであると報告し、パッチの提案を受けました:

--- 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 ソース パッケージに quilt パッチとして変更を適用し、再構築してインストールすることでテストしたところ、問題は解決しました。

今のところは引き続き実行し、他に問題がないようであれば、zsh アップストリームに適用して、最終的にはすべての異なるディストリビューションに浸透することを期待します。

現時点で問題が発生していて、ディストリビューションに浸透するまで待てない場合は、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 パッケージのバージョンをロックする必要があります) :-)

関連情報