我想替换现有的 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 中完成,因为只有该builtin autoload
位被写入,_original_normal
然后无法加载(_original_normal
.zshrc 中没有文件fpath
)。
有没有办法强制加载_normal
?
_normal
PS:如果我在之前点击选项卡后在 shell 中执行此操作,那么它似乎正在重新定义作品。
答案1
在 zsh 中,您可以传递+X
标志来autoload
加载函数$fpath
而不执行它。
此外,您可以通过操作数组将函数复制到新名称functions
。
autoload -Uz +X _normal
functions[_original_normal]=$functions[_normal]
_normal () {
…
}
答案2
现在我跑
_normal &> /dev/null || true
_normal
与其他完成一样,通常不应直接从 shell 调用,并且(没有重定向)会收到一条错误消息:
_default:compcall:12:只能从完成函数调用
这里|| true
似乎没有必要,因为_normal
这样调用不会返回错误代码。