ZSH 自定义小部件无法正常工作

ZSH 自定义小部件无法正常工作

我正在尝试定义一个函数,以便可以通过按 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,而不在命令行中出现任何内容。

答案1

这不起作用的原因是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退出时可能会让您的光标停留在奇怪的位置。

相关内容