如何使用VIM在CoffeeScript中嵌入HTML字符串语法?

时间:2013-01-26 03:56:12

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

我已经了解了如何在HTML syntax highlighting in javascript strings in vim的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语法?

2 个答案:

答案 0 :(得分:1)

我将按以下步骤进行:

找出应该以纯html突出显示的语法组。将html语法高亮显示添加到这些组。

要在光标下找到有效的语法组,您可以按照here

的说明进行操作

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

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

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

因为如果你将这些行添加到coffee.vim,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()

答案 1 :(得分: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模式进行匹配。这是有效的,因为这个语法文件是在coffeescript插件的语法定义之后加载的,所以我们有机会在更一般的匹配(coffeeHeredoc区域)发生之前进行更具体的匹配(包含HTML的heredoc)

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

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

syntax include @HTML syntax/html.vim

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