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

Alb*_*lby 10 bash vi key-binding text-editors readline

Bash的“Emacs 模式”( set -o emacs) 中,我可以在我最喜欢的外部 $EDITOR 中编辑当前命令行。我所要做的就是按Ctrl+X然后Ctrl+ E

但是,因为我已经切换到 Bash 的“vi 模式”( set -o vi),所以这个按键序列没有任何作用。在“vi 模式”下,如何启动外部编辑器以编写更长的命令?

Mar*_*ala 15

emacs 模式绑定执行命令 edit-and-execute-command。要查看哪个绑定在 vi 模式下执行它,您可以给出命令:

$ bind -m vi -q edit-and-execute-command
edit-and-execute-command is not bound to any keys.
Run Code Online (Sandbox Code Playgroud)

最简单的方法是为其添加绑定

$ bind -m vi-insert '"\C-x\C-e": edit-and-execute-command'
Run Code Online (Sandbox Code Playgroud)

要使其永久化,您可以将其添加到 ~/.inputrc 作为

set keymap vi-insert
"\C-x\C-e": edit-and-execute-command
Run Code Online (Sandbox Code Playgroud)


unf*_*ica 8

答案

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);
Run Code Online (Sandbox Code Playgroud)

什么是vi_edit_and_execute_command?它是一个 Bash C 函数,在bashline.c.

一旁。我已经做了一些实验,以下是我现在怀疑的真实情况。绑定 Bash C 函数很奇怪。bind您可以从 Bash 的源代码中执行此操作,但通过在 Bash 提示符下使用内置命令似乎不可能执行此操作 。而且,一旦你完成了它,bind内置函数似乎甚至没有意识到它已经完成了。

我感谢Glenn Jackman指出这就是答案,也感谢 Freenode #bash 的 DualbusESCvRiviera 帮助我弄清楚了上面的解释。