我正在更改现有的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
不起作用。
那么有什么方法/解决方法来做我想做的事情吗?
答案 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"'), "\\|") . "\\).*/"