以前老是要退出 VIM 才能更新 cscope database~~ 網路上終於找到這篇~~
在VIM中使用cscope編輯代碼的時候,會遇到以一個惱人的問題,當你對一些檔案進行修改啊修改
啊的時候,忽然發現,通過cscope已經無法準確定位到一些symbol的位置,新增加的symbol也無
法進行快速的瀏覽,因為,cscope的資料檔案不會自動更新,很長一段時間我都在忍受這種不便
,終於有一次,我要對一些原始碼進行大幅度的重構,這次不能再停留在原始社會了,下決心搞
定在,在stackoverflow裡邊,搜到一個只星半點鐘的方法,連結在這裡:
http://stackoverflow.com/questions/2744010/update-cscope-db-from-vim
因為cscope.out的資料檔案在被使用的時候是無法更新的,因此我們需要一種方法能夠在正常使
用VIM的情況下,自動將cscope的串連終止,這樣,我們就可以通過一個服務程式去更新這個檔案
,在更新之後能,我們還需要能夠在不需要人為幹預的情況下,將這個資料檔案add回VIM環境。
這就是大體的思路了,這就是stackoverflow裡邊那個回答的思路,於是按照這個思路往下走,
VIM裡邊有一個remote和server的工作模式,可以在VIM外邊通過remote(VIM執行個體)發送命令給
server(VIM執行個體),這為我們在不認為幹預的情況下,斷開/增加cscope串連提供了可能,於是剩
下的事情就很簡單了。
首先,我們需要在VIM裡邊增加兩個函數,我給他們分別定義為KillCscope和AddCscope,第一個
用來斷開cscope串連,後一個用來建立cscope串連,代碼如下:
function! KillCscope()
cs kill -1
endfunction
function! AddCscope()
cs add cscope.out
endfunction
然後,就可以進行資料庫自動更新的代碼的實現了,我採用的是windows下的batch,環保實用:
@echo off
title Updating %PROJECT_NAME% cscope database
:loop
cmd /c vim --servername %1 --remote-expr "KillCscope()"
@echo off
call GenCscope.bat
@echo off
cmd /c vim --servername %1 --remote-expr "AddCscope()"
echo sleep 140s
ping -n 140 127.0.0.1 >nul
goto loop
@echo on
這個程式很簡單,就是一個無限迴圈,定時去斷開cscope串連,然後更新資料庫檔案,然後重新
建立串連,其中cmd /c vim --servername %1 --remote-expr "KillCscope()",其實就是發送一
個remote命令給名字為參數%1的server,讓其執行KillCscope函數,而GenCscope.bat這個batch
檔案就是實現對cscope資料庫的更新,這個檔案怎麼寫,我在前邊的博文中有提到,而且網上隨
便一搜一堆,自己也可以去看cscope的協助,最後通過ping -n 140 127.0.0.1 >nul實現延時,
延時的長短可以根據個人的習慣來進行調整,因為,在更新資料庫的時候,會有一小段時間是無
cscope串連的,所以這個時間不宜設定的過短。
最後,我們需要的只是在什麼時候去啟動更新指令碼了,我map了F11鍵給這個動作,在我僅是閱讀
代碼的時候,並不需要進行背景更新,所以,可以通過這個鍵來實現啟動。
這段VIM函數如下:
map <F11> :call UpdateCscope()<CR>
function! UpdateCscope()
silent execute 'AsyncCommand continuous_build' .' '. v:servername
endfunction
其中這裡用到了AsyncCommand這個外掛程式,它可以很方便的脫離VIM,調用cmd命令,並且不需要我
們進行額外的按鍵等操作。
本次的這個主題就這些內容了,希望大家happy vimming