我创建了一个像这样的简单小部件:
function my_widget() { ... }
zle -N my_widget
bindkey '^P' my_widget
问题是这个按键绑定并不总是有效。例如,当脚本正在等待通过read
或进行输入时vared
,无法调用小部件。我希望能够随时调用它(例如^U
或^W
)。
我尝试将键绑定添加到每个键映射(除了.safe
,因为它是写保护的)。
我希望能够从任何地方使用我的快捷方式,它不必是 ZLE 小部件。
是否有可能实现我想要实现的目标?
答案1
zle
/bindkey
是配置当前shell的z
shine l
ditor 。e
调用 zle 来在交互式 shell 中编辑命令行或通过它的命令来编辑vared
命令ed
行var
。在这两种情况下,zle 都可以编辑任何文本,不限于单行。
read
不使用行编辑器,而是读-d
来自 stdin(或带有 的其他行描述符)的单行(或带有 的其他类型的记录-u
),它不必是终端设备并将该记录中的单词存储到提供的变量中。
如果您想让用户在脚本中输入一些文本并使用 zle 对其进行编辑,则必须使用vared
.例如:
var=; vared var
而不是IFS= read -r var
,请记住,即使 stdin 不是该终端,也始终会从终端上的用户读取输入。
如果您希望 zsh 实例的行编辑器开始解释该脚本以具有与默认值不同的键绑定,您需要 zsh 实例执行这些命令zle
和bindkey
命令来定义和绑定这些小部件。
您可以将它们添加到~/.zshenv
每个zsh
实例(甚至是那些从不与用户交互的实例)中,以定义和绑定这些小部件,但请注意,当最终定义一个新函数时,您需要仔细选择其名称以删除它与您将使用的任何脚本所使用的函数命令发生冲突的风险。
至于^W
和^U
,请注意,虽然zsh
有 zle 小部件,但它们模仿(并增强)了相应的小部件终端设备行规则(在内核中的 tty 设备驱动程序中)行编辑器的(erase
和)。kill
该行编辑器(当应用程序从终端读取而不实现自己的行编辑器时使用)非常基本,只有少数小部件(kill
,erase
,eol
,eof
...),您可以使用命令绑定它们stty
,并且不多除此之外更具可配置性。