zsh 的强制加载完成功能(无需通过按 Tab 强制执行)

zsh 的强制加载完成功能(无需通过按 Tab 强制执行)

我想替换现有的 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

_normalPS:如果我在之前点击选项卡后在 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这样调用不会返回错误代码。

相关内容