2011-09-08 71 views
10

可能重複:
(Vim)diff two subroutines in same file有沒有辦法在vim中區分兩個寄存器?

有時候,我看到的代碼塊,我懷疑是等同於同一個文件中的另一個塊,但它是一個有點太長時間目視檢查和我可能會錯過一些東西。我試圖在視覺上選擇塊並將其拉入默認寄存器,將該寄存器放入/(查找)中,但即使原始塊也不匹配。

有沒有辦法選擇一個部分,在註冊表中選擇一個部分,選擇另一個部分然後區分兩個部分,而不創建一堆新文件?我想象在標籤或分割中的新緩衝區中打開差異結果。

編輯:我的問題基本上是This one的副本。我發現this answer是最有幫助的&最接近我正在尋找。我改變的唯一方法就是使它在Unified format中輸出,所以它看起來像我習慣的差異輸出(它也有更多的信息)。我想這意味着使用不同的diff工具。

+0

我不知道的人這是內置的...也許一個小腳本,可以做一些像':tabnew「ap:vsplit l」bp「? –

回答

5

從我lh#path#strip_common()功能的啓發:

echo matchstr(@a.'@@'[email protected], '^\zs\(.*\)\ze.\{-}@@\1.*$') 

將展示什麼是寄存器@a@b之間常見。

您可以顯示更多的信息:

function ShowDiff(a,b) 
    " I expect neither string to contain '@@' 
    let start = matchstr(a:a.'@@'.a:b, '^\zs\(.*\)\ze.\{-}@@\1.*$') 
    let end= matchstr(a:a.'@@'.a:b, '^.\{-}\zs\(.*\)\[email protected]@.\{-}\1$') 
    let a = a:a[len(start): -len(end)-1] 
    let b = a:b[len(start): -len(end)-1] 
    echo "identical beginning: ".strlen(start)." chars -> ".start 
    echo "identical ending : ".strlen(end)." chars -> ".end 
    echo "typical to a  : ".strlen(a)." chars -> ".a 
    echo "typical to b  : ".strlen(b)." chars -> ".b 
endfunction 

用於:

:call ShowDiff(@a, @b) 
3

您可以使用下面的序列假設兩段已經在寄存器,'a'b。可能可能被放入宏或函數中。

new 
only 
put a 
diffthis 
vnew 
put b 
diffthis 

這將創建一個新的緩衝,使得它唯一可見的緩衝,使'a進去,設置它被diff'd,然後打開一個垂直分割的新緩衝區,使'b進入此分組空緩衝區,並將其設置爲diff。立即vim(或gvim)將顯示差異。

完成後,鍵入:ls以獲取緩衝區列表,使用:buffer *N*返回原始文件並使用:bdel! *N*刪除創建的緩衝區(名爲「[No Name]」)。

+0

AKAI理解它,OP對「創建一堆新文件」不感興趣。 (我必須承認,我經常希望你在你的回答中詳細說明) –

+1

這不會創建新文件,只會在現有vim會話中創建新緩衝區。緩衝區寫入前,緩衝區不會成爲文件。 – Arcege

+0

你可以使用'setlocal buftype = nofile',這樣它就不會被寫入或要求保存。 – idbrii

3

這裏有一個函數可以並排打開兩個新窗口,每個窗口都包含指定的寄存器內容(例如,稱爲DiffRegs(@a, @1))並對它們進行比較。新緩衝區將不會被寫入或修改:

" A list for bookkeeping.. 
let g:diffreg_buffers = [] 

function! DiffRegs(reg1, reg2) 
    " Preserve the unnamed register 
    let s:nonamereg = @@ 
    let @@ = a:reg1 
    " new window 
    :new 
    normal P 
    setlocal nomodifiable 
    setlocal buftype=nofile 
    diffthis 
    call add(g:diffreg_buffers, bufnr('%')) 

    let @@ = a:reg2 
    :vsp +enew 
    normal P 
    setlocal nomodifiable 
    setlocal buftype=nofile 
    diffthis 
    call add(g:diffreg_buffers, bufnr('%')) 

    let @@ = s:nonamereg 
endfunction " DiffRegs(reg1, reg2) 

" Function to wipe all buffers we're diffing with the function above 
function! EndDiffs() 
    for buffer in g:diffreg_buffers 
     exe ':buffer ' . buffer 
     diffoff 
     quit 
    endfor 
    let g:diffreg_buffers = [] 
endfunction " EndDiffs() 

可以綁定那些你所選擇的組合鍵,但如果你沒有在每次通話後稱EndDiffs()DiffRegs(),你會碰到的問題。

+0

哇,這很不錯!但是有幾個問題:1.它並沒有真正區分它們,所以如果你將第2-100行放入一個緩衝區,1-99放入另一個緩衝區,它會告訴你像98行這樣的東西是不同的,額外的線路。 2.運行它的兩倍左右後,似乎不工作:檢測 錯誤在處理功能DiffRegs: 管線9: 10更多的線 線16: E96:不能差異超過4緩衝器 10條更多的線 這是非常接近我正在尋找壽(兩個新的緩衝區等)! –

+0

我不能真正解決(1),但這並不是差異(在vim中也是如此) - 它肯定會佔用額外的行數。 (2)的解決方案的更新答案。 –

1

比較快兩個文件的不同部分,可以使用一分爲二的觀點:

  • :sp水平分割

  • :vsp垂直分割

一旦分離了屏幕,您必須在每個窗口中使用:diffthis來突出顯示差異。 (然後:diffoff離開diff模式)

然後返回到一個窗口,你可以退出與他們的一個:q或使用CTRL 瓦特Ø

相關問題