목적을 달성하기 위해 명령을 다른 명령으로 취급합니다.

목적을 달성하기 위해 명령을 다른 명령으로 취급합니다.

내 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수 있습니다.gzipgunzippigzunpigzcompdef _gzip foofoo_gzipcompdef _gzip foo=pigzfoo_gzippigz

특정 사례로 돌아가면 기본 완성은 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

관련 정보