大家都知道,shell命令行有两种编辑模式emacs-modevi-mode。我个人比较喜欢用vi-mode。这样在敲命令的时候就不用把手移到方向键上去。非常方便。使用 "set -o vi" 启用vi-mode,使用 "set -o emacs" 启用emacs-mode
    但是我今天发现了一件非常奇怪的事情。应该是bash的一个bug。我把 "set -o vi" 写在 ~/.bashrc 里面(为什么?你懂的),当我打开新的shell时,发现vi-mode不起作用。然后我把 "set -o vi" 从 ~/.bashrc 中注释掉,在开启一个新的shell,手动输入 "set -o vi",这时候一切正常。经过长时间的反复尝试,最后发现只要是在 ~/.bashrc 里面加上 "set -o vi" 就会让vi-mode永久失效。而emacs-mode总是正常的。汗~ 莫非bash的开发者和vi的开发者有深仇大恨??
    后来上网查了下,发现是和 /etc/inputrc 冲突了。具体原因不详。貌似是INPUTRC机制和vi-mode冲突了。欢迎知道的同学解释一下。最后找到两种解决方法。
    1. 创建一个空文件 "~/.inputrc",这样能够覆盖 /etc/inputrc 的配置,在 ~/.bashrc 中加入 "set -o vi"。
    2. 把 ~/.bashrc 中的 "set -o vi" 注释掉,在 "~/.inputrc” 中加入 "set editing-mode vi"。
 
    第一种方法是直接去掉了inputrc的配置,这样可能无法在命令行中输入双字节(如汉字),第二种方法就能完美的保留inputrc的配置并且是bash默认使用vi-mode,方法是复制 /etc/inputrc 到 ~/.inputrc 在执行方法2。
 
补充:我的操作系统内核是Linux 2.4.30。不知道其他版本的有没有这个问题。
 
2011/5/27 - 后记:今天好像发现了这个问题的原因了。情况可能是这样的。inputrc中通过其他机制(和"set -o vi"不同的机制,而且这个机制有bug)默认设置了emacs-mode,并覆盖了bashrc中的"set -o vi"。现在看来应该是inputrc机制的开发人员和vi有仇了。下面步骤是比较官方的解决方法:
 
1. 在bashrc中加入以下代码
set -o vi
 
2. 在inputrc中加入以下代码
$if mode=vi
set editing-mode vi
set keymap vi
$endif