驭风万里无垠

VIM下实现对C++ STL的IntelliSense

以前尝试过在vim下配置STL的Intellisense曾经没有成功;最近有空刚好仔细看了下vim的一些相对高级的manual,

总算将OmniCppComplete主页上的效果给弄了出来(这里)。

根据其help提示一步一步来(装完了omnicppcomplete之后,可以:help omnicppcomplete):

  • 首先需要有ctags,并且必须是Exuberant ctags,我的Ubuntu上已经是最新版了:

  • skyscribe@skyscribe:~/study/vim/pics$ ctags --version
    
    Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
    
      Compiled: Aug  6 2009, 17:06:22
    
      Addresses: <dhiebert@users.sourceforge.net>, http://ctags.sourceforge.net
    
      Optional compiled features: +wildcards, +regex
    
  • 在 ~/.vimrc 里边加入autoload taglist功能,为了方便自动更新当前tags,设置一个快捷键(这里):

map <C-F12> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR>
source ~/.vim/my.vim

 

这里的自动加载已有vim的功能,就用一个vim脚步来实现 (参考 vim :help glob给的例子):

cat ~/.vim/my.vim 
let tagfiles = glob("`find ~/.vim/tagfiles -name tags -print`")
let &tags = substitute(tagfiles, "\n", ",", "g")

 

以后需要新的taglist,只需要放在~/.vim/tagfiles目录下就好了。

vim启动的时候,会自动执行~/.vimrc,从而调用my.vim,将事先准备好的taglist更新进去;这里一般放一些不太变化的静态头文件tag就可以了。

  • 要有STL的intelliSense,自然要有STL C++的tags database了,这里需要生成之。

根据上一步的惯例,需要生成一个tags文件,放在~/.vim/tagfiles/的某个子目录下:

mkdir -p ~/.vim/tagfiles/gcc<ver>/
ls –l /usr/include/c++/

 

这里需要将ver换成当前系统的libstdc++版本,Ubuntu 9.10上的是4.4.1.

  • 用上边的命令生成对应的tags文件:

ctags -R --c++-kinds=+p --fields=+iaS --extra=+q . -o ~/.vim/tagfiles/gcc4.4/tags /usr/include/c++/4.4

写一个简单的c++程序,在Insert Mode下,Ctrl+X, Ctrl+P,发现并不能工作,什么提示也没有;初步怀疑是对应的tag文件不对。

幸好早有人尝试过了,给出了一种办法(还是这里),可惜他的方法我试了不行,不过已经可以借用他的思路了:

    • 将/usr/include/c++/4.4.1/的内容全部拷贝到一个目录下:
    • mkdir gcc4.4
      cp -R /usr/include/c++/4.4 ./
    • 写一个脚步替换所有的NAMESPACE宏定义(这里用sed完成宏替换,为了避免过于晦涩,还是放在一个临时的脚步文件里边来,便于调试吧):
cat generate_sed.sh 
#!/bin/bash
if [ $# -eq 0 ];then
    dir=.
else
    dir=$1
fi
#Substitute scripts
cat > .edit.sed <<- EOF
s/\b_GLIBCXX_BEGIN_NAMESPACE\b\s*\(\s*(\w+)\s*\)/namespace \1{/g
s/_GLIBCXX_BEGIN_NESTED_NAMESPACE\s*\(\s*std\s*,\s*_GLIBCXX_STD_[DP]\s*\)/namespace std{/g
s/\b_GLIBCXX_END_NAMESPACE\b/}/g
s/\b_GLIBCXX_END_(NESTED_\?NAMESPACE\b/}/g
EOF
count=0
cols=`tput cols`
cols=`echo "$cols - 8"|bc`
for file in `find $dir -type f`;do
    if [ "T"$file != "T"$0 ];then
        sed -nf ".edit.sed" $file
        count=`echo "$count+1"|bc`
        echo -ne "="
        if [ `echo "$count%$cols"|bc` -eq 0 ];then
            echo " $count"
        fi
    fi
done
echo "Processed $count files!"
rm -fr .edit.sed
# Generate ctag file
ctags -R --c++-kinds=+p --fields=+iaS --extra=+q 
echo "generated tag file!"
    • 再生成tag:
skyscribe@skyscribe:~/libstdc++/gcc4.4$ ./generate_sed.sh . 
==================================================================================================== 100
==================================================================================================== 200
==================================================================================================== 300
==================================================================================================== 400
==================================================================================================== 500
==================================================================================================== 600
===============================================================Processed 663 files!
generated tag file!
ls tags -lh

-rw-r--r-- 1 skyscribe skyscribe 4.2M 2010-01-10 18:21 tags

cp tags ~/.vim/tagfiles/gcc4.4/

 

  • 到这里效果终于出来了:

上边的review窗口显示当前调用的函数信息,输入./->/:: 的时候会自动提示,也可以用CTRL+X CTRL+O 来调出提示窗口,方向键则可以选择。

omni_comp

vec_insert

vec_insert_sel

 

 

 
 
 
 
 

posted on 2010-01-10 18:28 skyscribe 阅读(1887) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2019年7月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

导航

统计

常用链接

留言簿(3)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