在使用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文件,代码如下:

/*==================================================
#  Author:          DanteZhu – http://www.vimer.cn
#  Email:           dantezhu@vip.qq.com
#  FileName:        test.cpp
#  Version:         1.0
#  LastChange:      2010-01-19 13:45:38
#  Description:     
#  History:         
====================================================*/

#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

STL可能的误用-find_first_of和erase

一.string中find_first_of的误用 STL中提供的string可以说极大方便了对字符串的操作,但是很多函数由于样子上很相似,所以导致很容易理解错误,find_first_of...

阅读全文

关于哈希map奇慢无比的原因定位

最近有一个server在重启的时候总要花费5分钟左右来加载配置文件,导致外网服务不可用,今天和几个同事一起研究了一下,总算找到了问题所在. 抽象出代码如下: ...

阅读全文

在C++中实现foreach循环,比for_each更简洁!

python,c#,java里面都有类似于foreach的结构,stl里面虽然有for_each这个函数,但是感觉使用还是太繁琐了一些,所以就自己实现了一个。 先来看看stl里面的for...

阅读全文

49则回应给“让Vim(gvim)支持C++STL库的自动补全”

  1. 肖百庆说道:

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

    [回复]

    依云 回复:

    @ 肖百庆 看看 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 生成)。

    [回复]

    Dante 回复:

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

    [回复]

    肖百庆 回复:

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

    [回复]

  2. QW说道:

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

    [回复]

    Dante 回复:

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

    写一下你omni的配置吧

    [回复]

  3. weii说道:

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

    [回复]

    weii 回复:

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

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

    [回复]

    weii 回复:

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

    [回复]

    weii 回复:


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

    [回复]

    weii 回复:

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

    [回复]

    Dante 回复:

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

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

    [回复]

    weii 回复:

    回复得这么快,谢谢!

    [回复]

  4. Kola说道:

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

    [回复]

    Dante 回复:

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

    [回复]

    Kola 回复:

    谢谢,我试试!

    [回复]

  5. zhanglistar说道:

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

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

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

    [回复]

    Dante 回复:

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

    [回复]

    zhanglistar 回复:

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

    [回复]

  6. mces89说道:

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

    [回复]

    Dante 回复:

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

    [回复]

  7. yjjlyyj说道:

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

    [回复]

    yjjlyyj 回复:

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

    [回复]

  8. 李立强说道:

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

    [回复]

    Dante 回复:

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

    [回复]

    李立强 回复:

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

    [回复]

    fanhe 回复:

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

    [回复]

    fanhe 回复:

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

    [回复]

    李立强 回复:

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

    [回复]

    fanhe 回复:

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

    [回复]

    李立强 回复:

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

    [回复]

  9. kuun说道:

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

    [回复]

    Dante 回复:

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

    [回复]

    kuun 回复:

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

    [回复]

    Dante 回复:

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

    [回复]

    madper 回复:

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

    [回复]

  10. lworld说道:

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

    [回复]

    Dante 回复:

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

    [回复]

  11. lworld说道:

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

    [回复]

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

  13. 松暮囧说道:

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

    [回复]

    Dante 回复:

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

    [回复]

  14. Neil说道:

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

    [回复]

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

  16. AcFast说道:

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

    [回复]

    Dante 回复:

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

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

    [回复]

    AcFast 回复:

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

    [回复]

  17. 青花说道:

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

    [回复]

  18. 逍遥小章说道:

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

    [回复]

发表评论