diff options
| -rwxr-xr-x | build | 1 | ||||
| -rw-r--r-- | ftdetect/jade.vim | 2 | ||||
| -rw-r--r-- | ftplugin/jade.vim | 53 | ||||
| -rw-r--r-- | indent/jade.vim | 70 | ||||
| -rw-r--r-- | syntax/jade.vim | 89 | 
5 files changed, 215 insertions, 0 deletions
| @@ -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 | 
