使用Vim+Ctags+Cscope阅读源代码

228 views
Skip to first unread message

Jianjun Kong

unread,
Nov 15, 2008, 2:05:07 AM11/15/08
to Xiyou-Linux-Group, zeuux...@zeuux.org, 西电Linux

最近有好几个人问我使用什么阅读源代码,网上查了一下,关于Vim+Ctags+Cscope阅读源码的资料很多,但有些讲得太简略,于是自己整理了一下。
欢迎任何改进反馈 ;)
-------------------

使用Vim+Ctags+Cscope阅读源代码

--孔建军(Kongove.CN)
2008.11.15

代码阅读工具简介

对于学习Linux内核的人来说,源代码的阅读尤为重要。因为所有设计思想、内部机制都是
以代码的形式实现,所有的资料也都是为了更好的诠释代码。那么一个好的阅读工具,能
够提高阅读的效率和效果。常见的代码阅读工具有,Source Navigator、Source Insight
、lxr、Cscope等。

• "Source Navigator"是红帽子公司的,以GNU GPL发布,可从官方网站[1]下载使用。
• "Source Insight"目前只有Windows平台的,官方网站[2]。需要注册才能使用,或者
从网上下载注册机生成注册码。在Linux下通过wine模拟虽然可以方便使用,但它毕竟
是Windows平台的东西,并不能很自由的使用。
• lxr(linux cross reference)[3]为程序源代码建立索引数据库,利用perl脚本CGI动态
生成包含源码的web页面,你可以用任何一种浏览器查阅。缺点是需要服务器支持,还
有速度。
• "Cscope"[4]为终端下的代码阅读工具,资源消耗少,对那些忠于命令行的行操作的人
,使用起来更加方便、灵活。这也是这篇文章推荐使用的一个重要原因。也有人把
Cscope和Emasc绑定阅读源码。当然工具的选取,也取决于个人习惯。

Vim+Ctags+Cscope

cscope的工作需要vim、ctags的配合,它们都是基于命令行的。在Ubuntu下,用户只需执
行“sudo apt-get install cscope cscope-indexer ctags vim-full”即可完成软件安装。
下面只是给出了三种工具的常用方法,更多功能可查看man手册,或者官方文档。

Vim

vim被看作是专门为程序员打造的文本编辑器,其丰富的编辑命令都是常用的简单字符,用
户很容易上手。vim可对180多种语言的语法高亮,对C语言自动缩进,真则表达式字符匹配
查找,功能强大,并支持多个操作系统平台。关于vim的使用,这里不做讲解。vim中文文
档[5]。
在Ubuntu下默认安装的vim,没有语法加亮功能。所以需要安装vim-full,并在vim 配置
文件 ~/.vimrc中添加一行 "syntax on" 这样在vim中打开的源码就有了语法高亮显示。
vim自带了很多颜色主题,可以直接选取下面一行添加到vim配置文件当中,重新打开vim即
可生效。

colorscheme elflord "我使用这个
colorscheme darkblue
colorscheme evening
colorscheme murphy
colorscheme torte
colorscheme desert

Ctags

在源代码根目录下执行 ctags -r 命令用来为程序源代码生成标签文件,其-r选项表示递
归操作,同时为子目录也生成标签文件。vim利用生成的标签文件,可以进行相应检索、并
在不同的文件C语言元素之间来回切换。

在vim中ctags的简单使用
1) 跳转到指定的函数进入vim后,用 “:tag func_name“ 跳到函数func_name处。使用tag
命令时,可以使用TAB键进行匹配查找,继续按TAB键向下切换。
某个函数有多个定义时

:tag
跳到第一个定义处,优先跳转到当前文件
:tnext
跳到第一个
:tfirst
跳到前count个
:[count]tprevious
跳到后count个
:[count]tnext
跳到最后一个
:tlast
你也可以在所有tagname中选择:
:tselect tagname

如果想跳到包含block的标识符:“tag /block” 然后用TAB键来选择。这里'/'就是告诉vim
'block'是一个语句块标签。
2)用“CTRL + ]“快捷键,跳转到光标所在函数标识符的定义处。
3)使用“CTRL + T”退回上层。如果想在以write_开头的标识符中选择一下, :tselect /^
write_ 这里,'^'表示开头,同理,'$'表示末尾。多个同名的标识符

Cscope

