在vim中为.ejs文件进行语法高亮

48

如何使vim高亮ejs(http://embeddedjs.com/)文件? 是否可以为该文件设置HTML高亮,并为<% %>内部的JavaScript部分设置高亮? 感谢你的帮助!

6个回答

76

感谢 @inkedmn,我想指出的是HTML绑定工作效果更好,因此请将以下内容放入您的~/.vimrc文件中:

au BufNewFile,BufRead *.ejs set filetype=html

27

4
这很棒,如果你和我一样,可能只想获取 https://github.com/briancollins/vim-jst/blob/master/syntax/jst.vim 文件,并将其包含在你的 $HOME/.vimrc 文件中,方式是:au BufNewFile,BufRead *.ejs so $HOME/.vim/jst.vim。 - todd
3
不错。我刚刚安装了Vundle,然后在我的~/.vimrc中添加了Bundle 'briancollins/vim-jst' - Jason Swett
看起来 *.ejs 的正确文件关联应该是 au BufRead,BufNewFile *.ejs setf javascript.jsx - thom_nic

8
我将下载此语法文件并直接存放到~/.vim/syntax目录中,这样可以获得最佳结果。

2
为了使用这个文件,我必须在我的 .vimrc 中添加以下内容: au BufNewFile,BufRead *.ejs set filetype=ejs - Ultrasaurus

3

如果你想使用适当的javascript和html语法(而不依赖于任何第三方javascript插件)来解决问题,那么你需要一个ftdetect文件,在加载具有.ejs扩展名的文件时运行autocmd,并结合一个ejs语法文件。

如果你不关心它是如何工作的,我已经在github上准备了一个软件包here。如果使用Vundle,只需将以下内容添加到您的 .vimrc 文件中:

Bundle 'nikvdp/ejs-syntax'

要自己完成这个任务,需要在您的~/.vim文件夹中创建两个文件:
一个是ftdetect文件:~/.vim/ftdetect/ejs.vim:
autocmd BufNewFile,BufRead *.ejs set filetype=ejs
autocmd BufNewFile,BufRead *._ejs set filetype=ejs

function! s:DetectEjs()
    if getline(1) =~ '^#!.*\<ejs\>'
        set filetype=ejs
    endif
endfunction

autocmd BufNewFile,BufRead * call s:DetectEjs()

以下是用户 user456584 给出的语法文件:~/.vim/syntax/ejs.vim

runtime! syntax/html.vim
unlet b:current_syntax

" Include Java syntax
syn include @ejsJavaScript syntax/javascript.vim

syn region ejsScriptlet matchgroup=ejsTag start=/<%/  keepend end=/%>/ contains=@ejsJavaScript
syn region ejsExpr  matchgroup=ejsTag start=/<%=/ keepend end=/%>/ contains=@ejsJavaScript

" Redefine htmlTag so that it can contain jspExpr
syn clear htmlTag
syn region htmlTag start=+<[^/%]+ end=+>+ contains=htmlTagN,htmlString,htmlArg,htmlValue,htmlTagError,htmlEvent,htmlCssDefinition,@htmlPreproc,@htmlArgCluster,ejsExpr,javaScript


" syn keyword ejsPrint contained print
syn match javaScriptType        /\<\zsvars\ze\./
syn match javaScriptSpecial     /\<\zsexports\ze\./
syn match javaScriptFunction    /\<\zsprint\ze(/
syn match javaScriptFunction    /\<\zsinclude\ze(/
syn match javaScriptFunction    /\<\zsincludeObject\ze(/
syn match javaScriptFunction    /\<\zsfetch\ze(/
syn match javaScriptFunction    /\<\zsfetchObject\ze(/

command -nargs=+ HiLink hi def link <args>
HiLink  ejsTag      htmlTag
delcommand HiLink

let b:current_syntax = "ejs"

3

如果您希望将它们像常规的.js文件一样突出显示,可以在您的.vimrc文件中添加以下内容:

au BufNewFile,BufRead *.ejs set filetype=js

我不完全确定你需要的是什么,但希望这能有所帮助。


稍微改一下 au BufRead,BufNewFile *.ejs set filetype=javascript,我可以得到 JavaScript 的高亮显示,但是它不太容易阅读... 如果可能的话,将 HTML 和 JavaScript 分别高亮显示将非常好。 - lyuba
3
据说您可以在一个缓冲区中使用多种文件类型。请参考:https://dev59.com/hXE85IYBdhLWcg3wzm5p#2604558 - Xavier T.
这个可以用,谢谢!不过,可能有没有一种自动将此命令应用于每个 .ejs 扩展名文件的方法? - lyuba
有的。请看这个答案中的例子。 ;) - trusktr

0
尝试一下。
cd /usr/share/vim/vim74/syntax #maybe vim64 or other
cp html.vim ejs.vim
vim ejs.vim

你可以直接编辑html.vim,但我建议你不要这样做... 然后找到

syn region  javaScript start=+<script\_[^>]*>+ keepend end=+</script>+me=s-1` contains=@htmlJavaScript,htmlCssStyleComment,htmlScriptTag,@htmlPreproc

并编写

  syn region  ejsScript start=+<%+ keepend end=+%>+ contains=@htmlJavaScript,htmlCssStyleComment,htmlScriptTag,@htmlPreproc

在那条线下面。

查找

  HtmlHiLink javaScript             Special

添加

  HtmlHiLink ejsScript             Special

在它下面

将这行代码添加到你的~/.vimrc文件中

au BufNewFile,BufRead *.ejs set filetype=ejs

现在你的ejs代码看起来像js代码了... 或者你只是想让它看起来像其他东西?

替换

  HtmlHiLink ejsScript             Special

通过(例如)

 hi def ejsScript                 term=bold cterm=bold gui=bold

实际上,在这个例子中,这两行可以共存...

它使你的代码可爱~

你可以阅读this来帮助你使用vim-syntax


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接