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)