vim 的自动补全问题用 vim 写 gtk 的程序时,头文件为 #include
, 按下 control + n 发现没有补全功能,打开 gtk.h 发现里面全是 #include < >
我想问下,vim 里面有没有哪个开关可以打开 vim 在头文件里递归的找下去,找能匹配函数或类型?
或者,大家开发 gtk+ 程序时用的是哪个软件,一字一字敲上去的效率未免有点低吧,也很容易有错rain_fish 发表于 2011-01-07 15:06
插件没有安装吧bsdc 发表于 2011-01-07 15:13
建议用xptemplate,至于要能gtk/gtk.h也要补全估计就悬了,即使有也很慢。zghover 发表于 2011-01-07 17:12
ctl+poxangen 发表于 2011-01-08 09:36
ctl+p 跟 ctl+n 不是一样的么,我没用出来有什么不同oxangen 发表于 2011-01-08 09:44
[b]回复 [url=]2#[/url] [i]rain_fish[/i] [/b]
有哪个插件可以用呢?oxangen 发表于 2011-01-08 09:52
搞定了
1.首先进入/usr/include/gtk-2.0/gtk目录,下面有很多头文件,在此目录下生成一个tags文件供使用。
2.执行ctags -R
3.将生成的tags文件copy到工作目录,即写程序的地方。
4.再执行ctags -a //将写的程序的函数appended 到此文件上,这步不要也行。
OK,大功告成。这下写程序时,即可ctrl-N/P来自动补全gtk的API了
感叹下,gtk 的 API 实在是太多了
bsdc 发表于 2011-01-08 22:05
:dizzy:楼主原来是要api补全,何其容易,还以为你想补齐头文件名
我一般都是在一个固定目录生成一个/usr/include地tags, cscope.out,然后让vi载入,200多M,不影响速度。oxangen 发表于 2011-01-09 18:51
[b]回复 [url=]8#[/url] [i]bsdc[/i] [/b]
怎么个具体步骤?oxangen 发表于 2011-01-09 19:37
我在 /usr/include 里运行 ctags -R ,生成了个 50M 的 tags 文件,在 ~/.vimrc 里加入
set tags=/usr/include/ctags
然后我开了个 vim ,试着写了段 C 代码,有两个问题
1, ctrl+n 后有匹配,但不显示这个匹配的函数来自哪个头文件的,是不是上面运行 ctags 还要加上哪个参数?
2, 在函数 pthread_create 上 ctrl+] 出现如下,奇怪,怎么没有一个是出自 /usr/include/pthread.h 的?[code] # pri kind tag file
1 F d pthread_create /usr/include/GL/vms_x_fix.h
1016
2 F v pthread_create /usr/include/c++/3.4.6/i386-redhat-linux/bits/gthr-default.h
__gthrw(pthread_create);
3 F d pthread_create /usr/include/c++/3.4.6/i386-redhat-linux/bits/gthr-default.h
116
4 F v pthread_create /usr/include/c++/3.4.6/i386-redhat-linux/bits/gthr-posix.h
__gthrw(pthread_create);
5 F d pthread_create /usr/include/c++/3.4.6/i386-redhat-linux/bits/gthr-posix.h
116
Choice number ( cancels):[/code]bsdc 发表于 2011-01-10 14:35
[i=s] 本帖最后由 bsdc 于 2011-01-18 22:30 编辑 [/i]
:em03:你算是问对人了,我把我的脚本共享出来
脚本更新下[code]
#!/bin/bash
#tags cscope生成文件路径
sysTagsDir=~/program/dev/include
tmpfilename="/tmp/asdfvisctagstmpfilename123.filesT%$"
rm -f $tmpfilename
if [ $# -ne 1 ]; then
echo "please specify a dir: sys or ."
exit 1
fi
if [ "$1" = "." ]; then
#只对当前目录下递归
rm -f cscope.*
rm -f tags
find . -type f \
-a \( -name "*.h" -o -name "*.cpp" -o -name "*.c" -o -name "*.cc" -o -name "*.java" -o -name "*.pc" \) > $tmpfilename
elif [ "$1" = "sys" ]; then
scanPath=(
"sys"
"bits"
"asm"
"asm-generic"
"netinet"
"arpa"
#"glib-1.2"
#"gtk-1.2"
"glib-2.0"
"gtk-2.0"
"c++/4.4.5"
#"boost"
#"glibmm-2.4"
#"gdkmm-2.4"
#"gtkmm-2.4"
#"opencv"
#"opencv2"
#"openssl"
#"xorg"
#"AL"
#"GL"
#"SDL"
#"libxml2"
)
# get file list to be operating
for dir in ${scanPath[*]}; do
scanDir=$scanDir" /usr/include/"$dir
done
cd $sysTagsDir
rm -f cscope.*
rm -f tags
find /usr/include /usr/local/include -maxdepth 1 -type f \
-a \( -name "*.h" -o -name "*.cpp" -o -name "*.c" -o -name "*.cc" -o -name "*.java" -o -name "*.pc" \) > $tmpfilename
find $scanDir -type f \
-a \( -name "*.h" -o -name "*.cpp" -o -name "*.c" -o -name
"*.cc" -o -name "*.java" -o -name "*.pc" \) >> $tmpfilename
fi
#ctags -L $tmpfilename
#ctags --c++-kinds=+p -L $tmpfilename
ctags -I "__THROW __nonnull __attribute_pure__ __attribute__ G_GNUC_PRINTF+" \
--c++-kinds=+px --c-kinds=+px --fields=+iaS -Ra -f tags --extra=+fq --langmap=c:.c.h.pc.ec -L $tmpfilename
#-k means kernel mode: don't parse /usr/include
#-q: large project use this
#cscope -Rqkb -i $tmpfilename
cscope -Rb -i $tmpfilename
rm -f $tmpfilename
echo "Done!"
[/code]只要执行./cvi /usr/include,就在当前目录生成/usr/include下所有c, cpp,java的tags, cscope.out文件
对于你那个pthread_create的问题,让ctags忽略一些,比如__THROW复杂宏,不然它就放弃了。
修改了下,可有选择生成tagsoxangen 发表于 2011-01-18 15:37
Cool, Thanks
回到家,很久没上网了qishking 发表于 2011-01-18 17:14
没看懂johntsu 发表于 2011-01-30 15:07
:mrgreen:
====
阅读(658) | 评论(0) | 转发(0) |