运行cscope命令,出现两个面板,上方是一个查找结果的显示面板,下方是一个查找条件
指定面板。使用TAB键在两个面板间切换,也可使用上下左右方向件和翻页键在同一面板内
贴换位置。选中显示面板的某个项,回车即可进入该文件,这是调用vim打开文件,这时就
可以结合ctags使用了。当然也可以直接使用vim打开文件,结合ctags阅读源码。
使用前,必须现使用“cscope-indexer -r”命令递归生成索引信息文件。特殊情况下,还需
要用户使用find命令,主动生成索引信息文件,并指定给cscope工具。 cscope提供了如下
九种查询方式:

Find this C symbol:
#查找指定的C符号
Find this global definition:
#查找指定的全局定义
Find functions called by this function:
#查找指定函数调用的函数
Find functions calling this function:
#查找调用指定函数的函数
Find this text string:
#查找字符串
Change this text string:
#修改指定字符串
Find this egrep pattern:
#查找匹配字符
Find this file:
#查找指定文件
Find files #including this file:
#指定引用头文件进行查找

在对应某一项中输入查找条件,回车即可进行查询,并将结果显示在显示面板。

应用实例

下面以使用cscope阅读内核源代码为例:

$ wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.27.6.tar.bz2
#从Linux内核官网下载内核源代码
$ tar xvfj linux-2.6.27.6.tar.bz2
#解压文件
$ cd linux-2.6.27.6
#进入源代码根目录
$ ctags -r
#递归生成标签文件
$ cscope-indexer -r
#递归生成索引信息文件
$ cscope
#使用cscope阅读源码

标签文件、索引信息文件只需要第一次或者代码发生变动时生成,以后使用直接运行
cscope即可。

[1] http://sourcenav.sourceforge.net/
[2] http://www.sourceinsight.com/
[3] http://lxr.linux.no/
[4] http://cscope.sourceforge.net/
[5] http://vcd.gro.clinux.org/

--
Jianjun Kong @_@ Happy Hacking
Homepage: http://kongove.cn/
Gtalk: kongj...@gmail.com

Niu Tao

unread,
Nov 15, 2008, 2:09:27 AM11/15/08
to Jianjun Kong, Xiyou-Linux-Group, zeuux...@zeuux.org, 西电Linux
2008/11/15 Jianjun Kong <kongj...@gmail.com>:
ctags -R

> #递归生成标签文件
> $ cscope-indexer -r
> #递归生成索引信息文件
> $ cscope
> #使用cscope阅读源码
>
> 标签文件、索引信息文件只需要第一次或者代码发生变动时生成,以后使用直接运行
> cscope即可。
>
>
>
> [1] http://sourcenav.sourceforge.net/
> [2] http://www.sourceinsight.com/
> [3] http://lxr.linux.no/
> [4] http://cscope.sourceforge.net/
> [5] http://vcd.gro.clinux.org/
>
> --
> Jianjun Kong @_@ Happy Hacking
> Homepage: http://kongove.cn/
> Gtalk: kongj...@gmail.com
>
> >
>

--
------------------
running out of a problem is not a solution,sit and face it

Jianjun Kong

unread,
Nov 15, 2008, 2:18:16 AM11/15/08
to Niu Tao, Xiyou-Linux-Group, zeuux...@zeuux.org, 西电Linux
On Sat, Nov 15, 2008 at 03:09:27PM +0800, Niu Tao wrote:
>2008/11/15 Jianjun Kong <kongj...@gmail.com>:
>> 使用Vim+Ctags+Cscope阅读源代码

....


>> $ cd linux-2.6.27.6
>> #进入源代码根目录
>> $ ctags -r
>ctags -R

Thanks.

已更新到:http://www.kongove.cn/web/doc/vim-ctags-cscope-source.html

helight.xu

unread,
Nov 15, 2008, 7:14:32 AM11/15/08
to Jianjun Kong, Xiyou-Linux-Group, zeuux...@zeuux.org, 西电Linux
Jianjun Kong wrote:
> 最近有好几个人问我使用什么阅读源代码,网上查了一下,关于Vim+Ctags+Cscope阅读源码的资料很多,但有些讲得太简略,于是自己整理了一下。
> 欢迎任何改进反馈 ;)
> -------------------
>
要是内核源码的话,直接只用
make cscope和make tags就可以了

