Ограничить подсветку синтаксиса vim до diff

Я вношу изменения в существующий код C. Если я просто хочу проверить свои изменения, я могу легко использовать для этого vimdiff со старыми и измененными файлами.

Я хочу ограничить подсветку синтаксиса только частью diff.

В частности, мне нужно выделить ВКЛАДКИ, но только те ВКЛАДКИ, которые содержатся в DiffAdd и DiffChange разделах/регионах.

Что я пробовал:

syntax region TESTRGN start="TESTRGN_START" end="TESTRGN_END"
highlight TESTRGN ctermbg=lightgreen guibg=lightgreen

syntax match LeadingTabsInRegion display contained containedin=TESTRGN /^\( *\t\+\)\+/
highlight LeadingTabsInRegion ctermbg=darkred guibg=darkred

Вышеприведенный фрагмент выделяет ведущие ВКЛАДКИ в пределах TESTRGN, а вкладки в оставшемся файле остаются невыделенными.

Однако, если я изменю TESTRGN на DiffAdd в строке syntax match, это не сработает так, как я ожидал.

Насколько я понимаю, DiffAdd не является регионом, определенным с помощью syntax region ..., и, следовательно, containedin=DiffAdd не работает.

Итак, есть ли какой-либо метод/обходной путь для выполнения того, что я пытаюсь сделать?


person anishsane    schedule 05.02.2015    source источник


Ответы (2)


Во-первых, что плохого в том, что везде есть подсветка? Подсветка различий хорошо выделяется и, следовательно, обеспечивает видимый объем; не могли бы вы просто игнорировать выделение в другом месте?

В Vim определяются синтаксические группы, которые затем связываются с цветами и атрибутами, определенными в группах выделения. В diff используется вторая часть этого механизма, но не синтаксическая часть. Поэтому, к сожалению, вы не можете ссылаться на регионы различий в :syntax командах.

Для этого есть только очень уродливый обходной путь: вам нужно определить номера строк, которые имеют подсветку различий (путем многократного прохождения изменений с помощью движения ]c и/или использования synID() для проверки выделения различий). С этими номерами строк вы можете определить :syntax match команды со специальным атомом \%l, который соответствует только определенным строкам. Конечно, любое добавление/удаление строк приведет к аннулированию ваших определений, которые необходимо будет часто повторно синхронизировать (запускается :autocmd). Это много усилий по сравнению с простым игнорированием выделения в другом месте.

person Ingo Karkat    schedule 05.02.2015
comment
«Что плохого в том, чтобы подсвечивать везде»: во многих местах добавление новых вкладок в код считается запретным. Следовательно, добавление разрушительной подсветки синтаксиса для таких случаев — темно-красный! Для существующих вкладок на самом деле все равно. Но игнорировать это все еще очень разрушительно. Вот я и подумал, что есть способ лучше... - person anishsane; 05.02.2015
comment
Как работает выделение Diff*, если я добавляю новую строку выше/ниже такой области? Их номера строк автоматически сдвигаются. Так это основано на номере строки или на каком-то правиле? - person anishsane; 05.02.2015
comment
Vim имеет встроенную функцию сравнения; это не основано на синтаксисе, а срабатывает внутри. - person Ingo Karkat; 07.02.2015

Хотя вам нужно сбрасывать всякий раз, когда строка была изменена, это всего лишь подсказка для одной из идей, основанных на номере строки, вы можете получить список всех выделенных строк с различиями с помощью:

let dl = filter(range(1, line('$')),
        \'index([hlID("DiffChange"), hlID("DiffText"), hlID("DiffAdd")],
            \diff_hlID(v:val, 1)) != -1')

И, используя это, можно было бы установить TESTRGN с помощью:

exec "syntax match TESTRGN /\\(" . join(map(dl, '"\\%" . v:val . "l"'), "\\|") . "\\).*/"
person Rick Howe    schedule 05.02.2015