最后更新于 .

在使用C++时,我们经常会使用到STL,相信很多人都想过,如果vim能实现stl库自动补全就好啦,这篇文章,我们就来实现这一点。 (文中所有操作均在windows下进行,在linux也一样可以实现,笔者就不写了)

1.请确保安装好了ctags,和omnicppcomplete;如果你还没有安装好,请参考这两篇文章:把VIM打造成一个真正的IDE(2)把VIM打造成一个真正的IDE(3)

2.下载STL库的头文件和实现。下载路径如下: http://www.vim.org/scripts/script.php?script_id=2358

OK,现在工具已经准备齐了,接下来就是生成tags啦。 去刚下载的STL目录,用ctags命令生成tags文件,命令如下:

ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .

(如果你看了我之前的文章,那么直接用F12生成就行)

有了tags之后,你可以把这个tags换个名字,比如叫stl_tags,然后放到C盘,通过命令

set tags+= c:\stl_tags

就可以将这个tags文件加入到vim的tags搜索表中。

好啦,那么我们现在来测试一下: 新建一个cpp文件,代码如下:

#include <iostream> 
#include <string> 
#include <vector> 
#include <map> 
using namespace std; 
int main(int argc,char* argv[]) 
{  
    vector<int> vec;  
    vec.  
    return 0; 
}

自动提示的截图如下: 版权所有,转载请注明出处.http://www.vimer.cn

Pingbacks

  1. Vim使用笔记-编程相关插件 &#124; sosowo&#039;s blog on #

    [...] 比如对STL的支持,可以参见:让Vim(gvim)支持C++STL库的自动补全。 [...]

  2. vim配置攻略-打造自己的IDE | Cherrot on #

    [...] 让Vim(gvim)支持C++STL库的自动补全 [...]

Pingbacks已打开。

Trackbacks

引用地址

