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 |