面對龐大專案原始碼,ctags + Vim 是程式設計師的導航神器。本文詳述安裝配置、標籤生成、Vim 整合與進階使用技巧。
ctags 掃描原始碼生成索引檔(預設 tags),記錄函式、巨集、變數、類別等符號的定義位置。Vim 內建支援,按鍵即可跳轉定義處。
#define)typedef)# CentOS/RHEL
yum install -y ctags
# Ubuntu/Debian
apt-get install -y exuberant-ctags
# 原始碼編譯最新版
git clone https://github.com/universal-ctags/ctags.git
cd ctags && ./autogen.sh && ./configure && make && sudo make install
cd /path/to/project
ctags -R .
ctags -R \
--fields=+iaS \
--extra=+q \
--language-force=C \
--c-kinds=+px \
--exclude=.git \
--exclude=*.mod.c \
.
參數解析:
-R:遞迴掃描子目錄--fields=+iaS:記錄繼承、存取屬性、簽名--extra=+q:加入類別限定前綴--c-kinds=+px:包含函式原型與外部宣告| 指令 | 功能 |
|---|---|
| Ctrl-] | 跳至游標下符號定義 |
| Ctrl-t | 返回上一跳轉位置(標籤堆疊) |
| :tag <name> | 跳至指定符號 |
| :ts <name> | 列出所有同名符號供選擇 |
| :tn/:tp | 下一個/上一個同名符號 |
在 ~/.vimrc 加入:
set tags=./tags,tags,$HOME/tags
" 或向上遞迴尋找
set tags+=./tags;,tags;
gutentags 外掛自動管理--c++-kinds=+px --fields=+iaS --extra=+qcscope -Rbq 生成 cscope.out,Vim 安裝 cscope_maps.vim 實現呼叫圖反向查詢ctags -R,或用 gutentags 自動更新生成的 tags 檔案範例:
myLibSrcFun /home/test/program/myLibSrc.c /^int myLibSrcFun(void)$/;" f
main /home/test/program/main.c /^int main(int argc, char **argv)$/;" f
每行格式:符號名\t檔案路徑\t定義行模式\t類型
善用 ctags + Vim,原始碼閱讀效率可提升數倍,是 Linux 開發者必備技能。