在猛击的“Emacs 模式”(set -o emacs
),我可以在我最喜欢的外部 $EDITOR 中编辑当前命令行。我所要做的就是按Ctrl+X然后Ctrl按 + E。
但是,由于我已切换到 Bash 的“vi 模式”(set -o vi
),因此此键序列不起作用。在“vi 模式”下,如何启动外部编辑器来编写更长的命令?
答案1
emacs 模式绑定执行命令 edit-and-execute-command。要查看哪个绑定在 vi 模式下执行它,您可以给出命令:
$ bind -m vi -q edit-and-execute-command
edit-and-execute-command is not bound to any keys.
最简单的方法是为其添加绑定
$ bind -m vi-insert '"\C-x\C-e": edit-and-execute-command'
为了使其永久生效,您可以将其添加到 ~/.inputrc 作为
set keymap vi-insert
"\C-x\C-e": edit-and-execute-command
答案2
答案
按ESC进入 vi 命令模式,然后按v。Bash 将启动您选择的 $EDITOR。如果您尚未选择,Bash 将启动 vi(可视化编辑器)。
解释
为什么 BashESCv启动 vi?
因为 Bashbashline.c
包含函数调用:
rl_bind_key_if_unbound_in_map ('v', vi_edit_and_execute_command, vi_movement_keymap);
它是什么vi_edit_and_execute_command
?它是一个 Bash C 函数,在其他地方定义bashline.c
。
抛开这个不谈。我做了一些实验,下面是我现在怀疑是真的。绑定 Bash C 函数很奇怪。你可以在 Bash 的源代码中做到这一点,但似乎不可能通过 bind
在 Bash 提示符下使用内置命令来做到这一点。而且,一旦你完成了这件事,bind
内置命令似乎甚至没有意识到这件事已经完成了。
我感谢格伦·杰克曼为了指出这ESCv就是答案,感谢 freenode #bash 的 dualbus 和 Riviera 帮助我弄清楚上述解释。
答案3
如果要指定默认编辑器vi
,则需要设置环境变量EDITOR
:
export EDITOR=vi
现在说Ctrl-XCtrl-E要推出vi
。
答案4
如何禁用vi\vi-command\vi-movement 模式下的键edit-and-execute-command
:v
您无法将其重新绑定到nop
,因为它将自动重新绑定(请参阅 unforgettableid 的帖子)。相反,set-mark
如果您不使用它,您可以将其绑定到 。
.inputrc
:
set keymap vi-command
v: set-mark
# If you want to bind it to something else, e.g. Ctrl-v:
# "\C-v": edit-and-execute-command