限制vim语法突出显示为diff

时间:2015-02-05 09:47:10

标签: vim syntax-highlighting vim-syntax-highlighting vimdiff

我正在更改现有的C代码。如果我只是想检查一下我的更改,我可以轻松地使用vimdiff来查看我的更改。修改过的文件。

我想要的是将一些语法高亮限制为diff部分。

特别是我需要强调TABS,但只包含DiffAdd和{}中包含的那些TABS。 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&内的主要TABS。剩余文件中的标签保持不突出显示。

但是,如果我在syntax match行中将TESTRGN更改为DiffAdd,则它无法正常工作。

我的理解是DiffAdd不是使用syntax region ...&因此containedin=DiffAdd不起作用。

那么有什么方法/解决方法来做我想做的事情吗?

2 个答案:

答案 0 :(得分:0)

首先,到处都有突出显示有什么不好?差异突出显示很好,因此提供了可见的范围;难道你不能忽视其他地方的突出显示吗?

在Vim中,定义了语法组,然后将其链接到突出显示组中定义的颜色和属性。差异填充使用该机制的第二部分,但不是语法部分。因此,遗憾的是,您无法在:syntax命令中引用差异区域。

对此只有一个非常难看的解决方法:您必须确定具有差异突出显示的行号(通过]c动作反复执行更改,和/或使用synID()来检查用于差异突出显示)。使用这些行号,您可以使用仅与某些行匹配的特殊:syntax match原子定义\%l命令。当然,任何行的添加/删除都会使您的定义无效,这些定义需要经常重新同步(由:autocmd触发)。这是一项很大的努力而不是忽视其他地方的突出显示。

答案 1 :(得分:0)

虽然您需要在更改线路时重置,但这只是基于行号的一个提示的提示,您可以获得所有差异突出显示行的列表:

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"'), "\\|") . "\\).*/"