Ctags 学习笔记

本人在最近的学习过程中接触到了 ctags 工具。使用 Vim 的同学对此一定不陌生,它可以帮助 VimEmacs 等编辑器使用代码跳转,堪称程序员的神器。因此,本人特此撰写笔记分享给大家。

本篇博客参考了

  1. ctags使用详解
  2. 程序员的七种武器之Ctags
  3. Exuberant Ctags中文手册

简介

Ctags 是一种编程工具,可生成在各种编程语言的源文件和头文件中找到的名称的索引文件 (.tag)。 根据语言的不同,可以为函数,变量,类成员,宏等建立索引。

文件格式

tags文件是以行为单位的,每行的格式如下:

{tagname}{tagfile}{tagaddress}{extension_fields}

其中,即为制表符,是 tags 文件中的分割符。

tagname --> 类似于变量名,tagnamectags 为函数,变量,类成员,宏等建立的索引名。值得注意的是,tagname 不包含空格;

tagfile --> 顾名思义,是 .tags 文件的文件路径,为当前目录的相对路径;

tagaddress --> 可以定位到 tagname光标位置的 Ex 命令。通常只包含行号或搜索命令。出于安全的考虑,vim会限制其中某些命令的执行。

extension_fields --> 扩展字段,由用户自己定义。

此外值得注意的是,以上三项都不可包含制表符。

最后,ctags 使用 ;" 添加注释,即 ;" comment

常用参数

