文档在第18.4节Widgets 中说,“小部件的工作只是执行一些小动作”。但是我找不到如何调用这些操作的一般描述,即如何调用小部件。
我在示例中看到(例如参见此问答),小部件可以使用 .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(只能在小部件函数内部访问):
Run Code Online (Sandbox Code Playgroud)ZLE_STATE (scalar)包含一组以空格分隔的词,用于描述当前的 zle 状态。
目前,显示的状态是由 overwrite-mode 或 vi-replace 小部件设置的插入模式,以及历史命令是否会访问由 set-local-history 小部件控制的导入条目。该字符串包含
insert如果要在命令行上插入的字符将现有字符向右移动,或者overwrite要插入的字符是否覆盖现有字符。它包含localhistory是否仅访问本地历史命令或globalhistory是否也将访问导入的历史命令。子字符串按字母顺序排序,因此如果您想以面向未来的方式测试两个特定的子字符串,您可以通过执行以下操作进行匹配:
Run Code Online (Sandbox Code Playgroud)if [[ $ZLE_STATE == *globalhistory*insert* ]]; then ...; fi
来自man zshzle.