在Vim中正确的html属性突出显示?

joh*_*nyq 1 html vim syntax-highlighting

当我在Vim中寻找正确的html标签突出显示时,我发现了这篇文章.但在查看了romainl的答案(以及他的截图)和html语法文件之后,我想知道如何在属性之后更改=(等号)的颜色以匹配属性的颜色而不更改html标签的颜色?

rom*_*inl 8

  1. 勘探

    这是一个非常有用的功能,我发现在某个地方(很久以前,可能在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()才能获得正确的语法组.

  2. 反射

    根据我们到目前为止收集的信息,很明显标签名称(['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,牛仔风格.

  3. 行动

    第一步是制作默认HTMl语法文件的本地副本:

    $ cp /usr/share/vim/vim73/syntax/html.vim ~/.vim/syntax/html.vim
    
    Run Code Online (Sandbox Code Playgroud)

    下一步是编辑此文件.我们将进行两项更改:

    1. 添加htmlEqualSign语法组的定义

      第44行应该是(注意!未经过彻底测试.):

      syn match htmlEqualSign contained "="
      
      Run Code Online (Sandbox Code Playgroud)
    2. 添加htmlEqualSignhtmlTag

      第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)