%EC%9D%80%20%EB%8C%80%EC%8B%9C%EA%B0%80%20%ED%8F%AC%ED%95%A8%EB%90%9C%20%EB%AA%85%EB%A0%B9%20%EC%9D%B4%EB%A6%84%EC%97%90%20%EB%8C%80%ED%95%B4%20%EC%8B%A4%ED%96%89%EB%90%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
나는 영원히(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 패키지 버전을 잠가야 합니다) :-)