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)
按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 的 Dualbus和ESCvRiviera 帮助我弄清楚了上面的解释。
| 归档时间: |
|
| 查看次数: |
2561 次 |
| 最近记录: |