在 ZSH 中创建全局键绑定

在 ZSH 中创建全局键绑定

我创建了一个像这样的简单小部件:

function my_widget() { ... }

zle -N my_widget

bindkey '^P' my_widget

问题是这个按键绑定并不总是有效。例如,当脚本正在等待通过read或进行输入时vared,无法调用小部件。我希望能够随时调用它(例如^U^W)。

我尝试将键绑定添加到每个键映射(除了.safe,因为它是写保护的)。

我希望能够从任何地方使用我的快捷方式,它不必是 ZLE 小部件。

是否有可能实现我想要实现的目标?

答案1

zle/bindkey是配置当前shell的zshine lditor 。e

调用 zle 来在交互式 shell 中编辑命令行或通过它的命令来编辑vared命令edvar。在这两种情况下,zle 都可以编辑任何文本,不限于单行。

read不使用行编辑器,而是-d来自 stdin(或带有 的其他行描述符)的单行(或带有 的其他类型的记录-u),它不必是终端设备并将该记录中的单词存储到提供的变量中。

如果您想让用户在脚本中输入一些文本并使用 zle 对其进行编辑,则必须使用vared.例如:

var=; vared var

而不是IFS= read -r var,请记住,即使 stdin 不是该终端,也始终会从终端上的用户读取输入。

如果您希望 zsh 实例的行编辑器开始解释该脚本以具有与默认值不同的键绑定,您需要 zsh 实例执行这些命令zlebindkey命令来定义和绑定这些小部件。

您可以将它们添加到~/.zshenv每个zsh实例(甚至是那些从不与用​​户交互的实例)中,以定义和绑定这些小部件,但请注意,当最终定义一个新函数时,您需要仔细选择其名称以删除它与您将使用的任何脚本所使用的函数命令发生冲突的风险。

至于^W^U,请注意,虽然zsh有 zle 小部件,但它们模仿(并增强)了相应的小部件终端设备行规则(在内核中的 tty 设备驱动程序中)行编辑器的(erase和)。kill该行编辑器(当应用程序从终端读取而不实现自己的行编辑器时使用)非常基本,只有少数小部件(killeraseeoleof...),您可以使用命令绑定它们stty,并且不多除此之外更具可配置性。

相关内容