ZSH에서 사용자 정의 스크립트를 완료할 때 이상한 동작이 발생하며 몇 가지 아이디어, 무엇이 잘못되었는지, 해결 방법이 필요합니다.
나는 몇 가지 사용자 정의 스크립트를 작성 myscript
하고 해당 완성 스크립트를 만들었습니다 _myscript
. 후자는 평소와 같이 다음 줄로 시작합니다. ( #compdef myscript
또한 #compdef _myscript myscript
동일한 결과로 시도되었습니다). 시작하려면 내 디렉토리에 이 두 파일이 있었는데 ~/.local/bin
, 이는 ZSH가 완성 스크립트를 찾을 수 있도록 $PATH
my에도 추가했습니다 .$fpath
여태까지는 그런대로 잘됐다. 명령이 완료되면 모든 것이 잘 작동합니다 myscript
. 하지만 저는 이 두 파일을 내 폴더로 옮겼습니다..dot 파일해당 Git 저장소를 통해 공유하세요. 내 도트 파일에는 완료 스크립트용 폴더가 포함되어 있습니다 $fpath
. 이 폴더도 내 도트 파일의 하위 디렉터리로 이동하면 완료 작업이 중지됩니다.
.zcompdump
업데이트 완료 할당을 제거 하고 다른 구문을 테스트하여 내 디렉토리를 추가했지만 $fpath
아무 도움이 되지 않았습니다. 또한 모든 할당이 수행된 후에 호출되는지 확인하기 위해 compinit
삭제 후 수동으로 호출합니다 ..zcompdump
rustup
첫 번째 이상한 점은 dotfile 디렉토리의 다른 완료 스크립트가 my 및 명령에 대한 완료 스크립트도 포함하고 있기 때문에 ZSH 완료 시스템에서 인식된다는 것입니다 cargo
. 다른 단계를 시도한 후 grep을 수행하면 .zcompdump
항상 두 명령에 대한 할당이 표시되지만 myscript
.
두 번째 이상한 동작은 완성 스크립트를 디렉터리로 다시 이동 ~/.local/bin
하고 ZSH를 다시 시작하면 갑자기 스크립트를 인식하고 완성이 다시 작동하기 시작한다는 것입니다. 이제 내 내부에서도 grep할 수 있습니다..zcompdump
이제 이유가 무엇인지 전혀 모르겠습니다. 특히 동일한 디렉토리에서 rustup
완료가 제대로 작동하기 때문에 더욱 그렇습니다. cargo
내 도트 파일에서 모든 사용자 정의 완성 작업을 수행하는 것이 더 편할 것이므로 너무 많은 수동 구성 없이 다른 컴퓨터에서 사용할 수 있습니다. 물론, 내 내부에 완료 할당을 하드코딩할 수 있다는 것을 알고 있지만 zshrc
이는 일반만큼 이식성이 낮습니다. fpath
이는 아마도 제가 놓친 작은 측면일 수 있지만 누군가 해결책을 알고 있기를 바랍니다.
내 스크립트 코드 때문이 아닌 것 같아서 많은 코드를 제공할 수 없습니다. JFYI: 저는 Manjaro Linux를 실행하고 있습니다(미리 정의된 ZSH 설정으로 확인했습니다).
답변1
글쎄, 확실히 내 잘못이야.
neovim으로 편집 zshrc
하고 포인트 파일에 대한 경로를 보유하는 변수를 생성하면 neovim 자동 완성 기능이 /
문자열 끝에 내가 인식하지 못하는 추가 슬래시를 추가합니다. 이 변수를 하위 문자열로 사용하여 완성 스크립트가 저장되는 디렉터리를 추가하고 fpath
불필요한 이중 슬래시를 추가합니다. 따라서 ZSH는 잘못된 디렉토리를 검색하고 있습니다.
유일하게 이상한 점은 for를 완료했지만 rustup
여전히 cargo
잘못된 경로를 사용하고 있다는 것입니다. 하지만 그게 문제가 아니죠...