vi/vim使用进阶: 自动补全

<< 返回vim使用进阶: 目录

本节所用命令的帮助入口:

:help compl-generic
:help 'complete'
:help ins-completion 

上篇文章介绍了vim的智能补全(omni补全),本篇主要介绍vim提供的其它补全方式。

除智能补全外,最常用的补全方式应该是CTRL-NCTRL-P补全了。它们会在当前缓冲区、其它缓冲区,以及当前文件所包含的头文件中查找以光标前关键字开始的单词。智能补全不能对局部变量进行补全,而CTRL-NCTRL-P补全则可以很好的胜任。

下图是采用CTRL-P补全的一个例子,输出字符”pa”,然后按CTRL-P,vim会在下拉菜单中列出所有的匹配功能供选择,此时再按一下CTRL-P,就选中了第一个项目,也就是我想输入的”parmp”。我们第一次输入CTRL-P的是进行补全,第二次输入的CTRL-P是在下拉菜单中向上选择,二者的含义是不同的。

我们知道,CTRL-P一般的含义是向上,因此CTRL-P补全是向上查找以进行补全,而CTRL-N是向下查找以进行补全,在不同场合使用不同的快捷键可以加速补全的速度。

使用CTRL-NCTRL-P补全时,由’complete‘选项控制vim从哪些地方查找补全的内容。例如,对于比较大的软件项目,文件包含关系复杂,如果CTRL-NCTRL-P补全时查找所包含的头文件,耗时会比较久。此时,可以在’complete‘选项中去掉’i‘标记,这样CTRL-NCTRL-P补全就不在头文件中查找了,速度会快很多;当然,弊端就是你无法对头文件中出现的某些内容进行补全了。’complete‘选项中其它标记的含义,请阅读手册页。

vim中其它的补全方式包括:

整行补全                        CTRL-X CTRL-L
根据当前文件里关键字补全        CTRL-X CTRL-N
根据字典补全                    CTRL-X CTRL-K
根据同义词字典补全              CTRL-X CTRL-T
根据头文件内关键字补全          CTRL-X CTRL-I
根据标签补全                    CTRL-X CTRL-]
补全文件名                      CTRL-X CTRL-F
补全宏定义                      CTRL-X CTRL-D
补全vim命令                     CTRL-X CTRL-V
用户自定义补全方式              CTRL-X CTRL-U
拼写建议                        CTRL-X CTRL-S 

例如,当我们按下”CTRL-X CTRL-F“时,vim就会弹出下拉菜单,显示出当前目录下的可选目录和文件,如下图所示。这样,在输入文件名时方便多了。

灵活的运用这些补全方式,甚至自定义自己的补全方式,可以使你的工作更加高效。

可以在vimrc中定义下面的键绑定,以减少按键次数:

inoremap <C-]>             <C-X><C-]>
inoremap <C-F>             <C-X><C-F>
inoremap <C-D>             <C-X><C-D>
inoremap <C-L>             <C-X><C-L> 

SuperTab插件会记住你上次所使用的补全方式,下次再补全时,直接使用TAB,就可以重复这种类型的补全。比如,上次你使用CTRL-X CTRL-F进行了文件名补全,接下来,你就可以使用TAB来继续进行文件名补全,直到你再使用上面列出的补全命令进行了其它形式的补全。这个插件在下面的链接下载:

http://www.vim.org/scripts/script.php?script_id=1643

下载后,把它放到.vim/plugin目录就可以了。

可以对下面两个选项进行配置,以调整SuperTab的缺省行为:

  • g:SuperTabRetainCompletionType的值缺省为1,意为记住你上次的补全方式,直到使用其它的补全命令改变它;如果把它设成2,意味着记住上次的补全方式,直到按ESC退出插入模式为止;如果设为0,意味着不记录上次的补全方式。
  • g:SuperTabDefaultCompletionType的值设置缺省的补全方式,缺省为CTRL-P

你可以在vimrc中设置这两个变量,例如:

let g:SuperTabRetainCompletionType = 2
let g:SuperTabDefaultCompletionType = "<C-X><C-O>" 

现在你可以使用TAB来进行补全了,就像在shell中那样,方便了很多!

[参考文档]

<< 返回vim使用进阶: 目录

“vi/vim使用进阶: 自动补全”的24个回复

  1. 不错的一遍文章,正在学习vim,看到别人用到好牛,但自己用总是有一点跟不上的感觉,不过个人觉得还是蛮好用的。希望博主还有更好的文章有关gvim的发表。

  2. 打扰了,使用自动补全时也发现一个问题,我用的是PUTTY远程打开的文件,自动补全提示时,发现选择的那一项是灰白色,正好和显示的字体一个颜色,造成无法看到选择项是什么?请问怎么解决?这里没法贴图片,可能描述的不清楚

  3. Easwy :@karl没遇到过,能讲清楚一点吗?

    我是没有装补全的插件下做的,第一个单词没输入完,按ctrl+p补全之后,又接着输入,又碰到一个单词,再按一下ctrl+p,这时没有把这个第二个要补全的单词补全,而是把之前补全的单词也去掉了。。。

  4. (以下为CSDN评论的转帖)

    #wadewang2008 发表于2008-12-30 17:50:24 IP: 147.145.35.*
    hi Easywin and all,
    i installed a gvim 7.1 on windows.
    it can do auto-completion from the content of current edited buffer.
    but it can’t do so from other buffers. i wonder if anyone have met
    similar issues?

    do you think it’s related to my plugin “supertab”?

    i tried installed gvim 7.2 but no change. i have a friend who used
    gvim 6.3, he can do auto-content from other buffers.

    btw, i used “se complete” to check,
    it got:
    complete=.,w,b,u,t,i
    looks this option is right.

    if you need more infos, just let me know.

    great thanks!
    wade

    2008-12-30 23:01:49作者回复
    应该是和’complete’选项有关,不过你的这个选项似乎没什么问题。我没有使用supertab,不知道它会不会有影响。
    你使用空白的vimrc启动,会不会有这个问题?

  5. (以下为CSDN评论的转帖)

    #baikaishiuc 发表于2007-05-17 22:51:06 IP: 125.71.3.*
    感觉linux下的人真幸福啊,只用一份vimrc就可以了,那个shell这么好用,不像windows下的,gvimrc调用前还要在载入_vimrc,但是windows的shell(不知道能不能算),感觉实在有点ugly。今天就被这个 问题烦了一天。

    不过LZ,为什么喜欢VIM的左边栏上有滚动条,感觉好不可思议。

    #easwy 发表于2007-05-18 14:17:22 IP: 213.70.90.*
    在windows上,也可以只用_vimrc,我根本就没用gvimrc

    我的工作环境基本是用putty远程登录到linux上,使用控制台下的vim,这个gvim只是为了抓图用的,所以没怎么设置。

    #baikaishiuc 发表于2007-05-18 17:58:48 IP: 125.71.5.*
    严重谢谢那条,可以只用_vimrc。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注