Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1320035
  • 博文数量: 482
  • 博客积分: 13297
  • 博客等级: 上将
  • 技术积分: 2890
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-12 16:25
文章分类

全部博文(482)

文章存档

2012年(9)

2011年(407)

2010年(66)

分类: LINUX

2011-08-30 16:51:37

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+p

oxangen 发表于 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复杂宏,不然它就放弃了。

修改了下,可有选择生成tags

oxangen 发表于 2011-01-18 15:37

Cool, Thanks
回到家,很久没上网了

qishking 发表于 2011-01-18 17:14

没看懂

johntsu 发表于 2011-01-30 15:07

:mrgreen:
====

阅读(658) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~