12

我希望能够暂时从 emacs 模式切换到 vi 模式,因为 vi 模式有时会更好,但在我意识到我想使用 vi 模式之前,我通常在输入一些内容的中途。

我不想永久切换到 vi 模式,因为我通常更喜欢命令行上的 emacs 模式,主要是因为我已经习惯了,而且多年来许多击键已经成为第二天性。(作为一个编辑器,我通常在 viper 模式下使用 emacs,这样我就可以同时使用vi 和 emacs 击键,因为我发现自己一直不小心在 vi 中使用它们,并且搞砸了,因为在某些情况下我发现 vi 击键更令人难忘和方便,在其他情况下是 emacs。)

4

3 回答 3

14

您可以创建一个切换,因为键绑定在 vi 模式和 emacs 模式之间是分开的。

$ set -o emacs
$ bind '"\ee": vi-editing-mode'
$ set -o vi
$ bind '"\ee": emacs-editing-mode'

现在 Alt-e(或 Esc e)将在模式之间切换。

在定义中的某处添加它,PS1以便在提示中显示您所处的模式。当您切换模式时,它不会立即显示更改,但会在发出新提示时更新。

$(set -o | grep emacs.*on >/dev/null 2>&1 && echo E || echo V)
于 2010-04-14T22:36:20.660 回答
5

啊哈!我查看了 readline 源代码,发现您可以这样做:

 "\M-v": vi-editing-mode
 "\M-e": emacs-editing-mode

似乎没有切换,但这可能已经足够了!

为了子孙后代,这是我的原始答案,这对于尝试做没有 readline 功能的事情的人可能很有用。

这是您可以设置它的一种方法,在此过程中清除当前命令行。我知道,这不是您想要的,但也许它会帮助发现此问题的其他人。在 ~/.inputrc 中:

"\M-v": "\C-k\C-uset -o vi\C-j" # alt (meta)-v: set vi mode
"\M-e": "\C-k\C-uset -o vi\C-j" # alt (meta)-e: set emacs mode

或切换...这应该工作:

"\M-t": "\C-k\C-u[[ \"$SHELLOPTS\" =~ '\\bemacs\\b' ]] && set -o vi || set -o emacs\C-j"

这些本质上是别名,更进一步映射到 readline 中的键,这样您就不必键入别名并按 Enter 键。

于 2010-04-14T19:12:33.457 回答
3

以下几.inputrc行允许Meta / Alt+在和模式E之间切换。emacsvi-insert

j同时哞哞哞哞k将带您进入vi-command模式。

注意:唯一带“kj”的英文单词是“blackjack”,没有单词包含“jk”)

set keymap emacs
"\ee": vi-editing-mode
"jk": "\eejk"
"kj": "\eejk"

set keymap vi-insert
"\ee": emacs-editing-mode
"jk": vi-movement-mode
"kj": vi-movement-mode

set keymap vi-command
"\ee": emacs-editing-mode

注意:如果您在 to 下添加绑定keymap emacsvi-movement-mode尝试直接切换到vi-command模式,则提示不会更新(如果您有show-mode-in-prompt on),因此需要上述解决方法。

于 2016-08-16T11:18:03.243 回答