2011-09-08 65 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 瓦特Ø

相关问题