mirror of
1
0
Fork 0

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:
amix 2014-03-02 14:35:00 +00:00
parent 8c9210dca4
commit 0d8e7370bd
56 changed files with 1330 additions and 873 deletions

View File

@ -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

View File

@ -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,

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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&lt;', '<', 'g') let str = substitute(str, '\m&lt;', '<', 'g')
let str = substitute(str, '\m&gt;', '>', 'g') let str = substitute(str, '\m&gt;', '>', 'g')
@ -196,17 +197,17 @@ function! syntastic#util#decodeXMLEntities(string)
let str = substitute(str, '\m&apos;', "'", 'g') let str = substitute(str, '\m&apos;', "'", 'g')
let str = substitute(str, '\m&amp;', '\&', 'g') let str = substitute(str, '\m&amp;', '\&', '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:

View File

@ -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

View File

@ -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]
endif
if !exists("g:syntastic_check_on_open") endfor
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
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,150 +268,105 @@ 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))
for checker in clist
let active_checkers += 1
call syntastic#log#debug(g:SyntasticDebugTrace, 'CacheErrors: Invoking checker: ' . checker.getName())
let loclist = checker.getLocList()
if !loclist.isEmpty()
if decorate_errors
call loclist.decorate(checker.getName(), checker.getFiletype())
endif
call add(names, [checker.getName(), checker.getFiletype()])
let newLoclist = newLoclist.extend(loclist)
if !aggregate_errors
break
endif
endif
endfor
endfor endfor
let names = []
for checker in clist
let type = checker.getFiletype()
let name = checker.getName()
call syntastic#log#debug(g:SyntasticDebugTrace, 'CacheErrors: Invoking checker: ' . type . '/' . name)
let loclist = checker.getLocList()
if !loclist.isEmpty()
if decorate_errors
call loclist.decorate(type, name)
endif
call add(names, [type, name])
let newLoclist = newLoclist.extend(loclist)
if !aggregate_errors
break
endif
endif
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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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 available = [] let ft_list = syntastic#util#unique(map( copy(a:ftalias_list), 's:normaliseFiletype(v:val)' ))
let active = [] if len(ft_list) != 1
for ftalias in a:ftalias_list let available = []
call extend(available, self.availableCheckersFor(ftalias)) let active = []
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:

View File

@ -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:

View File

@ -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

View File

@ -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

View File

@ -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({

View File

@ -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

View File

@ -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({

View File

@ -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({

View File

@ -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({

View File

@ -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:

View File

@ -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

View File

@ -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,'.
@ -37,7 +38,7 @@ endfunction
call g:SyntasticRegistry.CreateAndRegisterChecker({ call g:SyntasticRegistry.CreateAndRegisterChecker({
\ 'filetype': 'php', \ 'filetype': 'php',
\ 'name': 'phpcs'}) \ 'name': 'phpcs' })
let &cpo = s:save_cpo let &cpo = s:save_cpo
unlet s:save_cpo unlet s:save_cpo

View File

@ -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

View File

@ -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%.%#'

View File

@ -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

View File

@ -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()

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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')

View File

@ -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

View File

@ -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]],

View 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

View File

@ -0,0 +1 @@
/doc/tags

View 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`.

View 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:

View 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:

View File

@ -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

View 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`.

View 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:

View File

@ -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 ###

View File

@ -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()

View File

@ -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}
} }

View File

@ -74,7 +74,7 @@ ${0}
endsnippet endsnippet
snippet sec "Section" b snippet sec "Section" b
\section{${1:section name}} \section{${1:section name}}
\label{sec:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/g}}} \label{sec:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/g}}}
${0} ${0}

View File

@ -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}

View File

@ -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

View File

@ -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

View File

@ -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'