有没有办法在vim中区分两个寄存器?

时间:2011-09-08 17:11:59

标签: vim diff

  

可能重复:
  (Vim)diff two subroutines in same file

有时候我会看到一块代码,我怀疑它与同一个文件中的另一个块相同,但是对于视觉检查来说有点太长了,我可能只是遗漏了一些东西。我试图在视觉上选择块并猛拉到默认寄存器,将该寄存器放入/(查找),但它甚至与原始块不匹配。

有没有办法选择一个部分,把它放在一个寄存器中,然后选择另一个部分,然后将两者区分开来,而不创建一堆新文件?我想在一个新的文件中打开diff结果选项卡中的缓冲区或拆分。

编辑:我的问题基本上与This one重复。我发现this answer是最有帮助的&最接近我想要的。我唯一要改变的是让它在Unified format输出,所以它看起来像我习惯的diff输出(它有更多的信息)。我想这意味着使用不同的diff实用程序。

4 个答案:

答案 0 :(得分:5)

灵感来自我的lh#path#strip_common()功能:

echo matchstr(@a.'@@'.@b, '^\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\(.*\)\ze@@.\{-}\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)

答案 1 :(得分: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] ]“)。

答案 2 :(得分: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(),则会遇到问题。

答案 3 :(得分:1)

要快速比较文件的两个不同部分,可以使用以下方法将视图分成两部分:

  • :sp横向拆分

  • :vsp纵向拆分

分割完屏幕后,必须在每个窗口中使用:diffthis来突出显示差异。 (然后:diffoff离开diff模式)

然后返回单个窗口,您可以退出其中一个窗口:q或使用 CTRL w o