【问题标题】:Is there a way to configure vimdiff to ignore ALL whitespaces?有没有办法将 vimdiff 配置为忽略所有空格?
【发布时间】:2010-11-18 22:06:39
【问题描述】:

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

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

set diffopt+=iwhite

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

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

【问题讨论】:

    标签: vim diff vimdiff


    【解决方案1】:

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

    来自vim docs的相关部分:

    白白

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

    还请注意,您可以通过设置diffexpr 来提供自定义差异命令行。请参阅vimdiff man page 上的讨论,特别是:

    “diffexpr”选项可以设置为使用标准以外的其他内容 “diff”程序比较两个文件并找出差异。

    当 'diffexpr' 为空时,Vim 使用该命令查找差异 文件 1 和文件 2 之间:

    diff file1 file2 > outfile
    

    【讨论】:

    • 这不会忽略所有空格(-w in diff),而是实现忽略对空格的更改(-b in diff)。
    【解决方案2】:

    这实现了你想要的(取自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

    【讨论】:

    • 这应该是公认的答案,因为它是目前唯一正确的答案。太糟糕了 vim 没有一个简单的选项来在“diff -b”和“diff -w”之间切换,它几乎没有用处。
    • 不知何故我的vim(版本8,Debian Stretch)在:diffupdate之后闪烁并显示一个空白屏幕,仅在PageUpPagDown之后重新绘制正确的屏幕。很奇怪……
    • @DrBeco:这不是解决问题的好地方,但我会先看看你是否有 gvim 的问题(假设你有一个 GUI)。如果没有,可以尝试不同的终端仿真器或不同的$TERM 定义(如“xterm-color”或“xterm-256color”,甚至只是“xterm”)。否则,我建议搜索网络,如果没有帮助,搜索然后在vi.SE 中询问。对于解决方法,Ctrl+L 可能会起作用。也许还可以尝试更改语法突出显示。
    • 它在我的 vimdiff 中不起作用。结果好像只执行了 set diffopt+=iwhite
    • @ka3ak – 确保您可以从命令行运行diff -a --binary -i -w FILE1 FILE2,并且它可以根据您的喜好处理空白。如果是这样,也许尝试使用该diff 命令的绝对路径。如果您需要进一步的帮助,最好在vi.SE 上询问有关它的详细问题。这类网站上的评论,尤其是那些缺乏细节的评论,不会为您提供您所寻求的那种帮助;你需要问一个问题。
    【解决方案3】:

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

    set diffopt+=iwhite
    
    set diffexpr=""
    

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

    【讨论】:

    • 不,这实现了 diff -b,而不是 diff -w 作为问题请求。亚当 K 在这里有唯一正确的答案。
    • 谢谢!只是 "set diffopt+=iwhite" 已经很​​有用了,因为它是从 vimdiff 本身以交互方式发出的。
    【解决方案4】:

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

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

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

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

    【讨论】:

      【解决方案5】:

      对于那些在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/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-20
        • 2020-07-02
        • 1970-01-01
        相关资源
        最近更新 更多