我正在使用vim -d file1 file2
来查看它们之间的差异。这工作正常,但我想忽略空白更改 - 它们与源代码文件无关。
Vim帮助声明以下命令将起到魔力:
set diffopt+=iwhite
但遗憾的是,此命令仅将-b
添加到diff工具命令行,并且只忽略尾随空格。 diff的正确命令行键应为-w
,以忽略所有空格更改。但我找不到如何直接从Vim修改diff命令行。当然我可以编译自定义差异,或者用diff.sh替换diff,但这看起来有点难看:(。
有没有更好的方法来修改Vim与diff工具交互以显示文件差异的方式?
答案 0 :(得分:37)
这可以实现您的目标(取自diffexpr
docs并将-b
更改为-w
):
set diffopt+=iwhite
set diffexpr=DiffW()
function DiffW()
let opt = ""
if &diffopt =~ "icase"
let opt = opt . "-i "
endif
if &diffopt =~ "iwhite"
let opt = opt . "-w " " swapped vim's -b with -w
endif
silent execute "!diff -a --binary " . opt .
\ v:fname_in . " " . v:fname_new . " > " . v:fname_out
endfunction
...我仍然在寻找一个更好的diffexpr助手来处理哪些线贴到哪个(GNU diff,即使用-w
代替-b
,也是比较困惑的通过将额外的空白与诸如注释行之类的小编辑相结合。也许diffchar?
答案 1 :(得分:28)
是。像你一样设置iwhite
选项,另外,将diffexpr
设为空。
来自vim docs的相关部分:
iwhite
忽略空白区域的变化。添加 如果是“diff”命令的“-b”标志 'diffexpr'是空的。查看文档 这个“diff”命令的用途 究竟。它应该忽略添加尾随 白色空间,但没有领先的白色空间。
另请注意,您可以通过设置diffexpr
来提供自定义diff命令行。请参阅vimdiff man page上的讨论,特别是:
'diffexpr'选项可以设置为使用除标准之外的其他内容 “diff”程序比较两个文件并找出差异。
当'diffexpr'为空时,Vim使用此命令查找差异 在file1和file2之间:
diff file1 file2 > outfile
答案 2 :(得分:16)
谢天谢地,这帮助了我。我现在只需要在我的〜/ .vimrc中有这个(比Adam K提出的更简单):
set diffopt+=iwhite
set diffexpr=""
它确实如此......这仍然是我所知道的最强大的差异工具,远比其他任何工具好得多。
答案 3 :(得分:0)
解决Adam Katz解决方案评论中提出的问题:
根据用户的vim版本和设置,silent
命令可能会忽略在发布后重绘屏幕。我也遇到了这个问题,每当我在使用建议的:diffo
后执行diffexpr
时就会出现这个问题。我的解决方案是将silent execute命令更改为以下内容:
silent execute "!diff -a --binary " . opt .
\ v:fname_in . " " . v:fname_new . " > " . v:fname_out | redraw!
这会在命令发出后强制重绘。