여러 완성 파일(zsh)에서 사용할 탭 완성 도우미 기능 정의

여러 완성 파일(zsh)에서 사용할 탭 완성 도우미 기능 정의

동일한 툴킷의 여러 명령에 대해 zsh 완료 기능을 작성 중입니다.

명령은 서로 다른 파일에 서로 다른 완성을 작성하고 싶을 정도로 다릅니다. (즉, 의 완성은 헤더가 있는 파일에 있고 do_thingA, 의 완성은 헤더가 있는 파일에 있습니다.)_do_thingA#compdef do_thingAdo_thingB_do_thingB#compdef do_thingB

이러한 명령은 서로 다르지만 모두 공통 매개변수를 갖습니다. 따라서 명령 간의 모든 차이점으로 인해 어떤 시점에서는 모든 _do_thing파일에 다음과 같은 내용이 포함됩니다.

...
_arguments \
...
  '-c[common option]:common option:_helper_function' \
...

_helper_function모든 파일 _do_thing에 동일한 것을 정의하는 것을 피하고 싶습니다 . 가장 중요한 것은 사용자가 자신만의 것을 제공할 수 있도록 하고 싶습니다(더 나은 개인화 _helper_function).

이를 달성하는 가장 좋은 방법은 무엇입니까?

고려해야 할 사항:

가드 정의

나는 _helper_function이미 정의된 내용을 덮어쓰는 것을 방지할 수 있다는 것을 이미 알고 있습니다.

(( $+functions[_helper_function] )) ||
_helper_function() {
  ...
}

_do_thing모든 파일에 넣을 수 있습니다 . 하지만 저는 이것을 _helper_function별도의 파일로 아웃소싱하는 것을 선호합니다 _helper_function.

함수 본문을 별도의 파일에 넣습니다.

파일을 생성하고 _helper_function어딘가에 배치하면 fpath해당 내용은 함수의 함수 본문이 됩니다 _helper_function. 이 경우 헤더 주위에 정의 가드를 배치하는 방법을 모르겠습니다 _helper_function()(더 이상 직접 작성하지 않기 때문에).

답변1

한 가지 방법은 먼저 _helper_function어딘가에 배치 fpath한 다음 다른 위치에 배치하는 것입니다..zshrc

autoload -U _helper_function

그런 다음 사용자가 이를 사용자 정의하려는 경우 해당 버전이 귀하의 버전보다 먼저 발견되도록 새 _helper_function파일을 넣습니다. 예를 들어 다음과 같습니다 .fpathfirstfuncdir

% cd
% mkdir firstfuncdir
% fpath=(~/firstfuncdir $fpath)
% print -l $fpath
/Users/jhqdoe/firstfuncdir
/Users/jhqdoe/.zsh/functions/darwin
/Users/jhqdoe/.zsh/functions
/usr/local/share/zsh/site-functions
/opt/local/share/zsh/site-functions
/opt/local/share/zsh/5.5.1/functions
% 

관련 정보