以前嘗試過在vim下配置STL的Intellisense曾經(jīng)沒有成功;最近有空剛好仔細看了下vim的一些相對高級的manual,
總算將OmniCppComplete主頁上的效果給弄了出來(這里)。
根據(jù)其help提示一步一步來(裝完了omnicppcomplete之后,可以:help omnicppcomplete):
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腳步來實現(xiàn) (參考 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啟動的時候,會自動執(zhí)行~/.vimrc,從而調(diào)用my.vim,將事先準備好的taglist更新進去;這里一般放一些不太變化的靜態(tài)頭文件tag就可以了。
-
要有STL的intelliSense,自然要有STL C++的tags database了,這里需要生成之。
根據(jù)上一步的慣例,需要生成一個tags文件,放在~/.vim/tagfiles/的某個子目錄下:
mkdir -p ~/.vim/tagfiles/gcc<ver>/
ls –l /usr/include/c++/
這里需要將ver換成當前系統(tǒng)的libstdc++版本,Ubuntu 9.10上的是4.4.1.
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,發(fā)現(xiàn)并不能工作,什么提示也沒有;初步懷疑是對應的tag文件不對。
幸好早有人嘗試過了,給出了一種辦法(還是這里),可惜他的方法我試了不行,不過已經(jīng)可以借用他的思路了:
- 將/usr/include/c++/4.4.1/的內(nèi)容全部拷貝到一個目錄下:
mkdir gcc4.4
cp -R /usr/include/c++/4.4 ./
寫一個腳步替換所有的NAMESPACE宏定義(這里用sed完成宏替換,為了避免過于晦澀,還是放在一個臨時的腳步文件里邊來,便于調(diào)試吧):
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!"
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窗口顯示當前調(diào)用的函數(shù)信息,輸入./->/:: 的時候會自動提示,也可以用CTRL+X CTRL+O 來調(diào)出提示窗口,方向鍵則可以選擇。