自定义Vim HTML语法

时间:2011-03-10 23:30:26

标签: html syntax-highlighting vim vim-syntax-highlighting

我有一个脚本,它读取HTML文件并用Perl设置的值替换~%foo%~的出现次数。像这样:

<span class="~%classname%~">~%hi_mom%~</span>

会在浏览器中产生类似的内容:

<span class="classyclass">Hello World</span>

是的,所以我想使用Vim语法高亮来区分HTML中的出现~%foo%~。默认情况下,HTML语法突出显示将使HTML元素的属性值为Magenta,我希望~%foo%~部分为DarkMagenta。我在正确的轨道上,因为如果我注释掉tokenQuoted行(或标记行),我会得到所需的结果,但是如果匹配和突出显示未注释,则标记突出显示会覆盖tokenQuoted突出显示。

syntax match token       containedin=ALLBUT,htmlString,htmlValue '\~%[^%]\+%\~'
syntax match tokenQuoted containedin=htmlString,htmlValue        '\~%[^%]\+%\~'
" tokenQuoted assumes htmlString/htmlValue (:highlight String) is Magenta
highlight token          term=none ctermfg=White       guifg=White
highlight tokenQuoted    term=none ctermfg=DarkMagenta guifg=DarkMagenta

我正在使用的文件来源于默认html.vim来源 autocmd *.html ~/.vim/syntax/html.vim中的.vimrc

1 个答案:

答案 0 :(得分:2)

问题在于token匹配未被排除在tokenQuoted匹配中。要获得所需的结果,即突出显示与非引用标记不同的引用标记,请在语法文件中使用以下内容。

syntax match token       containedin=ALLBUT,htmlString,htmlValue,tokenQuoted '\~%[^%]\+%\~'
syntax match tokenQuoted containedin=htmlString,htmlValue        '\~%[^%]\+%\~'
highlight token          term=none ctermfg=White       guifg=White
highlight tokenQuoted    term=none ctermfg=DarkMagenta guifg=DarkMagenta

或者,如果使用语法区域而不是匹配是有意义的,请将上面的语法匹配行替换为以下内容。

syntax region token       contained start=+\~%+ end=+%\~+ containedin=ALLBUT,htmlString,tokenQuoted
syntax region tokenQuoted contained start=+\~%+ end=+%\~+ containedin=htmlString   

我想我还应该提一下,当我测试这个时,我刚刚创建了文件~/.vim/syntax/html.vim并添加了上述内容。没有必要在我的.vimrc文件中添加任何内容。