http://dim4.cn/?p=98


--
---------------------------------
Zhenwen Xu - Open and Free
Home Page: http://dim4.cn
Gtalk: helig...@gmail.com

xd linux

unread,
Nov 15, 2008, 9:15:20 AM11/15/08
to helight.xu, Jianjun Kong, Xiyou-Linux-Group, zeuux...@zeuux.org, 西电Linux
谢谢了,我已经熟悉用source insight 看代码了,感觉还好。在linux下可以wine 。





2008/11/15 helight.xu <helig...@gmail.com>

helight.xu

unread,
Nov 15, 2008, 9:18:39 AM11/15/08
to xd linux, Jianjun Kong, Xiyou-Linux-Group, zeuux...@zeuux.org, 西电Linux
xd linux wrote:
> 谢谢了,我已经熟悉用source insight 看代码了,感觉还好。在linux下可以wine 。
>
只不过它。。。。。你用的是盗版的吧?

xd linux

unread,
Nov 15, 2008, 11:16:45 AM11/15/08
to helight.xu, Jianjun Kong, Xiyou-Linux-Group, zeuux...@zeuux.org, 西电Linux
偷偷地告诉你:yes ^_^ 

2008/11/15 helight.xu <helig...@gmail.com>

Américo Wang

unread,
Nov 15, 2008, 12:42:58 PM11/15/08
to xd linux, helight. xu, Jianjun Kong, Xiyou-Linux-Group, zeuux...@zeuux.org
2008/11/15 xd linux <xdl...@gmail.com>:
> 偷偷地告诉你:yes ^_^
>

第2遍:不要在顶部回复!

另外,这里是linux论坛,讨论windows的东西是偏离话题的!停止!!

Américo Wang

unread,
Nov 15, 2008, 12:59:51 PM11/15/08
to Jianjun Kong, Xiyou-Linux-Group, zeuux...@zeuux.org
2008/11/15 Jianjun Kong <kongj...@gmail.com>:

>
> 最近有好几个人问我使用什么阅读源代码,网上查了一下,关于Vim+Ctags+Cscope阅读源码的资料很多,但有些讲得太简略,于是自己整理了一下。
> 欢迎任何改进反馈 ;)
> -------------------
>
> 使用Vim+Ctags+Cscope阅读源代码
>
> --孔建军(Kongove.CN)
> 2008.11.15
>
> 代码阅读工具简介
>
> 对于学习Linux内核的人来说,源代码的阅读尤为重要。因为所有设计思想、内部机制都是
> 以代码的形式实现,所有的资料也都是为了更好的诠释代码。那么一个好的阅读工具,能
> 够提高阅读的效率和效果。常见的代码阅读工具有,Source Navigator、Source Insight
> 、lxr、Cscope等。


很明显你漏了Kscope,kde下很强大的工具,我个人认为比source navigator好多了。

>
> • "Source Navigator"是红帽子公司的,以GNU GPL发布,可从官方网站[1]下载使用。


说实话,source navigator给我的印象很差。。。


> • "Source Insight"目前只有Windows平台的,官方网站[2]。需要注册才能使用,或者
> 从网上下载注册机生成注册码。在Linux下通过wine模拟虽然可以方便使用,但它毕竟
> 是Windows平台的东西,并不能很自由的使用。

既然如此那最好连提都别提。:-)


> • lxr(linux cross reference)[3]为程序源代码建立索引数据库,利用perl脚本CGI动态
> 生成包含源码的web页面,你可以用任何一种浏览器查阅。缺点是需要服务器支持,还
> 有速度。
> • "Cscope"[4]为终端下的代码阅读工具,资源消耗少,对那些忠于命令行的行操作的人
> ,使用起来更加方便、灵活。这也是这篇文章推荐使用的一个重要原因。也有人把
> Cscope和Emasc绑定阅读源码。当然工具的选取,也取决于个人习惯。
>

再一次:所有这些工具都无法对函数指针进行跟踪(你知道为什么)。而grep在任何情况下
都可以。所以我现在基本上只用grep了。

刘洋

unread,
Nov 15, 2008, 5:48:59 PM11/15/08
to Jianjun Kong, Xiyou-Linux-Group, zeuux...@zeuux.org, 西电Linux

不错,这些东西可以整理一下放到我们的wiki上去,怎么样?

Jianjun Kong

