在尝试使其正常工作时,我也遇到了各种问题。经过一些实验,这就是我想出的。只需.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 可能相当简单。