文档在部分中说明18.4 小部件,即“小部件的工作只是执行一些小操作”。但我找不到如何调用这些操作(即如何调用小部件)的一般描述。
我曾在一些例子中看到过(例如此问答),小部件可以使用 绑定到键bindkey KEY WIDGET
。然后可以使用 调用小部件KEY
。
我想切换set-local-history
并尝试:
$ zle set-local-history 1
zle: widgets can only be called when ZLE is active
zle -h
不起作用,但我发现此处的参数描述。但好像没有类似的东西--call
。
我做错了什么?如何在没有 bindkey 的情况下调用小部件?如何打印当前状态?(set-local-history
切换状态)
答案1
execute-named-cmd
您可以通过绑定到ESC-x
(emacs 绑定)或:
(vi 绑定)的 widget 来执行 widget :
execute-named-cmd (ESC-x) (:) (unbound)
读取编辑器命令的名称并执行它。
这开启了一个微型缓冲区在命令行下方,您可以在这里启动 zle 小部件。(可以使用自动完成功能!):
$ [ESC-x]
execute: set-[TAB]
set-local-history set-mark-command
要查询状态zle
(包括本地历史记录),请使用变量$ZLE_STATE
(仅在小部件函数内部访问):
ZLE_STATE (scalar)
包含一组用空格分隔的词,描述当前的 zle 状态。
目前,显示的状态是插入模式(由 overwrite-mode 或 vi-replace 小部件设置)以及历史命令是否会访问导入的条目(由 set-local-history 小部件控制)。字符串包含
insert
要在命令行中插入的字符是否将现有字符移到右侧,或者overwrite
要插入的字符是否覆盖现有字符。它包含localhistory
是否只访问本地历史命令或者globalhistory
是否也访问导入的历史命令。子字符串按字母顺序排序,因此如果您想以面向未来的方式测试两个特定子字符串,则可以通过执行以下操作进行匹配:
if [[ $ZLE_STATE == *globalhistory*insert* ]]; then ...; fi
所有引言均来自man zshzle
。
答案2
如果您正在使用,tmux
则可以使用 调用绑定的键send-keys
。
例子:
# Current pane
$ tmux send-keys C-r
# Some targeted pane
$ tmux send-keys -t SESSION_NAME:WINDOW_NUMBER.PANE_NUMBER C-z