我在“vi 模式”下使用 Bash。使用外部编辑器编辑当前命令行的热键序列是什么?

我在“vi 模式”下使用 Bash。使用外部编辑器编辑当前命令行的热键序列是什么?

猛击的“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-commandv

您无法将其重新绑定到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

相关内容