기존 zsh 완성 함수를 대체하고 원래 함수에 대한 참조를 유지하고 싶습니다.(여기에서). 예를 들어 탭 완성이 항상 nice
명령줄의 첫 번째 단어로 제안되도록 하려면 다음을 수행하세요 .
eval "$(declare -f _normal | sed '1s/.*/_original&/')"
_normal() {
if [[ $CURRENT == 1 ]] ; then
# suggest only "nice" as first word
_wanted commands expl "be nice" compadd nice
else
# do normal completion afterwards
_original_normal
fi
}
지금 내가 이해한 바에 따르면 문제는 새 zsh가 _normal
아직 로드되지 않았다는 것입니다.
PROMPT> functions _normal
_normal () {
# undefined
builtin autoload -XUz
}
그러나 처음으로 ⇥를 클릭하면 로드됩니다.
PROMPT> functions _normal
_normal () {
local _comp_command1 _comp_command2 _comp_command skip
if [[ "$1" = -s ]]
then
skip=(-s)
else
skip=()
_compskip=''
<snap>
이는 해당 비트만 기록된 다음 로드할 수 없기 때문에 위의 재정의를 _normal
내 .zshrc에서 수행할 수 없음 을 의미합니다 ( .zshrc에 파일이 없음 ).builtin autoload
_original_normal
_original_normal
fpath
강제로딩하는 방법이 있나요 _normal
?
_normal
추신: 이전에 탭을 클릭한 후 셸에서 이 작업을 수행하면 작업이 재정의되는 것 같습니다.
답변1
zsh에서는 +X
플래그를 전달하여 autoload
함수를 $fpath
실행하지 않고 로드할 수 있습니다.
또한 배열을 조작하여 함수를 새 이름으로 복사할 수 있습니다 functions
.
autoload -Uz +X _normal
functions[_original_normal]=$functions[_normal]
_normal () {
…
}
답변2
이제 나는 달린다
_normal &> /dev/null || true
_normal
다른 완성과 마찬가지로 일반적으로 셸에서 직접 호출하면 안 되며 (리디렉션 없이) 오류 메시지가 표시됩니다.
_default:compcall:12: 완성 함수에서만 호출할 수 있습니다.
이러한 호출은 오류 코드를 반환하지 않으므로 이는 || true
불필요한 것 같습니다 ._normal