1. 程式人生 > >vim+cscope時自動更新cscope的資料庫檔案

vim+cscope時自動更新cscope的資料庫檔案

在linux環境下vim和emacs是當仁不讓的主流編輯器。現在記錄一下本人使用vim時遇到的一個問題(如題),和解決方法。

        vim只是一個編輯器,如工程中的符號跳轉、符號搜尋等功能它並不具備。那麼在閱讀kernel等大型工程的時候單純用vim是不方便的。那麼就需要藉助 cscope進行上述功能的補充。如果只是程式碼閱讀,則一次生成資料庫就可以了,但是如果是在正常的開發過程中,需要經常對檔案進行修改就會發現有一個麻 煩。

        那就是cscope並不會自動更新它的資料庫,如我們新增或者刪除某個函式後並不會體現到當前連線到vim中的這個資料庫裡。此時將出現跳轉失敗等問題。

        而source insight等工具是能夠自動更新其資料庫的,我們的修改可以實時被其看到而不出現跳轉失敗等問題。那麼能否讓系統也自動更新cscope的資料庫呢?當然可以,當然了,cscope是不能自動更新的,那麼就需要依賴於作業系統了,下面將從windows和linux兩方面說一下本人自動更新的實現。

        一、windows:stackoverflow 中瞭解到,GVIM有一個server/remote工作模式。即在gvim外部向vim發指令讓其做某些事情。我們知道,windows下某個檔案被打 開後是不能再對它進行操作的。資料庫檔案cscope.out一但被連線到vim那麼就不能再對該檔案進行操作了。那怎麼辦呢,此時就需要用到上面說的方 法了。需要讓vim知道我們將要更新資料庫了,需要它先斷開連線,更新完成後再重新連線,這樣就完成了一次完整的更新了。在windows中當然是使 用.bat檔案做這樣事情了,我實現上述功能的程式碼如下:

首先需要實現vim需要幹事的函式(在_vimrc檔案中新增下面兩個函式):

1:斷開scope資料庫連線

function! disable_cscope()
cs kill -1
endfunction

2:重新連線scope資料庫(我的資料庫在E:\Linux_kernel\linux-2.6.11.1\目錄中)

function! connect_cscope()
cs add E:\Linux_kernel\linux-2.6.11.1\cscope_bak.out
endfunction

3:後臺更新資料庫的bat檔案

@echo off
%2      //進入執行檔案時傳入的第二個引數指示的盤
cd %1    //進入第一個引數指定的具體目錄
:loop
del cscope.out cscope.files    //刪除老的資料庫檔案
echo "cscope db create"
dir /s /b *.c *.h > cscope.files    //生成檔案列表
cscope -Rbqk    //生成資料庫檔案
cmd /c vim --servername gvim --remote-expr "disable_cscope()"    //發指令讓vim斷開cscope連線
copy %1\cscope.out %1\cscope_bak.out    //拷貝cscope.out為cscope_bak.out
cmd /c vim --servername gvim --remote-expr "connect_cscope()"    //發指令讓vim重新連線資料庫
echo sleep 180s
ping -n 180 localhost >nul    //通過ping本機實現延時,時間自定
goto loop
@echo on

程式碼解釋:

1、 其中一個值得解釋的地方是重新連線的是cscope.out的副本,而不是原件,這樣做的目的在於,不讓vim斷開連線太久。首先我們是刪除了資料庫檔案 才開始再生成的,如果連線的是原件,則在刪除之前就需要斷開連線,且生成檔案列表和資料庫上非常耗時的,這樣就會導致vim中長時間沒有cscope的數 據庫連線而讓人忍受不了。使用了副本就只需要等到資料庫生成後,斷開連線,進行一次拷貝,再重新連線一次副本。這個斷開的時間非常短,人是感覺不到的。

2、另一個值得解釋的地方在於執行檔案的時候需要傳入引數,如:我的bat檔名叫auto_load_cscope.bat,而我的工程目錄在E:\Linux_kernel\linux-2.6.11.1\中,我執行檔案的方法是在cmd中進入auto_load_cscope.bat所在的目錄後輸入auto_load_cscope.bat E:\Linux_kernel\linux-2.6.11.1 E:即可更新E:\Linux_kernel\linux-2.6.11.1中的工程。通過引數執行檔案的好處在於非常的靈活,通過引數可以做非常多的事,比如同時開啟多工程都是可以實現的。

二、接下來就到linux了,在linux中會簡單得多,因為它可以操作開啟的檔案,它可以不需要斷開連線就能複製資料庫檔案。

        在linux中我們使用.sh檔案進行後臺執行,程式碼如下:

#!/bin/bash
cd $1
while :; do
rm -f cscope.out
cscope -Rbqk
cp cscope.out cscope_bak.out
sleep 180s
done

解釋:

1、在linux中開啟vim後需要手動連線資料庫的副本,以後就高枕無憂了。

2、同樣使用引數執行.sh檔案:進入.sh檔案的目錄後輸入命令./auto_load_cscope.sh /home/jiang/work/Linux_kernel/linux-2.6.11.1/ &即可。

3、在linux中沒有開啟的檔案不能操作的限制後,進行多工程編輯將比windows下容易得多,直接用不同的引數執行多次.sh檔案,並開啟不同的工程即可。

到此,我的實現就完成了。