игнорировать строки с определенными словами в выводе vimdiff

У меня есть 2 больших файла, чтобы взять vimdiff. В выводе vimdiff я хочу игнорировать строки, показывающие разницу, но с определенным словом.

например в моем случае я хочу игнорировать diff всех строк с префиксом WARNING: в моих файлах.

Спасибо,


person ravi    schedule 14.01.2012    source источник


Ответы (3)


Для этого вы можете добавить следующее в свой .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

Примечательно, что функциональные возможности, предоставляемые переключателем -I (или --ignore-matching-lines=) для diff, будут ТОЛЬКО игнорировать любые измененные строки, в которых строка в ОБЕИХ (или во всех) файлах соответствует этому выражению.

См. man diff для получения дополнительных сведений о переключателе --ignore-matching-lines=RE и :h diffexpr в vim для получения дополнительных сведений об этом.

РЕДАКТИРОВАТЬ: добавлена ​​необязательная переменная g:diffignore для управления используемым шаблоном. Также используется function! для принудительной замены по определению.

person sanmiguel    schedule 03.04.2012
comment
Я надеялся, что у кого-то еще есть эта идея. Спасибо, что избавили меня от необходимости самому взломать мой .vimrc. Иногда я делюсь этим, поэтому отдаю вам должное. ;-) - person Michael Scheper; 21.03.2014
comment
Чтобы помочь относительному новичку в VIM, как установить g:diffignore? Что за префикс g? - person drevicko; 08.04.2016
comment
Хорошо, поэтому вы можете установить его с помощью :let g:diffignore='"your regex"' (кавычки не позволяют ему разбиваться на пробелы при построении командной строки, один набор съедается vim, другой для командной строки). Вам также необходимо сделать :diffupdate, чтобы он вступил в силу. - person drevicko; 08.04.2016

Почему бы вам не отфильтровать файлы перед вызовом vimdiff?

grep -v "^WARNING" file1 > file1_w; 
grep -v "^WARNING" file2 > file2_w; 
vimdiff file1_w file2_w

Если вы используете Bash или zsh, вы можете сделать это с помощью одной команды:

vimdiff <(grep -v "^WARNING" file1) <(grep -v "^WARNING" file2)
person pdjota    schedule 14.01.2012
comment
Это не позволяет прямое редактирование. Обычно целью было бы редактировать file2 прямо на месте, за исключением игнорируемых строк. - person ralfoide; 17.12.2013

Я долго искал решение этой проблемы и нашел плагин EnhancedDiff быть самым простым решением, которое сделает ваши различия немного умнее :)

1. Установка (https://github.com/chrisbra/vim-diff-enhanced#installation)

Используйте менеджер плагинов по вашему выбору:

  • Pathogen
    • git clone https://github.com/chrisbra/vim-diff-enhanced.git ~/.vim/bundle/vim-enhanced-diff
    • :Helptags (требуется только один раз после установки для установки документации)
  • NeoBundle
    • NeoBundle 'chrisbra/vim-diff-enhanced'
  • Vundle
    • Plugin 'chrisbra/vim-diff-enhanced'
  • Vim-Plug
    • Plug 'chrisbra/vim-diff-enhanced'

2. Как обычно

Используя, например, vimdiff, nvim -d или diffthis

3. Установите фильтр.

:EnhancedDiffIgnorePat ^WARNING:.*

4. Повторное сравнение

:diffupdate
person Wolph    schedule 01.03.2019