有没有办法配置vimdiff忽略所有空格?

0kjbasz6  于 2023-01-21  发布在  其他
关注(0)|答案(6)|浏览(305)

我使用vim -d file1 file2是为了查看它们之间的差异,这样做很好,但是我想忽略空格的变化--它们与源代码文件无关。
Vim help指出以下命令将发挥作用:

set diffopt+=iwhite

但不幸的是,这个命令只在diff工具命令行中添加了-b,而且只忽略了尾随的空格。diff的正确命令行键应该是-w,以忽略所有空格的更改。但是我找不到如何直接从Vim修改diff命令行。当然,我可以编译一个自定义的diff,或者用www.example.com替换diffdiff.sh,但这看起来有点难看:(。
有没有更好的方法来修改Vim与diff工具交互以显示文件差异的方式?

jv2fixgn

jv2fixgn1#

这实现了您想要的内容(取自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 helper来处理哪些行Map到哪些行(GNU diff,即使使用-w而不是-b,也很难将额外的空格与注解行之类的小编辑结合起来)。

6yjfywim

6yjfywim2#

是的。按照您所做的那样设置iwhite选项,但是另外,将diffexpr设为空。
从vim文档的相关部分:
伊怀特
忽略白色数量的更改。如果“diffexpr”为空,则将“-B”标志添加到“diff”命令。请查看“diff”命令的文档以了解此命令的确切作用。它应忽略添加尾随空白,但不忽略添加前导空白。
还需要注意的是,你可以通过设置diffexpr来提供一个自定义的diff命令行,具体参见vimdiff man page的讨论:
“diffexpr”选项可以设置为使用标准“diff”程序之外的其他程序来比较两个文件并查找差异。
当'diffexpr'为空时,Vim使用以下命令查找file 1和file 2之间的差异:

diff file1 file2 > outfile
42fyovps

42fyovps3#

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

set diffopt+=iwhite

set diffexpr=""

而且它做到了...这仍然是我所知道的最强大的比较工具,远远好于其他任何工具。

wko9yo5t

wko9yo5t4#

我知道这是一个古老的问题,但对于像我这样不知道的人来说,这是现在可用的:
:set diffopt+=iwhiteall
如果“diffexpr”为空,则将“-w”标志添加到“diff”命令。
参见:h 'diffopt'

k5hmc34c

k5hmc34c5#

对于执行set diffopt+=iwhite时遇到“无效参数”的情况,请尝试不使用+,如下所示:

set diffopt=iwhite

然而,一个更健壮的方法是在保留现有选项的同时设置ignore whitespace。不过要注意,“Invalid argument”错误很可能是由于不支持其中一个现有选项造成的。在我的例子中,它是“internal”选项,因此我需要按照以下顺序设置选项:

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/

djmepvbi

djmepvbi6#

解决Adam Katz解决方案的注解中提出的问题:
根据vim版本和用户的设置,silent命令在发出后可能忽略重绘屏幕。我也遇到过这个问题,每当我在使用建议的diffexpr后执行:diffo时都会出现这个问题。我的解决方案是将silent execute命令更改为以下命令:

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

这将强制在发出命令后进行重绘。

相关问题