mirror of
				https://github.com/amix/vimrc
				synced 2025-10-31 06:33:35 +08:00 
			
		
		
		
	Added vim-commentary and updarted the plugins.
commentary: Comment stuff out. Use `gcc` to comment out a line (takes a count), `gc` to comment out the target of a motion (for example, `gcap` to comment out a paragraph), and `gc` in visual mode to comment out the selection. That's it.
This commit is contained in:
		| @ -80,6 +80,7 @@ I recommend reading the docs of these plugins to understand them better. Each of | |||||||
| * [vim-fugitive](https://github.com/tpope/vim-fugitive): A Git wrapper so awesome, it should be illegal | * [vim-fugitive](https://github.com/tpope/vim-fugitive): A Git wrapper so awesome, it should be illegal | ||||||
| * [goyo.vim](https://github.com/junegunn/goyo.vim) and [vim-zenroom2](https://github.com/amix/vim-zenroom2):  | * [goyo.vim](https://github.com/junegunn/goyo.vim) and [vim-zenroom2](https://github.com/amix/vim-zenroom2):  | ||||||
| Remove all clutter and focus only on the essential. Similar to iA Writer or Write Room [Read more here](http://amix.dk/blog/post/19744) | Remove all clutter and focus only on the essential. Similar to iA Writer or Write Room [Read more here](http://amix.dk/blog/post/19744) | ||||||
|  | * [vim-commentary](https://github.com/tpope/vim-commentary): Comment stuff out.  Use `gcc` to comment out a line (takes a count), `gc` to comment out the target of a motion. `gcu` uncomments a set of adjacent commented lines. | ||||||
|  |  | ||||||
|  |  | ||||||
| ## Included color schemes | ## Included color schemes | ||||||
|  | |||||||
| @ -38,7 +38,7 @@ At the time of this writing, syntax checking plugins exist for ActionScript, | |||||||
| Ada, AppleScript, AsciiDoc, ASM, BEMHTML, Bourne shell, C, C++, C#, Chef, | Ada, AppleScript, AsciiDoc, ASM, BEMHTML, Bourne shell, C, C++, C#, Chef, | ||||||
| CoffeeScript, Coco, Coq, CSS, Cucumber, CUDA, D, Dart, DocBook, Dust, Elixir, | CoffeeScript, Coco, Coq, CSS, Cucumber, CUDA, D, Dart, DocBook, Dust, Elixir, | ||||||
| Erlang, eRuby, Fortran, Gentoo metadata, GLSL, Go, Haml, Haskell, Haxe, | Erlang, eRuby, Fortran, Gentoo metadata, GLSL, Go, Haml, Haskell, Haxe, | ||||||
| Handlebars, HSS, HTML, Java, JavaScript, JSON, LESS, Lex, Limbo, LISP, | Handlebars, HSS, HTML, Java, JavaScript, JSON, JSX, LESS, Lex, Limbo, LISP, | ||||||
| LLVM intermediate language, Lua, MATLAB, NASM, Objective-C, Objective-C++, | LLVM intermediate language, Lua, MATLAB, NASM, Objective-C, Objective-C++, | ||||||
| OCaml, Perl, Perl POD, PHP, gettext Portable Object, Puppet, Python, Racket, | OCaml, Perl, Perl POD, PHP, gettext Portable Object, Puppet, Python, Racket, | ||||||
| reStructuredText, Ruby, Rust, SASS/SCSS, Scala, Slim, Tcl, TeX, Texinfo, Twig, | reStructuredText, Ruby, Rust, SASS/SCSS, Scala, Slim, Tcl, TeX, Texinfo, Twig, | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| if exists("g:loaded_syntastic_c_autoload") | if exists("g:loaded_syntastic_c_autoload") || !exists("g:loaded_syntastic_plugin") | ||||||
|     finish |     finish | ||||||
| endif | endif | ||||||
| let g:loaded_syntastic_c_autoload = 1 | let g:loaded_syntastic_c_autoload = 1 | ||||||
| @ -10,14 +10,14 @@ set cpo&vim | |||||||
|  |  | ||||||
| " convenience function to determine the 'null device' parameter | " convenience function to determine the 'null device' parameter | ||||||
| " based on the current operating system | " based on the current operating system | ||||||
| function! syntastic#c#NullOutput() | function! syntastic#c#NullOutput() " {{{2 | ||||||
|     let known_os = has('unix') || has('mac') || syntastic#util#isRunningWindows() |     let known_os = has('unix') || has('mac') || syntastic#util#isRunningWindows() | ||||||
|     return known_os ? '-o ' . syntastic#util#DevNull() : '' |     return known_os ? '-o ' . syntastic#util#DevNull() : '' | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " read additional compiler flags from the given configuration file | " read additional compiler flags from the given configuration file | ||||||
| " the file format and its parsing mechanism is inspired by clang_complete | " the file format and its parsing mechanism is inspired by clang_complete | ||||||
| function! syntastic#c#ReadConfig(file) | function! syntastic#c#ReadConfig(file) " {{{2 | ||||||
|     " search in the current file's directory upwards |     " search in the current file's directory upwards | ||||||
|     let config = findfile(a:file, '.;') |     let config = findfile(a:file, '.;') | ||||||
|     if config == '' || !filereadable(config) |     if config == '' || !filereadable(config) | ||||||
| @ -30,7 +30,7 @@ function! syntastic#c#ReadConfig(file) | |||||||
|     " try to read config file |     " try to read config file | ||||||
|     try |     try | ||||||
|         let lines = readfile(config) |         let lines = readfile(config) | ||||||
|     catch /^Vim\%((\a\+)\)\=:E48[45]/ |     catch /\m^Vim\%((\a\+)\)\=:E48[45]/ | ||||||
|         return '' |         return '' | ||||||
|     endtry |     endtry | ||||||
|  |  | ||||||
| @ -57,12 +57,12 @@ function! syntastic#c#ReadConfig(file) | |||||||
|     endfor |     endfor | ||||||
|  |  | ||||||
|     return join(map(parameters, 'syntastic#util#shescape(v:val)')) |     return join(map(parameters, 'syntastic#util#shescape(v:val)')) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " GetLocList() for C-like compilers | " GetLocList() for C-like compilers | ||||||
| function! syntastic#c#GetLocList(filetype, subchecker, options) | function! syntastic#c#GetLocList(filetype, subchecker, options) " {{{2 | ||||||
|     try |     try | ||||||
|         let flags = s:GetCflags(a:filetype, a:subchecker, a:options) |         let flags = s:getCflags(a:filetype, a:subchecker, a:options) | ||||||
|     catch /\m\C^Syntastic: skip checks$/ |     catch /\m\C^Syntastic: skip checks$/ | ||||||
|         return [] |         return [] | ||||||
|     endtry |     endtry | ||||||
| @ -70,9 +70,9 @@ function! syntastic#c#GetLocList(filetype, subchecker, options) | |||||||
|     let makeprg = syntastic#util#shexpand(g:syntastic_{a:filetype}_compiler) . |     let makeprg = syntastic#util#shexpand(g:syntastic_{a:filetype}_compiler) . | ||||||
|         \ ' ' . flags . ' ' . syntastic#util#shexpand('%') |         \ ' ' . flags . ' ' . syntastic#util#shexpand('%') | ||||||
|  |  | ||||||
|     let errorformat = s:GetCheckerVar('g', a:filetype, a:subchecker, 'errorformat', a:options['errorformat']) |     let errorformat = s:getCheckerVar('g', a:filetype, a:subchecker, 'errorformat', a:options['errorformat']) | ||||||
|  |  | ||||||
|     let postprocess = s:GetCheckerVar('g', a:filetype, a:subchecker, 'remove_include_errors', 0) ? |     let postprocess = s:getCheckerVar('g', a:filetype, a:subchecker, 'remove_include_errors', 0) ? | ||||||
|         \ ['filterForeignErrors'] : [] |         \ ['filterForeignErrors'] : [] | ||||||
|  |  | ||||||
|     " process makeprg |     " process makeprg | ||||||
| @ -80,34 +80,45 @@ function! syntastic#c#GetLocList(filetype, subchecker, options) | |||||||
|         \ 'makeprg': makeprg, |         \ 'makeprg': makeprg, | ||||||
|         \ 'errorformat': errorformat, |         \ 'errorformat': errorformat, | ||||||
|         \ 'postprocess': postprocess }) |         \ 'postprocess': postprocess }) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
| " Private functions {{{1 | " Private functions {{{1 | ||||||
|  |  | ||||||
| " initialize c/cpp syntax checker handlers | " initialize c/cpp syntax checker handlers | ||||||
| function! s:Init() | function! s:init() " {{{2 | ||||||
|     let s:handlers = [] |     let s:handlers = [] | ||||||
|     let s:cflags = {} |     let s:cflags = {} | ||||||
|  |  | ||||||
|     call s:RegHandler('\m\<cairo',       'syntastic#c#CheckPKG', ['cairo', 'cairo']) |     call s:regHandler('\m\<cairo',       'syntastic#c#checkPKG', ['cairo', 'cairo']) | ||||||
|     call s:RegHandler('\m\<freetype',    'syntastic#c#CheckPKG', ['freetype', 'freetype2', 'freetype']) |     call s:regHandler('\m\<freetype',    'syntastic#c#checkPKG', ['freetype', 'freetype2', 'freetype']) | ||||||
|     call s:RegHandler('\m\<glade',       'syntastic#c#CheckPKG', ['glade', 'libglade-2.0', 'libglade']) |     call s:regHandler('\m\<glade',       'syntastic#c#checkPKG', ['glade', 'libglade-2.0', 'libglade']) | ||||||
|     call s:RegHandler('\m\<glib',        'syntastic#c#CheckPKG', ['glib', 'glib-2.0', 'glib']) |     call s:regHandler('\m\<glib',        'syntastic#c#checkPKG', ['glib', 'glib-2.0', 'glib']) | ||||||
|     call s:RegHandler('\m\<gtk',         'syntastic#c#CheckPKG', ['gtk', 'gtk+-2.0', 'gtk+', 'glib-2.0', 'glib']) |     call s:regHandler('\m\<gtk',         'syntastic#c#checkPKG', ['gtk', 'gtk+-2.0', 'gtk+', 'glib-2.0', 'glib']) | ||||||
|     call s:RegHandler('\m\<libsoup',     'syntastic#c#CheckPKG', ['libsoup', 'libsoup-2.4', 'libsoup-2.2']) |     call s:regHandler('\m\<libsoup',     'syntastic#c#checkPKG', ['libsoup', 'libsoup-2.4', 'libsoup-2.2']) | ||||||
|     call s:RegHandler('\m\<libxml',      'syntastic#c#CheckPKG', ['libxml', 'libxml-2.0', 'libxml']) |     call s:regHandler('\m\<libxml',      'syntastic#c#checkPKG', ['libxml', 'libxml-2.0', 'libxml']) | ||||||
|     call s:RegHandler('\m\<pango',       'syntastic#c#CheckPKG', ['pango', 'pango']) |     call s:regHandler('\m\<pango',       'syntastic#c#checkPKG', ['pango', 'pango']) | ||||||
|     call s:RegHandler('\m\<SDL',         'syntastic#c#CheckPKG', ['sdl', 'sdl']) |     call s:regHandler('\m\<SDL',         'syntastic#c#checkPKG', ['sdl', 'sdl']) | ||||||
|     call s:RegHandler('\m\<opengl',      'syntastic#c#CheckPKG', ['opengl', 'gl']) |     call s:regHandler('\m\<opengl',      'syntastic#c#checkPKG', ['opengl', 'gl']) | ||||||
|     call s:RegHandler('\m\<webkit',      'syntastic#c#CheckPKG', ['webkit', 'webkit-1.0']) |     call s:regHandler('\m\<webkit',      'syntastic#c#checkPKG', ['webkit', 'webkit-1.0']) | ||||||
|  |  | ||||||
|     call s:RegHandler('\m\<php\.h\>',    'syntastic#c#CheckPhp',    []) |     call s:regHandler('\m\<php\.h\>',    'syntastic#c#checkPHP',    []) | ||||||
|     call s:RegHandler('\m\<Python\.h\>', 'syntastic#c#CheckPython', []) |     call s:regHandler('\m\<Python\.h\>', 'syntastic#c#checkPython', []) | ||||||
|     call s:RegHandler('\m\<ruby',        'syntastic#c#CheckRuby',   []) |     call s:regHandler('\m\<ruby',        'syntastic#c#checkRuby',   []) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " return a handler dictionary object | ||||||
|  | function! s:regHandler(regex, function, args) " {{{2 | ||||||
|  |     let handler = {} | ||||||
|  |     let handler["regex"] = a:regex | ||||||
|  |     let handler["func"] = function(a:function) | ||||||
|  |     let handler["args"] = a:args | ||||||
|  |     call add(s:handlers, handler) | ||||||
|  | endfunction " }}}2 | ||||||
|  |  | ||||||
| " resolve checker-related user variables | " resolve checker-related user variables | ||||||
| function! s:GetCheckerVar(scope, filetype, subchecker, name, default) | function! s:getCheckerVar(scope, filetype, subchecker, name, default) " {{{2 | ||||||
|     let prefix = a:scope . ':' . 'syntastic_' |     let prefix = a:scope . ':' . 'syntastic_' | ||||||
|     if exists(prefix . a:filetype . '_' . a:subchecker . '_' . a:name) |     if exists(prefix . a:filetype . '_' . a:subchecker . '_' . a:name) | ||||||
|         return {a:scope}:syntastic_{a:filetype}_{a:subchecker}_{a:name} |         return {a:scope}:syntastic_{a:filetype}_{a:subchecker}_{a:name} | ||||||
| @ -116,13 +127,13 @@ function! s:GetCheckerVar(scope, filetype, subchecker, name, default) | |||||||
|     else |     else | ||||||
|         return a:default |         return a:default | ||||||
|     endif |     endif | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " resolve user CFLAGS | " resolve user CFLAGS | ||||||
| function! s:GetCflags(ft, ck, opts) | function! s:getCflags(ft, ck, opts) " {{{2 | ||||||
|     " determine whether to parse header files as well |     " determine whether to parse header files as well | ||||||
|     if has_key(a:opts, 'header_names') && expand('%') =~? a:opts['header_names'] |     if has_key(a:opts, 'header_names') && expand('%') =~? a:opts['header_names'] | ||||||
|         if s:GetCheckerVar('g', a:ft, a:ck, 'check_header', 0) |         if s:getCheckerVar('g', a:ft, a:ck, 'check_header', 0) | ||||||
|             let flags = get(a:opts, 'header_flags', '') . ' -c ' . syntastic#c#NullOutput() |             let flags = get(a:opts, 'header_flags', '') . ' -c ' . syntastic#c#NullOutput() | ||||||
|         else |         else | ||||||
|             " checking headers when check_header is unset: bail out |             " checking headers when check_header is unset: bail out | ||||||
| @ -132,21 +143,21 @@ function! s:GetCflags(ft, ck, opts) | |||||||
|         let flags = get(a:opts, 'main_flags', '') |         let flags = get(a:opts, 'main_flags', '') | ||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     let flags .= ' ' . s:GetCheckerVar('g', a:ft, a:ck, 'compiler_options', '') . ' ' . s:GetIncludeDirs(a:ft) |     let flags .= ' ' . s:getCheckerVar('g', a:ft, a:ck, 'compiler_options', '') . ' ' . s:getIncludeDirs(a:ft) | ||||||
|  |  | ||||||
|     " check if the user manually set some cflags |     " check if the user manually set some cflags | ||||||
|     let b_cflags = s:GetCheckerVar('b', a:ft, a:ck, 'cflags', '') |     let b_cflags = s:getCheckerVar('b', a:ft, a:ck, 'cflags', '') | ||||||
|     if b_cflags == '' |     if b_cflags == '' | ||||||
|         " check whether to search for include files at all |         " check whether to search for include files at all | ||||||
|         if !s:GetCheckerVar('g', a:ft, a:ck, 'no_include_search', 0) |         if !s:getCheckerVar('g', a:ft, a:ck, 'no_include_search', 0) | ||||||
|             if a:ft ==# 'c' || a:ft ==# 'cpp' |             if a:ft ==# 'c' || a:ft ==# 'cpp' | ||||||
|                 " refresh the include file search if desired |                 " refresh the include file search if desired | ||||||
|                 if s:GetCheckerVar('g', a:ft, a:ck, 'auto_refresh_includes', 0) |                 if s:getCheckerVar('g', a:ft, a:ck, 'auto_refresh_includes', 0) | ||||||
|                     let flags .= ' ' . s:SearchHeaders() |                     let flags .= ' ' . s:searchHeaders() | ||||||
|                 else |                 else | ||||||
|                     " search for header includes if not cached already |                     " search for header includes if not cached already | ||||||
|                     if !exists('b:syntastic_' . a:ft . '_includes') |                     if !exists('b:syntastic_' . a:ft . '_includes') | ||||||
|                         let b:syntastic_{a:ft}_includes = s:SearchHeaders() |                         let b:syntastic_{a:ft}_includes = s:searchHeaders() | ||||||
|                     endif |                     endif | ||||||
|                     let flags .= ' ' . b:syntastic_{a:ft}_includes |                     let flags .= ' ' . b:syntastic_{a:ft}_includes | ||||||
|                 endif |                 endif | ||||||
| @ -158,15 +169,15 @@ function! s:GetCflags(ft, ck, opts) | |||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     " add optional config file parameters |     " add optional config file parameters | ||||||
|     let config_file = s:GetCheckerVar('g', a:ft, a:ck, 'config_file', '.syntastic_' . a:ft . '_config') |     let config_file = s:getCheckerVar('g', a:ft, a:ck, 'config_file', '.syntastic_' . a:ft . '_config') | ||||||
|     let flags .= ' ' . syntastic#c#ReadConfig(config_file) |     let flags .= ' ' . syntastic#c#ReadConfig(config_file) | ||||||
|  |  | ||||||
|     return flags |     return flags | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " get the gcc include directory argument depending on the default | " get the gcc include directory argument depending on the default | ||||||
| " includes and the optional user-defined 'g:syntastic_c_include_dirs' | " includes and the optional user-defined 'g:syntastic_c_include_dirs' | ||||||
| function! s:GetIncludeDirs(filetype) | function! s:getIncludeDirs(filetype) " {{{2 | ||||||
|     let include_dirs = [] |     let include_dirs = [] | ||||||
|  |  | ||||||
|     if a:filetype =~# '\v^%(c|cpp|d|objc|objcpp)$' && |     if a:filetype =~# '\v^%(c|cpp|d|objc|objcpp)$' && | ||||||
| @ -180,11 +191,11 @@ function! s:GetIncludeDirs(filetype) | |||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     return join(map(syntastic#util#unique(include_dirs), 'syntastic#util#shescape("-I" . v:val)')) |     return join(map(syntastic#util#unique(include_dirs), 'syntastic#util#shescape("-I" . v:val)')) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " search the first 100 lines for include statements that are | " search the first 100 lines for include statements that are | ||||||
| " given in the handlers dictionary | " given in the handlers dictionary | ||||||
| function! s:SearchHeaders() | function! s:searchHeaders() " {{{2 | ||||||
|     let includes = '' |     let includes = '' | ||||||
|     let files = [] |     let files = [] | ||||||
|     let found = [] |     let found = [] | ||||||
| @ -214,7 +225,7 @@ function! s:SearchHeaders() | |||||||
|  |  | ||||||
|             try |             try | ||||||
|                 let lines = readfile(filename, '', 100) |                 let lines = readfile(filename, '', 100) | ||||||
|             catch /^Vim\%((\a\+)\)\=:E484/ |             catch /\m^Vim\%((\a\+)\)\=:E484/ | ||||||
|                 continue |                 continue | ||||||
|             endtry |             endtry | ||||||
|  |  | ||||||
| @ -237,12 +248,12 @@ function! s:SearchHeaders() | |||||||
|     endfor |     endfor | ||||||
|  |  | ||||||
|     return includes |     return includes | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " try to find library with 'pkg-config' | " try to find library with 'pkg-config' | ||||||
| " search possible libraries from first to last given | " search possible libraries from first to last given | ||||||
| " argument until one is found | " argument until one is found | ||||||
| function! syntastic#c#CheckPKG(name, ...) | function! syntastic#c#checkPKG(name, ...) " {{{2 | ||||||
|     if executable('pkg-config') |     if executable('pkg-config') | ||||||
|         if !has_key(s:cflags, a:name) |         if !has_key(s:cflags, a:name) | ||||||
|             for pkg in a:000 |             for pkg in a:000 | ||||||
| @ -260,10 +271,10 @@ function! syntastic#c#CheckPKG(name, ...) | |||||||
|         endif |         endif | ||||||
|     endif |     endif | ||||||
|     return '' |     return '' | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " try to find PHP includes with 'php-config' | " try to find PHP includes with 'php-config' | ||||||
| function! syntastic#c#CheckPhp() | function! syntastic#c#checkPHP() " {{{2 | ||||||
|     if executable('php-config') |     if executable('php-config') | ||||||
|         if !has_key(s:cflags, 'php') |         if !has_key(s:cflags, 'php') | ||||||
|             let s:cflags['php'] = system('php-config --includes') |             let s:cflags['php'] = system('php-config --includes') | ||||||
| @ -272,10 +283,10 @@ function! syntastic#c#CheckPhp() | |||||||
|         return s:cflags['php'] |         return s:cflags['php'] | ||||||
|     endif |     endif | ||||||
|     return '' |     return '' | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " try to find the ruby headers with 'rbconfig' | " try to find the ruby headers with 'rbconfig' | ||||||
| function! syntastic#c#CheckRuby() | function! syntastic#c#checkRuby() " {{{2 | ||||||
|     if executable('ruby') |     if executable('ruby') | ||||||
|         if !has_key(s:cflags, 'ruby') |         if !has_key(s:cflags, 'ruby') | ||||||
|             let s:cflags['ruby'] = system('ruby -r rbconfig -e ' . |             let s:cflags['ruby'] = system('ruby -r rbconfig -e ' . | ||||||
| @ -286,10 +297,10 @@ function! syntastic#c#CheckRuby() | |||||||
|         return s:cflags['ruby'] |         return s:cflags['ruby'] | ||||||
|     endif |     endif | ||||||
|     return '' |     return '' | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " try to find the python headers with distutils | " try to find the python headers with distutils | ||||||
| function! syntastic#c#CheckPython() | function! syntastic#c#checkPython() " {{{2 | ||||||
|     if executable('python') |     if executable('python') | ||||||
|         if !has_key(s:cflags, 'python') |         if !has_key(s:cflags, 'python') | ||||||
|             let s:cflags['python'] = system('python -c ''from distutils import ' . |             let s:cflags['python'] = system('python -c ''from distutils import ' . | ||||||
| @ -300,16 +311,7 @@ function! syntastic#c#CheckPython() | |||||||
|         return s:cflags['python'] |         return s:cflags['python'] | ||||||
|     endif |     endif | ||||||
|     return '' |     return '' | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " return a handler dictionary object |  | ||||||
| function! s:RegHandler(regex, function, args) |  | ||||||
|     let handler = {} |  | ||||||
|     let handler["regex"] = a:regex |  | ||||||
|     let handler["func"] = function(a:function) |  | ||||||
|     let handler["args"] = a:args |  | ||||||
|     call add(s:handlers, handler) |  | ||||||
| endfunction |  | ||||||
|  |  | ||||||
| " }}}1 | " }}}1 | ||||||
|  |  | ||||||
| @ -322,9 +324,9 @@ let s:default_includes = [ | |||||||
|     \ '..' . syntastic#util#Slash() . 'include', |     \ '..' . syntastic#util#Slash() . 'include', | ||||||
|     \ '..' . syntastic#util#Slash() . 'includes' ] |     \ '..' . syntastic#util#Slash() . 'includes' ] | ||||||
|  |  | ||||||
| call s:Init() | call s:init() | ||||||
|  |  | ||||||
| let &cpo = s:save_cpo | let &cpo = s:save_cpo | ||||||
| unlet s:save_cpo | unlet s:save_cpo | ||||||
|  |  | ||||||
| " vim: set et sts=4 sw=4 fdm=marker: | " vim: set sw=4 sts=4 et fdm=marker: | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| if exists("g:loaded_syntastic_log_autoload") | if exists("g:loaded_syntastic_log_autoload") || !exists("g:loaded_syntastic_plugin") | ||||||
|     finish |     finish | ||||||
| endif | endif | ||||||
| let g:loaded_syntastic_log_autoload = 1 | let g:loaded_syntastic_log_autoload = 1 | ||||||
| @ -6,67 +6,37 @@ let g:loaded_syntastic_log_autoload = 1 | |||||||
| let s:save_cpo = &cpo | let s:save_cpo = &cpo | ||||||
| set cpo&vim | set cpo&vim | ||||||
|  |  | ||||||
| if !exists("g:syntastic_debug") |  | ||||||
|     let g:syntastic_debug = 0 |  | ||||||
| endif |  | ||||||
|  |  | ||||||
| let s:global_options = [ |  | ||||||
|     \ 'syntastic_aggregate_errors', |  | ||||||
|     \ 'syntastic_always_populate_loc_list', |  | ||||||
|     \ 'syntastic_auto_jump', |  | ||||||
|     \ 'syntastic_auto_loc_list', |  | ||||||
|     \ 'syntastic_check_on_open', |  | ||||||
|     \ 'syntastic_check_on_wq', |  | ||||||
|     \ 'syntastic_debug', |  | ||||||
|     \ 'syntastic_echo_current_error', |  | ||||||
|     \ 'syntastic_enable_balloons', |  | ||||||
|     \ 'syntastic_enable_highlighting', |  | ||||||
|     \ 'syntastic_enable_signs', |  | ||||||
|     \ 'syntastic_error_symbol', |  | ||||||
|     \ 'syntastic_filetype_map', |  | ||||||
|     \ 'syntastic_full_redraws', |  | ||||||
|     \ 'syntastic_id_checkers', |  | ||||||
|     \ 'syntastic_ignore_files', |  | ||||||
|     \ 'syntastic_loc_list_height', |  | ||||||
|     \ 'syntastic_mode_map', |  | ||||||
|     \ 'syntastic_quiet_messages', |  | ||||||
|     \ 'syntastic_reuse_loc_lists', |  | ||||||
|     \ 'syntastic_stl_format', |  | ||||||
|     \ 'syntastic_style_error_symbol', |  | ||||||
|     \ 'syntastic_style_warning_symbol', |  | ||||||
|     \ 'syntastic_warning_symbol' ] |  | ||||||
|  |  | ||||||
| let s:deprecation_notices_issued = [] | let s:deprecation_notices_issued = [] | ||||||
|  |  | ||||||
| " Public functions {{{1 | " Public functions {{{1 | ||||||
|  |  | ||||||
| function! syntastic#log#info(msg) | function! syntastic#log#info(msg) " {{{2 | ||||||
|     echomsg "syntastic: info: " . a:msg |     echomsg "syntastic: info: " . a:msg | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! syntastic#log#warn(msg) | function! syntastic#log#warn(msg) " {{{2 | ||||||
|     echohl WarningMsg |     echohl WarningMsg | ||||||
|     echomsg "syntastic: warning: " . a:msg |     echomsg "syntastic: warning: " . a:msg | ||||||
|     echohl None |     echohl None | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! syntastic#log#error(msg) | function! syntastic#log#error(msg) " {{{2 | ||||||
|     execute "normal \<Esc>" |     execute "normal \<Esc>" | ||||||
|     echohl ErrorMsg |     echohl ErrorMsg | ||||||
|     echomsg "syntastic: error: " . a:msg |     echomsg "syntastic: error: " . a:msg | ||||||
|     echohl None |     echohl None | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! syntastic#log#deprecationWarn(msg) | function! syntastic#log#deprecationWarn(msg) " {{{2 | ||||||
|     if index(s:deprecation_notices_issued, a:msg) >= 0 |     if index(s:deprecation_notices_issued, a:msg) >= 0 | ||||||
|         return |         return | ||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     call add(s:deprecation_notices_issued, a:msg) |     call add(s:deprecation_notices_issued, a:msg) | ||||||
|     call syntastic#log#warn(a:msg) |     call syntastic#log#warn(a:msg) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! syntastic#log#debug(level, msg, ...) | function! syntastic#log#debug(level, msg, ...) " {{{2 | ||||||
|     if !s:isDebugEnabled(a:level) |     if !s:isDebugEnabled(a:level) | ||||||
|         return |         return | ||||||
|     endif |     endif | ||||||
| @ -84,9 +54,9 @@ function! syntastic#log#debug(level, msg, ...) | |||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     call s:logRedirect(0) |     call s:logRedirect(0) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! syntastic#log#debugShowOptions(level, names) | function! syntastic#log#debugShowOptions(level, names) " {{{2 | ||||||
|     if !s:isDebugEnabled(a:level) |     if !s:isDebugEnabled(a:level) | ||||||
|         return |         return | ||||||
|     endif |     endif | ||||||
| @ -94,15 +64,15 @@ function! syntastic#log#debugShowOptions(level, names) | |||||||
|     let leader = s:logTimestamp() |     let leader = s:logTimestamp() | ||||||
|     call s:logRedirect(1) |     call s:logRedirect(1) | ||||||
|  |  | ||||||
|     let vlist = type(a:names) == type("") ? [a:names] : a:names |     let vlist = copy(type(a:names) == type("") ? [a:names] : a:names) | ||||||
|     if !empty(vlist) |     if !empty(vlist) | ||||||
|         call map(copy(vlist), "'&' . v:val . ' = ' . strtrans(string(eval('&' . v:val)))") |         call map(vlist, "'&' . v:val . ' = ' . strtrans(string(eval('&' . v:val)))") | ||||||
|         echomsg leader . join(vlist, ', ') |         echomsg leader . join(vlist, ', ') | ||||||
|     endif |     endif | ||||||
|     call s:logRedirect(0) |     call s:logRedirect(0) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! syntastic#log#debugShowVariables(level, names) | function! syntastic#log#debugShowVariables(level, names) " {{{2 | ||||||
|     if !s:isDebugEnabled(a:level) |     if !s:isDebugEnabled(a:level) | ||||||
|         return |         return | ||||||
|     endif |     endif | ||||||
| @ -112,39 +82,44 @@ function! syntastic#log#debugShowVariables(level, names) | |||||||
|  |  | ||||||
|     let vlist = type(a:names) == type("") ? [a:names] : a:names |     let vlist = type(a:names) == type("") ? [a:names] : a:names | ||||||
|     for name in vlist |     for name in vlist | ||||||
|         echomsg leader . s:formatVariable(name) |         let msg = s:formatVariable(name) | ||||||
|  |         if msg != '' | ||||||
|  |             echomsg leader . msg | ||||||
|  |         endif | ||||||
|     endfor |     endfor | ||||||
|  |  | ||||||
|     call s:logRedirect(0) |     call s:logRedirect(0) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! syntastic#log#debugDump(level) | function! syntastic#log#debugDump(level) " {{{2 | ||||||
|     if !s:isDebugEnabled(a:level) |     if !s:isDebugEnabled(a:level) | ||||||
|         return |         return | ||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     call syntastic#log#debugShowVariables(a:level, s:global_options) |     call syntastic#log#debugShowVariables( a:level, sort(keys(g:syntastic_defaults)) ) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
| " Private functions {{{1 | " Private functions {{{1 | ||||||
|  |  | ||||||
| function! s:isDebugEnabled_smart(level) | function! s:isDebugEnabled_smart(level) " {{{2 | ||||||
|     return and(g:syntastic_debug, a:level) |     return and(g:syntastic_debug, a:level) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! s:isDebugEnabled_dumb(level) | function! s:isDebugEnabled_dumb(level) " {{{2 | ||||||
|     " poor man's bit test for bit N, assuming a:level == 2**N |     " poor man's bit test for bit N, assuming a:level == 2**N | ||||||
|     return (g:syntastic_debug / a:level) % 2 |     return (g:syntastic_debug / a:level) % 2 | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| let s:isDebugEnabled = function(exists('*and') ? 's:isDebugEnabled_smart' : 's:isDebugEnabled_dumb') | let s:isDebugEnabled = function(exists('*and') ? 's:isDebugEnabled_smart' : 's:isDebugEnabled_dumb') | ||||||
|  |  | ||||||
| function! s:logRedirect(on) | function! s:logRedirect(on) " {{{2 | ||||||
|     if exists("g:syntastic_debug_file") |     if exists("g:syntastic_debug_file") | ||||||
|         if a:on |         if a:on | ||||||
|             try |             try | ||||||
|                 execute 'redir >> ' . fnameescape(expand(g:syntastic_debug_file)) |                 execute 'redir >> ' . fnameescape(expand(g:syntastic_debug_file)) | ||||||
|             catch /^Vim\%((\a\+)\)\=:/ |             catch /\m^Vim\%((\a\+)\)\=:/ | ||||||
|                 silent! redir END |                 silent! redir END | ||||||
|                 unlet g:syntastic_debug_file |                 unlet g:syntastic_debug_file | ||||||
|             endtry |             endtry | ||||||
| @ -152,30 +127,33 @@ function! s:logRedirect(on) | |||||||
|             silent! redir END |             silent! redir END | ||||||
|         endif |         endif | ||||||
|     endif |     endif | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! s:logTimestamp_smart() | function! s:logTimestamp_smart() " {{{2 | ||||||
|     return 'syntastic: ' . split(reltimestr(reltime(g:syntastic_start)))[0] . ': ' |     return 'syntastic: ' . split(reltimestr(reltime(g:syntastic_start)))[0] . ': ' | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! s:logTimestamp_dumb() | function! s:logTimestamp_dumb() " {{{2 | ||||||
|     return 'syntastic: debug: ' |     return 'syntastic: debug: ' | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| let s:logTimestamp = function(has('reltime') ? 's:logTimestamp_smart' : 's:logTimestamp_dumb') | let s:logTimestamp = function(has('reltime') ? 's:logTimestamp_smart' : 's:logTimestamp_dumb') | ||||||
|  |  | ||||||
| function! s:formatVariable(name) | function! s:formatVariable(name) " {{{2 | ||||||
|     let vals = [] |     let vals = [] | ||||||
|     if exists('g:' . a:name) |     if exists('g:syntastic_' . a:name) | ||||||
|         call add(vals, 'g:' . a:name . ' = ' . strtrans(string(g:{a:name}))) |         call add(vals, 'g:syntastic_' . a:name . ' = ' . strtrans(string(g:syntastic_{a:name}))) | ||||||
|     endif |     endif | ||||||
|     if exists('b:' . a:name) |     if exists('b:syntastic_' . a:name) | ||||||
|         call add(vals, 'b:' . a:name . ' = ' . strtrans(string(b:{a:name}))) |         call add(vals, 'b:syntastic_' . a:name . ' = ' . strtrans(string(b:syntastic_{a:name}))) | ||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     return join(vals, ', ') |     return join(vals, ', ') | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
| let &cpo = s:save_cpo | let &cpo = s:save_cpo | ||||||
| unlet s:save_cpo | unlet s:save_cpo | ||||||
| " vim: set et sts=4 sw=4 fdm=marker: |  | ||||||
|  | " vim: set sw=4 sts=4 et fdm=marker: | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| if exists("g:loaded_syntastic_postprocess_autoload") | if exists("g:loaded_syntastic_postprocess_autoload") || !exists("g:loaded_syntastic_plugin") | ||||||
|     finish |     finish | ||||||
| endif | endif | ||||||
| let g:loaded_syntastic_postprocess_autoload = 1 | let g:loaded_syntastic_postprocess_autoload = 1 | ||||||
| @ -6,7 +6,9 @@ let g:loaded_syntastic_postprocess_autoload = 1 | |||||||
| let s:save_cpo = &cpo | let s:save_cpo = &cpo | ||||||
| set cpo&vim | set cpo&vim | ||||||
|  |  | ||||||
| function! s:compareErrorItems(a, b) | " Public functions {{{1 | ||||||
|  |  | ||||||
|  | function! s:compareErrorItems(a, b) " {{{2 | ||||||
|     if a:a['bufnr'] != a:b['bufnr'] |     if a:a['bufnr'] != a:b['bufnr'] | ||||||
|         " group by files |         " group by files | ||||||
|         return a:a['bufnr'] - a:b['bufnr'] |         return a:a['bufnr'] - a:b['bufnr'] | ||||||
| @ -18,15 +20,15 @@ function! s:compareErrorItems(a, b) | |||||||
|     else |     else | ||||||
|         return get(a:a, 'col', 0) - get(a:b, 'col', 0) |         return get(a:a, 'col', 0) - get(a:b, 'col', 0) | ||||||
|     endif |     endif | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " natural sort | " natural sort | ||||||
| function! syntastic#postprocess#sort(errors) | function! syntastic#postprocess#sort(errors) " {{{2 | ||||||
|     return sort(copy(a:errors), 's:compareErrorItems') |     return sort(copy(a:errors), 's:compareErrorItems') | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " merge consecutive blanks | " merge consecutive blanks | ||||||
| function! syntastic#postprocess#compressWhitespace(errors) | function! syntastic#postprocess#compressWhitespace(errors) " {{{2 | ||||||
|     for e in a:errors |     for e in a:errors | ||||||
|         let e['text'] = substitute(e['text'], "\001", '', 'g') |         let e['text'] = substitute(e['text'], "\001", '', 'g') | ||||||
|         let e['text'] = substitute(e['text'], '\n', ' ', 'g') |         let e['text'] = substitute(e['text'], '\n', ' ', 'g') | ||||||
| @ -34,10 +36,10 @@ function! syntastic#postprocess#compressWhitespace(errors) | |||||||
|     endfor |     endfor | ||||||
|  |  | ||||||
|     return a:errors |     return a:errors | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " remove spurious CR under Cygwin | " remove spurious CR under Cygwin | ||||||
| function! syntastic#postprocess#cygwinRemoveCR(errors) | function! syntastic#postprocess#cygwinRemoveCR(errors) " {{{2 | ||||||
|     if has('win32unix') |     if has('win32unix') | ||||||
|         for e in a:errors |         for e in a:errors | ||||||
|             let e['text'] = substitute(e['text'], '\r', '', 'g') |             let e['text'] = substitute(e['text'], '\r', '', 'g') | ||||||
| @ -45,23 +47,25 @@ function! syntastic#postprocess#cygwinRemoveCR(errors) | |||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     return a:errors |     return a:errors | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " decode XML entities | " decode XML entities | ||||||
| function! syntastic#postprocess#decodeXMLEntities(errors) | function! syntastic#postprocess#decodeXMLEntities(errors) " {{{2 | ||||||
|     for e in a:errors |     for e in a:errors | ||||||
|         let e['text'] = syntastic#util#decodeXMLEntities(e['text']) |         let e['text'] = syntastic#util#decodeXMLEntities(e['text']) | ||||||
|     endfor |     endfor | ||||||
|  |  | ||||||
|     return a:errors |     return a:errors | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " filter out errors referencing other files | " filter out errors referencing other files | ||||||
| function! syntastic#postprocess#filterForeignErrors(errors) | function! syntastic#postprocess#filterForeignErrors(errors) " {{{2 | ||||||
|     return filter(copy(a:errors), 'get(v:val, "bufnr") == ' . bufnr('')) |     return filter(copy(a:errors), 'get(v:val, "bufnr") == ' . bufnr('')) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
| let &cpo = s:save_cpo | let &cpo = s:save_cpo | ||||||
| unlet s:save_cpo | unlet s:save_cpo | ||||||
|  |  | ||||||
| " vim: set et sts=4 sw=4: | " vim: set sw=4 sts=4 et fdm=marker: | ||||||
|  | |||||||
| @ -0,0 +1,79 @@ | |||||||
|  | if exists("g:loaded_syntastic_preprocess_autoload") || !exists("g:loaded_syntastic_plugin") | ||||||
|  |     finish | ||||||
|  | endif | ||||||
|  | let g:loaded_syntastic_preprocess_autoload = 1 | ||||||
|  |  | ||||||
|  | let s:save_cpo = &cpo | ||||||
|  | set cpo&vim | ||||||
|  |  | ||||||
|  | " Public functions {{{1 | ||||||
|  |  | ||||||
|  | function! syntastic#preprocess#checkstyle(errors) " {{{2 | ||||||
|  |     let out = [] | ||||||
|  |     let fname = expand('%') | ||||||
|  |     for err in a:errors | ||||||
|  |         if match(err, '\m<error\>') > -1 | ||||||
|  |             let line = str2nr(matchstr(err, '\m\<line="\zs\d\+\ze"')) | ||||||
|  |             if line == 0 | ||||||
|  |                 continue | ||||||
|  |             endif | ||||||
|  |  | ||||||
|  |             let col = str2nr(matchstr(err, '\m\<column="\zs\d\+\ze"')) | ||||||
|  |  | ||||||
|  |             let type = matchstr(err, '\m\<severity="\zs.\ze') | ||||||
|  |             if type !~? '^[EW]' | ||||||
|  |                 let type = 'E' | ||||||
|  |             endif | ||||||
|  |  | ||||||
|  |             let message = syntastic#util#decodeXMLEntities(matchstr(err, '\m\<message="\zs[^"]\+\ze"')) | ||||||
|  |  | ||||||
|  |             call add(out, join([fname, type, line, col, message], ':')) | ||||||
|  |         elseif match(err, '\m<file name="') > -1 | ||||||
|  |             let fname = syntastic#util#decodeXMLEntities(matchstr(err, '\v\<file name\="\zs[^"]+\ze"')) | ||||||
|  |         endif | ||||||
|  |     endfor | ||||||
|  |     return out | ||||||
|  | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | function! syntastic#preprocess#cppcheck(errors) " {{{2 | ||||||
|  |     return map(copy(a:errors), 'substitute(v:val, ''\v^\[[^]]+\]\zs( -\> \[[^]]+\])+\ze:'', "", "")') | ||||||
|  | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | function! syntastic#preprocess#killEmpty(errors) " {{{2 | ||||||
|  |     return filter(copy(a:errors), 'v:val != ""') | ||||||
|  | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | function! syntastic#preprocess#perl(errors) " {{{2 | ||||||
|  |     let out = [] | ||||||
|  |  | ||||||
|  |     for e in a:errors | ||||||
|  |         let parts = matchlist(e, '\v^(.*)\sat\s(.*)\sline\s(\d+)(.*)$') | ||||||
|  |         if !empty(parts) | ||||||
|  |             call add(out, parts[2] . ':' . parts[3] . ':' . parts[1] . parts[4]) | ||||||
|  |         endif | ||||||
|  |     endfor | ||||||
|  |  | ||||||
|  |     return syntastic#util#unique(out) | ||||||
|  | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | function! syntastic#preprocess#validator(errors) " {{{2 | ||||||
|  |     let out = [] | ||||||
|  |     for e in a:errors | ||||||
|  |         let parts = matchlist(e, '\v^"([^"]+)"(.+)') | ||||||
|  |         if len(parts) >= 3 | ||||||
|  |             " URL decode, except leave alone any "+" | ||||||
|  |             let parts[1] = substitute(parts[1], '\m%\(\x\x\)', '\=nr2char("0x".submatch(1))', 'g') | ||||||
|  |             let parts[1] = substitute(parts[1], '\m\\"', '"', 'g') | ||||||
|  |             let parts[1] = substitute(parts[1], '\m\\\\', '\\', 'g') | ||||||
|  |             call add(out, '"' . parts[1] . '"' . parts[2]) | ||||||
|  |         endif | ||||||
|  |     endfor | ||||||
|  |     return out | ||||||
|  | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
|  | let &cpo = s:save_cpo | ||||||
|  | unlet s:save_cpo | ||||||
|  |  | ||||||
|  | " vim: set sw=4 sts=4 et fdm=marker: | ||||||
| @ -1,4 +1,4 @@ | |||||||
| if exists('g:loaded_syntastic_util_autoload') | if exists('g:loaded_syntastic_util_autoload') || !exists("g:loaded_syntastic_plugin") | ||||||
|     finish |     finish | ||||||
| endif | endif | ||||||
| let g:loaded_syntastic_util_autoload = 1 | let g:loaded_syntastic_util_autoload = 1 | ||||||
| @ -6,27 +6,23 @@ let g:loaded_syntastic_util_autoload = 1 | |||||||
| let s:save_cpo = &cpo | let s:save_cpo = &cpo | ||||||
| set cpo&vim | set cpo&vim | ||||||
|  |  | ||||||
| " strwidth() was added in Vim 7.3; if it doesn't exist, we use strlen() |  | ||||||
| " and hope for the best :) |  | ||||||
| let s:width = function(exists('*strwidth') ? 'strwidth' : 'strlen') |  | ||||||
|  |  | ||||||
| " Public functions {{{1 | " Public functions {{{1 | ||||||
|  |  | ||||||
| function! syntastic#util#isRunningWindows() | function! syntastic#util#isRunningWindows() " {{{2 | ||||||
|     return has('win16') || has('win32') || has('win64') |     return has('win16') || has('win32') || has('win64') | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! syntastic#util#DevNull() | function! syntastic#util#DevNull() " {{{2 | ||||||
|     if syntastic#util#isRunningWindows() |     if syntastic#util#isRunningWindows() | ||||||
|         return 'NUL' |         return 'NUL' | ||||||
|     endif |     endif | ||||||
|     return '/dev/null' |     return '/dev/null' | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " Get directory separator | " Get directory separator | ||||||
| function! syntastic#util#Slash() abort | function! syntastic#util#Slash() abort " {{{2 | ||||||
|     return (!exists("+shellslash") || &shellslash) ? '/' : '\' |     return (!exists("+shellslash") || &shellslash) ? '/' : '\' | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| "search the first 5 lines of the file for a magic number and return a map | "search the first 5 lines of the file for a magic number and return a map | ||||||
| "containing the args and the executable | "containing the args and the executable | ||||||
| @ -38,7 +34,7 @@ endfunction | |||||||
| "returns | "returns | ||||||
| " | " | ||||||
| "{'exe': '/usr/bin/perl', 'args': ['-f', '-bar']} | "{'exe': '/usr/bin/perl', 'args': ['-f', '-bar']} | ||||||
| function! syntastic#util#parseShebang() | function! syntastic#util#parseShebang() " {{{2 | ||||||
|     for lnum in range(1,5) |     for lnum in range(1,5) | ||||||
|         let line = getline(lnum) |         let line = getline(lnum) | ||||||
|  |  | ||||||
| @ -50,25 +46,26 @@ function! syntastic#util#parseShebang() | |||||||
|     endfor |     endfor | ||||||
|  |  | ||||||
|     return { 'exe': '', 'args': [] } |     return { 'exe': '', 'args': [] } | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " Get the value of a variable.  Allow local variables to override global ones. | " Get the value of a variable.  Allow local variables to override global ones. | ||||||
| function! syntastic#util#var(name) | function! syntastic#util#var(name, ...) " {{{2 | ||||||
|     return |     return | ||||||
|         \ exists('b:syntastic_' . a:name) ? b:syntastic_{a:name} : |         \ exists('b:syntastic_' . a:name) ? b:syntastic_{a:name} : | ||||||
|         \ exists('g:syntastic_' . a:name) ? g:syntastic_{a:name} : '' |         \ exists('g:syntastic_' . a:name) ? g:syntastic_{a:name} : | ||||||
| endfunction |         \ a:0 > 0 ? a:1 : '' | ||||||
|  | endfunction " }}}2 | ||||||
|  |  | ||||||
| " Parse a version string.  Return an array of version components. | " Parse a version string.  Return an array of version components. | ||||||
| function! syntastic#util#parseVersion(version) | function! syntastic#util#parseVersion(version) " {{{2 | ||||||
|     return split(matchstr( a:version, '\v^\D*\zs\d+(\.\d+)+\ze' ), '\m\.') |     return split(matchstr( a:version, '\v^\D*\zs\d+(\.\d+)+\ze' ), '\m\.') | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " Run 'command' in a shell and parse output as a version string. | " Run 'command' in a shell and parse output as a version string. | ||||||
| " Returns an array of version components. | " Returns an array of version components. | ||||||
| function! syntastic#util#getVersion(command) | function! syntastic#util#getVersion(command) " {{{2 | ||||||
|     return syntastic#util#parseVersion(system(a:command)) |     return syntastic#util#parseVersion(system(a:command)) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " Verify that the 'installed' version is at least the 'required' version. | " Verify that the 'installed' version is at least the 'required' version. | ||||||
| " | " | ||||||
| @ -76,7 +73,7 @@ endfunction | |||||||
| " the "missing" elements will be assumed to be 0 for the purposes of checking. | " the "missing" elements will be assumed to be 0 for the purposes of checking. | ||||||
| " | " | ||||||
| " See http://semver.org for info about version numbers. | " See http://semver.org for info about version numbers. | ||||||
| function! syntastic#util#versionIsAtLeast(installed, required) | function! syntastic#util#versionIsAtLeast(installed, required) " {{{2 | ||||||
|     for idx in range(max([len(a:installed), len(a:required)])) |     for idx in range(max([len(a:installed), len(a:required)])) | ||||||
|         let installed_element = get(a:installed, idx, 0) |         let installed_element = get(a:installed, idx, 0) | ||||||
|         let required_element = get(a:required, idx, 0) |         let required_element = get(a:required, idx, 0) | ||||||
| @ -86,10 +83,14 @@ function! syntastic#util#versionIsAtLeast(installed, required) | |||||||
|     endfor |     endfor | ||||||
|     " Everything matched, so it is at least the required version. |     " Everything matched, so it is at least the required version. | ||||||
|     return 1 |     return 1 | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " strwidth() was added in Vim 7.3; if it doesn't exist, we use strlen() | ||||||
|  | " and hope for the best :) | ||||||
|  | let s:width = function(exists('*strwidth') ? 'strwidth' : 'strlen') | ||||||
|  |  | ||||||
| "print as much of a:msg as possible without "Press Enter" prompt appearing | "print as much of a:msg as possible without "Press Enter" prompt appearing | ||||||
| function! syntastic#util#wideMsg(msg) | function! syntastic#util#wideMsg(msg) " {{{2 | ||||||
|     let old_ruler = &ruler |     let old_ruler = &ruler | ||||||
|     let old_showcmd = &showcmd |     let old_showcmd = &showcmd | ||||||
|  |  | ||||||
| @ -101,7 +102,7 @@ function! syntastic#util#wideMsg(msg) | |||||||
|     "width as the proper amount of characters |     "width as the proper amount of characters | ||||||
|     let chunks = split(msg, "\t", 1) |     let chunks = split(msg, "\t", 1) | ||||||
|     let msg = join(map(chunks[:-2], 'v:val . repeat(" ", &ts - s:width(v:val) % &ts)'), '') . chunks[-1] |     let msg = join(map(chunks[:-2], 'v:val . repeat(" ", &ts - s:width(v:val) % &ts)'), '') . chunks[-1] | ||||||
|     let msg = strpart(msg, 0, winwidth(0) - 1) |     let msg = strpart(msg, 0, &columns - 1) | ||||||
|  |  | ||||||
|     set noruler noshowcmd |     set noruler noshowcmd | ||||||
|     call syntastic#util#redraw(0) |     call syntastic#util#redraw(0) | ||||||
| @ -110,10 +111,10 @@ function! syntastic#util#wideMsg(msg) | |||||||
|  |  | ||||||
|     let &ruler = old_ruler |     let &ruler = old_ruler | ||||||
|     let &showcmd = old_showcmd |     let &showcmd = old_showcmd | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " Check whether a buffer is loaded, listed, and not hidden | " Check whether a buffer is loaded, listed, and not hidden | ||||||
| function! syntastic#util#bufIsActive(buffer) | function! syntastic#util#bufIsActive(buffer) " {{{2 | ||||||
|     " convert to number, or hell breaks loose |     " convert to number, or hell breaks loose | ||||||
|     let buf = str2nr(a:buffer) |     let buf = str2nr(a:buffer) | ||||||
|  |  | ||||||
| @ -129,11 +130,11 @@ function! syntastic#util#bufIsActive(buffer) | |||||||
|     endfor |     endfor | ||||||
|  |  | ||||||
|     return 0 |     return 0 | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " start in directory a:where and walk up the parent folders until it | " start in directory a:where and walk up the parent folders until it | ||||||
| " finds a file matching a:what; return path to that file | " finds a file matching a:what; return path to that file | ||||||
| function! syntastic#util#findInParent(what, where) | function! syntastic#util#findInParent(what, where) " {{{2 | ||||||
|     let here = fnamemodify(a:where, ':p') |     let here = fnamemodify(a:where, ':p') | ||||||
|  |  | ||||||
|     let root = syntastic#util#Slash() |     let root = syntastic#util#Slash() | ||||||
| @ -162,10 +163,10 @@ function! syntastic#util#findInParent(what, where) | |||||||
|     endwhile |     endwhile | ||||||
|  |  | ||||||
|     return '' |     return '' | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " Returns unique elements in a list | " Returns unique elements in a list | ||||||
| function! syntastic#util#unique(list) | function! syntastic#util#unique(list) " {{{2 | ||||||
|     let seen = {} |     let seen = {} | ||||||
|     let uniques = [] |     let uniques = [] | ||||||
|     for e in a:list |     for e in a:list | ||||||
| @ -175,20 +176,20 @@ function! syntastic#util#unique(list) | |||||||
|         endif |         endif | ||||||
|     endfor |     endfor | ||||||
|     return uniques |     return uniques | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " A less noisy shellescape() | " A less noisy shellescape() | ||||||
| function! syntastic#util#shescape(string) | function! syntastic#util#shescape(string) " {{{2 | ||||||
|     return a:string =~ '\m^[A-Za-z0-9_/.-]\+$' ? a:string : shellescape(a:string) |     return a:string =~ '\m^[A-Za-z0-9_/.-]\+$' ? a:string : shellescape(a:string) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " A less noisy shellescape(expand()) | " A less noisy shellescape(expand()) | ||||||
| function! syntastic#util#shexpand(string) | function! syntastic#util#shexpand(string) " {{{2 | ||||||
|     return syntastic#util#shescape(expand(a:string)) |     return syntastic#util#shescape(expand(a:string)) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " decode XML entities | " decode XML entities | ||||||
| function! syntastic#util#decodeXMLEntities(string) | function! syntastic#util#decodeXMLEntities(string) " {{{2 | ||||||
|     let str = a:string |     let str = a:string | ||||||
|     let str = substitute(str, '\m<', '<', 'g') |     let str = substitute(str, '\m<', '<', 'g') | ||||||
|     let str = substitute(str, '\m>', '>', 'g') |     let str = substitute(str, '\m>', '>', 'g') | ||||||
| @ -196,17 +197,17 @@ function! syntastic#util#decodeXMLEntities(string) | |||||||
|     let str = substitute(str, '\m'', "'", 'g') |     let str = substitute(str, '\m'', "'", 'g') | ||||||
|     let str = substitute(str, '\m&', '\&', 'g') |     let str = substitute(str, '\m&', '\&', 'g') | ||||||
|     return str |     return str | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! syntastic#util#redraw(full) | function! syntastic#util#redraw(full) " {{{2 | ||||||
|     if a:full |     if a:full | ||||||
|         redraw! |         redraw! | ||||||
|     else |     else | ||||||
|         redraw |         redraw | ||||||
|     endif |     endif | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! syntastic#util#dictFilter(errors, filter) | function! syntastic#util#dictFilter(errors, filter) " {{{2 | ||||||
|     let rules = s:translateFilter(a:filter) |     let rules = s:translateFilter(a:filter) | ||||||
|     " call syntastic#log#debug(g:SyntasticDebugFilters, "applying filter:", rules) |     " call syntastic#log#debug(g:SyntasticDebugFilters, "applying filter:", rules) | ||||||
|     try |     try | ||||||
| @ -215,11 +216,13 @@ function! syntastic#util#dictFilter(errors, filter) | |||||||
|         let msg = matchstr(v:exception, '\m^Vim\%((\a\+)\)\=:\zs.*') |         let msg = matchstr(v:exception, '\m^Vim\%((\a\+)\)\=:\zs.*') | ||||||
|         call syntastic#log#error('quiet_messages: ' . msg) |         call syntastic#log#error('quiet_messages: ' . msg) | ||||||
|     endtry |     endtry | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
| " Private functions {{{1 | " Private functions {{{1 | ||||||
|  |  | ||||||
| function! s:translateFilter(filters) | function! s:translateFilter(filters) " {{{2 | ||||||
|     let conditions = [] |     let conditions = [] | ||||||
|     for k in keys(a:filters) |     for k in keys(a:filters) | ||||||
|         if type(a:filters[k]) == type([]) |         if type(a:filters[k]) == type([]) | ||||||
| @ -228,10 +231,14 @@ function! s:translateFilter(filters) | |||||||
|             call add(conditions, s:translateElement(k, a:filters[k])) |             call add(conditions, s:translateElement(k, a:filters[k])) | ||||||
|         endif |         endif | ||||||
|     endfor |     endfor | ||||||
|     return len(conditions) == 1 ? conditions[0] : join(map(conditions, '"(" . v:val . ")"'), ' && ') |  | ||||||
| endfunction |  | ||||||
|  |  | ||||||
| function! s:translateElement(key, term) |     if conditions == [] | ||||||
|  |         let conditions = ["1"] | ||||||
|  |     endif | ||||||
|  |     return len(conditions) == 1 ? conditions[0] : join(map(conditions, '"(" . v:val . ")"'), ' && ') | ||||||
|  | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | function! s:translateElement(key, term) " {{{2 | ||||||
|     if a:key ==? 'level' |     if a:key ==? 'level' | ||||||
|         let ret = 'v:val["type"] !=? ' . string(a:term[0]) |         let ret = 'v:val["type"] !=? ' . string(a:term[0]) | ||||||
|     elseif a:key ==? 'type' |     elseif a:key ==? 'type' | ||||||
| @ -241,11 +248,15 @@ function! s:translateElement(key, term) | |||||||
|     elseif a:key ==? 'file' |     elseif a:key ==? 'file' | ||||||
|         let ret = 'bufname(str2nr(v:val["bufnr"])) !~# ' . string(a:term) |         let ret = 'bufname(str2nr(v:val["bufnr"])) !~# ' . string(a:term) | ||||||
|     else |     else | ||||||
|  |         call syntastic#log#warn('quiet_messages: ignoring invalid key ' . strtrans(string(a:key))) | ||||||
|         let ret = "1" |         let ret = "1" | ||||||
|     endif |     endif | ||||||
|     return ret |     return ret | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
| let &cpo = s:save_cpo | let &cpo = s:save_cpo | ||||||
| unlet s:save_cpo | unlet s:save_cpo | ||||||
| " vim: set et sts=4 sw=4 fdm=marker: |  | ||||||
|  | " vim: set sw=4 sts=4 et fdm=marker: | ||||||
|  | |||||||
| @ -417,17 +417,16 @@ Default: {} | |||||||
|  |  | ||||||
| Use this option to filter out some of the messages produced by checkers.  The | Use this option to filter out some of the messages produced by checkers.  The | ||||||
| option should be set to something like: > | option should be set to something like: > | ||||||
|  |  | ||||||
|     let g:syntastic_quiet_messages = { "level": "warnings", |     let g:syntastic_quiet_messages = { "level": "warnings", | ||||||
|                                      \ "type":  "style", |                                      \ "type":  "style", | ||||||
|                                      \ "regex": '\m\[C03\d\d\]', |                                      \ "regex": '\m\[C03\d\d\]', | ||||||
|                                      \ "file":  ['\m^/usr/include/', '\m\c\.h$'] } |                                      \ "file":  ['\m^/usr/include/', '\m\c\.h$'] } | ||||||
| < | < | ||||||
|  |  | ||||||
| Each element turns off messages matching the patterns specified by the | Each element turns off messages matching the patterns specified by the | ||||||
| corresponding value. Values are lists, but if a list consist of a single | corresponding value. Values are lists, but if a list consist of a single | ||||||
| element you can omit adding the brackets (e.g. you can write "style" instead of | element you can omit adding the brackets (e.g. you can write "style" instead | ||||||
| ["style"]). | of ["style"]). Elements with values [] or '' are ignored (this is useful for | ||||||
|  | overriding filters, cf. |filter-overrides|). | ||||||
|  |  | ||||||
|     "level" - takes one of two values, "warnings" or "errors" |     "level" - takes one of two values, "warnings" or "errors" | ||||||
|     "type"  - can be either "syntax" or "style" |     "type"  - can be either "syntax" or "style" | ||||||
| @ -436,9 +435,26 @@ element you can omit adding the brackets (e.g. you can write "style" instead of | |||||||
|     "file"  - is matched against the filename the error refers to, as a case |     "file"  - is matched against the filename the error refers to, as a case | ||||||
|               sensitive |regular-expression|. |               sensitive |regular-expression|. | ||||||
|  |  | ||||||
|  | If |'syntastic_id_checkers'| is set, filters are applied before error messages | ||||||
|  | are labeled with the names of the checkers that created them. | ||||||
|  |  | ||||||
| There are also checker-specific variants of this option, providing finer | There are also checker-specific variants of this option, providing finer | ||||||
| control. They are named |'syntastic_<filetype>_<checker>_quiet_messages'|. | control. They are named |'syntastic_<filetype>_<checker>_quiet_messages'|. | ||||||
|  |  | ||||||
|  | For a particular checker, if both a |'syntastic_quiet_messages'| filter and | ||||||
|  | a checker-specific filter are present, they are both applied (to the list of | ||||||
|  | errors produced by the said checker). In case of conflicting values for the | ||||||
|  | same keys, the values of the checker-specific filters take precedence. | ||||||
|  |  | ||||||
|  |                                                             *filter-overrides* | ||||||
|  | Since filter elements with values [] or '' are ignored, you can disable global | ||||||
|  | filters for particular checkers, by setting the values of the corresponding | ||||||
|  | elements in |'syntastic_<filetype>_<checker>_quiet_messages'| to [] or ''. For | ||||||
|  | example, the following setting will silence all warnings, except for the | ||||||
|  | ones produced by 'pylint': > | ||||||
|  |     let g:syntastic_quiet_messages = { "level": "warnings" } | ||||||
|  |     let g:syntastic_python_pylint_quiet_messages = { "level" : [] } | ||||||
|  | < | ||||||
|                                                       *'syntastic_stl_format'* |                                                       *'syntastic_stl_format'* | ||||||
| Default: [Syntax: line:%F (%t)] | Default: [Syntax: line:%F (%t)] | ||||||
| Use this option to control what the syntastic statusline text contains. Several | Use this option to control what the syntastic statusline text contains. Several | ||||||
|  | |||||||
| @ -19,9 +19,7 @@ if has('reltime') | |||||||
|     let g:syntastic_start = reltime() |     let g:syntastic_start = reltime() | ||||||
| endif | endif | ||||||
|  |  | ||||||
| runtime! plugin/syntastic/*.vim | " Sanity checks {{{1 | ||||||
|  |  | ||||||
| let s:running_windows = syntastic#util#isRunningWindows() |  | ||||||
|  |  | ||||||
| for s:feature in ['autocmd', 'eval', 'modify_fname', 'quickfix', 'user_commands'] | for s:feature in ['autocmd', 'eval', 'modify_fname', 'quickfix', 'user_commands'] | ||||||
|     if !has(s:feature) |     if !has(s:feature) | ||||||
| @ -30,68 +28,52 @@ for s:feature in ['autocmd', 'eval', 'modify_fname', 'quickfix', 'user_commands' | |||||||
|     endif |     endif | ||||||
| endfor | endfor | ||||||
|  |  | ||||||
|  | let s:running_windows = syntastic#util#isRunningWindows() | ||||||
| if !s:running_windows && executable('uname') | if !s:running_windows && executable('uname') | ||||||
|     try |     try | ||||||
|         let s:uname = system('uname') |         let s:uname = system('uname') | ||||||
|     catch /^Vim\%((\a\+)\)\=:E484/ |     catch /\m^Vim\%((\a\+)\)\=:E484/ | ||||||
|         call syntastic#log#error("your shell " . &shell . " doesn't use traditional UNIX syntax for redirections") |         call syntastic#log#error("your shell " . &shell . " doesn't use traditional UNIX syntax for redirections") | ||||||
|         finish |         finish | ||||||
|     endtry |     endtry | ||||||
| endif | endif | ||||||
|  |  | ||||||
| if !exists("g:syntastic_always_populate_loc_list") | " }}}1 | ||||||
|     let g:syntastic_always_populate_loc_list = 0 |  | ||||||
| endif |  | ||||||
|  |  | ||||||
| if !exists("g:syntastic_auto_jump") | " Defaults {{{1 | ||||||
|     let g:syntastic_auto_jump = 0 |  | ||||||
| endif |  | ||||||
|  |  | ||||||
| if !exists("g:syntastic_quiet_messages") | let g:syntastic_defaults = { | ||||||
|     let g:syntastic_quiet_messages = {} |         \ 'aggregate_errors':         0, | ||||||
| endif |         \ 'always_populate_loc_list': 0, | ||||||
|  |         \ 'auto_jump':                0, | ||||||
|  |         \ 'auto_loc_list':            2, | ||||||
|  |         \ 'bash_hack':                1, | ||||||
|  |         \ 'check_on_open':            0, | ||||||
|  |         \ 'check_on_wq':              1, | ||||||
|  |         \ 'debug':                    0, | ||||||
|  |         \ 'echo_current_error':       1, | ||||||
|  |         \ 'enable_balloons':          1, | ||||||
|  |         \ 'enable_highlighting':      1, | ||||||
|  |         \ 'enable_signs':             1, | ||||||
|  |         \ 'error_symbol':             '>>', | ||||||
|  |         \ 'filetype_map':             {}, | ||||||
|  |         \ 'full_redraws':             !(has('gui_running') || has('gui_macvim')), | ||||||
|  |         \ 'id_checkers':              1, | ||||||
|  |         \ 'ignore_files':             [], | ||||||
|  |         \ 'loc_list_height':          10, | ||||||
|  |         \ 'quiet_messages':           {}, | ||||||
|  |         \ 'reuse_loc_lists':          (v:version >= 704), | ||||||
|  |         \ 'stl_format':               '[Syntax: line:%F (%t)]', | ||||||
|  |         \ 'style_error_symbol':       'S>', | ||||||
|  |         \ 'style_warning_symbol':     'S>', | ||||||
|  |         \ 'warning_symbol':           '>>' | ||||||
|  |     \ } | ||||||
|  |  | ||||||
| if !exists("g:syntastic_stl_format") | for s:key in keys(g:syntastic_defaults) | ||||||
|     let g:syntastic_stl_format = '[Syntax: line:%F (%t)]' |     if !exists('g:syntastic_' . s:key) | ||||||
| endif |         let g:syntastic_{s:key} = g:syntastic_defaults[s:key] | ||||||
|  |  | ||||||
| if !exists("g:syntastic_check_on_open") |  | ||||||
|     let g:syntastic_check_on_open = 0 |  | ||||||
| endif |  | ||||||
|  |  | ||||||
| if !exists("g:syntastic_check_on_wq") |  | ||||||
|     let g:syntastic_check_on_wq = 1 |  | ||||||
| endif |  | ||||||
|  |  | ||||||
| if !exists("g:syntastic_aggregate_errors") |  | ||||||
|     let g:syntastic_aggregate_errors = 0 |  | ||||||
| endif |  | ||||||
|  |  | ||||||
| if !exists("g:syntastic_id_checkers") |  | ||||||
|     let g:syntastic_id_checkers = 1 |  | ||||||
| endif |  | ||||||
|  |  | ||||||
| if !exists("g:syntastic_loc_list_height") |  | ||||||
|     let g:syntastic_loc_list_height = 10 |  | ||||||
| endif |  | ||||||
|  |  | ||||||
| if !exists("g:syntastic_ignore_files") |  | ||||||
|     let g:syntastic_ignore_files = [] |  | ||||||
| endif |  | ||||||
|  |  | ||||||
| if !exists("g:syntastic_filetype_map") |  | ||||||
|     let g:syntastic_filetype_map = {} |  | ||||||
| endif |  | ||||||
|  |  | ||||||
| if !exists("g:syntastic_full_redraws") |  | ||||||
|     let g:syntastic_full_redraws = !(has('gui_running') || has('gui_macvim')) |  | ||||||
| endif |  | ||||||
|  |  | ||||||
| " TODO: not documented |  | ||||||
| if !exists("g:syntastic_reuse_loc_lists") |  | ||||||
|     " a relevant bug has been fixed in one of the pre-releases of Vim 7.4 |  | ||||||
|     let g:syntastic_reuse_loc_lists = (v:version >= 704) |  | ||||||
|     endif |     endif | ||||||
|  | endfor | ||||||
|  |  | ||||||
| if exists("g:syntastic_quiet_warnings") | if exists("g:syntastic_quiet_warnings") | ||||||
|     call syntastic#log#deprecationWarn("variable g:syntastic_quiet_warnings is deprecated, please use let g:syntastic_quiet_messages = {'level': 'warnings'} instead") |     call syntastic#log#deprecationWarn("variable g:syntastic_quiet_warnings is deprecated, please use let g:syntastic_quiet_messages = {'level': 'warnings'} instead") | ||||||
| @ -105,6 +87,10 @@ if exists("g:syntastic_quiet_warnings") | |||||||
|     endif |     endif | ||||||
| endif | endif | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
|  | " Debug {{{1 | ||||||
|  |  | ||||||
| let s:debug_dump_options = [ | let s:debug_dump_options = [ | ||||||
|         \ 'shell', |         \ 'shell', | ||||||
|         \ 'shellcmdflag', |         \ 'shellcmdflag', | ||||||
| @ -119,7 +105,6 @@ if v:version > 703 || (v:version == 703 && has('patch446')) | |||||||
|     call add(s:debug_dump_options, 'shellxescape') |     call add(s:debug_dump_options, 'shellxescape') | ||||||
| endif | endif | ||||||
|  |  | ||||||
|  |  | ||||||
| " debug constants | " debug constants | ||||||
| let g:SyntasticDebugTrace         = 1 | let g:SyntasticDebugTrace         = 1 | ||||||
| let g:SyntasticDebugLoclist       = 2 | let g:SyntasticDebugLoclist       = 2 | ||||||
| @ -127,23 +112,26 @@ let g:SyntasticDebugNotifications = 4 | |||||||
| let g:SyntasticDebugAutocommands  = 8 | let g:SyntasticDebugAutocommands  = 8 | ||||||
| let g:SyntasticDebugVariables     = 16 | let g:SyntasticDebugVariables     = 16 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
|  | runtime! plugin/syntastic/*.vim | ||||||
|  |  | ||||||
| let s:registry = g:SyntasticRegistry.Instance() | let s:registry = g:SyntasticRegistry.Instance() | ||||||
| let s:notifiers = g:SyntasticNotifiers.Instance() | let s:notifiers = g:SyntasticNotifiers.Instance() | ||||||
| let s:modemap = g:SyntasticModeMap.Instance() | let s:modemap = g:SyntasticModeMap.Instance() | ||||||
|  |  | ||||||
|  | " Commands {{{1 | ||||||
|  |  | ||||||
| " @vimlint(EVL103, 1, a:cursorPos) | " @vimlint(EVL103, 1, a:cursorPos) | ||||||
| " @vimlint(EVL103, 1, a:cmdLine) | " @vimlint(EVL103, 1, a:cmdLine) | ||||||
| " @vimlint(EVL103, 1, a:argLead) | " @vimlint(EVL103, 1, a:argLead) | ||||||
| function! s:CompleteCheckerName(argLead, cmdLine, cursorPos) | function! s:CompleteCheckerName(argLead, cmdLine, cursorPos) " {{{2 | ||||||
|     let checker_names = [] |     let checker_names = [] | ||||||
|     for ft in s:ResolveFiletypes() |     for ft in s:resolveFiletypes() | ||||||
|         for checker in s:registry.availableCheckersFor(ft) |         call extend(checker_names, keys(s:registry.getCheckersMap(ft))) | ||||||
|             call add(checker_names, checker.getName()) |  | ||||||
|         endfor |  | ||||||
|     endfor |     endfor | ||||||
|     return join(checker_names, "\n") |     return join(checker_names, "\n") | ||||||
| endfunction | endfunction " }}}2 | ||||||
| " @vimlint(EVL103, 0, a:cursorPos) | " @vimlint(EVL103, 0, a:cursorPos) | ||||||
| " @vimlint(EVL103, 0, a:cmdLine) | " @vimlint(EVL103, 0, a:cmdLine) | ||||||
| " @vimlint(EVL103, 0, a:argLead) | " @vimlint(EVL103, 0, a:argLead) | ||||||
| @ -152,14 +140,13 @@ endfunction | |||||||
| " @vimlint(EVL103, 1, a:cursorPos) | " @vimlint(EVL103, 1, a:cursorPos) | ||||||
| " @vimlint(EVL103, 1, a:cmdLine) | " @vimlint(EVL103, 1, a:cmdLine) | ||||||
| " @vimlint(EVL103, 1, a:argLead) | " @vimlint(EVL103, 1, a:argLead) | ||||||
| function! s:CompleteFiletypes(argLead, cmdLine, cursorPos) | function! s:CompleteFiletypes(argLead, cmdLine, cursorPos) " {{{2 | ||||||
|     return join(s:registry.knownFiletypes(), "\n") |     return join(s:registry.getKnownFiletypes(), "\n") | ||||||
| endfunction | endfunction " }}}2 | ||||||
| " @vimlint(EVL103, 0, a:cursorPos) | " @vimlint(EVL103, 0, a:cursorPos) | ||||||
| " @vimlint(EVL103, 0, a:cmdLine) | " @vimlint(EVL103, 0, a:cmdLine) | ||||||
| " @vimlint(EVL103, 0, a:argLead) | " @vimlint(EVL103, 0, a:argLead) | ||||||
|  |  | ||||||
|  |  | ||||||
| command! SyntasticToggleMode call s:ToggleMode() | command! SyntasticToggleMode call s:ToggleMode() | ||||||
| command! -nargs=* -complete=custom,s:CompleteCheckerName SyntasticCheck | command! -nargs=* -complete=custom,s:CompleteCheckerName SyntasticCheck | ||||||
|             \ call s:UpdateErrors(0, <f-args>) <bar> |             \ call s:UpdateErrors(0, <f-args>) <bar> | ||||||
| @ -167,12 +154,16 @@ command! -nargs=* -complete=custom,s:CompleteCheckerName SyntasticCheck | |||||||
| command! Errors call s:ShowLocList() | command! Errors call s:ShowLocList() | ||||||
| command! -nargs=? -complete=custom,s:CompleteFiletypes SyntasticInfo | command! -nargs=? -complete=custom,s:CompleteFiletypes SyntasticInfo | ||||||
|             \ call s:modemap.echoMode() | |             \ call s:modemap.echoMode() | | ||||||
|             \ call s:registry.echoInfoFor(s:ResolveFiletypes(<f-args>)) |             \ call s:registry.echoInfoFor(s:resolveFiletypes(<f-args>)) | ||||||
| command! SyntasticReset | command! SyntasticReset | ||||||
|             \ call s:ClearCache() | |             \ call s:ClearCache() | | ||||||
|             \ call s:notifiers.refresh(g:SyntasticLoclist.New([])) |             \ call s:notifiers.refresh(g:SyntasticLoclist.New([])) | ||||||
| command! SyntasticSetLoclist call g:SyntasticLoclist.current().setloclist() | command! SyntasticSetLoclist call g:SyntasticLoclist.current().setloclist() | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
|  | " Autocommands and hooks {{{1 | ||||||
|  |  | ||||||
| augroup syntastic | augroup syntastic | ||||||
|     autocmd BufReadPost * call s:BufReadPostHook() |     autocmd BufReadPost * call s:BufReadPostHook() | ||||||
|     autocmd BufWritePost * call s:BufWritePostHook() |     autocmd BufWritePost * call s:BufWritePostHook() | ||||||
| @ -191,31 +182,30 @@ if v:version > 703 || (v:version == 703 && has('patch544')) | |||||||
|     augroup END |     augroup END | ||||||
| endif | endif | ||||||
|  |  | ||||||
|  | function! s:BufReadPostHook() " {{{2 | ||||||
| function! s:BufReadPostHook() |  | ||||||
|     if g:syntastic_check_on_open |     if g:syntastic_check_on_open | ||||||
|         call syntastic#log#debug(g:SyntasticDebugAutocommands, |         call syntastic#log#debug(g:SyntasticDebugAutocommands, | ||||||
|             \ 'autocmd: BufReadPost, buffer ' . bufnr("") . ' = ' . string(bufname(str2nr(bufnr(""))))) |             \ 'autocmd: BufReadPost, buffer ' . bufnr("") . ' = ' . string(bufname(str2nr(bufnr(""))))) | ||||||
|         call s:UpdateErrors(1) |         call s:UpdateErrors(1) | ||||||
|     endif |     endif | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! s:BufWritePostHook() | function! s:BufWritePostHook() " {{{2 | ||||||
|     call syntastic#log#debug(g:SyntasticDebugAutocommands, |     call syntastic#log#debug(g:SyntasticDebugAutocommands, | ||||||
|         \ 'autocmd: BufWritePost, buffer ' . bufnr("") . ' = ' . string(bufname(str2nr(bufnr(""))))) |         \ 'autocmd: BufWritePost, buffer ' . bufnr("") . ' = ' . string(bufname(str2nr(bufnr(""))))) | ||||||
|     call s:UpdateErrors(1) |     call s:UpdateErrors(1) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! s:BufWinEnterHook() | function! s:BufWinEnterHook() " {{{2 | ||||||
|     call syntastic#log#debug(g:SyntasticDebugAutocommands, |     call syntastic#log#debug(g:SyntasticDebugAutocommands, | ||||||
|         \ 'autocmd: BufWinEnter, buffer ' . bufnr("") . ' = ' . string(bufname(str2nr(bufnr("")))) . |         \ 'autocmd: BufWinEnter, buffer ' . bufnr("") . ' = ' . string(bufname(str2nr(bufnr("")))) . | ||||||
|         \ ', &buftype = ' . string(&buftype)) |         \ ', &buftype = ' . string(&buftype)) | ||||||
|     if &buftype == '' |     if &buftype == '' | ||||||
|         call s:notifiers.refresh(g:SyntasticLoclist.current()) |         call s:notifiers.refresh(g:SyntasticLoclist.current()) | ||||||
|     endif |     endif | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! s:BufEnterHook() | function! s:BufEnterHook() " {{{2 | ||||||
|     call syntastic#log#debug(g:SyntasticDebugAutocommands, |     call syntastic#log#debug(g:SyntasticDebugAutocommands, | ||||||
|         \ 'autocmd: BufEnter, buffer ' . bufnr("") . ' = ' . string(bufname(str2nr(bufnr("")))) . |         \ 'autocmd: BufEnter, buffer ' . bufnr("") . ' = ' . string(bufname(str2nr(bufnr("")))) . | ||||||
|         \ ', &buftype = ' . string(&buftype)) |         \ ', &buftype = ' . string(&buftype)) | ||||||
| @ -225,18 +215,22 @@ function! s:BufEnterHook() | |||||||
|     if &buftype == 'quickfix' && !empty(loclist) && empty(filter( buffers, 'syntastic#util#bufIsActive(v:val)' )) |     if &buftype == 'quickfix' && !empty(loclist) && empty(filter( buffers, 'syntastic#util#bufIsActive(v:val)' )) | ||||||
|         call g:SyntasticLoclistHide() |         call g:SyntasticLoclistHide() | ||||||
|     endif |     endif | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! s:QuitPreHook() | function! s:QuitPreHook() " {{{2 | ||||||
|     call syntastic#log#debug(g:SyntasticDebugAutocommands, |     call syntastic#log#debug(g:SyntasticDebugAutocommands, | ||||||
|         \ 'autocmd: QuitPre, buffer ' . bufnr("") . ' = ' . string(bufname(str2nr(bufnr(""))))) |         \ 'autocmd: QuitPre, buffer ' . bufnr("") . ' = ' . string(bufname(str2nr(bufnr(""))))) | ||||||
|     let b:syntastic_skip_checks = !g:syntastic_check_on_wq |     let b:syntastic_skip_checks = !g:syntastic_check_on_wq | ||||||
|     call g:SyntasticLoclistHide() |     call g:SyntasticLoclistHide() | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
|  | " Main {{{1 | ||||||
|  |  | ||||||
| "refresh and redraw all the error info for this buf when saving or reading | "refresh and redraw all the error info for this buf when saving or reading | ||||||
| function! s:UpdateErrors(auto_invoked, ...) | function! s:UpdateErrors(auto_invoked, ...) " {{{2 | ||||||
|     if s:SkipFile() |     if s:skipFile() | ||||||
|         return |         return | ||||||
|     endif |     endif | ||||||
|  |  | ||||||
| @ -248,15 +242,16 @@ function! s:UpdateErrors(auto_invoked, ...) | |||||||
|  |  | ||||||
|     let loclist = g:SyntasticLoclist.current() |     let loclist = g:SyntasticLoclist.current() | ||||||
|  |  | ||||||
|     let w:syntastic_loclist_set = 0 |     " populate loclist and jump {{{3 | ||||||
|     let do_jump = g:syntastic_auto_jump |     let do_jump = syntastic#util#var('auto_jump') | ||||||
|     if g:syntastic_auto_jump == 2 |     if do_jump == 2 | ||||||
|         let first = loclist.getFirstIssue() |         let first = loclist.getFirstIssue() | ||||||
|         let type = get(first, 'type', '') |         let type = get(first, 'type', '') | ||||||
|         let do_jump = type ==? 'E' |         let do_jump = type ==? 'E' | ||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     if g:syntastic_always_populate_loc_list || do_jump |     let w:syntastic_loclist_set = 0 | ||||||
|  |     if syntastic#util#var('always_populate_loc_list') || do_jump | ||||||
|         call syntastic#log#debug(g:SyntasticDebugNotifications, 'loclist: setloclist (new)') |         call syntastic#log#debug(g:SyntasticDebugNotifications, 'loclist: setloclist (new)') | ||||||
|         call setloclist(0, loclist.getRaw()) |         call setloclist(0, loclist.getRaw()) | ||||||
|         let w:syntastic_loclist_set = 1 |         let w:syntastic_loclist_set = 1 | ||||||
| @ -273,53 +268,52 @@ function! s:UpdateErrors(auto_invoked, ...) | |||||||
|             endif |             endif | ||||||
|         endif |         endif | ||||||
|     endif |     endif | ||||||
|  |     " }}}3 | ||||||
|  |  | ||||||
|     call s:notifiers.refresh(loclist) |     call s:notifiers.refresh(loclist) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| "clear the loc list for the buffer | "clear the loc list for the buffer | ||||||
| function! s:ClearCache() | function! s:ClearCache() " {{{2 | ||||||
|     call s:notifiers.reset(g:SyntasticLoclist.current()) |     call s:notifiers.reset(g:SyntasticLoclist.current()) | ||||||
|     unlet! b:syntastic_loclist |     unlet! b:syntastic_loclist | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! s:ResolveFiletypes(...) |  | ||||||
|     let type = a:0 ? a:1 : &filetype |  | ||||||
|     return split( get(g:syntastic_filetype_map, type, type), '\m\.' ) |  | ||||||
| endfunction |  | ||||||
|  |  | ||||||
| "detect and cache all syntax errors in this buffer | "detect and cache all syntax errors in this buffer | ||||||
| function! s:CacheErrors(checkers) | function! s:CacheErrors(checker_names) " {{{2 | ||||||
|     call s:ClearCache() |     call s:ClearCache() | ||||||
|     let newLoclist = g:SyntasticLoclist.New([]) |     let newLoclist = g:SyntasticLoclist.New([]) | ||||||
|  |  | ||||||
|     if !s:SkipFile() |     if !s:skipFile() | ||||||
|         let active_checkers = 0 |         " debug logging {{{3 | ||||||
|         let names = [] |  | ||||||
|  |  | ||||||
|         call syntastic#log#debugShowOptions(g:SyntasticDebugTrace, s:debug_dump_options) |         call syntastic#log#debugShowOptions(g:SyntasticDebugTrace, s:debug_dump_options) | ||||||
|         call syntastic#log#debugDump(g:SyntasticDebugVariables) |         call syntastic#log#debugDump(g:SyntasticDebugVariables) | ||||||
|         call syntastic#log#debugShowVariables(g:SyntasticDebugTrace, 'syntastic_aggregate_errors') |         call syntastic#log#debugShowVariables(g:SyntasticDebugTrace, 'aggregate_errors') | ||||||
|         call syntastic#log#debug(g:SyntasticDebugTrace, 'getcwd() = ' . getcwd()) |         call syntastic#log#debug(g:SyntasticDebugTrace, 'getcwd() = ' . getcwd()) | ||||||
|  |         " }}}3 | ||||||
|  |  | ||||||
|         let filetypes = s:ResolveFiletypes() |         let filetypes = s:resolveFiletypes() | ||||||
|         let aggregate_errors = syntastic#util#var('aggregate_errors') |         let aggregate_errors = syntastic#util#var('aggregate_errors') | ||||||
|         let decorate_errors = (aggregate_errors || len(filetypes) > 1) && syntastic#util#var('id_checkers') |         let decorate_errors = (aggregate_errors || len(filetypes) > 1) && syntastic#util#var('id_checkers') | ||||||
|  |  | ||||||
|         for ft in filetypes |         let clist = [] | ||||||
|             let clist = empty(a:checkers) ? s:registry.getActiveCheckers(ft) : s:registry.getCheckers(ft, a:checkers) |         for type in filetypes | ||||||
|  |             call extend(clist, s:registry.getCheckers(type, a:checker_names)) | ||||||
|  |         endfor | ||||||
|  |  | ||||||
|  |         let names = [] | ||||||
|         for checker in clist |         for checker in clist | ||||||
|                 let active_checkers += 1 |             let type = checker.getFiletype() | ||||||
|                 call syntastic#log#debug(g:SyntasticDebugTrace, 'CacheErrors: Invoking checker: ' . checker.getName()) |             let name = checker.getName() | ||||||
|  |             call syntastic#log#debug(g:SyntasticDebugTrace, 'CacheErrors: Invoking checker: ' . type . '/' . name) | ||||||
|  |  | ||||||
|             let loclist = checker.getLocList() |             let loclist = checker.getLocList() | ||||||
|  |  | ||||||
|             if !loclist.isEmpty() |             if !loclist.isEmpty() | ||||||
|                 if decorate_errors |                 if decorate_errors | ||||||
|                         call loclist.decorate(checker.getName(), checker.getFiletype()) |                     call loclist.decorate(type, name) | ||||||
|                 endif |                 endif | ||||||
|                     call add(names, [checker.getName(), checker.getFiletype()]) |                 call add(names, [type, name]) | ||||||
|  |  | ||||||
|                 let newLoclist = newLoclist.extend(loclist) |                 let newLoclist = newLoclist.extend(loclist) | ||||||
|  |  | ||||||
| @ -328,95 +322,51 @@ function! s:CacheErrors(checkers) | |||||||
|                 endif |                 endif | ||||||
|             endif |             endif | ||||||
|         endfor |         endfor | ||||||
|         endfor |  | ||||||
|  |  | ||||||
|  |         " set names {{{3 | ||||||
|         if !empty(names) |         if !empty(names) | ||||||
|             if len(syntastic#util#unique(map(copy(names), 'v:val[1]'))) == 1 |             if len(syntastic#util#unique(map( copy(names), 'v:val[0]' ))) == 1 | ||||||
|                 let type = names[0][1] |                 let type = names[0][0] | ||||||
|                 let name = join(map(names, 'v:val[0]'), ', ') |                 let name = join(map(names, 'v:val[1]'), ', ') | ||||||
|                 call newLoclist.setName( name . ' ('. type . ')' ) |                 call newLoclist.setName( name . ' ('. type . ')' ) | ||||||
|             else |             else | ||||||
|                 " checkers from mixed types |                 " checkers from mixed types | ||||||
|                 call newLoclist.setName(join(map(names, 'v:val[1] . "/" . v:val[0]'), ', ')) |                 call newLoclist.setName(join(map(names, 'v:val[0] . "/" . v:val[1]'), ', ')) | ||||||
|             endif |             endif | ||||||
|         endif |         endif | ||||||
|  |         " }}}3 | ||||||
|  |  | ||||||
|         if !active_checkers |         " issue warning about no active checkers {{{3 | ||||||
|             if !empty(a:checkers) |         if empty(clist) | ||||||
|                 if len(a:checkers) == 1 |             if !empty(a:checker_names) | ||||||
|                     call syntastic#log#warn('checker ' . a:checkers[0] . ' is not active for filetype ' . &filetype) |                 if len(a:checker_names) == 1 | ||||||
|  |                     call syntastic#log#warn('checker ' . a:checker_names[0] . ' is not available') | ||||||
|                 else |                 else | ||||||
|                     call syntastic#log#warn('checkers ' . join(a:checkers, ', ') . ' are not active for filetype ' . &filetype) |                     call syntastic#log#warn('checkers ' . join(a:checker_names, ', ') . ' are not available') | ||||||
|                 endif |                 endif | ||||||
|             else |             else | ||||||
|                 call syntastic#log#debug(g:SyntasticDebugTrace, 'CacheErrors: no active checkers for filetype ' . &filetype) |                 call syntastic#log#debug(g:SyntasticDebugTrace, 'CacheErrors: no checkers available for ' . &filetype) | ||||||
|             endif |             endif | ||||||
|         endif |         endif | ||||||
|  |         " }}}3 | ||||||
|  |  | ||||||
|         call syntastic#log#debug(g:SyntasticDebugLoclist, 'aggregated:', newLoclist) |         call syntastic#log#debug(g:SyntasticDebugLoclist, 'aggregated:', newLoclist) | ||||||
|  |  | ||||||
|         if type(g:syntastic_quiet_messages) == type({}) && !empty(g:syntastic_quiet_messages) |  | ||||||
|             call newLoclist.quietMessages(g:syntastic_quiet_messages) |  | ||||||
|             call syntastic#log#debug(g:SyntasticDebugLoclist, 'filtered by g:syntastic_quiet_messages:', newLoclist) |  | ||||||
|         endif |  | ||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     let b:syntastic_loclist = newLoclist |     let b:syntastic_loclist = newLoclist | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! s:ToggleMode() | function! s:ToggleMode() " {{{2 | ||||||
|     call s:modemap.toggleMode() |     call s:modemap.toggleMode() | ||||||
|     call s:ClearCache() |     call s:ClearCache() | ||||||
|     call s:UpdateErrors(1) |     call s:UpdateErrors(1) | ||||||
|     call s:modemap.echoMode() |     call s:modemap.echoMode() | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| "display the cached errors for this buf in the location list | "display the cached errors for this buf in the location list | ||||||
| function! s:ShowLocList() | function! s:ShowLocList() " {{{2 | ||||||
|     call g:SyntasticLoclist.current().show() |     call g:SyntasticLoclist.current().show() | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| "the script changes &shellredir and &shell to stop the screen flicking when |  | ||||||
| "shelling out to syntax checkers. Not all OSs support the hacks though |  | ||||||
| function! s:OSSupportsShellredirHack() |  | ||||||
|     return !s:running_windows && executable('/bin/bash') && (s:uname() !~ "FreeBSD") && (s:uname() !~ "OpenBSD") |  | ||||||
| endfunction |  | ||||||
|  |  | ||||||
| function! s:IsRedrawRequiredAfterMake() |  | ||||||
|     return !s:running_windows && (s:uname() =~ "FreeBSD" || s:uname() =~ "OpenBSD") |  | ||||||
| endfunction |  | ||||||
|  |  | ||||||
| function! s:IgnoreFile(filename) |  | ||||||
|     let fname = fnamemodify(a:filename, ':p') |  | ||||||
|     for pattern in g:syntastic_ignore_files |  | ||||||
|         if fname =~# pattern |  | ||||||
|             return 1 |  | ||||||
|         endif |  | ||||||
|     endfor |  | ||||||
|     return 0 |  | ||||||
| endfunction |  | ||||||
|  |  | ||||||
| " Skip running in special buffers |  | ||||||
| function! s:SkipFile() |  | ||||||
|     let force_skip = exists('b:syntastic_skip_checks') ? b:syntastic_skip_checks : 0 |  | ||||||
|     let fname = expand('%') |  | ||||||
|     return force_skip || (&buftype != '') || !filereadable(fname) || getwinvar(0, '&diff') || s:IgnoreFile(fname) |  | ||||||
| endfunction |  | ||||||
|  |  | ||||||
| function! s:uname() |  | ||||||
|     if !exists('s:uname') |  | ||||||
|         let s:uname = system('uname') |  | ||||||
|     endif |  | ||||||
|     return s:uname |  | ||||||
| endfunction |  | ||||||
|  |  | ||||||
| "return a string representing the state of buffer according to |  | ||||||
| "g:syntastic_stl_format |  | ||||||
| " |  | ||||||
| "return '' if no errors are cached for the buffer |  | ||||||
| function! SyntasticStatuslineFlag() |  | ||||||
|     return g:SyntasticLoclist.current().getStatuslineFlag() |  | ||||||
| endfunction |  | ||||||
|  |  | ||||||
| "Emulates the :lmake command. Sets up the make environment according to the | "Emulates the :lmake command. Sets up the make environment according to the | ||||||
| "options given, runs make, resets the environment, returns the location list | "options given, runs make, resets the environment, returns the location list | ||||||
| @ -435,9 +385,10 @@ endfunction | |||||||
| "   'postprocess' - a list of functions to be applied to the error list | "   'postprocess' - a list of functions to be applied to the error list | ||||||
| "   'cwd' - change directory to the given path before running the checker | "   'cwd' - change directory to the given path before running the checker | ||||||
| "   'returns' - a list of valid exit codes for the checker | "   'returns' - a list of valid exit codes for the checker | ||||||
| function! SyntasticMake(options) | function! SyntasticMake(options) " {{{2 | ||||||
|     call syntastic#log#debug(g:SyntasticDebugTrace, 'SyntasticMake: called with options:', a:options) |     call syntastic#log#debug(g:SyntasticDebugTrace, 'SyntasticMake: called with options:', a:options) | ||||||
|  |  | ||||||
|  |     " save options and locale env variables {{{3 | ||||||
|     let old_shell = &shell |     let old_shell = &shell | ||||||
|     let old_shellredir = &shellredir |     let old_shellredir = &shellredir | ||||||
|     let old_local_errorformat = &l:errorformat |     let old_local_errorformat = &l:errorformat | ||||||
| @ -445,13 +396,9 @@ function! SyntasticMake(options) | |||||||
|     let old_cwd = getcwd() |     let old_cwd = getcwd() | ||||||
|     let old_lc_messages = $LC_MESSAGES |     let old_lc_messages = $LC_MESSAGES | ||||||
|     let old_lc_all = $LC_ALL |     let old_lc_all = $LC_ALL | ||||||
|  |     " }}}3 | ||||||
|  |  | ||||||
|     if s:OSSupportsShellredirHack() |     call s:bashHack() | ||||||
|         "this is a hack to stop the screen needing to be ':redraw'n when |  | ||||||
|         "when :lmake is run. Otherwise the screen flickers annoyingly |  | ||||||
|         let &shellredir = '&>' |  | ||||||
|         let &shell = '/bin/bash' |  | ||||||
|     endif |  | ||||||
|  |  | ||||||
|     if has_key(a:options, 'errorformat') |     if has_key(a:options, 'errorformat') | ||||||
|         let &errorformat = a:options['errorformat'] |         let &errorformat = a:options['errorformat'] | ||||||
| @ -470,7 +417,7 @@ function! SyntasticMake(options) | |||||||
|     call syntastic#log#debug(g:SyntasticDebugLoclist, 'checker output:', err_lines) |     call syntastic#log#debug(g:SyntasticDebugLoclist, 'checker output:', err_lines) | ||||||
|  |  | ||||||
|     if has_key(a:options, 'preprocess') |     if has_key(a:options, 'preprocess') | ||||||
|         let err_lines = call(a:options['preprocess'], [err_lines]) |         let err_lines = call('syntastic#preprocess#' . a:options['preprocess'], [err_lines]) | ||||||
|         call syntastic#log#debug(g:SyntasticDebugLoclist, 'preprocess:', err_lines) |         call syntastic#log#debug(g:SyntasticDebugLoclist, 'preprocess:', err_lines) | ||||||
|     endif |     endif | ||||||
|     lgetexpr err_lines |     lgetexpr err_lines | ||||||
| @ -482,12 +429,15 @@ function! SyntasticMake(options) | |||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     silent! lolder |     silent! lolder | ||||||
|  |  | ||||||
|  |     " restore options {{{3 | ||||||
|     let &errorformat = old_errorformat |     let &errorformat = old_errorformat | ||||||
|     let &l:errorformat = old_local_errorformat |     let &l:errorformat = old_local_errorformat | ||||||
|     let &shellredir = old_shellredir |     let &shellredir = old_shellredir | ||||||
|     let &shell = old_shell |     let &shell = old_shell | ||||||
|  |     " }}}3 | ||||||
|  |  | ||||||
|     if s:IsRedrawRequiredAfterMake() |     if !s:running_windows && (s:uname() =~ "FreeBSD" || s:uname() =~ "OpenBSD") | ||||||
|         call syntastic#util#redraw(g:syntastic_full_redraws) |         call syntastic#util#redraw(g:syntastic_full_redraws) | ||||||
|     endif |     endif | ||||||
|  |  | ||||||
| @ -498,12 +448,12 @@ function! SyntasticMake(options) | |||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     if has_key(a:options, 'defaults') |     if has_key(a:options, 'defaults') | ||||||
|         call SyntasticAddToErrors(errors, a:options['defaults']) |         call s:addToErrors(errors, a:options['defaults']) | ||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     " Add subtype info if present. |     " Add subtype info if present. | ||||||
|     if has_key(a:options, 'subtype') |     if has_key(a:options, 'subtype') | ||||||
|         call SyntasticAddToErrors(errors, { 'subtype': a:options['subtype'] }) |         call s:addToErrors(errors, { 'subtype': a:options['subtype'] }) | ||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     if has_key(a:options, 'postprocess') && !empty(a:options['postprocess']) |     if has_key(a:options, 'postprocess') && !empty(a:options['postprocess']) | ||||||
| @ -514,10 +464,44 @@ function! SyntasticMake(options) | |||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     return errors |     return errors | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| "take a list of errors and add default values to them from a:options | "return a string representing the state of buffer according to | ||||||
| function! SyntasticAddToErrors(errors, options) | "g:syntastic_stl_format | ||||||
|  | " | ||||||
|  | "return '' if no errors are cached for the buffer | ||||||
|  | function! SyntasticStatuslineFlag() " {{{2 | ||||||
|  |     return g:SyntasticLoclist.current().getStatuslineFlag() | ||||||
|  | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
|  | " Utilities {{{1 | ||||||
|  |  | ||||||
|  | function! s:resolveFiletypes(...) " {{{2 | ||||||
|  |     let type = a:0 ? a:1 : &filetype | ||||||
|  |     return split( get(g:syntastic_filetype_map, type, type), '\m\.' ) | ||||||
|  | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | function! s:ignoreFile(filename) " {{{2 | ||||||
|  |     let fname = fnamemodify(a:filename, ':p') | ||||||
|  |     for pattern in g:syntastic_ignore_files | ||||||
|  |         if fname =~# pattern | ||||||
|  |             return 1 | ||||||
|  |         endif | ||||||
|  |     endfor | ||||||
|  |     return 0 | ||||||
|  | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " Skip running in special buffers | ||||||
|  | function! s:skipFile() " {{{2 | ||||||
|  |     let force_skip = exists('b:syntastic_skip_checks') ? b:syntastic_skip_checks : 0 | ||||||
|  |     let fname = expand('%') | ||||||
|  |     return force_skip || (&buftype != '') || !filereadable(fname) || getwinvar(0, '&diff') || s:ignoreFile(fname) | ||||||
|  | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " Take a list of errors and add default values to them from a:options | ||||||
|  | function! s:addToErrors(errors, options) " {{{2 | ||||||
|     for err in a:errors |     for err in a:errors | ||||||
|         for key in keys(a:options) |         for key in keys(a:options) | ||||||
|             if !has_key(err, key) || empty(err[key]) |             if !has_key(err, key) || empty(err[key]) | ||||||
| @ -527,6 +511,34 @@ function! SyntasticAddToErrors(errors, options) | |||||||
|     endfor |     endfor | ||||||
|  |  | ||||||
|     return a:errors |     return a:errors | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " vim: set et sts=4 sw=4: | " The script changes &shellredir and &shell to stop the screen flicking when | ||||||
|  | " shelling out to syntax checkers. Not all OSs support the hacks though. | ||||||
|  | function! s:bashHack() " {{{2 | ||||||
|  |     if !exists('s:bash') | ||||||
|  |         if !s:running_windows && (s:uname() !~# "FreeBSD") && (s:uname() !~# "OpenBSD") | ||||||
|  |             let s:bash = | ||||||
|  |                 \ executable('/usr/local/bin/bash') ? '/usr/local/bin/bash' : | ||||||
|  |                 \ executable('/bin/bash') ? '/bin/bash' : '' | ||||||
|  |         else | ||||||
|  |             let s:bash = '' | ||||||
|  |         endif | ||||||
|  |     endif | ||||||
|  |  | ||||||
|  |     if g:syntastic_bash_hack && s:bash != '' | ||||||
|  |         let &shell = s:bash | ||||||
|  |         let &shellredir = '&>' | ||||||
|  |     endif | ||||||
|  | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | function! s:uname() " {{{2 | ||||||
|  |     if !exists('s:uname') | ||||||
|  |         let s:uname = system('uname') | ||||||
|  |     endif | ||||||
|  |     return s:uname | ||||||
|  | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
|  | " vim: set sw=4 sts=4 et fdm=marker: | ||||||
|  | |||||||
| @ -1,40 +1,38 @@ | |||||||
| if exists("g:loaded_syntastic_notifier_autoloclist") | if exists("g:loaded_syntastic_notifier_autoloclist") || !exists("g:loaded_syntastic_plugin") | ||||||
|     finish |     finish | ||||||
| endif | endif | ||||||
| let g:loaded_syntastic_notifier_autoloclist = 1 | let g:loaded_syntastic_notifier_autoloclist = 1 | ||||||
|  |  | ||||||
| if !exists("g:syntastic_auto_loc_list") |  | ||||||
|     let g:syntastic_auto_loc_list = 2 |  | ||||||
| endif |  | ||||||
|  |  | ||||||
| let g:SyntasticAutoloclistNotifier = {} | let g:SyntasticAutoloclistNotifier = {} | ||||||
|  |  | ||||||
| " Public methods {{{1 | " Public methods {{{1 | ||||||
| " | " | ||||||
| function! g:SyntasticAutoloclistNotifier.New() | function! g:SyntasticAutoloclistNotifier.New() " {{{2 | ||||||
|     let newObj = copy(self) |     let newObj = copy(self) | ||||||
|     return newObj |     return newObj | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticAutoloclistNotifier.refresh(loclist) | function! g:SyntasticAutoloclistNotifier.refresh(loclist) " {{{2 | ||||||
|     call syntastic#log#debug(g:SyntasticDebugNotifications, 'autoloclist: refresh') |     call syntastic#log#debug(g:SyntasticDebugNotifications, 'autoloclist: refresh') | ||||||
|     call g:SyntasticAutoloclistNotifier.AutoToggle(a:loclist) |     call g:SyntasticAutoloclistNotifier.AutoToggle(a:loclist) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticAutoloclistNotifier.AutoToggle(loclist) | function! g:SyntasticAutoloclistNotifier.AutoToggle(loclist) " {{{2 | ||||||
|     call syntastic#log#debug(g:SyntasticDebugNotifications, 'autoloclist: toggle') |     call syntastic#log#debug(g:SyntasticDebugNotifications, 'autoloclist: toggle') | ||||||
|     if !a:loclist.isEmpty() |     if !a:loclist.isEmpty() | ||||||
|         if g:syntastic_auto_loc_list == 1 |         if syntastic#util#var('auto_loc_list') == 1 | ||||||
|             call a:loclist.show() |             call a:loclist.show() | ||||||
|         endif |         endif | ||||||
|     else |     else | ||||||
|         if g:syntastic_auto_loc_list > 0 |         if syntastic#util#var('auto_loc_list') > 0 | ||||||
|  |  | ||||||
|             "TODO: this will close the loc list window if one was opened by |             "TODO: this will close the loc list window if one was opened by | ||||||
|             "something other than syntastic |             "something other than syntastic | ||||||
|             lclose |             lclose | ||||||
|         endif |         endif | ||||||
|     endif |     endif | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
| " vim: set sw=4 sts=4 et fdm=marker: | " vim: set sw=4 sts=4 et fdm=marker: | ||||||
|  | |||||||
| @ -1,12 +1,8 @@ | |||||||
| if exists("g:loaded_syntastic_notifier_balloons") | if exists("g:loaded_syntastic_notifier_balloons") || !exists("g:loaded_syntastic_plugin") | ||||||
|     finish |     finish | ||||||
| endif | endif | ||||||
| let g:loaded_syntastic_notifier_balloons = 1 | let g:loaded_syntastic_notifier_balloons = 1 | ||||||
|  |  | ||||||
| if !exists("g:syntastic_enable_balloons") |  | ||||||
|     let g:syntastic_enable_balloons = 1 |  | ||||||
| endif |  | ||||||
|  |  | ||||||
| if !has('balloon_eval') | if !has('balloon_eval') | ||||||
|     let g:syntastic_enable_balloons = 0 |     let g:syntastic_enable_balloons = 0 | ||||||
| endif | endif | ||||||
| @ -15,17 +11,17 @@ let g:SyntasticBalloonsNotifier = {} | |||||||
|  |  | ||||||
| " Public methods {{{1 | " Public methods {{{1 | ||||||
|  |  | ||||||
| function! g:SyntasticBalloonsNotifier.New() | function! g:SyntasticBalloonsNotifier.New() " {{{2 | ||||||
|     let newObj = copy(self) |     let newObj = copy(self) | ||||||
|     return newObj |     return newObj | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticBalloonsNotifier.enabled() | function! g:SyntasticBalloonsNotifier.enabled() " {{{2 | ||||||
|     return has('balloon_eval') && syntastic#util#var('enable_balloons') |     return has('balloon_eval') && syntastic#util#var('enable_balloons') | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " Update the error balloons | " Update the error balloons | ||||||
| function! g:SyntasticBalloonsNotifier.refresh(loclist) | function! g:SyntasticBalloonsNotifier.refresh(loclist) " {{{2 | ||||||
|     let b:syntastic_balloons = {} |     let b:syntastic_balloons = {} | ||||||
|     if self.enabled() && !a:loclist.isEmpty() |     if self.enabled() && !a:loclist.isEmpty() | ||||||
|         call syntastic#log#debug(g:SyntasticDebugNotifications, 'balloons: refresh') |         call syntastic#log#debug(g:SyntasticDebugNotifications, 'balloons: refresh') | ||||||
| @ -42,25 +38,29 @@ function! g:SyntasticBalloonsNotifier.refresh(loclist) | |||||||
|             set beval bexpr=SyntasticBalloonsExprNotifier() |             set beval bexpr=SyntasticBalloonsExprNotifier() | ||||||
|         endif |         endif | ||||||
|     endif |     endif | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " Reset the error balloons | " Reset the error balloons | ||||||
| " @vimlint(EVL103, 1, a:loclist) | " @vimlint(EVL103, 1, a:loclist) | ||||||
| function! g:SyntasticBalloonsNotifier.reset(loclist) | function! g:SyntasticBalloonsNotifier.reset(loclist) " {{{2 | ||||||
|     if has('balloon_eval') |     if has('balloon_eval') | ||||||
|         call syntastic#log#debug(g:SyntasticDebugNotifications, 'balloons: reset') |         call syntastic#log#debug(g:SyntasticDebugNotifications, 'balloons: reset') | ||||||
|         set nobeval |         set nobeval | ||||||
|     endif |     endif | ||||||
| endfunction | endfunction " }}}2 | ||||||
| " @vimlint(EVL103, 0, a:loclist) | " @vimlint(EVL103, 0, a:loclist) | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
| " Private functions {{{1 | " Private functions {{{1 | ||||||
|  |  | ||||||
| function! SyntasticBalloonsExprNotifier() | function! SyntasticBalloonsExprNotifier() " {{{2 | ||||||
|     if !exists('b:syntastic_balloons') |     if !exists('b:syntastic_balloons') | ||||||
|         return '' |         return '' | ||||||
|     endif |     endif | ||||||
|     return get(b:syntastic_balloons, v:beval_lnum, '') |     return get(b:syntastic_balloons, v:beval_lnum, '') | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
| " vim: set sw=4 sts=4 et fdm=marker: | " vim: set sw=4 sts=4 et fdm=marker: | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| if exists("g:loaded_syntastic_checker") | if exists("g:loaded_syntastic_checker") || !exists("g:loaded_syntastic_plugin") | ||||||
|     finish |     finish | ||||||
| endif | endif | ||||||
| let g:loaded_syntastic_checker = 1 | let g:loaded_syntastic_checker = 1 | ||||||
| @ -7,7 +7,7 @@ let g:SyntasticChecker = {} | |||||||
|  |  | ||||||
| " Public methods {{{1 | " Public methods {{{1 | ||||||
|  |  | ||||||
| function! g:SyntasticChecker.New(args) | function! g:SyntasticChecker.New(args) " {{{2 | ||||||
|     let newObj = copy(self) |     let newObj = copy(self) | ||||||
|  |  | ||||||
|     let newObj._filetype = a:args['filetype'] |     let newObj._filetype = a:args['filetype'] | ||||||
| @ -34,29 +34,29 @@ function! g:SyntasticChecker.New(args) | |||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     return newObj |     return newObj | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticChecker.getFiletype() | function! g:SyntasticChecker.getFiletype() " {{{2 | ||||||
|     return self._filetype |     return self._filetype | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticChecker.getName() | function! g:SyntasticChecker.getName() " {{{2 | ||||||
|     return self._name |     return self._name | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticChecker.getExec() | function! g:SyntasticChecker.getExec() " {{{2 | ||||||
|     if exists('g:syntastic_' . self._filetype . '_' . self._name . '_exec') |     if exists('g:syntastic_' . self._filetype . '_' . self._name . '_exec') | ||||||
|         return expand(g:syntastic_{self._filetype}_{self._name}_exec) |         return expand(g:syntastic_{self._filetype}_{self._name}_exec) | ||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     return self._exec |     return self._exec | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticChecker.getExecEscaped() | function! g:SyntasticChecker.getExecEscaped() " {{{2 | ||||||
|     return syntastic#util#shescape(self.getExec()) |     return syntastic#util#shescape(self.getExec()) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticChecker.getLocListRaw() | function! g:SyntasticChecker.getLocListRaw() " {{{2 | ||||||
|     let name = self._filetype . '/' . self._name |     let name = self._filetype . '/' . self._name | ||||||
|     try |     try | ||||||
|         let list = self._locListFunc() |         let list = self._locListFunc() | ||||||
| @ -69,13 +69,13 @@ function! g:SyntasticChecker.getLocListRaw() | |||||||
|     call syntastic#log#debug(g:SyntasticDebugLoclist, name . ' raw:', list) |     call syntastic#log#debug(g:SyntasticDebugLoclist, name . ' raw:', list) | ||||||
|     call self._quietMessages(list) |     call self._quietMessages(list) | ||||||
|     return list |     return list | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticChecker.getLocList() | function! g:SyntasticChecker.getLocList() " {{{2 | ||||||
|     return g:SyntasticLoclist.New(self.getLocListRaw()) |     return g:SyntasticLoclist.New(self.getLocListRaw()) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticChecker.makeprgBuild(opts) | function! g:SyntasticChecker.makeprgBuild(opts) " {{{2 | ||||||
|     let basename = self._filetype . '_' . self._name . '_' |     let basename = self._filetype . '_' . self._name . '_' | ||||||
|  |  | ||||||
|     let parts = [] |     let parts = [] | ||||||
| @ -86,23 +86,42 @@ function! g:SyntasticChecker.makeprgBuild(opts) | |||||||
|     call extend(parts, self._getOpt(a:opts, basename, 'tail', '')) |     call extend(parts, self._getOpt(a:opts, basename, 'tail', '')) | ||||||
|  |  | ||||||
|     return join(parts) |     return join(parts) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticChecker.isAvailable() | function! g:SyntasticChecker.isAvailable() " {{{2 | ||||||
|     return self._isAvailableFunc() |     return self._isAvailableFunc() | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
| " Private methods {{{1 | " Private methods {{{1 | ||||||
|  |  | ||||||
| function! g:SyntasticChecker._quietMessages(errors) | function! g:SyntasticChecker._quietMessages(errors) " {{{2 | ||||||
|     let filter = 'g:syntastic_' . self._filetype . '_' . self._name . '_quiet_messages' |     " wildcard quiet_messages | ||||||
|     if exists(filter) && type({filter}) == type({}) && !empty({filter}) |     let quiet_filters = copy(syntastic#util#var('quiet_messages', {})) | ||||||
|         call syntastic#util#dictFilter(a:errors, {filter}) |     if type(quiet_filters) != type({}) | ||||||
|         call syntastic#log#debug(g:SyntasticDebugLoclist, 'filtered by ' . filter . ':', a:errors) |         call syntastic#log#warn('ignoring invalid syntastic_quiet_messages') | ||||||
|  |         unlet quiet_filters | ||||||
|  |         let quiet_filters = {} | ||||||
|     endif |     endif | ||||||
| endfunction |  | ||||||
|  |  | ||||||
| function! g:SyntasticChecker._populateHighlightRegexes(errors) |     " per checker quiet_messages | ||||||
|  |     let name = self._filetype . '_' . self._name | ||||||
|  |     try | ||||||
|  |         call extend( quiet_filters, copy(syntastic#util#var(name . '_quiet_messages', {})), 'force' ) | ||||||
|  |     catch /\m^Vim\%((\a\+)\)\=:E712/ | ||||||
|  |         call syntastic#log#warn('ignoring invalid syntastic_' . name . '_quiet_messages') | ||||||
|  |     endtry | ||||||
|  |  | ||||||
|  |     call syntastic#log#debug(g:SyntasticDebugLoclist, 'quiet_messages filter:', quiet_filters) | ||||||
|  |  | ||||||
|  |     if !empty(quiet_filters) | ||||||
|  |         call syntastic#util#dictFilter(a:errors, quiet_filters) | ||||||
|  |         call syntastic#log#debug(g:SyntasticDebugLoclist, 'filtered by quiet_messages:', a:errors) | ||||||
|  |     endif | ||||||
|  | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | function! g:SyntasticChecker._populateHighlightRegexes(errors) " {{{2 | ||||||
|     if has_key(self, '_highlightRegexFunc') |     if has_key(self, '_highlightRegexFunc') | ||||||
|         for e in a:errors |         for e in a:errors | ||||||
|             if e['valid'] |             if e['valid'] | ||||||
| @ -113,9 +132,9 @@ function! g:SyntasticChecker._populateHighlightRegexes(errors) | |||||||
|             endif |             endif | ||||||
|         endfor |         endfor | ||||||
|     endif |     endif | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticChecker._getOpt(opts, basename, name, default) | function! g:SyntasticChecker._getOpt(opts, basename, name, default) " {{{2 | ||||||
|     let user_val = syntastic#util#var(a:basename . a:name) |     let user_val = syntastic#util#var(a:basename . a:name) | ||||||
|     let ret = [] |     let ret = [] | ||||||
|     call extend( ret, self._shescape(get(a:opts, a:name . '_before', '')) ) |     call extend( ret, self._shescape(get(a:opts, a:name . '_before', '')) ) | ||||||
| @ -123,9 +142,9 @@ function! g:SyntasticChecker._getOpt(opts, basename, name, default) | |||||||
|     call extend( ret, self._shescape(get(a:opts, a:name . '_after', '')) ) |     call extend( ret, self._shescape(get(a:opts, a:name . '_after', '')) ) | ||||||
|  |  | ||||||
|     return ret |     return ret | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticChecker._shescape(opt) | function! g:SyntasticChecker._shescape(opt) " {{{2 | ||||||
|     if type(a:opt) == type('') && a:opt != '' |     if type(a:opt) == type('') && a:opt != '' | ||||||
|         return [a:opt] |         return [a:opt] | ||||||
|     elseif type(a:opt) == type([]) |     elseif type(a:opt) == type([]) | ||||||
| @ -133,12 +152,16 @@ function! g:SyntasticChecker._shescape(opt) | |||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     return [] |     return [] | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
| " Non-method functions {{{1 | " Non-method functions {{{1 | ||||||
|  |  | ||||||
| function! SyntasticCheckerIsAvailableDefault() dict | function! SyntasticCheckerIsAvailableDefault() dict " {{{2 | ||||||
|     return executable(self.getExec()) |     return executable(self.getExec()) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
| " vim: set sw=4 sts=4 et fdm=marker: | " vim: set sw=4 sts=4 et fdm=marker: | ||||||
|  | |||||||
| @ -1,26 +1,22 @@ | |||||||
| if exists("g:loaded_syntastic_notifier_cursor") | if exists("g:loaded_syntastic_notifier_cursor") || !exists("g:loaded_syntastic_plugin") | ||||||
|     finish |     finish | ||||||
| endif | endif | ||||||
| let g:loaded_syntastic_notifier_cursor = 1 | let g:loaded_syntastic_notifier_cursor = 1 | ||||||
|  |  | ||||||
| if !exists('g:syntastic_echo_current_error') |  | ||||||
|     let g:syntastic_echo_current_error = 1 |  | ||||||
| endif |  | ||||||
|  |  | ||||||
| let g:SyntasticCursorNotifier = {} | let g:SyntasticCursorNotifier = {} | ||||||
|  |  | ||||||
| " Public methods {{{1 | " Public methods {{{1 | ||||||
|  |  | ||||||
| function! g:SyntasticCursorNotifier.New() | function! g:SyntasticCursorNotifier.New() " {{{2 | ||||||
|     let newObj = copy(self) |     let newObj = copy(self) | ||||||
|     return newObj |     return newObj | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticCursorNotifier.enabled() | function! g:SyntasticCursorNotifier.enabled() " {{{2 | ||||||
|     return syntastic#util#var('echo_current_error') |     return syntastic#util#var('echo_current_error') | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticCursorNotifier.refresh(loclist) | function! g:SyntasticCursorNotifier.refresh(loclist) " {{{2 | ||||||
|     if self.enabled() && !a:loclist.isEmpty() |     if self.enabled() && !a:loclist.isEmpty() | ||||||
|         call syntastic#log#debug(g:SyntasticDebugNotifications, 'cursor: refresh') |         call syntastic#log#debug(g:SyntasticDebugNotifications, 'cursor: refresh') | ||||||
|         let b:syntastic_messages = copy(a:loclist.messages(bufnr(''))) |         let b:syntastic_messages = copy(a:loclist.messages(bufnr(''))) | ||||||
| @ -28,21 +24,23 @@ function! g:SyntasticCursorNotifier.refresh(loclist) | |||||||
|         autocmd! syntastic CursorMoved |         autocmd! syntastic CursorMoved | ||||||
|         autocmd syntastic CursorMoved * call g:SyntasticRefreshCursor() |         autocmd syntastic CursorMoved * call g:SyntasticRefreshCursor() | ||||||
|     endif |     endif | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " @vimlint(EVL103, 1, a:loclist) | " @vimlint(EVL103, 1, a:loclist) | ||||||
| function! g:SyntasticCursorNotifier.reset(loclist) | function! g:SyntasticCursorNotifier.reset(loclist) " {{{2 | ||||||
|     call syntastic#log#debug(g:SyntasticDebugNotifications, 'cursor: reset') |     call syntastic#log#debug(g:SyntasticDebugNotifications, 'cursor: reset') | ||||||
|     autocmd! syntastic CursorMoved |     autocmd! syntastic CursorMoved | ||||||
|     unlet! b:syntastic_messages |     unlet! b:syntastic_messages | ||||||
|     let b:oldLine = -1 |     let b:oldLine = -1 | ||||||
| endfunction | endfunction " }}}2 | ||||||
| " @vimlint(EVL103, 0, a:loclist) | " @vimlint(EVL103, 0, a:loclist) | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
| " Private methods {{{1 | " Private methods {{{1 | ||||||
|  |  | ||||||
| " The following defensive nonsense is needed because of the nature of autocmd | " The following defensive nonsense is needed because of the nature of autocmd | ||||||
| function! g:SyntasticRefreshCursor() | function! g:SyntasticRefreshCursor() " {{{2 | ||||||
|     if !exists('b:syntastic_messages') || empty(b:syntastic_messages) |     if !exists('b:syntastic_messages') || empty(b:syntastic_messages) | ||||||
|         " file not checked |         " file not checked | ||||||
|         return |         return | ||||||
| @ -62,6 +60,8 @@ function! g:SyntasticRefreshCursor() | |||||||
|     else |     else | ||||||
|         echo |         echo | ||||||
|     endif |     endif | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
| " vim: set sw=4 sts=4 et fdm=marker: | " vim: set sw=4 sts=4 et fdm=marker: | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| if exists("g:loaded_syntastic_notifier_highlighting") | if exists("g:loaded_syntastic_notifier_highlighting") || !exists("g:loaded_syntastic_plugin") | ||||||
|     finish |     finish | ||||||
| endif | endif | ||||||
| let g:loaded_syntastic_notifier_highlighting = 1 | let g:loaded_syntastic_notifier_highlighting = 1 | ||||||
| @ -6,17 +6,13 @@ let g:loaded_syntastic_notifier_highlighting = 1 | |||||||
| " Highlighting requires getmatches introduced in 7.1.040 | " Highlighting requires getmatches introduced in 7.1.040 | ||||||
| let s:has_highlighting = v:version > 701 || (v:version == 701 && has('patch040')) | let s:has_highlighting = v:version > 701 || (v:version == 701 && has('patch040')) | ||||||
|  |  | ||||||
| if !exists("g:syntastic_enable_highlighting") |  | ||||||
|     let g:syntastic_enable_highlighting = 1 |  | ||||||
| endif |  | ||||||
|  |  | ||||||
| let g:SyntasticHighlightingNotifier = {} | let g:SyntasticHighlightingNotifier = {} | ||||||
|  |  | ||||||
| let s:setup_done = 0 | let s:setup_done = 0 | ||||||
|  |  | ||||||
| " Public methods {{{1 | " Public methods {{{1 | ||||||
|  |  | ||||||
| function! g:SyntasticHighlightingNotifier.New() | function! g:SyntasticHighlightingNotifier.New() " {{{2 | ||||||
|     let newObj = copy(self) |     let newObj = copy(self) | ||||||
|  |  | ||||||
|     if !s:setup_done |     if !s:setup_done | ||||||
| @ -25,14 +21,14 @@ function! g:SyntasticHighlightingNotifier.New() | |||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     return newObj |     return newObj | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticHighlightingNotifier.enabled() | function! g:SyntasticHighlightingNotifier.enabled() " {{{2 | ||||||
|     return s:has_highlighting && syntastic#util#var('enable_highlighting') |     return s:has_highlighting && syntastic#util#var('enable_highlighting') | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " Sets error highlights in the cuirrent window | " Sets error highlights in the cuirrent window | ||||||
| function! g:SyntasticHighlightingNotifier.refresh(loclist) | function! g:SyntasticHighlightingNotifier.refresh(loclist) " {{{2 | ||||||
|     if self.enabled() |     if self.enabled() | ||||||
|         call self.reset(a:loclist) |         call self.reset(a:loclist) | ||||||
|         call syntastic#log#debug(g:SyntasticDebugNotifications, 'highlighting: refresh') |         call syntastic#log#debug(g:SyntasticDebugNotifications, 'highlighting: refresh') | ||||||
| @ -59,11 +55,11 @@ function! g:SyntasticHighlightingNotifier.refresh(loclist) | |||||||
|             endif |             endif | ||||||
|         endfor |         endfor | ||||||
|     endif |     endif | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " Remove all error highlights from the window | " Remove all error highlights from the window | ||||||
| " @vimlint(EVL103, 1, a:loclist) | " @vimlint(EVL103, 1, a:loclist) | ||||||
| function! g:SyntasticHighlightingNotifier.reset(loclist) | function! g:SyntasticHighlightingNotifier.reset(loclist) " {{{2 | ||||||
|     if s:has_highlighting |     if s:has_highlighting | ||||||
|         call syntastic#log#debug(g:SyntasticDebugNotifications, 'highlighting: reset') |         call syntastic#log#debug(g:SyntasticDebugNotifications, 'highlighting: reset') | ||||||
|         for match in getmatches() |         for match in getmatches() | ||||||
| @ -72,13 +68,15 @@ function! g:SyntasticHighlightingNotifier.reset(loclist) | |||||||
|             endif |             endif | ||||||
|         endfor |         endfor | ||||||
|     endif |     endif | ||||||
| endfunction | endfunction " }}}2 | ||||||
| " @vimlint(EVL103, 0, a:loclist) | " @vimlint(EVL103, 0, a:loclist) | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
| " Private methods {{{1 | " Private methods {{{1 | ||||||
|  |  | ||||||
| " One time setup: define our own highlighting | " One time setup: define our own highlighting | ||||||
| function! g:SyntasticHighlightingNotifier._setup() | function! g:SyntasticHighlightingNotifier._setup() " {{{2 | ||||||
|     if s:has_highlighting |     if s:has_highlighting | ||||||
|         if !hlexists('SyntasticError') |         if !hlexists('SyntasticError') | ||||||
|             highlight link SyntasticError SpellBad |             highlight link SyntasticError SpellBad | ||||||
| @ -88,6 +86,8 @@ function! g:SyntasticHighlightingNotifier._setup() | |||||||
|             highlight link SyntasticWarning SpellCap |             highlight link SyntasticWarning SpellCap | ||||||
|         endif |         endif | ||||||
|     endif |     endif | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
| " vim: set sw=4 sts=4 et fdm=marker: | " vim: set sw=4 sts=4 et fdm=marker: | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| if exists("g:loaded_syntastic_loclist") | if exists("g:loaded_syntastic_loclist") || !exists("g:loaded_syntastic_plugin") | ||||||
|     finish |     finish | ||||||
| endif | endif | ||||||
| let g:loaded_syntastic_loclist = 1 | let g:loaded_syntastic_loclist = 1 | ||||||
| @ -7,7 +7,7 @@ let g:SyntasticLoclist = {} | |||||||
|  |  | ||||||
| " Public methods {{{1 | " Public methods {{{1 | ||||||
|  |  | ||||||
| function! g:SyntasticLoclist.New(rawLoclist) | function! g:SyntasticLoclist.New(rawLoclist) " {{{2 | ||||||
|     let newObj = copy(self) |     let newObj = copy(self) | ||||||
|  |  | ||||||
|     let llist = filter(copy(a:rawLoclist), 'v:val["valid"] == 1') |     let llist = filter(copy(a:rawLoclist), 'v:val["valid"] == 1') | ||||||
| @ -22,34 +22,34 @@ function! g:SyntasticLoclist.New(rawLoclist) | |||||||
|     let newObj._name = '' |     let newObj._name = '' | ||||||
|  |  | ||||||
|     return newObj |     return newObj | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticLoclist.current() | function! g:SyntasticLoclist.current() " {{{2 | ||||||
|     if !exists("b:syntastic_loclist") |     if !exists("b:syntastic_loclist") | ||||||
|         let b:syntastic_loclist = g:SyntasticLoclist.New([]) |         let b:syntastic_loclist = g:SyntasticLoclist.New([]) | ||||||
|     endif |     endif | ||||||
|     return b:syntastic_loclist |     return b:syntastic_loclist | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticLoclist.extend(other) | function! g:SyntasticLoclist.extend(other) " {{{2 | ||||||
|     let list = self.copyRaw() |     let list = self.copyRaw() | ||||||
|     call extend(list, a:other.copyRaw()) |     call extend(list, a:other.copyRaw()) | ||||||
|     return g:SyntasticLoclist.New(list) |     return g:SyntasticLoclist.New(list) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticLoclist.isEmpty() | function! g:SyntasticLoclist.isEmpty() " {{{2 | ||||||
|     return empty(self._rawLoclist) |     return empty(self._rawLoclist) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticLoclist.copyRaw() | function! g:SyntasticLoclist.copyRaw() " {{{2 | ||||||
|     return copy(self._rawLoclist) |     return copy(self._rawLoclist) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticLoclist.getRaw() | function! g:SyntasticLoclist.getRaw() " {{{2 | ||||||
|     return self._rawLoclist |     return self._rawLoclist | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticLoclist.getStatuslineFlag() | function! g:SyntasticLoclist.getStatuslineFlag() " {{{2 | ||||||
|     if !exists("self._stl_format") |     if !exists("self._stl_format") | ||||||
|         let self._stl_format = '' |         let self._stl_format = '' | ||||||
|     endif |     endif | ||||||
| @ -100,52 +100,48 @@ function! g:SyntasticLoclist.getStatuslineFlag() | |||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     return self._stl_flag |     return self._stl_flag | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticLoclist.getFirstIssue() | function! g:SyntasticLoclist.getFirstIssue() " {{{2 | ||||||
|     return get(self._rawLoclist, 0, {}) |     return get(self._rawLoclist, 0, {}) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticLoclist.getName() | function! g:SyntasticLoclist.getName() " {{{2 | ||||||
|     return len(self._name) |     return len(self._name) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticLoclist.setName(name) | function! g:SyntasticLoclist.setName(name) " {{{2 | ||||||
|     let self._name = a:name |     let self._name = a:name | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticLoclist.decorate(name, filetype) | function! g:SyntasticLoclist.decorate(filetype, name) " {{{2 | ||||||
|     for e in self._rawLoclist |     for e in self._rawLoclist | ||||||
|         let e['text'] .= ' [' . a:filetype . '/' . a:name . ']' |         let e['text'] .= ' [' . a:filetype . '/' . a:name . ']' | ||||||
|     endfor |     endfor | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticLoclist.quietMessages(filters) | function! g:SyntasticLoclist.errors() " {{{2 | ||||||
|     call syntastic#util#dictFilter(self._rawLoclist, a:filters) |  | ||||||
| endfunction |  | ||||||
|  |  | ||||||
| function! g:SyntasticLoclist.errors() |  | ||||||
|     if !exists("self._cachedErrors") |     if !exists("self._cachedErrors") | ||||||
|         let self._cachedErrors = self.filter({'type': "E"}) |         let self._cachedErrors = self.filter({'type': "E"}) | ||||||
|     endif |     endif | ||||||
|     return self._cachedErrors |     return self._cachedErrors | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticLoclist.warnings() | function! g:SyntasticLoclist.warnings() " {{{2 | ||||||
|     if !exists("self._cachedWarnings") |     if !exists("self._cachedWarnings") | ||||||
|         let self._cachedWarnings = self.filter({'type': "W"}) |         let self._cachedWarnings = self.filter({'type': "W"}) | ||||||
|     endif |     endif | ||||||
|     return self._cachedWarnings |     return self._cachedWarnings | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " Legacy function.  Syntastic no longer calls it, but we keep it | " Legacy function.  Syntastic no longer calls it, but we keep it | ||||||
| " around because other plugins (f.i. powerline) depend on it. | " around because other plugins (f.i. powerline) depend on it. | ||||||
| function! g:SyntasticLoclist.hasErrorsOrWarningsToDisplay() | function! g:SyntasticLoclist.hasErrorsOrWarningsToDisplay() " {{{2 | ||||||
|     return !self.isEmpty() |     return !self.isEmpty() | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " cache used by EchoCurrentError() | " cache used by EchoCurrentError() | ||||||
| function! g:SyntasticLoclist.messages(buf) | function! g:SyntasticLoclist.messages(buf) " {{{2 | ||||||
|     if !exists("self._cachedMessages") |     if !exists("self._cachedMessages") | ||||||
|         let self._cachedMessages = {} |         let self._cachedMessages = {} | ||||||
|         let errors = self.errors() + self.warnings() |         let errors = self.errors() + self.warnings() | ||||||
| @ -165,7 +161,7 @@ function! g:SyntasticLoclist.messages(buf) | |||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     return get(self._cachedMessages, a:buf, {}) |     return get(self._cachedMessages, a:buf, {}) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| "Filter the list and return new native loclist | "Filter the list and return new native loclist | ||||||
| "e.g. | "e.g. | ||||||
| @ -174,14 +170,14 @@ endfunction | |||||||
| "would return all errors for buffer 10. | "would return all errors for buffer 10. | ||||||
| " | " | ||||||
| "Note that all comparisons are done with ==? | "Note that all comparisons are done with ==? | ||||||
| function! g:SyntasticLoclist.filter(filters) | function! g:SyntasticLoclist.filter(filters) " {{{2 | ||||||
|     let conditions = values(map(copy(a:filters), 's:translate(v:key, v:val)')) |     let conditions = values(map(copy(a:filters), 's:translate(v:key, v:val)')) | ||||||
|     let filter = len(conditions) == 1 ? |     let filter = len(conditions) == 1 ? | ||||||
|         \ conditions[0] : join(map(conditions, '"(" . v:val . ")"'), ' && ') |         \ conditions[0] : join(map(conditions, '"(" . v:val . ")"'), ' && ') | ||||||
|     return filter(copy(self._rawLoclist), filter) |     return filter(copy(self._rawLoclist), filter) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticLoclist.setloclist() | function! g:SyntasticLoclist.setloclist() " {{{2 | ||||||
|     if !exists('w:syntastic_loclist_set') |     if !exists('w:syntastic_loclist_set') | ||||||
|         let w:syntastic_loclist_set = 0 |         let w:syntastic_loclist_set = 0 | ||||||
|     endif |     endif | ||||||
| @ -189,16 +185,16 @@ function! g:SyntasticLoclist.setloclist() | |||||||
|     call syntastic#log#debug(g:SyntasticDebugNotifications, 'loclist: setloclist ' . (replace ? '(replace)' : '(new)')) |     call syntastic#log#debug(g:SyntasticDebugNotifications, 'loclist: setloclist ' . (replace ? '(replace)' : '(new)')) | ||||||
|     call setloclist(0, self.getRaw(), replace ? 'r' : ' ') |     call setloclist(0, self.getRaw(), replace ? 'r' : ' ') | ||||||
|     let w:syntastic_loclist_set = 1 |     let w:syntastic_loclist_set = 1 | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| "display the cached errors for this buf in the location list | "display the cached errors for this buf in the location list | ||||||
| function! g:SyntasticLoclist.show() | function! g:SyntasticLoclist.show() " {{{2 | ||||||
|     call syntastic#log#debug(g:SyntasticDebugNotifications, 'loclist: show') |     call syntastic#log#debug(g:SyntasticDebugNotifications, 'loclist: show') | ||||||
|     call self.setloclist() |     call self.setloclist() | ||||||
|  |  | ||||||
|     if !self.isEmpty() |     if !self.isEmpty() | ||||||
|         let num = winnr() |         let num = winnr() | ||||||
|         execute "lopen " . g:syntastic_loc_list_height |         execute "lopen " . syntastic#util#var('loc_list_height') | ||||||
|         if num != winnr() |         if num != winnr() | ||||||
|             wincmd p |             wincmd p | ||||||
|         endif |         endif | ||||||
| @ -220,19 +216,25 @@ function! g:SyntasticLoclist.show() | |||||||
|             endif |             endif | ||||||
|         endfor |         endfor | ||||||
|     endif |     endif | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
| " Non-method functions {{{1 | " Non-method functions {{{1 | ||||||
|  |  | ||||||
| function! g:SyntasticLoclistHide() | function! g:SyntasticLoclistHide() " {{{2 | ||||||
|     call syntastic#log#debug(g:SyntasticDebugNotifications, 'loclist: hide') |     call syntastic#log#debug(g:SyntasticDebugNotifications, 'loclist: hide') | ||||||
|     silent! lclose |     silent! lclose | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
| " Private functions {{{1 | " Private functions {{{1 | ||||||
|  |  | ||||||
| function! s:translate(key, val) | function! s:translate(key, val) " {{{2 | ||||||
|     return 'get(v:val, ' . string(a:key) . ', "") ==? ' . string(a:val) |     return 'get(v:val, ' . string(a:key) . ', "") ==? ' . string(a:val) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
| " vim: set sw=4 sts=4 et fdm=marker: | " vim: set sw=4 sts=4 et fdm=marker: | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| if exists("g:loaded_syntastic_modemap") | if exists("g:loaded_syntastic_modemap") || !exists("g:loaded_syntastic_plugin") | ||||||
|     finish |     finish | ||||||
| endif | endif | ||||||
| let g:loaded_syntastic_modemap = 1 | let g:loaded_syntastic_modemap = 1 | ||||||
| @ -7,16 +7,16 @@ let g:SyntasticModeMap = {} | |||||||
|  |  | ||||||
| " Public methods {{{1 | " Public methods {{{1 | ||||||
|  |  | ||||||
| function! g:SyntasticModeMap.Instance() | function! g:SyntasticModeMap.Instance() " {{{2 | ||||||
|     if !exists('s:SyntasticModeMapInstance') |     if !exists('s:SyntasticModeMapInstance') | ||||||
|         let s:SyntasticModeMapInstance = copy(self) |         let s:SyntasticModeMapInstance = copy(self) | ||||||
|         call s:SyntasticModeMapInstance.synch() |         call s:SyntasticModeMapInstance.synch() | ||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     return s:SyntasticModeMapInstance |     return s:SyntasticModeMapInstance | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticModeMap.synch() | function! g:SyntasticModeMap.synch() " {{{2 | ||||||
|     if exists('g:syntastic_mode_map') |     if exists('g:syntastic_mode_map') | ||||||
|         let self._mode = get(g:syntastic_mode_map, 'mode', 'active') |         let self._mode = get(g:syntastic_mode_map, 'mode', 'active') | ||||||
|         let self._activeFiletypes = get(g:syntastic_mode_map, 'active_filetypes', []) |         let self._activeFiletypes = get(g:syntastic_mode_map, 'active_filetypes', []) | ||||||
| @ -26,9 +26,9 @@ function! g:SyntasticModeMap.synch() | |||||||
|         let self._activeFiletypes = [] |         let self._activeFiletypes = [] | ||||||
|         let self._passiveFiletypes = [] |         let self._passiveFiletypes = [] | ||||||
|     endif |     endif | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticModeMap.allowsAutoChecking(filetype) | function! g:SyntasticModeMap.allowsAutoChecking(filetype) " {{{2 | ||||||
|     let fts = split(a:filetype, '\m\.') |     let fts = split(a:filetype, '\m\.') | ||||||
|  |  | ||||||
|     if self.isPassive() |     if self.isPassive() | ||||||
| @ -36,13 +36,13 @@ function! g:SyntasticModeMap.allowsAutoChecking(filetype) | |||||||
|     else |     else | ||||||
|         return self._noFiletypesArePassive(fts) |         return self._noFiletypesArePassive(fts) | ||||||
|     endif |     endif | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticModeMap.isPassive() | function! g:SyntasticModeMap.isPassive() " {{{2 | ||||||
|     return self._mode ==# 'passive' |     return self._mode ==# 'passive' | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticModeMap.toggleMode() | function! g:SyntasticModeMap.toggleMode() " {{{2 | ||||||
|     call self.synch() |     call self.synch() | ||||||
|  |  | ||||||
|     if self._mode ==# 'active' |     if self._mode ==# 'active' | ||||||
| @ -56,20 +56,24 @@ function! g:SyntasticModeMap.toggleMode() | |||||||
|         let g:syntastic_mode_map = {} |         let g:syntastic_mode_map = {} | ||||||
|     endif |     endif | ||||||
|     let g:syntastic_mode_map['mode'] = self._mode |     let g:syntastic_mode_map['mode'] = self._mode | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticModeMap.echoMode() | function! g:SyntasticModeMap.echoMode() " {{{2 | ||||||
|     echo "Syntastic: " . self._mode . " mode enabled" |     echo "Syntastic: " . self._mode . " mode enabled" | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
| " Private methods {{{1 | " Private methods {{{1 | ||||||
|  |  | ||||||
| function! g:SyntasticModeMap._isOneFiletypeActive(filetypes) | function! g:SyntasticModeMap._isOneFiletypeActive(filetypes) " {{{2 | ||||||
|     return !empty(filter(copy(a:filetypes), 'index(self._activeFiletypes, v:val) != -1')) |     return !empty(filter(copy(a:filetypes), 'index(self._activeFiletypes, v:val) != -1')) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticModeMap._noFiletypesArePassive(filetypes) | function! g:SyntasticModeMap._noFiletypesArePassive(filetypes) " {{{2 | ||||||
|     return empty(filter(copy(a:filetypes), 'index(self._passiveFiletypes, v:val) != -1')) |     return empty(filter(copy(a:filetypes), 'index(self._passiveFiletypes, v:val) != -1')) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
| " vim: set sw=4 sts=4 et fdm=marker: | " vim: set sw=4 sts=4 et fdm=marker: | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| if exists("g:loaded_syntastic_notifiers") | if exists("g:loaded_syntastic_notifiers") || !exists("g:loaded_syntastic_plugin") | ||||||
|     finish |     finish | ||||||
| endif | endif | ||||||
| let g:loaded_syntastic_notifiers = 1 | let g:loaded_syntastic_notifiers = 1 | ||||||
| @ -9,16 +9,16 @@ let s:notifier_types = ['signs', 'balloons', 'highlighting', 'cursor', 'autolocl | |||||||
|  |  | ||||||
| " Public methods {{{1 | " Public methods {{{1 | ||||||
|  |  | ||||||
| function! g:SyntasticNotifiers.Instance() | function! g:SyntasticNotifiers.Instance() " {{{2 | ||||||
|     if !exists('s:SyntasticNotifiersInstance') |     if !exists('s:SyntasticNotifiersInstance') | ||||||
|         let s:SyntasticNotifiersInstance = copy(self) |         let s:SyntasticNotifiersInstance = copy(self) | ||||||
|         call s:SyntasticNotifiersInstance._initNotifiers() |         call s:SyntasticNotifiersInstance._initNotifiers() | ||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     return s:SyntasticNotifiersInstance |     return s:SyntasticNotifiersInstance | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticNotifiers.refresh(loclist) | function! g:SyntasticNotifiers.refresh(loclist) " {{{2 | ||||||
|     call syntastic#log#debug(g:SyntasticDebugNotifications, 'notifiers: refresh') |     call syntastic#log#debug(g:SyntasticDebugNotifications, 'notifiers: refresh') | ||||||
|     for type in self._enabled_types |     for type in self._enabled_types | ||||||
|         let class = substitute(type, '\m.*', 'Syntastic\u&Notifier', '') |         let class = substitute(type, '\m.*', 'Syntastic\u&Notifier', '') | ||||||
| @ -26,9 +26,9 @@ function! g:SyntasticNotifiers.refresh(loclist) | |||||||
|             call self._notifier[type].refresh(a:loclist) |             call self._notifier[type].refresh(a:loclist) | ||||||
|         endif |         endif | ||||||
|     endfor |     endfor | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticNotifiers.reset(loclist) | function! g:SyntasticNotifiers.reset(loclist) " {{{2 | ||||||
|     call syntastic#log#debug(g:SyntasticDebugNotifications, 'notifiers: reset') |     call syntastic#log#debug(g:SyntasticDebugNotifications, 'notifiers: reset') | ||||||
|     for type in self._enabled_types |     for type in self._enabled_types | ||||||
|         let class = substitute(type, '\m.*', 'Syntastic\u&Notifier', '') |         let class = substitute(type, '\m.*', 'Syntastic\u&Notifier', '') | ||||||
| @ -40,11 +40,13 @@ function! g:SyntasticNotifiers.reset(loclist) | |||||||
|             call self._notifier[type].reset(a:loclist) |             call self._notifier[type].reset(a:loclist) | ||||||
|         endif |         endif | ||||||
|     endfor |     endfor | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
| " Private methods {{{1 | " Private methods {{{1 | ||||||
|  |  | ||||||
| function! g:SyntasticNotifiers._initNotifiers() | function! g:SyntasticNotifiers._initNotifiers() " {{{2 | ||||||
|     let self._notifier = {} |     let self._notifier = {} | ||||||
|     for type in s:notifier_types |     for type in s:notifier_types | ||||||
|         let class = substitute(type, '\m.*', 'Syntastic\u&Notifier', '') |         let class = substitute(type, '\m.*', 'Syntastic\u&Notifier', '') | ||||||
| @ -52,6 +54,8 @@ function! g:SyntasticNotifiers._initNotifiers() | |||||||
|     endfor |     endfor | ||||||
|  |  | ||||||
|     let self._enabled_types = copy(s:notifier_types) |     let self._enabled_types = copy(s:notifier_types) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
| " vim: set sw=4 sts=4 et fdm=marker: | " vim: set sw=4 sts=4 et fdm=marker: | ||||||
|  | |||||||
| @ -1,8 +1,10 @@ | |||||||
| if exists("g:loaded_syntastic_registry") | if exists("g:loaded_syntastic_registry") || !exists("g:loaded_syntastic_plugin") | ||||||
|     finish |     finish | ||||||
| endif | endif | ||||||
| let g:loaded_syntastic_registry = 1 | let g:loaded_syntastic_registry = 1 | ||||||
|  |  | ||||||
|  | " Initialisation {{{1 | ||||||
|  |  | ||||||
| let s:defaultCheckers = { | let s:defaultCheckers = { | ||||||
|         \ 'actionscript':['mxmlc'], |         \ 'actionscript':['mxmlc'], | ||||||
|         \ 'ada':         ['gcc'], |         \ 'ada':         ['gcc'], | ||||||
| @ -95,188 +97,167 @@ let s:defaultFiletypeMap = { | |||||||
|  |  | ||||||
| let g:SyntasticRegistry = {} | let g:SyntasticRegistry = {} | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
|  | " Public methods {{{1 | ||||||
|  |  | ||||||
| " TODO: Handling of filetype aliases: all public methods take aliases as | " TODO: Handling of filetype aliases: all public methods take aliases as | ||||||
| " parameters, all private methods take normalized filetypes.  Public methods | " parameters, all private methods take normalized filetypes.  Public methods | ||||||
| " are thus supposed to normalize filetypes before calling private methods. | " are thus supposed to normalize filetypes before calling private methods. | ||||||
|  |  | ||||||
| " Public methods {{{1 | function! g:SyntasticRegistry.Instance() " {{{2 | ||||||
|  |  | ||||||
| function! g:SyntasticRegistry.Instance() |  | ||||||
|     if !exists('s:SyntasticRegistryInstance') |     if !exists('s:SyntasticRegistryInstance') | ||||||
|         let s:SyntasticRegistryInstance = copy(self) |         let s:SyntasticRegistryInstance = copy(self) | ||||||
|  |         let s:SyntasticRegistryInstance._checkerRaw = {} | ||||||
|         let s:SyntasticRegistryInstance._checkerMap = {} |         let s:SyntasticRegistryInstance._checkerMap = {} | ||||||
|         let s:SyntasticRegistryInstance._cachedCheckersFor = {} |  | ||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     return s:SyntasticRegistryInstance |     return s:SyntasticRegistryInstance | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticRegistry.CreateAndRegisterChecker(args) | function! g:SyntasticRegistry.CreateAndRegisterChecker(args) " {{{2 | ||||||
|     let checker = g:SyntasticChecker.New(a:args) |     let checker = g:SyntasticChecker.New(a:args) | ||||||
|     let registry = g:SyntasticRegistry.Instance() |     let registry = g:SyntasticRegistry.Instance() | ||||||
|     call registry._registerChecker(checker) |     call registry._registerChecker(checker) | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticRegistry.checkable(ftalias) | function! g:SyntasticRegistry.isCheckable(ftalias) " {{{2 | ||||||
|     return !empty(self.getActiveCheckers(a:ftalias)) |     let ft = s:normaliseFiletype(a:ftalias) | ||||||
| endfunction |     call self._loadCheckers(ft) | ||||||
|  |     return !empty(self._checkerMap[ft]) | ||||||
|  | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticRegistry.getActiveCheckers(ftalias) | function! g:SyntasticRegistry.getCheckersMap(ftalias) " {{{2 | ||||||
|     let filetype = s:SyntasticRegistryNormaliseFiletype(a:ftalias) |     let ft = s:normaliseFiletype(a:ftalias) | ||||||
|     let checkers = self.availableCheckersFor(a:ftalias) |     call self._loadCheckers(ft) | ||||||
|  |     return self._checkerMap[ft] | ||||||
|  | endfunction " }}}2 | ||||||
|  |  | ||||||
|     if self._userHasFiletypeSettings(filetype) | function! g:SyntasticRegistry.getCheckers(ftalias, list) " {{{2 | ||||||
|         return self._filterCheckersByUserSettings(checkers, filetype) |     let checkers_map = self.getCheckersMap(a:ftalias) | ||||||
|  |     if empty(checkers_map) | ||||||
|  |         return [] | ||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     if has_key(s:defaultCheckers, filetype) |     let ft = s:normaliseFiletype(a:ftalias) | ||||||
|         return self._filterCheckersByDefaultSettings(checkers, filetype) |     call self._checkDeprecation(ft) | ||||||
|     endif |  | ||||||
|  |  | ||||||
|     return checkers[0:0] |     let ft_list = | ||||||
| endfunction |         \ !empty(a:list) ? a:list : | ||||||
|  |         \ exists('b:syntastic_checkers') ? b:syntastic_checkers : | ||||||
|  |         \ exists('g:syntastic_' . ft . '_checkers') ? g:syntastic_{ft}_checkers : | ||||||
|  |         \ get(s:defaultCheckers, ft, []) | ||||||
|  |  | ||||||
| function! g:SyntasticRegistry.getCheckers(ftalias, list) |     return !empty(ft_list) ? | ||||||
|     return self._filterCheckersByName(self.availableCheckersFor(a:ftalias), a:list) |         \ self._filterCheckersByName(checkers_map, ft_list) : [checkers_map[keys(checkers_map)[0]]] | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticRegistry.availableCheckersFor(ftalias) | function! g:SyntasticRegistry.getKnownFiletypes() " {{{2 | ||||||
|     if !has_key(self._cachedCheckersFor, a:ftalias) |  | ||||||
|         let filetype = s:SyntasticRegistryNormaliseFiletype(a:ftalias) |  | ||||||
|         let checkers = self._allCheckersFor(filetype) |  | ||||||
|         let self._cachedCheckersFor[a:ftalias] = self._filterCheckersByAvailability(checkers) |  | ||||||
|     endif |  | ||||||
|  |  | ||||||
|     return self._cachedCheckersFor[a:ftalias] |  | ||||||
| endfunction |  | ||||||
|  |  | ||||||
| function! g:SyntasticRegistry.knownFiletypes() |  | ||||||
|     let types = keys(s:defaultCheckers) |     let types = keys(s:defaultCheckers) | ||||||
|  |  | ||||||
|     call extend(types, keys(s:defaultFiletypeMap)) |     call extend(types, keys(s:defaultFiletypeMap)) | ||||||
|  |  | ||||||
|     if exists('g:syntastic_filetype_map') |     if exists('g:syntastic_filetype_map') | ||||||
|         call extend(types, keys(g:syntastic_filetype_map)) |         call extend(types, keys(g:syntastic_filetype_map)) | ||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     if exists('g:syntastic_extra_filetypes') && type(g:syntastic_extra_filetypes) == type([]) |     if exists('g:syntastic_extra_filetypes') && type(g:syntastic_extra_filetypes) == type([]) | ||||||
|         call extend(types, g:syntastic_extra_filetypes) |         call extend(types, g:syntastic_extra_filetypes) | ||||||
|     endif |     endif | ||||||
|     return syntastic#util#unique(types) |  | ||||||
| endfunction |  | ||||||
|  |  | ||||||
| function! g:SyntasticRegistry.echoInfoFor(ftalias_list) |     return syntastic#util#unique(types) | ||||||
|  | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | function! g:SyntasticRegistry.echoInfoFor(ftalias_list) " {{{2 | ||||||
|     echomsg "Syntastic info for filetype: " . join(a:ftalias_list, '.') |     echomsg "Syntastic info for filetype: " . join(a:ftalias_list, '.') | ||||||
|  |  | ||||||
|  |     let ft_list = syntastic#util#unique(map( copy(a:ftalias_list), 's:normaliseFiletype(v:val)' )) | ||||||
|  |     if len(ft_list) != 1 | ||||||
|         let available = [] |         let available = [] | ||||||
|         let active = [] |         let active = [] | ||||||
|     for ftalias in a:ftalias_list |  | ||||||
|         call extend(available, self.availableCheckersFor(ftalias)) |  | ||||||
|         call extend(active, self.getActiveCheckers(ftalias)) |  | ||||||
|     endfor |  | ||||||
|  |  | ||||||
|     echomsg "Available checker(s): " . join(syntastic#util#unique(map(available, "v:val.getName()"))) |         for ft in ft_list | ||||||
|     echomsg "Currently enabled checker(s): " . join(syntastic#util#unique(map(active, "v:val.getName()"))) |             call extend(available, map( keys(self.getCheckersMap(ft)), 'ft . "/" . v:val' )) | ||||||
| endfunction |             call extend(active, map( self.getCheckers(ft, []), 'ft . "/" . v:val.getName()' )) | ||||||
|  |         endfor | ||||||
|  |     else | ||||||
|  |         let ft = ft_list[0] | ||||||
|  |         let available = keys(self.getCheckersMap(ft)) | ||||||
|  |         let active = map(self.getCheckers(ft, []), 'v:val.getName()') | ||||||
|  |     endif | ||||||
|  |  | ||||||
|  |     echomsg "Available checker(s): " . join(sort(available)) | ||||||
|  |     echomsg "Currently enabled checker(s): " . join(active) | ||||||
|  | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
| " Private methods {{{1 | " Private methods {{{1 | ||||||
|  |  | ||||||
| function! g:SyntasticRegistry._registerChecker(checker) abort | function! g:SyntasticRegistry._registerChecker(checker) abort " {{{2 | ||||||
|     let ft = a:checker.getFiletype() |     let ft = a:checker.getFiletype() | ||||||
|  |  | ||||||
|     if !has_key(self._checkerMap, ft) |     if !has_key(self._checkerRaw, ft) | ||||||
|         let self._checkerMap[ft] = [] |         let self._checkerRaw[ft] = [] | ||||||
|  |         let self._checkerMap[ft] = {} | ||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     call self._validateUniqueName(a:checker) |     call self._validateUniqueName(a:checker) | ||||||
|  |  | ||||||
|     call add(self._checkerMap[ft], a:checker) |     let name = a:checker.getName() | ||||||
| endfunction |     call add(self._checkerRaw[ft], name) | ||||||
|  |  | ||||||
| function! g:SyntasticRegistry._allCheckersFor(filetype) |     if a:checker.isAvailable() | ||||||
|     call self._loadCheckers(a:filetype) |         let self._checkerMap[ft][name] = a:checker | ||||||
|     if empty(self._checkerMap[a:filetype]) |  | ||||||
|         return [] |  | ||||||
|     endif |     endif | ||||||
|  | endfunction " }}}2 | ||||||
|  |  | ||||||
|     return self._checkerMap[a:filetype] | function! g:SyntasticRegistry._filterCheckersByName(checkers_map, list) " {{{2 | ||||||
| endfunction |     return filter( map(copy(a:list), 'get(a:checkers_map, v:val, {})'), '!empty(v:val)' ) | ||||||
|  | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticRegistry._filterCheckersByDefaultSettings(checkers, filetype) | function! g:SyntasticRegistry._loadCheckers(filetype) " {{{2 | ||||||
|     if has_key(s:defaultCheckers, a:filetype) |     if has_key(self._checkerRaw, a:filetype) | ||||||
|         return self._filterCheckersByName(a:checkers, s:defaultCheckers[a:filetype]) |  | ||||||
|     endif |  | ||||||
|  |  | ||||||
|     return a:checkers |  | ||||||
| endfunction |  | ||||||
|  |  | ||||||
| function! g:SyntasticRegistry._filterCheckersByUserSettings(checkers, filetype) |  | ||||||
|     if exists("b:syntastic_checkers") |  | ||||||
|         let whitelist = b:syntastic_checkers |  | ||||||
|     else |  | ||||||
|         let whitelist = g:syntastic_{a:filetype}_checkers |  | ||||||
|     endif |  | ||||||
|     return self._filterCheckersByName(a:checkers, whitelist) |  | ||||||
| endfunction |  | ||||||
|  |  | ||||||
| function! g:SyntasticRegistry._filterCheckersByName(checkers, list) |  | ||||||
|     let checkers_by_name = {} |  | ||||||
|     for c in a:checkers |  | ||||||
|         let checkers_by_name[c.getName()] = c |  | ||||||
|     endfor |  | ||||||
|  |  | ||||||
|     let filtered = [] |  | ||||||
|     for name in a:list |  | ||||||
|         if has_key(checkers_by_name, name) |  | ||||||
|             call add(filtered, checkers_by_name[name]) |  | ||||||
|         endif |  | ||||||
|     endfor |  | ||||||
|  |  | ||||||
|     return filtered |  | ||||||
| endfunction |  | ||||||
|  |  | ||||||
| function! g:SyntasticRegistry._filterCheckersByAvailability(checkers) |  | ||||||
|     return filter(copy(a:checkers), "v:val.isAvailable()") |  | ||||||
| endfunction |  | ||||||
|  |  | ||||||
| function! g:SyntasticRegistry._loadCheckers(filetype) |  | ||||||
|     if self._haveLoadedCheckers(a:filetype) |  | ||||||
|         return |         return | ||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     execute "runtime! syntax_checkers/" . a:filetype . "/*.vim" |     execute "runtime! syntax_checkers/" . a:filetype . "/*.vim" | ||||||
|  |  | ||||||
|     if !has_key(self._checkerMap, a:filetype) |     if !has_key(self._checkerRaw, a:filetype) | ||||||
|         let self._checkerMap[a:filetype] = [] |         let self._checkerRaw[a:filetype] = [] | ||||||
|  |         let self._checkerMap[a:filetype] = {} | ||||||
|     endif |     endif | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticRegistry._haveLoadedCheckers(filetype) | function! g:SyntasticRegistry._validateUniqueName(checker) abort " {{{2 | ||||||
|     return has_key(self._checkerMap, a:filetype) |     let ft = a:checker.getFiletype() | ||||||
| endfunction |     let name = a:checker.getName() | ||||||
|  |     if index(self._checkerRaw[ft], name) > -1 | ||||||
|  |         throw 'Syntastic: Duplicate syntax checker name: ' . ft . '/' . name | ||||||
|  |     endif | ||||||
|  | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticRegistry._userHasFiletypeSettings(filetype) | " Check for obsolete variable g:syntastic_<filetype>_checker | ||||||
|     if exists("g:syntastic_" . a:filetype . "_checker") && !exists("g:syntastic_" . a:filetype . "_checkers") | function! g:SyntasticRegistry._checkDeprecation(filetype) " {{{2 | ||||||
|  |     if exists('g:syntastic_' . a:filetype . '_checker') && !exists('g:syntastic_' . a:filetype . '_checkers') | ||||||
|         let g:syntastic_{a:filetype}_checkers = [g:syntastic_{a:filetype}_checker] |         let g:syntastic_{a:filetype}_checkers = [g:syntastic_{a:filetype}_checker] | ||||||
|         call syntastic#log#deprecationWarn("variable g:syntastic_" . a:filetype . "_checker is deprecated") |         call syntastic#log#deprecationWarn('variable g:syntastic_' . a:filetype . '_checker is deprecated') | ||||||
|     endif |     endif | ||||||
|     return exists("b:syntastic_checkers") || exists("g:syntastic_" . a:filetype . "_checkers") | endfunction " }}}2 | ||||||
| endfunction |  | ||||||
|  |  | ||||||
| function! g:SyntasticRegistry._validateUniqueName(checker) abort | " }}}1 | ||||||
|     for checker in self._allCheckersFor(a:checker.getFiletype()) |  | ||||||
|         if checker.getName() ==# a:checker.getName() |  | ||||||
|             throw "Syntastic: Duplicate syntax checker name for: " . a:checker.getName() |  | ||||||
|         endif |  | ||||||
|     endfor |  | ||||||
| endfunction |  | ||||||
|  |  | ||||||
| " Private functions {{{1 | " Private functions {{{1 | ||||||
|  |  | ||||||
| "resolve filetype aliases, and replace - with _ otherwise we cant name | "resolve filetype aliases, and replace - with _ otherwise we cant name | ||||||
| "syntax checker functions legally for filetypes like "gentoo-metadata" | "syntax checker functions legally for filetypes like "gentoo-metadata" | ||||||
| function! s:SyntasticRegistryNormaliseFiletype(ftalias) | function! s:normaliseFiletype(ftalias) " {{{2 | ||||||
|     let ft = get(s:defaultFiletypeMap, a:ftalias, a:ftalias) |     let ft = get(s:defaultFiletypeMap, a:ftalias, a:ftalias) | ||||||
|     let ft = get(g:syntastic_filetype_map, ft, ft) |     let ft = get(g:syntastic_filetype_map, ft, ft) | ||||||
|     let ft = substitute(ft, '\m-', '_', 'g') |     let ft = substitute(ft, '\m-', '_', 'g') | ||||||
|     return ft |     return ft | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
| " vim: set sw=4 sts=4 et fdm=marker: | " vim: set sw=4 sts=4 et fdm=marker: | ||||||
|  | |||||||
| @ -1,28 +1,9 @@ | |||||||
| if exists("g:loaded_syntastic_notifier_signs") | if exists("g:loaded_syntastic_notifier_signs") || !exists("g:loaded_syntastic_plugin") | ||||||
|     finish |     finish | ||||||
| endif | endif | ||||||
| let g:loaded_syntastic_notifier_signs = 1 | let g:loaded_syntastic_notifier_signs = 1 | ||||||
|  |  | ||||||
| if !exists("g:syntastic_enable_signs") | " Initialisation {{{1 | ||||||
|     let g:syntastic_enable_signs = 1 |  | ||||||
| endif |  | ||||||
|  |  | ||||||
| if !exists("g:syntastic_error_symbol") |  | ||||||
|     let g:syntastic_error_symbol = '>>' |  | ||||||
| endif |  | ||||||
|  |  | ||||||
| if !exists("g:syntastic_warning_symbol") |  | ||||||
|     let g:syntastic_warning_symbol = '>>' |  | ||||||
| endif |  | ||||||
|  |  | ||||||
| if !exists("g:syntastic_style_error_symbol") |  | ||||||
|     let g:syntastic_style_error_symbol = 'S>' |  | ||||||
| endif |  | ||||||
|  |  | ||||||
| if !exists("g:syntastic_style_warning_symbol") |  | ||||||
|     let g:syntastic_style_warning_symbol = 'S>' |  | ||||||
| endif |  | ||||||
|  |  | ||||||
|  |  | ||||||
| " start counting sign ids at 5000, start here to hopefully avoid conflicting | " start counting sign ids at 5000, start here to hopefully avoid conflicting | ||||||
| " with any other code that places signs (not sure if this precaution is | " with any other code that places signs (not sure if this precaution is | ||||||
| @ -34,9 +15,11 @@ let g:SyntasticSignsNotifier = {} | |||||||
|  |  | ||||||
| let s:setup_done = 0 | let s:setup_done = 0 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
| " Public methods {{{1 | " Public methods {{{1 | ||||||
|  |  | ||||||
| function! g:SyntasticSignsNotifier.New() | function! g:SyntasticSignsNotifier.New() " {{{2 | ||||||
|     let newObj = copy(self) |     let newObj = copy(self) | ||||||
|  |  | ||||||
|     if !s:setup_done |     if !s:setup_done | ||||||
| @ -45,13 +28,13 @@ function! g:SyntasticSignsNotifier.New() | |||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     return newObj |     return newObj | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticSignsNotifier.enabled() | function! g:SyntasticSignsNotifier.enabled() " {{{2 | ||||||
|     return has('signs') && syntastic#util#var('enable_signs') |     return has('signs') && syntastic#util#var('enable_signs') | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| function! g:SyntasticSignsNotifier.refresh(loclist) | function! g:SyntasticSignsNotifier.refresh(loclist) " {{{2 | ||||||
|     call syntastic#log#debug(g:SyntasticDebugNotifications, 'signs: refresh') |     call syntastic#log#debug(g:SyntasticDebugNotifications, 'signs: refresh') | ||||||
|     let old_signs = copy(self._bufSignIds()) |     let old_signs = copy(self._bufSignIds()) | ||||||
|     if self.enabled() |     if self.enabled() | ||||||
| @ -59,12 +42,14 @@ function! g:SyntasticSignsNotifier.refresh(loclist) | |||||||
|     endif |     endif | ||||||
|     call self._removeSigns(old_signs) |     call self._removeSigns(old_signs) | ||||||
|     let s:first_sign_id = s:next_sign_id |     let s:first_sign_id = s:next_sign_id | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
| " Private methods {{{1 | " Private methods {{{1 | ||||||
|  |  | ||||||
| " One time setup: define our own sign types and highlighting | " One time setup: define our own sign types and highlighting | ||||||
| function! g:SyntasticSignsNotifier._setup() | function! g:SyntasticSignsNotifier._setup() " {{{2 | ||||||
|     if has('signs') |     if has('signs') | ||||||
|         if !hlexists('SyntasticErrorSign') |         if !hlexists('SyntasticErrorSign') | ||||||
|             highlight link SyntasticErrorSign error |             highlight link SyntasticErrorSign error | ||||||
| @ -95,10 +80,10 @@ function! g:SyntasticSignsNotifier._setup() | |||||||
|         exe 'sign define SyntasticStyleWarning text=' . g:syntastic_style_warning_symbol . |         exe 'sign define SyntasticStyleWarning text=' . g:syntastic_style_warning_symbol . | ||||||
|             \ ' texthl=SyntasticStyleWarningSign linehl=SyntasticStyleWarningLine' |             \ ' texthl=SyntasticStyleWarningSign linehl=SyntasticStyleWarningLine' | ||||||
|     endif |     endif | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " Place signs by all syntax errors in the buffer | " Place signs by all syntax errors in the buffer | ||||||
| function! g:SyntasticSignsNotifier._signErrors(loclist) | function! g:SyntasticSignsNotifier._signErrors(loclist) " {{{2 | ||||||
|     let loclist = a:loclist |     let loclist = a:loclist | ||||||
|     if !loclist.isEmpty() |     if !loclist.isEmpty() | ||||||
|  |  | ||||||
| @ -123,24 +108,26 @@ function! g:SyntasticSignsNotifier._signErrors(loclist) | |||||||
|             endif |             endif | ||||||
|         endfor |         endfor | ||||||
|     endif |     endif | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " Remove the signs with the given ids from this buffer | " Remove the signs with the given ids from this buffer | ||||||
| function! g:SyntasticSignsNotifier._removeSigns(ids) | function! g:SyntasticSignsNotifier._removeSigns(ids) " {{{2 | ||||||
|     if has('signs') |     if has('signs') | ||||||
|         for i in a:ids |         for i in a:ids | ||||||
|             execute "sign unplace " . i |             execute "sign unplace " . i | ||||||
|             call remove(self._bufSignIds(), index(self._bufSignIds(), i)) |             call remove(self._bufSignIds(), index(self._bufSignIds(), i)) | ||||||
|         endfor |         endfor | ||||||
|     endif |     endif | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
| " Get all the ids of the SyntaxError signs in the buffer | " Get all the ids of the SyntaxError signs in the buffer | ||||||
| function! g:SyntasticSignsNotifier._bufSignIds() | function! g:SyntasticSignsNotifier._bufSignIds() " {{{2 | ||||||
|     if !exists("b:syntastic_sign_ids") |     if !exists("b:syntastic_sign_ids") | ||||||
|         let b:syntastic_sign_ids = [] |         let b:syntastic_sign_ids = [] | ||||||
|     endif |     endif | ||||||
|     return b:syntastic_sign_ids |     return b:syntastic_sign_ids | ||||||
| endfunction | endfunction " }}}2 | ||||||
|  |  | ||||||
|  | " }}}1 | ||||||
|  |  | ||||||
| " vim: set sw=4 sts=4 et fdm=marker: | " vim: set sw=4 sts=4 et fdm=marker: | ||||||
|  | |||||||
| @ -28,10 +28,6 @@ endif | |||||||
| let s:save_cpo = &cpo | let s:save_cpo = &cpo | ||||||
| set cpo&vim | set cpo&vim | ||||||
|  |  | ||||||
| function! SyntaxCheckers_c_cppcheck_Preprocess(errors) |  | ||||||
|     return map(copy(a:errors), 'substitute(v:val, ''\v^\[[^]]+\]\zs( -\> \[[^]]+\])+\ze:'', "", "")') |  | ||||||
| endfunction |  | ||||||
|  |  | ||||||
| function! SyntaxCheckers_c_cppcheck_GetLocList() dict | function! SyntaxCheckers_c_cppcheck_GetLocList() dict | ||||||
|     let makeprg = self.makeprgBuild({ |     let makeprg = self.makeprgBuild({ | ||||||
|         \ 'args': syntastic#c#ReadConfig(g:syntastic_cppcheck_config_file), |         \ 'args': syntastic#c#ReadConfig(g:syntastic_cppcheck_config_file), | ||||||
| @ -50,7 +46,7 @@ function! SyntaxCheckers_c_cppcheck_GetLocList() dict | |||||||
|     let loclist = SyntasticMake({ |     let loclist = SyntasticMake({ | ||||||
|         \ 'makeprg': makeprg, |         \ 'makeprg': makeprg, | ||||||
|         \ 'errorformat': errorformat, |         \ 'errorformat': errorformat, | ||||||
|         \ 'preprocess': 'SyntaxCheckers_c_cppcheck_Preprocess', |         \ 'preprocess': 'cppcheck', | ||||||
|         \ 'returns': [0] }) |         \ 'returns': [0] }) | ||||||
|  |  | ||||||
|     for e in loclist |     for e in loclist | ||||||
|  | |||||||
| @ -54,7 +54,7 @@ function! s:GhcModNew(exe) | |||||||
|     try |     try | ||||||
|         let ghc_mod_version = filter(split(system(exe), '\n'), 'v:val =~# ''\m^ghc-mod version''')[0] |         let ghc_mod_version = filter(split(system(exe), '\n'), 'v:val =~# ''\m^ghc-mod version''')[0] | ||||||
|         let ret = syntastic#util#versionIsAtLeast(syntastic#util#parseVersion(ghc_mod_version), [2, 1, 2]) |         let ret = syntastic#util#versionIsAtLeast(syntastic#util#parseVersion(ghc_mod_version), [2, 1, 2]) | ||||||
|     catch /^Vim\%((\a\+)\)\=:E684/ |     catch /\m^Vim\%((\a\+)\)\=:E684/ | ||||||
|         call syntastic#log#error("checker haskell/ghc_mod: can't parse version string (abnormal termination?)") |         call syntastic#log#error("checker haskell/ghc_mod: can't parse version string (abnormal termination?)") | ||||||
|         let ret = -1 |         let ret = -1 | ||||||
|     endtry |     endtry | ||||||
|  | |||||||
| @ -42,7 +42,8 @@ function! SyntaxCheckers_html_jshint_GetLocList() dict | |||||||
|     return SyntasticMake({ |     return SyntasticMake({ | ||||||
|         \ 'makeprg': makeprg, |         \ 'makeprg': makeprg, | ||||||
|         \ 'errorformat': errorformat, |         \ 'errorformat': errorformat, | ||||||
|         \ 'defaults': {'bufnr': bufnr('')} }) |         \ 'defaults': {'bufnr': bufnr('')}, | ||||||
|  |         \ 'returns': [0, 2] }) | ||||||
| endfunction | endfunction | ||||||
|  |  | ||||||
| call g:SyntasticRegistry.CreateAndRegisterChecker({ | call g:SyntasticRegistry.CreateAndRegisterChecker({ | ||||||
|  | |||||||
| @ -48,21 +48,6 @@ endif | |||||||
| let s:save_cpo = &cpo | let s:save_cpo = &cpo | ||||||
| set cpo&vim | set cpo&vim | ||||||
|  |  | ||||||
| function! SyntaxCheckers_html_validator_Preprocess(errors) |  | ||||||
|     let out = [] |  | ||||||
|     for e in a:errors |  | ||||||
|         let parts = matchlist(e, '\v^"([^"]+)"(.+)') |  | ||||||
|         if len(parts) >= 3 |  | ||||||
|             " URL decode, except leave alone any "+" |  | ||||||
|             let parts[1] = substitute(parts[1], '\m%\(\x\x\)', '\=nr2char("0x".submatch(1))', 'g') |  | ||||||
|             let parts[1] = substitute(parts[1], '\m\\"', '"', 'g') |  | ||||||
|             let parts[1] = substitute(parts[1], '\m\\\\', '\\', 'g') |  | ||||||
|             call add(out, '"' . parts[1] . '"' . parts[2]) |  | ||||||
|         endif |  | ||||||
|     endfor |  | ||||||
|     return out |  | ||||||
| endfunction |  | ||||||
|  |  | ||||||
| function! SyntaxCheckers_html_validator_GetLocList() dict | function! SyntaxCheckers_html_validator_GetLocList() dict | ||||||
|     let fname = syntastic#util#shexpand('%') |     let fname = syntastic#util#shexpand('%') | ||||||
|     let makeprg = self.getExecEscaped() . ' -s --compressed -F out=gnu -F asciiquotes=yes' . |     let makeprg = self.getExecEscaped() . ' -s --compressed -F out=gnu -F asciiquotes=yes' . | ||||||
| @ -87,7 +72,7 @@ function! SyntaxCheckers_html_validator_GetLocList() dict | |||||||
|     return SyntasticMake({ |     return SyntasticMake({ | ||||||
|         \ 'makeprg': makeprg, |         \ 'makeprg': makeprg, | ||||||
|         \ 'errorformat': errorformat, |         \ 'errorformat': errorformat, | ||||||
|         \ 'preprocess': 'SyntaxCheckers_html_validator_Preprocess', |         \ 'preprocess': 'validator', | ||||||
|         \ 'returns': [0] }) |         \ 'returns': [0] }) | ||||||
| endfunction | endfunction | ||||||
|  |  | ||||||
|  | |||||||
| @ -27,33 +27,6 @@ endif | |||||||
| let s:save_cpo = &cpo | let s:save_cpo = &cpo | ||||||
| set cpo&vim | set cpo&vim | ||||||
|  |  | ||||||
| function! SyntaxCheckers_java_checkstyle_Preprocess(errors) |  | ||||||
|     let out = [] |  | ||||||
|     let fname = expand('%') |  | ||||||
|     for err in a:errors |  | ||||||
|         if match(err, '\m<error\>') > -1 |  | ||||||
|             let line = str2nr(matchstr(err, '\m\<line="\zs\d\+\ze"')) |  | ||||||
|             if line == 0 |  | ||||||
|                 continue |  | ||||||
|             endif |  | ||||||
|  |  | ||||||
|             let col = str2nr(matchstr(err, '\m\<column="\zs\d\+\ze"')) |  | ||||||
|  |  | ||||||
|             let type = matchstr(err, '\m\<severity="\zs.\ze') |  | ||||||
|             if type !~? '^[EW]' |  | ||||||
|                 let type = 'E' |  | ||||||
|             endif |  | ||||||
|  |  | ||||||
|             let message = syntastic#util#decodeXMLEntities(matchstr(err, '\m\<message="\zs[^"]\+\ze"')) |  | ||||||
|  |  | ||||||
|             call add(out, join([fname, type, line, col, message], ':')) |  | ||||||
|         elseif match(err, '\m<file name="') > -1 |  | ||||||
|             let fname = syntastic#util#decodeXMLEntities(matchstr(err, '\v\<file name\="\zs[^"]+\ze"')) |  | ||||||
|         endif |  | ||||||
|     endfor |  | ||||||
|     return out |  | ||||||
| endfunction |  | ||||||
|  |  | ||||||
| function! SyntaxCheckers_java_checkstyle_GetLocList() dict | function! SyntaxCheckers_java_checkstyle_GetLocList() dict | ||||||
|  |  | ||||||
|     let fname = syntastic#util#shescape( expand('%:p:h') . '/' . expand('%:t') ) |     let fname = syntastic#util#shescape( expand('%:p:h') . '/' . expand('%:t') ) | ||||||
| @ -73,8 +46,8 @@ function! SyntaxCheckers_java_checkstyle_GetLocList() dict | |||||||
|     return SyntasticMake({ |     return SyntasticMake({ | ||||||
|         \ 'makeprg': makeprg, |         \ 'makeprg': makeprg, | ||||||
|         \ 'errorformat': errorformat, |         \ 'errorformat': errorformat, | ||||||
|         \ 'subtype': 'Style', |         \ 'preprocess': 'checkstyle', | ||||||
|         \ 'preprocess': 'SyntaxCheckers_java_checkstyle_Preprocess' }) |         \ 'subtype': 'Style' }) | ||||||
| endfunction | endfunction | ||||||
|  |  | ||||||
| call g:SyntasticRegistry.CreateAndRegisterChecker({ | call g:SyntasticRegistry.CreateAndRegisterChecker({ | ||||||
|  | |||||||
| @ -17,9 +17,6 @@ let g:loaded_syntastic_javascript_jscs_checker = 1 | |||||||
| let s:save_cpo = &cpo | let s:save_cpo = &cpo | ||||||
| set cpo&vim | set cpo&vim | ||||||
|  |  | ||||||
| " we borrow SyntaxCheckers_java_checkstyle_Preprocess() from java/checkstyle |  | ||||||
| runtime! syntax_checkers/java/*.vim |  | ||||||
|  |  | ||||||
| function! SyntaxCheckers_javascript_jscs_GetLocList() dict | function! SyntaxCheckers_javascript_jscs_GetLocList() dict | ||||||
|     let makeprg = self.makeprgBuild({ 'args_after': '--no-colors --reporter checkstyle' }) |     let makeprg = self.makeprgBuild({ 'args_after': '--no-colors --reporter checkstyle' }) | ||||||
|     let errorformat = '%f:%t:%l:%c:%m' |     let errorformat = '%f:%t:%l:%c:%m' | ||||||
| @ -27,9 +24,9 @@ function! SyntaxCheckers_javascript_jscs_GetLocList() dict | |||||||
|         \ 'makeprg': makeprg, |         \ 'makeprg': makeprg, | ||||||
|         \ 'errorformat': errorformat, |         \ 'errorformat': errorformat, | ||||||
|         \ 'subtype': 'Style', |         \ 'subtype': 'Style', | ||||||
|         \ 'preprocess': 'SyntaxCheckers_java_checkstyle_Preprocess', |         \ 'preprocess': 'checkstyle', | ||||||
|         \ 'postprocess': ['sort'], |         \ 'postprocess': ['sort'], | ||||||
|         \ 'returns': [0] }) |         \ 'returns': [0, 2] }) | ||||||
| endfunction | endfunction | ||||||
|  |  | ||||||
| call g:SyntasticRegistry.CreateAndRegisterChecker({ | call g:SyntasticRegistry.CreateAndRegisterChecker({ | ||||||
|  | |||||||
| @ -47,7 +47,8 @@ function! SyntaxCheckers_javascript_jshint_GetLocList() dict | |||||||
|     return SyntasticMake({ |     return SyntasticMake({ | ||||||
|         \ 'makeprg': makeprg, |         \ 'makeprg': makeprg, | ||||||
|         \ 'errorformat': errorformat, |         \ 'errorformat': errorformat, | ||||||
|         \ 'defaults': {'bufnr': bufnr('')} }) |         \ 'defaults': {'bufnr': bufnr('')}, | ||||||
|  |         \ 'returns': [0, 2] }) | ||||||
| endfunction | endfunction | ||||||
|  |  | ||||||
| call g:SyntasticRegistry.CreateAndRegisterChecker({ | call g:SyntasticRegistry.CreateAndRegisterChecker({ | ||||||
|  | |||||||
| @ -0,0 +1,51 @@ | |||||||
|  | "============================================================================ | ||||||
|  | "File:        jsxhint.vim | ||||||
|  | "Description: Javascript syntax checker - using jsxhint | ||||||
|  | "Maintainer:  Thomas Boyt <me@thomasboyt.com> | ||||||
|  | "License:     This program is free software. It comes without any warranty, | ||||||
|  | "             to the extent permitted by applicable law. You can redistribute | ||||||
|  | "             it and/or modify it under the terms of the Do What The Fuck You | ||||||
|  | "             Want To Public License, Version 2, as published by Sam Hocevar. | ||||||
|  | "             See http://sam.zoy.org/wtfpl/COPYING for more details. | ||||||
|  | "============================================================================ | ||||||
|  |  | ||||||
|  | if exists('g:loaded_syntastic_javascript_jsxhint_checker') | ||||||
|  |     finish | ||||||
|  | endif | ||||||
|  | let g:loaded_syntastic_javascript_jsxhint_checker = 1 | ||||||
|  |  | ||||||
|  | let s:save_cpo = &cpo | ||||||
|  | set cpo&vim | ||||||
|  |  | ||||||
|  | function! SyntaxCheckers_javascript_jsxhint_IsAvailable() dict | ||||||
|  |     if !executable('jshint') || !syntastic#util#versionIsAtLeast(syntastic#util#getVersion('jshint --version'), [1, 1]) | ||||||
|  |         return 0 | ||||||
|  |     endif | ||||||
|  |  | ||||||
|  |     let jsxhint_version = system(self.getExecEscaped() . ' --version') | ||||||
|  |     return | ||||||
|  |         \ v:shell_error == 0 && | ||||||
|  |         \ jsxhint_version =~# '\m^JSXHint\>' && | ||||||
|  |         \ syntastic#util#versionIsAtLeast(syntastic#util#parseVersion(jsxhint_version), [0, 4, 1]) | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | function! SyntaxCheckers_javascript_jsxhint_GetLocList() dict | ||||||
|  |     let makeprg = self.makeprgBuild({ | ||||||
|  |         \ 'args_after': '--verbose' }) | ||||||
|  |  | ||||||
|  |     let errorformat = '%A%f: line %l\, col %v\, %m \(%t%*\d\)' | ||||||
|  |  | ||||||
|  |     return SyntasticMake({ | ||||||
|  |         \ 'makeprg': makeprg, | ||||||
|  |         \ 'errorformat': errorformat, | ||||||
|  |         \ 'defaults': {'bufnr': bufnr('')} }) | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | call g:SyntasticRegistry.CreateAndRegisterChecker({ | ||||||
|  |     \ 'filetype': 'javascript', | ||||||
|  |     \ 'name': 'jsxhint'}) | ||||||
|  |  | ||||||
|  | let &cpo = s:save_cpo | ||||||
|  | unlet s:save_cpo | ||||||
|  |  | ||||||
|  | " vim: set et sts=4 sw=4: | ||||||
| @ -44,19 +44,6 @@ function! SyntaxCheckers_perl_perl_IsAvailable() dict | |||||||
|     return v:shell_error == 0 |     return v:shell_error == 0 | ||||||
| endfunction | endfunction | ||||||
|  |  | ||||||
| function! SyntaxCheckers_perl_perl_Preprocess(errors) |  | ||||||
|     let out = [] |  | ||||||
|  |  | ||||||
|     for e in a:errors |  | ||||||
|         let parts = matchlist(e, '\v^(.*)\sat\s(.*)\sline\s(\d+)(.*)$') |  | ||||||
|         if !empty(parts) |  | ||||||
|             call add(out, parts[2] . ':' . parts[3] . ':' . parts[1] . parts[4]) |  | ||||||
|         endif |  | ||||||
|     endfor |  | ||||||
|  |  | ||||||
|     return syntastic#util#unique(out) |  | ||||||
| endfunction |  | ||||||
|  |  | ||||||
| function! SyntaxCheckers_perl_perl_GetLocList() dict | function! SyntaxCheckers_perl_perl_GetLocList() dict | ||||||
|     let exe = expand(g:syntastic_perl_interpreter) |     let exe = expand(g:syntastic_perl_interpreter) | ||||||
|     if type(g:syntastic_perl_lib_path) == type('') |     if type(g:syntastic_perl_lib_path) == type('') | ||||||
| @ -78,7 +65,7 @@ function! SyntaxCheckers_perl_perl_GetLocList() dict | |||||||
|     let errors = SyntasticMake({ |     let errors = SyntasticMake({ | ||||||
|         \ 'makeprg': makeprg, |         \ 'makeprg': makeprg, | ||||||
|         \ 'errorformat': errorformat, |         \ 'errorformat': errorformat, | ||||||
|         \ 'preprocess': 'SyntaxCheckers_perl_perl_Preprocess', |         \ 'preprocess': 'perl', | ||||||
|         \ 'defaults': {'type': 'E'} }) |         \ 'defaults': {'type': 'E'} }) | ||||||
|     if !empty(errors) |     if !empty(errors) | ||||||
|         return errors |         return errors | ||||||
| @ -91,7 +78,7 @@ function! SyntaxCheckers_perl_perl_GetLocList() dict | |||||||
|     return SyntasticMake({ |     return SyntasticMake({ | ||||||
|         \ 'makeprg': makeprg, |         \ 'makeprg': makeprg, | ||||||
|         \ 'errorformat': errorformat, |         \ 'errorformat': errorformat, | ||||||
|         \ 'preprocess': 'SyntaxCheckers_perl_perl_Preprocess', |         \ 'preprocess': 'perl', | ||||||
|         \ 'defaults': {'type': 'W'} }) |         \ 'defaults': {'type': 'W'} }) | ||||||
| endfunction | endfunction | ||||||
|  |  | ||||||
|  | |||||||
| @ -23,7 +23,8 @@ set cpo&vim | |||||||
|  |  | ||||||
| function! SyntaxCheckers_php_phpcs_GetLocList() dict | function! SyntaxCheckers_php_phpcs_GetLocList() dict | ||||||
|     let makeprg = self.makeprgBuild({ |     let makeprg = self.makeprgBuild({ | ||||||
|         \ 'args_after': '--report=csv --tab-width=' . &tabstop }) |         \ 'args': '--tab-width=' . &tabstop, | ||||||
|  |         \ 'args_after': '--report=csv' }) | ||||||
|  |  | ||||||
|     let errorformat = |     let errorformat = | ||||||
|         \ '%-GFile\,Line\,Column\,Type\,Message\,Source\,Severity,'. |         \ '%-GFile\,Line\,Column\,Type\,Message\,Source\,Severity,'. | ||||||
|  | |||||||
| @ -13,11 +13,6 @@ let g:loaded_syntastic_python_pep257_checker = 1 | |||||||
| let s:save_cpo = &cpo | let s:save_cpo = &cpo | ||||||
| set cpo&vim | set cpo&vim | ||||||
|  |  | ||||||
| " sanity: kill empty lines here rather than munging errorformat |  | ||||||
| function! SyntaxCheckers_python_pep257_Preprocess(errors) |  | ||||||
|     return filter(copy(a:errors), 'v:val != ""') |  | ||||||
| endfunction |  | ||||||
|  |  | ||||||
| function! SyntaxCheckers_python_pep257_GetLocList() dict | function! SyntaxCheckers_python_pep257_GetLocList() dict | ||||||
|     let makeprg = self.makeprgBuild({}) |     let makeprg = self.makeprgBuild({}) | ||||||
|  |  | ||||||
| @ -30,7 +25,7 @@ function! SyntaxCheckers_python_pep257_GetLocList() dict | |||||||
|         \ 'makeprg': makeprg, |         \ 'makeprg': makeprg, | ||||||
|         \ 'errorformat': errorformat, |         \ 'errorformat': errorformat, | ||||||
|         \ 'subtype': 'Style', |         \ 'subtype': 'Style', | ||||||
|         \ 'preprocess': 'SyntaxCheckers_python_pep257_Preprocess', |         \ 'preprocess': 'killEmpty', | ||||||
|         \ 'postprocess': ['compressWhitespace'] }) |         \ 'postprocess': ['compressWhitespace'] }) | ||||||
|  |  | ||||||
|     " pep257 outputs byte offsets rather than column numbers |     " pep257 outputs byte offsets rather than column numbers | ||||||
|  | |||||||
| @ -45,6 +45,7 @@ function! SyntaxCheckers_python_pyflakes_GetLocList() dict | |||||||
|     let errorformat = |     let errorformat = | ||||||
|         \ '%E%f:%l: could not compile,'. |         \ '%E%f:%l: could not compile,'. | ||||||
|         \ '%-Z%p^,'. |         \ '%-Z%p^,'. | ||||||
|  |         \ '%E%f:%l:%c: %m,'. | ||||||
|         \ '%E%f:%l: %m,'. |         \ '%E%f:%l: %m,'. | ||||||
|         \ '%-G%.%#' |         \ '%-G%.%#' | ||||||
|  |  | ||||||
|  | |||||||
| @ -62,11 +62,13 @@ function! s:PylintNew(exe) | |||||||
|     let exe = syntastic#util#shescape(a:exe) |     let exe = syntastic#util#shescape(a:exe) | ||||||
|     try |     try | ||||||
|         " On Windows the version is shown as "pylint-script.py 1.0.0". |         " On Windows the version is shown as "pylint-script.py 1.0.0". | ||||||
|         " On Gentoo Linux it's "pylint-python2.7 0.28.0".  Oh, joy. :) |         " On Gentoo Linux it's "pylint-python2.7 0.28.0". | ||||||
|         let pylint_version = filter(split(system(exe . ' --version'), '\m, \=\|\n'), 'v:val =~# ''\m^pylint\>''')[0] |         " On NixOS, that would be ".pylint-wrapped 0.26.0", that would be. | ||||||
|  |         " Have you guys considered switching to creative writing yet? ;) | ||||||
|  |         let pylint_version = filter(split(system(exe . ' --version'), '\m, \=\|\n'), 'v:val =~# ''\m^\.\=pylint\>''')[0] | ||||||
|         let pylint_version = substitute(pylint_version, '\v^\S+\s+', '', '') |         let pylint_version = substitute(pylint_version, '\v^\S+\s+', '', '') | ||||||
|         let ret = syntastic#util#versionIsAtLeast(syntastic#util#parseVersion(pylint_version), [1]) |         let ret = syntastic#util#versionIsAtLeast(syntastic#util#parseVersion(pylint_version), [1]) | ||||||
|     catch /^Vim\%((\a\+)\)\=:E684/ |     catch /\m^Vim\%((\a\+)\)\=:E684/ | ||||||
|         call syntastic#log#error("checker python/pylint: can't parse version string (abnormal termination?)") |         call syntastic#log#error("checker python/pylint: can't parse version string (abnormal termination?)") | ||||||
|         let ret = -1 |         let ret = -1 | ||||||
|     endtry |     endtry | ||||||
|  | |||||||
| @ -41,12 +41,11 @@ endfunction | |||||||
|  |  | ||||||
| function! s:ForwardToZshChecker() | function! s:ForwardToZshChecker() | ||||||
|     let registry = g:SyntasticRegistry.Instance() |     let registry = g:SyntasticRegistry.Instance() | ||||||
|     if registry.checkable('zsh') |     if registry.isCheckable('zsh') | ||||||
|         return registry.getCheckers('zsh', ['zsh'])[0].getLocListRaw() |         return registry.getCheckers('zsh', ['zsh'])[0].getLocListRaw() | ||||||
|     else |     else | ||||||
|         return [] |         return [] | ||||||
|     endif |     endif | ||||||
|  |  | ||||||
| endfunction | endfunction | ||||||
|  |  | ||||||
| function! s:IsShellValid() | function! s:IsShellValid() | ||||||
|  | |||||||
| @ -40,7 +40,7 @@ function! SyntaxCheckers_vim_vimlint_IsAvailable() dict | |||||||
|     try |     try | ||||||
|         call vimlint#vimlint(syntastic#util#DevNull(), { 'output': [], 'quiet': 1 }) |         call vimlint#vimlint(syntastic#util#DevNull(), { 'output': [], 'quiet': 1 }) | ||||||
|         let ret = 1 |         let ret = 1 | ||||||
|     catch /^Vim\%((\a\+)\)\=:E117/ |     catch /\m^Vim\%((\a\+)\)\=:E117/ | ||||||
|         " do nothing |         " do nothing | ||||||
|     endtry |     endtry | ||||||
|     return ret |     return ret | ||||||
|  | |||||||
| @ -69,7 +69,8 @@ endfunction | |||||||
|  |  | ||||||
| call g:SyntasticRegistry.CreateAndRegisterChecker({ | call g:SyntasticRegistry.CreateAndRegisterChecker({ | ||||||
|     \ 'filetype': 'yaml', |     \ 'filetype': 'yaml', | ||||||
|     \ 'name': 'yamlxs' }) |     \ 'name': 'yamlxs', | ||||||
|  |     \ 'exec': 'perl' }) | ||||||
|  |  | ||||||
| let &cpo = s:save_cpo | let &cpo = s:save_cpo | ||||||
| unlet s:save_cpo | unlet s:save_cpo | ||||||
|  | |||||||
| @ -168,7 +168,8 @@ function! airline#extensions#load() | |||||||
|   endif |   endif | ||||||
|  |  | ||||||
|   if (get(g:, 'airline#extensions#branch#enabled', 1) && get(g:, 'airline_enable_branch', 1)) |   if (get(g:, 'airline#extensions#branch#enabled', 1) && get(g:, 'airline_enable_branch', 1)) | ||||||
|         \ && (exists('*fugitive#head') || exists('*lawrencium#statusline')) |         \ && (exists('*fugitive#head') || exists('*lawrencium#statusline') || | ||||||
|  |         \     (get(g:, 'airline#extensions#branch#use_vcscommand', 0) && exists('*VCSCommandGetStatusLine'))) | ||||||
|     call airline#extensions#branch#init(s:ext) |     call airline#extensions#branch#init(s:ext) | ||||||
|   endif |   endif | ||||||
|  |  | ||||||
|  | |||||||
| @ -55,7 +55,7 @@ endfunction | |||||||
| function! s:check_in_path() | function! s:check_in_path() | ||||||
|   if !exists('b:airline_branch_path') |   if !exists('b:airline_branch_path') | ||||||
|     let root = get(b:, 'git_dir', get(b:, 'mercurial_dir', '')) |     let root = get(b:, 'git_dir', get(b:, 'mercurial_dir', '')) | ||||||
|     let bufferpath = resolve(fnamemodify(expand('%'), ':p:h')) |     let bufferpath = resolve(fnamemodify(expand('%'), ':p')) | ||||||
|  |  | ||||||
|     if !filereadable(root) "not a file |     if !filereadable(root) "not a file | ||||||
|       " if .git is a directory, it's the old submodule format |       " if .git is a directory, it's the old submodule format | ||||||
|  | |||||||
| @ -31,6 +31,7 @@ function! airline#extensions#tabline#init(ext) | |||||||
|  |  | ||||||
|   autocmd User AirlineToggledOn call s:toggle_on() |   autocmd User AirlineToggledOn call s:toggle_on() | ||||||
|   autocmd User AirlineToggledOff call s:toggle_off() |   autocmd User AirlineToggledOff call s:toggle_off() | ||||||
|  |   autocmd BufDelete * let s:current_bufnr = -1 | ||||||
|  |  | ||||||
|   call s:toggle_on() |   call s:toggle_on() | ||||||
|   call a:ext.add_theme_func('airline#extensions#tabline#load_theme') |   call a:ext.add_theme_func('airline#extensions#tabline#load_theme') | ||||||
|  | |||||||
| @ -23,9 +23,15 @@ function! airline#extensions#tagbar#inactive_apply(...) | |||||||
|   endif |   endif | ||||||
| endfunction | endfunction | ||||||
|  |  | ||||||
|  | let s:airline_tagbar_last_lookup_time = 0 | ||||||
|  | let s:airline_tagbar_last_lookup_val = '' | ||||||
| function! airline#extensions#tagbar#currenttag() | function! airline#extensions#tagbar#currenttag() | ||||||
|   if get(w:, 'airline_active', 0) |   if get(w:, 'airline_active', 0) | ||||||
|     return tagbar#currenttag('%s', '', s:flags) |     if s:airline_tagbar_last_lookup_time != localtime() | ||||||
|  |       let s:airline_tagbar_last_lookup_val = tagbar#currenttag('%s', '', s:flags) | ||||||
|  |       let s:airline_tagbar_last_lookup_time = localtime() | ||||||
|  |     endif | ||||||
|  |     return s:airline_tagbar_last_lookup_val | ||||||
|   endif |   endif | ||||||
|   return '' |   return '' | ||||||
| endfunction | endfunction | ||||||
|  | |||||||
| @ -48,8 +48,10 @@ function! airline#themes#solarized#refresh() | |||||||
|   let s:NW = [s:base3, s:orange, ''] |   let s:NW = [s:base3, s:orange, ''] | ||||||
|   if s:background == 'dark' |   if s:background == 'dark' | ||||||
|     let s:NM = [s:base1, s:N3[1], ''] |     let s:NM = [s:base1, s:N3[1], ''] | ||||||
|  |     let s:NMi = [s:base2, s:N3[1], ''] | ||||||
|   else |   else | ||||||
|     let s:NM = [s:base01, s:N3[1], ''] |     let s:NM = [s:base01, s:N3[1], ''] | ||||||
|  |     let s:NMi = [s:base02, s:N3[1], ''] | ||||||
|   endif |   endif | ||||||
|  |  | ||||||
|   " Insert mode |   " Insert mode | ||||||
| @ -73,11 +75,12 @@ function! airline#themes#solarized#refresh() | |||||||
|   let s:RM = s:NM |   let s:RM = s:NM | ||||||
|   let s:RF = s:NF |   let s:RF = s:NF | ||||||
|  |  | ||||||
|   " Inactive |   " Inactive, according to VertSplit in solarized | ||||||
|  |   " (bg dark: base00; bg light: base0) | ||||||
|   if s:background == 'dark' |   if s:background == 'dark' | ||||||
|     let s:IA = [s:base00, s:base02, ''] |     let s:IA = [s:base02, s:base00, ''] | ||||||
|   else |   else | ||||||
|     let s:IA = [s:base1, s:base2, ''] |     let s:IA = [s:base2, s:base0, ''] | ||||||
|   endif |   endif | ||||||
|  |  | ||||||
|   """""""""""""""""""""""""""""""""""""""""""""""" |   """""""""""""""""""""""""""""""""""""""""""""""" | ||||||
| @ -98,7 +101,7 @@ function! airline#themes#solarized#refresh() | |||||||
|         \ [s:IA[0].g, s:IA[1].g, s:IA[0].t, s:IA[1].t, s:IA[2]], |         \ [s:IA[0].g, s:IA[1].g, s:IA[0].t, s:IA[1].t, s:IA[2]], | ||||||
|         \ [s:IA[0].g, s:IA[1].g, s:IA[0].t, s:IA[1].t, s:IA[2]]) |         \ [s:IA[0].g, s:IA[1].g, s:IA[0].t, s:IA[1].t, s:IA[2]]) | ||||||
|   let g:airline#themes#solarized#palette.inactive_modified = { |   let g:airline#themes#solarized#palette.inactive_modified = { | ||||||
|         \ 'airline_c': [s:NM[0].g, '', s:NM[0].t, '', s:NM[2]]} |         \ 'airline_c': [s:NMi[0].g, '', s:NMi[0].t, '', s:NMi[2]]} | ||||||
|  |  | ||||||
|   let g:airline#themes#solarized#palette.normal = airline#themes#generate_color_map( |   let g:airline#themes#solarized#palette.normal = airline#themes#generate_color_map( | ||||||
|         \ [s:N1[0].g, s:N1[1].g, s:N1[0].t, s:N1[1].t, s:N1[2]], |         \ [s:N1[0].g, s:N1[1].g, s:N1[0].t, s:N1[1].t, s:N1[2]], | ||||||
|  | |||||||
							
								
								
									
										11
									
								
								sources_non_forked/vim-bundle-mako/ftplugin/mako.vim
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								sources_non_forked/vim-bundle-mako/ftplugin/mako.vim
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | |||||||
|  | " Vim filetype plugin file | ||||||
|  | " Language:     Mako | ||||||
|  | " Maintainer:   Randy Stauner <randy@magnificent-tears.com> | ||||||
|  | " Last Change:  2014-02-07 | ||||||
|  | " Version:      0.1 | ||||||
|  |  | ||||||
|  | if exists("b:did_ftplugin") | finish | endif | ||||||
|  | let b:did_ftplugin = 1 | ||||||
|  |  | ||||||
|  | setlocal comments=:## | ||||||
|  | setlocal commentstring=##%s | ||||||
							
								
								
									
										1
									
								
								sources_non_forked/vim-commentary/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								sources_non_forked/vim-commentary/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | /doc/tags | ||||||
							
								
								
									
										62
									
								
								sources_non_forked/vim-commentary/README.markdown
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								sources_non_forked/vim-commentary/README.markdown
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,62 @@ | |||||||
|  | commentary.vim | ||||||
|  | ============== | ||||||
|  |  | ||||||
|  | Comment stuff out.  Use `gcc` to comment out a line (takes a count), | ||||||
|  | `gc` to comment out the target of a motion (for example, `gcap` to | ||||||
|  | comment out a paragraph), and `gc` in visual mode to comment out the | ||||||
|  | selection.  That's it. | ||||||
|  |  | ||||||
|  | I wrote this because 5 years after Vim added support for mapping an | ||||||
|  | operator, I still couldn't find a commenting plugin that leveraged that | ||||||
|  | feature (I overlooked | ||||||
|  | [tcomment.vim](https://github.com/tomtom/tcomment_vim)).  Striving for | ||||||
|  | minimalism, it weighs in at under 100 lines of code. | ||||||
|  |  | ||||||
|  | Oh, and it uncomments, too.  The above maps actually toggle, and `gcu` | ||||||
|  | uncomments a set of adjacent commented lines.  Install | ||||||
|  | [repeat.vim](https://github.com/tpope/vim-repeat) to enable | ||||||
|  | repeating `gcu` with `.` (the other maps are repeatable without it). | ||||||
|  |  | ||||||
|  | Installation | ||||||
|  | ------------ | ||||||
|  |  | ||||||
|  | If you don't have a preferred installation method, I recommend | ||||||
|  | installing [pathogen.vim](https://github.com/tpope/vim-pathogen), and | ||||||
|  | then simply copy and paste: | ||||||
|  |  | ||||||
|  |     cd ~/.vim/bundle | ||||||
|  |     git clone git://github.com/tpope/vim-commentary.git | ||||||
|  |  | ||||||
|  | Once help tags have been generated, you can view the manual with | ||||||
|  | `:help commentary`. | ||||||
|  |  | ||||||
|  | FAQ | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | > My favorite file type isn't supported! | ||||||
|  |  | ||||||
|  | Relax!  You just have to adjust `'commentstring'`: | ||||||
|  |  | ||||||
|  |     autocmd FileType apache set commentstring=#\ %s | ||||||
|  |  | ||||||
|  | Contributing | ||||||
|  | ------------ | ||||||
|  |  | ||||||
|  | See the contribution guidelines for | ||||||
|  | [pathogen.vim](https://github.com/tpope/vim-pathogen#readme). | ||||||
|  |  | ||||||
|  | Self-Promotion | ||||||
|  | -------------- | ||||||
|  |  | ||||||
|  | Like commentary.vim? Follow the repository on | ||||||
|  | [GitHub](https://github.com/tpope/vim-commentary) and vote for it on | ||||||
|  | [vim.org](http://www.vim.org/scripts/script.php?script_id=3695).  And if | ||||||
|  | you're feeling especially charitable, follow [tpope](http://tpo.pe/) on | ||||||
|  | [Twitter](http://twitter.com/tpope) and | ||||||
|  | [GitHub](https://github.com/tpope). | ||||||
|  |  | ||||||
|  | License | ||||||
|  | ------- | ||||||
|  |  | ||||||
|  | Copyright (c) Tim Pope.  Distributed under the same terms as Vim itself. | ||||||
|  | See `:help license`. | ||||||
							
								
								
									
										28
									
								
								sources_non_forked/vim-commentary/doc/commentary.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								sources_non_forked/vim-commentary/doc/commentary.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | |||||||
|  | *commentary.txt*  Comment stuff out | ||||||
|  |  | ||||||
|  | Author:  Tim Pope <http://tpo.pe/> | ||||||
|  | License: Same terms as Vim itself (see |license|) | ||||||
|  |  | ||||||
|  | Comment stuff out.  Then uncomment it later.  Relies on 'commentstring' to be | ||||||
|  | correctly set. | ||||||
|  |  | ||||||
|  | The gc mappings are preferred, while the \\ mappings are provided for | ||||||
|  | backwards compatibility. | ||||||
|  |  | ||||||
|  |                                                 *gc* *\\* | ||||||
|  | gc{motion}              Comment or uncomment lines that {motion} moves over. | ||||||
|  | \\{motion} | ||||||
|  |  | ||||||
|  |                                                 *gcc* *\\\* | ||||||
|  | gcc                     Comment or uncomment [count] lines. | ||||||
|  | \\\ | ||||||
|  |  | ||||||
|  |                                                 *v_gc* *v_\\* | ||||||
|  | {Visual}gc              Comment or uncomment the highlighted lines. | ||||||
|  | {Visual}\\ | ||||||
|  |  | ||||||
|  |                                                 *gcu* *\\u* | ||||||
|  | gcu                     Uncomment the current and adjacent commented lines. | ||||||
|  | \\u | ||||||
|  |  | ||||||
|  |  vim:tw=78:et:ft=help:norl: | ||||||
							
								
								
									
										75
									
								
								sources_non_forked/vim-commentary/plugin/commentary.vim
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								sources_non_forked/vim-commentary/plugin/commentary.vim
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,75 @@ | |||||||
|  | " commentary.vim - Comment stuff out | ||||||
|  | " Maintainer:   Tim Pope <http://tpo.pe/> | ||||||
|  | " Version:      1.1 | ||||||
|  | " GetLatestVimScripts: 3695 1 :AutoInstall: commentary.vim | ||||||
|  |  | ||||||
|  | if exists("g:loaded_commentary") || &cp || v:version < 700 | ||||||
|  |   finish | ||||||
|  | endif | ||||||
|  | let g:loaded_commentary = 1 | ||||||
|  |  | ||||||
|  | function! s:go(type,...) abort | ||||||
|  |   if a:0 | ||||||
|  |     let [lnum1, lnum2] = [a:type, a:1] | ||||||
|  |   else | ||||||
|  |     let [lnum1, lnum2] = [line("'["), line("']")] | ||||||
|  |   endif | ||||||
|  |  | ||||||
|  |   let [l, r] = split(substitute(substitute(&commentstring,'\S\zs%s',' %s',''),'%s\ze\S','%s ',''),'%s',1) | ||||||
|  |   let uncomment = 2 | ||||||
|  |   for lnum in range(lnum1,lnum2) | ||||||
|  |     let line = matchstr(getline(lnum),'\S.*\s\@<!') | ||||||
|  |     if line != '' && (stridx(line,l) || line[strlen(line)-strlen(r) : -1] != r) | ||||||
|  |       let uncomment = 0 | ||||||
|  |     endif | ||||||
|  |   endfor | ||||||
|  |  | ||||||
|  |   for lnum in range(lnum1,lnum2) | ||||||
|  |     let line = getline(lnum) | ||||||
|  |     if strlen(r) > 2 && l.r !~# '\\' | ||||||
|  |       let line = substitute(line, | ||||||
|  |             \'\M'.r[0:-2].'\zs\d\*\ze'.r[-1:-1].'\|'.l[0].'\zs\d\*\ze'.l[1:-1], | ||||||
|  |             \'\=substitute(submatch(0)+1-uncomment,"^0$\\|^-\\d*$","","")','g') | ||||||
|  |     endif | ||||||
|  |     if uncomment | ||||||
|  |       let line = substitute(line,'\S.*\s\@<!','\=submatch(0)[strlen(l):-strlen(r)-1]','') | ||||||
|  |     else | ||||||
|  |       let line = substitute(line,'^\%('.matchstr(getline(lnum1),'^\s*').'\|\s*\)\zs.*\S\@<=','\=l.submatch(0).r','') | ||||||
|  |     endif | ||||||
|  |     call setline(lnum,line) | ||||||
|  |   endfor | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | function! s:undo() | ||||||
|  |   let [l, r] = split(substitute(substitute(&commentstring,'\S\zs%s',' %s',''),'%s\ze\S','%s ',''),'%s',1) | ||||||
|  |   let lnums = [line('.')+1, line('.')-2] | ||||||
|  |   for [index, dir, bound, line] in [[0, -1, 1, ''], [1, 1, line('$'), '']] | ||||||
|  |     while lnums[index] != bound && line ==# '' || !(stridx(line,l) || line[strlen(line)-strlen(r) : -1] != r) | ||||||
|  |       let lnums[index] += dir | ||||||
|  |       let line = matchstr(getline(lnums[index]+dir),'\S.*\s\@<!') | ||||||
|  |     endwhile | ||||||
|  |   endfor | ||||||
|  |   call s:go(lnums[0], lnums[1]) | ||||||
|  |   silent! call repeat#set("\<Plug>CommentaryUndo") | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | xnoremap <silent> <Plug>Commentary     :<C-U>call <SID>go(line("'<"),line("'>"))<CR> | ||||||
|  | nnoremap <silent> <Plug>Commentary     :<C-U>set opfunc=<SID>go<CR>g@ | ||||||
|  | nnoremap <silent> <Plug>CommentaryLine :<C-U>set opfunc=<SID>go<Bar>exe 'norm! 'v:count1.'g@_'<CR> | ||||||
|  | nnoremap <silent> <Plug>CommentaryUndo :<C-U>call <SID>undo()<CR> | ||||||
|  |  | ||||||
|  | if !hasmapto('<Plug>Commentary') || maparg('gc','n') ==# '' | ||||||
|  |   xmap gc  <Plug>Commentary | ||||||
|  |   nmap gc  <Plug>Commentary | ||||||
|  |   nmap gcc <Plug>CommentaryLine | ||||||
|  |   nmap gcu <Plug>CommentaryUndo | ||||||
|  | endif | ||||||
|  |  | ||||||
|  | if maparg('\\','n') ==# '' && maparg('\','n') ==# '' | ||||||
|  |   xmap \\  <Plug>Commentary | ||||||
|  |   nmap \\  <Plug>Commentary | ||||||
|  |   nmap \\\ <Plug>CommentaryLine | ||||||
|  |   nmap \\u <Plug>CommentaryUndo | ||||||
|  | endif | ||||||
|  |  | ||||||
|  | " vim:set et sw=2: | ||||||
| @ -85,6 +85,9 @@ syn region markdownCode matchgroup=markdownCodeDelimiter start="`" end="`" keepe | |||||||
| 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 region markdownCode matchgroup=markdownCodeDelimiter start="^\s*```.*$" end="^\s*```\ze\s*$" keepend | ||||||
|  |  | ||||||
|  | syn match markdownFootnote "\[^[^\]]\]\s*$" | ||||||
|  | syn match markdownFootnoteDefinition "^\[^[^\]]\]:" | ||||||
|  |  | ||||||
| if main_syntax ==# 'markdown' | if main_syntax ==# 'markdown' | ||||||
|   for s:type in g:markdown_fenced_languages |   for s:type in g:markdown_fenced_languages | ||||||
|     exe 'syn region markdownHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\..*','','').' matchgroup=markdownCodeDelimiter start="^\s*```\s*'.matchstr(s:type,'[^=]*').'\>.*$" end="^\s*```\ze\s*$" keepend contains=@markdownHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\.','','g') |     exe 'syn region markdownHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\..*','','').' matchgroup=markdownCodeDelimiter start="^\s*```\s*'.matchstr(s:type,'[^=]*').'\>.*$" end="^\s*```\ze\s*$" keepend contains=@markdownHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\.','','g') | ||||||
| @ -108,6 +111,9 @@ hi def link markdownListMarker            htmlTagName | |||||||
| hi def link markdownBlockquote            Comment | hi def link markdownBlockquote            Comment | ||||||
| hi def link markdownRule                  PreProc | hi def link markdownRule                  PreProc | ||||||
|  |  | ||||||
|  | hi def link markdownFootnote              Typedef | ||||||
|  | hi def link markdownFootnoteDefinition    Typedef | ||||||
|  |  | ||||||
| hi def link markdownLinkText              htmlLink | hi def link markdownLinkText              htmlLink | ||||||
| hi def link markdownIdDeclaration         Typedef | hi def link markdownIdDeclaration         Typedef | ||||||
| hi def link markdownId                    Type | hi def link markdownId                    Type | ||||||
|  | |||||||
							
								
								
									
										53
									
								
								sources_non_forked/vim-repeat/README.markdown
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								sources_non_forked/vim-repeat/README.markdown
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,53 @@ | |||||||
|  | repeat.vim | ||||||
|  | ========== | ||||||
|  |  | ||||||
|  | If you've ever tried using the `.` command after a plugin map, you were | ||||||
|  | likely disappointed to discover it only repeated the last native command | ||||||
|  | inside that map, rather than the map as a whole.  That disappointment | ||||||
|  | ends today.  Repeat.vim remaps `.` in a way that plugins can tap into | ||||||
|  | it. | ||||||
|  |  | ||||||
|  | The following plugins support repeat.vim: | ||||||
|  |  | ||||||
|  | * [surround.vim](https://github.com/tpope/vim-surround) | ||||||
|  | * [speeddating.vim](https://github.com/tpope/vim-speeddating) | ||||||
|  | * [abolish.vim](https://github.com/tpope/vim-abolish) | ||||||
|  | * [unimpaired.vim](https://github.com/tpope/vim-unimpaired) | ||||||
|  | * [commentary.vim](https://github.com/tpope/vim-commentary) | ||||||
|  |  | ||||||
|  | Adding support to a plugin is generally as simple as the following | ||||||
|  | command at the end of your map functions. | ||||||
|  |  | ||||||
|  |     silent! call repeat#set("\<Plug>MyWonderfulMap", v:count) | ||||||
|  |  | ||||||
|  | Installation | ||||||
|  | ------------ | ||||||
|  |  | ||||||
|  | If you don't have a preferred installation method, I recommend | ||||||
|  | installing [pathogen.vim](https://github.com/tpope/vim-pathogen), and | ||||||
|  | then simply copy and paste: | ||||||
|  |  | ||||||
|  |     cd ~/.vim/bundle | ||||||
|  |     git clone git://github.com/tpope/vim-repeat.git | ||||||
|  |  | ||||||
|  | Contributing | ||||||
|  | ------------ | ||||||
|  |  | ||||||
|  | See the contribution guidelines for | ||||||
|  | [pathogen.vim](https://github.com/tpope/vim-pathogen#readme). | ||||||
|  |  | ||||||
|  | Self-Promotion | ||||||
|  | -------------- | ||||||
|  |  | ||||||
|  | Like repeat.vim? Follow the repository on | ||||||
|  | [GitHub](https://github.com/tpope/vim-repeat) and vote for it on | ||||||
|  | [vim.org](http://www.vim.org/scripts/script.php?script_id=2136).  And if | ||||||
|  | you're feeling especially charitable, follow [tpope](http://tpo.pe/) on | ||||||
|  | [Twitter](http://twitter.com/tpope) and | ||||||
|  | [GitHub](https://github.com/tpope). | ||||||
|  |  | ||||||
|  | License | ||||||
|  | ------- | ||||||
|  |  | ||||||
|  | Copyright (c) Tim Pope.  Distributed under the same terms as Vim itself. | ||||||
|  | See `:help license`. | ||||||
							
								
								
									
										119
									
								
								sources_non_forked/vim-repeat/autoload/repeat.vim
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								sources_non_forked/vim-repeat/autoload/repeat.vim
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,119 @@ | |||||||
|  | " repeat.vim - Let the repeat command repeat plugin maps | ||||||
|  | " Maintainer:   Tim Pope | ||||||
|  | " Version:      1.1 | ||||||
|  | " GetLatestVimScripts: 2136 1 :AutoInstall: repeat.vim | ||||||
|  |  | ||||||
|  | " Installation: | ||||||
|  | " Place in either ~/.vim/plugin/repeat.vim (to load at start up) or | ||||||
|  | " ~/.vim/autoload/repeat.vim (to load automatically as needed). | ||||||
|  | " | ||||||
|  | " License: | ||||||
|  | " Copyright (c) Tim Pope.  Distributed under the same terms as Vim itself. | ||||||
|  | " See :help license | ||||||
|  | " | ||||||
|  | " Developers: | ||||||
|  | " Basic usage is as follows: | ||||||
|  | " | ||||||
|  | "   silent! call repeat#set("\<Plug>MappingToRepeatCommand",3) | ||||||
|  | " | ||||||
|  | " The first argument is the mapping that will be invoked when the |.| key is | ||||||
|  | " pressed.  Typically, it will be the same as the mapping the user invoked. | ||||||
|  | " This sequence will be stuffed into the input queue literally.  Thus you must | ||||||
|  | " encode special keys by prefixing them with a backslash inside double quotes. | ||||||
|  | " | ||||||
|  | " The second argument is the default count.  This is the number that will be | ||||||
|  | " prefixed to the mapping if no explicit numeric argument was given.  The | ||||||
|  | " value of the v:count variable is usually correct and it will be used if the | ||||||
|  | " second parameter is omitted.  If your mapping doesn't accept a numeric | ||||||
|  | " argument and you never want to receive one, pass a value of -1. | ||||||
|  | " | ||||||
|  | " Make sure to call the repeat#set function _after_ making changes to the | ||||||
|  | " file. | ||||||
|  | " | ||||||
|  | " For mappings that use a register and want the same register used on | ||||||
|  | " repetition, use: | ||||||
|  | " | ||||||
|  | "   silent! call repeat#setreg("\<Plug>MappingToRepeatCommand", v:register) | ||||||
|  | " | ||||||
|  | " This function can (and probably needs to be) called before making changes to | ||||||
|  | " the file (as those typically clear v:register).  Therefore, the call sequence | ||||||
|  | " in your mapping will look like this: | ||||||
|  | " | ||||||
|  | "   nnoremap <silent> <Plug>MyMap | ||||||
|  | "   \   :<C-U>execute 'silent! call repeat#setreg("\<lt>Plug>MyMap", v:register)'<Bar> | ||||||
|  | "   \   call <SID>MyFunction(v:register, ...)<Bar> | ||||||
|  | "   \   silent! call repeat#set("\<lt>Plug>MyMap")<CR> | ||||||
|  |  | ||||||
|  | if exists("g:loaded_repeat") || &cp || v:version < 700 | ||||||
|  |     finish | ||||||
|  | endif | ||||||
|  | let g:loaded_repeat = 1 | ||||||
|  |  | ||||||
|  | let g:repeat_tick = -1 | ||||||
|  | let g:repeat_reg = ['', ''] | ||||||
|  |  | ||||||
|  | " Special function to avoid spurious repeats in a related, naturally repeating | ||||||
|  | " mapping when your repeatable mapping doesn't increase b:changedtick. | ||||||
|  | function! repeat#invalidate() | ||||||
|  |     let g:repeat_tick = -1 | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | function! repeat#set(sequence,...) | ||||||
|  |     let g:repeat_sequence = a:sequence | ||||||
|  |     let g:repeat_count = a:0 ? a:1 : v:count | ||||||
|  |     let g:repeat_tick = b:changedtick | ||||||
|  |     augroup repeat_custom_motion | ||||||
|  |         autocmd! | ||||||
|  |         autocmd CursorMoved <buffer> let g:repeat_tick = b:changedtick | autocmd! repeat_custom_motion | ||||||
|  |     augroup END | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | function! repeat#setreg(sequence,register) | ||||||
|  |     let g:repeat_reg = [a:sequence, a:register] | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | function! repeat#run(count) | ||||||
|  |     if g:repeat_tick == b:changedtick | ||||||
|  |         let r = '' | ||||||
|  |         if g:repeat_reg[0] ==# g:repeat_sequence && !empty(g:repeat_reg[1]) | ||||||
|  |             if g:repeat_reg[1] ==# '=' | ||||||
|  |                 " This causes a re-evaluation of the expression on repeat, which | ||||||
|  |                 " is what we want. | ||||||
|  |                 let r = '"=' . getreg('=', 1) . "\<CR>" | ||||||
|  |             else | ||||||
|  |                 let r = '"' . g:repeat_reg[1] | ||||||
|  |             endif | ||||||
|  |         endif | ||||||
|  |  | ||||||
|  |         let c = g:repeat_count | ||||||
|  |         let s = g:repeat_sequence | ||||||
|  |         let cnt = c == -1 ? "" : (a:count ? a:count : (c ? c : '')) | ||||||
|  |         call feedkeys(r . cnt, 'n') | ||||||
|  |         call feedkeys(s) | ||||||
|  |     else | ||||||
|  |         call feedkeys((a:count ? a:count : '') . '.', 'n') | ||||||
|  |     endif | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | function! repeat#wrap(command,count) | ||||||
|  |     let preserve = (g:repeat_tick == b:changedtick) | ||||||
|  |     exe 'norm! '.(a:count ? a:count : '').a:command . (&foldopen =~# 'undo' ? 'zv' : '') | ||||||
|  |     if preserve | ||||||
|  |         let g:repeat_tick = b:changedtick | ||||||
|  |     endif | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | nnoremap <silent> .     :<C-U>call repeat#run(v:count)<CR> | ||||||
|  | nnoremap <silent> u     :<C-U>call repeat#wrap('u',v:count)<CR> | ||||||
|  | if maparg('U','n') ==# '' | ||||||
|  |     nnoremap <silent> U     :<C-U>call repeat#wrap('U',v:count)<CR> | ||||||
|  | endif | ||||||
|  | nnoremap <silent> <C-R> :<C-U>call repeat#wrap("\<Lt>C-R>",v:count)<CR> | ||||||
|  |  | ||||||
|  | augroup repeatPlugin | ||||||
|  |     autocmd! | ||||||
|  |     autocmd BufLeave,BufWritePre,BufReadPre * let g:repeat_tick = (g:repeat_tick == b:changedtick || g:repeat_tick == 0) ? 0 : -1 | ||||||
|  |     autocmd BufEnter,BufWritePost * if g:repeat_tick == 0|let g:repeat_tick = b:changedtick|endif | ||||||
|  | augroup END | ||||||
|  |  | ||||||
|  | " vim:set ft=vim et sw=4 sts=4: | ||||||
| @ -48,8 +48,11 @@ looking at the [vim-snippets][vim-snippets] repository. | |||||||
|  |  | ||||||
| ### Master ### | ### Master ### | ||||||
|  |  | ||||||
|  | * Implement simple caching | ||||||
|  | * Remove expansion guards | ||||||
| * Fix bug with mirrors in the first column | * Fix bug with mirrors in the first column | ||||||
| * Fix bug with tabs in indents ([#143][143]) | * Fix bug with tabs in indents ([#143][143]) | ||||||
|  | * Fix bug with mirrors in placeholders | ||||||
|  |  | ||||||
| ### 0.87 - 2014-01-04 ### | ### 0.87 - 2014-01-04 ### | ||||||
|  |  | ||||||
|  | |||||||
| @ -13,13 +13,6 @@ endtry | |||||||
| " match $ which doesn't follow a \ | " match $ which doesn't follow a \ | ||||||
| let s:d = '\%([\\]\@<!\$\)' | let s:d = '\%([\\]\@<!\$\)' | ||||||
|  |  | ||||||
|  |  | ||||||
| " disable write cache in files |  | ||||||
| " some people get errors about writing the cache files. Probably there is no |  | ||||||
| " pay off having slow disks anyway. So disabling the cache by default |  | ||||||
| let s:c.cache_parsed_snippets_on_disk = get(s:c, 'cache_parsed_snippets_on_disk', 0) |  | ||||||
| let s:c.read_snippets_cached = get(s:c, 'read_snippets_cached', {'func' : function('snipMate#ReadSnippetsFile'), 'version': 3, 'use_file_cache': s:c.cache_parsed_snippets_on_disk}) |  | ||||||
|  |  | ||||||
| " if filetype is objc, cpp, cs or cu also append snippets from scope 'c' | " if filetype is objc, cpp, cs or cu also append snippets from scope 'c' | ||||||
| " you can add multiple by separating scopes by ',', see s:AddScopeAliases | " you can add multiple by separating scopes by ',', see s:AddScopeAliases | ||||||
| let s:c.scope_aliases = get(s:c, 'scope_aliases', {}) | let s:c.scope_aliases = get(s:c, 'scope_aliases', {}) | ||||||
| @ -47,6 +40,7 @@ fun! Filename(...) | |||||||
| endf | endf | ||||||
|  |  | ||||||
| let s:state_proto = {} | let s:state_proto = {} | ||||||
|  | let s:cache = {} | ||||||
|  |  | ||||||
| fun! s:state_proto.remove() | fun! s:state_proto.remove() | ||||||
| 	unlet! b:snip_state | 	unlet! b:snip_state | ||||||
| @ -91,7 +85,7 @@ fun! snipMate#expandSnip(snip, col) | |||||||
|  |  | ||||||
| 	if b:snip_state.stop_count | 	if b:snip_state.stop_count | ||||||
| 		aug snipmate_changes | 		aug snipmate_changes | ||||||
| 			au CursorMovedI,InsertEnter <buffer> call b:snip_state.update_changes() | 			au CursorMoved,CursorMovedI <buffer> call b:snip_state.update_changes() | ||||||
| 		aug END | 		aug END | ||||||
| 		call b:snip_state.set_stop(0) | 		call b:snip_state.set_stop(0) | ||||||
|  |  | ||||||
| @ -263,7 +257,7 @@ function! s:state_proto.jump_stop(backwards) | |||||||
|  |  | ||||||
| 	if self.stop_no == self.stop_count | 	if self.stop_no == self.stop_count | ||||||
| 		call self.remove() | 		call self.remove() | ||||||
| 		return -1 | 		return '' | ||||||
| 	endif | 	endif | ||||||
|  |  | ||||||
| 	call self.set_stop(self.stop_no) | 	call self.set_stop(self.stop_no) | ||||||
| @ -303,6 +297,10 @@ function! s:state_proto.update_stops() | |||||||
| 			if exists('pos[3]') | 			if exists('pos[3]') | ||||||
| 				for nPos in pos[3] | 				for nPos in pos[3] | ||||||
| 					let changed = nPos[0] == curLine && nPos[1] > self.start_col | 					let changed = nPos[0] == curLine && nPos[1] > self.start_col | ||||||
|  | 					if changed && nPos[1] < self.start_col + self.cur_stop[2] | ||||||
|  | 						call remove(pos, index(pos, nPos)) | ||||||
|  | 						continue | ||||||
|  | 					endif | ||||||
| 					for [lnum, col] in self.old_vars | 					for [lnum, col] in self.old_vars | ||||||
| 						if lnum > nPos[0] | break | endif | 						if lnum > nPos[0] | break | endif | ||||||
| 						if nPos[0] == lnum && nPos[1] > col | 						if nPos[0] == lnum && nPos[1] > col | ||||||
| @ -387,21 +385,11 @@ function! s:state_proto.update_vars(change) | |||||||
|  |  | ||||||
| 	" Reposition the cursor in case a var updates on the same line but before | 	" Reposition the cursor in case a var updates on the same line but before | ||||||
| 	" the current tabstop | 	" the current tabstop | ||||||
| 	if oldStartSnip != self.start_col | 	if oldStartSnip != self.start_col || mode() == 'i' | ||||||
| 		call cursor(0, col('.') + self.start_col - oldStartSnip) | 		call cursor(0, col('.') + self.start_col - oldStartSnip) | ||||||
| 	endif | 	endif | ||||||
| endfunction | endfunction | ||||||
|  |  | ||||||
| " should be moved to utils or such? |  | ||||||
| fun! snipMate#SetByPath(dict, path, value) |  | ||||||
| 	let d = a:dict |  | ||||||
| 	for p in a:path[:-2] |  | ||||||
| 		if !has_key(d,p) | let d[p] = {} | endif |  | ||||||
| 		let d = d[p] |  | ||||||
| 	endfor |  | ||||||
| 	let d[a:path[-1]] = a:value |  | ||||||
| endf |  | ||||||
|  |  | ||||||
| " reads a .snippets file | " reads a .snippets file | ||||||
| " returns list of | " returns list of | ||||||
| " ['triggername', 'name', 'contents'] | " ['triggername', 'name', 'contents'] | ||||||
| @ -410,27 +398,18 @@ fun! snipMate#ReadSnippetsFile(file) | |||||||
| 	let result = [] | 	let result = [] | ||||||
| 	let new_scopes = [] | 	let new_scopes = [] | ||||||
| 	if !filereadable(a:file) | return [result, new_scopes] | endif | 	if !filereadable(a:file) | return [result, new_scopes] | endif | ||||||
| 	let r_guard = '^guard\s\+\zs.*' |  | ||||||
| 	let inSnip = 0 | 	let inSnip = 0 | ||||||
| 	let guard = 1 |  | ||||||
| 	for line in readfile(a:file) + ["\n"] | 	for line in readfile(a:file) + ["\n"] | ||||||
| 		if inSnip == 2 && line =~ r_guard | 		if inSnip && (line[0] == "\t" || line == '') | ||||||
| 			let guard = matchstr(line, r_guard) |  | ||||||
| 		elseif inSnip && (line[0] == "\t" || line == '') |  | ||||||
| 			let content .= strpart(line, 1)."\n" | 			let content .= strpart(line, 1)."\n" | ||||||
| 			continue | 			continue | ||||||
| 		elseif inSnip | 		elseif inSnip | ||||||
| 			call add(result, [trigger, name == '' ? 'default' : name, content[:-2], guard]) | 			call add(result, [trigger, name == '' ? 'default' : name, content[:-2]]) | ||||||
| 			let inSnip = 0 | 			let inSnip = 0 | ||||||
| 			let guard = "1" |  | ||||||
| 		endif | 		endif | ||||||
|  |  | ||||||
| 		if inSnip == 2 |  | ||||||
| 			let inSnip = 1 |  | ||||||
| 		endif |  | ||||||
| 		if line[:6] == 'snippet' | 		if line[:6] == 'snippet' | ||||||
| 			" 2 signals first line | 			let inSnip = 1 | ||||||
| 			let inSnip = 2 |  | ||||||
| 			let trigger = strpart(line, 8) | 			let trigger = strpart(line, 8) | ||||||
| 			let name = '' | 			let name = '' | ||||||
| 			let space = stridx(trigger, ' ') + 1 | 			let space = stridx(trigger, ' ') + 1 | ||||||
| @ -527,43 +506,61 @@ function! snipMate#GetSnippetFiles(mustExist, scopes, trigger) | |||||||
| 	return result | 	return result | ||||||
| endfunction | endfunction | ||||||
|  |  | ||||||
| fun! snipMate#EvalGuard(guard) | " should be moved to utils or such? | ||||||
| 	" left: everything left of expansion  | function! snipMate#SetByPath(dict, path, value) | ||||||
| 	" word: the expanded word | 	let d = a:dict | ||||||
| 	" are guaranteed to be in scpe | 	for p in a:path[:-2] | ||||||
|  | 		if !has_key(d,p) | let d[p] = {} | endif | ||||||
|  | 		let d = d[p] | ||||||
|  | 	endfor | ||||||
|  | 	let d[a:path[-1]] = a:value | ||||||
|  | endfunction | ||||||
|  |  | ||||||
| 	if a:guard == '1' | return 1 | endif | function! s:ReadFile(file) | ||||||
| 	let word = s:c.word | 	if a:file =~ '\.snippet$' | ||||||
| 	" eval is evil, but backticks are allowed anyway. | 		return [['', '', readfile(a:file), '1']] | ||||||
| 	let left = getline('.')[:col('.')-3 - len(word)] | 	else | ||||||
| 	exec 'return '.a:guard | 		return snipMate#ReadSnippetsFile(a:file) | ||||||
| endf | 	endif | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | function! s:CachedSnips(file) | ||||||
|  | 	let mtime = getftime(a:file) | ||||||
|  | 	if has_key(s:cache, a:file) && s:cache[a:file].mtime >= mtime | ||||||
|  | 		return s:cache[a:file].contents | ||||||
|  | 	endif | ||||||
|  | 	let s:cache[a:file] = {} | ||||||
|  | 	let s:cache[a:file].mtime = mtime | ||||||
|  | 	let s:cache[a:file].contents = snipMate#ReadSnippetsFile(a:file) | ||||||
|  | 	return s:cache[a:file].contents | ||||||
|  | endfunction | ||||||
|  |  | ||||||
| " default triggers based on paths | " default triggers based on paths | ||||||
| fun! snipMate#DefaultPool(scopes, trigger, result) | function! snipMate#DefaultPool(scopes, trigger, result) | ||||||
| 	let triggerR = substitute(a:trigger,'*','.*','g') |  | ||||||
| 	let extra_scopes = [] | 	let extra_scopes = [] | ||||||
| 	for [f,opts] in items(snipMate#GetSnippetFiles(1, a:scopes, a:trigger)) | 	for [f,opts] in items(snipMate#GetSnippetFiles(1, a:scopes, a:trigger)) | ||||||
| 		let opts.name_prefix = matchstr(f, '\v[^/]+\ze/snippets') . ' ' . opts.name_prefix | 		let opts.name_prefix = matchstr(f, '\v/\zs.{-}\ze/snippets') . ' ' . opts.name_prefix | ||||||
| 		if opts.type == 'snippets' | 		if opts.type == 'snippets' | ||||||
| 			let [snippets, extension] = cached_file_contents#CachedFileContents(f, s:c.read_snippets_cached, 0) | 			let [snippets, new_scopes] = s:CachedSnips(f) | ||||||
| 			for [trigger, name, contents, guard] in snippets | 			call extend(extra_scopes, new_scopes) | ||||||
| 				if trigger !~ escape(triggerR,'~') | continue | endif | 			for [trigger, name, contents] in snippets | ||||||
| 				if snipMate#EvalGuard(guard) | 				if trigger =~ '\V\^' . escape(a:trigger, '\') | ||||||
| 					call snipMate#SetByPath(a:result, [trigger, opts.name_prefix.' '.name], contents) | 					call snipMate#SetByPath(a:result, | ||||||
|  | 								\ [trigger, opts.name_prefix . ' ' . name], | ||||||
|  | 								\ contents) | ||||||
| 				endif | 				endif | ||||||
| 			endfor | 			endfor | ||||||
| 			call extend(extra_scopes, extension) |  | ||||||
| 		elseif opts.type == 'snippet' | 		elseif opts.type == 'snippet' | ||||||
| 			call snipMate#SetByPath(a:result, [opts.trigger, opts.name_prefix.' '.opts.name], funcref#Function('return readfile('.string(f).')')) | 			call snipMate#SetByPath(a:result, [opts.trigger, opts.name_prefix.' '.opts.name], readfile(f)) | ||||||
| 		else | 		else | ||||||
| 			throw "unexpected" | 			throw "unexpected" | ||||||
| 		endif | 		endif | ||||||
| 	endfor | 	endfor | ||||||
|  |  | ||||||
| 	if !empty(extra_scopes) | 	if !empty(extra_scopes) | ||||||
| 		call snipMate#DefaultPool(extra_scopes, a:trigger, a:result) | 		call snipMate#DefaultPool(extra_scopes, a:trigger, a:result) | ||||||
| 	endif | 	endif | ||||||
| endf | endfunction | ||||||
|  |  | ||||||
| " return a dict of snippets found in runtimepath matching trigger | " return a dict of snippets found in runtimepath matching trigger | ||||||
| " scopes: list of scopes. usually this is the filetype. eg ['c','cpp'] | " scopes: list of scopes. usually this is the filetype. eg ['c','cpp'] | ||||||
| @ -571,8 +568,6 @@ endf | |||||||
| " | " | ||||||
| fun! snipMate#GetSnippets(scopes, trigger) | fun! snipMate#GetSnippets(scopes, trigger) | ||||||
| 	let result = {} | 	let result = {} | ||||||
| 	let triggerR = escape(substitute(a:trigger,'*','.*','g'), '~') " escape '~' for use as regexp |  | ||||||
| 	" let scopes = s:AddScopeAliases(a:scopes) |  | ||||||
|  |  | ||||||
| 	for F in values(g:snipMateSources) | 	for F in values(g:snipMateSources) | ||||||
| 	  call funcref#Call(F, [a:scopes, a:trigger, result]) | 	  call funcref#Call(F, [a:scopes, a:trigger, result]) | ||||||
| @ -666,14 +661,12 @@ fun! snipMate#GetSnippetsForWordBelowCursor(word, suffix, break_on_first_match) | |||||||
| 	endif | 	endif | ||||||
|  |  | ||||||
| 	call filter(lookups, 'v:val != ""') | 	call filter(lookups, 'v:val != ""') | ||||||
| 	" echo lookups |  | ||||||
|  |  | ||||||
| 	let matching_snippets = [] | 	let matching_snippets = [] | ||||||
| 	let snippet = '' | 	let snippet = '' | ||||||
| 	" prefer longest word | 	" prefer longest word | ||||||
| 	for word in lookups | 	for word in lookups | ||||||
| 		let s:c.word = word | 		let s:c.word = word | ||||||
| 		" echomsg string(lookups).' current: '.word |  | ||||||
| 		for [k,snippetD] in items(funcref#Call(s:c['get_snippets'], [snipMate#ScopesByFile(), word])) | 		for [k,snippetD] in items(funcref#Call(s:c['get_snippets'], [snipMate#ScopesByFile(), word])) | ||||||
| 			if a:suffix == '' | 			if a:suffix == '' | ||||||
| 				" hack: require exact match | 				" hack: require exact match | ||||||
| @ -716,7 +709,7 @@ endf | |||||||
|  |  | ||||||
| fun! snipMate#GetSnippetsForWordBelowCursorForComplete(word) | fun! snipMate#GetSnippetsForWordBelowCursorForComplete(word) | ||||||
| 	let snippets = map(snipMate#GetSnippetsForWordBelowCursor(a:word, '*', 0), 'v:val[0]') | 	let snippets = map(snipMate#GetSnippetsForWordBelowCursor(a:word, '*', 0), 'v:val[0]') | ||||||
| 	return filter(snippets, "v:val =~# '\\V\\^" . escape(a:word, '\') . "'") | 	return filter(snippets, 'v:val =~# "\\V\\^' . escape(a:word, '"\') . '"') | ||||||
| endf | endf | ||||||
|  |  | ||||||
| fun! snipMate#CanBeTriggered() | fun! snipMate#CanBeTriggered() | ||||||
|  | |||||||
| @ -194,7 +194,6 @@ Multiple snippets can be defined in *.snippets files. Each snippet definition | |||||||
| looks something like: > | looks something like: > | ||||||
|  |  | ||||||
|     snippet trigger optional description |     snippet trigger optional description | ||||||
|     guard left_from_cursor='^\s*' |  | ||||||
|         expanded text |         expanded text | ||||||
|         more expanded text |         more expanded text | ||||||
|  |  | ||||||
| @ -203,9 +202,6 @@ The description is optional. If it is left out and a second snippet inside the | |||||||
| same .snippets file uses the same trigger, the second one will overwrite the | same .snippets file uses the same trigger, the second one will overwrite the | ||||||
| first. Otherwise multisnip is used. | first. Otherwise multisnip is used. | ||||||
|  |  | ||||||
| The guard condition line is also optional. It can be used to make a snippet |  | ||||||
| available only in some cases. The value should be a VimL expression. |  | ||||||
|  |  | ||||||
| Note: Hard tabs in the expansion text are required. When the snippet is | Note: Hard tabs in the expansion text are required. When the snippet is | ||||||
| expanded in the text and 'expandtab' is set, each tab will be replaced with | expanded in the text and 'expandtab' is set, each tab will be replaced with | ||||||
| spaces based on 'softtabstop' if nonzero or 'shiftwidth' otherwise. | spaces based on 'softtabstop' if nonzero or 'shiftwidth' otherwise. | ||||||
| @ -254,7 +250,7 @@ the tab stop. This text then can be copied throughout the snippet using "$#", | |||||||
| given # is the same number as used before. So, to make a C for loop: > | given # is the same number as used before. So, to make a C for loop: > | ||||||
|  |  | ||||||
|     snippet for |     snippet for | ||||||
|         for (${2:i}; $2 < ${1:count}; $1++) { |         for (${2:i}=0; $2 < ${1:count}; $2++) { | ||||||
|             ${4} |             ${4} | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  | |||||||
| @ -50,6 +50,9 @@ snippet case | |||||||
| 		${0} | 		${0} | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
|  | snippet df | ||||||
|  | 	def ${1:name}, do: ${2} | ||||||
|  |  | ||||||
| snippet def | snippet def | ||||||
| 	def ${1:name} do | 	def ${1:name} do | ||||||
| 		${0} | 		${0} | ||||||
|  | |||||||
| @ -749,15 +749,15 @@ snippet summary | |||||||
| snippet sup | snippet sup | ||||||
| 	<sup>${0}</sup> | 	<sup>${0}</sup> | ||||||
| snippet table | snippet table | ||||||
| 	<table border="${1:0}"> | 	<table> | ||||||
| 		${0} | 		${0} | ||||||
| 	</table> | 	</table> | ||||||
| snippet table. | snippet table. | ||||||
| 	<table class="${1}" border="${2:0}"> | 	<table class="${1}"> | ||||||
| 		${0} | 		${0} | ||||||
| 	</table> | 	</table> | ||||||
| snippet table# | snippet table# | ||||||
| 	<table id="${1}" border="${2:0}"> | 	<table id="${1}"> | ||||||
| 		${0} | 		${0} | ||||||
| 	</table> | 	</table> | ||||||
| snippet tbody | snippet tbody | ||||||
|  | |||||||
| @ -620,6 +620,8 @@ snippet asrj | |||||||
| 	assert_rjs :${1:replace}, "${0:dom id}" | 	assert_rjs :${1:replace}, "${0:dom id}" | ||||||
| snippet ass assert_select(..) | snippet ass assert_select(..) | ||||||
| 	assert_select '${1:path}', :${2:text} => '${3:inner_html' ${4:do} | 	assert_select '${1:path}', :${2:text} => '${3:inner_html' ${4:do} | ||||||
|  | snippet ba | ||||||
|  | 	before_action :${0:method} | ||||||
| snippet bf | snippet bf | ||||||
| 	before_filter :${0:method} | 	before_filter :${0:method} | ||||||
| snippet bt | snippet bt | ||||||
|  | |||||||
| @ -36,6 +36,8 @@ vim-airline https://github.com/bling/vim-airline | |||||||
| goyo.vim https://github.com/junegunn/goyo.vim | goyo.vim https://github.com/junegunn/goyo.vim | ||||||
| vim-zenroom2 https://github.com/amix/vim-zenroom2 | vim-zenroom2 https://github.com/amix/vim-zenroom2 | ||||||
| syntastic https://github.com/scrooloose/syntastic | syntastic https://github.com/scrooloose/syntastic | ||||||
|  | vim-repeat https://github.com/tpope/vim-repeat | ||||||
|  | vim-commentary https://github.com/tpope/vim-commentary | ||||||
| """.strip() | """.strip() | ||||||
|  |  | ||||||
| GITHUB_ZIP = '%s/archive/master.zip' | GITHUB_ZIP = '%s/archive/master.zip' | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 amix
					amix