我有一个脚本,它读取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
。
答案 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文件中添加任何内容。