zoukankan      html  css  js  c++  java
  • ctags的如何生成tags文件

    tags 在使用vim编程和浏览代码是非常有用。可以用CTRL+]和CTRL+t 来回跳转关键字。
    先生成自己工作目录的tags。最简单粗暴用法:

    $cd yourwork
    $ctags -R *

    这样会生成一个tags文件。(注:对于gvim的话,需要进入命令提示符下,cd到工作目录,来产生tags文件,直接在gvim去生成的话,会出现tags生成在上一级目录的情况)
    不过,这种有个问题,成员变量没有包含在里面。所以自动完成对象的成员时没有提示。
    解决办法:

    $ctags -R --fields=+iaS --extra=+q *

    –fields=[+|-]flags
    –fields指定tags的可用扩展域(extension fields),以包含到tags入口。
    i:继承信息Inheritance information
    a:类成员的访问控制信息 Access (or export) of class members
    S: 常规签名信息,如原型或参数表 Signature of routine(e.g. prototype or parameter list)
    –extra=[+|-]flags
    指定是否包含某种扩展信息到tags入口。
    q:包含类成员信息(如c++,java,Eiffel)。
    但就算是C 语言的结构,也需要这两个参数设置才能获取成员信息。

    这样就能自动完成结构和类的成员了。

    但是,对于系统的函数,还是没有跳转。如socket定义,inetaddr_in这样的结构没有自动变量完成。
    最简单做法:

    $ctags --fields=+iaS --extra=+q -R -f ~/.vim/systags /usr/include /usr/local/include

    然后在.vimrc里设置

    set tags+=~/.vim/systags

    这样虽然基本能跳转到系统函数定义,一个问题是某些系统函数并没有加入到systags里。
    如/usr/incluce/socket.h的socket系列函数,memset等很多关键函数都没有到tag里:

    extern int listen (int __fd, int __n) __THROW;

    这是因为 __THROW的宏定义让ctags不再认为该系列函数是函数。
    同理,如memcpy系列函数:
    如/usr/include/string.h的

    extern int strcmp (__const char *__s1, __const char *__s2)
         __THROW __attribute_pure__ __nonnull ((1, 2));

    还有attribute_pure ,nonull等属性,都需要忽略。如果需要#if 0里面的定义,可以–if0=yes来忽略 #if 0这样的定义。

    $ctags -I __THROW -I __attribute_pure__ -I __nonnull -I __attribute__ --file-scope=yes --langmap=c:+.h --languages=c,c++ --links=yes --c-kinds=+p --c++-kinds=+p --fields=+iaS --extra=+q -R -f ~/.vim/systags /usr/include /usr/local/include

    这样.vim/systags里面是全的,但内容过多。一个函数定义的跳转,会有几十个候选。这时我们可以简化一下,将-R去掉,自己指定目录:

    $ctags -I __THROW -I __attribute_pure__ -I __nonnull -I __attribute__ --file-scope=yes --langmap=c:+.h --languages=c,c++ --links=yes --c-kinds=+p --c++-kinds=+p --fields=+iaS --extra=+q  -f ~/.vim/systags /usr/include/* /usr/include/sys/* /usr/include/bits/*  /usr/include/netinet/* /usr/include/arpa/* /usr/include/mysql/*

    还可以包含一些自己编程需要的路径。注意后面加*号。
    这样生成的系统tags就少多了。不会有太多不相干的定义。

    另外在vim中将光标移动到#include <xxx.h>头文件名中,按esc,gf(助记词:goto file),即可查看头文件

  • 相关阅读:
    codevs 1086 栈 2003年NOIP全国联赛普及组
    1200 同余方程 2012年NOIP全国联赛提高组
    【bzoj4939】【YNOI2016】掉进兔子洞(莫队)
    洛谷P3674 小清新人渣的本愿(莫队)
    Lucas卢卡斯定理
    组合数学习笔记
    洛谷P3178 [HAOI2015]树上操作(线段树)
    洛谷P3258 [JLOI2014]松鼠的新家(树上差分+树剖)
    洛谷P2526 [SHOI2001]小狗散步(二分图匹配)
    bzoj3140: [Hnoi2013]消毒(二分图)
  • 原文地址:https://www.cnblogs.com/littlewrong/p/8243839.html
Copyright © 2011-2022 走看看