【问题标题】:Limit vim syntax highlighting to diff将 vim 语法高亮限制为 diff
【发布时间】:2015-04-05 02:48:46
【问题描述】:

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

我想要的是将一些语法突出显示限制在 diff 部分。

我特别需要突出显示 TABS,但仅突出显示在 DiffAddDiffChange 部分/区域中的那些 TABS。

我尝试了什么

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

sn-p 上方突出显示 TESTRGN 中的前导 TABS,其余文件中的选项卡保持未突出显示。

但是,如果我在 syntax match 行中将 TESTRGN 更改为 DiffAdd,它就不会像我预期的那样工作。

我的理解是DiffAdd 不是使用syntax region ... 定义的区域,因此containedin=DiffAdd 不起作用。

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

【问题讨论】:

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


    【解决方案1】:

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

    在 Vim 中,定义了语法组,然后将其链接到高亮组中定义的颜色和属性。 diff 的东西使用了该机制的第二部分,而不是语法部分。因此,很遗憾,您无法在 :syntax 命令中引用差异区域。

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

    【讨论】:

    • '到处都突出显示有什么不好':在代码中添加新标签在许多地方被认为是禁忌。因此,为这种情况添加了破坏性语法突出显示 - 暗红色!。对于现有的选项卡,它实际上是无关紧要的。但是忽略它仍然非常具有破坏性。所以我认为可能有更好的方法......
    • 如果我在这样的区域上方/下方添加新行,Diff* 高亮如何工作?他们的行号会自动移动。那么它是基于行号还是基于某些规则?
    • Vim 内置了差异化功能;它不是基于语法的,而是在内部触发的。
    【解决方案2】:

    虽然您需要在行更改时重新设置,但这只是基于行号的想法之一的提示,您可以通过以下方式获取所有差异突出显示行的列表:

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

    【讨论】:

      猜你喜欢
      • 2012-08-16
      • 2011-04-20
      • 2014-11-14
      • 2011-01-19
      • 2015-08-08
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多