zoukankan      html  css  js  c++  java
  • vim Ctags 和taglist安装和使用

    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的下载安装和配置过程:
     

    ctags可以建立源码树的标签索引(标签就是一个标识符被定义的地方,如函数定义),使程序员在编程时能迅速定位函数、变量、宏定义等位置去查看原形
    以下是在ubuntu下ctags的下载安装和配置过程:
    下载并安装ctags,终端输入命令
    lingd@ubuntu:~/arm$ sudo apt-get install ctags
    建立源码索引,比如我经常需要查阅Linux的内核代码,而这些代码放在/home/lingd/arm/linux-2.6.24.7目录下
    那么在终端进入到该目录后,输入命令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
    向vim注册索引文件tags的路径,
    lingd@ubuntu:~/arm/linux-2.6.24.7$ vi ~/.vimrc
    在打开文件的最后添加如下内容(当然,具体路径根据你自己的情况)
    1. "--ctags setting--
    2. " 按下F5重新生成tag文件,并更新taglist
    3. map <F5> :!ctags ---c++-kinds=+--fields=+iaS --extra=+.<CR><CR> :TlistUpdate<CR>
    4. imap <F5> <ESC>:!ctags ---c++-kinds=+--fields=+iaS --extra=+.<CR><CR> :TlistUpdate<CR>
    5. set tags=tags
    6. set tags+=./tags "add current directory's generated tags file
    7. set tags+=~/arm/linux-2.6.24.7/tags "add new tags file(刚刚生成tags的路径,在ctags -R 生成tags文件后,不要将tags移动到别的目录,否则ctrl+]时,会提示找不到源码文件)
    set tags+=./tags表示在当前工作目录下搜索tags文件
    set tags+=~/arm/linux-2.6.24.7/tags表示在搜寻tags文件的时候,也要搜寻~/arm/linux-2.6.24.7/文件夹下的tags文件。
    然后保存并退出vi。这样,你就可以用vim在任意地方查看有关Linux的函数原形
    ------------------------------------
    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

    自动补全:

    vim自动补全——OmniCppComplete
    vim的自动补全功能可通过其插件OmniCppComplete实现。
    安装OmniCppComplete
    lingd@ubuntu:~$ vim-addons install omnicppcomplete
    配置OmniCppComplete
    在vim配置文件/home/user/.vimrc中加入如下的配置:
    1. "-- omnicppcomplete setting --
    2. " 按下F3自动补全代码,注意该映射语句后不能有其他字符,包括tab;否则按下F3会自动补全一些乱码
    3. imap <F3> <C-X><C-O>
    4. " 按下F2根据头文件内关键字补全
    5. imap <F2> <C-X><C-I>
    6. set completeopt=menu,menuone " 关掉智能补全时的预览窗口
    7. let OmniCpp_MayCompleteDot = 1 " autocomplete with .
    8. let OmniCpp_MayCompleteArrow = 1 " autocomplete with ->
    9. let OmniCpp_MayCompleteScope = 1 " autocomplete with ::
    10. let OmniCpp_SelectFirstItem = 2 " select first item (but don't insert)
    11. let OmniCpp_NamespaceSearch = 2 " search namespaces in this and included files
    12. let OmniCpp_ShowPrototypeInAbbr = 1 " show function prototype in popup window
    13. let OmniCpp_GlobalScopeSearch=" enable the global scope search
    14. let OmniCpp_DisplayMode=1 " Class scope completion mode: always show all members
    15. "let OmniCpp_DefaultNamespaces=["std"]
    16. let OmniCpp_ShowScopeInAbbr=1 " show scope in abbreviation and remove the last column
    17. let OmniCpp_ShowAccess=
    (前几行就是提供了C++中的./->/::等操作符的提示和自动完成)。
    OmniCppComplete是基于ctags数据库即tags文件实现的(基于ctags生成的索引信息来实现自动补全的),所以在ctags -R生成tags时还需要一些额外的选项,这样生成的tags文件才能与OmniCppComplete配合运作。使用下列命令生成tags文件,就可以与OmniCppComplete配合运作:
    ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .
    --c++-kinds=+p  : 为C++文件增加函数原型的标签
    --fields=+iaS   : 在标签文件中加入继承信息(i)、类成员的访问控制信息(a)、以及函数的指纹(S)
    --extra=+q      : 为标签增加类修饰符。注意,如果没有此选项,将不能对类成员补全
    # vim自动补全功能的测试
    # 为了测试自动补全功能,我们先下载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
    1. set tags+=/usr/include/c++/tags
    # 用vi打开前面的Test.c文件,在printf("Hello World! ")下一行中,输入pri,然后按下Ctrl+X Ctrl+O,此时vi会弹出一个窗口,所有以pri开头的tag都会出现在这个窗口中,printf就出现在第6行中
    lingd@ubuntu:~$ cd ~
    lingd@ubuntu:~$ vim Test.c
     
    注意:在自动补全的点,Vim必须知道可能补全的定义。比如说,在namespace std命名空间下的变量和函数,必须要用using namespace std;暴露出来,否则是不能补全的。在.cpp文件中还可以,在.h文件中这样就不是好的做法了。暂时不知道这个问题是由于我自己配置错误还是程序没有实现。
    当自动补全下拉窗口弹出后,一些可用的快捷键:
    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文件中包括这些对象的列表:

    1. 用#define定义的宏
    2. 枚举型变量的值
    3. 函数的定义、原型和声明
    4. 名字空间(namespace)
    5. 类型定义(typedefs)
    6. 变量(包括定义和声明)
    7. 类(class)、结构(struct)、枚举类型(enum)和联合(union)
    8. 类、结构和联合中成员变量或函数

    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文件(帚把不到,灰尘不会自己跑掉^_^)。

  • 相关阅读:
    Upgrading to MySQL 5.7---focusing on temporal types
    mysqldump备份7
    mysqldump原理5
    mysqldump原理4
    mysqldump原理3
    mysqldump原理2
    mysqldump原理1
    MySQL复制中slave延迟监控
    赵浮云的blog 关注IT运维,开源硬件。
    爱维帮---LVS
  • 原文地址:https://www.cnblogs.com/youxin/p/3188407.html
Copyright © 2011-2022 走看看