74

我正在使用vim -d file1 file2以查看它们之间的差异。这工作正常,但我想忽略空格更改 - 它们与源代码文件无关。

Vim help 指出以下命令将发挥作用:

set diffopt+=iwhite

但不幸的是,此命令仅添加-b到 diff 工具命令行,并且仅忽略尾随空格。diff 的正确命令行键应该是-w, 以忽略所有空格更改。但我找不到如何直接从 Vim 修改 diff 命令行。当然,我可以编译自定义 diff,或者用 diff.sh 替换 diff,但这看起来有点难看 :(。

有没有更好的方法来修改 Vim 与 diff 工具交互以显示文件差异的方式?

4

5 回答 5

39

这实现了您想要的(取自更改为的diffexpr文档):-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

于 2010-11-24T20:29:58.723 回答
33

是的。像你一样设置iwhite选项,但另外,将其设为diffexpr空。

vim 文档的相关部分:

忽略空白数量的变化。如果 'diffexpr' 为空,则将 "-b" 标志添加到 "diff" 命令。检查“diff”命令的文档以了解它的确切作用。它应该忽略添加尾随空格,而不是前导空格。

另请注意,您可以通过设置来提供自定义 diff 命令行diffexpr请参阅vimdiff 手册页上的讨论,特别是:

'diffexpr' 选项可以设置为使用标准的“diff”程序以外的东西来比较两个文件并找出差异。

当 'diffexpr' 为空时,Vim 使用这个命令来查找 file1 和 file2 之间的差异:

diff file1 file2 > outfile
于 2009-08-12T11:37:50.053 回答
19

谢谢愤怒,这对我有帮助。我现在只需要在我的 ~/.vimrc 中有这个(比 Adam K 提出的更简单):

set diffopt+=iwhite

set diffexpr=""

它确实做到了...这仍然是我所知道的最强大的差异工具,比任何其他工具都要好得多。

于 2012-10-29T10:51:41.797 回答
0

解决 Adam Katz 解决方案的评论中提出的问题:

根据用户的 vim 版本和设置,silent命令发出后可能会忽略重绘屏幕。我也遇到了这个问题,每当我:diffo在使用建议的diffexpr. 我的解决方案是将静默执行命令更改为以下内容:

silent execute "!diff -a --binary " . opt .
 \ v:fname_in . " " . v:fname_new .  " > " . v:fname_out | redraw!

这会在命令发出后强制重绘。

于 2017-11-06T20:03:14.300 回答
0

对于那些点击“无效参数”set diffopt+=iwhite的人,请尝试不+这样做:

set diffopt=iwhite

但是,更强大的方法是在保留现有选项的同时设置忽略空格。但请注意,“无效参数”错误可能是由不支持的现有选项之一引起的。就我而言,它是“内部”选项,因此我需要按以下顺序设置选项:

set diffopt-=internal
set diffopt+=iwhite

或者将以下内容添加到您的 .vimrc 中:

if &diff
    set diffopt-=internal
    set diffopt+=iwhite
endif

归功于https://www.micahsmith.com/blog/2019/11/fixing-vim-invalid-argument-diffopt-iwhite/

于 2021-08-31T20:10:00.483 回答