Lane East 的 blog

一百年很短,一秒钟很长

在 vim 的命令行编辑时使用 bash 风格的快捷键

2008-09-03 03:12

用习惯了 bash 之后, 有几个快速编辑命令的快捷键还是很爽的:

按键 作用
ctrl-a 到行首
ctrl-e 到行尾
ctrl-f 前进一个字符
ctrl-b 后退一个字符
alt-b 前进一个词
alt-f 后退一个词

好吧, 我承认, 这应该是 emacs 的快捷键, 但是, 我不会用 emacs, 如果让我用 emacs 的话, 估计我也只会这几个在 bash 下熟悉了的快捷键.

可惜这几个在 vim 的命令行编辑的时候下, 就只有 ctrl-e 是这样的作用, 其它的在不兼容 vi 的模式下的作用如下:

按键 作用
ctrl-a 插入最近插入的内容
ctrl-f 打开命令行窗口
ctrl-b 到行首(嗯, 没错, 我想要的 ctrl-a 的功能)

而 alt 的那两个, 根本就不能用.

一直以来, 都懒得去配置了, 今天也不知道是因为什么, 反正就是想起来了, 就干脆给配置了一下.

很简单, 把命令模式下的按键映射一下就可以了, 为了防止嵌套映射, 所以使用 cnoremap 来设置, 在 _vimrc 文件(没错, 我在 windows 下用 gvim, 其实也在 linux 下用)中加入了下面几行, 就搞定了:

cnoremap <C-A> <Home>
cnoremap <C-F> <Right>
cnoremap <C-B> <Left>
cnoremap <A-b> <S-Left>
cnoremap <A-f> <S-Right>
cnoremap <A-B> <S-Left>
cnoremap <A-F> <S-Right>

其中要注意的是, <A-b> 这样的东西, 居然是区分大小写的, 为了在大写锁定的情况下也能使用这个快捷键, 我把 <A-b>, <A-f>, <A-B>, <A-F> 都映射了, 这样一来, 就可以不管大小写, 直接使用了.

另一个要注意的是, 因为 alt 键本身还有访问菜单项的作用, 而我在 guioptions 里面去掉了菜单项, 所以这里可以直接设置, 而如果使用了菜单项的话, 就要使用 set winaltkeys=no 来关闭 alt 访问菜单项的作用, 或者干脆不使用 alt 键的那一组快捷键, 其实我在 bash 里面就很少用 alt-b, alt-f 的, 因为 X 下的终端也有菜单, 汗!

这下 bash, lftp 之类的程序可以用一样的快捷键了, 怎一个爽字了得 :D

不过, 在插入模式下编辑文本时, ctrl-a 是插入最近插入的内容, ctrl-b 已经不再使用了, ctrl-f 在 cindent 模式下有重新计算缩进的功能, 而 ctrl-e 则是插入光标下的字符的功能, 这样设置了之后, 在编辑命令的时候和编辑文件的时候, 就会有行为不一至的情况, 不过, 这对我来说似乎没什么影响, 一是我本来在编辑文件的时候就很少用那几个快捷键, 另一个是, 我在用 vim 的时候习惯上能区分这两者(幸运啊:D)

分类:

评论

  1. 一直使用的是直接引入mswin.vim,看博主这么一说我也该充分利用下ctrl了,呵呵

    xhat · 2008-09-05 08:28 · #

  2. mswin.vim 里面应该是设置了ctrl-c, ctrl-v 复制粘贴的吧, 那样 ctrl-v 进入块选择模式就失效了, 有点受不了这一点, 所以就没引别的内容, 简单的写几个自己习惯的配置, 也花不了多少时间的:)

    不好意思, 还审核了一下, AoYun期间, 空间商要求的, 没办法啊 :(

    LanEast · 2008-09-05 16:11 · #

  3. 路过, 准确的说这不是使用bash的快捷键,而是emacs的方式的快捷键,bash是既可以支持emacs方式也可以支持VI的方式的:
    ~$ set -o emacs

    ~$ set -o vi

    null · 2010-03-05 05:47 · #

  4. 嗯, 的确是这样, 不过我觉得单行的编辑还是 emacs 的模式更方便, 虽然我是用 vim 作主编辑器的, 大概是用习惯了吧.

    Lane East · 2010-03-09 04:32 · #

  预览后可提交