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


12

该文档在第18.4节“小部件”中说,“小部件的工作仅仅是执行一些小动作”。但是我找不到关于如何调用这些动作(即如何调用小部件)的一般描述。

在示例中(例如,请参阅此Q&A),我已经看到小部件可以使用绑定到键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切换状态)

Answers:


9

您可以通过widget来执行widget,该widget execute-named-cmd绑定到ESC-x(emacs绑定)或:(vi绑定):

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状态的一组用空格分隔的单词。

当前,显示的状态是由覆盖模式或vi-replace小部件设置的插入模式,以及历史命令是否将访问由set-local-history小部件控制的导入条目。该字符串包含 insert 是否要在命令行上插入的字符向右移动现有字符,或者overwrite是否要插入的字符覆盖现有字符。它包含localhistory是否仅将访问本地历史命令或globalhistory是否还将访问 导入的历史命令。

子字符串按字母顺序排序,因此,如果您要以一种面向未来的方式测试两个特定的子字符串,则可以执行以下操作进行匹配:

if [[ $ZLE_STATE == *globalhistory*insert* ]]; then ...; fi

的所有引号man zshzle


嗯,是的,我想我已经看过两个引号了,但是我不理解三个大括号中的值。手册页说:“这些特殊参数始终在窗口小部件功能中可用,但在ZLE之外则无任何特殊意义。” 这意味着,要获取ZLE_STATE,我需要定义一个函数和一个自定义小部件,对吗?
lumbric 2013年

@lumbric:是的,ZLE_STATE仅在窗口小部件函数中定义。我完善了答案。你的目标是什么?[野蛮猜测:为了在提示中显示本地/全局历史记录,我使用了一个小部件来(i。)设置shell变量(这可能在小部件内)并(ii。)执行zle set-local-history。]
mpy 2013年

我的主要目标是了解zle小部件的概念。我想了解一下set-local-history,当前是否将其设置为global或local。我认为必须有一个我们才能获取当前状态(类似于调用“ setopt”来获取当前启用的选项)。我最初的目标已经在此次问答中得以解决。
lumbric 2013年

1
基于阅读示例之前的句子,我期望if测试中的字符串应为“ *globalhistory*insert*”而不是“ *insert*globalhistory*”?
Volker Siegel

@VolkerSiegel:非常感谢,谢谢!我检查了源代码并亲自尝试了给定的示例,得出的结论是手册页中的示例是错误的,而不是语句(“按字母顺序排序”)。我编辑了答案,并将路径发送到zsh-workers邮件列表。
mpy 2014年

1

如果您正在使用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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.