我希望能够暂时从emacs模式切换到vi模式,因为vi模式有时更好,但我通常会在我意识到我想要之前输入一些内容使用vi模式。
我不想永久切换到vi模式,因为我通常更喜欢命令行上的emacs模式,主要是因为它是我习惯的,多年来许多击键已成为第二天性。 (作为编辑器,我通常在viper模式下使用emacs,因此我可以使用两个 vi和emacs按键,因为我发现自己不小心在vi中使用它们,并且搞砸了,因为在某些情况下,我发现vi击键更令人难忘和方便,在其他情况下,emacs。)
答案 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键。