有时候我会看到一块代码,我怀疑它与同一个文件中的另一个块相同,但是对于视觉检查来说有点太长了,我可能只是遗漏了一些东西。我试图在视觉上选择块并猛拉到默认寄存器,将该寄存器放入/(查找),但它甚至与原始块不匹配。
有没有办法选择一个部分,把它放在一个寄存器中,然后选择另一个部分,然后将两者区分开来,而不创建一堆新文件?我想在一个新的文件中打开diff结果选项卡中的缓冲区或拆分。
编辑:我的问题基本上与This one重复。我发现this answer是最有帮助的&最接近我想要的。我唯一要改变的是让它在Unified format输出,所以它看起来像我习惯的diff输出(它有更多的信息)。我想这意味着使用不同的diff实用程序。
答案 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