0

我已经从vim 中的 javascript 字符串中的 HTML 语法高亮显示中查看了如何在 JavaScript 字符串中嵌入 HTML 语法。

但是,当我使用 CoffeeScript 时,我无法通过coffee.vim以类似方式编辑语法文件来获得相同的效果。我得到了递归错误,其中包括html.vim使它过于嵌套。

我在 CoffeeScript 中有一些 HTML 模板,如下所示:

angular.module('m', [])
  .directive(
    'myDirective'
    [
      ->
        template: """
        <div>
          <div>This is <b>bold</b> text</div>
          <div><i>This should be italic.</i></div>
        </div>
        """
    ]
  )

如何在 VIM 中正确突出显示 CoffeeScript 字符串中的模板 HTML 语法?

4

2 回答 2

1

我将按如下方式进行:

找出应该作为纯 html 突出显示的语法组。向这些组添加 html 语法突出显示。

要查找光标下的有效语法组,您可以按照此处的说明进行操作。

在您的示例中,感兴趣的语法组是coffeeHereDoc.

要向该组添加 html 突出显示,请执行以下命令

unlet b:current_syntax
syntax include @HTML syntax/html.vim
syn region HtmlEmbeddedInCoffeeScript start="" end=""
\    contains=@HTML containedin=coffeeHereDoc

由于 vim 抱怨递归,如果你将这些行添加到coffee.vim我会使用自动命令:

function! Coffee_syntax()
    if !empty(b:current_syntax)
        unlet b:current_syntax
    endif
    syn include @HTML syntax/html.vim
    syn region HtmlEmbeddedInCoffeeScript start="" end="" contains=@HTML
\       containedin=coffeeHereDoc
endfunction

autocmd BufEnter *.coffee call Coffee_syntax()
于 2013-01-27T10:18:12.460 回答
0

在尝试使其正常工作时,我也遇到了各种问题。经过一些实验,这就是我想出的。只需.vim/after/syntax/coffee.vim使用以下内容创建:

unlet b:current_syntax
syntax include @HTML $VIMRUNTIME/syntax/html.vim
syntax region coffeeHtmlString matchgroup=coffeeHeredoc
\      start=+'''\\(\\_\\s*<\\w\\)\\@=+ end=+\\(\\w>\\_\\s*\\)\\@<='''+ 
\      contains=@HTML
syn sync minlines=300

unlet b:current_syntax行禁用当前语法匹配,并让 HTML 语法定义接管匹配区域。

使用 html.vim 包含的绝对路径可以避免递归问题(下面将详细介绍)。

区域定义匹配看起来像是包含 HTML 的 heredoc 字符串。具体来说,开始模式查找三个单引号,后跟一个看起来像 HTML 标记开头的东西(两者之间可以有空格),而结束模式查找一个 HTML 标记的结尾,后跟三个单引号。看起来不包含 HTML 的 Heredoc 字符串仍然使用该coffeeHeredoc模式进行匹配。这是有效的,因为这个语法文件是在咖啡脚本插件的语法定义之后加载的,所以我们有机会在更一般的匹配(coffeeHeredoc区域)发生之前进行更具体的匹配(包含 HTML 的 heredoc)。

syn sync minlines=300扩大了匹配区域。我嵌入的 HTML 字符串有时会超过 50 行,而且 Vim 的语法高亮器会对如何高亮字符串感到困惑。为了完全保证,您可以使用syn sync fromstart,但是对于大文件,理论上这可能很慢(我没有尝试过)。

@heartbreaker 最初遇到的递归问题是由插件附带的 html.vim 脚本引起的vim-coffeescript(我假设正在使用该脚本)。该插件的 html.vim 文件包含其 coffee.vim 语法文件,以将咖啡脚本突出显示到 HTML 文件中。使用相对语法 include, a la

syntax include @HTML syntax/html.vim

您可以在 VIM 的运行时路径中获得所有的 syntax/html.vim 文件,包括来自 coffeescript 插件的文件(其中包括 coffee.vim,因此是递归)。使用绝对路径将限制您仅获取您指定的特定语法文件,但这似乎是一个合理的权衡,因为嵌入到咖啡脚本字符串中的 HTML 可能相当简单。

于 2013-02-25T01:57:55.897 回答