【问题标题】:How to embed HTML string syntax in CoffeeScript using VIM?如何使用 VIM 在 CoffeeScript 中嵌入 HTML 字符串语法?
【发布时间】:2013-01-26 03:56:12
【问题描述】:

我研究了如何将 HTML 语法嵌入到来自 HTML syntax highlighting in javascript strings in vim 的 JavaScript 字符串中。

但是,当我使用 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 语法?

【问题讨论】:

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


    【解决方案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
    

    由于 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()
    

    【讨论】:

    • @user1126332,现在我的 HTML 语法在 coffeeHeredoc 区域内工作。但是,coffeescript 的其余部分现在没有语法高亮。什么可以做错? syntax/html.vim 似乎清除了咖啡语法。
    【解决方案2】:

    在尝试使其正常工作时,我也遇到了各种问题。经过一些实验,这就是我想出的。只需使用以下内容创建.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 文件中。使用相对语法包括,la

    syntax include @HTML syntax/html.vim
    

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

    【讨论】:

      猜你喜欢
      • 2010-12-01
      • 2012-10-29
      • 2012-03-18
      • 2016-11-21
      • 2020-03-17
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      相关资源
      最近更新 更多