ZSH:如何直接ZLE小部件?

lum*_*ric 13 zsh

文档在第18.4Widgets 中说,“小部件的工作只是执行一些小动作”。但是我找不到如何调用这些操作的一般描述,即如何调用小部件。

我在示例中看到(例如参见此问答),小部件可以使用 .bin 绑定到键bindkey KEY WIDGET。然后可以使用KEY.

我想切换set-local-history并尝试:

$ zle set-local-history 1
zle: widgets can only be called when ZLE is active
Run Code Online (Sandbox Code Playgroud)

zle -h不起作用,但我在这里找到了对参数的描述。但似乎没有类似的东西--call

我究竟做错了什么?如何在没有 bindkey 的情况下调用小部件?如何打印当前状态?(set-local-history切换状态)

mpy*_*mpy 11

您可以通过execute-named-cmd绑定到ESC-x(emacs bindings) 或:(vi bindings)的小部件来执行小部件:

execute-named-cmd (ESC-x) (:) (unbound)

读取编辑器命令的名称并执行它。

这会在命令行下方打开一个迷你缓冲区,您可以在其中启动 zle 小部件。(自动完成可用!):

$ [ESC-x]
execute: set-[TAB]
set-local-history  set-mark-command
Run Code Online (Sandbox Code Playgroud)

要查询zle(包括本地历史)的状态,请使用变量$ZLE_STATE(只能在小部件函数内部访问):

ZLE_STATE (scalar)
Run Code Online (Sandbox Code Playgroud)

包含一组以空格分隔的词,用于描述当前的 zle 状态。

目前,显示的状态是由 overwrite-mode 或 vi-replace 小部件设置的插入模式,以及历史命令是否会访问由 set-local-history 小部件控制的导入条目。该字符串包含 insert 如果要在命令行上插入的字符将现有字符向右移动,或者overwrite要插入的字符是否覆盖现有字符。它包含localhistory是否仅访问本地历史命令或 globalhistory是否也将访问导入的历史命令。

子字符串按字母顺序排序,因此如果您想以面向未来的方式测试两个特定的子字符串,您可以通过执行以下操作进行匹配:

if [[ $ZLE_STATE == *globalhistory*insert* ]]; then ...; fi
Run Code Online (Sandbox Code Playgroud)

来自man zshzle.