【问题标题】:Getting gVim's vimdiff to ignore case让 gVim 的 vimdiff 忽略大小写
【发布时间】:2011-01-28 15:50:42
【问题描述】:

我正在尝试比较两个汇编文件,其中一个全部大写,另一个小写。许多行在大小写和空格之前都是相同的。

我尝试了以下方法,而两个缓冲区处于差异模式:

:set diffopt+=icase
:set diffopt+=iwhite
:diffupdate

空白的东西似乎运作良好,但忽略大小写并没有发挥作用。比如下面两行:

            I0=R0;              // ADDRESS OF INPUT ARRAY

    i0 = r0;            // address of input array

[第一行以 12 个空格开头,第二行以单个制表符开头]

为什么?我能做什么?

更新:刚刚注意到在这两行中所有差异都被忽略了 OK:

                                // MULTIPLY R1 BY 4 TO FETCH DATA OF WORD LENGTH
                        // multiply r1 by 4 to fetch data of word length

【问题讨论】:

标签: vim vimdiff ignore-case


【解决方案1】:

您的比较失败是因为空格,而不是因为大小写。发生这种情况是因为当您在后台使用 iwhite 选项时,vimdiff 正在执行 diff -b,这对于比较空格的方式比您要查找的内容更严格。更具体地说,-b 选项仅忽略已经有空格的空格数量的差异。在您的示例中,i0 = r0; 被标记为与 I0=R0; 不同,因为一个字符之间包含空格,而另一个不包含空格。

根据 vimdiff 文档,您可以通过将 diffexpr 设置为非空值来覆盖 iwhite 选项的默认行为。您感兴趣的 diff 标志是 --ignore-all-space,它对空格更灵活。您可以更改 vimdiff 中的 diffexpr 以使用此选项而不是默认的 -b 选项,如下所示:

set diffexpr=MyDiff()
function MyDiff()
   let opt = ""
   if &diffopt =~ "icase"
     let opt = opt . "-i "
   endif
   if &diffopt =~ "iwhite"
     let opt = opt . "--ignore-all-space "
   endif
   silent execute "!diff -a --binary " . opt . v:fname_in . " " . v:fname_new .
    \  " > " . v:fname_out
endfunction

查看文档了解更多详情:

http://vimdoc.sourceforge.net/htmldoc/options.html#%27diffopt%27

【讨论】:

  • 感谢您的回答。您对第一行缺少空格的观察非常有意义。现在,问题是如何在: 提示符下使用一个简单的(可能是一条线)命令来实现--ignore-all-space 功能?阅读您的函数,我想如果我 知道 我需要/想要什么,则不需要 if-endif 结构。那么,无论如何从命令提示符处执行--ignore-all-space,处理现有的打开缓冲区?
【解决方案2】:

以下对我很有效:

vimdiff +"set diffopt+=icase"  file_1.txt file_2.txt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多