在使用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;
}
自动提示的截图如下:
肖百庆 on #
windows平台,VC自带的STL库,用ctags命令生成的tag有些文件不生成tag,比如algorithm这种没有扩展名的。有解决方法吗????
Reply
依云 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
Dante on #
哈哈,依云正解~~ ctags是可以指定文件名类型滴~
Reply
肖百庆 on #
行了,谢谢,我用了这个参数,--language-force=c++生成一样的效果,因为库下面没有任何其它杂七杂八的文件,索性所有文件就当成C++文件
Reply
QW on #
为什么我的补全只能是前半部分,比如:
assign( f + std::vector
at( f + std::vector
begin( f + std::vector
capacity( f + std::vector
clear( f + std::vector
Reply
Dante on #
tags生成的不对,或者omni的配置不对?
我的是这样的呀:
assign(_InputIterator __first, _InputIterator __last) f + std::vector
写一下你omni的配置吧
Reply
weii on #
我在使用时发现以下情况补全有问题:
vector<A> v; //A是一个类
在输入v[i]. 之后弹出的提示都是vector的成员而不是类A的,请问有什么办法吗?谢谢!
Reply
weii on #
我在使用时发现以下情况补全有问题:
vector<A> v; //A是一个类
在输入v[i]. 之后弹出的提示都是vector的成员而不是类A的,请问有什么办法吗?谢谢!
Reply
weii on #
刚刚的<a>被当成超链接了,哈哈
vector v; //X是一个类
在输入v[i]. 之后弹出的提示都是vector的成员而不是类A的,请问有什么办法吗?谢谢!
Reply
weii on #
晕
vector v; //X是一个类
在输入v[i]. 之后弹出的提示都是vector的成员而不是类A的,请问有什么办法吗?谢谢!
Reply
weii on #
vector〈A〉v; //A是一个类
Reply
Dante on #
呃,wordpress会自己转移的确比较痛苦……
我刚刚试了一下,确实会出现你说的问题,之前居然都没发现过……
这个问题我也没有啥办法……我替你留意一下吧,有什么解决方案通知你~
Reply
weii on #
回复得这么快,谢谢!
Reply
Kola on #
你的下拉列表的颜色是怎么调的,我的颜色很晃眼。
Reply
Dante on #
安装一下wombat配色吧,不错的~
Reply
Kola on #
谢谢,我试试!
Reply
zhanglistar on #
我的不行啊。
按照lz给的链接进行。无法补全。
我google了下发现是bug,解决方法不算复杂。
不知道lz怎么没有出现这个问题呢。。。。???
Reply
Dante on #
咦,不会吧?我都是一直这样用,没有问题才写出来的哦
Reply
zhanglistar on #
恩。我在本本上的f12上使用不可以。不过在实验室的ubuntu上用的就没问题,晚上我回去把tags拷过去,再试试。^_^
Reply
mces89 on #
弱弱的问下,在windows下面在哪儿输入命令来进行设置stl_tags命令?直接在cmd下面说找不到tags,放到.vimrc里面好像也不起作用。前面两个插件已经搞好了。
Reply
Dante on #
在vim的命令模式执行
:set tags+=xxx
Reply
yjjlyyj on #
请问博主
vector v;
我输入v. 不会弹出,而且要输入v.再输入ctrl+p呢,而且不仅仅是vector中的还有很多别的。
Reply
yjjlyyj on #
解决了,又是看了博主对别人的回复解决的。忘了加filetype plugin on 嘿嘿 ~`~
Reply
李立强 on #
你好,我的ctags和omnicppcomplete已经配置好可以使用了,同时我也F12做好了STLtags文件,并放在D:\Vim\vimfiles。可是我在配置文件或命令行模式下加入set tags+=D:\Vim\vimfiles\STLtags却无效,请教一下这是为什么?
Reply
Dante on #
呃,无效是说提示无效还是补全不了?
Reply
李立强 on #
-- 全能不全(^O^N^P) 找不到模式
这是最底下的提示
Reply
fanhe on #
ctags 很搓的, 作为一个parser的话. 有兴趣可以试试我写的这个项目, 修改了 ctags, 重写了 OmniCpp, 支持模板, 支持 STL, http://www.vim.org/scripts/script.php?script_id=3647 . 我重写的 OmniCpp 可以作为独立组件的, 不过我暂时没分离出来.
Reply
fanhe on #
忘了说, 现在只有 linux 平台可以用
Reply
李立强 on #
当我下下来看了看之后,发现这一点了。。。我还是学生,目前还没用Linux
Reply
fanhe on #
如果是计算机专业的学生就应该学学linux, 对就业和学习都有帮助, 研究研究开源的代码之类的.
Reply
李立强 on #
我也一直想学…但是要下下个学期大三下才学…放假前才在图书馆和网上找了点资料…准备放假看看
Reply
kuun on #
请问生成的tags有个相对目录的问题怎么解决?例如我的visual studio装在了D:\Promgram files\下,生成的tags中某个tag在.\include\afxext.h中,我把生成的tags考到 c:\下,这时查找该tag的时候会提示找不到C:\include\afxext.h,在这里当然不可能找到该文件,文件在D:\下,请问怎么解决这个问题?能不能生成绝对路径的tags?
Reply
Dante on #
貌似确实只能生成相对路径,不过也是很多方法解决。比如在tags路径不动,vim中用
set tags=/xxx/tags
Reply
kuun on #
这个我也是这样想的,不过我把生成的tags放在原始目录下,在vimrc中设置set tags+=D:\Program files\Microsoft Visual Studio 8\VC\atlmfc\tags,但目录中不能有空格,我又在所有有空格的地方加了"\"进行转意,可是vim还是读不到这个tags.不知道我这样写对不对.?
Reply
Dante on #
应该没问题吧,不过我在windows下都尽量避免目录有空格和中文。免得出诡异的错误。。
Reply
madper on #
我怎么觉得, \本身需要转义, 就是\\. 别的地方都需要, 不知道vim需要不~ 可以试试看~
Reply
lworld on #
为什么Stl库支持不完整,,,比如,输入vector::时,omnicppcomplete无法实现补全iterator等域成员,本人菜鸟一个,望博主指点,,,不胜感激,,,,
Reply
Dante on #
这和ctags的实现有关系的,有些确实补全不了。
Reply
lworld on #
谢谢博主的答复,,,,
从这里学到不少东西,,,
Reply
松暮囧 on #
可以不按ctrl+N补全吗,比如我写出了vec,就会自动显示vector
Reply
Dante on #
可以的,好像叫 NeoComplete
不过可能有时会卡
Reply
Neil on #
您好,博主。请问一下能够在使用一个库的tags的同时还使用当前工程下的tags吗?具体怎么做呢?我的做法是set tags+=$path 这里的path是我那个库的tags。然后再在当前目录下生成tags。但是我这样做却不行,这是为什么呢?
Reply
AcFast on #
hi,我想请教两个问题:
1、关于superTab有一个let g:SuperTabRetainCompletionType=1,这个1的时候是记住上一次补全方式,直至换另外一种补全方式为止。但是我这样设置,我用补全之后,再用tab,它的补全方式确是,不知道这个怎么解决呢?
2、关于omnicppcomplate,补全的时候会有一个preview的窗口显示函数的信息,这个可以关掉。但是关掉之后,在补全的时候只补全函数,这样我就不知道这个函数的参数是什么了,这个问题不知道怎么解决呢?
谢谢:-)
Reply
Dante on #
supertab一直没用哈,因为和他冲突的插件太多了。。
omnicppcomplate有个参数可以配置显示详细参数,但是我记不清了。。你看一下文档。。
Reply
AcFast on #
多谢指教啊,原来是OmniCpp_ShowPrototypeInAbbr,我刚开始看文档的时候把这个的含义理解错了。。
Reply
青花 on #
后面的那张图,vim自动补全stl库的图看不见啊
Reply
逍遥小章 on #
你好我的出现Unknown option: ~/.vim/stl/tags这样的错误,不能自动补全STL,这是咋了?我明明已经在stl文件里面生产了tags了呀
Reply