diff options
author | Adam Stankiewicz <sheerun@sher.pl> | 2016-01-22 09:08:00 +0100 |
---|---|---|
committer | Adam Stankiewicz <sheerun@sher.pl> | 2016-01-22 09:08:00 +0100 |
commit | 61390f58850c34b27d2a28dc14ebd760de152cc9 (patch) | |
tree | ef4822fc1f712ef0e2bdc50a435d7ef590da4d77 | |
parent | f8a0fb37bf57fdf705747cc3aacbe50b6b2d6482 (diff) | |
download | vim-polyglot-61390f58850c34b27d2a28dc14ebd760de152cc9.tar.gz vim-polyglot-61390f58850c34b27d2a28dc14ebd760de152cc9.zip |
Update
-rw-r--r-- | README.md | 2 | ||||
-rw-r--r-- | after/indent/jsx.vim | 12 | ||||
-rw-r--r-- | autoload/xml/html5.vim | 12 | ||||
-rw-r--r-- | compiler/exunit.vim | 5 | ||||
-rw-r--r-- | ftdetect/polyglot.vim | 32 | ||||
-rw-r--r-- | ftplugin/blade.vim | 16 | ||||
-rw-r--r-- | ftplugin/eelixir.vim | 4 | ||||
-rw-r--r-- | ftplugin/elixir.vim | 7 | ||||
-rw-r--r-- | ftplugin/gitrebase.vim | 3 | ||||
-rw-r--r-- | ftplugin/html.vim | 2 | ||||
-rw-r--r-- | indent/blade.vim | 94 | ||||
-rw-r--r-- | indent/eelixir.vim | 5 | ||||
-rw-r--r-- | indent/elixir.vim | 53 | ||||
-rw-r--r-- | indent/swift.vim | 30 | ||||
-rw-r--r-- | indent/typescript.vim | 524 | ||||
-rw-r--r-- | syntax/blade.vim | 56 | ||||
-rw-r--r-- | syntax/eelixir.vim | 5 | ||||
-rw-r--r-- | syntax/elixir.vim | 36 | ||||
-rw-r--r-- | syntax/go.vim | 24 | ||||
-rw-r--r-- | syntax/html.vim | 30 | ||||
-rw-r--r-- | syntax/jade.vim | 2 | ||||
-rw-r--r-- | syntax/perl6.vim | 2 | ||||
-rw-r--r-- | syntax/ruby.vim | 28 | ||||
-rw-r--r-- | syntax/rust.vim | 1 | ||||
-rw-r--r-- | syntax/swift.vim | 46 |
25 files changed, 740 insertions, 291 deletions
@@ -27,7 +27,7 @@ Optionally download one of the [releases](https://github.com/sheerun/vim-polyglo - [ansible](https://github.com/pearofducks/ansible-vim) (syntax, indent, ftplugin, ftdetect) - [arduino](https://github.com/sudar/vim-arduino-syntax) (syntax, indent, ftdetect) -- [blade](https://github.com/jwalton512/vim-blade) (syntax, indent, ftdetect) +- [blade](https://github.com/jwalton512/vim-blade) (syntax, indent, ftplugin, ftdetect) - [c++11](https://github.com/octol/vim-cpp-enhanced-highlight) (syntax) - [c/c++](https://github.com/vim-jp/vim-cpp) (syntax) - [cjsx](https://github.com/mtscout6/vim-cjsx) (ftdetect, syntax, ftplugin) diff --git a/after/indent/jsx.vim b/after/indent/jsx.vim index f4c36662..e5fdb45d 100644 --- a/after/indent/jsx.vim +++ b/after/indent/jsx.vim @@ -26,8 +26,8 @@ setlocal indentkeys=0{,0},0),0],0\,,!^F,o,O,e " XML indentkeys setlocal indentkeys+=*<Return>,<>>,<<>,/ -" Self-closing tag regex. -let s:sctag = '^\s*\/>\s*;\=' +" Multiline end tag regex (line beginning with '>' or '/>') +let s:endtag = '^\s*\/\?>\s*;\=' " Get all syntax types at the beginning of a given line. fu! SynSOL(lnum) @@ -76,13 +76,13 @@ fu! GetJsxIndent() if (SynXMLish(prevsyn) || SynJSXBlockEnd(prevsyn)) && SynXMLishAny(cursyn) let ind = XmlIndentGet(v:lnum, 0) - " Align '/>' with '<' for multiline self-closing tags. - if getline(v:lnum) =~? s:sctag + " Align '/>' and '>' with '<' for multiline tags. + if getline(v:lnum) =~? s:endtag let ind = ind - &sw endif - " Then correct the indentation of any JSX following '/>'. - if getline(v:lnum - 1) =~? s:sctag + " Then correct the indentation of any JSX following '/>' or '>'. + if getline(v:lnum - 1) =~? s:endtag let ind = ind + &sw endif else diff --git a/autoload/xml/html5.vim b/autoload/xml/html5.vim index 2fad3521..b422b2ca 100644 --- a/autoload/xml/html5.vim +++ b/autoload/xml/html5.vim @@ -1,9 +1,9 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'html5') == -1 " Vim completion for HTML5 data file -" Language: HTML5 -" Maintainer: othree <othree@gmail.com> -" Last Change: 2011 Apr 9 +" Language: HTML (version 5.1 Draft 2016 Jan 13) +" Maintainer: Kao, Wei-Ko(othree) ( othree AT gmail DOT com ) +" Last Change: 2016 Jan 20 " Lang Tag: {{{ @@ -598,9 +598,13 @@ let g:xmldata_html5 = { \ global_attributes \ ], \ 'menu': [ - \ flow_elements + ['li'], + \ flow_elements + ['menuitem'], \ extend(copy(global_attributes), {'type': ['toolbar', 'context'], 'label': []}) \ ], +\ 'menuitem': [ + \ flow_elements + ['li'], + \ extend(copy(global_attributes), {'type': ['toolbar', 'context'], 'label': [], 'icon': [], 'disabled': [], 'checked': [], 'radiogroup': [], 'default': [], 'command': []}) +\ ], \ 'meta': [ \ [], \ extend(copy(global_attributes), {'name': ['application-name', 'author', 'description', 'generator', 'referrer', 'creator', 'googlebot', 'publisher', 'robots', 'slurp', 'viewport', 'theme-color'], 'http-equiv': ['refresh', 'default-style', 'content-type'], 'content': [], 'charset': charset}) diff --git a/compiler/exunit.vim b/compiler/exunit.vim index 9fc921a5..e2d14185 100644 --- a/compiler/exunit.vim +++ b/compiler/exunit.vim @@ -1,10 +1,5 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1 -" Vim compiler file -" Language: ExUnit -" Maintainer: Rein Henrichs <rein.henrichs@gmail.com> -" URL: https://github.com/elixir-lang/vim-elixir - if exists("current_compiler") finish endif diff --git a/ftdetect/polyglot.vim b/ftdetect/polyglot.vim index 80938e78..521eced7 100644 --- a/ftdetect/polyglot.vim +++ b/ftdetect/polyglot.vim @@ -19,7 +19,7 @@ au BufRead,BufNewFile *.ino,*.pde set filetype=arduino endif if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'blade') == -1 -au BufNewFile,BufRead *.blade.php set filetype=blade +autocmd BufNewFile,BufRead *.blade.php set filetype=blade endif if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'cjsx') == -1 @@ -65,19 +65,18 @@ au BufNewFile,BufRead Dockerfile set filetype=dockerfile endif if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1 -au BufRead,BufNewFile *.eex set filetype=eelixir -au FileType eelixir setl sw=2 sts=2 et iskeyword+=!,? -endif -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1 - -au BufRead,BufNewFile *.ex,*.exs set filetype=elixir -au FileType elixir setl sw=2 sts=2 et iskeyword+=!,? +au BufRead,BufNewFile *.ex,*.exs call s:setf('elixir') +au BufRead,BufNewFile *.eex call s:setf('eelixir') +au FileType elixir,eelixir setl sw=2 sts=2 et iskeyword+=!,? +au BufNewFile,BufRead * call s:DetectElixir() +function! s:setf(filetype) abort + let &filetype = a:filetype +endfunction function! s:DetectElixir() - if getline(1) =~ '^#!.*\<elixir\>' - set filetype=elixir - endif + if getline(1) =~ '^#!.*\<elixir\>' + call s:setf('elixir') + endif endfunction -autocmd BufNewFile,BufRead * call s:DetectElixir() endif if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elm') == -1 @@ -126,19 +125,22 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'go') == -1 let s:current_fileformats = '' let s:current_fileencodings = '' -function! s:gofiletype_pre() +function! s:gofiletype_pre(type) let s:current_fileformats = &g:fileformats let s:current_fileencodings = &g:fileencodings set fileencodings=utf-8 fileformats=unix - setlocal filetype=go + let &l:filetype = a:type endfunction function! s:gofiletype_post() let &g:fileformats = s:current_fileformats let &g:fileencodings = s:current_fileencodings endfunction au BufNewFile *.go setfiletype go | setlocal fileencoding=utf-8 fileformat=unix -au BufRead *.go call s:gofiletype_pre() +au BufRead *.go call s:gofiletype_pre("go") au BufReadPost *.go call s:gofiletype_post() +au BufNewFile *.s setfiletype asm | setlocal fileencoding=utf-8 fileformat=unix +au BufRead *.s call s:gofiletype_pre("asm") +au BufReadPost *.s call s:gofiletype_post() au BufRead,BufNewFile *.tmpl set filetype=gohtmltmpl endif if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haml') == -1 diff --git a/ftplugin/blade.vim b/ftplugin/blade.vim new file mode 100644 index 00000000..501f9667 --- /dev/null +++ b/ftplugin/blade.vim @@ -0,0 +1,16 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'blade') == -1 + +" Vim filetype plugin +" Language: Blade (Laravel) +" Maintainer: Jason Walton <jwalton512@gmail.com> + +if exists('b:did_ftplugin') + finish +endif + +runtime! ftplugin/html.vim +let b:did_ftplugin = 1 + +setlocal iskeyword+=@-@ + +endif diff --git a/ftplugin/eelixir.vim b/ftplugin/eelixir.vim index 57c8cb40..b0f3284f 100644 --- a/ftplugin/eelixir.vim +++ b/ftplugin/eelixir.vim @@ -1,9 +1,5 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1 -" Vim filetype plugin -" Language: Embedded Elixir -" URL: https://github.com/elixir-lang/vim-elixir - if exists("b:did_ftplugin") finish endif diff --git a/ftplugin/elixir.vim b/ftplugin/elixir.vim index 576e4641..04388efd 100644 --- a/ftplugin/elixir.vim +++ b/ftplugin/elixir.vim @@ -1,10 +1,5 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1 -" Vim filetype plugin -" Language: Elixir -" Maintainer: Carlos Galdino <carloshsgaldino@gmail.com> -" URL: https://github.com/elixir-lang/vim-elixir - if (exists("b:did_ftplugin")) finish endif @@ -15,7 +10,7 @@ let b:did_ftplugin = 1 if exists("loaded_matchit") && !exists("b:match_words") let b:match_ignorecase = 0 - let b:match_words = '\<\%(do\|fn\)\:\@!\>' . + let b:match_words = '\:\@<!\<\%(do\|fn\)\:\@!\>' . \ ':' . \ '\<\%(else\|elsif\|catch\|after\|rescue\)\:\@!\>' . \ ':' . diff --git a/ftplugin/gitrebase.vim b/ftplugin/gitrebase.vim index 572a1484..e3e015bb 100644 --- a/ftplugin/gitrebase.vim +++ b/ftplugin/gitrebase.vim @@ -14,10 +14,11 @@ runtime! ftplugin/git.vim let b:did_ftplugin = 1 setlocal comments=:# commentstring=#\ %s formatoptions-=t +setlocal nomodeline if !exists("b:undo_ftplugin") let b:undo_ftplugin = "" endif -let b:undo_ftplugin = b:undo_ftplugin."|setl com< cms< fo<" +let b:undo_ftplugin = b:undo_ftplugin."|setl com< cms< fo< ml<" function! s:choose(word) s/^\(\w\+\>\)\=\(\s*\)\ze\x\{4,40\}\>/\=(strlen(submatch(1)) == 1 ? a:word[0] : a:word) . substitute(submatch(2),'^$',' ','')/e diff --git a/ftplugin/html.vim b/ftplugin/html.vim index 3546ab2c..782d4015 100644 --- a/ftplugin/html.vim +++ b/ftplugin/html.vim @@ -8,4 +8,6 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'html5') == -1 " setlocal iskeyword+=- +setlocal commentstring=<!--%s--> + endif diff --git a/indent/blade.vim b/indent/blade.vim index 8327f451..78a8a78c 100644 --- a/indent/blade.vim +++ b/indent/blade.vim @@ -1,66 +1,50 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'blade') == -1 -" Language: Blade -" Author: Barry Deeney <sitemaster16@gmail.com> -" Version: 0.1 -" Description: BLADE indent file based on HTML indentation... +" Vim indent file +" Language: Blade (Laravel) +" Maintainer: Jason Walton <jwalton512@gmail.com> -" Check if this file has already been loaded if exists("b:did_indent") - finish + finish endif - -" Include HTML runtime! indent/html.vim -runtime! indent/php.vim -silent! unlet b:did_indent - -" What function do we need to use to detect indentation? -setlocal indentexpr=BladeIndent() - -" What keys would trigger indentation? -setlocal indentkeys=o,O,<Return>,<>>,{,},!^F,0{,0},0),:,!^F,o,O,e,*<Return>,=?>,=<?,=*/ - -" THE MAIN INDENT FUNCTION. Return the amount of indent for v:lnum. -func! BladeIndent() - " What is the current line? - let current_line = v:lnum - - " What is the current text? - let current_text = tolower(getline(current_line)) - - " What was the last non blank line? - let previous_line = prevnonblank(current_line) - - " What was the last non blank text? - let previous_text = tolower(getline(previous_line)) - - " How large are indents?? - let indent_size = &sw - - " Check if we have a PHPIndent value... - let indent = GetPhpIndent() - - " check if we have indent - if indent == -1 - " Check if we have BLADE - if current_text =~ '^\s*@' || previous_text =~ '^\s*@' - " We need to add to the indent - return indent_size * indent(previous_text) - endif +unlet! b:did_indent +let b:did_indent = 1 - " Check if we have HTML - if current_text =~ '^\s*<' || previous_text =~ '^\s*<' - " We now give the honors to HtmlIndent() - let indent = HtmlIndent() - endif - endif +setlocal autoindent +setlocal indentexpr=GetBladeIndent() +setlocal indentkeys=o,O,*<Return>,<>>,!^F,=@else,=@end,=@empty - " Give the indent back! - return indent -endfunc +" Only define the function once. +if exists("*GetBladeIndent") + finish +endif -" Make sure we store that flag! -let b:did_indent = 1 +function! GetBladeIndent() + let lnum = prevnonblank(v:lnum-1) + if lnum == 0 + return 0 + endif + + let line = substitute(substitute(getline(lnum), '\s\+$', '', ''), '^\s\+', '', '') + let cline = substitute(substitute(getline(v:lnum), '\s\+$', '', ''), '^\s\+', '', '') + let indent = indent(lnum) + let cindent = indent(v:lnum) + if cline =~# '@\%(else\|elseif\|empty\|end\)' + let indent = cindent < indent ? cindent : indent - &sw + elseif HtmlIndent() > -1 + let indent = HtmlIndent() + endif + let increase = indent + &sw + if indent = indent(lnum) + let indent = cindent <= indent ? -1 : increase + endif + + if line =~# '@\%(if\|elseif\|else\|unless\|foreach\|forelse\|for\|while\)\%(.*\s*@end\)\@!' + return increase + else + return indent + endif +endfunction endif diff --git a/indent/eelixir.vim b/indent/eelixir.vim index c5e2491e..d9538425 100644 --- a/indent/eelixir.vim +++ b/indent/eelixir.vim @@ -1,10 +1,5 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1 -" Vim indent file -" Language: Embedded Elixir -" URL: https://github.com/elixir-lang/vim-elixir - - if exists("b:did_indent") finish endif diff --git a/indent/elixir.vim b/indent/elixir.vim index 863104d3..58179973 100644 --- a/indent/elixir.vim +++ b/indent/elixir.vim @@ -1,10 +1,5 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1 -" Vim indent file -" Language: Elixir -" Maintainer: Carlos Galdino <carloshsgaldino@gmail.com> -" Last Change: 2013 Apr 24 - if exists("b:did_indent") finish endif @@ -13,7 +8,7 @@ let b:did_indent = 1 setlocal nosmartindent setlocal indentexpr=GetElixirIndent() -setlocal indentkeys+=0=end,0=else,0=match,0=elsif,0=catch,0=after,0=rescue +setlocal indentkeys+=0),0],0=end,0=else,0=match,0=elsif,0=catch,0=after,0=rescue if exists("*GetElixirIndent") finish @@ -22,17 +17,23 @@ endif let s:cpo_save = &cpo set cpo&vim -let s:skip_syntax = '\%(Comment\|String\)$' -let s:block_skip = "synIDattr(synID(line('.'),col('.'),1),'name') =~? '" . s:skip_syntax . "'" -let s:block_start = 'do\|fn' -let s:block_middle = 'else\|match\|elsif\|catch\|after\|rescue' -let s:block_end = 'end' -let s:symbols_end = '\]\|}' -let s:arrow = '^.*->$' -let s:pipeline = '^\s*|>.*$' +let s:no_colon_before = ':\@<!' +let s:no_colon_after = ':\@!' +let s:symbols_end = '\]\|}' +let s:arrow = '^.*->$' +let s:pipeline = '^\s*|>.*$' +let s:skip_syntax = '\%(Comment\|String\)$' +let s:block_skip = "synIDattr(synID(line('.'),col('.'),1),'name') =~? '".s:skip_syntax."'" +let s:block_start = 'do\|fn' +let s:block_middle = 'else\|match\|elsif\|catch\|after\|rescue' +let s:block_end = 'end' + +let s:indent_keywords = '\<'.s:no_colon_before.'\%('.s:block_start.'\|'.s:block_middle.'\)$'.'\|'.s:arrow +let s:deindent_keywords = '^\s*\<\%('.s:block_end.'\|'.s:block_middle.'\)\>'.'\|'.s:arrow -let s:indent_keywords = '\<\%(' . s:block_start . '\|' . s:block_middle . '\)$' . '\|' . s:arrow -let s:deindent_keywords = '^\s*\<\%(' . s:block_end . '\|' . s:block_middle . '\)\>' . '\|' . s:arrow +let s:pair_start = '\<\%('.s:no_colon_before.s:block_start.'\)\>'.s:no_colon_after +let s:pair_middle = '\<\%('.s:block_middle.'\)\>'.s:no_colon_after.'\zs' +let s:pair_end = '\<\%('.s:no_colon_before.s:block_end.'\)\>\zs' function! GetElixirIndent() let lnum = prevnonblank(v:lnum - 1) @@ -60,20 +61,16 @@ function! GetElixirIndent() let opened_symbol += count(splited_line, '[') - count(splited_line, ']') let opened_symbol += count(splited_line, '{') - count(splited_line, '}') - let ind += opened_symbol * &sw + let ind += (opened_symbol * &sw) - if last_line =~ '^\s*\(' . s:symbols_end . '\)' + if last_line =~ '^\s*\('.s:symbols_end.'\)' || last_line =~ s:indent_keywords let ind += &sw endif - if current_line =~ '^\s*\(' . s:symbols_end . '\)' + if current_line =~ '^\s*\('.s:symbols_end.'\)' let ind -= &sw endif - if last_line =~ s:indent_keywords - let ind += &sw - endif - " if line starts with pipeline " and last line contains pipeline(s) " align them @@ -99,11 +96,13 @@ function! GetElixirIndent() endif if current_line =~ s:deindent_keywords - let bslnum = searchpair( '\<\%(' . s:block_start . '\):\@!\>', - \ '\<\%(' . s:block_middle . '\):\@!\>\zs', - \ '\<:\@<!' . s:block_end . '\>\zs', + let bslnum = searchpair( + \ s:pair_start, + \ s:pair_middle, + \ s:pair_end, \ 'nbW', - \ s:block_skip ) + \ s:block_skip + \ ) let ind = indent(bslnum) endif diff --git a/indent/swift.vim b/indent/swift.vim index ba6d65ea..773e6451 100644 --- a/indent/swift.vim +++ b/indent/swift.vim @@ -14,7 +14,6 @@ let s:cpo_save = &cpo set cpo&vim setlocal nosmartindent -setlocal indentkeys-=: setlocal indentkeys-=e setlocal indentkeys+=0] setlocal indentexpr=SwiftIndent() @@ -95,11 +94,13 @@ function! SwiftIndent(...) return -1 endif - return indent(openingSquare) - endif + " - Line starts with closing square, indent as opening square + if line =~ '\v^\s*]' + return indent(openingSquare) + endif - if s:IsExcludedFromIndent() - return previousIndent + " - Line contains closing square and more, indent a level above opening + return indent(openingSquare) + shiftwidth() endif if line =~ ":$" @@ -153,7 +154,8 @@ function! SwiftIndent(...) endif return indent(openingBracket) else - return -1 + " - Current line is blank, and the user presses 'o' + return previousIndent endif endif @@ -195,7 +197,7 @@ function! SwiftIndent(...) endif let previousParen = match(previous, "(") - return previousParen + 1 + return indent(previousParen) + shiftwidth() endif if numOpenBrackets > numCloseBrackets @@ -207,6 +209,11 @@ function! SwiftIndent(...) return indent(openingParen) + shiftwidth() endif + " - Previous line has close then open braces, indent previous + 1 'sw' + if previous =~ "}.*{" + return previousIndent + shiftwidth() + endif + let line = line(".") let column = col(".") call cursor(previousNum, column) @@ -216,9 +223,14 @@ function! SwiftIndent(...) return indent(openingParen) endif + " - Line above has (unmatched) open paren, next line needs indent if numOpenParens > 0 - let previousParen = match(previous, "(") - return previousParen + 1 + let savePosition = getcurpos() + " Must be at EOL because open paren has to be above (left of) the cursor + call cursor(previousNum, col("$")) + let previousParen = searchpair("(", "", ")", "bWn", "s:IsExcludedFromIndent()") + call setpos(".", savePosition) + return indent(previousParen) + shiftwidth() endif return cindent diff --git a/indent/typescript.vim b/indent/typescript.vim index 58dc7d03..ec4781a8 100644 --- a/indent/typescript.vim +++ b/indent/typescript.vim @@ -1,105 +1,505 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'typescript') == -1 -" Vim indent file, taken from indent/java.vim -" Language: Typescript -" Maintainer: None! Wanna improve this? -" Last Change: 2015 Mar 07 +" Vim indent file +" Language: Typescript +" Acknowledgement: Based off of vim-ruby maintained by Nikolai Weibull http://vim-ruby.rubyforge.org -if get(g:, 'typescript_indent_disable') - finish -endif +" 0. Initialization {{{1 +" ================= " Only load this indent file when no other was loaded. if exists("b:did_indent") - finish + finish endif let b:did_indent = 1 -" Use javascript cindent options -setlocal cindent cinoptions& cinoptions+=j1,J1 -setlocal indentkeys& +setlocal nosmartindent -" Load typescript indent function +" Now, set up our indentation expression and keys that trigger it. setlocal indentexpr=GetTypescriptIndent() +setlocal formatexpr=Fixedgq(v:lnum,v:count) +setlocal indentkeys=0{,0},0),0],0\,,!^F,o,O,e -let b:undo_indent = "setl cin< cino< indentkeys< indentexpr<" - -" Only define the function once +" Only define the function once. if exists("*GetTypescriptIndent") - finish + finish endif -" Make sure we have vim capabilities -let s:keepcpo = &cpo +let s:cpo_save = &cpo set cpo&vim -function! TypescriptPrevNonBlankOrComment(lnum) - let pnum = prevnonblank(a:lnum) - " skip any comments (either `//`, `/*` or `*`) - while getline(pnum) =~ '^\s*\(\/\/\|\/\*\|\*\)' - let pnum = prevnonblank(pnum-1) - endwhile - return pnum +" 1. Variables {{{1 +" ============ + +let s:ts_keywords = '^\s*\(break\|case\|catch\|continue\|debugger\|default\|delete\|do\|else\|finally\|for\|function\|if\|in\|instanceof\|new\|return\|switch\|this\|throw\|try\|typeof\|var\|void\|while\|with\)' + +" Regex of syntax group names that are or delimit string or are comments. +let s:syng_strcom = 'string\|regex\|comment\c' + +" Regex of syntax group names that are strings. +let s:syng_string = 'regex\c' + +" Regex of syntax group names that are strings or documentation. +let s:syng_multiline = 'comment\c' + +" Regex of syntax group names that are line comment. +let s:syng_linecom = 'linecomment\c' + +" Expression used to check whether we should skip a match with searchpair(). +let s:skip_expr = "synIDattr(synID(line('.'),col('.'),1),'name') =~ '".s:syng_strcom."'" + +let s:line_term = '\s*\%(\%(\/\/\).*\)\=$' + +" Regex that defines continuation lines, not including (, {, or [. +let s:continuation_regex = '\%([\\*+/.:]\|\%(<%\)\@<![=-]\|\W[|&?]\|||\|&&\|[^=]=[^=].*,\)' . s:line_term + +" Regex that defines continuation lines. +" TODO: this needs to deal with if ...: and so on +let s:msl_regex = s:continuation_regex + +let s:one_line_scope_regex = '\<\%(if\|else\|for\|while\)\>[^{;]*' . s:line_term + +" Regex that defines blocks. +let s:block_regex = '\%([{[]\)\s*\%(|\%([*@]\=\h\w*,\=\s*\)\%(,\s*[*@]\=\h\w*\)*|\)\=' . s:line_term + +let s:var_stmt = '^\s*var' + +let s:comma_first = '^\s*,' +let s:comma_last = ',\s*$' + +let s:ternary = '^\s\+[?|:]' +let s:ternary_q = '^\s\+?' + +" 2. Auxiliary Functions {{{1 +" ====================== + +" Check if the character at lnum:col is inside a string, comment, or is ascii. +function s:IsInStringOrComment(lnum, col) + return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_strcom endfunction -function GetTypescriptIndent() +" Check if the character at lnum:col is inside a string. +function s:IsInString(lnum, col) + return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_string +endfunction + +" Check if the character at lnum:col is inside a multi-line comment. +function s:IsInMultilineComment(lnum, col) + return !s:IsLineComment(a:lnum, a:col) && synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_multiline +endfunction + +" Check if the character at lnum:col is a line comment. +function s:IsLineComment(lnum, col) + return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_linecom +endfunction - " default value: trust cindent - let ind = cindent(v:lnum) +" Find line above 'lnum' that isn't empty, in a comment, or in a string. +function s:PrevNonBlankNonString(lnum) + let in_block = 0 + let lnum = prevnonblank(a:lnum) + while lnum > 0 + " Go in and out of blocks comments as necessary. + " If the line isn't empty (with opt. comment) or in a string, end search. + let line = getline(lnum) + if line =~ '/\*' + if in_block + let in_block = 0 + else + break + endif + elseif !in_block && line =~ '\*/' + let in_block = 1 + elseif !in_block && line !~ '^\s*\%(//\).*$' && !(s:IsInStringOrComment(lnum, 1) && s:IsInStringOrComment(lnum, strlen(line))) + break + endif + let lnum = prevnonblank(lnum - 1) + endwhile + return lnum +endfunction - if getline(v:lnum) =~ '^\s*[{}\*]' - return ind +" Find line above 'lnum' that started the continuation 'lnum' may be part of. +function s:GetMSL(lnum, in_one_line_scope) + " Start on the line we're at and use its indent. + let msl = a:lnum + let lnum = s:PrevNonBlankNonString(a:lnum - 1) + while lnum > 0 + " If we have a continuation line, or we're in a string, use line as MSL. + " Otherwise, terminate search as we have found our MSL already. + let line = getline(lnum) + let col = match(line, s:msl_regex) + 1 + if (col > 0 && !s:IsInStringOrComment(lnum, col)) || s:IsInString(lnum, strlen(line)) + let msl = lnum + else + " Don't use lines that are part of a one line scope as msl unless the + " flag in_one_line_scope is set to 1 + " + if a:in_one_line_scope + break + end + let msl_one_line = s:Match(lnum, s:one_line_scope_regex) + if msl_one_line == 0 + break + endif endif + let lnum = s:PrevNonBlankNonString(lnum - 1) + endwhile + return msl +endfunction + +function s:RemoveTrailingComments(content) + let single = '\/\/\(.*\)\s*$' + let multi = '\/\*\(.*\)\*\/\s*$' + return substitute(substitute(a:content, single, '', ''), multi, '', '') +endfunction + +" Find if the string is inside var statement (but not the first string) +function s:InMultiVarStatement(lnum) + let lnum = s:PrevNonBlankNonString(a:lnum - 1) - " The last non-empty line - let prev = TypescriptPrevNonBlankOrComment(v:lnum-1) +" let type = synIDattr(synID(lnum, indent(lnum) + 1, 0), 'name') - " Check if the previous line consists of a single `<variable> : <type>;` - " declaration (e.g. in interface definitions) - if getline(prev) =~ '^\s*\w\+\s*:[^{]\+;\s*$' - return indent(prev) + " loop through previous expressions to find a var statement + while lnum > 0 + let line = getline(lnum) + + " if the line is a ts keyword + if (line =~ s:ts_keywords) + " check if the line is a var stmt + " if the line has a comma first or comma last then we can assume that we + " are in a multiple var statement + if (line =~ s:var_stmt) + return lnum + endif + + " other ts keywords, not a var + return 0 endif - " If the previous line starts with '@', we should have the same indent as - " the previous one - if getline(prev) =~ '^\s*@\S\+\s*$' - return indent(prev) + let lnum = s:PrevNonBlankNonString(lnum - 1) + endwhile + + " beginning of program, not a var + return 0 +endfunction + +" Find line above with beginning of the var statement or returns 0 if it's not +" this statement +function s:GetVarIndent(lnum) + let lvar = s:InMultiVarStatement(a:lnum) + let prev_lnum = s:PrevNonBlankNonString(a:lnum - 1) + + if lvar + let line = s:RemoveTrailingComments(getline(prev_lnum)) + + " if the previous line doesn't end in a comma, return to regular indent + if (line !~ s:comma_last) + return indent(prev_lnum) - &sw + else + return indent(lvar) + &sw endif + endif - " If a var, let, or const was declared and the semicolon omitted, do not - " indent the next line - if getline(prev) =~ '^\s*\(var\|let\|const\)\s\+\w\+' - return indent(prev) + return -1 +endfunction + + +" Check if line 'lnum' has more opening brackets than closing ones. +function s:LineHasOpeningBrackets(lnum) + let open_0 = 0 + let open_2 = 0 + let open_4 = 0 + let line = getline(a:lnum) + let pos = match(line, '[][(){}]', 0) + while pos != -1 + if !s:IsInStringOrComment(a:lnum, pos + 1) + let idx = stridx('(){}[]', line[pos]) + if idx % 2 == 0 + let open_{idx} = open_{idx} + 1 + else + let open_{idx - 1} = open_{idx - 1} - 1 + endif endif + let pos = match(line, '[][(){}]', pos + 1) + endwhile + return (open_0 > 0) . (open_2 > 0) . (open_4 > 0) +endfunction + +function s:Match(lnum, regex) + let col = match(getline(a:lnum), a:regex) + 1 + return col > 0 && !s:IsInStringOrComment(a:lnum, col) ? col : 0 +endfunction + +function s:IndentWithContinuation(lnum, ind, width) + " Set up variables to use and search for MSL to the previous line. + let p_lnum = a:lnum + let lnum = s:GetMSL(a:lnum, 1) + let line = getline(lnum) - " If the line ended with a ',', we should have the same indent as - " the previous one - if getline(prev) =~ ',\s*$' - return indent(prev) + " If the previous line wasn't a MSL and is continuation return its indent. + " TODO: the || s:IsInString() thing worries me a bit. + if p_lnum != lnum + if s:Match(p_lnum,s:continuation_regex)||s:IsInString(p_lnum,strlen(line)) + return a:ind endif + endif - " Try to find out whether the last `}` ended a `<variable> : {` block - if getline(prev) =~ '};\s*$' - " jump to matching `{` bracket - call cursor(prev, 1) - silent normal % + " Set up more variables now that we know we aren't continuation bound. + let msl_ind = indent(lnum) + + " If the previous line ended with [*+/.-=], start a continuation that + " indents an extra level. + if s:Match(lnum, s:continuation_regex) + if lnum == p_lnum + return msl_ind + a:width + else + return msl_ind + endif + endif + + return a:ind +endfunction + +function s:InOneLineScope(lnum) + let msl = s:GetMSL(a:lnum, 1) + if msl > 0 && s:Match(msl, s:one_line_scope_regex) + return msl + endif + return 0 +endfunction - " See if current line is type annotation without closing ';' but open - " `{` bracket - let lnum = line('.') - if getline(lnum) =~ '^\s*\w\+\s*:[^;]\+{' - let ind = indent(lnum) +function s:ExitingOneLineScope(lnum) + let msl = s:GetMSL(a:lnum, 1) + if msl > 0 + " if the current line is in a one line scope .. + if s:Match(msl, s:one_line_scope_regex) + return 0 + else + let prev_msl = s:GetMSL(msl - 1, 1) + if s:Match(prev_msl, s:one_line_scope_regex) + return prev_msl + endif + endif + endif + return 0 +endfunction + +" 3. GetTypescriptIndent Function {{{1 +" ========================= + +function GetTypescriptIndent() + " 3.1. Setup {{{2 + " ---------- + + " Set up variables for restoring position in file. Could use v:lnum here. + let vcol = col('.') + + " 3.2. Work on the current line {{{2 + " ----------------------------- + + let ind = -1 + " Get the current line. + let line = getline(v:lnum) + " previous nonblank line number + let prevline = prevnonblank(v:lnum - 1) + + " If we got a closing bracket on an empty line, find its match and indent + " according to it. For parentheses we indent to its column - 1, for the + " others we indent to the containing line's MSL's level. Return -1 if fail. + let col = matchend(line, '^\s*[],})]') + if col > 0 && !s:IsInStringOrComment(v:lnum, col) + call cursor(v:lnum, col) + + let lvar = s:InMultiVarStatement(v:lnum) + if lvar + let prevline_contents = s:RemoveTrailingComments(getline(prevline)) + + " check for comma first + if (line[col - 1] =~ ',') + " if the previous line ends in comma or semicolon don't indent + if (prevline_contents =~ '[;,]\s*$') + return indent(s:GetMSL(line('.'), 0)) + " get previous line indent, if it's comma first return prevline indent + elseif (prevline_contents =~ s:comma_first) + return indent(prevline) + " otherwise we indent 1 level + else + return indent(lvar) + &sw endif + endif endif + + let bs = strpart('(){}[]', stridx(')}]', line[col - 1]) * 2, 2) + if searchpair(escape(bs[0], '\['), '', bs[1], 'bW', s:skip_expr) > 0 + if line[col-1]==')' && col('.') != col('$') - 1 + let ind = virtcol('.')-1 + else + let ind = indent(s:GetMSL(line('.'), 0)) + endif + endif return ind + endif + + " If the line is comma first, dedent 1 level + if (getline(prevline) =~ s:comma_first) + return indent(prevline) - &sw + endif + + if (line =~ s:ternary) + if (getline(prevline) =~ s:ternary_q) + return indent(prevline) + else + return indent(prevline) + &sw + endif + endif + + " If we are in a multi-line comment, cindent does the right thing. + if s:IsInMultilineComment(v:lnum, 1) && !s:IsLineComment(v:lnum, 1) + return cindent(v:lnum) + endif + + " Check for multiple var assignments +" let var_indent = s:GetVarIndent(v:lnum) +" if var_indent >= 0 +" return var_indent +" endif + + " 3.3. Work on the previous line. {{{2 + " ------------------------------- + + " If the line is empty and the previous nonblank line was a multi-line + " comment, use that comment's indent. Deduct one char to account for the + " space in ' */'. + if line =~ '^\s*$' && s:IsInMultilineComment(prevline, 1) + return indent(prevline) - 1 + endif + + " Find a non-blank, non-multi-line string line above the current line. + let lnum = s:PrevNonBlankNonString(v:lnum - 1) + + " If the line is empty and inside a string, use the previous line. + if line =~ '^\s*$' && lnum != prevline + return indent(prevnonblank(v:lnum)) + endif + + " At the start of the file use zero indent. + if lnum == 0 + return 0 + endif + + " Set up variables for current line. + let line = getline(lnum) + let ind = indent(lnum) + + " If the previous line ended with a block opening, add a level of indent. + if s:Match(lnum, s:block_regex) + return indent(s:GetMSL(lnum, 0)) + &sw + endif + + " If the previous line contained an opening bracket, and we are still in it, + " add indent depending on the bracket type. + if line =~ '[[({]' + let counts = s:LineHasOpeningBrackets(lnum) + if counts[0] == '1' && searchpair('(', '', ')', 'bW', s:skip_expr) > 0 + if col('.') + 1 == col('$') + return ind + &sw + else + return virtcol('.') + endif + elseif counts[1] == '1' || counts[2] == '1' + return ind + &sw + else + call cursor(v:lnum, vcol) + end + endif + + " 3.4. Work on the MSL line. {{{2 + " -------------------------- + let ind_con = ind + let ind = s:IndentWithContinuation(lnum, ind_con, &sw) + + " }}}2 + " + " + let ols = s:InOneLineScope(lnum) + if ols > 0 + let ind = ind + &sw + else + let ols = s:ExitingOneLineScope(lnum) + while ols > 0 && ind > 0 + let ind = ind - &sw + let ols = s:InOneLineScope(ols - 1) + endwhile + endif + + return ind endfunction -" Restore compatibility mode -let &cpo = s:keepcpo -unlet s:keepcpo +" }}}1 + +let &cpo = s:cpo_save +unlet s:cpo_save + +function! Fixedgq(lnum, count) + let l:tw = &tw ? &tw : 80; + + let l:count = a:count + let l:first_char = indent(a:lnum) + 1 + + if mode() == 'i' " gq was not pressed, but tw was set + return 1 + endif + + " This gq is only meant to do code with strings, not comments + if s:IsLineComment(a:lnum, l:first_char) || s:IsInMultilineComment(a:lnum, l:first_char) + return 1 + endif + + if len(getline(a:lnum)) < l:tw && l:count == 1 " No need for gq + return 1 + endif + + " Put all the lines on one line and do normal spliting after that + if l:count > 1 + while l:count > 1 + let l:count -= 1 + normal J + endwhile + endif + + let l:winview = winsaveview() + + call cursor(a:lnum, l:tw + 1) + let orig_breakpoint = searchpairpos(' ', '', '\.', 'bcW', '', a:lnum) + call cursor(a:lnum, l:tw + 1) + let breakpoint = searchpairpos(' ', '', '\.', 'bcW', s:skip_expr, a:lnum) + + " No need for special treatment, normal gq handles edgecases better + if breakpoint[1] == orig_breakpoint[1] + call winrestview(l:winview) + return 1 + endif + + " Try breaking after string + if breakpoint[1] <= indent(a:lnum) + call cursor(a:lnum, l:tw + 1) + let breakpoint = searchpairpos('\.', '', ' ', 'cW', s:skip_expr, a:lnum) + endif -" vim: et + + if breakpoint[1] != 0 + call feedkeys("r\<CR>") + else + let l:count = l:count - 1 + endif + + " run gq on new lines + if l:count == 1 + call feedkeys("gqq") + endif + + return 0 +endfunction endif diff --git a/syntax/blade.vim b/syntax/blade.vim index 0a1f7607..bbce6b14 100644 --- a/syntax/blade.vim +++ b/syntax/blade.vim @@ -1,45 +1,49 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'blade') == -1 -" Language: Blade +" Vim syntax file +" Language: Blade (Laravel) " Maintainer: Jason Walton <jwalton512@gmail.com> -" URL: https://github.com/xsbeats/vim-blade -" License: DBAD +" Filenames: *.blade.php -" Check if our syntax is already loaded -if exists('b:current_syntax') && b:current_syntax == 'blade' +if exists('b:current_syntax') finish endif -" Include PHP +if !exists("main_syntax") + let main_syntax = 'blade' +endif + +runtime! syntax/html.vim +unlet! b:current_syntax runtime! syntax/php.vim -silent! unlet b:current_syntax +unlet! b:current_syntax + +syn case match +syn clear htmlError + +syn region bladeEcho matchgroup=bladeDelimiter start="@\@<!{{" end="}}" contains=@bladePhp,bladePhpParenBlock containedin=ALLBUT,@bladeExempt keepend +syn region bladeEcho matchgroup=bladeDelimiter start="{!!" end="!!}" contains=@bladePhp,bladePhpParenBlock containedin=ALLBUT,@bladeExempt keepend +syn region bladeComment matchgroup=bladeDelimiter start="{{--" end="--}}" contains=bladeTodo containedin=ALLBUT,@bladeExempt keepend -" Echos -syn region bladeUnescapedEcho matchgroup=bladeEchoDelim start=/@\@<!\s*{!!/ end=/!!}\s*/ oneline contains=@phpClTop containedin=ALLBUT,bladeComment -syn region bladeEscapedEcho matchgroup=bladeEchoDelim start=/@\@<!\s*{{{\@!/ end=/}}\s*/ oneline contains=@phpClTop containedin=ALLBUT,bladeComment -syn region bladeEscapedEcho matchgroup=bladeEchoDelim start=/@\@<!\s*{{{{\@!/ end=/}}}/ oneline contains=@phpClTop containedin=ALLBUT,bladeComment +syn keyword bladeKeyword @if @elseif @foreach @forelse @for @while @can @include @each @inject @extends @section @unless nextgroup=bladePhpParenBlock skipwhite containedin=ALLBUT,@bladeExempt +syn keyword bladeKeyword @else @endif @endunless @endfor @endforeach @empty @endforelse @endwhile @endcan @stop @append @endsection containedin=ALLBUT,@bladeExempt -" Structures -syn match bladeStructure /\s*@\(else\|empty\|endfor\|endforeach\|endforelse\|endif\|endpush\|endsection\|endunless\|endwhile\|overwrite\|show\|stop\)\>/ -syn match bladeStructure /\s*@\(append\|choice\|each\|elseif\|extends\|for\|foreach\|forelse\|if\|include\|lang\|push\|section\|stack\|unless\|while\|yield\|\)\>\s*/ nextgroup=bladeParens -syn region bladeParens matchgroup=bladeParen start=/(/ end=/)/ contained contains=@bladeAll,@phpClTop +syn region bladePhpParenBlock matchgroup=bladeDelimiter start="\s*(" end=")" contains=@bladePhp,bladePhpParenBlock skipwhite contained -" Comments -syn region bladeComments start=/\s*{{--/ end=/--}}/ contains=bladeComment keepend -syn match bladeComment /.*/ contained containedin=bladeComments +syn cluster bladePhp contains=@phpClTop +syn cluster bladeExempt contains=bladeComment,@htmlTop -" Clusters -syn cluster bladeAll contains=bladeStructure,bladeParens +syn keyword bladeTodo todo fixme xxx contained -" Highlighting +hi def link bladeDelimiter PreProc hi def link bladeComment Comment -hi def link bladeEchoDelim Delimiter -hi def link bladeParen Delimiter -hi def link bladeStructure Keyword +hi def link bladeTodo Todo +hi def link bladeKeyword Statement +let b:current_syntax = 'blade' -if !exists('b:current_syntax') - let b:current_syntax = 'blade' +if exists('main_syntax') && main_syntax == 'blade' + unlet main_syntax endif endif diff --git a/syntax/eelixir.vim b/syntax/eelixir.vim index 6d940cb9..38dee597 100644 --- a/syntax/eelixir.vim +++ b/syntax/eelixir.vim @@ -1,9 +1,5 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1 -" Vim syntax file -" Language: Embedded Elixir -" URL: https://github.com/elixir-lang/vim-elixir - if exists("b:current_syntax") finish endif @@ -66,5 +62,4 @@ if main_syntax == 'eelixir' unlet main_syntax endif - endif diff --git a/syntax/elixir.vim b/syntax/elixir.vim index b75340b3..3f0a8dbb 100644 --- a/syntax/elixir.vim +++ b/syntax/elixir.vim @@ -1,10 +1,5 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1 -" Vim syntax file -" Language: Elixir -" Maintainer: Carlos Galdino <carloshsgaldino@gmail.com> -" Last Change: 2013 Apr 24 - if exists("b:current_syntax") finish endif @@ -12,21 +7,21 @@ endif " syncing starts 2000 lines before top line so docstrings don't screw things up syn sync minlines=2000 -syn cluster elixirNotTop contains=@elixirRegexSpecial,@elixirStringContained,@elixirDeclaration,elixirTodo,elixirArguments +syn cluster elixirNotTop contains=@elixirRegexSpecial,@elixirStringContained,@elixirDeclaration,elixirTodo,elixirArguments,elixirBlockDefinition syn match elixirComment '#.*' contains=elixirTodo,@Spell syn keyword elixirTodo FIXME NOTE TODO OPTIMIZE XXX HACK contained -syn keyword elixirKeyword case when cond for if unless try receive send -syn keyword elixirKeyword exit raise throw after rescue catch else do end +syn keyword elixirKeyword case when with cond for if unless try receive send +syn keyword elixirKeyword exit raise throw after rescue catch else syn keyword elixirKeyword quote unquote super spawn spawn_link spawn_monitor " Functions used on guards syn keyword elixirKeyword contained is_atom is_binary is_bitstring is_boolean syn keyword elixirKeyword contained is_float is_function is_integer is_list -syn keyword elixirKeyword contained is_map is_number is_pid is_port is_record -syn keyword elixirKeyword contained is_reference is_tuple is_exception abs -syn keyword elixirKeyword contained bit_size byte_size div elem hd length +syn keyword elixirKeyword contained is_map is_nil is_number is_pid is_port +syn keyword elixirKeyword contained is_record is_reference is_tuple is_exception +syn keyword elixirKeyword contained abs bit_size byte_size div elem hd length syn keyword elixirKeyword contained map_size node rem round tl trunc tuple_size syn match elixirGuard '.*when.*' contains=ALLBUT,@elixirNotTop @@ -87,14 +82,14 @@ syn region elixirInterpolation matchgroup=elixirInterpolationDelimiter start="#{ syn region elixirDocStringStart matchgroup=elixirDocString start=+"""+ end=+$+ oneline contains=ALLBUT,@elixirNotTop syn region elixirDocStringStart matchgroup=elixirDocString start=+'''+ end=+$+ oneline contains=ALLBUT,@elixirNotTop -syn region elixirDocString start=+\z("""\)+ end=+^\s*\zs\z1+ contains=elixirDocStringStart,elixirTodo,elixirInterpolation,@Spell fold keepend -syn region elixirDocString start=+\z('''\)+ end=+^\s*\zs\z1+ contains=elixirDocStringStart,elixirTodo,elixirInterpolation,@Spell fold keepend +syn region elixirDocString start=+\z("""\)+ end=+^\s*\zs\z1+ contains=elixirDocStringStart,elixirTodo,elixirInterpolation,@Spell keepend fold +syn region elixirDocString start=+\z('''\)+ end=+^\s*\zs\z1+ contains=elixirDocStringStart,elixirTodo,elixirInterpolation,@Spell keepend fold syn match elixirAtomInterpolated ':\("\)\@=' contains=elixirString syn match elixirString "\(\w\)\@<!?\%(\\\(x\d{1,2}\|\h{1,2}\h\@!\>\|0[0-7]{0,2}[0-7]\@!\>\|[^x0MC]\)\|(\\[MC]-)+\w\|[^\s\\]\)" -syn region elixirBlock matchgroup=elixirKeyword start="\<do\>\(:\)\@!" end="\<end\>" contains=ALLBUT,@elixirNotTop fold -syn region elixirAnonymousFunction matchgroup=elixirKeyword start="\<fn\>" end="\<end\>" contains=ALLBUT,@elixirNotTop fold +syn region elixirBlock matchgroup=elixirBlockDefinition start="\<do\>:\@!" end="\<end\>" contains=ALLBUT,@elixirNotTop fold +syn region elixirAnonymousFunction matchgroup=elixirBlockDefinition start="\<fn\>" end="\<end\>" contains=ALLBUT,@elixirNotTop fold syn region elixirArguments start="(" end=")" contained contains=elixirOperator,elixirAtom,elixirPseudoVariable,elixirAlias,elixirBoolean,elixirVariable,elixirUnusedVariable,elixirNumber,elixirDocString,elixirAtomInterpolated,elixirRegex,elixirString,elixirStringDelimiter,elixirRegexDelimiter,elixirInterpolationDelimiter,elixirSigilDelimiter @@ -106,11 +101,11 @@ syn region elixirSigil matchgroup=elixirSigilDelimiter start="\~\u<" syn region elixirSigil matchgroup=elixirSigilDelimiter start="\~\u\[" end="\]" skip="\\\\\|\\\]" contains=elixirDelimEscape fold syn region elixirSigil matchgroup=elixirSigilDelimiter start="\~\u(" end=")" skip="\\\\\|\\)" contains=elixirDelimEscape fold -syn region elixirSigil matchgroup=elixirSigilDelimiter start="\~\l\z(/\|\"\|'\||\)" end="\z1" skip="\\\\\|\\\z1" fold -syn region elixirSigil matchgroup=elixirSigilDelimiter start="\~\l{" end="}" skip="\\\\\|\\}" fold contains=@elixirStringContained,elixirRegexEscapePunctuation -syn region elixirSigil matchgroup=elixirSigilDelimiter start="\~\l<" end=">" skip="\\\\\|\\>" fold contains=@elixirStringContained,elixirRegexEscapePunctuation -syn region elixirSigil matchgroup=elixirSigilDelimiter start="\~\l\[" end="\]" skip="\\\\\|\\\]" fold contains=@elixirStringContained,elixirRegexEscapePunctuation -syn region elixirSigil matchgroup=elixirSigilDelimiter start="\~\l(" end=")" skip="\\\\\|\\)" fold contains=@elixirStringContained,elixirRegexEscapePunctuation +syn region elixirSigil matchgroup=elixirSigilDelimiter start="\~\l\z(/\|\"\|'\||\)" end="\z1" skip="\\\\\|\\\z1" fold +syn region elixirSigil matchgroup=elixirSigilDelimiter start="\~\l{" end="}" skip="\\\\\|\\}" contains=@elixirStringContained,elixirRegexEscapePunctuation fold +syn region elixirSigil matchgroup=elixirSigilDelimiter start="\~\l<" end=">" skip="\\\\\|\\>" contains=@elixirStringContained,elixirRegexEscapePunctuation fold +syn region elixirSigil matchgroup=elixirSigilDelimiter start="\~\l\[" end="\]" skip="\\\\\|\\\]" contains=@elixirStringContained,elixirRegexEscapePunctuation fold +syn region elixirSigil matchgroup=elixirSigilDelimiter start="\~\l(" end=")" skip="\\\\\|\\)" contains=@elixirStringContained,elixirRegexEscapePunctuation fold " Sigils surrounded with docString syn region elixirSigil matchgroup=elixirSigilDelimiter start=+\~\a\z("""\)+ end=+^\s*\zs\z1+ skip=+\\"+ fold @@ -147,6 +142,7 @@ syn match elixirCallbackDeclaration "[^[:space:];#<,()\[\]]\+" contained con syn cluster elixirDeclaration contains=elixirFunctionDeclaration,elixirModuleDeclaration,elixirProtocolDeclaration,elixirImplDeclaration,elixirRecordDeclaration,elixirMacroDeclaration,elixirDelegateDeclaration,elixirOverridableDeclaration,elixirExceptionDeclaration,elixirCallbackDeclaration,elixirStructDeclaration +hi def link elixirBlockDefinition Keyword hi def link elixirDefine Define hi def link elixirPrivateDefine Define hi def link elixirModuleDefine Define diff --git a/syntax/go.vim b/syntax/go.vim index 4cd53c45..a0a86e83 100644 --- a/syntax/go.vim +++ b/syntax/go.vim @@ -71,6 +71,10 @@ if !exists("g:go_highlight_structs") let g:go_highlight_structs = 0 endif +if !exists("g:go_highlight_interfaces") + let g:go_highlight_interfaces = 0 +endif + if !exists("g:go_highlight_build_constraints") let g:go_highlight_build_constraints = 0 endif @@ -210,9 +214,17 @@ endif " Spacing errors around the 'chan' keyword if g:go_highlight_chan_whitespace_error != 0 " receive-only annotation on chan type - syn match goSpaceError display "\(<-\)\@<=\s\+\(chan\>\)\@=" + " + " \(\<chan\>\)\@<!<- (only pick arrow when it doesn't come after a chan) + " this prevents picking up 'chan<- chan<-' but not '<- chan' + syn match goSpaceError display "\(\(\<chan\>\)\@<!<-\)\@<=\s\+\(\<chan\>\)\@=" + " send-only annotation on chan type - syn match goSpaceError display "\(\<chan\)\@<=\s\+\(<-\)\@=" + " + " \(<-\)\@<!\<chan\> (only pick chan when it doesn't come after an arrow) + " this prevents picking up '<-chan <-chan' but not 'chan <-' + syn match goSpaceError display "\(\(<-\)\@<!\<chan\>\)\@<=\s\+\(<-\)\@=" + " value-ignoring receives in a few contexts syn match goSpaceError display "\(\(^\|[={(,;]\)\s*<-\)\@<=\s\+" endif @@ -285,6 +297,14 @@ endif hi def link goStruct Function hi def link goStructDef Function +" Interfaces; +if g:go_highlight_interfaces != 0 + syn match goInterface /\(.\)\@<=\w\+\({\)\@=/ + syn match goInterfaceDef /\(type\s\+\)\@<=\w\+\(\s\+interface\s\+{\)\@=/ +endif +hi def link goInterface Function +hi def link goInterfaceDef Function + " Build Constraints if g:go_highlight_build_constraints != 0 syn match goBuildKeyword display contained "+build" diff --git a/syntax/html.vim b/syntax/html.vim index abeb1490..77dc0fce 100644 --- a/syntax/html.vim +++ b/syntax/html.vim @@ -1,28 +1,27 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'html5') == -1 " Vim syntax file -" Language: HTML (version 5) -" Maintainer: Rodrigo Machado <rcmachado@gmail.com> -" URL: http://rm.blog.br/vim/syntax/html.vim -" Last Change: 2009 Aug 19 +" Language: HTML (version 5.1) +" SVG (SVG 1.1 (Second Edition) ) +" Last Change: 2016 Jan 20 " License: Public domain " (but let me know if you like :) ) " -" Note: This file just adds the new tags from HTML 5 +" Note: This file just add new tags from HTML 5 " and don't replace default html.vim syntax file " -" Modified: othree <othree@gmail.com> -" Changes: update to Draft 13 January 2011 -" add complete new attributes +" Maintainer: Kao, Wei-Ko(othree) ( othree AT gmail DOT com ) +" Changes: update to Draft 2016 Jan 13 " add microdata Attributes -" add bdi element +" Maintainer: Rodrigo Machado <rcmachado@gmail.com> +" URL: http://rm.blog.br/vim/syntax/html.vim " Modified: htdebeer <H.T.de.Beer@gmail.com> " Changes: add common SVG elements and attributes for inline SVG " HTML 5 tags syn keyword htmlTagName contained article aside audio canvas command syn keyword htmlTagName contained datalist details dialog embed figcaption figure footer -syn keyword htmlTagName contained header hgroup keygen main mark meter menu nav output +syn keyword htmlTagName contained header hgroup keygen main mark meter menu menuitem nav output syn keyword htmlTagName contained progress ruby rt rp rb rtc section source summary time track video data syn keyword htmlTagName contained template content shadow syn keyword htmlTagName contained wbr bdi @@ -43,6 +42,7 @@ syn keyword htmlTagName contained glyph glyphRef hkern syn keyword htmlTagName contained linearGradient marker mask pattern radialGradient set stop syn keyword htmlTagName contained missing-glyph mpath syn keyword htmlTagName contained text textPath tref tspan vkern +syn keyword htmlTagName contained metadata title " Custom Element syn match htmlTagName contained "\<[a-z_]\([a-z0-9_.]\+\)\?\(\-[a-z0-9_.]\+\)\+\>" @@ -101,21 +101,21 @@ syn keyword htmlArg contained d descent diffuseConstant divisor dur dx dy syn keyword htmlArg contained edgeMode elevation end exponent externalResourcesRequired syn keyword htmlArg contained fill filterRes filterUnits font-family font-size font-stretch font-style font-variant font-weight format format from fx fy syn keyword htmlArg contained g1 g2 glyph-name glyphRef gradientTransform gradientUnits -syn keyword htmlArg contained hanging height horiz-adv-x horiz-origin-y +syn keyword htmlArg contained hanging height horiz-adv-x horiz-origin-x horiz-origin-y syn keyword htmlArg contained id ideographic in in2 intercept syn keyword htmlArg contained k k1 k2 k3 k4 kernelMatrix kernelUnitLength keyPoints keySplines keyTimes syn keyword htmlArg contained lang lengthAdjust limitingConeAngle local syn keyword htmlArg contained markerHeight markerUnits markerWidth maskContentUnits maskUnits mathematical max media method min mode name syn keyword htmlArg contained numOctaves -syn keyword htmlArg contained offset offset onabort onactivate onbegin onclick onend onerror onfocusin onfocusout onload onload onmousedown onmousemove onmouseout onmouseover onmouseup onrepeat onresize onscroll onunload onzoom operator order orient orientation origin overline-position overline-thickness +syn keyword htmlArg contained offset onabort onactivate onbegin onclick onend onerror onfocusin onfocusout onload onmousedown onmousemove onmouseout onmouseover onmouseup onrepeat onresize onscroll onunload onzoom operator order orient orientation origin overline-position overline-thickness syn keyword htmlArg contained panose-1 path pathLength patternContentUnits patternTransform patternUnits points pointsAtX pointsAtY pointsAtZ preserveAlpha preserveAspectRatio primitiveUnits syn keyword htmlArg contained r radius refX refY rendering-intent repeatCount repeatDur requiredExtensions requiredFeatures restart result rotate rx ry syn keyword htmlArg contained scale seed slope spacing specularConstant specularExponent spreadMethod startOffset stdDeviation stemh stemv stitchTiles strikethrough-position strikethrough-thickness string surfaceScale systemLanguage -syn keyword htmlArg contained tableValues target targetX targetY textLength title to transform type u -syn keyword htmlArg contained 1 u2 underline-position underline-thickness unicode unicode-range units-per-em +syn keyword htmlArg contained tableValues target targetX targetY textLength title to transform type +syn keyword htmlArg contained u1 u2 underline-position underline-thickness unicode unicode-range units-per-em syn keyword htmlArg contained v-alphabetic v-hanging v-ideographic v-mathematical values version vert-adv-y vert-origin-x vert-origin-y viewBox viewTarget syn keyword htmlArg contained width widths -syn keyword htmlArg contained x x-height x1 x2 xChannelSelector xlink:actuate xlink:actuate xlink:arcrole xlink:href xlink:role xlink:show xlink:show xlink:title xlink:type xml:base xml:lang xml:space +syn keyword htmlArg contained x x-height x1 x2 xChannelSelector xlink:actuate xlink:actuate xlink:arcrole xlink:href xlink:role xlink:show xlink:title xlink:type xml:base xml:lang xml:space syn keyword htmlArg contained y y1 y2 yChannelSelector syn keyword htmlArg contained z zoomAndPan syn keyword htmlArg contained alignment-baseline baseline-shift clip-path clip-rule clip color-interpolation-filters color-interpolation color-profile color-rendering color cursor direction display dominant-baseline enable-background fill-opacity fill-rule fill filter flood-color flood-opacity font-family font-size-adjust font-size font-stretch font-style font-variant font-weight glyph-orientation-horizontal glyph-orientation-vertical image-rendering kerning letter-spacing lighting-color marker-end marker-mid marker-start mask opacity overflow pointer-events shape-rendering stop-color stop-opacity stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width stroke text-anchor text-decoration text-rendering unicode-bidi visibility word-spacing writing-mode diff --git a/syntax/jade.vim b/syntax/jade.vim index 27f2da85..ff6c7e28 100644 --- a/syntax/jade.vim +++ b/syntax/jade.vim @@ -64,7 +64,7 @@ syn region jadeMarkdownFilter matchgroup=jadeFilter start=/^\z(\s*\):\%(markdow 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 "^\s*\<\%(if\|else\|unless\|while\|until\|case\|when\|default\)\>[?!]\@!" +syn match jadeScriptConditional "^\s*\<\%(if\|else\|else if\|elif\|unless\|while\|until\|case\|when\|default\)\>[?!]\@!" syn match jadeScriptStatement "^\s*\<\%(each\|for\|block\|prepend\|append\|mixin\|extends\|include\)\>[?!]\@!" syn region jadeScriptLoopRegion start="^\s*\(for \)" end="$" contains=jadeScriptLoopKeywords syn keyword jadeScriptLoopKeywords for in contained diff --git a/syntax/perl6.vim b/syntax/perl6.vim index 9d1e39b6..ff8070b8 100644 --- a/syntax/perl6.vim +++ b/syntax/perl6.vim @@ -1951,7 +1951,7 @@ endif if exists("perl6_fold") || exists("perl6_extended_all") setl foldmethod=syntax syn region p6BlockFold - \ start="^\z(\s*\)\%(my\|our\|augment\|multi\|proto\|only\)\?\s*\%(\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\s\+\)\?\<\%(CATCH\|try\|ENTER\|LEAVE\|CHECK\|INIT\|BEGIN\|END\|KEEP\|UNDO\|PRE\|POST\|module\|package\|enum\|subset\|class\|sub\%(method\)\?\|multi\|method\|slang\|grammar\|regex\|token\|rule\)\>[^{]\+{\%(\s+\|#.*\)\?$" + \ start="^\z(\s*\)\%(my\|our\|augment\|multi\|proto\|only\)\?\s*\%(\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\s\+\)\?\<\%(CATCH\|try\|ENTER\|LEAVE\|CHECK\|INIT\|BEGIN\|END\|KEEP\|UNDO\|PRE\|POST\|module\|package\|enum\|subset\|class\|sub\%(method\)\?\|multi\|method\|slang\|grammar\|regex\|token\|rule\)\>[^{]\+\%({\s*\%(#.*\)\?\)\?$" \ end="^\z1}" \ transparent fold keepend extend endif diff --git a/syntax/ruby.vim b/syntax/ruby.vim index 43dd3d36..3a6ef484 100644 --- a/syntax/ruby.vim +++ b/syntax/ruby.vim @@ -179,20 +179,20 @@ syn region rubySymbol matchgroup=rubySymbolDelimiter start="%I\[" end="\]" s syn region rubySymbol matchgroup=rubySymbolDelimiter start="%I(" end=")" skip="\\\\\|\\)" contains=@rubyStringSpecial,rubyNestedParentheses,rubyDelimEscape fold " Here Document -syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs\%(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)+ end=+$+ oneline contains=ALLBUT,@rubyNotTop -syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs"\%([^"]*\)"+ end=+$+ oneline contains=ALLBUT,@rubyNotTop -syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs'\%([^']*\)'+ end=+$+ oneline contains=ALLBUT,@rubyNotTop -syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs`\%([^`]*\)`+ end=+$+ oneline contains=ALLBUT,@rubyNotTop - -syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<\z(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial fold keepend -syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<"\z([^"]*\)"\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial fold keepend -syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<'\z([^']*\)'\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc fold keepend -syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<`\z([^`]*\)`\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial fold keepend - -syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<-\z(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend -syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<-"\z([^"]*\)"\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend -syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<-'\z([^']*\)'\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart fold keepend -syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<-`\z([^`]*\)`\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend +syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<[-~]\=\zs\%(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)+ end=+$+ oneline contains=ALLBUT,@rubyNotTop +syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<[-~]\=\zs"\%([^"]*\)"+ end=+$+ oneline contains=ALLBUT,@rubyNotTop +syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<[-~]\=\zs'\%([^']*\)'+ end=+$+ oneline contains=ALLBUT,@rubyNotTop +syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<[-~]\=\zs`\%([^`]*\)`+ end=+$+ oneline contains=ALLBUT,@rubyNotTop + +syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<\z(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial fold keepend +syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<"\z([^"]*\)"\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial fold keepend +syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<'\z([^']*\)'\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc fold keepend +syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<`\z([^`]*\)`\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial fold keepend + +syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<[-~]\z(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend +syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<[-~]"\z([^"]*\)"\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend +syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<[-~]'\z([^']*\)'\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart fold keepend +syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<[-~]`\z([^`]*\)`\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend if exists('main_syntax') && main_syntax == 'eruby' let b:ruby_no_expensive = 1 diff --git a/syntax/rust.vim b/syntax/rust.vim index b01c0465..644fc51b 100644 --- a/syntax/rust.vim +++ b/syntax/rust.vim @@ -127,7 +127,6 @@ syn match rustMacro '#\w\(\w\)*' contains=rustAssert,rustPanic syn match rustEscapeError display contained /\\./ syn match rustEscape display contained /\\\([nrt0\\'"]\|x\x\{2}\)/ -syn match rustEscapeUnicode display contained /\\\(u\x\{4}\|U\x\{8}\)/ syn match rustEscapeUnicode display contained /\\u{\x\{1,6}}/ syn match rustStringContinuation display contained /\\\n\s*/ syn region rustString start=+b"+ skip=+\\\\\|\\"+ end=+"+ contains=rustEscape,rustEscapeError,rustStringContinuation diff --git a/syntax/swift.vim b/syntax/swift.vim index 4f5230ae..db24f594 100644 --- a/syntax/swift.vim +++ b/syntax/swift.vim @@ -16,13 +16,47 @@ syntax match swiftShebang "\v#!.*$" " Comment contained keywords syntax keyword swiftTodos contained TODO XXX FIXME NOTE syntax keyword swiftMarker contained MARK -syntax match swiftDocString "\v^\s*-\s*parameter"hs=s+1 contained -syntax match swiftDocString "\v^\s*-\s*returns"hs=s+1 contained + +" In comment identifiers +function! s:CommentKeywordMatch(keyword) + execute "syntax match swiftDocString \"\\v^\\s*-\\s*". a:keyword . "\\W\"hs=s+1,he=e-1 contained" +endfunction + +syntax case ignore + +call s:CommentKeywordMatch("attention") +call s:CommentKeywordMatch("author") +call s:CommentKeywordMatch("authors") +call s:CommentKeywordMatch("bug") +call s:CommentKeywordMatch("complexity") +call s:CommentKeywordMatch("copyright") +call s:CommentKeywordMatch("date") +call s:CommentKeywordMatch("experiment") +call s:CommentKeywordMatch("important") +call s:CommentKeywordMatch("invariant") +call s:CommentKeywordMatch("note") +call s:CommentKeywordMatch("parameter") +call s:CommentKeywordMatch("postcondition") +call s:CommentKeywordMatch("precondition") +call s:CommentKeywordMatch("remark") +call s:CommentKeywordMatch("remarks") +call s:CommentKeywordMatch("requires") +call s:CommentKeywordMatch("returns") +call s:CommentKeywordMatch("see") +call s:CommentKeywordMatch("since") +call s:CommentKeywordMatch("throws") +call s:CommentKeywordMatch("todo") +call s:CommentKeywordMatch("version") +call s:CommentKeywordMatch("warning") + +syntax case match +delfunction s:CommentKeywordMatch + " Literals " Strings -syntax region swiftString start=/"/ skip=/\\\\\|\\"/ end=/"/ contains=swiftInterpolatedWrapper -syntax region swiftInterpolatedWrapper start="\v[^\\]\\\(\s*" end="\v\s*\)" contained containedin=swiftString contains=swiftInterpolatedString +syntax region swiftString start=/"/ skip=/\\\\\|\\"/ end=/"/ contains=swiftInterpolatedWrapper oneline +syntax region swiftInterpolatedWrapper start="\v[^\\]\\\(\s*" end="\v\s*\)" contained containedin=swiftString contains=swiftInterpolatedString,swiftString syntax match swiftInterpolatedString "\v\w+(\(\))?" contained containedin=swiftInterpolatedWrapper " Numbers @@ -167,9 +201,9 @@ syntax keyword swiftStructure \ struct \ enum -syntax region swiftTypeWrapper start="\v:\s*" skip="\s*,\s*$*\s*" end="$" contains=swiftString,swiftBoolean,swiftNumber,swiftType,swiftGenericsWrapper transparent +syntax region swiftTypeWrapper start="\v:\s*" skip="\s*,\s*$*\s*" end="$\|/"me=e-1 contains=ALL transparent syntax region swiftGenericsWrapper start="\v\<" end="\v\>" contains=swiftType transparent oneline -syntax region swiftLiteralWrapper start="\v\=\s*" skip="\v[^\[\]]\(\)" end="\v(\[\]|\(\))" contains=swiftType,swiftString transparent oneline +syntax region swiftLiteralWrapper start="\v\=\s*" skip="\v[^\[\]]\(\)" end="\v(\[\]|\(\))" contains=ALL transparent oneline syntax region swiftReturnWrapper start="\v-\>\s*" end="\v(\{|$)" contains=swiftType transparent oneline syntax match swiftType "\v<\u\w*" contained containedin=swiftGenericsWrapper,swiftTypeWrapper,swiftLiteralWrapper,swiftGenericsWrapper |