我已经了解了如何在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语法?
答案 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字符串中可能相当简单。