unread,
Nov 15, 2008, 9:33:13 PM11/15/08
to Américo Wang, Xiyou-Linux-Group, zeuux...@zeuux.org
On Sat, Nov 15, 2008 at 05:59:51PM +0000, Américo Wang wrote:
>2008/11/15 Jianjun Kong <kongj...@gmail.com>:
>>
>> 最近有好几个人问我使用什么阅读源代码,网上查了一下,关于Vim+Ctags+Cscope阅读源码的资料很多,但有些讲得太简略,于是自己整理了一下。
>> 欢迎任何改进反馈 ;)
>> -------------------
>>
>> 使用Vim+Ctags+Cscope阅读源代码
>>
>> --孔建军(Kongove.CN)
>> 2008.11.15
>>
>> 代码阅读工具简介
>>
>> 对于学习Linux内核的人来说,源代码的阅读尤为重要。因为所有设计思想、内部机制都是
>> 以代码的形式实现,所有的资料也都是为了更好的诠释代码。那么一个好的阅读工具,能
>> 够提高阅读的效率和效果。常见的代码阅读工具有,Source Navigator、Source Insight
>> 、lxr、Cscope等。
>
>
>很明显你漏了Kscope,kde下很强大的工具,我个人认为比source navigator好多了。

Thanks,已添加。

>>
>> • "Source Navigator"是红帽子公司的,以GNU GPL发布,可从官方网站[1]下载使用。
>
>
>说实话,source navigator给我的印象很差。。。
>
>
>> • "Source Insight"目前只有Windows平台的,官方网站[2]。需要注册才能使用,或者
>> 从网上下载注册机生成注册码。在Linux下通过wine模拟虽然可以方便使用,但它毕竟
>> 是Windows平台的东西,并不能很自由的使用。
>
>既然如此那最好连提都别提。:-)
>
>
>> • lxr(linux cross reference)[3]为程序源代码建立索引数据库,利用perl脚本CGI动态
>> 生成包含源码的web页面,你可以用任何一种浏览器查阅。缺点是需要服务器支持,还
>> 有速度。
>> • "Cscope"[4]为终端下的代码阅读工具,资源消耗少,对那些忠于命令行的行操作的人
>> ,使用起来更加方便、灵活。这也是这篇文章推荐使用的一个重要原因。也有人把
>> Cscope和Emasc绑定阅读源码。当然工具的选取,也取决于个人习惯。
>>
>
>再一次:所有这些工具都无法对函数指针进行跟踪(你知道为什么)。而grep在任何情况下
>都可以。所以我现在基本上只用grep了。

这应该是词法分析的问题吧。
grep只要正则表达式用的灵活,当然也可以准确定位。

我测试了一下,确实不行,不能跟踪fun2。
如果用grep,可以通过正则表达式找到fun2的赋值语句(fun2=fun),然后在查找相应的定义函数。是这样吗?

#include <stdio.h>

