歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Unix知識 >> 關於Unix

vim比較兩個project


qiuhan
2007.12.29
在工作學習中,我們經常會遇到比較兩個project的問題,例如,我們想查看FreeBSD 6.0和6.2究竟有何不同。
這裡我們提供兩種方法,可以方便的實現。
1 目錄樹相同的情況
6.0和6.2的源碼往往具有相同的目錄樹結構,例如,都存在文件
sys/i386/i386/machdep.c,且其中都有函數init386
這時,如果我們想比較函數init386的不同之處,就可以直接比較這兩個文件的不同之處。
我們要實現的場景是這樣的:
首先,浏覽6.2(或者6.0)的源碼中的函數init386;這時,我們突然想看看與6.0的有什麼不同,我們先後按下
,d(逗號和字母d),然後vim就以豎直窗口diff的方式對比現實兩個函數的不同。
假設6.2和6.0的源碼分別位於目錄:/usr/src/6.2/, /usr/src/6.0/
把如下代碼加入您的~/.vimrc中:
function Diff()
let s:file_name=expand("%:p")
let s:slash_count = match(s:file_name, "/", 3)
let s:slash_count = match(s:file_name, "/", s:slash_count + 1)
let s:slash_count = match(s:file_name, "/", s:slash_count + 1)
let s:file_name=strpart(s:file_name, s:slash_count +1)
let s:file_name="/usr/src/6.0/".s:file_name
execute ":vertical diffsplit ".s:file_name
endfunction
nmap ,d :call Diff()
map h
map l
我們來逐行解釋一下:
function Diff() "聲明函數,函數名首字母必須大些
let s:file_name=expand("%:p") "得到當前的文件路徑(如/usr/src/6.2/sys/i386/i386/machdep.c)
let s:slash_count = match(s:file_name, "/", 3) "從第3個字符開始匹配"/",返回第2個"/"所在的位置
let s:slash_count = match(s:file_name, "/", s:slash_count + 1) "返回第3個"/"所在的位置
let s:slash_count = match(s:file_name, "/", s:slash_count + 1) "返回第4個"/"所在的位置
let s:file_name=strpart(s:file_name, s:slash_count +1) "拆分路徑,得到sys/i386/i386/machdep.c
let s:file_name="/usr/src/6.0/".s:file_name "生成新的路徑/usr/src/6.0/sys/i386/i386/machdep.c
execute ":vertical diffsplit ".s:file_name "以豎直窗口diff的方式打開新的路徑文件
endfunction
nmap ,d :call Diff() "把,d映射成調用Diff函數
map h "把Ctrl+h映射成切換到左側的窗口
map l "把Ctrl+l映射成切換到右側的窗口
2 目錄樹不同的情況
如果兩個project的文件結構差異較大,就不能使用第1種方法了。
我們仍然想使用左右兩個窗口來浏覽代碼,但是想使我們在窗口間切換時,相應的tags也能切換。
步驟如下(我們仍以6.2和6.0的源碼為例):
1 建立tags目錄
mkdir /tmp/tags
cd /tmp/tags
2 cscope -Rb -s /usr/src/6.2/
3 mv cscope.out 62.out
4 cscope -Rb -s /usr/src/6.0/
5 mv cscope.out 60.out
把如下代碼加入您的~/.vimrc中:
map h:cs add /tmp/tags/62.out:cs kill 0
map l:cs add /tmp/tags/60.out:cs kill 1
6 使用
vim /usr/src/6.2/sys/i386/i386/machdep.c
:cs add /tmp/tags/62.out
:vsplit /usr/src/6.0/sys/i386/i386/machdep.c
這樣使用Ctrl+h/l就能同時切換窗口和tags了。
Copyright © Linux教程網 All Rights Reserved