joh*_*nyq 1 html vim syntax-highlighting
当我在Vim中寻找正确的html标签突出显示时,我发现了这篇文章.但在查看了romainl的答案(以及他的截图)和html语法文件之后,我想知道如何在属性之后更改=(等号)的颜色以匹配属性的颜色而不更改html标签的颜色?
勘探
这是一个非常有用的功能,我发现在某个地方(很久以前,可能在Vim Wiki上),它为你提供了光标下单词/符号的语法组:
function! SynStack()
if !exists("*synstack")
return
endif
echo map(synstack(line('.'), col('.')), 'synIDattr(v:val, "name")')
endfunc
Run Code Online (Sandbox Code Playgroud)
只需将光标放在要检查的项目上,然后键入: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
Run Code Online (Sandbox Code Playgroud)
实际上,不可能有=
不同颜色的颜色<>
.如果我们想要着色,=
我们将编辑HTML语法文件和您的colorscheme,牛仔风格.
行动
第一步是制作默认HTMl语法文件的本地副本:
$ cp /usr/share/vim/vim73/syntax/html.vim ~/.vim/syntax/html.vim
Run Code Online (Sandbox Code Playgroud)
下一步是编辑此文件.我们将进行两项更改:
添加htmlEqualSign
语法组的定义
第44行应该是(注意!未经过彻底测试.):
syn match htmlEqualSign contained "="
Run Code Online (Sandbox Code Playgroud)添加htmlEqualSign
到htmlTag
组
第40行~/.vim/syntax/html.vim
应改为:
syn region htmlTag start=+<[^/]+ end=+>+ contains=htmlTagN,htmlString,htmlArg,htmlValue,htmlTagError,htmlEvent,htmlCssDefinition,@htmlPreproc,@htmlArgCluster
Run Code Online (Sandbox Code Playgroud)
至:
syn region htmlTag start=+<[^/]+ end=+>+ contains=htmlTagN,htmlString,htmlArg,htmlValue,htmlTagError,htmlEvent,htmlCssDefinition,@htmlPreproc,@htmlArgCluster,htmlEqualSign
Run Code Online (Sandbox Code Playgroud)最后一步是编辑colorscheme,使其=
以您想要的方式着色.你可以通过在colorscheme中的某处添加这一行来实现:
hi htmlEqualSign guifg=#00ff00
Run Code Online (Sandbox Code Playgroud)
当然,您可以选择颜色.
但我认为你想要=
的颜色是相同的id
(你的问题不是很清楚).为此,我们将htmlEqualSign
组"链接" 到用于属性的组.同样,:call SynStack()
有很大的帮助:属性的语法组是htmlArg
这样,添加到colorscheme的行将是:
hi link htmlEqualSign htmlArg
Run Code Online (Sandbox Code Playgroud)