让Vim正确突出显示脚本类型为"text/html"

5
如何让Vim在这种情况下正确地进行语法高亮(例如,与Knockout模板一起使用)?
<script type="text/html" id="my-template">
  <!-- This should be rendered as HTML -->
  <div>Some template</div>
</script>

<script>
  //This should be rendered as Javascript
  var x = function() { return 3; }
</script>

这里提供的解决方案需要编辑Vim的内部语法文件,这似乎是错误的,而且它特别寻找 "text/javascript",但在<script>标签中不再需要

我猜想解决方案是一种语法插件,我可以将其保留在我的.vim目录中,但我对Vim的语法内部机制不够熟悉,无法弄清楚。

(请注意,此问题和答案不适用于我,因为我没有使用Ruby on Rails。)


显然,您需要编辑HTML语法脚本和/或JavaScript语法脚本,因为它们非常陈旧。当您遇到困难时,请尝试一些东西并回来提出一个真正可行的问题。 - romainl
对,我“不熟悉Vim的语法内部以找出解决方法”。至少提供一个起点会很有帮助。 - Dan
2个回答

2
也许这会对你有所帮助:https://coderwall.com/p/vgk5-q/make-vim-play-nice-with-html-templates-inside-script-tags。如果上面的链接失效了,请将以下代码放入~/.vim/after/syntax/html.vim文件中:
unlet b:current_syntax
syn include @HTML $VIMRUNTIME/syntax/html.vim
syn region htmlTemplate start=+<script [^>]*type *=[^>]*text/template[^>]*>+
\                       end=+</script>+me=s-1 keepend
\                       contains=@HTML,htmlScriptTag,@htmlPreproc

有人应该为此编写一个插件!;)

当然,为了更适合OP的情况,请将[^>]*text/template[^>]替换为[^>]*text/html[^>] - Steve Jorgensen

1
首先将vim内部的html语法文件复制到$HOME/.vim/syntax/html.vim,这样你只会改变自己的行为而不是全局性的更改。
然后找到以syn region javaScript开头的行,并用两行替换它。
syn region  script_notype start=+<script>+ keepend end=+</script>+me=s-1 contains=@htmlJavaScript,htmlCssStyleComment,htmlScriptTag,@htmlPreproc
syn region  script_jstype start=+<script[^>]*type="text/javascript"[^>]*>+ keepend end=+</script>+me=s-1 contains=@htmlJavaScript,htmlCssStyleComment,htmlScriptTag,@htmlPreproc

第一行是用于普通的 <script> 标签,第二行是用于带有 type="text/javascript" 属性的 <script> 标签。
然而,这并不适用于没有其他属性的 <script> 标签。这种情况应该使用 JavaScript 语法,但实际上却没有。我想这只是一个小问题。

这对于 <script type="text/html"> 是有效的,但是 <script type="text/javascript"> 不再正确格式化。 - Dan
@Dan:你能再确认一下是否设置了相同的选项吗?对我而言,即使针对<script type="text/javascript">,它也能正常工作。 - buff
很抱歉,我恐怕无法解决这个问题。在我的机器上它完美运行,在你的机器上却不行...试着调试一下,相信你最终能让它正常工作。 - buff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接