当我在 Vim 中寻找合适的 html 标签突出显示时,我发现了这篇文章。但是在查看了 romainl 的答案(和他的截图)和 html 语法文件之后,我想知道如何在不改变 html 标记颜色的情况下更改属性后 = (等号)的颜色以匹配属性的颜色?
1 回答
勘探
这是我在某处(很久以前,可能在 Vim Wiki 上)找到的一个非常有用的函数,它为您提供光标下单词/符号的语法组:
function! SynStack() if !exists("*synstack") return endif echo map(synstack(line('.'), col('.')), 'synIDattr(v:val, "name")') endfunc
只需将光标放在要检查的项目上并键入
:call SynStack()
以在命令行中回显语法组。如果我将光标放在
=
in上<div id="example"></div>
,则输出SynStack()
是['htmlTag']
。随着光标的出现,
<>
我也得到['htmlTag']
了。将光标放在
div
我得到['htmlTag', 'htmlTagN', 'htmlTagName']
这意味着div
(h1
,p
...) 的颜色是通过一个称为htmlTagName
继承自的特殊语法组定义的htmlTag
。一些替代/自定义语法文件可能会定义名称略有不同的其他语法组,因此我的示例仅对我有效。您必须尝试
SynStack()
获得正确的语法组。反射
根据我们迄今为止收集到的信息,很明显标签名称 (
['htmlTagName']
) 可以独立于标签的其余部分设置样式,但似乎无法突出显示=
不同之处。因为它是与 相同的语法组的一部分,<>
所以=
必须以相同的方式突出显示。我们有两种可能:
一个。
<
,颜色相同,颜色=
不同。>
div
湾。
<
,div
,=
和>
都是相同的颜色。原始主题遵循
a
我不喜欢的路径,所以我不得不b
在我对上一个问题的回答中使用几行对其进行一点自定义(路径):hi htmlTag guifg=#90b0d1 gui=NONE hi htmlSpecialTagName guifg=#90b0d1 gui=NONE hi htmlTagName guifg=#90b0d1 gui=NONE hi htmlEndTag guifg=#90b0d1 gui=NONE
事实上,不可能有
=
不同的颜色。<>
如果我们想着色,=
我们将编辑 HTML 语法文件和你的颜色方案,牛仔风格。行动
第一步是制作默认 HTMl 语法文件的本地副本:
$ cp /usr/share/vim/vim73/syntax/html.vim ~/.vim/syntax/html.vim
下一步是编辑此文件。我们将执行两个更改:
添加
htmlEqualSign
语法组的定义第 44 行应该是(注意!未经彻底测试。):
syn match htmlEqualSign contained "="
添加
htmlEqualSign
到htmlTag
组第 40 行
~/.vim/syntax/html.vim
应更改为:syn region htmlTag start=+<[^/]+ end=+>+ contains=htmlTagN,htmlString,htmlArg,htmlValue,htmlTagError,htmlEvent,htmlCssDefinition,@htmlPreproc,@htmlArgCluster
至:
syn region htmlTag start=+<[^/]+ end=+>+ contains=htmlTagN,htmlString,htmlArg,htmlValue,htmlTagError,htmlEvent,htmlCssDefinition,@htmlPreproc,@htmlArgCluster,htmlEqualSign
最后一步是编辑您的配色方案,使其
=
按照您想要的方式着色。你可以通过在你的配色方案中的某处添加这一行来做到这一点:hi htmlEqualSign guifg=#00ff00
当然,您可以选择颜色。
但我认为您希望与(从您的问题中不是很清楚)
=
相同的颜色。id
为此,我们将组“链接”htmlEqualSign
到用于属性的组。再次,:call SynStack()
有很大帮助:属性的语法组是htmlArg
这样添加到您的颜色方案的行将是:hi link htmlEqualSign htmlArg