vim+cscope 问题

Vim、Emacs配置和使用
回复
leslielg
帖子: 124
注册时间: 2008-08-30 10:52

vim+cscope 问题

#1

帖子 leslielg » 2013-09-19 23:47

用Linux kernel的make cscope生成的cscope.out,在vim中浏览代码,可以用ctrl-]跳到函数的定义,但是用:tselect时,vim显示

E433: No tags file
E426: tag not found:

而且用:tnext一个个看函数的多个定义时,跳到最后一个后再:tn也会显示这个错误

系统: Linux mint 13 64bit,vim和cscope都是用apt安装的。
vim plugin有taglist和nerdtree
leslielg
帖子: 124
注册时间: 2008-08-30 10:52

Re: vim+cscope 问题

#2

帖子 leslielg » 2013-09-20 12:26

有人解释说 :tselect :tnext :tprev都是给ctags用的,cscope不能用这几个命令。

那cscope替代这几个命令的方法是什么?
leslielg
帖子: 124
注册时间: 2008-08-30 10:52

Re: vim+cscope 问题

#3

帖子 leslielg » 2013-09-20 19:09

代码: 全选

int fb_get_options(char *name, char **option)                                                                                                        
{                                                                                                                                                   
         char *opt, *options = NULL;                                                                                                                
         int opt_len,int fb_get_options(char *name, char **option)                                                                                                        
 {                                                                                                                                                    
         char *opt, *options = NULL;                                                                                                                
        int opt_len, retval = 0;                                                                                                                    
        int name_len = strlen(name), i;                                                                                                     
                                                                                                                                                     
----》         if (name_len && ofonly && strncmp(name, "offb", 4))                                                                                          
                 retval = 1;                                        


另外发现,同时使用ctags和cscope后,在上面这个函数中(drivers/video/fbmem.c),在name_len变量上无论按ctrl-],还是:cs find s(g),都无法指向上面的int name_len定义,而是找到了整个内核的所有name_len定义,数量非常多而且从ubi文件系统的一个name_len开始作为第一个match tag。不知道是否都是这个情况么?
leslielg
帖子: 124
注册时间: 2008-08-30 10:52

Re: vim+cscope 问题

#4

帖子 leslielg » 2013-09-22 13:27

自问自答一下:原来ctags和cscope里没有包含局部变量!这个跟eclips还有source insight的功能差别很大啊

为何这些代码工具不能像个编译器一样把代码“编译”一遍?那样对每个变量都能准确的找到它的定义和调用。
头像
zhw2101024
帖子: 1849
注册时间: 2009-03-28 16:10
系统: Arch debian win7
联系:

Re: vim+cscope 问题

#5

帖子 zhw2101024 » 2013-09-22 16:53

leslielg 写了:自问自答一下:原来ctags和cscope里没有包含局部变量!这个跟eclips还有source insight的功能差别很大啊

为何这些代码工具不能像个编译器一样把代码“编译”一遍?那样对每个变量都能准确的找到它的定义和调用。
要是你愿意每编辑一次源代码文件都自动编译一次,我没话说。
也可能你只是搞搞源码规模在几十K的小项目,那可以发起一个开源项目来做vim插件。
leslielg
帖子: 124
注册时间: 2008-08-30 10:52

Re: vim+cscope 问题

#6

帖子 leslielg » 2013-09-22 19:06

zhw2101024 写了:
leslielg 写了:自问自答一下:原来ctags和cscope里没有包含局部变量!这个跟eclips还有source insight的功能差别很大啊

为何这些代码工具不能像个编译器一样把代码“编译”一遍?那样对每个变量都能准确的找到它的定义和调用。
要是你愿意每编辑一次源代码文件都自动编译一次,我没话说。
--------------每次保存源文件的时候吧,如果是自动更新的话。但是实际上ctag和cscope都不是自动更新的,需要手动更新。
另外可能你对编译不是太了解,其实编译的时候,make的规则是文件有改动的才会重新编译,所以每次更新并不会全部重新编译一次。比如kernel的make cscope,只会根据新改动的文件重新生成database,只有第一次生成的时候比较耗时,然后都很快了。而且只需要类似编译器的前端功能,生成中间代码之后的功能都不需要,这样还要快些。
也可能你只是搞搞源码规模在几十K的小项目,那可以发起一个开源项目来做vim插件。
-------------我主要用在kernel的开发上,以前用eclipse和source insight,现在想尝试下vi,如果顺手的话编辑效率应该比前两个高。
我觉得越是代码大的项目越时需要效率更高的代码查看工具,可能你是因为前面对编译行为的误解觉得代码大编译会很慢。像kernel里面有时候一个变量能找到几十个定义它的地方,但是gcc编译器肯定只用到了其中一个,我就想为何代码查看工具不能依据makefile来’编译'源代码而像gcc一样找到那个准确的定义?
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: vim+cscope 问题

#7

帖子 fanhe » 2013-09-22 23:32

leslielg 写了:
zhw2101024 写了:
leslielg 写了:自问自答一下:原来ctags和cscope里没有包含局部变量!这个跟eclips还有source insight的功能差别很大啊

为何这些代码工具不能像个编译器一样把代码“编译”一遍?那样对每个变量都能准确的找到它的定义和调用。
要是你愿意每编辑一次源代码文件都自动编译一次,我没话说。
--------------每次保存源文件的时候吧,如果是自动更新的话。但是实际上ctag和cscope都不是自动更新的,需要手动更新。
另外可能你对编译不是太了解,其实编译的时候,make的规则是文件有改动的才会重新编译,所以每次更新并不会全部重新编译一次。比如kernel的make cscope,只会根据新改动的文件重新生成database,只有第一次生成的时候比较耗时,然后都很快了。而且只需要类似编译器的前端功能,生成中间代码之后的功能都不需要,这样还要快些。
也可能你只是搞搞源码规模在几十K的小项目,那可以发起一个开源项目来做vim插件。
-------------我主要用在kernel的开发上,以前用eclipse和source insight,现在想尝试下vi,如果顺手的话编辑效率应该比前两个高。
我觉得越是代码大的项目越时需要效率更高的代码查看工具,可能你是因为前面对编译行为的误解觉得代码大编译会很慢。像kernel里面有时候一个变量能找到几十个定义它的地方,但是gcc编译器肯定只用到了其中一个,我就想为何代码查看工具不能依据makefile来’编译'源代码而像gcc一样找到那个准确的定义?
你明白编译过程就知道那样是有利有弊的
需要知道唯一定义的话,你必须告诉解析器你需要定义的宏和包含路径这类的,这样的话,每个项目都设置到令你崩溃。
其实是可以做到,但是不好用,宁愿把所有定义列出,然后人肉分辨。
leslielg
帖子: 124
注册时间: 2008-08-30 10:52

Re: vim+cscope 问题

#8

帖子 leslielg » 2013-09-23 0:03

fanhe 写了:
leslielg 写了:
zhw2101024 写了:
leslielg 写了:自问自答一下:原来ctags和cscope里没有包含局部变量!这个跟eclips还有source insight的功能差别很大啊

为何这些代码工具不能像个编译器一样把代码“编译”一遍?那样对每个变量都能准确的找到它的定义和调用。
要是你愿意每编辑一次源代码文件都自动编译一次,我没话说。
--------------每次保存源文件的时候吧,如果是自动更新的话。但是实际上ctag和cscope都不是自动更新的,需要手动更新。
另外可能你对编译不是太了解,其实编译的时候,make的规则是文件有改动的才会重新编译,所以每次更新并不会全部重新编译一次。比如kernel的make cscope,只会根据新改动的文件重新生成database,只有第一次生成的时候比较耗时,然后都很快了。而且只需要类似编译器的前端功能,生成中间代码之后的功能都不需要,这样还要快些。
也可能你只是搞搞源码规模在几十K的小项目,那可以发起一个开源项目来做vim插件。
-------------我主要用在kernel的开发上,以前用eclipse和source insight,现在想尝试下vi,如果顺手的话编辑效率应该比前两个高。
我觉得越是代码大的项目越时需要效率更高的代码查看工具,可能你是因为前面对编译行为的误解觉得代码大编译会很慢。像kernel里面有时候一个变量能找到几十个定义它的地方,但是gcc编译器肯定只用到了其中一个,我就想为何代码查看工具不能依据makefile来’编译'源代码而像gcc一样找到那个准确的定义?
你明白编译过程就知道那样是有利有弊的
需要知道唯一定义的话,你必须告诉解析器你需要定义的宏和包含路径这类的,这样的话,每个项目都设置到令你崩溃。
其实是可以做到,但是不好用,宁愿把所有定义列出,然后人肉分辨。

没有很明白你说的,不可以利用makefile,就如同一个普通编译器那样来编译一遍么?编译器词法分析语法分析后生成中间代码,而代码工具就生成符号的database,类似于把每个会被makefile编译到的文件的符号表给保存下来。要设置什么到崩溃?

可能难点在使用时符号表到源文件的对应,因为全局符号准确的定义其实在链接时才会用到。其实也可以做到,模拟链接时的地址方式?这个需要专业的做编译器的人来完成。但是现在计算机的资源是足够完成这样的代码分析了。

目前还是找不到能让cscope支持局部变量的方法,这个是个问题。
wangjun403
帖子: 433
注册时间: 2009-07-06 14:26

Re: vim+cscope 问题

#9

帖子 wangjun403 » 2013-09-25 8:39

谁能告诉我gd是干什么的
为什么vim都有的功能,还要cscope去重复实现呢
生命只不过是上帝借你一用的资本!
leslielg
帖子: 124
注册时间: 2008-08-30 10:52

Re: vim+cscope 问题

#10

帖子 leslielg » 2013-09-25 9:25

wangjun403 写了:谁能告诉我gd是干什么的
为什么vim都有的功能,还要cscope去重复实现呢
看到一个变量,是该先用gd还是先ctrl-]?
wangjun403
帖子: 433
注册时间: 2009-07-06 14:26

