ZSH自定义小部件无法正常工作,我认为应该如此


3

我正在尝试定义一个函数,以便我可以通过按Alt-启动Midnight Commander,但该函数不起作用。

我在另一个站点上找到并修改了一个函数并对其进行了修改:

function _midnight {
    zle kill-whole-line
    zle -U "mc"
    zle accept-line
}
zle -N _midnight
bindkey '\e,' _midnight

这就是我认为我要告诉它的事情:

define _midnight as {
erase everything on the line
insert "mc" on the command line
execute as a shell command
}
create _midnight as a custom widget
bind alt-comma to the widget

实际上它只是发送一个回车然后在下一行插入mc而不发送它。

之所以我使用它而不是bindkey -s '\e,' '^Umc^M因为我最终想找到一种方法来运行Midnight Commander,而不会在命令行上出现任何内容。

Answers:


2

这不起作用的原因是因为zle -U "mc"将“mc”推入输入堆栈,它不会替换当前的命令缓冲区。

你的小部件实际上做的是:

  • 空行
  • 把“mc”放在输入堆栈上
  • 接受空行

在接受该行之后,zsh从输入堆栈中拉出“mc”并放入当前的当前缓冲区。这就是为什么小部件似乎只打印“mc”而不做任何其他事情。

可以通过实现预期的结果

function _midnight {
    BUFFER="mc"
    zle accept-line
}

但你也可以这样做:

function _midnight {
    mc
    zle reset-prompt
}

主要区别在于第一个解决方案模拟了您将要执行的操作,例如键入命令并接受命令(这包括mc写入命令历史记录)。而第二个刚开始mczle reset-prompt是可选的,但mc退出时可能会将光标留在奇数位置。


我有很多东西需要学习。我完全错过了nothign实际上必须写入提示的部分。第二种解决方案非常优雅。
Brian Myers
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.