评论

  1. 肖百庆

    肖百庆 on #

    windows平台,VC自带的STL库,用ctags命令生成的tag有些文件不生成tag,比如algorithm这种没有扩展名的。有解决方法吗????

    Reply

    1. 依云

      依云 on #

      @ 肖百庆 看看 ctags 的 man 文档就知道了,可以用 -h 选项:Specifies a list of
      file extensions, separated by periods, which are to be interpreted as include
      (or header) files. To indicate files having no extension, use a period not
      followed by a non-period character (e.g. ".", "..x", ".x.").

      也可以用 -L file 选项指定列表文件(可以用 find 生成)。

      Reply

      1. Dante

        Dante on #

        哈哈,依云正解~~ ctags是可以指定文件名类型滴~

        Reply

      2. 肖百庆

        肖百庆 on #

        行了,谢谢,我用了这个参数,--language-force=c++生成一样的效果,因为库下面没有任何其它杂七杂八的文件,索性所有文件就当成C++文件

        Reply

  2. QW

    QW on #

    为什么我的补全只能是前半部分,比如:
    assign( f + std::vector
    at( f + std::vector
    begin( f + std::vector
    capacity( f + std::vector
    clear( f + std::vector

    Reply

    1. Dante

      Dante on #

      tags生成的不对,或者omni的配置不对?
      我的是这样的呀:
      assign(_InputIterator __first, _InputIterator __last) f + std::vector

      写一下你omni的配置吧

      Reply

  3. weii

    weii on #

    我在使用时发现以下情况补全有问题:
    vector<A> v; //A是一个类
    在输入v[i]. 之后弹出的提示都是vector的成员而不是类A的,请问有什么办法吗?谢谢!

    Reply

    1. weii

      weii on #

      我在使用时发现以下情况补全有问题:

      vector<A> v; //A是一个类
      在输入v[i]. 之后弹出的提示都是vector的成员而不是类A的,请问有什么办法吗?谢谢!

      Reply

      1. weii

        weii on #

        刚刚的<a>被当成超链接了,哈哈
        vector v; //X是一个类
        在输入v[i]. 之后弹出的提示都是vector的成员而不是类A的,请问有什么办法吗?谢谢!

        Reply

        1. weii

          weii on #


          vector v; //X是一个类
          在输入v[i]. 之后弹出的提示都是vector的成员而不是类A的,请问有什么办法吗?谢谢!

          Reply

          1. weii

            weii on #

            vector〈A〉v; //A是一个类

            Reply

            1. Dante

              Dante on #

              呃,wordpress会自己转移的确比较痛苦……

              我刚刚试了一下,确实会出现你说的问题,之前居然都没发现过……
              这个问题我也没有啥办法……我替你留意一下吧,有什么解决方案通知你~

              Reply

              1. weii

                weii on #

                回复得这么快,谢谢!

                Reply

  4. Kola

    Kola on #

    你的下拉列表的颜色是怎么调的,我的颜色很晃眼。

    Reply

    1. Dante

      Dante on #

      安装一下wombat配色吧,不错的~

      Reply

      1. Kola

        Kola on #

        谢谢,我试试!

        Reply

  5. zhanglistar

    zhanglistar on #

    我的不行啊。
    按照lz给的链接进行。无法补全。

    我google了下发现是bug,解决方法不算复杂。

    不知道lz怎么没有出现这个问题呢。。。。???

    Reply

    1. Dante

      Dante on #

      咦,不会吧?我都是一直这样用,没有问题才写出来的哦

      Reply

      1. zhanglistar

        zhanglistar on #

        恩。我在本本上的f12上使用不可以。不过在实验室的ubuntu上用的就没问题,晚上我回去把tags拷过去,再试试。^_^

        Reply

  6. mces89

    mces89 on #

    弱弱的问下,在windows下面在哪儿输入命令来进行设置stl_tags命令?直接在cmd下面说找不到tags,放到.vimrc里面好像也不起作用。前面两个插件已经搞好了。

    Reply

    1. Dante

      Dante on #

      在vim的命令模式执行
      :set tags+=xxx

      Reply

  7. yjjlyyj

    yjjlyyj on #

    请问博主
    vector v;
    我输入v. 不会弹出,而且要输入v.再输入ctrl+p呢,而且不仅仅是vector中的还有很多别的。

    Reply

    1. yjjlyyj

      yjjlyyj on #

      解决了,又是看了博主对别人的回复解决的。忘了加filetype plugin on 嘿嘿 ~`~

      Reply

  8. 李立强

    李立强 on #

    你好,我的ctags和omnicppcomplete已经配置好可以使用了,同时我也F12做好了STLtags文件,并放在D:\Vim\vimfiles。可是我在配置文件或命令行模式下加入set tags+=D:\Vim\vimfiles\STLtags却无效,请教一下这是为什么?

    Reply

    1. Dante

      Dante on #

      呃,无效是说提示无效还是补全不了?

      Reply

      1. 李立强

        李立强 on #

        -- 全能不全(^O^N^P) 找不到模式
        这是最底下的提示

        Reply

        1. fanhe

          fanhe on #

          ctags 很搓的, 作为一个parser的话. 有兴趣可以试试我写的这个项目, 修改了 ctags, 重写了 OmniCpp, 支持模板, 支持 STL, http://www.vim.org/scripts/script.php?script_id=3647 . 我重写的 OmniCpp 可以作为独立组件的, 不过我暂时没分离出来.

          Reply

          1. fanhe

            fanhe on #

            忘了说, 现在只有 linux 平台可以用

            Reply

            1. 李立强

              李立强 on #

              当我下下来看了看之后,发现这一点了。。。我还是学生,目前还没用Linux

              Reply

              1. fanhe

                fanhe on #

                如果是计算机专业的学生就应该学学linux, 对就业和学习都有帮助, 研究研究开源的代码之类的.

                Reply

                1. 李立强

                  李立强 on #

                  我也一直想学…但是要下下个学期大三下才学…放假前才在图书馆和网上找了点资料…准备放假看看

                  Reply

  9. kuun

    kuun on #

    请问生成的tags有个相对目录的问题怎么解决?例如我的visual studio装在了D:\Promgram files\下,生成的tags中某个tag在.\include\afxext.h中,我把生成的tags考到 c:\下,这时查找该tag的时候会提示找不到C:\include\afxext.h,在这里当然不可能找到该文件,文件在D:\下,请问怎么解决这个问题?能不能生成绝对路径的tags?

    Reply

    1. Dante

      Dante on #

      貌似确实只能生成相对路径,不过也是很多方法解决。比如在tags路径不动,vim中用
      set tags=/xxx/tags

      Reply

      1. kuun

        kuun on #

        这个我也是这样想的,不过我把生成的tags放在原始目录下,在vimrc中设置set tags+=D:\Program files\Microsoft Visual Studio 8\VC\atlmfc\tags,但目录中不能有空格,我又在所有有空格的地方加了"\"进行转意,可是vim还是读不到这个tags.不知道我这样写对不对.?

        Reply

        1. Dante

          Dante on #

          应该没问题吧,不过我在windows下都尽量避免目录有空格和中文。免得出诡异的错误。。

          Reply

        2. madper

          madper on #

          我怎么觉得, \本身需要转义, 就是\\. 别的地方都需要, 不知道vim需要不~ 可以试试看~

          Reply

  10. lworld

    lworld on #

    为什么Stl库支持不完整,,,比如,输入vector::时,omnicppcomplete无法实现补全iterator等域成员,本人菜鸟一个,望博主指点,,,不胜感激,,,,

    Reply

    1. Dante

      Dante on #

      这和ctags的实现有关系的,有些确实补全不了。

      Reply

  11. lworld

    lworld on #

    谢谢博主的答复,,,,
    从这里学到不少东西,,,

    Reply

  12. 松暮囧

    松暮囧 on #

    可以不按ctrl+N补全吗,比如我写出了vec,就会自动显示vector

    Reply

    1. Dante

      Dante on #

      可以的,好像叫 NeoComplete
      不过可能有时会卡

      Reply

  13. Neil

    Neil on #

    您好,博主。请问一下能够在使用一个库的tags的同时还使用当前工程下的tags吗?具体怎么做呢?我的做法是set tags+=$path 这里的path是我那个库的tags。然后再在当前目录下生成tags。但是我这样做却不行,这是为什么呢?

    Reply

  14. AcFast

    AcFast on #

    hi,我想请教两个问题:
    1、关于superTab有一个let g:SuperTabRetainCompletionType=1,这个1的时候是记住上一次补全方式,直至换另外一种补全方式为止。但是我这样设置,我用补全之后,再用tab,它的补全方式确是,不知道这个怎么解决呢?
    2、关于omnicppcomplate,补全的时候会有一个preview的窗口显示函数的信息,这个可以关掉。但是关掉之后,在补全的时候只补全函数,这样我就不知道这个函数的参数是什么了,这个问题不知道怎么解决呢?
    谢谢:-)

    Reply

    1. Dante

      Dante on #

      supertab一直没用哈,因为和他冲突的插件太多了。。

      omnicppcomplate有个参数可以配置显示详细参数,但是我记不清了。。你看一下文档。。

      Reply

      1. AcFast

        AcFast on #

        多谢指教啊,原来是OmniCpp_ShowPrototypeInAbbr,我刚开始看文档的时候把这个的含义理解错了。。

        Reply

  15. 青花

    青花 on #

    后面的那张图,vim自动补全stl库的图看不见啊

    Reply

  16. 逍遥小章

    逍遥小章 on #

    你好我的出现Unknown option: ~/.vim/stl/tags这样的错误,不能自动补全STL,这是咋了?我明明已经在stl文件里面生产了tags了呀

    Reply

发表评论