是否可以手动调用 zsh 完成功能?

是否可以手动调用 zsh 完成功能?

如果我在 zsh 提示符下并且有当前的“上下文”(部分完成的命令行命令)

% man gr_
        ^ here I have used _ to  represent the cursor 

如果我然后调用该_complete_help函数CtrlXh

它告诉我上下文是

% man gr_
tags in context :completion::complete:man::
    manuals  (_man)

如果我正确地阅读了这个输出 - 我可以看到有一个完整的函数_man能够列出所有已知的手册页 - 如果我Tab此时按下按键,就会调用该函数。
我的问题是,我可以_man手动调用完成函数吗?而不是_man由 compsys 调用(它本身由 调用Tab)?

我尝试过使用 zle minibuffer <Esc>x,然后键入_man<Enter>,但我认为迷你缓冲区只能理解 zle 命令,而不能执行一般功能。

答案1

我发现它对于简单的完成函数是可能且可用的,但是因为这个特定的函数_man执行一些解析和验证工作,所以在其预期上下文之外调用时它会生成错误。

以下是我将完成函数绑定_man到组合键的操作,以便可以手动调用它。

定义一个包装函数来设置所需的选项。

_man_autonomous () {
  eval $_comp_setup
  _man "$@"
}

使用行编辑器注册一个新的小部件:

zle -C complete-man expand-or-complete _man_autonomous

将小部件绑定到Ctrl+T

bindkey '^T' complete-man

有一个_fileszsh FAQ 中使用此技术的示例

答案2

我不知道为什么 zsh 不提供这个功能......幸运的是有人做了一个 hack:https://github.com/Valodim/zsh-capture-completion

$ capture.zsh 'man gr'
grep
<snip>
groff
<snip>

相关内容