ZSH:如何直接调用 ZLE 小部件?

ZSH:如何直接调用 ZLE 小部件?

文档在部分中说明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

相关内容