1.ctags
(1)到
http://ctags.sourceforge.net/
下载ctags源码ctags-5.6.tar.gz
http://prdownloads.sourceforge.net/ctags/ctags-5.6.tar.gz
(2)解压并安装
tar zxvf ctags-5.6.tar.gz
cd ctags-5.6
./configure && make && make install

(3)command

ctags -R --c++-kinds=+p --fields=+iaS --extra=+q

2. taglist
能够列出源文档中的tag(function, class, variable, etc)并跳转.
注意:taglist依赖于ctags,所以要先装ctags,否则taglist装了也没法用!
(1)到
http://vim.sourceforge.net/scripts/script.php?script_id=273
下载taglist_42.zip,即
http://vim.sourceforge.net/scripts/download_script.php?src_id=6416
(2)解压得到两个文档
# unzip -d taglist taglist_42.zip
# cd taglist
# tree
.
|-- doc
| `-- taglist.txt
`-- plugin
`-- taglist.vim
(3)安装
cp doc/taglist.txt /usr/share/vim/vim61/doc/
cp plugin/taglist.vim /usr/share/vim/vim61/plugin/
(4)配置和使用
cd /usr/share/vim/vim61/doc/
启动vim,用 “:help tags .”来配置好帮助文档
重启vim,用“:TlistToggle”来打开和关闭taglist窗口。
能够用“:help taglist”来获得更多帮助信息。

vim启动时会自动搜索标签文件,找到定义指定标签的文件,打开它,并将光标定位到指定标签所在的那一行。

跳转到指定标签:

:ta <tag>

:tag <tag>

跳转到指定标签定义的地方,如果有多个相同的标签,vim会给出一个列表,从中可以选择要跳转到哪里。

在分割窗口中查看标签:

:stag <tag>

标签跳转快捷键

Vim已经映射了几个用于标签之间跳转的快捷键,我们可以使用这些快捷键在标签之间来回跳转。

Ctrl-] 跳转到当前光标所在的标签;

Ctrl-O 返回到跳转前的位置;

Ctrl-T 沿着经过的标签列表向回跳转,也可以在其前面输入一个数字,如N-Ctrl-T会向回跳转N步,相当于按了N下Ctrl-T;

:tags 显示所有经过的标签列表;

标签补全

当我们不想输入完整的标签时,可以只输入要找标签的前几个字符,然后按<Tab>键自动补全:

:tag prefix_<Tab>

默认会得到第一个匹配,如果它不是你想要的,可以重复按<Tab>键直到找到正确的匹配。

模式匹配

ctags支持模式匹配查找,当我们无法记清楚要找的标签,或只知道标签的一部分时,就可以使用模式匹配来搜索。

:tag /pattern

匹配指定模式,按<Tab>后,vim会自动搜索包含pattern的标签,默认会得到第一个匹配,如果这不是你想要的,可以重复按<Tab>键直到找到正确的匹配。

我们可以使用有关查找模式匹配的所有特性,如只查找以foo开始的标签:

:tag /^foo

:tselect /^foo

或只查找以bar结尾的标签:

:tag /bar$

:tselect /bar$

你同样可以用<Tab>逐个查看,也可以直接按<Enter>,让vim给出匹配的标签列表,然后从中选择你想查找的标签。

预览窗口

有时我们可能不想跳转到指定标签,只是想查看或确认一下相关标签的定义,然后就返回。用Ctrl-]跳转然后再用Ctrl-O或Ctrl-T返回当然可以,但vim提供了一种更简单的方式,那就是预览窗口。预览窗口就是把当前编辑窗口分割出一小部分,用来显示预览,活动光标依然会停留在编辑窗口,不会影响编辑。

在预览窗口里显示标签定义:

:ptag <tag>

对于ptag,前面所讲的模式匹配同样适用,可以使用:

:pclose

关闭预览窗口,而无论当前活动窗口是哪一个。

在预览窗口中编辑指定文件:

:pedit <filename>

查找当前文件和任何包含文件中的单词并在预览窗口中显示匹配:

:psearch <tag>

生成tags文件、配置vi
-------------------------------------------
(1)进入源码所在目录:
# cd /usr/src/linux
(2)生成针对源码的tags,因为ctags确省不把函数声明作为tag所以要加--c-types=+px(见注1)
# ctags -R --c-types=+px
(3)在vi配置文件中加入生成的tags
# vi /etc/vim/vimrc
set tags=/usr/src/linux/tags

使用tag查找对象:
-------------------------------------------
ctags -R
"-R"表示递归创建,也就包括源代码根目录下的所有子目录下的源程序。"tags"文件中包括这些对象的列表:
(1)用#define定义的宏
(2)枚举型变量的值
(3)函数的定义、原型和声明
(4)名字空间(namespace)
(5)类型定义(typedefs)
(6)变量(包括定义和声明)
(7)类(class)、结构(struct)、枚举类型(enum)和联合(union)
(8)类、结构和联合中成员变量或函数

vim用这个"tags"文件来定位上面这些做了标记的对象(见注1),下面介绍一下定位这些对象的方法:

1) 用命令行。在运行vim的时候加上"-t"参数,例如:
# vim -t foo_bar
这个命令将打开定义"foo_bar"(变量或函数或其它)的文件,并把光标定位到这一行。

2) 在vim编辑器内用":ta"命令,例如:
:ta foo_bar

3) 最方便的方法是把光标移到变量名或函数名上,然后按下" Ctrl-]";用"Ctrl-o"退回原来的地方。用 Ctrl-]延着调用树向前跳转, 用Ctrl-t向回跳转

4) 分割窗口
":tag"命令会将当前窗口的文件替换为包含新函数的文件。怎样才能同时查看两个文件呢?你可以使用 ":split"命令将窗口分开然后再用":tag"命令。vim 有个缩写命令可以做到这些:
:stag tagname
使用下面的命令可以分割当前窗口并跳转到光标下的标签:
Ctrl-w-]
如果指定了计数参数,新窗口将包含指定的那么多行。

5) 多个匹配
当一个函数(或类中的方法)被定义多次, ":tags" 命令会跳转到第一处。如果在当前文件中存在匹配,那它将会被首先使用。 你现在可以跳转到同一个标签的其它匹配处:
:tnext
重复执行这个命令可以找到更多的匹配。如果存在很多匹配,你可以选择要跳转到哪一个:
:tselect tagname
vim 会为你展示一个选择列表:
# pri kind tag               file
1 F   f    mch_init          os_amiga.c
            mch_init()
2 F   f    mch_init          os_mac.c
            mch_init()
3 F   f    mch_init          os_msdos.c
            mch_init(void)
4 F   f    mch_init          os_riscos.c
            mch_init()
Enter nr of choice (<CR> to abort):
你现在可以输入要跳转到的匹配代号(在第一列)。其它列的信息可以让你知道匹配在何处被定义。
以用这些命令在各匹配的标签间移动:
:tfirst                 到第一个匹配
:[count]tprevious       向前 [count] 个匹配
:[count]tnext           向后 [count] 个匹配
:tlast                  到最后一个匹配
如果没有指定,[count] 省缺为一。

6) 猜测标签名
命令行补全是避免输入长标签名的好办法。只需输入开始的一部分然后按 <Tab>:
:tag write_<Tab>
你会得到第一个匹配。如果这不是你想要的,重复输入 <Tab> 直到你找到正确的匹配。

有时你只知道一个函数名的一部分,或是你有很多以相同字符串开头而结尾不同的标记。这时你可以告诉vim使用一个模式来查找标签。
假设你要跳转到一个包含 "block" 的标签。首先输入:
:tag /block
现在再利用命令行补全功能:输入 <Tab>。vim 会找到所有包含 "block" 的标签并使用第一个匹配。
标签名前面的 "/" 告诉vim这不是一个确定的标签名而是一个模式。你可以利用有关查找模式的所有特性。举个列子,假设你要选择所有以 "write_" 开头的标签:
:tselect /^write_
"^" 指定标签以 "write_" 开头,否则在中间含有 "write_" 的标签名也会被找到。类似地,"$" 指定标签名结尾处的匹配。

7) 预览窗口
当编辑含有函数调用的代码时,你需要使用正确的调用参数。要获知所要传递的值,你可以查看这个函数是如何定义的。标签机制对此十分适用。如果定义可在另一个窗口内显示那就更好了。对此我们可以利用预览窗口。
打开一个预览窗口来显示函数 "write_char":
:ptag write_char
vim 会打开一个窗口,跳转到 "write_char" 标签。然后它会回到原来的位置。这样你可以继续输入而不必使用 CTRL-w w命令在两个分割窗口移动光标。
如果函数名出现在文本中,你可以用下面的命令在预览窗口中得到其定义:
Ctrl-w-]
用下面的命令关闭预览窗口:
:pclose

要在预览窗口中编辑一个指定的文件,用 ":pedit" 。这在编辑头文件时很有用,比如:
:pedit defs.h
最后, "psearch" 可用来查找当前文件和任何包含文件中的单词并在预览窗口中显示匹配。这在使用没有标签文件的库函数时十分有用。例如:
:psearch popen
这会在预览窗口中显示含有 popen() 原型的 "stdio.h" 文件:
        FILE    *popen __P((const char *, const char *));
你可以用 'previewheight' 选项指定预览窗口打开时的高度。

注:
-------------------------------------------
(1)
--<LANG>-kinds=[+|-]kinds 或者
--<LANG>-types=[+|-]kinds

<LANG> is case-insensitive and is one of the built-in language names (see the --list-languages option for a complete list).

The specific sets of flags recognized for each language, their meanings and defaults may be list using the --list-kinds option.

# ctags --list-kinds
C
    c classes
    d macro definitions
    e enumerators (values inside an enumeration)
    f function definitions
    g enumeration names
    l local variables [off]
    m class, struct, and union members
    n namespaces
    p function prototypes [off]
    s structure names
    t typedefs
    u union names
    v variable definitions
    x external variable declarations [off]
(2)
--- 对 c++
--- ctags -R --language-force=c++ --c++-types=+px --verbose --extra=+q
--- extra=+q 用来增加生成 Class::member 的形式, 默认没有这样就可以用 :ts CView::OnDraw 这种形式看
--- 因为c++一些头文件不用.h所以要用--language-force

--- 对 java
--- ctags -R --languages=java c:/jdk131/src
--- 要把src.jar展开

Reference :

http://hi.baidu.com/zengzhaonong/blog/item/d89795820e283b91f603a6c8.html

http://hi.baidu.com/%C1%EE%BA%FC%D2%BB%B6%FE/blog/item/e0f6973f6daa8bf3828b13bd.html

转载于:https://my.oschina.net/alphajay/blog/32814

vi+ctags 阅读源码相关推荐

  1. 【转】使用 vim + ctags + cscope + taglist 阅读源码

    原文网址:http://my.oschina.net/u/554995/blog/59927 最近,准备跟学长一起往 linux kernel 的门里瞧瞧里面的世界,虽然我们知道门就在那,但我们还得找 ...

  2. Linux下阅读源码工具

    闲来无事,于是又想进到Linux内核里面去逛逛了,但是只装了个ctags的工具,虽然说它可以在源码中到处跳动查看代码,但是感觉应该会有更好的方法. 虽然说可以转到windows下面去使用SourceI ...

  3. 小白也能看懂的踩坑日记--ubuntu(rk3588)安装LXR(阅读源码工具)服务器

    一.什么是LXR LXR是一个通用的源代码索引器和交叉引用器 它提供了一个基于 web 的可浏览任意定义以及任意标识的用法. 它支持很多种语言. LXR 曾经被作为 "Linux 交叉引用器 ...

  4. 起飞,会了这4个 Intellij IDEA 调试魔法,阅读源码都简单了

    前言 上一篇文章 IntelliJ IDEA 高级调试之Stream Trace 算是 IntelliJ IDEA 高级调试技巧的开胃菜,很多小伙伴被这个小技巧征服.趁热打铁,今天给大家带来几个我日常 ...

  5. 朋友问我学习高并发需不需要阅读源码,我是这样分析的!!

    来自:冰河技术 写在前面 最近正在写[高并发专题]的文章,其中,在[高并发专题]中,有不少是分析源码的文章,很多读者留言说阅读源码比较枯燥!问我程序员会使用框架了,会进行CRUD了,是否真的有必要阅读 ...

  6. android源码阅读笔记1-配置源码路径/阅读源码方法讨论

    开始之前 android studio中配置android源码路径 android studio中有源码的路径,你只需要打开SDK Manager下载源码然后重启android studio即可查看源 ...

  7. 为什么优秀的程序猿都阅读源码

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:后端程序员必备:书写高质量SQL的30条建议个人原创+1博客:点击前往,查看更多 来源: CSDN(ID:CSD ...

  8. 源码面前没有秘密,推荐 9 个带你阅读源码的开源项目

    在文章开始之前,请各位先回忆下在日常开发过程中,都使用或依赖了哪些开源项目?是不是发现,开源项目已经完全融入到日常开发! 如今大多数的程序员技术栈和工具箱里,或多或少都有开源项目的身影:大到操作系统. ...

  9. java程序阅读技巧_Java程序员阅读源码的小技巧,原来大牛都是这样读的,赶紧看看!...

    1.Quick Type Hierarchy 快速查看类继承体系. 快捷键:Ctrl + T 查看类很多人可能都知道,可源码阅读的时候更多用来查看方法体系更重要,可以方便快速的定位到方法的实现类.如: ...

  10. jdk源码分析书籍 pdf_如何阅读源码?

    点击上方"IT牧场",选择"设为星标" 技术干货每日送达! 阅读源码是每个优秀开发工程师的必经之路,那么这篇文章就来讲解下为什么要阅读源码以及如何阅读源码. 首 ...

最新文章

  1. HTML5调用手机的Datepicker(日期选择器)
  2. emacs参考资料整理
  3. vue.js学习笔记 - 组件(二)
  4. CSS3伪类和伪元素的特性和区别
  5. 微软系统工具套件SysinternalsSuite各个工具功能说明
  6. python os 文件操作 chdir(path)方法
  7. Hyhyhy – 专业的 HTML5 演示文稿工具
  8. python 结构数组_Python数组
  9. 02(c)多元无约束优化问题-牛顿法
  10. 店铺如何用视觉走出差异化?
  11. 【金融申请评分卡】数据准备 - 造衍生变量
  12. Your Bitbucket account has been locked. To unlock it and log in again you must solve a CAPTCHA.
  13. sql raiserror_SQL Server PRINT和SQL Server RAISERROR语句
  14. win2008 r2 hyper-v虚拟机的安装使用图文教程
  15. 4G模块 | 基于4G Cat.1的内网穿透实践
  16. 阿里腾讯的文化产业路线
  17. 项目经理应怎么利用人工智能?
  18. 普通高中课程标准实验教科书(必修)数学1_学习笔记
  19. Pivoting跳板攻击
  20. 揭秘:历史上十大被丢失的中国城市

热门文章

  1. android接支付宝授权和支付功能
  2. Android中背景透明的Dialog
  3. 获取rabbitmq连接对象_NET Core使用RabbitMQ
  4. vue事件发射与接收(可实现页面传值和非父子组件传值)
  5. 多元有序logistic回归_stata速学|logistic回归分析
  6. 举例说明指针的运算方法c语言,C语言中指针的使用方法
  7. qca9377linux无线驱动,ubuntu下安装无线网卡去驱动Qualcomm-Atheros-QCA9377
  8. 校验php语法是否正确,PHP正则校验email语法详解
  9. mysql 数字字段_mysql 数字字段的类型选择
  10. LINUX模拟键盘F5的脚本(未试过)