Ctags是一个用于从程序源代码树产生索引文件(或tag文件),从而便于文本编辑器来实现快速定位的实用工具。在产生的tag文件中,每一个tag的入口指向了一个编程语言的对象。这个对象可以是变量定义、函数、类或其他的物件。
Ctags是开放源代码的程序。支持下列的编程语言:汇编,AWK, ASP, BETA, Bourne/Korn/Zsh Shell, C, C++, COBOL, Eiffel, Fortran, Java, Lisp, Lua, Make, Pascal, Perl, PHP, Python, REXX, Ruby, S-Lang, Scheme, Tcl, Vim, and YACC。
支持Ctags产生的tag文件的编辑器以及编辑器插件包括:Vim,Vile,Lemmy,等等。
下载一个支持windows的版本的,只要拷贝出ctags.exe这个文件就可以,把它放在$(home)vim71下(也就是在vim的安装目录下找到.exe这样的文件所在的文件目录下)
特别重要的地方:
编辑_vimrc,在里面加入以下两句:
set tags=tags;
set autochdir
注意第一个命令里的分号是必不可少的。这个命令让vim首先在当前目录里寻找tags文件,如果没有找到tags文件,或者没有找到对应的目标,就到父目录中查找,一直向上递归。因为tags文件中记录的路径总是相对于tags文件所在的路径,所以要使用第二个设置项来改变vim的当前目录。
(ctags可以建立源码树的索引,使程序员在编程时能迅速定位函数、变量、宏定义等位置去查看原形
以下是在ubuntu下ctags的下载安装和配置过程:
以下是在ubuntu下ctags的下载安装和配置过程:
下载并安装ctags,终端输入命令
lingd@ubuntu:~/arm$ sudo apt-get install ctags
那么在终端进入到该目录后,输入命令ctags -R *,你会发现多了一个tags文件,这个就是索引文件
lingd@ubuntu:~/arm$ cd linux-2.6.24.7
lingd@ubuntu:~/arm/linux-2.6.24.7$ ls
arch crypto include kernel mm samples usr
block Documentation init lib net scripts
COPYING drivers ipc MAINTAINERS README security
CREDITS fs Kbuild Makefile REPORTING-BUGS sound
lingd@ubuntu:~/arm/linux-2.6.24.7$ ctags -R *
lingd@ubuntu:~/arm/linux-2.6.24.7$ ls
arch crypto include kernel mm samples tags
block Documentation init lib net scripts usr
COPYING drivers ipc MAINTAINERS README security
CREDITS fs Kbuild Makefile REPORTING-BUGS sound
lingd@ubuntu:~/arm/linux-2.6.24.7$ vi ~/.vimrc
在打开文件的最后添加如下内容(当然,具体路径根据你自己的情况)
- "--ctags setting--
- " 按下F5重新生成tag文件,并更新taglist
- map <F5> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
- imap <F5> <ESC>:!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
- set tags=tags
- set tags+=./tags "add current directory's generated tags file
- set tags+=~/arm/linux-2.6.24.7/tags "add new tags file(刚刚生成tags的路径,在ctags -R 生成tags文件后,不要将tags移动到别的目录,否则ctrl+]时,会提示找不到源码文件)
set tags+=~/arm/linux-2.6.24.7/tags表示在搜寻tags文件的时候,也要搜寻~/arm/linux-2.6.24.7/文件夹下的tags文件。
------------------------------------
tag命令用法:
Ctrl+] 跳到当前光标下单词的标签
Ctrl+O 返回上一个标签
Ctrl+T 返回上一个标签
:tag TagName 跳到TagName标签
以上命令是在当前窗口显示标签,当前窗口的文件替代为包标签的文件,当前窗口光标跳到标签位置。如果不希望在当前窗口显示标签,可以使用以下命令:
:stag TagName 新窗口显示TagName标签,光标跳到标签处
Ctrl+W + ] 新窗口显示当前光标下单词的标签,光标跳到标签处
当一个标签有多个匹配项时(函数 (或类中的方法) 被多次定义),":tags" 命令会跳转到第一处。如果在当前文件中存在匹配,那它将会被首先使用。
可以用这些命令在各匹配的标签间移动:
:tfirst 到第一个匹配
:[count]tprevious 向前 [count] 个匹配
:[count]tnext 向后 [count] 个匹配
:tlast 到最后一个匹配
或者使用以下命令选择要跳转到哪一个
:tselect TagName
输入以上命令后,vim会为你展示一个选择列表。然后你可以输入要跳转到的匹配代号 (在第一列)。其它列的信息可以让你知道标签在何处被定义过。
以下命令将在预览窗口显示标签
:ptag TagName 预览窗口显示TagName标签,光标跳到标签处
Ctrl+W + } 预览窗口显示当前光标下单词的标签,光标跳到标签处
:pclose 关闭预览窗口
:pedit file.h 在预览窗口中编辑文件file.h(在编辑头文件时很有用)
:psearch atoi 查找当前文件和任何包含文件中的单词并在预览窗口中显示匹配,在使用没有标签文件的库函数时十分有用。
然后关闭终端重新打开,你就可以用VIM在任意地方查看有关Linux的函数原形
------------------------------------
最简单的使用方法举例
用vi在任意目录写一个test.c文件,内容如下:
int main(void)
{
printf("HelloWorld!");
return 0;
}
写好后末行模式输入w保存好(不要退出vi),按Esc回到指令模式,把光标停留在printf上
然后按 Ctrl+],vi会自动跳到Linux系统函数printf()处,这时我们能查看printf()的原形
查看完了,按Ctrl+o 就回到原来的地方。
)
http://blog.csdn.net/wooin/article/details/1858917
http://blog.csdn.net/tge7618291/article/details/4216977
安装taglist先要安装2个必备软件,不然taglist是跑不起来的:
vim和Exuberant ctags。
具体安装步骤:
1.下载taglist.zip,下载地址为:http://vim-taglist.sourceforge.net,下载最新的版本为targetlist_45.zip,接着解压压缩包,如果home目录下已经有目录.vim,则不需要建立,否则要用mkdir命令创建.vim目录,其绝对路径为:/home/username/.vim(username是你自己的用户名)。将压缩包解压到.vim目录下,最后文件路径应该如下所示:
/home/username/.vim/plugin/taglist.vim /home/username/.vim/doc/taglist.txt ,目录路径一定要如此。
2.切换到/home/username/.vim/doc 路径下,启动vim ,在命令行模式下执行“:helptags.”命令,注意一定不要忘记 " . ", 这一步很重要,不然你无法启动taglist帮助文件
3.重启vim, 使用“:TlistToggle"命令来打开或者关闭taglist窗口,使用“:help taglist”命令来获得taglist plugin更多的帮助信息。
taglist具体使用方法:
1.可以建立一个快捷键来快速打开或关闭Toglist,我们常用F8来实现此项功能,在~/.vimrc 找到.vimrc文件,如果没有,可以自己创建一个,将 nnoremap <silent> <F8> :TlistToggle<CR> 这条映射加入其中,你就可以用F8打开或关闭Taglist,非常方便吧。
2 重点介绍:
<CR>跳转到光标下的标签的位置定义。
○:跳转到光标下的标签的位置,并 定义一个新的窗口。
P:跳转到的标签在前面(Ctrl-W_p)的窗口。
p:显示在文件窗口的标签定义并保持光标在taglist窗口
t:跳到标签在一个新的tab。如果该文件是已 打开一个tab,则移向该tab。
CTRL-t:跳到标签在一个新的Tab。
<space> :显示当前光标下的标签的原型。 对于文件名,显示该文件的完整路径,文件类型和数量的标签。标签类型,显示标签类型和标签的数量。
1. 编辑区域与tags区域切换: ctrl + w + w
u:更新taglist窗口中列出的标签
s:改变标签的排序顺序(按名称或按顺序)
d:删除在光标下的本文件标签
x:缩小或放大taglist窗口
+ :打开一个折叠
- :关闭一个折叠
*:打开所有的折叠
=:关闭所有的折叠
[[:跳转到前一个文件的开头
<Backspace>键:跳转到前一个文件的开头
]] :跳转到下一个文件的开头
Tab:跳转到下一个文件的开头
q:关闭taglist窗口
<F1>:显示帮助
定位: 光标置于函数或者变量名上按 Enter 键( 按 o 键在新窗口中显示, space 键在下面状态栏显示原型定义 )
http://blog.csdn.net/bokee/article/details/6633193
自动补全:
安装OmniCppComplete
lingd@ubuntu:~$ vim-addons install omnicppcomplete
配置OmniCppComplete
在vim配置文件/home/user/.vimrc中加入如下的配置:
- "-- omnicppcomplete setting --
- " 按下F3自动补全代码,注意该映射语句后不能有其他字符,包括tab;否则按下F3会自动补全一些乱码
- imap <F3> <C-X><C-O>
- " 按下F2根据头文件内关键字补全
- imap <F2> <C-X><C-I>
- set completeopt=menu,menuone " 关掉智能补全时的预览窗口
- let OmniCpp_MayCompleteDot = 1 " autocomplete with .
- let OmniCpp_MayCompleteArrow = 1 " autocomplete with ->
- let OmniCpp_MayCompleteScope = 1 " autocomplete with ::
- let OmniCpp_SelectFirstItem = 2 " select first item (but don't insert)
- let OmniCpp_NamespaceSearch = 2 " search namespaces in this and included files
- let OmniCpp_ShowPrototypeInAbbr = 1 " show function prototype in popup window
- let OmniCpp_GlobalScopeSearch=1 " enable the global scope search
- let OmniCpp_DisplayMode=1 " Class scope completion mode: always show all members
- "let OmniCpp_DefaultNamespaces=["std"]
- let OmniCpp_ShowScopeInAbbr=1 " show scope in abbreviation and remove the last column
- let OmniCpp_ShowAccess=1
ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .
--c++-kinds=+p : 为C++文件增加函数原型的标签
--fields=+iaS : 在标签文件中加入继承信息(i)、类成员的访问控制信息(a)、以及函数的指纹(S)
--extra=+q : 为标签增加类修饰符。注意,如果没有此选项,将不能对类成员补全
# 为了测试自动补全功能,我们先下载C++一份C++标准库的源代码。
lingd@ubuntu:~$ sudo apt-get install build-essential
# 然后在/usr/include/c++下就可以找到标准库的头文件了。
lingd@ubuntu:~$ cd /usr/include/c++
lingd@ubuntu:/usr/include/c++$ ls
4.4 4.4.3
# 在此文件夹下生成能与OmniCppComplete配合运作的tags文件
lingd@ubuntu:/usr/include/c++$ ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .
lingd@ubuntu:/usr/include/c++$ ls
4.4 4.4.3 tags
# 在vim的配置文件中如下内容,然后在编程的时候就可以使用自动补全功能了。
lingd@ubuntu:/usr/include/c++$ vi ~/.vimrc
- set tags+=/usr/include/c++/tags
lingd@ubuntu:~$ cd ~
lingd@ubuntu:~$ vim Test.c
Ctrl+P 向前切换成员
Ctrl+N 向后切换成员
Ctrl+E 表示退出下拉窗口, 并退回到原来录入的文字
Ctrl+Y 表示退出下拉窗口, 并接受当前选项
Ctrl+X Ctrl+L 整行补全
Ctrl+X Ctrl+N 根据当前文件里关键字补全
Ctrl+X Ctrl+K 根据字典补全
Ctrl+X Ctrl+T 根据同义词字典补全
Ctrl+X Ctrl+I 根据头文件内关键字补全
Ctrl+X Ctrl+] 根据标签补全
Ctrl+X Ctrl+F 补全文件名
Ctrl+X Ctrl+D 补全宏定义
Ctrl+X Ctrl+V 补全vim命令
Ctrl+X Ctrl+U 用户自定义补全方式
Ctrl+X Ctrl+S 拼写建议
:help omnicppcomplete
linux下 查看某个结构体的定义
在/usr/include/目录下
1. 生成tags文件 命令:sudo ctags -R
2. 搜索(宏、结构体)命令: vi -t 名称
3.然后就看见它们的定义了 ctrl + ] (进入) ctrl + t (返回)
『基本功能使用方法』
常用命令列表:
1. $ ctags –R * ($ 为Linux系统Shell提示符)
2. $ vi –t tag (请把tag替换为您欲查找的变量或函数名)
3. :ts (ts 助记字:tags list, “:”开头的命令为VI中命令行模式命令)
4. :tp (tp 助记字:tags preview)
5. :tn (tn 助记字:tags next)
6. Ctrl + ]
7. Ctrl + T
命令解释:
“$ ctags –R *”:“-R”表示递归创建,也就包括源代码根目录(当前目录)下的所有子目录。“*”表示所有文件。这条命令会在当前目录下产生一个“tags”文件,当用户在当前目录中运行vi时,会自动载入此tags文件。
Tags文件中包括这些对象的列表:
- 用#define定义的宏
- 枚举型变量的值
- 函数的定义、原型和声明
- 名字空间(namespace)
- 类型定义(typedefs)
- 变量(包括定义和声明)
- 类(class)、结构(struct)、枚举类型(enum)和联合(union)
- 类、结构和联合中成员变量或函数
VIM用这个“tags”文件来定位上面这些做了标记的对象。
剩下的命令就是定位这些对象的方法:
“$ vi –t tag” :在运行vim的时候加上“-t”参数,例如:
[/usr/src]$ vim -t main
这个命令将打开定义“main”(变量或函数或其它)的文件,并把光标定位到这一行。
如果这个变量或函数有多处定义,在VI命令行模式
“:ts”命令就能列出一个列表供用户选择。
“:tp”为上一个tag标记文件,
“:tn”为下一个tag标记文件。当然,若当前tags文件中用户所查找的变量或函数名只有一个,“:tp,:tn”命令不可用。
最方便的方法是把光标移到变量名或函数名上,然后按下“Ctrl+]”,这样就能直接跳到这个变量或函数定义的源文件中,并把光标定位到这一行。用“Ctrl+t”可以退回原来的地方。即使用户使用了N次“Ctrl+]”查找了N个变量,按N次“Ctrl+t”也能回到最初打开的文件,它会按原路返回 。
更多功能通过命令man ctags或在Vim命令行下运行help ctags查询。
注意:运行vim的时候,必须在“tags”文件所在的目录下运行。否则,运行vim的时候还要用“:settags=”命令设定“tags”文件的路径,这样vim才能找到“tags”文件。改成:应该是在tags的子文件夹下都可以的。因为ctags会向上一级目录寻找。
在完成编码时,可以手工删掉tags文件(帚把不到,灰尘不会自己跑掉^_^)。