忽略vimdiff输出中包含特定单词的行

rav*_*avi 12 vim vimdiff

我有两个大文件采取vimdiff.在vimdiff输出中,我想忽略显示diff但有特定单词的行.

例如,在我的情况下,我想忽略WARNING: 我的文件中带有前缀的所有行的差异.

谢谢,

san*_*uel 7

为了实现这一点,您可以将以下内容添加到.vimrc中(通过:h diffexpr在vim中运行找到的示例中的简单修改):

set diffexpr=MyDiff()
function! MyDiff()
    let opt = ""
    if exists("g:diffignore") && g:diffignore != ""
        let opt = "-I " . g:diffignore . " "
    endif
    if &diffopt =~ "icase"
        let opt = opt . "-i "
    endif
    if &diffopt =~ "iwhite"
        let opt = opt . "-b "
    endif
    silent execute "!diff -a --binary " . opt . v:fname_in . " " .
        \ v:fname_new . " > " . v:fname_out
endfunction
Run Code Online (Sandbox Code Playgroud)

值得注意的是,-I(或--ignore-matching-lines=)开关提供的功能diff只会忽略任何更改的行,其中两个(或所有)文件中的行与此表达式匹配.

有关此man diff更多详细信息,请参阅有关--ignore-matching-lines=RE交换机和:h diffexprvim内的更多详细信息.

编辑:添加了可选变量g:diffignore来控制要使用的模式.也用于function!强制更换定义.


pdj*_*ota 3

为什么不在调用 vimdiff 之前过滤文件?

grep -v "^WARNING" file1 > file1_w; 
grep -v "^WARNING" file2 > file2_w; 
vimdiff file1_w file2_w
Run Code Online (Sandbox Code Playgroud)

如果您使用的是Bashzsh,则可以使用单个命令来完成此操作:

vimdiff <(grep -v "^WARNING" file1) <(grep -v "^WARNING" file2)
Run Code Online (Sandbox Code Playgroud)

  • 这不允许直接编辑。一般来说,目的是直接就地编辑 file2,除了被忽略的行。 (4认同)