diff options
39 files changed, 884 insertions, 385 deletions
| diff --git a/after/syntax/less.vim b/after/syntax/less.vim index 4ed28557..7261d9eb 100644 --- a/after/syntax/less.vim +++ b/after/syntax/less.vim @@ -3,4 +3,4 @@  if !( has('gui_running') || &t_Co==256 ) | finish | endif -call css_color#init('css', 'lessVariableValue') +call css_color#init('css', 'lessVariableValue,lessDefinition,lessComment') diff --git a/autoload/htmlcomplete.vim b/autoload/htmlcomplete.vim index 8b4492e4..68a80384 100644 --- a/autoload/htmlcomplete.vim +++ b/autoload/htmlcomplete.vim @@ -10,7 +10,47 @@ if !exists('g:aria_attributes_complete')    let g:aria_attributes_complete = 1  endif -let b:html_omni_flavor = 'html5' +" Distinguish between HTML versions. +" To use with other HTML versions add another "elseif" condition to match +" proper DOCTYPE. +function! htmlcomplete#DetectOmniFlavor() +    if &filetype == 'xhtml' +        let b:html_omni_flavor = 'xhtml10s' +    else +        let b:html_omni_flavor = 'html5' +    endif +    let i = 1 +    let line = "" +    while i < 10 && i < line("$") +        let line = getline(i) +        if line =~ '<!DOCTYPE.*\<DTD ' +            break +        endif +        let i += 1 +    endwhile +    if line =~ '<!DOCTYPE.*\<DTD '  " doctype line found above +        if line =~ ' HTML 3\.2' +            let b:html_omni_flavor = 'html32' +        elseif line =~ ' XHTML 1\.1' +            let b:html_omni_flavor = 'xhtml11' +        else    " two-step detection with strict/frameset/transitional +            if line =~ ' XHTML 1\.0' +                let b:html_omni_flavor = 'xhtml10' +            elseif line =~ ' HTML 4\.01' +                let b:html_omni_flavor = 'html401' +            elseif line =~ ' HTML 4.0\>' +                let b:html_omni_flavor = 'html40' +            endif +            if line =~ '\<Transitional\>' +                let b:html_omni_flavor .= 't' +            elseif line =~ '\<Frameset\>' +                let b:html_omni_flavor .= 'f' +            else +                let b:html_omni_flavor .= 's' +            endif +        endif +    endif +endfunction  function! htmlcomplete#CompleteTags(findstart, base)    if a:findstart @@ -162,11 +202,8 @@ function! htmlcomplete#CompleteTags(findstart, base)  	if exists("b:entitiescompl")  		unlet! b:entitiescompl -		if !exists("b:html_doctype") -			call htmlcomplete#CheckDoctype() -		endif  		if !exists("b:html_omni") -			"runtime! autoload/xml/xhtml10s.vim +			call htmlcomplete#CheckDoctype()  			call htmlcomplete#LoadData()  		endif      if g:aria_attributes_complete == 1 && !exists("b:aria_omni") @@ -464,11 +501,8 @@ function! htmlcomplete#CompleteTags(findstart, base)  			let entered_value = matchstr(attr, ".*=\\s*[\"']\\?\\zs.*")  			let values = []  			" Load data {{{ -			if !exists("b:html_doctype") -				call htmlcomplete#CheckDoctype() -			endif  			if !exists("b:html_omni") -				"runtime! autoload/xml/xhtml10s.vim +				call htmlcomplete#CheckDoctype()  				call htmlcomplete#LoadData()  			endif        if g:aria_attributes_complete == 1 && !exists("b:aria_omni") @@ -547,10 +581,8 @@ function! htmlcomplete#CompleteTags(findstart, base)  		let sbase = matchstr(context, '.*\ze\s.*')  		" Load data {{{ -		if !exists("b:html_doctype") -			call htmlcomplete#CheckDoctype() -		endif  		if !exists("b:html_omni") +			call htmlcomplete#CheckDoctype()  			call htmlcomplete#LoadData()  		endif      if g:aria_attributes_complete == 1 && !exists("b:aria_omni") @@ -653,11 +685,8 @@ function! htmlcomplete#CompleteTags(findstart, base)  	endif  	" }}}  	" Load data {{{ -	if !exists("b:html_doctype") -		call htmlcomplete#CheckDoctype() -	endif  	if !exists("b:html_omni") -		"runtime! autoload/xml/xhtml10s.vim +		call htmlcomplete#CheckDoctype()  		call htmlcomplete#LoadData()  	endif    if g:aria_attributes_complete == 1 && !exists("b:aria_omni") @@ -787,61 +816,8 @@ function! htmlcomplete#CheckDoctype() " {{{  	else  		let old_flavor = ''  	endif -	let i = 1 -	while i < 10 && i < line("$") -		let line = getline(i) -		if line =~ '<!DOCTYPE.*\<DTD HTML 3\.2' -			let b:html_omni_flavor = 'html32' -			let b:html_doctype = 1 -			break -		elseif line =~ '<!DOCTYPE.*\<DTD HTML 4\.0 Transitional' -			let b:html_omni_flavor = 'html40t' -			let b:html_doctype = 1 -			break -		elseif line =~ '<!DOCTYPE.*\<DTD HTML 4\.0 Frameset' -			let b:html_omni_flavor = 'html40f' -			let b:html_doctype = 1 -			break -		elseif line =~ '<!DOCTYPE.*\<DTD HTML 4\.0' -			let b:html_omni_flavor = 'html40s' -			let b:html_doctype = 1 -			break -		elseif line =~ '<!DOCTYPE.*\<DTD HTML 4\.01 Transitional' -			let b:html_omni_flavor = 'html401t' -			let b:html_doctype = 1 -			break -		elseif line =~ '<!DOCTYPE.*\<DTD HTML 4\.01 Frameset' -			let b:html_omni_flavor = 'html401f' -			let b:html_doctype = 1 -			break -		elseif line =~ '<!DOCTYPE.*\<DTD HTML 4\.01' -			let b:html_omni_flavor = 'html401s' -			let b:html_doctype = 1 -			break -		elseif line =~ '<!DOCTYPE.*\<DTD XHTML 1\.0 Transitional' -			let b:html_omni_flavor = 'xhtml10t' -			let b:html_doctype = 1 -			break -		elseif line =~ '<!DOCTYPE.*\<DTD XHTML 1\.0 Frameset' -			let b:html_omni_flavor = 'xhtml10f' -			let b:html_doctype = 1 -			break -		elseif line =~ '<!DOCTYPE.*\<DTD XHTML 1\.0 Strict' -			let b:html_omni_flavor = 'xhtml10s' -			let b:html_doctype = 1 -			break -		elseif line =~ '<!DOCTYPE.*\<DTD XHTML 1\.1' -			let b:html_omni_flavor = 'xhtml11' -			let b:html_doctype = 1 -			break -		elseif line =~ '<!DOCTYPE html' -			let b:html_omni_flavor = 'html5' -			let b:html_doctype = 1 -			break -		endif -		let i += 1 -	endwhile -	if !exists("b:html_doctype") +	call htmlcomplete#DetectOmniFlavor() +	if !exists('b:html_omni_flavor')  		return  	else  		" Tie g:xmldata with b:html_omni this way we need to sourca data file only diff --git a/autoload/rust.vim b/autoload/rust.vim new file mode 100644 index 00000000..c6b9b314 --- /dev/null +++ b/autoload/rust.vim @@ -0,0 +1,225 @@ +" Author: Kevin Ballard +" Description: Helper functions for Rust commands/mappings +" Last Modified: May 27, 2014 + +" Jump {{{1 + +function! rust#Jump(mode, function) range +	let cnt = v:count1 +	normal! m' +	if a:mode ==# 'v' +		norm! gv +	endif +	let foldenable = &foldenable +	set nofoldenable +	while cnt > 0 +		execute "call <SID>Jump_" . a:function . "()" +		let cnt = cnt - 1 +	endwhile +	let &foldenable = foldenable +endfunction + +function! s:Jump_Back() +	call search('{', 'b') +	keepjumps normal! w99[{ +endfunction + +function! s:Jump_Forward() +	normal! j0 +	call search('{', 'b') +	keepjumps normal! w99[{% +	call search('{') +endfunction + +" Run {{{1 + +function! rust#Run(bang, args) +	if a:bang +		let idx = index(a:args, '--') +		if idx != -1 +			let rustc_args = idx == 0 ? [] : a:args[:idx-1] +			let args = a:args[idx+1:] +		else +			let rustc_args = a:args +			let args = [] +		endif +	else +		let rustc_args = [] +		let args = a:args +	endif + +	let b:rust_last_rustc_args = rustc_args +	let b:rust_last_args = args + +	call s:WithPath(function("s:Run"), rustc_args, args) +endfunction + +function! s:Run(path, rustc_args, args) +	try +		let exepath = tempname() +		if has('win32') +			let exepath .= '.exe' +		endif + +		let rustc_args = [a:path, '-o', exepath] + a:rustc_args + +		let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc" + +		let output = system(shellescape(rustc) . " " . join(map(rustc_args, 'shellescape(v:val)'))) +		if output != '' +			echohl WarningMsg +			echo output +			echohl None +		endif +		if !v:shell_error +			exe '!' . shellescape(exepath) . " " . join(map(a:args, 'shellescape(v:val)')) +		endif +	finally +		if exists("exepath") +			silent! call delete(exepath) +		endif +	endtry +endfunction + +" Expand {{{1 + +function! rust#Expand(bang, args) +	if a:bang && !empty(a:args) +		let pretty = a:args[0] +		let args = a:args[1:] +	else +		let pretty = "expanded" +		let args = a:args +	endif +	call s:WithPath(function("s:Expand"), pretty, args) +endfunction + +function! s:Expand(path, pretty, args) +	try +		let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc" + +		let args = [a:path, '--pretty', a:pretty] + a:args +		let output = system(shellescape(rustc) . " " . join(map(args, "shellescape(v:val)"))) +		if v:shell_error +			echohl WarningMsg +			echo output +			echohl None +		else +			new +			silent put =output +			1 +			d +			setl filetype=rust +			setl buftype=nofile +			setl bufhidden=hide +			setl noswapfile +		endif +	endtry +endfunction + +function! rust#CompleteExpand(lead, line, pos) +	if a:line[: a:pos-1] =~ '^RustExpand!\s*\S*$' +		" first argument and it has a ! +		let list = ["normal", "expanded", "typed", "expanded,identified", "flowgraph="] +		if !empty(a:lead) +			call filter(list, "v:val[:len(a:lead)-1] == a:lead") +		endif +		return list +	endif + +	return glob(escape(a:lead, "*?[") . '*', 0, 1) +endfunction + +" Emit {{{1 + +function! rust#Emit(type, args) +	call s:WithPath(function("s:Emit"), a:type, a:args) +endfunction + +function! s:Emit(path, type, args) +	try +		let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc" + +		let args = [a:path, '--emit', a:type, '-o', '-'] + a:args +		let output = system(shellescape(rustc) . " " . join(map(args, "shellescape(v:val)"))) +		if v:shell_error +			echohl WarningMsg +			echo output +			echohl None +		else +			new +			silent put =output +			1 +			d +			if a:type == "ir" +				setl filetype=llvm +			elseif a:type == "asm" +				setl filetype=asm +			endif +			setl buftype=nofile +			setl bufhidden=hide +			setl noswapfile +		endif +	endtry +endfunction + +" Utility functions {{{1 + +function! s:WithPath(func, ...) +	try +		let save_write = &write +		set write +		let path = expand('%') +		let pathisempty = empty(path) +		if pathisempty || !save_write +			" use a temporary file named 'unnamed.rs' inside a temporary +			" directory. This produces better error messages +			let tmpdir = tempname() +			call mkdir(tmpdir) + +			let save_cwd = getcwd() +			silent exe 'lcd' tmpdir + +			let path = 'unnamed.rs' + +			let save_mod = &mod +			set nomod + +			silent exe 'keepalt write! ' . path +			if pathisempty +				silent keepalt 0file +			endif +		else +			update +		endif + +		call call(a:func, [path] + a:000) +	finally +		if exists("save_mod")   | let &mod = save_mod          | endif +		if exists("save_write") | let &write = save_write      | endif +		if exists("save_cwd")   | silent exe 'lcd' save_cwd    | endif +		if exists("tmpdir")     | silent call s:RmDir(tmpdir)  | endif +	endtry +endfunction + +function! rust#AppendCmdLine(text) +	call setcmdpos(getcmdpos()) +	let cmd = getcmdline() . a:text +	return cmd +endfunction + +function! s:RmDir(path) +	" sanity check; make sure it's not empty, /, or $HOME +	if empty(a:path) +		echoerr 'Attempted to delete empty path' +		return 0 +	elseif a:path == '/' || a:path == $HOME +		echoerr 'Attempted to delete protected path: ' . a:path +		return 0 +	endif +	silent exe "!rm -rf " . shellescape(a:path) +endfunction + +" }}}1 + +" vim: set noet sw=4 ts=4: diff --git a/autoload/xml/html5.vim b/autoload/xml/html5.vim index 01a1c742..4c99901a 100644 --- a/autoload/xml/html5.vim +++ b/autoload/xml/html5.vim @@ -553,7 +553,7 @@ let g:xmldata_html5 = {  \ ],  \ 'input': [      \ [], -    \ extend(copy(global_attributes), {'type': ['text', 'password', 'checkbox', 'radio', 'button', 'submit', 'reset', 'file', 'hidden', 'image', 'datetime', 'datetime-local', 'date', 'month', 'time', 'week', 'number', 'range', 'email', 'url', 'search', 'tel', 'coloe'], 'name': [], 'disabled': ['disabled', ''], 'form': [], 'maxlength': [], 'readonly': ['readonly', ''], 'size': [], 'value': [], 'autocomplete': ['on', 'off'], 'autofocus': ['autofocus', ''], 'list': [], 'pattern': [], 'required': ['required', ''], 'placeholder': [], 'checked': ['checked'], 'accept': [], 'multiple': ['multiple', ''], 'alt': [], 'src': [], 'height': [], 'width': [], 'min': [], 'max': [], 'step': [], 'formenctype': ['application/x-www-form-urlencoded', 'multipart/form-data', 'text/plain'], 'formmethod': ['get', 'post', 'put', 'delete'], 'formtarget': [], 'formnovalidate': ['formnovalidate', '']}) +    \ extend(copy(global_attributes), {'type': ['text', 'password', 'checkbox', 'radio', 'button', 'submit', 'reset', 'file', 'hidden', 'image', 'datetime', 'datetime-local', 'date', 'month', 'time', 'week', 'number', 'range', 'email', 'url', 'search', 'tel', 'color'], 'name': [], 'disabled': ['disabled', ''], 'form': [], 'maxlength': [], 'readonly': ['readonly', ''], 'size': [], 'value': [], 'autocomplete': ['on', 'off'], 'autofocus': ['autofocus', ''], 'list': [], 'pattern': [], 'required': ['required', ''], 'placeholder': [], 'checked': ['checked'], 'accept': [], 'multiple': ['multiple', ''], 'alt': [], 'src': [], 'height': [], 'width': [], 'min': [], 'max': [], 'step': [], 'formenctype': ['application/x-www-form-urlencoded', 'multipart/form-data', 'text/plain'], 'formmethod': ['get', 'post', 'put', 'delete'], 'formtarget': [], 'formnovalidate': ['formnovalidate', '']})  \ ],  \ 'ins': [      \ flow_elements, diff --git a/compiler/rake.vim b/compiler/rake.vim index 3bd9da0d..8490f2a9 100644 --- a/compiler/rake.vim +++ b/compiler/rake.vim @@ -27,7 +27,11 @@ CompilerSet errorformat=        \%\\s%#[%f:%l:\ %#%m,        \%\\s%#%f:%l:\ %#%m,        \%\\s%#%f:%l:, -      \%m\ [%f:%l]: +      \%m\ [%f:%l]:, +      \%+Erake\ aborted!, +      \%+EDon't\ know\ how\ to\ build\ task\ %.%#, +      \%+Einvalid\ option:%.%#, +      \%+Irake\ %\\S%\\+%\\s%\\+#\ %.%#  let &cpo = s:cpo_save  unlet s:cpo_save diff --git a/ftdetect/polyglot.vim b/ftdetect/polyglot.vim index 3e74c6ff..d1cc2bf0 100644 --- a/ftdetect/polyglot.vim +++ b/ftdetect/polyglot.vim @@ -31,6 +31,10 @@ autocmd BufNewFile,BufRead,StdinReadPost *        \ if getline(1) =~ '^\(commit\|tree\|object\) \x\{40\}\>\|^tag \S\+$' |        \   set ft=git |        \ endif +autocmd BufNewFile,BufRead * +      \ if getline(1) =~ '^From \x\{40\} Mon Sep 17 00:00:00 2001$' | +      \   set filetype=gitsendemail | +      \ endif  let s:current_fileformats = ''  let s:current_fileencodings = ''  function! s:gofiletype_pre() @@ -99,6 +103,34 @@ if has("autocmd")  endif  au BufRead,BufNewFile /etc/nginx/*,/usr/local/nginx/*,*/nginx/vhosts.d/*,nginx.conf if &ft == '' | setfiletype nginx | endif  au BufRead,BufNewFile *.cl set filetype=opencl +function! s:DetectPerl6() +  let line_no = 1 +  let eof     = line('$') +  let in_pod  = 0 +  while line_no <= eof +    let line    = getline(line_no) +    let line_no = line_no + 1 +    if line =~ '^=\w' +      let in_pod = 1 +    elseif line =~ '^=\%(end\|cut\)' +      let in_pod = 0 +    elseif !in_pod +      let line = substitute(line, '#.*', '', '') +      if line =~ '^\s*$' +        continue +      endif +      if line =~ '^\s*\%(use\s\+\)\=v6\%(\.\d\%(\.\d\)\=\)\=;' +        set filetype=perl6 " we matched a 'use v6' declaration +      elseif line =~ '^\s*\%(\%(my\|our\)\s\+\)\=\(module\|class\|role\|enum\|grammar\)' +        set filetype=perl6 " we found a class, role, module, enum, or grammar declaration +      endif +      break " we either found what we needed, or we found a non-POD, non-comment, +            " non-Perl 6 indicating line, so bail out +    endif +  endwhile +endfunction +autocmd BufReadPost *.pl,*.pm,*.t call s:DetectPerl6() +autocmd BufNew,BufRead *.nqp setf perl6  autocmd BufNewFile,BufRead *.proto setfiletype proto  au! BufRead,BufNewFile *.pp setfiletype puppet  function! s:setf(filetype) abort @@ -113,7 +145,7 @@ au BufNewFile,BufRead [rR]antfile,*.rant	call s:setf('ruby')  au BufNewFile,BufRead .irbrc,irbrc		call s:setf('ruby')  au BufNewFile,BufRead .pryrc			call s:setf('ruby')  au BufNewFile,BufRead *.ru			call s:setf('ruby') -au BufNewFile,BufRead Capfile			call s:setf('ruby') +au BufNewFile,BufRead Capfile,*.cap 		call s:setf('ruby')  au BufNewFile,BufRead Gemfile			call s:setf('ruby')  au BufNewFile,BufRead Guardfile,.Guardfile	call s:setf('ruby')  au BufNewFile,BufRead Cheffile			call s:setf('ruby') diff --git a/ftplugin/csv.vim b/ftplugin/csv.vim index b6414d9f..9d8df120 100644 --- a/ftplugin/csv.vim +++ b/ftplugin/csv.vim @@ -160,7 +160,7 @@ fu! <sid>Init(startline, endline) "{{{3   " \ delf <sid>PrepareFolding | delf <sid>OutputFilters |   " \ delf <sid>SortFilter | delf <sid>GetColumn |   " \ delf <sid>RemoveLastItem | delf <sid>DisableFolding | - " \ delf <sid>GetSID | delf <sid>CheckHeaderLine | + " \ delf <sid>CheckHeaderLine |   " \ delf <sid>AnalyzeColumn | delf <sid>Vertfold |   " \ delf <sid>InitCSVFixedWidth | delf <sid>LocalCmd |   " \ delf <sid>CommandDefinitions | delf <sid>NumberFormat | @@ -806,18 +806,18 @@ fu! <sid>GetColPat(colnr, zs_flag) "{{{3          else              if a:colnr >= len(b:csv_fixed_width_cols)              " Get last column -                let pat='\%' . b:csv_fixed_width_cols[-1] . 'c.*' +                let pat='\%' . b:csv_fixed_width_cols[-1] . 'v.*'              else              let pat='\%' . b:csv_fixed_width_cols[(a:colnr - 1)] . -            \ 'c.\{-}\%' .   b:csv_fixed_width_cols[a:colnr] . 'c' +            \ 'c.\{-}\%' .   b:csv_fixed_width_cols[a:colnr] . 'v'              endif          endif      elseif !exists("b:csv_fixed_width_cols")          let pat=b:col      else -        let pat='\%' . b:csv_fixed_width_cols[0] . 'c.\{-}' . +        let pat='\%' . b:csv_fixed_width_cols[0] . 'v.\{-}' .              \ (len(b:csv_fixed_width_cols) > 1 ? -            \ '\%' . b:csv_fixed_width_cols[1] . 'c' : +            \ '\%' . b:csv_fixed_width_cols[1] . 'v' :              \ '')      endif      return pat . (a:zs_flag ? '\zs' : '') @@ -1078,12 +1078,12 @@ fu! <sid>Sort(bang, line1, line2, colnr) range "{{{3          if !exists("b:csv_fixed_width_cols")              let pat= '^' . <SID>GetColPat(col-1,1) . b:col          else -            let pat= '^' . <SID>GetColPat(col,0) +            let pat= <SID>GetColPat(col,0)          endif      else          let pat= '^' . <SID>GetColPat(col,0)      endif -    exe a:line1 ',' a:line2 . "sort" . (a:bang ? '!' : '') . +    exe a:line1. ','. a:line2. "sort". (a:bang ? '!' : '') .          \' r ' . (numeric ? 'n' : '') . ' /' . pat . '/'      call winrestview(wsv)  endfun @@ -1488,12 +1488,11 @@ fu! <sid>PrepareFolding(add, match)  "{{{3  "    for val in sort(values(b:csv_filter), '<sid>SortFilter')  "        let @/ .= val.pat . (val.id == s:filter_count ? '' : '\&')  "    endfor -    let sid = <sid>GetSID()      " Fold settings:      call <sid>LocalSettings('fold')      " Don't put spaces between the arguments! -    exe 'setl foldexpr=<snr>' . sid . '_FoldValue(v:lnum,b:csv_filter)' +    exe 'setl foldexpr=<snr>' . s:SID . '_FoldValue(v:lnum,b:csv_filter)'      " Move folded area to the bottom, so there is only on consecutive      " non-folded area @@ -1541,8 +1540,7 @@ fu! <sid>OutputFilters(bang) "{{{3              call <sid>Warn("No filters defined currently!")              return          else -            let sid = <sid>GetSID() -            exe 'setl foldexpr=<snr>' . sid . '_FoldValue(v:lnum,b:csv_filter)' +            exe 'setl foldexpr=<snr>' . s:SID . '_FoldValue(v:lnum,b:csv_filter)'          endif      endif  endfu @@ -1588,14 +1586,11 @@ fu! <sid>DisableFolding() "{{{3      endif  endfu -fu! <sid>GetSID() "{{{3 -    if v:version > 703 || v:version == 703 && has("patch032") -        return maparg('W', "", "", 1).sid -    else -        "return substitute(maparg('W'), '\(<SNR>\d\+\)_', '\1', '') -        return matchstr(expand('<sfile>'), '<SNR>\zs\d\+\ze_GetSID$') -    endif +fu! <sid>DetermineSID() +    let s:SID = matchstr(expand('<sfile>'), '<SNR>\zs\d\+\ze_DetermineSID$')  endfu +call s:DetermineSID() +delf s:DetermineSID  fu! <sid>NumberFormat() "{{{3      let s:nr_format = [',', '.'] diff --git a/ftplugin/cucumber.vim b/ftplugin/cucumber.vim index f52a1b21..b2f60fdd 100644 --- a/ftplugin/cucumber.vim +++ b/ftplugin/cucumber.vim @@ -21,12 +21,13 @@ let b:undo_ftplugin = "setl fo< com< cms< ofu<"  let b:cucumber_root = expand('%:p:h:s?.*[\/]\%(features\|stories\)\zs[\/].*??')  if !exists("g:no_plugin_maps") && !exists("g:no_cucumber_maps") -  nnoremap <silent><buffer> [<C-D>      :<C-U>exe <SID>jump('edit',v:count)<CR> -  nnoremap <silent><buffer> ]<C-D>      :<C-U>exe <SID>jump('edit',v:count)<CR> -  nnoremap <silent><buffer> <C-W>d      :<C-U>exe <SID>jump('split',v:count)<CR> -  nnoremap <silent><buffer> <C-W><C-D>  :<C-U>exe <SID>jump('split',v:count)<CR> -  nnoremap <silent><buffer> [d          :<C-U>exe <SID>jump('pedit',v:count)<CR> -  nnoremap <silent><buffer> ]d          :<C-U>exe <SID>jump('pedit',v:count)<CR> +  cnoremap <SID>foldopen <Bar>if &foldopen =~# 'tag'<Bar>exe 'norm! zv'<Bar>endif +  nnoremap <silent> <script> <buffer> [<C-D>      :<C-U>exe <SID>jump('edit',v:count)<SID>foldopen<CR> +  nnoremap <silent> <script> <buffer> ]<C-D>      :<C-U>exe <SID>jump('edit',v:count)<SID>foldopen<CR> +  nnoremap <silent> <script> <buffer> <C-W>d      :<C-U>exe <SID>jump('split',v:count)<SID>foldopen<CR> +  nnoremap <silent> <script> <buffer> <C-W><C-D>  :<C-U>exe <SID>jump('split',v:count)<SID>foldopen<CR> +  nnoremap <silent> <script> <buffer> [d          :<C-U>exe <SID>jump('pedit',v:count)<CR> +  nnoremap <silent> <script> <buffer> ]d          :<C-U>exe <SID>jump('pedit',v:count)<CR>    let b:undo_ftplugin .=          \ "|sil! nunmap <buffer> [<C-D>" .          \ "|sil! nunmap <buffer> ]<C-D>" . diff --git a/ftplugin/gitcommit.vim b/ftplugin/gitcommit.vim index 26d63514..3c1bb4f0 100644 --- a/ftplugin/gitcommit.vim +++ b/ftplugin/gitcommit.vim @@ -11,15 +11,8 @@ endif  runtime! ftplugin/git.vim  let b:did_ftplugin = 1 -setlocal nomodeline tabstop=8 formatoptions-=croq formatoptions+=tl - -let b:undo_ftplugin = 'setl modeline< tabstop< formatoptions<' - -if &textwidth == 0 -  " make sure that log messages play nice with git-log on standard terminals -  setlocal textwidth=72 -  let b:undo_ftplugin .= "|setl tw<" -endif +setlocal nomodeline tabstop=8 formatoptions-=croq formatoptions+=tl textwidth=72 +let b:undo_ftplugin = 'setl modeline< tabstop< formatoptions< tw<'  if exists("g:no_gitcommit_commands") || v:version < 700    finish diff --git a/ftplugin/latex-box/common.vim b/ftplugin/latex-box/common.vim index 72a6ef0f..bf6305cc 100644 --- a/ftplugin/latex-box/common.vim +++ b/ftplugin/latex-box/common.vim @@ -25,8 +25,20 @@ setlocal efm+=%E!\ %m  " More info for undefined control sequences  setlocal efm+=%Z<argument>\ %m +" More info for some errors +setlocal efm+=%Cl.%l\ %m +  " Show or ignore warnings  if g:LatexBox_show_warnings +	" Parse biblatex warnings +	setlocal efm+=%-C(biblatex)%.%#in\ t%.%# +	setlocal efm+=%-C(biblatex)%.%#Please\ v%.%# +	setlocal efm+=%-C(biblatex)%.%#LaTeX\ a%.%# +	setlocal efm+=%-Z(biblatex)%m + +	" Parse hyperref warnings +	setlocal efm+=%-C(hyperref)%.%#on\ input\ line\ %l. +  	for w in g:LatexBox_ignore_warnings  		let warning = escape(substitute(w, '[\,]', '%\\\\&', 'g'), ' ')  		exe 'setlocal efm+=%-G%.%#'. warning .'%.%#' @@ -44,6 +56,7 @@ endif  " Push file to file stack  setlocal efm+=%+P**%f +setlocal efm+=%+P**\"%f\"  " Ignore unmatched lines  setlocal efm+=%-G%.%# @@ -114,8 +127,8 @@ function! LatexBox_GetMainTexFile()  	endif  	" 5. borrow the Vim-Latex-Suite method of finding it -	if Tex_GetMainFileName() != expand('%:p') -		let b:main_tex_file = Tex_GetMainFileName() +	if LatexBox_GetMainFileName() != expand('%:p') +		let b:main_tex_file = LatexBox_GetMainFileName()  		return b:main_tex_file  	endif @@ -127,6 +140,8 @@ endfunction  function! s:PromptForMainFile()  	let saved_dir = getcwd()  	execute 'cd ' . fnameescape(expand('%:p:h')) + +	" Prompt for file  	let l:file = ''  	while !filereadable(l:file)  		let l:file = input('main LaTeX file: ', '', 'file') @@ -135,6 +150,16 @@ function! s:PromptForMainFile()  		endif  	endwhile  	let l:file = fnamemodify(l:file, ':p') + +	" Make persistent +	let l:persistent = '' +	while l:persistent !~ '\v^(y|n)' +		let l:persistent = input('make choice persistent? (y, n) ') +		if l:persistent == 'y' +			call writefile([], l:file . '.latexmain') +		endif +	endwhile +  	execute 'cd ' . fnameescape(saved_dir)  	return l:file  endfunction @@ -212,15 +237,16 @@ if !exists('g:LatexBox_viewer')  	endif  endif -function! LatexBox_View() +function! LatexBox_View(...) +	let lvargs = join(a:000, ' ')  	let outfile = LatexBox_GetOutputFile()  	if !filereadable(outfile)  		echomsg fnamemodify(outfile, ':.') . ' is not readable'  		return  	endif -	let cmd = g:LatexBox_viewer . ' ' . shellescape(outfile) +	let cmd = g:LatexBox_viewer . ' ' . lvargs . ' ' . shellescape(outfile)  	if has('win32') -		let cmd = '!start /b' . cmd . ' >nul' +		let cmd = '!start /b ' . cmd . ' >nul'  	else  		let cmd = '!' . cmd . ' &>/dev/null &'  	endif @@ -230,7 +256,7 @@ function! LatexBox_View()  	endif  endfunction -command! LatexView call LatexBox_View() +command! -nargs=* LatexView call LatexBox_View('<args>')  " }}}  " In Comment {{{ diff --git a/ftplugin/latex-box/complete.vim b/ftplugin/latex-box/complete.vim index 866ffc3c..458e8d81 100644 --- a/ftplugin/latex-box/complete.vim +++ b/ftplugin/latex-box/complete.vim @@ -328,6 +328,7 @@ function! LatexBox_BibComplete(regexp)  		let type = printf('%-' . s:type_length . 's', type)  		let auth = m['author'] == '' ? ''    :       m['author'][:20] . ' '  		let auth = substitute(auth, '\~', ' ', 'g') +		let auth = substitute(auth, ',.*\ze', ' et al. ', '')  		let year = m['year']   == '' ? ''    : '(' . m['year']   . ')'  		let w = { 'word': m['key'],  				\ 'abbr': type . auth . year, @@ -365,7 +366,7 @@ function! s:ExtractLabels()  		let curname = strpart( getline( lblline ), lblbegin, nameend - lblbegin - 1 )  		" Ignore cref entries (because they are duplicates) -		if curname =~ "\@cref\|cref\@" +		if curname =~# "@cref$"  			continue  		endif diff --git a/ftplugin/latex-box/findmain.vim b/ftplugin/latex-box/findmain.vim index 0b9c404f..622c408f 100644 --- a/ftplugin/latex-box/findmain.vim +++ b/ftplugin/latex-box/findmain.vim @@ -1,4 +1,4 @@ -" Tex_GetMainFileName: gets the name of the main file being compiled. {{{ +" LatexBox_GetMainFileName: gets the name of the main file being compiled. {{{  " Description:  returns the full path name of the main file.  "               This function checks for the existence of a .latexmain file  "               which might point to the location of a "main" latex file. @@ -13,7 +13,8 @@  "               NOTE: From version 1.6 onwards, this function always trims  "               away the .latexmain part of the file name before applying the  "               modifier argument. -function! Tex_GetMainFileName(...) +"               NOTE: This function is copied from the Latex-Suite project! +function! LatexBox_GetMainFileName(...)  	if a:0 > 0  		let modifier = a:1  	else @@ -51,10 +52,7 @@ function! Tex_GetMainFileName(...)  		let lheadfile = expand('%'.modifier)  	endif -    if lheadfile !~ '\.tex$' -        let lheadfile .= '.tex' -    endif -    exe 'cd '.s:origdir +	exe 'cd '.s:origdir  	" NOTE: The caller of this function needs to escape the file name with  	"       fnameescape() . The reason its not done here is that escaping is not diff --git a/ftplugin/latex-box/folding.vim b/ftplugin/latex-box/folding.vim index badfc137..4fe13bc8 100644 --- a/ftplugin/latex-box/folding.vim +++ b/ftplugin/latex-box/folding.vim @@ -1,29 +1,22 @@  " Folding support for LaTeX +  "  " Options -" g:LatexBox_Folding       - Turn on/off folding -" g:LatexBox_fold_preamble - Turn on/off folding of preamble -" g:LatexBox_fold_parts    - Define parts (eq. appendix, frontmatter) to fold -" g:LatexBox_fold_sections - Define section levels to fold -" g:LatexBox_fold_envs     - Turn on/off folding of environments +" g:LatexBox_Folding         - Turn on/off folding +" g:LatexBox_fold_text       - Turn on/off LatexBox fold text function +" g:LatexBox_fold_preamble   - Turn on/off folding of preamble +" g:LatexBox_fold_parts      - Define parts (eq. appendix, frontmatter) to fold +" g:LatexBox_fold_sections   - Define section levels to fold +" g:LatexBox_fold_envs       - Turn on/off folding of environments +" g:LatexBox_fold_toc        - Turn on/off folding of TOC +" g:LatexBox_fold_toc_levels - Set max TOC fold level  " - -" {{{1 Set options -if exists('g:LatexBox_Folding') && g:LatexBox_Folding == 1 -    setl foldmethod=expr -    setl foldexpr=LatexBox_FoldLevel(v:lnum) -    setl foldtext=LatexBox_FoldText() -    " -    " The foldexpr function returns "=" for most lines, which means it can become -    " slow for large files.  The following is a hack that is based on this reply to -    " a discussion on the Vim Developer list: -    " http://permalink.gmane.org/gmane.editors.vim.devel/14100 -    " -    augroup FastFold -        autocmd! -        autocmd InsertEnter *.tex setlocal foldmethod=manual -        autocmd InsertLeave *.tex setlocal foldmethod=expr -    augroup end +" {{{1 Initialize options to default values. +if !exists('g:LatexBox_Folding') +	let g:LatexBox_Folding=0 +endif +if !exists('g:LatexBox_fold_text') +    let g:LatexBox_fold_text=1  endif  if !exists('g:LatexBox_fold_preamble')      let g:LatexBox_fold_preamble=1 @@ -57,7 +50,45 @@ endif  if !exists('g:LatexBox_fold_toc_levels')      let g:LatexBox_fold_toc_levels=1  endif +if !exists('g:LatexBox_fold_automatic') +	let g:LatexBox_fold_automatic=1 +endif +" }}}1 +if g:LatexBox_Folding == 0 +    finish +endif + +" {{{1 Set folding options for vim +setl foldexpr=LatexBox_FoldLevel(v:lnum) +if g:LatexBox_fold_text == 1 +    setl foldtext=LatexBox_FoldText() +endif +if g:LatexBox_fold_automatic == 1 +    setl foldmethod=expr + +	" +	" The foldexpr function returns "=" for most lines, which means it can become +	" slow for large files.  The following is a hack that is based on this reply to +	" a discussion on the Vim Developer list: +	" http://permalink.gmane.org/gmane.editors.vim.devel/14100 +	" +	augroup FastFold +		autocmd! +		autocmd InsertEnter *.tex setlocal foldmethod=manual +		autocmd InsertLeave *.tex setlocal foldmethod=expr +	augroup end +else +	setl foldmethod=manual +endif + +function! LatexBox_FoldOnDemand() +	setl foldmethod=expr +	normal! zx +	setl foldmethod=manual +endfunction + +command! LatexFold  call LatexBox_FoldOnDemand()  " {{{1 LatexBox_FoldLevel help functions @@ -137,9 +168,9 @@ function! LatexBox_FoldLevel(lnum)      " Fold preamble      if g:LatexBox_fold_preamble == 1 -        if line =~# '\s*\\documentclass' +        if line =~# s:notcomment . s:notbslash . '\s*\\documentclass'              return ">1" -        elseif line =~# '^\s*\\begin\s*{\s*document\s*}' +        elseif line =~# s:notcomment . s:notbslash . '\s*\\begin\s*{\s*document\s*}'              return "0"          endif      endif @@ -247,24 +278,13 @@ function! s:CaptionFrame(line)      endif  endfunction -" {{{1 LatexBox_FoldText -function! LatexBox_FoldText() -    " Initialize +function! LatexBox_FoldText_title()      let line = getline(v:foldstart) -    let nlines = v:foldend - v:foldstart + 1 -    let level = ''      let title = 'Not defined' -    " Fold level -    let level = strpart(repeat('-', v:foldlevel-1) . '*',0,3) -    if v:foldlevel > 3 -        let level = strpart(level, 1) . v:foldlevel -    endif -    let level = printf('%-3s', level) -      " Preamble      if line =~ '\s*\\documentclass' -        let title = "Preamble" +        return "Preamble"      endif      " Parts, sections and fakesections @@ -280,11 +300,11 @@ function! LatexBox_FoldText()      elseif line =~ '\\appendix'          let title = "Appendix"      elseif line =~ secpat1 . '.*}' -        let title =  matchstr(line, secpat1 . '\zs.*\ze}') +        let title =  matchstr(line, secpat1 . '\zs.\{-}\ze}')      elseif line =~ secpat1          let title =  matchstr(line, secpat1 . '\zs.*')      elseif line =~ secpat2 . '.*\]' -        let title =  matchstr(line, secpat2 . '\zs.*\ze\]') +        let title =  matchstr(line, secpat2 . '\zs.\{-}\ze\]')      elseif line =~ secpat2          let title =  matchstr(line, secpat2 . '\zs.*')      elseif line =~ 'Fake' . sections . ':' @@ -330,7 +350,22 @@ function! LatexBox_FoldText()          endif      endif -    let title = strpart(title, 0, 68) +    return title +endfunction + +" {{{1 LatexBox_FoldText +function! LatexBox_FoldText() +    let nlines = v:foldend - v:foldstart + 1 +    let title = strpart(LatexBox_FoldText_title(), 0, 68) +    let level = '' + +    " Fold level +    let level = strpart(repeat('-', v:foldlevel-1) . '*',0,3) +    if v:foldlevel > 3 +        let level = strpart(level, 1) . v:foldlevel +    endif +    let level = printf('%-3s', level) +      return printf('%-3s %-68s #%5d', level, title, nlines)  endfunction diff --git a/ftplugin/latex-box/latexmk.vim b/ftplugin/latex-box/latexmk.vim index dfa55f0e..bb70f83d 100644 --- a/ftplugin/latex-box/latexmk.vim +++ b/ftplugin/latex-box/latexmk.vim @@ -413,23 +413,38 @@ function! LatexBox_LatexErrors(status, ...)  	if a:status < 0  		botright copen  	else -		" Write status message to screen -		redraw -		if a:status > 0 || len(getqflist())>1 -			echomsg 'Compiling to ' . g:LatexBox_output_type . ' ... failed!' -		else -			echomsg 'Compiling to ' . g:LatexBox_output_type . ' ... success!' -		endif -  		" Only open window when an error/warning is detected -		if g:LatexBox_quickfix +		if g:LatexBox_quickfix >= 3 +					\ ? s:log_contains_error(log) +					\ : g:LatexBox_quickfix > 0  			belowright cw -			if g:LatexBox_quickfix==2 +			if g:LatexBox_quickfix == 2 || g:LatexBox_quickfix == 4  				wincmd p  			endif  		endif +		redraw + +		" Write status message to screen +		if a:status > 0 || len(getqflist())>1 +			if s:log_contains_error(log) +				let l:status_msg = ' ... failed!' +			else +				let l:status_msg = ' ... there were warnings!' +			endif +		else +			let l:status_msg = ' ... success!' +		endif +		echomsg 'Compiling to ' . g:LatexBox_output_type . l:status_msg  	endif  endfunction + +function! s:log_contains_error(file) +	let lines = readfile(a:file) +	let lines = filter(lines, 'v:val =~ ''^.*:\d\+: ''') +	let lines = uniq(map(lines, 'matchstr(v:val, ''^.*\ze:\d\+:'')')) +	let lines = filter(lines, 'filereadable(fnameescape(v:val))') +	return len(lines) > 0 +endfunction  " }}}  " LatexmkStatus {{{ diff --git a/ftplugin/latex-box/mappings.vim b/ftplugin/latex-box/mappings.vim index 6ff621c1..648d9b56 100644 --- a/ftplugin/latex-box/mappings.vim +++ b/ftplugin/latex-box/mappings.vim @@ -27,6 +27,12 @@ map <silent> <buffer> <LocalLeader>lt :LatexTOC<CR>  map <silent> <buffer> <LocalLeader>lj :LatexLabels<CR>  " }}} +" Folding {{{ +if g:LatexBox_Folding == 1 +	map <buffer> <LocalLeader>lf :LatexFold<CR> +endif +" }}} +  " Jump to match {{{  if !exists('g:LatexBox_loaded_matchparen')  	nmap <buffer> % <Plug>LatexBox_JumpToMatch diff --git a/ftplugin/latex-box/motion.vim b/ftplugin/latex-box/motion.vim index 04275aca..41605aea 100644 --- a/ftplugin/latex-box/motion.vim +++ b/ftplugin/latex-box/motion.vim @@ -345,24 +345,22 @@ function! s:ReadTOC(auxfile, texfile, ...)  		endif  		" parse section number  		let secnum = '' -		if len(tree[1]) > 3 && empty(tree[1][1]) -			call remove(tree[1], 1) +		let tree = tree[1] +		if len(tree) > 3 && empty(tree[1]) +			call remove(tree, 1)  		endif -		if len(tree[1]) > 1 && tree[1][0] =~ '\(numberline\|tocsection\)' -			if !empty(tree[1][1]) -				let secnum = LatexBox_TreeToTex(tree[1][1]) -				let secnum = substitute(secnum, '\\\S\+\s', '', 'g') -				let secnum = substitute(secnum, '\\\S\+{\(.\{-}\)}', '\1', 'g') -				let secnum = substitute(secnum, '^{\+\|}\+$', '', 'g') -			endif -			let tree = tree[1][2:] -		else -			let tree = tree[1] +		if len(tree) > 1 && tree[0] =~ '^\\\(numberline\|tocsection\)' +			let secnum = LatexBox_TreeToTex(tree[1]) +			let secnum = substitute(secnum, '\\\S\+\s', '', 'g') +			let secnum = substitute(secnum, '\\\S\+{\(.\{-}\)}', '\1', 'g') +			let secnum = substitute(secnum, '^{\+\|}\+$', '', 'g') +			call remove(tree, 1)  		endif  		" parse section title  		let text = LatexBox_TreeToTex(tree) -		let text = substitute(text, '^{\+\|}\+$', '', 'g') -		let text = substitute(text, '\*',         '', 'g') +		let text = substitute(text, '^{\+\|}\+$',                 '', 'g') +		let text = substitute(text, '\m^\\\(no\)\?numberline\s*', '', '') +		let text = substitute(text, '\*',                         '', 'g')  		" add TOC entry  		call add(fileindices[texfile], len(toc)) diff --git a/ftplugin/latextoc.vim b/ftplugin/latextoc.vim index d5d7e58c..8edf23d1 100644 --- a/ftplugin/latextoc.vim +++ b/ftplugin/latextoc.vim @@ -76,9 +76,14 @@ function! s:TOCActivate(close)      execute b:calling_win . 'wincmd w' +    let root = fnamemodify(entry['file'], ':h') . '/'      let files = [entry['file']]      for line in filter(readfile(entry['file']), 'v:val =~ ''\\input{''') -        call add(files, matchstr(line, '{\zs.*\ze\(\.tex\)\?}') . '.tex') +        let file = matchstr(line, '{\zs.\{-}\ze\(\.tex\)\?}') . '.tex' +        if file[0] != '/' +            let file = root . file +        endif +        call add(files, file)      endfor      " Find section in buffer (or inputted files) diff --git a/ftplugin/markdown.vim b/ftplugin/markdown.vim index ae3bd262..e8627ccc 100644 --- a/ftplugin/markdown.vim +++ b/ftplugin/markdown.vim @@ -11,7 +11,7 @@ runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim  setlocal comments=fb:*,fb:-,fb:+,n:> commentstring=>\ %s  setlocal formatoptions+=tcqln formatoptions-=r formatoptions-=o -setlocal formatlistpat=^\\s*\\d\\+\\.\\s\\+\\\|^[-*+]\\s\\+ +setlocal formatlistpat=^\\s*\\d\\+\\.\\s\\+\\\|^[-*+]\\s\\+\\\|^\\[^\\ze[^\\]]\\+\\]:  if exists('b:undo_ftplugin')    let b:undo_ftplugin .= "|setl cms< com< fo< flp<" diff --git a/ftplugin/ruby.vim b/ftplugin/ruby.vim index a8ef8866..f406cc88 100644 --- a/ftplugin/ruby.vim +++ b/ftplugin/ruby.vim @@ -69,8 +69,8 @@ endif  function! s:query_path(root)    let code = "print $:.join %q{,}" -  if &shell =~# 'sh' && $PATH !~# '\s' -    let prefix = 'env PATH='.$PATH.' ' +  if &shell =~# 'sh' +    let prefix = 'env PATH='.shellescape($PATH).' '    else      let prefix = ''    endif @@ -190,15 +190,16 @@ if !exists("g:no_plugin_maps") && !exists("g:no_ruby_maps")    endif    if maparg("\<C-]>",'n') == '' -    nnoremap <silent> <buffer> <C-]>       :<C-U>exe  v:count1."tag <C-R>=RubyCursorIdentifier()<CR>"<CR> -    nnoremap <silent> <buffer> g<C-]>      :<C-U>exe         "tjump <C-R>=RubyCursorIdentifier()<CR>"<CR> -    nnoremap <silent> <buffer> g]          :<C-U>exe       "tselect <C-R>=RubyCursorIdentifier()<CR>"<CR> -    nnoremap <silent> <buffer> <C-W>]      :<C-U>exe v:count1."stag <C-R>=RubyCursorIdentifier()<CR>"<CR> -    nnoremap <silent> <buffer> <C-W><C-]>  :<C-U>exe v:count1."stag <C-R>=RubyCursorIdentifier()<CR>"<CR> -    nnoremap <silent> <buffer> <C-W>g<C-]> :<C-U>exe        "stjump <C-R>=RubyCursorIdentifier()<CR>"<CR> -    nnoremap <silent> <buffer> <C-W>g]     :<C-U>exe      "stselect <C-R>=RubyCursorIdentifier()<CR>"<CR> -    nnoremap <silent> <buffer> <C-W>}      :<C-U>exe          "ptag <C-R>=RubyCursorIdentifier()<CR>"<CR> -    nnoremap <silent> <buffer> <C-W>g}     :<C-U>exe        "ptjump <C-R>=RubyCursorIdentifier()<CR>"<CR> +    cnoremap <buffer> <SID>foldopen <Bar>if &foldopen =~# 'tag'<Bar>exe 'norm! zv'<Bar>endif +    nnoremap <silent> <script> <buffer> <C-]>       :<C-U>exe  v:count1."tag <C-R>=RubyCursorIdentifier()<CR>"<SID>foldopen<CR> +    nnoremap <silent> <script> <buffer> g<C-]>      :<C-U>exe         "tjump <C-R>=RubyCursorIdentifier()<CR>"<SID>foldopen<CR> +    nnoremap <silent> <script> <buffer> g]          :<C-U>exe       "tselect <C-R>=RubyCursorIdentifier()<CR>"<SID>foldopen<CR> +    nnoremap <silent> <script> <buffer> <C-W>]      :<C-U>exe v:count1."stag <C-R>=RubyCursorIdentifier()<CR>"<SID>foldopen<CR> +    nnoremap <silent> <script> <buffer> <C-W><C-]>  :<C-U>exe v:count1."stag <C-R>=RubyCursorIdentifier()<CR>"<SID>foldopen<CR> +    nnoremap <silent> <script> <buffer> <C-W>g<C-]> :<C-U>exe        "stjump <C-R>=RubyCursorIdentifier()<CR>"<SID>foldopen<CR> +    nnoremap <silent> <script> <buffer> <C-W>g]     :<C-U>exe      "stselect <C-R>=RubyCursorIdentifier()<CR>"<SID>foldopen<CR> +    nnoremap <silent> <script> <buffer> <C-W>}      :<C-U>exe          "ptag <C-R>=RubyCursorIdentifier()<CR>"<CR> +    nnoremap <silent> <script> <buffer> <C-W>g}     :<C-U>exe        "ptjump <C-R>=RubyCursorIdentifier()<CR>"<CR>      let b:undo_ftplugin = b:undo_ftplugin            \."| sil! exe 'nunmap <buffer> <C-]>'| sil! exe 'nunmap <buffer> g<C-]>'| sil! exe 'nunmap <buffer> g]'"            \."| sil! exe 'nunmap <buffer> <C-W>]'| sil! exe 'nunmap <buffer> <C-W><C-]>'" diff --git a/ftplugin/rust.vim b/ftplugin/rust.vim index b70cda9b..39edc1f9 100644 --- a/ftplugin/rust.vim +++ b/ftplugin/rust.vim @@ -1,13 +1,19 @@ -" Vim syntax file  " Language:     Rust +" Description:  Vim syntax file for Rust  " Maintainer:   Chris Morgan <me@chrismorgan.info> -" Last Change:  2014 Feb 27 +" Maintainer:   Kevin Ballard <kevin@sb.org> +" Last Change:  Jul 07, 2014  if exists("b:did_ftplugin")  	finish  endif  let b:did_ftplugin = 1 +let s:save_cpo = &cpo +set cpo&vim + +" Variables {{{1 +  " The rust source code at present seems to typically omit a leader on /*!  " comments, so we'll use that as our default, but make it easy to switch.  " This does not affect indentation at all (I tested it with and without @@ -25,6 +31,14 @@ setlocal formatoptions-=t formatoptions+=croqnl  " j was only added in 7.3.541, so stop complaints about its nonexistence  silent! setlocal formatoptions+=j +" smartindent will be overridden by indentexpr if filetype indent is on, but +" otherwise it's better than nothing. +setlocal smartindent nocindent + +setlocal tabstop=4 shiftwidth=4 softtabstop=4 expandtab + +setlocal textwidth=99 +  " This includeexpr isn't perfect, but it's a good start  setlocal includeexpr=substitute(v:fname,'::','/','g') @@ -42,22 +56,60 @@ if exists("g:loaded_delimitMate")  	let b:delimitMate_excluded_regions = delimitMate#Get("excluded_regions") . ',rustLifetimeCandidate,rustGenericLifetimeCandidate'  endif +" Motion Commands {{{1 +  " Bind motion commands to support hanging indents -nnoremap <silent> <buffer> [[ :call <SID>Rust_Jump('n', 'Back')<CR> -nnoremap <silent> <buffer> ]] :call <SID>Rust_Jump('n', 'Forward')<CR> -xnoremap <silent> <buffer> [[ :call <SID>Rust_Jump('v', 'Back')<CR> -xnoremap <silent> <buffer> ]] :call <SID>Rust_Jump('v', 'Forward')<CR> -onoremap <silent> <buffer> [[ :call <SID>Rust_Jump('o', 'Back')<CR> -onoremap <silent> <buffer> ]] :call <SID>Rust_Jump('o', 'Forward')<CR> +nnoremap <silent> <buffer> [[ :call rust#Jump('n', 'Back')<CR> +nnoremap <silent> <buffer> ]] :call rust#Jump('n', 'Forward')<CR> +xnoremap <silent> <buffer> [[ :call rust#Jump('v', 'Back')<CR> +xnoremap <silent> <buffer> ]] :call rust#Jump('v', 'Forward')<CR> +onoremap <silent> <buffer> [[ :call rust#Jump('o', 'Back')<CR> +onoremap <silent> <buffer> ]] :call rust#Jump('o', 'Forward')<CR> + +" Commands {{{1 + +" See |:RustRun| for docs +command! -nargs=* -complete=file -bang -bar -buffer RustRun call rust#Run(<bang>0, [<f-args>]) + +" See |:RustExpand| for docs +command! -nargs=* -complete=customlist,rust#CompleteExpand -bang -bar -buffer RustExpand call rust#Expand(<bang>0, [<f-args>]) + +" See |:RustEmitIr| for docs +command! -nargs=* -bar -buffer RustEmitIr call rust#Emit("ir", [<f-args>]) + +" See |:RustEmitAsm| for docs +command! -nargs=* -bar -buffer RustEmitAsm call rust#Emit("asm", [<f-args>]) + +" Mappings {{{1 + +" Bind ⌘R in MacVim to :RustRun +nnoremap <silent> <buffer> <D-r> :RustRun<CR> +" Bind ⌘⇧R in MacVim to :RustRun! pre-filled with the last args +nnoremap <buffer> <D-R> :RustRun! <C-r>=join(b:rust_last_rustc_args)<CR><C-\>erust#AppendCmdLine(' -- ' . join(b:rust_last_args))<CR> + +if !exists("b:rust_last_rustc_args") || !exists("b:rust_last_args") +	let b:rust_last_rustc_args = [] +	let b:rust_last_args = [] +endif + +" Cleanup {{{1  let b:undo_ftplugin = " -		\setlocal formatoptions< comments< commentstring< includeexpr< suffixesadd< +		\ setlocal formatoptions< comments< commentstring< includeexpr< suffixesadd< +		\|setlocal tabstop< shiftwidth< softtabstop< expandtab< textwidth<  		\|if exists('b:rust_original_delimitMate_excluded_regions')  		  \|let b:delimitMate_excluded_regions = b:rust_original_delimitMate_excluded_regions  		  \|unlet b:rust_original_delimitMate_excluded_regions -		\|elseif exists('b:delimitMate_excluded_regions') -		  \|unlet b:delimitMate_excluded_regions +		\|else +		  \|unlet! b:delimitMate_excluded_regions  		\|endif +		\|unlet! b:rust_last_rustc_args b:rust_last_args +		\|delcommand RustRun +		\|delcommand RustExpand +		\|delcommand RustEmitIr +		\|delcommand RustEmitAsm +		\|nunmap <buffer> <D-r> +		\|nunmap <buffer> <D-R>  		\|nunmap <buffer> [[  		\|nunmap <buffer> ]]  		\|xunmap <buffer> [[ @@ -66,31 +118,9 @@ let b:undo_ftplugin = "  		\|ounmap <buffer> ]]  		\" -if exists('*<SID>Rust_Jump') | finish | endif +" }}}1 -function! <SID>Rust_Jump(mode, function) range -	let cnt = v:count1 -	normal! m' -	if a:mode ==# 'v' -		norm! gv -	endif -	let foldenable = &foldenable -	set nofoldenable -	while cnt > 0 -		execute "call <SID>Rust_Jump_" . a:function . "()" -		let cnt = cnt - 1 -	endwhile -	let &foldenable = foldenable -endfunction - -function! <SID>Rust_Jump_Back() -	call search('{', 'b') -	keepjumps normal! w99[{ -endfunction - -function! <SID>Rust_Jump_Forward() -	normal! j0 -	call search('{', 'b') -	keepjumps normal! w99[{% -	call search('{') -endfunction +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim: set noet sw=4 ts=4: diff --git a/indent/haskell.vim b/indent/haskell.vim index c584e940..1d741032 100644 --- a/indent/haskell.vim +++ b/indent/haskell.vim @@ -68,7 +68,7 @@ function! HIndent(lnum)      endif    endif -  if prevl =~ '\Wof\s*$' || prevl =~ '\Wdo\s*$' +  if prevl =~ '\Wof\s*$' || prevl =~ '\Wm\=do\s*$'      return previ + &sw    endif diff --git a/indent/jade.vim b/indent/jade.vim index 12b9e2ed..8cfa656d 100644 --- a/indent/jade.vim +++ b/indent/jade.vim @@ -60,7 +60,7 @@ function! GetJadeIndent()      return increase    elseif line =~? '^\v%('.g:jade_self_closing_tags.')>'      return indent -  elseif group =~? '\v^%(jadeAttributesDelimiter|jadeClass|jadeId|htmlTagName|htmlSpecialTagName|jadeFilter)$' +  elseif group =~? '\v^%(jadeAttributesDelimiter|jadeClass|jadeId|htmlTagName|htmlSpecialTagName|jadeFilter|jadeTagBlockChar)$'      return increase    else      return indent diff --git a/indent/ruby.vim b/indent/ruby.vim index 2a571bd2..f2059982 100644 --- a/indent/ruby.vim +++ b/indent/ruby.vim @@ -90,13 +90,20 @@ let s:end_skip_expr = s:skip_expr .  let s:non_bracket_continuation_regex = '\%([\\.,:*/%+]\|\<and\|\<or\|\%(<%\)\@<![=-]\|\W[|&?]\|||\|&&\)\s*\%(#.*\)\=$'  " Regex that defines continuation lines. -" TODO: this needs to deal with if ...: and so on  let s:continuation_regex =        \ '\%(%\@<![({[\\.,:*/%+]\|\<and\|\<or\|\%(<%\)\@<![=-]\|\W[|&?]\|||\|&&\)\s*\%(#.*\)\=$' +" Regex that defines continuable keywords +let s:continuable_regex = +      \ '\C\%(^\s*\|[=,*/%+\-|;{]\|<<\|>>\|:\s\)\s*\zs' . +      \ '\<\%(if\|for\|while\|until\|unless\):\@!\>' +  " Regex that defines bracket continuations  let s:bracket_continuation_regex = '%\@<!\%([({[]\)\s*\%(#.*\)\=$' +" Regex that defines end of bracket continuation followed by another continuation +let s:bracket_switch_continuation_regex = '^\([^(]\+\zs).\+\)\+'.s:continuation_regex +  " Regex that defines the first part of a splat pattern  let s:splat_regex = '[[,(]\s*\*\s*\%(#.*\)\=$' @@ -488,6 +495,10 @@ function GetRubyIndent(...)      endif    endif +  if s:Match(lnum, s:continuable_regex) && s:Match(lnum, s:continuation_regex) +    return indent(s:GetMSL(lnum)) + &sw + &sw +  endif +    " 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)) + &sw @@ -575,10 +586,14 @@ function GetRubyIndent(...)    let p_lnum = lnum    let lnum = s:GetMSL(lnum) -  " If the previous line wasn't a MSL and is continuation return its indent. -  " TODO: the || s:IsInString() thing worries me a bit. +  " If the previous line wasn't a MSL.    if p_lnum != lnum -    if s:Match(p_lnum, s:non_bracket_continuation_regex) || s:IsInString(p_lnum,strlen(line)) +    " If previous line ends bracket and begins non-bracket continuation decrease indent by 1. +    if s:Match(p_lnum, s:bracket_switch_continuation_regex) +      return ind - 1 +    " If previous line is a continuation return its indent. +    " TODO: the || s:IsInString() thing worries me a bit. +    elseif s:Match(p_lnum, s:non_bracket_continuation_regex) || s:IsInString(p_lnum,strlen(line))        return ind      endif    endif diff --git a/indent/scala.vim b/indent/scala.vim index c9dc639e..4053a83c 100644 --- a/indent/scala.vim +++ b/indent/scala.vim @@ -15,6 +15,7 @@ setlocal autoindent  setlocal softtabstop=2  setlocal tabstop=2  setlocal shiftwidth=2 +setlocal expandtab  if exists("*GetScalaIndent")    finish diff --git a/syntax/cabal.vim b/syntax/cabal.vim index d0510097..abe561a0 100644 --- a/syntax/cabal.vim +++ b/syntax/cabal.vim @@ -116,7 +116,7 @@ syn match cabalOperator '\W\@<=impl\((.\+)\)\@='  syn match cabalOperator '\W\@<=flag\((.\+)\)\@='  syn match cabalOperator '\(^\s*--.*\)\@<!\(<\|>\|=\|||\|&&\)' -syn match cabalComment '\s\@<=--.*$' +syn match cabalComment '--.*$' contains=@Spell  if version >= 508 || !exists('did_cabal_syntax_inits')    if version < 508 diff --git a/syntax/csv.vim b/syntax/csv.vim index 41a194d1..e2da7dbc 100644 --- a/syntax/csv.vim +++ b/syntax/csv.vim @@ -113,9 +113,9 @@ fu! <sid>DoHighlight() "{{{3  		    \. s:col . '/ contains=CSVDelimiter'      else  	for i in range(len(b:csv_fixed_width_cols)) -	    let pat = '/\%' . b:csv_fixed_width_cols[i] . 'c.*' . +	    let pat = '/\%' . b:csv_fixed_width_cols[i] . 'v.*' .  			\ ((i == len(b:csv_fixed_width_cols)-1) ? '/' :  -			\ '\%' . b:csv_fixed_width_cols[i+1] . 'c/') +			\ '\%' . b:csv_fixed_width_cols[i+1] . 'v/')  	    let group  = "CSVColumn" . (i%2 ? "Odd"  : "Even" )  	    let ngroup = "CSVColumn" . (i%2 ? "Even" : "Odd"  ) diff --git a/syntax/gitcommit.vim b/syntax/gitcommit.vim index 83cd4733..5fc541e6 100644 --- a/syntax/gitcommit.vim +++ b/syntax/gitcommit.vim @@ -39,9 +39,10 @@ syn region  gitcommitDiscarded	start=/^# Change\%(s not staged for commit\|d but  syn region  gitcommitSelected	start=/^# Changes to be committed:/ end=/^#$\|^#\@!/ contains=gitcommitHeader,gitcommitHead,gitcommitSelectedType fold  syn region  gitcommitUnmerged	start=/^# Unmerged paths:/ end=/^#$\|^#\@!/ contains=gitcommitHeader,gitcommitHead,gitcommitUnmergedType fold -syn match   gitcommitDiscardedType	"\t\@<=[a-z][a-z ]*[a-z]: "he=e-2	contained containedin=gitcommitComment nextgroup=gitcommitDiscardedFile skipwhite -syn match   gitcommitSelectedType	"\t\@<=[a-z][a-z ]*[a-z]: "he=e-2	contained containedin=gitcommitComment nextgroup=gitcommitSelectedFile skipwhite -syn match   gitcommitUnmergedType	"\t\@<=[a-z][a-z ]*[a-z]: "he=e-2	contained containedin=gitcommitComment nextgroup=gitcommitUnmergedFile skipwhite + +syn match   gitcommitDiscardedType	"\t\@<=[[:lower:]][^:]*[[:lower:]]: "he=e-2	contained containedin=gitcommitComment nextgroup=gitcommitDiscardedFile skipwhite +syn match   gitcommitSelectedType	"\t\@<=[[:lower:]][^:]*[[:lower:]]: "he=e-2	contained containedin=gitcommitComment nextgroup=gitcommitSelectedFile skipwhite +syn match   gitcommitUnmergedType	"\t\@<=[[:lower:]][^:]*[[:lower:]]: "he=e-2	contained containedin=gitcommitComment nextgroup=gitcommitUnmergedFile skipwhite  syn match   gitcommitDiscardedFile	".\{-\}\%($\| -> \)\@=" contained nextgroup=gitcommitDiscardedArrow  syn match   gitcommitSelectedFile	".\{-\}\%($\| -> \)\@=" contained nextgroup=gitcommitSelectedArrow  syn match   gitcommitUnmergedFile	".\{-\}\%($\| -> \)\@=" contained nextgroup=gitcommitSelectedArrow diff --git a/syntax/gitsendemail.vim b/syntax/gitsendemail.vim index 8b938116..3d7f1065 100644 --- a/syntax/gitsendemail.vim +++ b/syntax/gitsendemail.vim @@ -1,7 +1,7 @@  " Vim syntax file  " Language:	git send-email message  " Maintainer:	Tim Pope -" Filenames:	*.msg.[0-9]* (first line is "From ... # This line is ignored.") +" Filenames:	.gitsendemail.*  " Last Change:	2010 May 21  if exists("b:current_syntax") @@ -9,6 +9,10 @@ if exists("b:current_syntax")  endif  runtime! syntax/mail.vim +unlet! b:current_syntax +syn include @gitsendemailDiff syntax/diff.vim +syn region gitsendemailDiff start=/\%(^diff --\%(git\|cc\|combined\) \)\@=/ end=/^-- %/ fold contains=@gitsendemailDiff +  syn case match  syn match   gitsendemailComment "\%^From.*#.*" diff --git a/syntax/haskell.vim b/syntax/haskell.vim index 17f48178..8c890ee5 100644 --- a/syntax/haskell.vim +++ b/syntax/haskell.vim @@ -26,8 +26,8 @@ syn match  hsFloat            "\<[0-9]\+\.[0-9]\+\([eE][-+]\=[0-9]\+\)\=\>"  " This case matches the names of types and constructors: names beginning with  " a capital letter.  Note that this also handles the case of @M.lookup@ where  " M is a qualified import.  There is a big negative lookbehind assertion here -" so that we don't highlight import and module statements oddly.  -syn match hsTypeName "\(^import\s.*\|^module\s.*\)\@<!\([^a-zA-Z0-9]\)\@<=[A-Z][a-zA-Z0-9_]*" +" so that we don't highlight import and module statements oddly. +syn match hsTypeName "\(^import\s.*\|^module\s.*\)\@<!\(^\|[^a-zA-Z0-9]\)\@<=[A-Z][a-zA-Z0-9_]*"  " Also make unit and the empty list easy to spot - they are constructors too.  syn match hsTypeName "()"  syn match hsTypeName "\[\]" @@ -37,24 +37,26 @@ syn keyword hsFIXME contained FIXME TODO XXX BUG NOTE  " Comment stuff  syn region hsPragma start='{-#' end='#-}' -syn region hsBlockComment start='{-' end='-}' fold contains=hsFIXME,hsBlockComment +syn region hsBlockComment start='{-' end='-}' fold contains=hsFIXME,hsBlockComment,@Spell  " FIXME: haddock block comments should be able to contain hsBlockComments, but  " it doesn't seem to work at the moment. -syn region hsHaddockComment start='{-|' end='-}' contains=hsFIXME -syn match hsLineComment "--.*$" contains=hsFIXME +syn region hsHaddockComment start='{-|' end='-}' contains=hsFIXME,@Spell +syn match hsLineComment "--.*$" contains=hsFIXME,@Spell  " Line-based haddock comments are trickier - they continue until  " the next line that isn't part of the same block of comments. -syn region hsHaddockComment start='-- |' end='^\(\s*--\)\@!' contains=hsFIXME -syn region hsHaddockComment start='-- \$\w\+' end='^\(\s*--\)\@!' contains=hsFIXME -syn region hsHaddockComment start='-- ^' end='^\(\s*--\)\@!' contains=hsFIXME +syn region hsHaddockComment start='-- |' end='^\(\s*--\)\@!' contains=hsFIXME,@Spell +syn region hsHaddockComment start='-- \$\w\+' end='^\(\s*--\)\@!' contains=hsFIXME,@Spell +syn region hsHaddockComment start='-- ^' end='^\(\s*--\)\@!' contains=hsFIXME,@Spell  " Haddock sections for import lists  syn match hsHaddockSection '-- \*.*$'  " Named documentation chunks (also for import lists)  syn match hsHaddockSection '-- \$.*$' +" Treat a shebang line at the start of the file as a comment +syn match hsLineComment "\%^\#\!.*$"  " Keywords appearing in expressions, plus a few top-level keywords -syn keyword hsKeyword do let in _ where +syn keyword hsKeyword do mdo let in _ where  syn keyword hsKeyword infix infixl infixr  syn keyword hsKeyword forall foreign  syn match hsKeyword '\(^\(data\|type\)\s\+\)\@<=family\(\W\)\@=' @@ -68,21 +70,19 @@ syn keyword hsConditional case of if then else  " headers (-- *) can be highlighted specially only within this context.  syn region hsModuleHeader start="^module\s" end="where" contains=hsHaddockSection keepend fold transparent  " Treat Module imports as the #include category; it maps reasonably well -syn keyword hsImport import qualified as hiding module +syn keyword hsImport import module +" Treat 'qualified', 'as', and 'hiding' as keywords when following 'import' +syn match hsImport '\(\<import\>.*\)\@<=\<\(qualified\|as\|hiding\)\>'  syn keyword hsTypeDecls class instance data newtype type deriving default  " FIXME: Maybe we can do something fancy for data/type families?  'family' is  " only a keyword if it follows data/type... -" This is uglier than I'd like.  We want to let '-' participate in operators, -" but we can't let it match '--' because that interferes with comments.  Hacks -" for now - just include some common operators with '-'. -syn match hsOperator "<-\|->\|-->\|-\(-\)\@!\|[%\~\&\*/\$\^|@:+<!>=#!\?]\+" -" A bare . is an operator (but not surrounded by alnum chars) -syn match hsOperator "\s\@<=\.\s\@=" -" . is also an operator if adjacent to some other operator char -syn match hsOperator "[%\~\&\*\$\^|@:+<!>=#!\?]\+\.[%\~\&\*\$\^|@:+<\.!>=#!\?]*" -syn match hsOperator "[%\~\&\*\$\^|@:+<!>=#!\?]*\.[%\~\&\*\$\^|@:+\.<!>=#!\?]\+" +" We want to let '-' participate in operators, but we can't let it match +" '--', '---', etc. because it interferes with comments. The same goes for +" '#!' at the start of a file. Also, the dot (.) is an operator character, +" but not when it comes immediately after a module name. +syn match hsOperator "\(\%^\#\!\)\@!\(\(\<[A-Z]\w*\)\@64<=\.\)\@!\(--\+\([^.%\~\&\*/\$\^|@:+<!>=#!\?]\|$\)\)\@![-.%\~\&\*/\$\^|@:+<!>=#!\?]\+"  " Include support for infix functions as operators  syn match hsOperator "`[a-zA-Z0-9\.]\+`" @@ -90,11 +90,11 @@ syn match hsOperator "`[a-zA-Z0-9\.]\+`"  " after a name.  This allows whitespace before the name so that it can match  " in a 'where,' but it won't match local type annotations on random little  " things. -syn match hsFunctionList "^\s*\([a-z][a-zA-Z0-9']*[[:space:]\n,]\+\)*[a-z][a-zA-Z0-9']*[[:space:]\n]*::" contains=hsFunction -syn match hsFunction "\s*[a-z][a-zA-Z0-9']*[[:space:]\n]*\(::\|,\)\@=" contained +syn match hsFunctionList "^\s*\(\<\(where\>\|let\>\)\@![a-z][a-zA-Z0-9']*[[:space:]\n,]\+\)*[a-z][a-zA-Z0-9']*[[:space:]\n]*::" contains=hsFunction +syn match hsFunction "\s*[a-z][a-zA-Z0-9']*\([[:space:]\n]*\(::\|,\)\)\@=" contained  " Also support the style where the first where binding is on the same line as  " the where keyword. -syn match hsFunction "\(^\s\+where\s\+\)\@<=[a-z][a-zA-Z0-9']*\(\s*::\)\@=" +syn match hsFunction "\(\<\(where\|let\)\s\+\([a-z][a-zA-Z0-9']*\s*,\s*\)*\)\@<=[a-z][a-zA-Z0-9']*\(\s*\(,\s*[a-z][a-zA-Z0-9']*\s*\)*::\)\@="  " FIXME Ignoring proc for now, also mdo and rec diff --git a/syntax/jade.vim b/syntax/jade.vim index 108bc6b4..5c6e2199 100644 --- a/syntax/jade.vim +++ b/syntax/jade.vim @@ -27,15 +27,15 @@ 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   jadeBegin "^\s*\%([<>]\|&[^=~ ]\)\@!" nextgroup=jadeTag,jadeClassChar,jadeIdChar,jadePlainChar,jadeJavascript,jadeScriptConditional,jadeScriptStatement,jadePipedText  syn match   jadeTag "+\?\w\+\%(:\w\+\)\=" contained contains=htmlTagName,htmlSpecialTagName nextgroup=@jadeComponent -syn cluster jadeComponent contains=jadeAttributes,jadeIdChar,jadeBlockExpansionChar,jadeClassChar,jadePlainChar,jadeJavascript +syn cluster jadeComponent contains=jadeAttributes,jadeIdChar,jadeBlockExpansionChar,jadeClassChar,jadePlainChar,jadeJavascript,jadeTagBlockChar,jadeTagInlineText  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   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="$" @@ -47,6 +47,12 @@ 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 match   jadeTagInlineText "\s.*$" contained contains=jadeInterpolation,jadeTextInlineJade +syn region  jadePipedText matchgroup=jadePipeChar start="|" end="$" contained contains=jadeInterpolation,jadeTextInlineJade nextgroup=jadePipedText skipnl +syn match   jadeTagBlockChar "\.$" contained nextgroup=jadeTagBlockText,jadeTagBlockEnd skipnl +syn region  jadeTagBlockText start="\%(\s*\)\S" end="\ze\n" contained contains=jadeInterpolation,jadeTextInlineJade nextgroup=jadeTagBlockText,jadeTagBlockEnd skipnl +syn region  jadeTagBlockEnd start="\s*\S" end="$" contained contains=jadeInterpolation,jadeTextInlineJade nextgroup=jadeBegin skipnl +syn region  jadeTextInlineJade matchgroup=jadeInlineDelimiter start="#\[" end="]" contained contains=jadeTag keepend  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 @@ -55,9 +61,9 @@ syn region  jadeStylusFilter matchgroup=jadeFilter start="^\z(\s*\):stylus\s*$"  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 region  jadeScriptLoopRegion start="^\s*\(for\)" end="$" contains=jadeScriptLoopKeywords +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 -syn match  jadeScriptStatement "^\s*\<\%(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 @@ -75,9 +81,12 @@ hi def link jadeAttributesDelimiter    Identifier  hi def link jadeIdChar                 Special  hi def link jadeClassChar              Special  hi def link jadeBlockExpansionChar     Special +hi def link jadePipeChar               Special +hi def link jadeTagBlockChar           Special  hi def link jadeId                     Identifier  hi def link jadeClass                  Type  hi def link jadeInterpolationDelimiter Delimiter +hi def link jadeInlineDelimiter        Delimiter  hi def link jadeFilter                 PreProc  hi def link jadeDocType                PreProc  hi def link jadeComment                Comment diff --git a/syntax/markdown.vim b/syntax/markdown.vim index 8fc47278..8c981bbe 100644 --- a/syntax/markdown.vim +++ b/syntax/markdown.vim @@ -75,18 +75,20 @@ syn region markdownLink matchgroup=markdownLinkDelimiter start="(" end=")" conta  syn region markdownId matchgroup=markdownIdDelimiter start="\[" end="\]" keepend contained  syn region markdownAutomaticLink matchgroup=markdownUrlDelimiter start="<\%(\w\+:\|[[:alnum:]_+-]\+@\)\@=" end=">" keepend oneline -syn region markdownItalic start="\S\@<=\*\|\*\S\@=" end="\S\@<=\*\|\*\S\@=" keepend contains=markdownLineStart -syn region markdownItalic start="\S\@<=_\|_\S\@=" end="\S\@<=_\|_\S\@=" keepend contains=markdownLineStart -syn region markdownBold start="\S\@<=\*\*\|\*\*\S\@=" end="\S\@<=\*\*\|\*\*\S\@=" keepend contains=markdownLineStart,markdownItalic -syn region markdownBold start="\S\@<=__\|__\S\@=" end="\S\@<=__\|__\S\@=" keepend contains=markdownLineStart,markdownItalic -syn region markdownBoldItalic start="\S\@<=\*\*\*\|\*\*\*\S\@=" end="\S\@<=\*\*\*\|\*\*\*\S\@=" keepend contains=markdownLineStart -syn region markdownBoldItalic start="\S\@<=___\|___\S\@=" end="\S\@<=___\|___\S\@=" keepend contains=markdownLineStart +let s:concealends = has('conceal') ? ' concealends' : '' +exe 'syn region markdownItalic matchgroup=markdownItalicDelimiter start="\S\@<=\*\|\*\S\@=" end="\S\@<=\*\|\*\S\@=" keepend contains=markdownLineStart' . s:concealends +exe 'syn region markdownItalic matchgroup=markdownItalicDelimiter start="\S\@<=_\|_\S\@=" end="\S\@<=_\|_\S\@=" keepend contains=markdownLineStart' . s:concealends +exe 'syn region markdownBold matchgroup=markdownBoldDelimiter start="\S\@<=\*\*\|\*\*\S\@=" end="\S\@<=\*\*\|\*\*\S\@=" keepend contains=markdownLineStart,markdownItalic' . s:concealends +exe 'syn region markdownBold matchgroup=markdownBoldDelimiter start="\S\@<=__\|__\S\@=" end="\S\@<=__\|__\S\@=" keepend contains=markdownLineStart,markdownItalic' . s:concealends +exe 'syn region markdownBoldItalic matchgroup=markdownBoldItalicDelimiter start="\S\@<=\*\*\*\|\*\*\*\S\@=" end="\S\@<=\*\*\*\|\*\*\*\S\@=" keepend contains=markdownLineStart' . s:concealends +exe 'syn region markdownBoldItalic matchgroup=markdownBoldItalicDelimiter start="\S\@<=___\|___\S\@=" end="\S\@<=___\|___\S\@=" keepend contains=markdownLineStart' . s:concealends +  syn region markdownCode matchgroup=markdownCodeDelimiter start="`" end="`" keepend contains=markdownLineStart  syn region markdownCode matchgroup=markdownCodeDelimiter start="`` \=" end=" \=``" keepend contains=markdownLineStart  syn region markdownCode matchgroup=markdownCodeDelimiter start="^\s*```.*$" end="^\s*```\ze\s*$" keepend -syn match markdownFootnote "\[^[^\]]\]\s*$" -syn match markdownFootnoteDefinition "^\[^[^\]]\]:" +syn match markdownFootnote "\[^[^\]]\+\]" +syn match markdownFootnoteDefinition "^\[^[^\]]\+\]:"  if main_syntax ==# 'markdown'    for s:type in g:markdown_fenced_languages @@ -125,8 +127,11 @@ hi def link markdownUrlDelimiter          htmlTag  hi def link markdownUrlTitleDelimiter     Delimiter  hi def link markdownItalic                htmlItalic +hi def link markdownItalicDelimiter       markdownItalic  hi def link markdownBold                  htmlBold +hi def link markdownBoldDelimiter         markdownBold  hi def link markdownBoldItalic            htmlBoldItalic +hi def link markdownBoldItalicDelimiter   markdownBoldItalic  hi def link markdownCodeDelimiter         Delimiter  hi def link markdownEscape                Special diff --git a/syntax/mustache.vim b/syntax/mustache.vim index 3fc0bf3f..af1a8289 100644 --- a/syntax/mustache.vim +++ b/syntax/mustache.vim @@ -40,10 +40,10 @@ else  endif  syntax match mustacheError '}}}\?' -syntax match mustacheInsideError '{{[{#<>=!\/]\?' +syntax match mustacheInsideError '{{[{$#<>=!\/]\?'  syntax region mustacheInside start=/{{/ end=/}}}\?/ keepend containedin=TOP,@htmlMustacheContainer  syntax match mustacheOperators '=\|\.\|/' contained containedin=mustacheInside,@htmlMustacheContainer -syntax region mustacheSection start='{{[#^/]'lc=2 end=/}}/me=e-2 contained containedin=mustacheInside,@htmlMustacheContainer +syntax region mustacheSection start='{{[$#^/]'lc=2 end=/}}/me=e-2 contained containedin=mustacheInside,@htmlMustacheContainer  syntax region mustachePartial start=/{{[<>]/lc=2 end=/}}/me=e-2 contained containedin=mustacheInside,@htmlMustacheContainer  syntax region mustacheMarkerSet start=/{{=/lc=2 end=/=}}/me=e-2 contained containedin=mustacheInside,@htmlMustacheContainer  syntax match mustacheHandlebars '{{\|}}' contained containedin=mustacheInside,@htmlMustacheContainer diff --git a/syntax/perl.vim b/syntax/perl.vim index 76e54c6c..75c4d5e6 100644 --- a/syntax/perl.vim +++ b/syntax/perl.vim @@ -28,7 +28,7 @@  " unlet perl_fold  " unlet perl_fold_blocks  " unlet perl_nofold_packages -" let perl_nofold_subs = 1 +" unlet perl_nofold_subs  " unlet perl_fold_anonymous_subs  " unlet perl_no_subprototype_error @@ -145,11 +145,11 @@ syn match  perlPackageRef	 "[$@#%*&]\%(\%(::\|'\)\=\I\i*\%(\%(::\|'\)\I\i*\)*\)\  if !exists("perl_no_scope_in_variables")    syn match  perlVarPlain       "\%([@$]\|\$#\)\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref -  syn match  perlVarPlain2                   "%\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" contains=perlPackageRef +  syn match  perlVarPlain2                   "%\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref    syn match  perlFunctionName                "&\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref  else    syn match  perlVarPlain       "\%([@$]\|\$#\)\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref -  syn match  perlVarPlain2                   "%\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" +  syn match  perlVarPlain2                   "%\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref    syn match  perlFunctionName                "&\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref  endif @@ -172,7 +172,9 @@ if !exists("perl_no_extended_vars")    syn region perlVarMember	matchgroup=perlVarPlain start="\%(->\)\=\[" skip="\\]" end="]" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlMethod,perlPostDeref extend    syn match perlPackageConst	"__PACKAGE__" nextgroup=perlMethod,perlPostDeref    syn match  perlMethod		"->\$*\I\i*" contained nextgroup=perlVarSimpleMember,perlVarMember,perlMethod,perlPostDeref -  syn match  perlPostDeref	"->\%($#\|[$@%]\)\*" contained nextgroup=perlVarSimpleMember,perlVarMember,perlMethod,perlPostDeref +  syn match  perlPostDeref	"->\%($#\|[$@%&*]\)\*" contained nextgroup=perlVarSimpleMember,perlVarMember,perlMethod,perlPostDeref +  syn region  perlPostDeref	start="->\%($#\|[$@%&*]\)\[" skip="\\]" end="]" contained contains=@perlExpr nextgroup=perlVarSimpleMember,perlVarMember,perlMethod,perlPostDeref +  syn region  perlPostDeref	matchgroup=perlPostDeref start="->\%($#\|[$@%&*]\){" skip="\\}" end="}" contained contains=@perlExpr nextgroup=perlVarSimpleMember,perlVarMember,perlMethod,perlPostDeref  endif  " File Descriptors @@ -369,9 +371,12 @@ else  endif  if !exists("perl_no_subprototype_error") " Set 1 if using signatures feature in perl5.19.9      syn match perlSubPrototypeError "(\%(\_s*\%(\%(\\\%([$@%&*]\|\[[$@%&*]\+\]\)\|[$&*]\|[@%]\%(\_s*)\)\@=\|;\%(\_s*[)$@%&*\\]\)\@=\|_\%(\_s*[);]\)\@=\)\_s*\)*\)\@>\zs\_[^)]\+" contained -    syn match perlSubPrototype +(\_[^)]*)\_s*\|+ nextgroup=perlSubAttributes,perlComment contained contains=perlSubPrototypeError +    syn match perlSubPrototype +(\_[^)]*)\_s*+ nextgroup=perlSubAttributes,perlComment contained contains=perlSubPrototypeError +else +    syntax match perlSignature "(.\{-})" nextgroup=perlSubAttributes,perlComment contained  endif -syn match perlSubName +\%(\h\|::\|'\w\)\%(\w\|::\|'\w\)*\_s*\|+ contained nextgroup=perlSubPrototype,perlComment + +syn match perlSubName +\%(\h\|::\|'\w\)\%(\w\|::\|'\w\)*\_s*\|+ contained nextgroup=perlSubPrototype,perlSignature,perlSubAttributes,perlComment  syn match perlFunction +\<sub\>\_s*+ nextgroup=perlSubName @@ -456,6 +461,7 @@ HiLink perlOperator		Operator  HiLink perlFunction		Keyword  HiLink perlSubName		Function  HiLink perlSubPrototype		Type +HiLink perlSignature		Type  HiLink perlSubAttributes	PreProc  HiLink perlSubAttributesCont	perlSubAttributes  HiLink perlComment		Comment diff --git a/syntax/php.vim b/syntax/php.vim index edb1530e..d5c28aea 100644 --- a/syntax/php.vim +++ b/syntax/php.vim @@ -3,7 +3,7 @@  "  " {{{ BLOCK: Last-modified -" Mon, 02 Jun 2014 07:13:11 +0000, PHP 5.6.0beta3 +" Thu, 10 Jul 2014 06:50:23 +0000, PHP 5.6.0RC2  " }}}  " @@ -33,11 +33,19 @@  "       (Statements) in your code.  "  " Options:  php_sql_query = 1  for SQL syntax highlighting inside strings (default: 0) +"           php_sql_heredoc = 1 for SQL syntax highlighting inside heredocs (default: 1) +"           b:sql_type_override = 'postgresql' for PostgreSQL syntax highlighting in current buffer (default: 'mysql') +"           g:sql_type_default = 'postgresql' to set global SQL syntax highlighting language default (default: 'mysql')"  "           php_html_in_strings = 1  for HTML syntax highlighting inside strings (default: 0) +"           php_html_in_heredoc = 1 for HTML syntax highlighting inside heredocs (default: 1) +"           php_html_load = 1 for loading the HTML syntax at all.  Overwrites php_html_in_strings and php_html_in_heredoc (default: 1) +"           php_ignore_phpdoc = 0 for not highlighting parts of phpDocs  "           php_parent_error_close = 1  for highlighting parent error ] or ) (default: 0)  "           php_parent_error_open = 1  for skipping an php end tag,  "                                      if there exists an open ( or [ without a closing one (default: 0) -"           php_folding = 1  for folding classes and functions +"           php_folding = 1  for folding loops, if/elseif/else, switch, try/catch, classes, and functions based on +"                            indent, finds a } with an indent matching the structure. +"                         2  for folding all { }, ( ), and [ ] pairs. (see known bugs ii)  "           php_sync_method = x  "                             x=-1 to sync by search ( default )  "                             x>0 to sync at least x lines backwards @@ -52,12 +60,6 @@  "           g:php_syntax_extensions_disabled  A list of extension names (lowercase) for which built-in functions,  "                                             constants, classes and interfaces is enabled / disabled.  " -" Note: -" Setting php_folding=1 will match a closing } by comparing the indent -" before the class or function keyword with the indent of a matching }. -" Setting php_folding=2 will match all of pairs of {,} ( see known -" bugs ii ) -"  " Known Bugs:  "  - setting  php_parent_error_close  on  and  php_parent_error_open  off  "    has these two leaks: @@ -83,10 +85,31 @@ if !exists("main_syntax")    let main_syntax = 'php'  endif -runtime! syntax/html.vim -unlet! b:current_syntax -" HTML syntax file turns on spelling for all top level words, we attempt to turn off -syntax spell default +if !exists("php_html_load") +  let php_html_load=1 +endif + +if (exists("php_html_load") && php_html_load) +  if !exists("php_html_in_heredoc") +    let php_html_in_heredoc=1 +  endif + +  runtime! syntax/html.vim +  unlet! b:current_syntax +  " HTML syntax file turns on spelling for all top level words, we attempt to turn off +  syntax spell default + +  syn cluster htmlPreproc add=phpRegion +else +  " If it is desired that the HTML syntax file not be loaded at all, set the options for highlighting it in string +  " and heredocs to false. +  let php_html_in_strings=0 +  let php_html_in_heredoc=0 +endif + +if (exists("php_html_in_strings") && php_html_in_strings) +  syn cluster phpAddStrings add=@htmlTop +endif  " Set sync method if none declared  if ( ! exists("php_sync_method") || php_sync_method == 1) @@ -97,27 +120,42 @@ if ( ! exists("php_sync_method") || php_sync_method == 1)    endif  endif -syn cluster htmlPreproc add=phpRegion - -" Use MySQL as the default SQL syntax file. -" See https://github.com/StanAngeloff/php.vim/pull/1 -if !exists('b:sql_type_override') && !exists('g:sql_type_default') -  let b:sql_type_override='mysql' +if !exists("php_sql_heredoc") +  let php_sql_heredoc=1  endif -syn include @sqlTop syntax/sql.vim -syn sync clear -unlet! b:current_syntax -syn cluster sqlTop remove=sqlString,sqlComment +if ((exists("php_sql_query") && php_sql_query) || (exists("php_sql_heredoc") && php_sql_heredoc)) +  " Use MySQL as the default SQL syntax file. +  " See https://github.com/StanAngeloff/php.vim/pull/1 +  if !exists('b:sql_type_override') && !exists('g:sql_type_default') +    let b:sql_type_override='mysql' +  endif +  syn include @sqlTop syntax/sql.vim + +  syn sync clear +  unlet! b:current_syntax +  syn cluster sqlTop remove=sqlString,sqlComment + +  if (exists("php_sql_query") && php_sql_query) +    syn cluster phpAddStrings contains=@sqlTop +  endif +endif -if (exists("php_sql_query") && php_sql_query) -  syn cluster phpAddStrings contains=@sqlTop +" set default for php_folding so we don't have to keep checking its existence. +if !exists("php_folding") +  let php_folding = 0  endif -if (exists("php_html_in_strings") && php_html_in_strings) -  syn cluster phpAddStrings add=@htmlTop +" Folding Support {{{ +" +if php_folding==1 && has("folding") +  command! -nargs=+ SynFold <args> fold +else +  command! -nargs=+ SynFold <args>  endif +" }}} +  syn case match  " Superglobals @@ -240,7 +278,7 @@ syn keyword phpConstants ABDAY_1 ABDAY_2 ABDAY_3 ABDAY_4 ABDAY_5 ABDAY_6 ABDAY_7  endif  if index(g:php_syntax_extensions_enabled, "tokenizer") >= 0 && index(g:php_syntax_extensions_disabled, "tokenizer") < 0 && ( ! exists("b:php_syntax_extensions_enabled") || index(b:php_syntax_extensions_enabled, "tokenizer") >= 0) && ( ! exists("b:php_syntax_extensions_disabled") || index(b:php_syntax_extensions_disabled, "tokenizer") < 0)  " tokenizer constants -syn keyword phpConstants T_ABSTRACT T_AND_EQUAL T_ARRAY T_ARRAY_CAST T_AS T_BAD_CHARACTER T_BOOLEAN_AND T_BOOLEAN_OR T_BOOL_CAST T_BREAK T_CALLABLE T_CASE T_CATCH T_CHARACTER T_CLASS T_CLASS_C T_CLONE T_CLOSE_TAG T_COMMENT T_CONCAT_EQUAL T_CONST T_CONSTANT_ENCAPSED_STRING T_CONTINUE T_CURLY_OPEN T_DEC T_DECLARE T_DEFAULT T_DIR T_DIV_EQUAL T_DNUMBER T_DO T_DOC_COMMENT T_DOLLAR_OPEN_CURLY_BRACES T_DOUBLE_ARROW T_DOUBLE_CAST T_DOUBLE_COLON T_ECHO T_ELLIPSIS T_ELSE T_ELSEIF T_EMPTY T_ENCAPSED_AND_WHITESPACE T_ENDDECLARE T_ENDFOR T_ENDFOREACH T_ENDIF T_ENDSWITCH T_ENDWHILE T_END_HEREDOC T_EVAL T_EXIT T_EXTENDS T_FILE T_FINAL T_FINALLY T_FOR T_FOREACH T_FUNCTION T_FUNC_C T_GLOBAL T_GOTO T_HALT_COMPILER T_IF T_IMPLEMENTS T_INC T_INCLUDE T_INCLUDE_ONCE T_INLINE_HTML T_INSTANCEOF T_INSTEADOF T_INTERFACE T_INT_CAST T_ISSET T_IS_EQUAL T_IS_GREATER_OR_EQUAL T_IS_IDENTICAL T_IS_NOT_EQUAL T_IS_NOT_IDENTICAL T_IS_SMALLER_OR_EQUAL T_LINE T_LIST T_LNUMBER T_LOGICAL_AND T_LOGICAL_OR T_LOGICAL_XOR T_METHOD_C T_MINUS_EQUAL T_MOD_EQUAL T_MUL_EQUAL T_NAMESPACE T_NEW T_NS_C T_NS_SEPARATOR T_NUM_STRING T_OBJECT_CAST T_OBJECT_OPERATOR T_OPEN_TAG T_OPEN_TAG_WITH_ECHO T_OR_EQUAL T_PAAMAYIM_NEKUDOTAYIM T_PLUS_EQUAL T_PRINT T_PRIVATE T_PROTECTED T_PUBLIC T_REQUIRE T_REQUIRE_ONCE T_RETURN T_SL T_SL_EQUAL T_SR T_SR_EQUAL T_START_HEREDOC T_STATIC T_STRING T_STRING_CAST T_STRING_VARNAME T_SWITCH T_THROW T_TRAIT T_TRAIT_C T_TRY T_UNSET T_UNSET_CAST T_USE T_VAR T_VARIABLE T_WHILE T_WHITESPACE T_XOR_EQUAL T_YIELD contained +syn keyword phpConstants T_ABSTRACT T_AND_EQUAL T_ARRAY T_ARRAY_CAST T_AS T_BAD_CHARACTER T_BOOLEAN_AND T_BOOLEAN_OR T_BOOL_CAST T_BREAK T_CALLABLE T_CASE T_CATCH T_CHARACTER T_CLASS T_CLASS_C T_CLONE T_CLOSE_TAG T_COMMENT T_CONCAT_EQUAL T_CONST T_CONSTANT_ENCAPSED_STRING T_CONTINUE T_CURLY_OPEN T_DEC T_DECLARE T_DEFAULT T_DIR T_DIV_EQUAL T_DNUMBER T_DO T_DOC_COMMENT T_DOLLAR_OPEN_CURLY_BRACES T_DOUBLE_ARROW T_DOUBLE_CAST T_DOUBLE_COLON T_ECHO T_ELLIPSIS T_ELSE T_ELSEIF T_EMPTY T_ENCAPSED_AND_WHITESPACE T_ENDDECLARE T_ENDFOR T_ENDFOREACH T_ENDIF T_ENDSWITCH T_ENDWHILE T_END_HEREDOC T_EVAL T_EXIT T_EXTENDS T_FILE T_FINAL T_FINALLY T_FOR T_FOREACH T_FUNCTION T_FUNC_C T_GLOBAL T_GOTO T_HALT_COMPILER T_IF T_IMPLEMENTS T_INC T_INCLUDE T_INCLUDE_ONCE T_INLINE_HTML T_INSTANCEOF T_INSTEADOF T_INTERFACE T_INT_CAST T_ISSET T_IS_EQUAL T_IS_GREATER_OR_EQUAL T_IS_IDENTICAL T_IS_NOT_EQUAL T_IS_NOT_IDENTICAL T_IS_SMALLER_OR_EQUAL T_LINE T_LIST T_LNUMBER T_LOGICAL_AND T_LOGICAL_OR T_LOGICAL_XOR T_METHOD_C T_MINUS_EQUAL T_MOD_EQUAL T_MUL_EQUAL T_NAMESPACE T_NEW T_NS_C T_NS_SEPARATOR T_NUM_STRING T_OBJECT_CAST T_OBJECT_OPERATOR T_OPEN_TAG T_OPEN_TAG_WITH_ECHO T_OR_EQUAL T_PAAMAYIM_NEKUDOTAYIM T_PLUS_EQUAL T_POW T_POW_EQUAL T_PRINT T_PRIVATE T_PROTECTED T_PUBLIC T_REQUIRE T_REQUIRE_ONCE T_RETURN T_SL T_SL_EQUAL T_SR T_SR_EQUAL T_START_HEREDOC T_STATIC T_STRING T_STRING_CAST T_STRING_VARNAME T_SWITCH T_THROW T_TRAIT T_TRAIT_C T_TRY T_UNSET T_UNSET_CAST T_USE T_VAR T_VARIABLE T_WHILE T_WHITESPACE T_XOR_EQUAL T_YIELD contained  endif  if index(g:php_syntax_extensions_enabled, "xml") >= 0 && index(g:php_syntax_extensions_disabled, "xml") < 0 && ( ! exists("b:php_syntax_extensions_enabled") || index(b:php_syntax_extensions_enabled, "xml") >= 0) && ( ! exists("b:php_syntax_extensions_disabled") || index(b:php_syntax_extensions_disabled, "xml") < 0)  " xml constants @@ -444,10 +482,15 @@ endif  syntax keyword phpClasses containedin=ALLBUT,phpComment,phpDocComment,phpStringDouble,phpStringSingle,phpIdentifier,phpMethodsVar  " Control Structures -syn keyword phpKeyword if echo else elseif while do for foreach function break switch case default continue return goto as endif endwhile endfor endforeach endswitch declare endeclare print new clone yield contained +syn keyword phpKeyword echo continue case default break return goto as endif endwhile endfor endforeach endswitch declare endeclare print new clone yield contained +" Only create keyword groupings for these if not doing folding, otherwise they take precedence over the regions +" used for folding. +if php_folding != 1 +  syn keyword phpKeyword if else elseif while do for foreach function switch contained -" Exception Keywords -syn keyword phpKeyword try catch finally throw contained +  " Exception Keywords +  syn keyword phpKeyword try catch finally throw contained +endif  " Class Keywords  syn keyword phpType class abstract extends interface implements static final var public private protected const trait contained @@ -532,16 +575,16 @@ endif  syn match phpCommentStar contained "^\s*\*[^/]"me=e-1  syn match phpCommentStar contained "^\s*\*$" -if !exists("php_ignore_phpdoc") +if !exists("php_ignore_phpdoc") || !php_ignore_phpdoc    syn case ignore    syn region phpDocComment   start="/\*\*" end="\*/" keepend contains=phpCommentTitle,phpDocTags,phpTodo,@Spell    syn region phpCommentTitle contained matchgroup=phpDocComment start="/\*\*" matchgroup=phpCommmentTitle keepend end="\.$" end="\.[ \t\r<&]"me=e-1 end="[^{]@"me=s-2,he=s-1 end="\*/"me=s-1,he=s-1 contains=phpCommentStar,phpTodo,phpDocTags,@Spell containedin=phpDocComment    syn region phpDocTags  start="{@\(example\|id\|internal\|inheritdoc\|link\|source\|toc\|tutorial\)" end="}" containedin=phpDocComment -  syn match  phpDocTags  "@\(abstract\|access\|author\|category\|copyright\|deprecated\|example\|exception\|filesource\|final\|global\|id\|ignore\|inheritdoc\|internal\|license\|link\|magic\|method\|name\|package\|param\|property\|return\|see\|since\|source\|static\|staticvar\|subpackage\|throws\|toc\|todo\|tutorial\|uses\|var\|version\)\s\+\S\+.*" contains=phpDocParam containedin=phpDocComment -  syn match  phpDocParam "\s\S\+" contained contains=phpDocIdentifier -  syn match  phpDocIdentifier contained "$\h\w*" +  syn match phpDocTags "@\%(abstract\|access\|author\|category\|copyright\|deprecated\|example\|exception\|filesource\|final\|global\|id\|ignore\|inheritdoc\|internal\|license\|link\|magic\|method\|name\|package\|param\|property\|return\|see\|since\|source\|static\|staticvar\|subpackage\|throws\|toc\|todo\|tutorial\|uses\|var\|version\)" containedin=phpDocComment nextgroup=phpDocParam,phpDocIdentifier skipwhite +  syn match phpDocParam "\s\+\zs\%(\h\w*|\?\)\+" nextgroup=phpDocIdentifier skipwhite +  syn match phpDocIdentifier "\s\+\zs$\h\w*"    syn case match  endif @@ -568,23 +611,29 @@ else  endif  " HereDoc -  syn case match -  syn region phpHereDoc matchgroup=Delimiter start="\(<<<\)\@<=\z(\I\i*\)$" end="^\z1\(;\=$\)\@=" contained contains=@Spell,phpIdentifier,phpIdentifierSimply,phpIdentifierComplex,phpSpecialChar,phpMethodsVar,phpStrEsc keepend extend -  syn region phpHereDoc matchgroup=Delimiter start=+\(<<<\)\@<="\z(\I\i*\)"$+ end="^\z1\(;\=$\)\@=" contained contains=@Spell,phpIdentifier,phpIdentifierSimply,phpIdentifierComplex,phpSpecialChar,phpMethodsVar,phpStrEsc keepend extend -" including HTML,JavaScript,SQL even if not enabled via options -  syn region phpHereDoc matchgroup=Delimiter start="\(<<<\)\@<=\z(\(\I\i*\)\=\(html\)\c\(\i*\)\)$" end="^\z1\(;\=$\)\@="  contained contains=@htmlTop,phpIdentifier,phpIdentifierSimply,phpIdentifierComplex,phpSpecialChar,phpMethodsVar,phpStrEsc keepend extend -  syn region phpHereDoc matchgroup=Delimiter start="\(<<<\)\@<=\z(\(\I\i*\)\=\(sql\)\c\(\i*\)\)$" end="^\z1\(;\=$\)\@=" contained contains=@sqlTop,phpIdentifier,phpIdentifierSimply,phpIdentifierComplex,phpSpecialChar,phpMethodsVar,phpStrEsc keepend extend -  syn region phpHereDoc matchgroup=Delimiter start="\(<<<\)\@<=\z(\(\I\i*\)\=\(javascript\)\c\(\i*\)\)$" end="^\z1\(;\=$\)\@="  contained contains=@htmlJavascript,phpIdentifierSimply,phpIdentifier,phpIdentifierComplex,phpSpecialChar,phpMethodsVar,phpStrEsc keepend extend -  syn case ignore +syn case match + +SynFold syn region phpHereDoc matchgroup=Delimiter start="\(<<<\)\@<=\z(\I\i*\)$" end="^\z1\(;\=$\)\@=" contained contains=@Spell,phpIdentifier,phpIdentifierSimply,phpIdentifierComplex,phpSpecialChar,phpMethodsVar,phpStrEsc keepend extend +SynFold syn region phpHereDoc matchgroup=Delimiter start=+\(<<<\)\@<="\z(\I\i*\)"$+ end="^\z1\(;\=$\)\@=" contained contains=@Spell,phpIdentifier,phpIdentifierSimply,phpIdentifierComplex,phpSpecialChar,phpMethodsVar,phpStrEsc keepend extend +" including HTML,JavaScript,SQL if enabled via options +if (exists("php_html_in_heredoc") && php_html_in_heredoc) +  SynFold syn region phpHereDoc matchgroup=Delimiter start="\(<<<\)\@<=\z(\(\I\i*\)\=\(html\)\c\(\i*\)\)$" end="^\z1\(;\=$\)\@="  contained contains=@htmlTop,phpIdentifier,phpIdentifierSimply,phpIdentifierComplex,phpSpecialChar,phpMethodsVar,phpStrEsc keepend extend +  SynFold syn region phpHereDoc matchgroup=Delimiter start="\(<<<\)\@<=\z(\(\I\i*\)\=\(javascript\)\c\(\i*\)\)$" end="^\z1\(;\=$\)\@="  contained contains=@htmlJavascript,phpIdentifierSimply,phpIdentifier,phpIdentifierComplex,phpSpecialChar,phpMethodsVar,phpStrEsc keepend extend +endif +if (exists("php_sql_heredoc") && php_sql_heredoc) +  SynFold syn region phpHereDoc matchgroup=Delimiter start="\(<<<\)\@<=\z(\(\I\i*\)\=\(sql\)\c\(\i*\)\)$" end="^\z1\(;\=$\)\@=" contained contains=@sqlTop,phpIdentifier,phpIdentifierSimply,phpIdentifierComplex,phpSpecialChar,phpMethodsVar,phpStrEsc keepend extend +endif  " NowDoc -  syn region phpNowDoc matchgroup=Delimiter start=+\(<<<\)\@<='\z(\I\i*\)'$+ end="^\z1\(;\=$\)\@=" contained keepend extend +SynFold syn region phpNowDoc matchgroup=Delimiter start=+\(<<<\)\@<='\z(\I\i*\)'$+ end="^\z1\(;\=$\)\@=" contained keepend extend + +syn case ignore  " Parent  if (exists("php_parent_error_close") && php_parent_error_close) || (exists("php_parent_error_open") && php_parent_error_open)    syn match  phpParent "[{}]"  contained -  syn region phpParent matchgroup=Delimiter start="(" end=")"  contained contains=@phpClFunction transparent -  syn region phpParent matchgroup=Delimiter start="\[" end="\]"  contained contains=@phpClInside transparent +  syn region phpParent matchgroup=Delimiter start="(" end=")"  contained contains=@phpClFunction,@phpClControl transparent +  syn region phpParent matchgroup=Delimiter start="\[" end="\]"  contained contains=@phpClFunction,@phpClControl transparent    if ! (exists("php_parent_error_close") && php_parent_error_close)      syn match phpParent "[\])]" contained    endif @@ -622,7 +671,8 @@ syn match phpFunction /\h\w*/  syn cluster phpClConst contains=phpFunctions,phpClasses,phpStaticClasses,phpIdentifier,phpStatement,phpKeyword,phpOperator,phpSplatOperator,phpStringSingle,phpStringDouble,phpBacktick,phpNumber,phpType,phpBoolean,phpStructure,phpMethodsVar,phpConstants,phpException,phpSuperglobals,phpMagicConstants,phpServerVars  syn cluster phpClInside contains=@phpClConst,phpComment,phpDocComment,phpParent,phpParentError,phpInclude,phpHereDoc,phpNowDoc  syn cluster phpClFunction contains=@phpClInside,phpDefine,phpParentError,phpStorageClass,phpKeyword -syn cluster phpClTop contains=@phpClFunction,phpFoldFunction,phpFoldClass,phpFoldInterface,phpFoldTry,phpFoldCatch +syn cluster phpClControl contains=phpFoldIfContainer,phpFoldWhile,phpFoldDoWhile,phpFoldFor,phpFoldForeach,phpFoldTryContainer,phpFoldSwitch +syn cluster phpClTop contains=@phpClFunction,@phpClControl,phpFoldFunction,phpFoldClass,phpFoldInterface,phpFoldHtmlInside  " Php Region  if (exists("php_parent_error_open") && php_parent_error_open) @@ -632,8 +682,8 @@ else  endif  " Fold -if exists("php_folding") && php_folding==1 -" match one line constructs here and skip them at folding +if php_folding==1 +  " match one line constructs here and skip them at folding    syn keyword phpSCKeyword  abstract final private protected public static  contained    syn keyword phpFCKeyword  function  contained    syn match phpDefine "\(\s\|^\)\(abstract\s\+\|final\s\+\|private\s\+\|protected\s\+\|public\s\+\|static\s\+\)*function\(\s\+.*[;}]\)\@="  contained contains=phpSCKeyword @@ -641,19 +691,46 @@ if exists("php_folding") && php_folding==1    syn match phpStructure "\(\s\|^\)interface\(\s\+.*}\)\@="  contained    syn match phpException "\(\s\|^\)try\(\s\+.*}\)\@="  contained    syn match phpException "\(\s\|^\)catch\(\s\+.*}\)\@="  contained +  syn match phpKeyword "^\s*\(if\|else\%[if]\)\s*\(.*{.*}$\|[^{}]*$\)\@=" contained +  syn match phpKeyword "^\s*while\s*\([^{}]*$\|.*{.*}$\)\@=" contained +  syn match phpKeyword "^\s*do\s*\([^{}]*$\|{.*}\s*while\s*.*;$\)\@=" contained +  syn match phpKeyword "while\s*\((.*);$\)\@=" contained +  syn match phpKeyword "^\s*for\s*\((.*)\s*{.*}$\|[^{}]*$\)\@=" contained +  syn match phpKeyword "^\s*foreach\s*\((.*)\s*{.*}$\|[^{}]*$\)\@=" contained    set foldmethod=syntax    syn region phpFoldHtmlInside matchgroup=Delimiter start="?>" end="<?\(php\)\=" contained transparent contains=@htmlTop -  syn region phpFoldFunction matchgroup=Storageclass start="^\z(\s*\)\(abstract\s\+\|final\s\+\|private\s\+\|protected\s\+\|public\s\+\|static\s\+\)*function\s\([^};]*$\)\@="rs=e-9 matchgroup=Delimiter end="^\z1}" contains=@phpClFunction,phpFoldHtmlInside,phpFCKeyword contained transparent fold extend -  syn region phpFoldFunction matchgroup=Define start="^function\s\([^};]*$\)\@=" matchgroup=Delimiter end="^}" contains=@phpClFunction,phpFoldHtmlInside contained transparent fold extend +  syn region phpFoldFunction matchgroup=Storageclass start="^\z(\s*\)\(abstract\s\+\|final\s\+\|private\s\+\|protected\s\+\|public\s\+\|static\s\+\)*function\s\([^};]*$\)\@="rs=e-9 matchgroup=Delimiter end="^\z1}" contains=@phpClFunction,@phpClControl,phpFoldHtmlInside,phpFCKeyword contained transparent fold extend +  syn region phpFoldFunction matchgroup=Define start="^function\s\([^};]*$\)\@=" matchgroup=Delimiter end="^}" contains=@phpClFunction,@phpClControl,phpFoldHtmlInside contained transparent fold extend    syn region phpFoldClass matchgroup=Structure start="^\z(\s*\)\(abstract\s\+\|final\s\+\)*class\s\+\([^}]*$\)\@=" matchgroup=Delimiter end="^\z1}" contains=@phpClFunction,phpFoldFunction,phpSCKeyword contained transparent fold extend    syn region phpFoldInterface matchgroup=Structure start="^\z(\s*\)interface\s\+\([^}]*$\)\@=" matchgroup=Delimiter end="^\z1}" contains=@phpClFunction,phpFoldFunction contained transparent fold extend -  syn region phpFoldCatch matchgroup=Exception start="^\z(\s*\)catch\s\+\([^}]*$\)\@=" matchgroup=Delimiter end="^\z1}" contains=@phpClFunction,phpFoldFunction contained transparent fold extend -  syn region phpFoldTry matchgroup=Exception start="^\z(\s*\)try\s\+\([^}]*$\)\@=" matchgroup=Delimiter end="^\z1}" contains=@phpClFunction,phpFoldFunction contained transparent fold extend -elseif exists("php_folding") && php_folding==2 + +  syn region phpFoldTryContainer start="^\z(\s*\)try\s\+\(.*{$\)\@=" skip="^\z1}\_s*\(catch\|finally\)" end="^\z1}$" keepend extend contained contains=@phpClFunction,@phpClControl,phpFoldFunction,phpFoldHtmlInside transparent +  syn region phpFoldTry matchgroup=phpException start="^\z(\s*\)try\s\+\(.*{$\)\@=" matchgroup=Delimiter end="^\z1}$" end="^\z1}\(\s\+\(catch\|finally\)\)\@="me=s-1 containedin=phpFoldTryContainer contained transparent keepend fold extend nextgroup=phpFoldCatch +  syn region phpFoldCatch matchgroup=phpException start="^\z(\s*\)\(}\s\+\)\=catch\s\+\(.*{$\)\@=" matchgroup=Delimiter end="^\z1}$" end="^\z1}\(\s\+\(catch\|finally\)\)\@="me=s-1 containedin=phpFoldTryContainer keepend contained transparent fold extend nextgroup=phpFoldCatch,phpFoldFinally +  syn region phpFoldFinally matchgroup=phpException start="^\z(\s*\)\(}\s\+\)\=finally\s\+\(.*{$\)\@=" matchgroup=Delimiter end="^\z1}$" contained containedin=phpFoldTryContainer transparent fold keepend + +  syn region phpFoldIfContainer start="^\z(\s*\)if\s\+\(.*{$\)\@=" skip="^\z1}\_s*else\%[if]" end="^\z1}$" keepend extend contained contains=@phpClFunction,@phpClControl,phpFCKeyword,phpFoldHtmlInside +  syn region phpFoldIf matchgroup=phpKeyword start="^\z(\s*\)if\s\+\([^}]*$\)\@=" matchgroup=Delimiter end="\(^\z1\)\@=}\(\_s\+\%[elseif]\s\+[^}]*$\)\@="me=s-1 contained containedin=phpFoldIfContainer keepend nextgroup=phpFoldElseIf,phpFoldElse fold transparent +  syn region phpFoldElseIf matchgroup=phpKeyword start="^\z(\s*\)\(}\s\+\)\=elseif\s\+\([^}]*$\)\@=" matchgroup=Delimiter end="\(^\z1\)\@=}\(\s*\%[elseif]\s*[^}]*$\)\@="me=s-1 contained containedin=phpFoldIfContainer keepend nextgroup=phpFoldElseIf,phpFoldElse fold transparent  +  syn region phpFoldElse matchgroup=phpKeyword start="^\z(\s*\)\(}\s\+\)\=else\s\+\([^}]*$\)\@=" matchgroup=Delimiter end="\(^\z1\)\@=}\(\s\+\%[elseif]\s\+[^}]*$\)\@="me=s-1 contained containedin=phpFoldIfContainer keepend fold transparent + +  syn region phpFoldSwitch matchgroup=phpKeyword start="^\z(\s*\)switch\s*\(.*{$\)\@=" matchgroup=Delimiter end="^\z1}$" keepend extend contained contains=@phpClFunction,@phpClControl,phpFCKeyword,phpFoldHtmlInside fold transparent +  syn region phpFoldCase matchgroup=phpKeyword start="^\z(\s*\)case\s*\(.*:$\)\@=" end="^\z1\(case\|default\)"me=s-1 contained containedin=phpFoldSwitch keepend contains=@phpClFunction,@phpClControl,phpFCKeyword,phpFoldHtmlInside nextgroup=phpFoldCase,phpFoldDefault fold transparent +  syn region phpFoldDefault matchgroup=phpKeyword start="^\z(\s*\)default\(:$\)\@=" matchgroup=Delimiter end="\s*}$" contained contains=@phpClFunction,@phpClControl,phpFCKeyword,phpFoldHtmlInside containedin=phpFoldSwitch keepend fold transparent + +  syn region phpFoldWhile matchgroup=phpKeyword start="^\z(\s*\)while\s\+\(.*{$\)\@=" matchgroup=Delimiter end="^\z1}$" contains=@phpClFunction,@phpClControl,phpFoldHtmlInside contained fold extend +  syn region phpFoldDoWhile matchgroup=phpkeyword start="^\z(\s*\)do\s\+\({$\)\@=" matchgroup=Delimiter end="\z1}\s\+\(while\s\+.*;$\)\@=" contains=@phpClFunction,@phpClControl,phpFoldHtmlInside contained fold extend keepend + +  syn region phpFoldFor matchgroup=phpKeyword start="^\z(\s*\)for\s\(.*{$\)\@=" matchgroup=Delimiter end="\z1}$" contains=@phpClFunction,@phpClControl,phpFCKeyword,phpFoldHtmlInside contained transparent fold extend +  syn region phpFoldForeach matchgroup=phpKeyword start="^\z(\s*\)foreach\s\(.*{$\)\@=" matchgroup=Delimiter end="\z1}$" contains=@phpClFunction,@phpClControl,phpFCKeyword,phpFoldHtmlInside contained transparent fold extend + +elseif php_folding==2    set foldmethod=syntax    syn region phpFoldHtmlInside matchgroup=Delimiter start="?>" end="<?\(php\)\=" contained transparent contains=@htmlTop    syn region phpParent matchgroup=Delimiter start="{" end="}"  contained contains=@phpClFunction,phpFoldHtmlInside transparent fold +  syn region phpParent matchgroup=Delimiter start="(" end=")"  contained contains=@phpClFunction,phpFoldHtmlInside transparent fold +  syn region phpParent matchgroup=Delimiter start="\[" end="]"  contained contains=@phpClFunction,phpFoldHtmlInside transparent fold  endif  " Sync @@ -687,7 +764,7 @@ if !exists("did_php_syn_inits")    hi def link phpFunctions        Function    hi def link phpMethods          Function    hi def link phpClasses          StorageClass -  hi def link phpException        StorageClass +  hi def link phpException        Exception    hi def link phpIdentifier       Identifier    hi def link phpIdentifierSimply Identifier    hi def link phpStatement        Statement @@ -734,10 +811,15 @@ if !exists("did_php_syn_inits")  endif +" Cleanup: {{{ + +delcommand SynFold  let b:current_syntax = "php"  if main_syntax == 'php'    unlet main_syntax  endif -" vim: ts=8 sts=2 sw=2 expandtab +" }}} + +" vim: ts=8 sts=2 sw=2 fdm=marker expandtab diff --git a/syntax/ruby.vim b/syntax/ruby.vim index 3ad8dca3..7d46a55b 100644 --- a/syntax/ruby.vim +++ b/syntax/ruby.vim @@ -103,6 +103,8 @@ syn match  rubySymbol		"[]})\"':]\@<!:\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)  syn region rubySymbol		start="[]})\"':]\@<!:'"  end="'"  skip="\\\\\|\\'"  contains=rubyQuoteEscape fold  syn region rubySymbol		start="[]})\"':]\@<!:\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial fold +syn match  rubyCapitalizedMethod	"\%(\%(^\|[^.]\)\.\s*\)\@<!\<\u\%(\w\|[^\x00-\x7F]\)*\>\%(\s*(\)*\s*(\@=" +  syn match  rubyBlockParameter	  "\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*" contained  syn region rubyBlockParameterList start="\%(\%(\<do\>\|{\)\s*\)\@<=|" end="|" oneline display contains=rubyBlockParameter @@ -336,6 +338,7 @@ hi def link rubyAccess			Statement  hi def link rubyAttribute		Statement  hi def link rubyEval			Statement  hi def link rubyPseudoVariable		Constant +hi def link rubyCapitalizedMethod	rubyLocalVariableOrMethod  hi def link rubyComment			Comment  hi def link rubyData			Comment diff --git a/syntax/rust.vim b/syntax/rust.vim index 77348335..0204d42a 100644 --- a/syntax/rust.vim +++ b/syntax/rust.vim @@ -3,7 +3,7 @@  " Maintainer:   Patrick Walton <pcwalton@mozilla.com>  " Maintainer:   Ben Blum <bblum@cs.cmu.edu>  " Maintainer:   Chris Morgan <me@chrismorgan.info> -" Last Change:  2014 Feb 27 +" Last Change:  July 18, 2014  if version < 600    syntax clear @@ -11,6 +11,17 @@ elseif exists("b:current_syntax")    finish  endif +" Fold settings {{{1 + +if has("folding") && exists('g:rust_fold') && g:rust_fold != 0 +  setlocal foldmethod=syntax +  if g:rust_fold == 2 +    setlocal foldlevel< +  else +    setlocal foldlevel=99 +  endif +endif +  " Syntax definitions {{{1  " Basic keywords {{{2  syn keyword   rustConditional match if else @@ -27,11 +38,10 @@ syn keyword   rustKeyword     for in if impl let  syn keyword   rustKeyword     loop once proc pub  syn keyword   rustKeyword     return super  syn keyword   rustKeyword     unsafe virtual while -syn keyword   rustKeyword     use nextgroup=rustModPath skipwhite skipempty +syn keyword   rustKeyword     use nextgroup=rustModPath,rustModPathInUse skipwhite skipempty  " FIXME: Scoped impl's name is also fallen in this category  syn keyword   rustKeyword     mod trait struct enum type nextgroup=rustIdentifier skipwhite skipempty -syn keyword   rustStorage     mut ref static -syn keyword   rustObsoleteStorage const +syn keyword   rustStorage     mut ref static const  syn keyword   rustInvalidBareKeyword crate @@ -50,6 +60,10 @@ syn region    rustBoxPlacementBalance start="(" end=")" containedin=rustBoxPlace  syn region    rustBoxPlacementBalance start="\[" end="\]" containedin=rustBoxPlacement transparent  " {} are handled by rustFoldBraces +syn region rustMacroRepeat matchgroup=rustMacroRepeatDelimiters start="$(" end=")" contains=TOP nextgroup=rustMacroRepeatCount +syn match rustMacroRepeatCount ".\?[*+]" contained +syn match rustMacroVariable "$\w\+" +  " Reserved (but not yet used) keywords {{{2  syn keyword   rustReservedKeyword alignof be do offsetof priv pure sizeof typeof unsized yield @@ -66,7 +80,7 @@ syn keyword   rustTrait       Copy Send Sized Share  syn keyword   rustTrait       Add Sub Mul Div Rem Neg Not  syn keyword   rustTrait       BitAnd BitOr BitXor  syn keyword   rustTrait       Drop Deref DerefMut -syn keyword   rustTrait       Shl Shr Index +syn keyword   rustTrait       Shl Shr Index IndexMut  syn keyword   rustEnum        Option  syn keyword   rustEnumVariant Some None  syn keyword   rustEnum        Result @@ -78,34 +92,39 @@ syn keyword   rustEnumVariant Ok Err  "syn keyword rustFunction drop  " Types and traits {{{3 -syn keyword rustTrait Ascii AsciiCast OwnedAsciiCast AsciiStr IntoBytes +syn keyword rustTrait Ascii AsciiCast OwnedAsciiCast AsciiStr +syn keyword rustTrait IntoBytes  syn keyword rustTrait ToCStr  syn keyword rustTrait Char  syn keyword rustTrait Clone -syn keyword rustTrait Eq Ord TotalEq TotalOrd Ordering Equiv +syn keyword rustTrait PartialEq PartialOrd Eq Ord Equiv +syn keyword rustEnum Ordering  syn keyword rustEnumVariant Less Equal Greater -syn keyword rustTrait Container Mutable Map MutableMap Set MutableSet -syn keyword rustTrait FromIterator Extendable -syn keyword rustTrait Iterator DoubleEndedIterator RandomAccessIterator CloneableIterator -syn keyword rustTrait OrdIterator MutableDoubleEndedIterator ExactSize -syn keyword rustTrait Num NumCast CheckedAdd CheckedSub CheckedMul -syn keyword rustTrait Signed Unsigned -syn keyword rustTrait Primitive Int Float FloatMath ToPrimitive FromPrimitive -"syn keyword rustTrait Expect +syn keyword rustTrait Collection Mutable Map MutableMap MutableSeq +syn keyword rustTrait Set MutableSet +syn keyword rustTrait FromIterator Extendable ExactSize +syn keyword rustTrait Iterator DoubleEndedIterator +syn keyword rustTrait RandomAccessIterator CloneableIterator +syn keyword rustTrait OrdIterator MutableDoubleEndedIterator +syn keyword rustTrait Num NumCast CheckedAdd CheckedSub CheckedMul CheckedDiv +syn keyword rustTrait Signed Unsigned Primitive Int Float +syn keyword rustTrait FloatMath ToPrimitive FromPrimitive  syn keyword rustTrait Box  syn keyword rustTrait GenericPath Path PosixPath WindowsPath  syn keyword rustTrait RawPtr  syn keyword rustTrait Buffer Writer Reader Seek -syn keyword rustTrait Str StrVector StrSlice OwnedStr IntoMaybeOwned -syn keyword rustTrait StrAllocating -syn keyword rustTrait ToStr IntoStr +syn keyword rustTrait Str StrVector StrSlice OwnedStr +syn keyword rustTrait IntoMaybeOwned StrAllocating +syn keyword rustTrait ToString IntoStr  syn keyword rustTrait Tuple1 Tuple2 Tuple3 Tuple4  syn keyword rustTrait Tuple5 Tuple6 Tuple7 Tuple8  syn keyword rustTrait Tuple9 Tuple10 Tuple11 Tuple12 -syn keyword rustTrait CloneableVector ImmutableCloneableVector MutableCloneableVector +syn keyword rustTrait CloneableVector ImmutableCloneableVector +syn keyword rustTrait MutableCloneableVector MutableOrdVector  syn keyword rustTrait ImmutableVector MutableVector -syn keyword rustTrait ImmutableEqVector ImmutableTotalOrdVector MutableTotalOrdVector -syn keyword rustTrait Vector VectorVector OwnedVector MutableVectorAllocating +syn keyword rustTrait ImmutableEqVector ImmutableOrdVector +syn keyword rustTrait Vector VectorVector +syn keyword rustTrait MutableVectorAllocating  syn keyword rustTrait String  syn keyword rustTrait Vec @@ -123,8 +142,9 @@ syn keyword   rustBoolean     true false  " If foo::bar changes to foo.bar, change this ("::" to "\.").  " If foo::bar changes to Foo::bar, change this (first "\w" to "\u").  syn match     rustModPath     "\w\(\w\)*::[^<]"he=e-3,me=e-3 -syn match     rustModPath     "\w\(\w\)*" contained " only for 'use path;' +syn match     rustModPathInUse "\w\(\w\)*" contained " only for 'use path;'  syn match     rustModPathSep  "::" +" rustModPathInUse is split out from rustModPath so that :syn-include can get the group list right.  syn match     rustFuncCall    "\w\(\w\)*("he=e-1,me=e-1  syn match     rustFuncCall    "\w\(\w\)*::<"he=e-3,me=e-3 " foo::<T>(); @@ -145,11 +165,13 @@ syn match     rustOperator     display "&&\|||"  syn match     rustMacro       '\w\(\w\)*!' contains=rustAssert,rustFail  syn match     rustMacro       '#\w\(\w\)*' contains=rustAssert,rustFail -syn match     rustSpecialError display contained /\\./ -syn match     rustSpecial     display contained /\\\([nrt0\\'"]\|x\x\{2}\|u\x\{4}\|U\x\{8}\)/ +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     rustStringContinuation display contained /\\\n\s*/ -syn region    rustString      start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=rustSpecial,rustSpecialError,rustStringContinuation,@Spell -syn region    rustString      start='r\z(#*\)"' end='"\z1' contains=@Spell +syn region    rustString      start=+b"+ skip=+\\\\\|\\"+ end=+"+ contains=rustEscape,rustEscapeError,rustStringContinuation +syn region    rustString      start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=rustEscape,rustEscapeUnicode,rustEscapeError,rustStringContinuation,@Spell +syn region    rustString      start='b\?r\z(#*\)"' end='"\z1' contains=@Spell  syn region    rustAttribute   start="#!\?\[" end="\]" contains=rustString,rustDeriving  syn region    rustDeriving    start="deriving(" end=")" contained contains=rustTrait @@ -177,7 +199,11 @@ syn region rustGenericLifetimeCandidate display start=/\%(<\|,\s*\)\@<='/ end=/[  "rustLifetime must appear before rustCharacter, or chars will get the lifetime highlighting  syn match     rustLifetime    display "\'\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" -syn match   rustCharacter   /'\([^'\\]\|\\\(.\|x\x\{2}\|u\x\{4}\|U\x\{8}\)\)'/ contains=rustSpecial,rustSpecialError +syn match   rustCharacterInvalid   display contained /b\?'\zs[\n\r\t']\ze'/ +" The groups negated here add up to 0-255 but nothing else (they do not seem to go beyond ASCII). +syn match   rustCharacterInvalidUnicode   display contained /b'\zs[^[:cntrl:][:graph:][:alnum:][:space:]]\ze'/ +syn match   rustCharacter   /b'\([^\\]\|\\\(.\|x\x\{2}\)\)'/ contains=rustEscape,rustEscapeError,rustCharacterInvalid,rustCharacterInvalidUnicode +syn match   rustCharacter   /'\([^\\]\|\\\(.\|x\x\{2}\|u\x\{4}\|U\x\{8}\)\)'/ contains=rustEscape,rustEscapeUnicode,rustEscapeError,rustCharacterInvalid  syn region rustCommentLine                                        start="//"                      end="$"   contains=rustTodo,@Spell  syn region rustCommentLineDoc                                     start="//\%(//\@!\|!\)"         end="$"   contains=rustTodo,@Spell @@ -203,8 +229,6 @@ syn keyword rustTodo contained TODO FIXME XXX NB NOTE  " Trivial folding rules to begin with.  " TODO: use the AST to make really good folding  syn region rustFoldBraces start="{" end="}" transparent fold -" If you wish to enable this, setlocal foldmethod=syntax -" It's not enabled by default as it would drive some people mad.  " Default highlighting {{{1  hi def link rustDecNumber       rustNumber @@ -214,11 +238,17 @@ hi def link rustBinNumber       rustNumber  hi def link rustIdentifierPrime rustIdentifier  hi def link rustTrait           rustType +hi def link rustMacroRepeatCount   rustMacroRepeatDelimiters +hi def link rustMacroRepeatDelimiters   Macro +hi def link rustMacroVariable Define  hi def link rustSigil         StorageClass -hi def link rustSpecial       Special -hi def link rustSpecialError  Error +hi def link rustEscape        Special +hi def link rustEscapeUnicode rustEscape +hi def link rustEscapeError   Error  hi def link rustStringContinuation Special  hi def link rustString        String +hi def link rustCharacterInvalid Error +hi def link rustCharacterInvalidUnicode rustCharacterInvalid  hi def link rustCharacter     Character  hi def link rustNumber        Number  hi def link rustBoolean       Boolean @@ -233,6 +263,7 @@ hi def link rustReservedKeyword Error  hi def link rustConditional   Conditional  hi def link rustIdentifier    Identifier  hi def link rustCapsIdent     rustIdentifier +hi def link rustModPathInUse  rustModPath  hi def link rustModPath       Include  hi def link rustModPathSep    Delimiter  hi def link rustFunction      Function diff --git a/syntax/sass.vim b/syntax/sass.vim index 0212c628..8fec5d03 100644 --- a/syntax/sass.vim +++ b/syntax/sass.vim @@ -58,7 +58,7 @@ syn match sassAmpersand  "&"  " TODO: Attribute namespaces  " TODO: Arithmetic (including strings and concatenation) -syn region sassMediaQuery matchgroup=sassMedia start="@media" end="$" contains=sassMediaOperators +syn region sassMediaQuery matchgroup=sassMedia start="@media" end="[{};]\@=\|$" contains=sassMediaOperators  syn keyword sassMediaOperators and not only contained  syn region sassCharset start="@charset" end=";\|$" contains=scssComment,cssStringQ,cssStringQQ,cssURL,cssUnicodeEscape,cssMediaType  syn region sassInclude start="@import" end=";\|$" contains=scssComment,cssStringQ,cssStringQQ,cssURL,cssUnicodeEscape,cssMediaType diff --git a/syntax/scala.vim b/syntax/scala.vim index b9df50f3..97189aed 100644 --- a/syntax/scala.vim +++ b/syntax/scala.vim @@ -37,7 +37,7 @@ syn match scalaSymbol /'[_A-Za-z0-9$]\+/  hi link scalaSymbol Number  syn match scalaChar /'.'/ -syn match scalaEscapedChar /\\[\\ntbrf]/ +syn match scalaEscapedChar /\\[\\"ntbrf]/  syn match scalaUnicodeChar /\\u[A-Fa-f0-9]\{4}/  hi link scalaChar Character  hi link scalaEscapedChar Function diff --git a/syntax/slim.vim b/syntax/slim.vim index 71d1e2af..b8d7b6a8 100644 --- a/syntax/slim.vim +++ b/syntax/slim.vim @@ -48,9 +48,10 @@ syn region slimWrappedAttrs matchgroup=slimWrappedAttrsDelimiter start="\s*{\s*"  syn region slimWrappedAttrs matchgroup=slimWrappedAttrsDelimiter start="\s*\[\s*" end="\s*\]\s*" contained contains=slimAttr nextgroup=slimRuby  syn region slimWrappedAttrs matchgroup=slimWrappedAttrsDelimiter start="\s*(\s*"  end="\s*)\s*"  contained contains=slimAttr nextgroup=slimRuby -syn match slimAttr "\s*\%(\w\|-\)\+\s*" contained contains=htmlArg nextgroup=slimAttrAssignment +syn match slimAttr /\s*\%(\w\|-\)\+\s*=/me=e-1 contained contains=htmlArg nextgroup=slimAttrAssignment  syn match slimAttrAssignment "\s*=\s*" contained nextgroup=slimWrappedAttrValue,slimAttrString +syn region slimWrappedAttrValue start="[^"']" end="\s\|$" contained contains=slimAttrString,@slimRubyTop nextgroup=slimAttr,slimRuby,slimInlineTagChar  syn region slimWrappedAttrValue matchgroup=slimWrappedAttrValueDelimiter start="{" end="}" contained contains=slimAttrString,@slimRubyTop nextgroup=slimAttr,slimRuby,slimInlineTagChar  syn region slimWrappedAttrValue matchgroup=slimWrappedAttrValueDelimiter start="\[" end="\]" contained contains=slimAttrString,@slimRubyTop nextgroup=slimAttr,slimRuby,slimInlineTagChar  syn region slimWrappedAttrValue matchgroup=slimWrappedAttrValueDelimiter start="(" end=")" contained contains=slimAttrString,@slimRubyTop nextgroup=slimAttr,slimRuby,slimInlineTagChar @@ -65,11 +66,11 @@ syn region slimInterpolation matchgroup=slimInterpolationDelimiter start="#{" en  syn region slimInterpolation matchgroup=slimInterpolationDelimiter start="#{{" end="}}" contains=@hamlRubyTop containedin=javascriptStringS,javascriptStringD,slimWrappedAttrs  syn match  slimInterpolationEscape "\\\@<!\%(\\\\\)*\\\%(\\\ze#{\|#\ze{\)" -syn region slimRuby matchgroup=slimRubyOutputChar start="\s*[=]\==[']\=" skip=",\s*$" end="$" contained contains=@slimRubyTop keepend -syn region slimRuby matchgroup=slimRubyChar       start="\s*-"           skip=",\s*$" end="$" contained contains=@slimRubyTop keepend +syn region slimRuby matchgroup=slimRubyOutputChar start="\s*[=]\==[']\=" skip="\%\(,\s*\|\\\)$" end="$" contained contains=@slimRubyTop keepend +syn region slimRuby matchgroup=slimRubyChar       start="\s*-"           skip="\%\(,\s*\|\\\)$" end="$" contained contains=@slimRubyTop keepend  syn match slimComment /^\(\s*\)[/].*\(\n\1\s.*\)*/ contains=slimTodo -syn match slimText    /^\(\s*\)[`|'].*\(\n\1\s.*\)*/ +syn match slimText    /^\(\s*\)[`|'].*\(\n\1\s.*\)*/ contains=slimInterpolation  syn match slimFilter /\s*\w\+:\s*/                            contained  syn match slimHaml   /^\(\s*\)\<haml:\>.*\(\n\1\s.*\)*/       contains=@slimHaml,slimFilter | 
