summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Stankiewicz <sheerun@sher.pl>2013-09-14 11:38:54 +0200
committerAdam Stankiewicz <sheerun@sher.pl>2013-09-14 11:38:54 +0200
commitf0d869aea78030c6f802013a108678dd98e82378 (patch)
treea4246dcd888ff19c563ea62b2df04b1b8581f29b
parent96e9c416ae940753b57891b9852cfd834f9bd191 (diff)
downloadvim-polyglot-f0d869aea78030c6f802013a108678dd98e82378.tar.gz
vim-polyglot-f0d869aea78030c6f802013a108678dd98e82378.zip
Add jade template syntax support, closes #2
Diffstat (limited to '')
-rwxr-xr-xbuild1
-rw-r--r--ftdetect/jade.vim2
-rw-r--r--ftplugin/jade.vim53
-rw-r--r--indent/jade.vim70
-rw-r--r--syntax/jade.vim89
5 files changed, 215 insertions, 0 deletions
diff --git a/build b/build
index 67f143ca..87d83fd1 100755
--- a/build
+++ b/build
@@ -72,6 +72,7 @@ PACKS="
handlebars:nono/vim-handlebars
haskell:travitch/hasksyn
html5:othree/html5.vim
+ jade:digitaltoad/vim-jade
javascript:pangloss/vim-javascript
json:leshill/vim-json
jst:briancollins/vim-jst
diff --git a/ftdetect/jade.vim b/ftdetect/jade.vim
new file mode 100644
index 00000000..c21dcff7
--- /dev/null
+++ b/ftdetect/jade.vim
@@ -0,0 +1,2 @@
+" Jade
+autocmd BufNewFile,BufReadPost *.jade set filetype=jade
diff --git a/ftplugin/jade.vim b/ftplugin/jade.vim
new file mode 100644
index 00000000..71152f39
--- /dev/null
+++ b/ftplugin/jade.vim
@@ -0,0 +1,53 @@
+" Vim filetype plugin
+" Language: Jade
+" Maintainer: Joshua Borton
+" Credits: Tim Pope
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:save_cpo = &cpo
+set cpo-=C
+
+" Define some defaults in case the included ftplugins don't set them.
+let s:undo_ftplugin = ""
+let s:browsefilter = "All Files (*.*)\t*.*\n"
+let s:match_words = ""
+
+runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim
+unlet! b:did_ftplugin
+
+" Override our defaults if these were set by an included ftplugin.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin
+ unlet b:undo_ftplugin
+endif
+if exists("b:browsefilter")
+ let s:browsefilter = b:browsefilter
+ unlet b:browsefilter
+endif
+if exists("b:match_words")
+ let s:match_words = b:match_words
+ unlet b:match_words
+endif
+
+" Change the browse dialog on Win32 to show mainly Haml-related files
+if has("gui_win32")
+ let b:browsefilter="Jade Files (*.jade)\t*.jade\n" . s:browsefilter
+endif
+
+" Load the combined list of match_words for matchit.vim
+if exists("loaded_matchit")
+ let b:match_words = s:match_words
+endif
+
+setlocal comments=://-,:// commentstring=//\ %s
+
+let b:undo_ftplugin = "setl cms< com< "
+ \ " | unlet! b:browsefilter b:match_words | " . s:undo_ftplugin
+
+let &cpo = s:save_cpo
+
+" vim:set sw=2:
diff --git a/indent/jade.vim b/indent/jade.vim
new file mode 100644
index 00000000..12b9e2ed
--- /dev/null
+++ b/indent/jade.vim
@@ -0,0 +1,70 @@
+" Vim indent file
+" Language: Jade
+" Maintainer: Joshua Borton
+" Credits: Tim Pope (vim-jade)
+" Last Change: 2010 Sep 22
+
+if exists("b:did_indent")
+ finish
+endif
+
+unlet! b:did_indent
+let b:did_indent = 1
+
+setlocal autoindent
+setlocal indentexpr=GetJadeIndent()
+setlocal indentkeys=o,O,*<Return>,},],0),!^F
+
+" Only define the function once.
+if exists("*GetJadeIndent")
+ finish
+endif
+
+let s:attributes = '\%((.\{-\})\)'
+let s:tag = '\([%.#][[:alnum:]_-]\+\|'.s:attributes.'\)*[<>]*'
+
+if !exists('g:jade_self_closing_tags')
+ let g:jade_self_closing_tags = 'meta|link|img|hr|br|input'
+endif
+
+setlocal formatoptions+=r
+setlocal comments+=n:\|
+
+function! GetJadeIndent()
+ let lnum = prevnonblank(v:lnum-1)
+ if lnum == 0
+ return 0
+ endif
+ let line = substitute(getline(lnum),'\s\+$','','')
+ let cline = substitute(substitute(getline(v:lnum),'\s\+$','',''),'^\s\+','','')
+ let lastcol = strlen(line)
+ let line = substitute(line,'^\s\+','','')
+ let indent = indent(lnum)
+ let cindent = indent(v:lnum)
+ let increase = indent + &sw
+ if indent == indent(lnum)
+ let indent = cindent <= indent ? -1 : increase
+ endif
+
+ let group = synIDattr(synID(lnum,lastcol,1),'name')
+
+ if line =~ '^!!!'
+ return indent
+ elseif line =~ '^/\%(\[[^]]*\]\)\=$'
+ return increase
+ elseif line =~ '^\%(if\|else\|unless\|for\|each\|block\|mixin\|append\|case\|when\)'
+ return increase
+ elseif line =~ '^'.s:tag.'[&!]\=[=~-].*,\s*$'
+ return increase
+ elseif line == '-#'
+ return increase
+ elseif line =~? '^\v%('.g:jade_self_closing_tags.')>'
+ return indent
+ elseif group =~? '\v^%(jadeAttributesDelimiter|jadeClass|jadeId|htmlTagName|htmlSpecialTagName|jadeFilter)$'
+ return increase
+ else
+ return indent
+ endif
+endfunction
+
+" vim:set sw=2:
diff --git a/syntax/jade.vim b/syntax/jade.vim
new file mode 100644
index 00000000..d61e4f01
--- /dev/null
+++ b/syntax/jade.vim
@@ -0,0 +1,89 @@
+" Vim syntax file
+" Language: Jade
+" Maintainer: Joshua Borton
+" Credits: Tim Pope
+" Filenames: *.jade
+
+if exists("b:current_syntax")
+ finish
+endif
+
+if !exists("main_syntax")
+ let main_syntax = 'jade'
+endif
+
+runtime! syntax/html.vim
+runtime! syntax/html/html5.vim
+silent! syntax include @htmlCoffeescript syntax/coffee.vim
+unlet! b:current_syntax
+silent! syntax include @htmlStylus syntax/stylus.vim
+unlet! b:current_syntax
+silent! syntax include @htmlMarkdown syntax/markdown.vim
+unlet! b:current_syntax
+
+syn case match
+
+syn region javascriptParenthesisBlock start="(" end=")" contains=@htmlJavascript contained keepend
+syn cluster htmlJavascript add=javascriptParenthesisBlock
+
+syn region jadeJavascript matchgroup=jadeJavascriptOutputChar start="[!&]\==\|\~" skip=",\s*$" end="$" contained contains=@htmlJavascript keepend
+syn region jadeJavascript matchgroup=jadeJavascriptChar start="-" skip=",\s*$" end="$" contained contains=@htmlJavascript keepend
+syn cluster jadeTop contains=jadeBegin,jadeComment,jadeHtmlComment,jadeJavascript
+syn match jadeBegin "^\s*\%([<>]\|&[^=~ ]\)\@!" nextgroup=jadeTag,jadeClassChar,jadeIdChar,jadePlainChar,jadeJavascript,jadeScriptConditional,jadeScriptStatement
+syn match jadeTag "+\?\w\+\%(:\w\+\)\=" contained contains=htmlTagName,htmlSpecialTagName nextgroup=@jadeComponent
+syn cluster jadeComponent contains=jadeAttributes,jadeIdChar,jadeBlockExpansionChar,jadeClassChar,jadePlainChar,jadeJavascript
+syn match jadeComment '\s*\/\/.*$'
+syn region jadeHtmlComment start="^\z(\s*\)/" end="^\%(\z1\s\|\s*$\)\@!"
+syn region jadeAttributes matchgroup=jadeAttributesDelimiter start="(" end=")" contained contains=@htmlJavascript,jadeHtmlArg,htmlArg,htmlEvent,htmlCssDefinition nextgroup=@jadeComponent
+syn match jadeClassChar "\." contained nextgroup=jadeClass
+syn match jadeBlockExpansionChar ":\s" contained nextgroup=jadeTag
+syn match jadeIdChar "#{\@!" contained nextgroup=jadeId
+syn match jadeClass "\%(\w\|-\)\+" contained nextgroup=@jadeComponent
+syn match jadeId "\%(\w\|-\)\+" contained nextgroup=@jadeComponent
+syn region jadeDocType start="^\s*\(!!!\|doctype\)" end="$"
+" Unless I'm mistaken, syntax/html.vim requires
+" that the = sign be present for these matches.
+" This adds the matches back for jade.
+syn keyword jadeHtmlArg contained href title
+
+syn match jadePlainChar "\\" contained
+syn region jadeInterpolation matchgroup=jadeInterpolationDelimiter start="#{" end="}" contains=@htmlJavascript
+syn match jadeInterpolationEscape "\\\@<!\%(\\\\\)*\\\%(\\\ze#{\|#\ze{\)"
+
+syn region jadeJavascriptFilter matchgroup=jadeFilter start="^\z(\s*\):javascript\s*$" end="^\%(\z1\s\|\s*$\)\@!" contains=@htmlJavascript
+syn region jadeCoffeescriptFilter matchgroup=jadeFilter start="^\z(\s*\):coffeescript\s*$" end="^\%(\z1\s\|\s*$\)\@!" contains=@htmlCoffeescript
+syn region jadeMarkdownFilter matchgroup=jadeFilter start=/^\z(\s*\):markdown\s*$/ end=/^\%(\z1\s\|\s*$\)\@!/ contains=@htmlMarkdown
+syn region jadeStylusFilter matchgroup=jadeFilter start="^\z(\s*\):stylus\s*$" end="^\%(\z1\s\|\s*$\)\@!" contains=@htmlStylus
+syn region jadePlainFilter matchgroup=jadeFilter start="^\z(\s*\):\%(sass\|less\|cdata\)\s*$" end="^\%(\z1\s\|\s*$\)\@!"
+
+syn match jadeScriptConditional "\<\%(if\|else\|unless\|while\|for\|until\|case\|when\|default\)\>[?!]\@!"
+syn match jadeScriptStatement "\<\%(each\|block\|prepend\|append\|mixin\|extends\|include\)\>[?!]\@!"
+
+syn region jadeJavascript start="^\z(\s*\)script\%(:\w\+\)\=" end="^\%(\z1\s\|\s*$\)\@!" contains=@htmlJavascript,jadeJavascriptTag keepend
+syn region jadeJavascriptTag contained start="^\z(\s*\)script\%(:\w\+\)\=" end="$" contains=jadeBegin,jadeTag
+syn region jadeCssBlock start="^\z(\s*\)style" nextgroup=@jadeComponent,jadeError end="^\%(\z1\s\|\s*$\)\@!" contains=@jadeTop,@htmlCss keepend
+
+syn match jadeError "\$" contained
+
+hi def link jadePlainChar Special
+hi def link jadeScriptConditional PreProc
+hi def link jadeScriptStatement PreProc
+hi def link jadeHtmlArg htmlArg
+hi def link jadeAttributeString String
+hi def link jadeAttributesDelimiter Identifier
+hi def link jadeIdChar Special
+hi def link jadeClassChar Special
+hi def link jadeBlockExpansionChar Special
+hi def link jadeId Identifier
+hi def link jadeClass Type
+hi def link jadeInterpolationDelimiter Delimiter
+hi def link jadeFilter PreProc
+hi def link jadeDocType PreProc
+hi def link jadeComment Comment
+hi def link jadeHtmlComment jadeComment
+
+let b:current_syntax = "jade"
+
+if main_syntax == "jade"
+ unlet main_syntax
+endif