내 zshrc에는 디렉토리를 생성하고 입력하는 다음 기능이 포함되어 있습니다.
function mcd () {
mkdir -p "$*" && cd "$*"
}
함수 자체는 잘 작동하지만 완료 후에는 이상한 동작이 발생합니다. 예를 들어 입력을 시작한 mcd ~/
다음 을 누르면 Tab메시지가 나타납니다.
_mtools_drives:3: command not found: mtoolstest
삽입 지점에 삽입되고 아무 작업도 수행되지 않습니다. 내가 원하는 것은 명령이 다음과 같이 완료되는 것입니다 mkdir
. zsh는 나에게 기존 디렉토리의 이름을 제공해야 합니다.
mcd
완료 목적을 위해 zsh가 동일하게 처리되어야 한다고 어떻게 지시합니까 mkdir
?
답변1
다음 코드 조각은 mcd
다음과 같이 완료 됩니다 mkdir
.
compdefas () {
if (($+_comps[$1])); then
compdef $_comps[$1] ${^@[2,-1]}=$1
fi
}
compdefas mkdir mcd
작동 방식은 현재 완료 설정을 찾는 것입니다 mkdir
. 함수의 완성 코드(일반적으로 완성 함수의 이름)는 연관 배열에 저장됩니다 _comps
. 따라서 진술은 compdef $_comps[mkdir] mcd
지금 완성된 것과 mcd
같은 방식으로 완성되어야 합니다.mkdir
위의 함수는 몇 가지 세부 정보를 추가합니다.
- 테스트에서는 완료 방법이 지정되지 않은
(($+_comps[$1]))
경우$1
다른 매개변수에 대해 완료 방법이 설정되지 않는지 확인합니다. ${@[2,-1]}
는 두 번째 인수로 시작하는 함수 인수 목록이므로 여러 명령 이름을 지정하여 완성을 정의할 수 있습니다. 실제로는${^@[a,-1]}
이렇습니다각 배열 요소에 대한 배열 확장 주변의 텍스트를 복사합니다..=$1
설정사용할 서비스 이름. 이는 완성 기능이 밀접하게 관련된 여러 명령을 처리하는 몇 가지 명령에만 중요합니다. 예를 들어, 완성 함수는 and 뿐만 아니라 while 의 기본 동작을 사용하여 완료를 위한 동작을 사용할_gzip
수 있습니다.gzip
gunzip
pigz
unpigz
compdef _gzip foo
foo
_gzip
compdef _gzip foo=pigz
foo
_gzip
pigz
특정 사례로 돌아가면 기본 완성은 mkdir
디렉터리를 제공할 뿐만 아니라 함수가 지원하지 않는 옵션도 제공합니다. 따라서 실제로 mcd
기존 디렉터리를 완성하도록 정의하는 것이 더 좋습니다 . Zsh에는 도우미 기능(문서화되지 않은 래퍼)이 함께 제공됩니다._files
).
compdef _directories mcd
이렇게 이상하게 보이는 완성이 나타나는 이유 mcd
는 그것이 한때 상당히 광범위한 명령 모음이었던 명령의 이름이었기 때문입니다.공구 상자.
답변2
compdef
다음 양식을 사용하십시오.
compdef [ -ane ] function name
따라서 한 가지 아이디어는 다음을 통해 함수를 name
가리키는 것 입니다.mcd
_mkdir
compdef _mkdir mcd
그러나 이는 다소 부정확한데, mkdir
완료에는 제공해서는 안 되는 다양한 플래그가 제공되기 때문입니다 cd
. 보다 직접적인 방법은 디렉토리에서 수행하는 것입니다.
compdef _directories mcd