Re: vim+cscope 问题

#11

帖子 wangjun403 » 2013-09-26 8:55

leslielg 写了:
wangjun403 写了:谁能告诉我gd是干什么的
为什么vim都有的功能,还要cscope去重复实现呢
看到一个变量,是该先用gd还是先ctrl-]?
你要非得这么钻,那就写个函数吧gd的功能绑定到ctrl-]上去吧
生命只不过是上帝借你一用的资本!
leslielg
帖子: 124
注册时间: 2008-08-30 10:52

Re: vim+cscope 问题

#12

帖子 leslielg » 2013-09-26 13:30

wangjun403 写了:
leslielg 写了:
wangjun403 写了:谁能告诉我gd是干什么的
为什么vim都有的功能,还要cscope去重复实现呢
看到一个变量,是该先用gd还是先ctrl-]?
你要非得这么钻,那就写个函数吧gd的功能绑定到ctrl-]上去吧
看来cscope是不能支持局部变量了。你说这个办法我也想过,但是不会弄,还要依据gd的返回情况决定要不要查询cscope的数据库。

既然挑个工具,当然想把它弄的很顺手,磕磕碰碰的总是不够方便。
zfovly216
帖子: 27
注册时间: 2013-07-01 13:40
系统: windows 7

Re: vim+cscope 问题

#13

帖子 zfovly216 » 2013-12-31 17:45

ctags支持局部变量,ctags -R --c-kinds=+lp,l代表local variables。ctags --list-kinds=c可以查看ctags支持的所有C语言语法元素,其中local variables是默认关闭的。
回复