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
發佈了32 篇原創文章 · 獲贊 26 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章