(Vim)在同一个文件中比较两个子例程
有可能在同一个文件中出现两个几乎相似的子程序,甚至是vimdiff吗? 如果是这样,怎么样?
我可以考虑将两个子程序复制到两个单独的文件中,然后对它们进行比较,但是有没有办法在原始文件中执行?
谢谢!
您不能在原始文件中执行此操作,但可以在不使用单独文件的情况下执行此操作,而只使用单独的缓冲区。 如果你在寄存器a
复制了一个子程序(例如,在可视模式下input"ay
),并且在寄存器b
复制a
其他子程序,
enew | call setline(1, split(@a, "\n")) | diffthis | vnew | call setline(1, split(@b, "\n")) | diffthis
自动化:
let g:diffed_buffers=[] function DiffText(a, b, diffed_buffers) enew setlocal buftype=nowrite call add(a:diffed_buffers, bufnr('%')) call setline(1, split(a:a, "\n")) diffthis vnew setlocal buftype=nowrite call add(a:diffed_buffers, bufnr('%')) call setline(1, split(a:b, "\n")) diffthis endfunction function WipeOutDiffs(diffed_buffers) for buffer in a:diffed_buffers execute 'bwipeout! '.buffer endfor endfunction nnoremap <special> <F7> :call DiffText(@a, @b, g:diffed_buffers)<CR> nnoremap <special> <F8> :call WipeOutDiffs(g:diffed_buffers) | let g:diffed_buffers=[]<CR>
请注意,如果Vim拒绝放弃更改的文件(请参阅:h abandon
),则可能需要设置hidden
选项。
插件linediff.vim:在两个文本块上执行一个交互式比较类似于文森特指出的一个额外的特性:
- 有一个closures打开的缓冲区的命令
- 似乎没有GUI的工作
- 在原始文件中插入一些可视指示。
要使用它,你需要在第一个块上进行可视化select,input命令:Linediff
,然后重复第二个块。 退出:LineDiffReset
我发现以下地图有帮助:
noremap \ldt :Linediff<CR> noremap \ldo :LinediffReset<CR>
我真的很喜欢ZyX的答案,但需要做两个修改才能无缝工作:
-
如所实现的,<F7>用垂直分割的差异显示replace活动的缓冲。 然后,当<F8>closuresdiff时,它不会重新加载原始缓冲区。 为了解决这个问题,我改变了第三行的
enew
来execute 'tab split | enew'
execute 'tab split | enew'
。 -
为了减less副作用,我在WipeOutDiffs()结束之前添加了
call remove(a:diffed_buffers, 0, -1)
)。
HTH, – Stu
您可以将这两个部分/子程序/部分写入两个文件,然后使用vimdiff来查看差异。
:1, 39 write part1 //any line range or marks can be used :40, 79 write part2 :!vimdiff part1 part2
如果您不习惯使用行号,可以将光标保持在该部分的开始位置,按v并select直到该部分的末尾,然后按:。 它会显示:'<,'>。 然后在命令行中inputwrite,然后input文件名。 按回车。 同样,第二个也是。 然后你可以执行上述的vimdiff命令。
(写命令将部分保存到一个新的文件。)写一个新的文件可能不是一个好主意,但是这对我有帮助。 特别是当我们不得不经过几次比较。
这是不使用插件或者不关心内存的最简单的方法之一。
我一直在使用这个命令:
vimdiff <(cat file.foo | sed -n 10,15p) <(cat file.foo | sed -n 20,25p)
inputsed
的数字是我想要在文件中进行sed
的行号。 <(*)
表示评估并redirect为input。
你可以试试Block diff vim插件 ,它会在一个新标签中新增两个缓冲区来显示不同之处。