有没有办法通过按键将Bash或zsh从Emacs模式切换到vi模式?

时间:2010-04-14 18:49:50

标签: bash history zsh

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

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

2 个答案:

答案 0 :(得分:11)

您可以创建一个切换,因为键绑定在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)

答案 1 :(得分:5)

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

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

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

为了后人的缘故,这是我原来的答案,对于那些没有读取功能的人来说,这可能是有用的。

这是一种可以设置它的方法,清除过程中的当前命令行。我知道,这不是你想要的,但也许它会帮助找到这个问题的其他人。在〜/ .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键。