int fun(char*s)
{
printf("%s\n", s);
return 0;
}
int main(void)
{
// int fun(char*);
int (*fun2)(char*);
int a;
fun2=fun;
char str[]="abcdefghijklmn";
a=fun2(str);
printf("a:%d\n", a);
return 0;

xd linux

unread,
Nov 16, 2008, 9:14:35 AM11/16/08
to Jianjun Kong, Américo Wang, Xiyou-Linux-Group, zeuux...@zeuux.org
Américo Wang
你好,不知那里有架设 lxr 的 文档,我先前架设了一个,但没有 把每一个变量都形成超链接的形式, 后来看了,可能是因为我用的旧版本的lxr的原因,不知新的lxr   怎么搞 是不是有个新版的呢?? 文档有否???
  ( 这次要顶全部了,否则你看不到我的帖子^_^)

2008/11/16 Jianjun Kong <kongj...@gmail.com>

Jianjun Kong

unread,
Nov 16, 2008, 9:38:26 AM11/16/08
to xd linux, Am�rico Wang, Xiyou-Linux-Group, zeuux...@zeuux.org
On Sun, Nov 16, 2008 at 10:14:35PM +0800, xd linux wrote:
>Américo Wang
>你好,不知那里有架设 lxr 的文档,我先前架设了一个,但没有把每一个变量都形成超链
>接的形式,后来看了,可能是因为我用的旧版本的lxr的原因,不知新的lxr 怎么搞是不
>是有个新版的呢??文档有否???
> (这次要顶全部了,否则你看不到我的帖子^_^)


下面是关于在ubuntu6.10下搭建lxr
http://hi.baidu.com/shenqb/blog/item/f650843db9ec7200baa167ac.html

最新版这里应该有:
http://sourceforge.net/projects/lxr

或者从这得到最新源码:
git clone git://lxr.linux.no/git/lxrng.git

去这里看看:
http://lxr.linux.no/


BTW:回复邮件时要有针对的回复。这样在任何地方回复,别人都能_留意_到。把多余的可以删除,如下面~

>2008/11/16 Jianjun Kong <kongj...@gmail.com>
>
> On Sat, Nov 15, 2008 at 05:59:51PM +0000, Américo Wang wrote:
> >2008/11/15 Jianjun Kong <kongj...@gmail.com>:
> >>
> >> 最近有好几个人问我使用什么阅读源代码,网上查了一下,关于Vim+Ctags+Cscope

<....>

WANG Tinggong

unread,
Nov 16, 2008, 10:01:23 PM11/16/08
to Américo Wang, Jianjun Kong, Xiyou-Linux-Group, zeuux...@zeuux.org
建议升级ctags至5.7,支持标签识别,可以跟踪结构体成员的定义,比如:
struct test{
void (*b)();
int (*c)();
}

struct test a;
a.c = xxxx
~vim中在这里按 CTRL+] 可以跳转到上面的int (*c)()

我用这些命令生成只含x86平台信息的tags:
find /usr/src/linux-2.4.0 -not -path "*h8300*" -not -path "*parisc*" \
-not -path "*cris*" -not -path "*m32r*" -not -path "*v850*" \
-not -path "*xtensa*" -not -path "*sh*" -not -path "*um*" \
-not -path "*ia64*" -not -path "*powerpc*" -not -path "*frv*" \
-not -path "*avr32*" -not -path "*m68k*" -not -path "*mips*" \
-not -path "*ppc*" -not -path "*sparc*" -not -path "*alpha*" \
-not -path "*arm*" -not -path "*s390*" -not -path "cris" \
-not -path "ia64" -not -path "*arch/sh*" -not -path "*script*" \
-name "*.[chsS]" >a.txt
ctags --sort=yes -f /usr/src/linux-2.4.0/tags -I \
__initfunc,__init,__init__,EXPORT_SYMBOL+ --c++-kinds=+p --fields=+iaS \
--extra=+q -L /usr/src/linux-2.4.0/a.txt
rm -f a.txt

Américo Wang

unread,
Nov 17, 2008, 4:46:28 AM11/17/08
to WANG Tinggong, Jianjun Kong, Xiyou-Linux-Group, zeuux...@zeuux.org
On Mon, Nov 17, 2008 at 11:01:23AM +0800, WANG Tinggong wrote:
>>
>> 再一次:所有这些工具都无法对函数指针进行跟踪(你知道为什么)。而grep在任何情况下
>> 都可以。所以我现在基本上只用grep了。
> 建议升级ctags至5.7,支持标签识别,可以跟踪结构体成员的定义,比如:
> struct test{
> void (*b)();
> int (*c)();
> }
>
> struct test a;
> a.c = xxxx
> ~vim中在这里按 CTRL+] 可以跳转到上面的int (*c)()
>

这个是可能的。因为c毕竟还是struct test的成员,换句话说这是静态的。

但在a.c上按不会跳到xxxx上,而这个才是我们想要的。。。:-)


--
"Sometimes the only way to stay sane is to go a little crazy."

Américo Wang

unread,
Nov 17, 2008, 4:48:29 AM11/17/08
to Jianjun Kong, Xiyou-Linux-Group, zeuux...@zeuux.org
On Sun, Nov 16, 2008 at 10:33:13AM +0800, Jianjun Kong wrote:
>>
>>再一次:所有这些工具都无法对函数指针进行跟踪(你知道为什么)。而grep在任何情况下
>>都可以。所以我现在基本上只用grep了。
>
>这应该是词法分析的问题吧。
>grep只要正则表达式用的灵活,当然也可以准确定位。
>

不是。
因为函数指针是动态赋值的,而这些源代码工具都是静态分析的。这才是根本原因。

Américo Wang