尽管拥有大量的选项,ctags 设置了缺省值 (适合多数情况),因此通常不带任何选项来执行 ctags(例如,ctags * ,或 ctags -R,这将为当前目录下所有可识别的源文件生成一个标签文件。下面提供的选项仅仅为了在有特殊需要时允许用户自定义。

-a 等同于 --append ;

-e 使能 etags模式,这将创建 Emacs 编辑器使用的标签文件;

-f tagfile 使用所指定的 tagfile做为标签文件的名字 (缺省是 “tags”,或 “TAGS” 当以 etags 模式运行时);

-h 定义一个文件扩展名列表,以句号分隔,这些文件将做为包含文件(或头文件)被解析;

-I 定义一个标识符列表;

-L 在文件中读取需要产生标签文件的文件列表。

-o tagfile-f tagfile

-R--recurse

--append[=yes|no] 指明为指定文件生成的标签是增加到标签文件已存在内容的后面,还是替换它们。此选项缺省关闭。
这个选项必须出现在第一个文件名之前;

--exclude=[pattern]pattern 加到排除文件/目录列表中;

--extra=[+|-]flags 指定是否为特定类型的信息增加额外的标签条目;

--fields=[+|-]flags 定义标签文件表项中的有效扩展字段 (即前文的 extension_fields,以获得更多信息)。

--filter[=yes|no] 使 ctags 表现的像一个过滤器,由标准输入读取文件的名字,并一个文件接一个文件的输出它们的
标签;

--help 向标准输出打印一个详细用法描述,然后退出。

--langdef=name 定义一种新的用户自定义语言,使用正则表达式进行解析;

--langmap=map[,map[...]] 控制文件名如何被映射到程序语言 (见 --list-maps 选项)。

--language-force=language 缺省的,ctags 自动为一个源文件选择语言,忽略那些不能确定程序语言的文件。

--languages=[+|-]list 定义一个语言列表,将为这些语言产生标签,以逗号分隔;

--list-languages 选项以获得一个完整的内建语言名称;

--list-kinds 选项列出支持的语言;

--list-maps[=language|all] 列出指定的语言或全部语言的文件扩展名和文件名模式,然后退出;

--recurse[=yes|no] 递归进入文件列表中所遇到的目录。

Ctags 支持的语言十分丰富,多达20余种,对应如下。高能提醒!!!

Ant
     p  projects
     t  targets
Asm
     d  defines
     l  labels
     m  macros
     t  types (structs and records)
Asp
     d  constants
     c  classes
     f  functions
     s  subroutines
Basic
     c  constants
     f  functions
     l  labels
     t  types
     v  variables
     g  enumerations
     v  variables
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 and forward variable declarations [off]
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 and forward variable declarations [off]
C#
     c  classes
     d  macro definitions
     e  enumerators (values inside an enumeration)
     E  events
     f  fields
     g  enumeration names
     i  interfaces
     l  local variables [off]
     m  methods
     n  namespaces
     p  properties
     s  structure names
     t  typedefs
Fortran
     b  block data
     c  common blocks
     e  entry points
     f  functions
     i  interface contents, generic names, and operators [off]
     k  type and structure components
     l  labels
     L  local, common block, and namelist variables [off]
     m  modules
     n  namelists
     p  programs
     s  subroutines
     t  derived types and structures
     v  program (global) and module variables
HTML
     a  named anchors
     f  JavaScript functions
Java
     c  classes
     e  enum constants
     f  fields
     g  enum types
     i  interfaces
     l  local variables [off]
     m  methods
     p  packages
JavaScript
     f  functions
     c  classes
     m  methods
     p  properties
     v  global variables
Lisp
     f  functions
Lua
     f  functions
Make
     m  macros
MatLab
     f  function
Pascal
     f  functions
     p  procedures
Perl
     c  constants
     f  formats
     l  labels
     p  packages
     s  subroutines
     d  subroutine declarations [off]
PHP
     c  classes
     i  interfaces
     d  constant definitions
     f  functions
     v  variables
     v  variables
     j  javascript functions
Python
     c  classes
     f  functions
     m  class members
     v  variables
     i  imports
Ruby
     c  classes
     f  methods
     m  modules
     F  singleton methods
Sh
     f  functions
SQL
     c  cursors
     d  prototypes [off]
     f  functions
     F  record fields
     l  local variables [off]
     L  block label
     P  packages
     p  procedures
     r  records [off]
     s  subtypes
     t  tables
     T  triggers
     v  variables
     i  indexes
     e  events
     U  publications
     R  services
     D  domains
     V  views
     n  synonyms
     x  MobiLink Table Scripts
     y  MobiLink Conn Scripts
Tex
     c  chapters
     s  sections
     u  subsections
     b  subsubsections
     p  parts
     P  paragraphs
     G  subparagraphs
Verilog
     c  constants (define, parameter, specparam)
     e  events
     f  functions
     m  modules
     n  net data types
     p  ports
     r  register data types
     t  tasks
VHDL
     c  constant declarations
     t  type definitions
     T  subtype definitions
     r  record names
     e  entity declarations
     C  component declarations [off]
     d  prototypes [off]
     f  function prototypes and declarations
     p  procedure prototypes and declarations
     P  package definitions
     l  local definitions [off]
Vim
     a  autocommand groups
     c  user-defined commands
     f  function definitions
     m  maps
     v  variable definitions

配合 Vim

~/.vimrc 中加入 set tags+=./tags 这样 vim 就可以用当前路径下的 tag 文件来定位和跳转了 具体跳转方式,在vim 中查看文档 :h tags

使用 tag

  1. 用于跳转到指定的tag。例如:
tag tagname
  1. 快捷键 Ctrl+] 取出当前光标下的word作为tag的名字并进行跳转。

  2. tags 命令 列出曾经访问过的 tag 的列表

  3. 快捷键 Ctrl+T 跳转到前一次的tag处。

  4. stag 命令

    stag tagname
    
  5. 分割当前窗口,并且跳转到指定的 tag

  6. 快捷键 Ctrl+W+]分割当前窗口,并且跳转到光标下的 tag

  7. 同名 tag 如果存在多个同名的 tagtag 命令会给出一个 tag 的列表,可以通过键入 tag 的序号来选择 tag;也可以通过 tselect 来过滤tag,如 :tselect tagname

如果要在多个 tag 间移动,可以使用如下命令:

:tfirst             go to first match
:[count]tprevious   go to [count] previous match
:[count]tnext       go to [count] next match
:tlast              go to last match

你可能感兴趣的:(编程)