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

재구축된 데비안 zsh_5.9-4 소스 패키지에 변경 사항을 퀼트 패치로 적용하여 테스트하고 설치했는데... 문제가 해결되었습니다.

나는 지금 그것을 계속 실행할 것이고 그것이 다른 어떤 것도 깨지지 않는 것 같으면 그것이 결국 모든 다른 배포판으로 줄어들 것이라고 기대하면서 그것이 zsh 업스트림에 적용되었는지 확인할 것입니다.

지금 문제가 있고 배포판이 줄어들 때까지 기다릴 수 없다면 zsh 5.9.4 소스를 다운로드하고 위 패치로 패치하고 로컬로 빌드하십시오. 배포 패킷에 통합하려는 경우 데비안에서 수행하는 방법은 다음과 같습니다(대부분의 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 패키지 버전을 잠가야 합니다) :-)

관련 정보