unread,
Nov 17, 2008, 4:57:15 AM11/17/08
to xd linux, Jianjun Kong, Xiyou-Linux-Group, zeuux...@zeuux.org
On Sun, Nov 16, 2008 at 10:14:35PM +0800, xd linux wrote:
> ( 这次要顶全部了,否则你看不到我的帖子^_^)
>

停止吧,我们的faq你连看都没看!里面清楚地告诉你该怎么做!

下次再见到你这样的回复不要怪我们直接把你block了~

WANG Tinggong

unread,
Nov 17, 2008, 8:00:18 PM11/17/08
to Américo Wang, Jianjun Kong, Xiyou-Linux-Group, zeuux...@zeuux.org
Américo Wang wrote On 2008-11-17 17:46 +0800:
> On Mon, Nov 17, 2008 at 11:01:23AM +0800, WANG Tinggong wrote:
>>> 再一次:所有这些工具都无法对函数指针进行跟踪(你知道为什么)。而grep在任何情况下
>>> 都可以。所以我现在基本上只用grep了。
>> 建议升级ctags至5.7,支持标签识别,可以跟踪结构体成员的定义,比如:
>> struct test{
>> void (*b)();
>> int (*c)();
>> }
>>
>> struct test a;
>> a.c = xxxx
>> ~vim中在这里按 CTRL+] 可以跳转到上面的int (*c)()
>>
>
> 这个是可能的。因为c毕竟还是struct test的成员,换句话说这是静态的。
赞同~ 这个功能ctags已经实现了

> 但在a.c上按不会跳到xxxx上,而这个才是我们想要的。。。:-)
这个只能靠grep了 :(


邓世勇

unread,
Nov 17, 2008, 8:01:54 PM11/17/08
to WANG Tinggong, Américo Wang, Jianjun Kong, Xiyou-Linux-Group, zeuux...@zeuux.org
WANG Tinggong 写道:

> 没人用emacs吗?
>
>
> >
>

Américo Wang

unread,
Nov 18, 2008, 5:21:24 AM11/18/08
to 邓世勇, WANG Tinggong, Jianjun Kong, Xiyou-Linux-Group, zeuux...@zeuux.org
On Tue, Nov 18, 2008 at 09:01:54AM +0800, 邓世勇 wrote:
>
> 没人用emacs吗?

用emacs的话可以试试ecb插件,我印象要安装它还需要安装一堆其它插件。。。。

而且,自从安装了它们以后,emacs启动就变得很慢了。。。所以我干脆卸载了。

Kermit Mei

unread,
Nov 18, 2008, 5:30:34 AM11/18/08
to xiyou...@googlegroups.com, Américo Wang, 邓世勇, WANG Tinggong, Jianjun Kong, zeuux...@zeuux.org
在 Tuesday 18 November 2008 18:21:24,Américo Wang 写道:
> On Tue, Nov 18, 2008 at 09:01:54AM +0800, 邓世勇 wrote:
> > 没人用emacs吗?
>
> 用emacs的话可以试试ecb插件,我印象要安装它还需要安装一堆其它插件。。。。
>
> 而且,自从安装了它们以后,emacs启动就变得很慢了。。。所以我干脆卸载了。

感觉emacs太强大了,以前舍不得kdevelop,现在发现给再好的IDE也比不上emacs,
就是配置有点麻烦,呵呵。

邓世勇

unread,
Nov 18, 2008, 7:43:53 PM11/18/08
to Américo Wang, WANG Tinggong, Jianjun Kong, Xiyou-Linux-Group, zeuux...@zeuux.org
Américo Wang 写道:

> On Tue, Nov 18, 2008 at 09:01:54AM +0800, 邓世勇 wrote:
>
>> 没人用emacs吗?
>>
>
> 用emacs的话可以试试ecb插件,我印象要安装它还需要安装一堆其它插件。。。。
>
> 而且,自从安装了它们以后,emacs启动就变得很慢了。。。所以我干脆卸载了。
>
>
一天只启动一次应该问题不大吧

邓世勇

unread,
Nov 18, 2008, 7:44:41 PM11/18/08
to Kermit Mei, xiyou...@googlegroups.com, Américo Wang, WANG Tinggong, Jianjun Kong, zeuux...@zeuux.org
Kermit Mei 写道:
要啥用啥,而且不想研究还可以拷贝一份就行了
Reply all
Reply to author
Forward
0 new messages