vim自動更新tag

2021-06-30 16:15:27 字數 1881 閱讀 2152

用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它們都需要建立工程,然後將源**匯入工程,我們可以猜想到這些編輯器會對工程裡的原始檔建立索引,這樣就可以實現各種跳轉功能,當有**更新或是新增原始檔時,編輯器自然也可以檢測到,這時它暗地裡對原始檔重新建立索引,我們就可以對新增的函式進行跳轉。既然編輯器可以暗地裡做很多事,我們為何不也這樣呢,計算機的處理器大多數時候都是空閒的,不用白不用

├── 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: mb

log_file="auto_tags.log"

將source_dirs變數替換為你需要建立tags的目錄名稱即可,注意需要用雙引號包圍,且只寫目錄名字,不需要新增../

使用方式如下

sh ./run_tags.sh start : 啟動指令碼

sh ./run_tags.sh stop : 停止指令碼

核心指令碼是auto_tags.sh,至於指令碼是如何實現的就不貼出來了,畢竟這只是乙個程式設計師自娛自樂實現的乙個小小的功能,它並不完善但簡單易用。github位址如下

the end…

自動更新原理

安裝補丁的時候,客戶端的主程式一般是要關閉的,除非採用動態解除安裝 調入元件的技術,比如網路遊戲,就是盡量讓玩家邊玩遊戲邊更新。人們嫌這樣的公升級仍然太麻煩,後來出現了b s結構,大家像抓住了救命稻草一樣的追捧至今,希望能從這些勞動中解脫出來。b s結構就是瀏覽器 伺服器結構,它所有的功能,都是在瀏...

自動更新元件

一些說明 自動更新幾乎每個程式都有。而自動更新的基本方法就是 1.比較本地版本與伺服器上的版本,做出是否需要更新的判斷 配置檔案的格式如下 xml version 1.0 encoding gb2312 configmodel xmlns xsi xmlns xsd ver 2.0ver 版本號 p...

自動更新元件

一些說明 自動更新幾乎每個程式都有。而自動更新的基本方法就是 1.比較本地版本與伺服器上的版本,做出是否需要更新的判斷 配置檔案的格式如下 xml version 1.0 encoding gb2312 configmodel xmlns xsi xmlns xsd ver 2.0ver 版本號 p...