LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1373|回复: 8

请教gentoo下的ctags用法(已解决)

[复制链接]
发表于 2006-4-6 22:15:35 | 显示全部楼层 |阅读模式
最近因为项目原因在读linux中关于TCP协议栈的内容,知道用vim加ctags很好用。查了很多man和howto,觉得对于ctags的交叉参考功能有点怀疑,是有其他的技巧还是ctag根本就不支持这个,它说是支持结构体定义的。比如这样的一段代码
extern void ip_mc_drop_socket(struct sock *sk);
在emacs中形式参数sock也是可以被导航到sock结构体的定义的。但是遗憾的是我基本上不会用emacs,一直用vi。而结合ctags用vi却提示说找不到sock 标签。只能找到ip_mc_drop_sockert的函数定义。如果用vi,哪个工具或者扩展可以达到我想的这种功能,最好是能达到LXR生成的linux源码交叉参看的效果。谢谢。
发表于 2006-4-7 09:29:28 | 显示全部楼层
ctags可以做到这一点
更强大的是cscope
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-8 14:18:18 | 显示全部楼层
但是在我这边使用的时候,只有函数声明和定义之间可以跳转到,但是没有声称的宏定义等的跳转,是不是需要什么特殊的设定?请问谁用这个很熟吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-8 17:21:30 | 显示全部楼层
发现gentoo下的ctags其实不是指向Exuberant  Ctags的而是ctags.emacs21的,所以改了/usr/bin里面ctags的符号链接的指向。这样运行ctags不会提示一些东西。这样才用到了Exuberant ctags。并且还有一个问题是根本不能定位结构体。生成的索引文件里面根本没有关于结构体的定义什么的,而不象它所声称的那样有。再针对这个问题google了一下,发现在vim.org上有别人有同样的问题。所以我还是准备用emacs加etags了。虽然emacs比较复杂,但是基本的编辑命令也记得快,没有关系。如果哪位有vim+ctags定位结构体的线索,请告知,谢谢。
回复 支持 反对

使用道具 举报

发表于 2006-4-8 18:52:58 | 显示全部楼层
我用的好好的
分析内核代码的时候
task_struct
EXPORT_SYMBOL
结构体,宏都没有问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-8 19:13:32 | 显示全部楼层
能否再麻烦试一下这个,在内核源码树里面,具体一点,到net/ipv4
我先在这里运行ctags -R 建立了索引文件tags,然后我用vi打开af_inet.c,见一个外部声明的函数
extern void ip_mc_drop_socket(struct sock *sk);
你把光标停到形式参数sock上面,然后Ctrl+],看看能否转到定义sock这个结构体的那一段代码,我这边说是找不到标签sock。谢谢。我说的找不到结构体的定义是这个意思。
回复 支持 反对

使用道具 举报

发表于 2006-4-8 21:05:19 | 显示全部楼层
我当然知道你说的是什么意思
不过不知道你是这样的用的

请你检查
你的tags文件放在什么地方
在vi里,底行模式
:set tags
是什么结果
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-8 21:41:29 | 显示全部楼层
谢谢,我想我知道我错在哪呢,浪费大哥的时间了,不好意思。我没有搞懂它所说的功能的意思。只是在准备读源码时准备工具时,试用了emacs和vi两个。因为在emacs和vi中得到的结果不一样。在上个贴子中emacs找到的与期望值相比是错误的。它找到的是一个结构体类型的指针。而不是它的定义。而在我需要分析的那一段代码中,关于socket的定义根本不在ipv4那一部分,我生成的tags只是针对ipv4那一个文件夹生成的,所以它当然找不到socket的定义了。不过通过这个还是解决了一个问题,发现在gentoo下,ctags这个符号链接默认是指向ctags.emacs-21,而不是exuberant-ctags,至少在我机器上是这个样子,不知道大家是怎么样的,我没有改过。如果不手动来改,那么生成ctags的时候,会有一些warning的消息出来。我把那些包含这函数原型定义的内核文件夹部分,加到里面生成tags文件,一切就都好了。
BTW 如果想用内核的Makefile文件中的make tags生成vim可用的tags文件,具体该如何操作。
我用make tags生成的文件,如果直接在vim中用,会提示文件没有被排序。我用sort tags > tags.1对生成的文件排序之后,居然还是不能用。所以我想问一下,如果想生成整个内核源码树的tags,要怎么来操作呢?谢谢。
回复 支持 反对

使用道具 举报

发表于 2006-4-8 22:50:42 | 显示全部楼层
你可以删掉那个ctags符号连接
自己建立一个指向exuberant-ctags
然后再make tags就好了

有关文件没有排序
你可以把软件的提示贴一贴么
我还没有遇到过
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表