標籤:vim tag ctags
用vim瀏覽C/C++代碼時可以用ctags產生tag檔案,這樣可以很方便跳轉到函數定義的地方,這個功能幾乎所有的圖形介面編輯器都有,比如VS,source insight等等,但是vim的tags檔案是靜態,也就是說如果我們在原始碼裡新增了一些函數,原來的tags是不會自動更新的,我們也無法跳轉到新增的函數定義處,這個問題怎麼怎麼辦呢
我在網上搜尋了很多地方,普遍給的方案就是將ctags命令映射到一個快速鍵,這樣只需要按一下快速鍵就會產生新的tags檔案,但這樣有幾個不方便的地方
- 每次tags檔案都是全量產生,如果工程很大,產生tags檔案可能需要十多秒,而運行命令的過程中是不能編輯檔案的,也不可能每次修改檔案都去更新tags
- vim下運行ctags命令其實是在命令模式下輸入
!ctags -R .
,它會在vim的工作目錄下產生tags檔案,而如果你當前工作目錄並不是你想要產生tags的目錄,還得切換目錄
總之是,想要自動更新tags,沒有這麼簡單的事兒!
但是VS和source insight就可以做到,我們秉著凡是其它編輯器能實現的功能vim都能實現的原則來分析下問題的實質,其實不管是VS還是source insight它們都需要建立工程,然後將原始碼匯入工程,我們可以猜想到這些編輯器會對工程裡的源檔案建立索引,這樣就可以實現各種跳轉功能,當有代碼更新或是新增源檔案時,編輯器自然也可以檢測到,這時它暗地裡對源檔案重建立立索引,我們就可以對新增的函數進行跳轉。既然編輯器可以暗地裡做很多事,我們為何不也這樣呢,電腦的處理器大多數時候都是閒置,不用白不用
試想我們在Linux下有一堆原始碼,我們需要經常編輯和閱讀這些代碼,它的根目錄結構應該是這樣的
├── auto_tags├── build├── common├── include├── libs├── message├── metadata├── network├── nodes├── privacy├── tags└── tests
其中tags檔案是對目前的目錄下的代碼生產的tag,其它目錄存放的則是你的原始碼,這樣當我們開啟目錄下的原始碼時,vim就可以根據tags檔案來定位變數的位置
這裡的auto_tags目錄存放的是自己實現的指令碼,它的功能是自動檢測目前的目錄下的原始碼是否有更新,如果有,則生產新的tags檔案並替換老的,auto_tags目錄結構如下
├── auto_tags.conf├── auto_tags.sh└── run_tags.sh
auto_tags.conf為設定檔,配置項如下
CTAGS=/usr/bin/ctags# 產生tags檔案存放的目錄tags_dir=../# 原始碼所在目錄source_root=../# 需要建立tags的目錄名,注意只有目錄名字,不是路徑source_dirs="common message nodes"# 日誌相關max_log_size=10 # Unit: Mblog_file="auto_tags.log"
將source_dirs變數替換為你需要建立tags的目錄名稱即可,注意需要用雙引號包圍,且唯寫目錄名字,不需要添加../
使用方式如下
sh ./run_tags.sh start : 啟動指令碼 sh ./run_tags.sh stop : 停止指令碼
核心指令碼是auto_tags.sh,至於指令碼是如何?的就不貼出來了,畢竟這隻是一個程式員自娛自樂實現的一個小小的功能,它並不完善但簡單易用。github地址如下
https://github.com/handy1989/vim/tree/master/auto_tags
The end…
vim自動更新tag