我正在尝试定义一个函数,以便可以通过按 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
写入命令历史记录)。而第二个解决方案只是启动mc
。zle reset-prompt
是可选的,但mc
退出时可能会让您的光标停留在奇怪的位置。