mirror of
https://github.com/amix/vimrc
synced 2025-08-16 20:55:00 +08:00
Updated plugins
This commit is contained in:
@ -18,9 +18,17 @@ endfunction " }}}2
|
||||
" read additional compiler flags from the given configuration file
|
||||
" the file format and its parsing mechanism is inspired by clang_complete
|
||||
function! syntastic#c#ReadConfig(file) " {{{2
|
||||
" search in the current file's directory upwards
|
||||
call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: looking for', a:file)
|
||||
|
||||
" search upwards from the current file's directory
|
||||
let config = findfile(a:file, '.;')
|
||||
if config == '' || !filereadable(config)
|
||||
if config == ''
|
||||
call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: file not found')
|
||||
return ''
|
||||
endif
|
||||
call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: config file:', config)
|
||||
if !filereadable(config)
|
||||
call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: file unreadable')
|
||||
return ''
|
||||
endif
|
||||
|
||||
@ -31,6 +39,7 @@ function! syntastic#c#ReadConfig(file) " {{{2
|
||||
try
|
||||
let lines = readfile(config)
|
||||
catch /\m^Vim\%((\a\+)\)\=:E48[45]/
|
||||
call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: error reading file')
|
||||
return ''
|
||||
endtry
|
||||
|
||||
@ -62,7 +71,7 @@ endfunction " }}}2
|
||||
" GetLocList() for C-like compilers
|
||||
function! syntastic#c#GetLocList(filetype, subchecker, options) " {{{2
|
||||
try
|
||||
let flags = s:_getCflags(a:filetype, a:subchecker, a:options)
|
||||
let flags = s:_get_cflags(a:filetype, a:subchecker, a:options)
|
||||
catch /\m\C^Syntastic: skip checks$/
|
||||
return []
|
||||
endtry
|
||||
@ -70,9 +79,9 @@ function! syntastic#c#GetLocList(filetype, subchecker, options) " {{{2
|
||||
let makeprg = syntastic#util#shexpand(g:syntastic_{a:filetype}_compiler) .
|
||||
\ ' ' . flags . ' ' . syntastic#util#shexpand('%')
|
||||
|
||||
let errorformat = s:_getCheckerVar('g', a:filetype, a:subchecker, 'errorformat', a:options['errorformat'])
|
||||
let errorformat = s:_get_checker_var('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:_get_checker_var('g', a:filetype, a:subchecker, 'remove_include_errors', 0) ?
|
||||
\ ['filterForeignErrors'] : []
|
||||
|
||||
" process makeprg
|
||||
@ -91,25 +100,25 @@ function! s:_init() " {{{2
|
||||
let s:handlers = []
|
||||
let s:cflags = {}
|
||||
|
||||
call s:_regHandler('\m\<cairo', 's:_check_pkg', ['cairo', 'cairo'])
|
||||
call s:_regHandler('\m\<freetype', 's:_check_pkg', ['freetype', 'freetype2', 'freetype'])
|
||||
call s:_regHandler('\m\<glade', 's:_check_pkg', ['glade', 'libglade-2.0', 'libglade'])
|
||||
call s:_regHandler('\m\<glib', 's:_check_pkg', ['glib', 'glib-2.0', 'glib'])
|
||||
call s:_regHandler('\m\<gtk', 's:_check_pkg', ['gtk', 'gtk+-2.0', 'gtk+', 'glib-2.0', 'glib'])
|
||||
call s:_regHandler('\m\<libsoup', 's:_check_pkg', ['libsoup', 'libsoup-2.4', 'libsoup-2.2'])
|
||||
call s:_regHandler('\m\<libxml', 's:_check_pkg', ['libxml', 'libxml-2.0', 'libxml'])
|
||||
call s:_regHandler('\m\<pango', 's:_check_pkg', ['pango', 'pango'])
|
||||
call s:_regHandler('\m\<SDL', 's:_check_pkg', ['sdl', 'sdl'])
|
||||
call s:_regHandler('\m\<opengl', 's:_check_pkg', ['opengl', 'gl'])
|
||||
call s:_regHandler('\m\<webkit', 's:_check_pkg', ['webkit', 'webkit-1.0'])
|
||||
call s:_registerHandler('\m\<cairo', 's:_checkPackage', ['cairo', 'cairo'])
|
||||
call s:_registerHandler('\m\<freetype', 's:_checkPackage', ['freetype', 'freetype2', 'freetype'])
|
||||
call s:_registerHandler('\m\<glade', 's:_checkPackage', ['glade', 'libglade-2.0', 'libglade'])
|
||||
call s:_registerHandler('\m\<glib', 's:_checkPackage', ['glib', 'glib-2.0', 'glib'])
|
||||
call s:_registerHandler('\m\<gtk', 's:_checkPackage', ['gtk', 'gtk+-2.0', 'gtk+', 'glib-2.0', 'glib'])
|
||||
call s:_registerHandler('\m\<libsoup', 's:_checkPackage', ['libsoup', 'libsoup-2.4', 'libsoup-2.2'])
|
||||
call s:_registerHandler('\m\<libxml', 's:_checkPackage', ['libxml', 'libxml-2.0', 'libxml'])
|
||||
call s:_registerHandler('\m\<pango', 's:_checkPackage', ['pango', 'pango'])
|
||||
call s:_registerHandler('\m\<SDL', 's:_checkPackage', ['sdl', 'sdl'])
|
||||
call s:_registerHandler('\m\<opengl', 's:_checkPackage', ['opengl', 'gl'])
|
||||
call s:_registerHandler('\m\<webkit', 's:_checkPackage', ['webkit', 'webkit-1.0'])
|
||||
|
||||
call s:_regHandler('\m\<php\.h\>', 's:_check_php', [])
|
||||
call s:_regHandler('\m\<Python\.h\>', 's:_check_python', [])
|
||||
call s:_regHandler('\m\<ruby', 's:_check_ruby', [])
|
||||
call s:_registerHandler('\m\<php\.h\>', 's:_checkPhp', [])
|
||||
call s:_registerHandler('\m\<Python\.h\>', 's:_checkPython', [])
|
||||
call s:_registerHandler('\m\<ruby', 's:_checkRuby', [])
|
||||
endfunction " }}}2
|
||||
|
||||
" return a handler dictionary object
|
||||
function! s:_regHandler(regex, function, args) " {{{2
|
||||
" register a handler dictionary object
|
||||
function! s:_registerHandler(regex, function, args) " {{{2
|
||||
let handler = {}
|
||||
let handler["regex"] = a:regex
|
||||
let handler["func"] = function(a:function)
|
||||
@ -117,8 +126,75 @@ function! s:_regHandler(regex, function, args) " {{{2
|
||||
call add(s:handlers, handler)
|
||||
endfunction " }}}2
|
||||
|
||||
" try to find library with 'pkg-config'
|
||||
" search possible libraries from first to last given
|
||||
" argument until one is found
|
||||
function! s:_checkPackage(name, ...) " {{{2
|
||||
if executable('pkg-config')
|
||||
if !has_key(s:cflags, a:name)
|
||||
for pkg in a:000
|
||||
let pkg_flags = system('pkg-config --cflags ' . pkg)
|
||||
" since we cannot necessarily trust the pkg-config exit code
|
||||
" we have to check for an error output as well
|
||||
if v:shell_error == 0 && pkg_flags !~? 'not found'
|
||||
let pkg_flags = ' ' . substitute(pkg_flags, "\n", '', '')
|
||||
let s:cflags[a:name] = pkg_flags
|
||||
return pkg_flags
|
||||
endif
|
||||
endfor
|
||||
else
|
||||
return s:cflags[a:name]
|
||||
endif
|
||||
endif
|
||||
return ''
|
||||
endfunction " }}}2
|
||||
|
||||
" try to find PHP includes with 'php-config'
|
||||
function! s:_checkPhp() " {{{2
|
||||
if executable('php-config')
|
||||
if !has_key(s:cflags, 'php')
|
||||
let s:cflags['php'] = system('php-config --includes')
|
||||
let s:cflags['php'] = ' ' . substitute(s:cflags['php'], "\n", '', '')
|
||||
endif
|
||||
return s:cflags['php']
|
||||
endif
|
||||
return ''
|
||||
endfunction " }}}2
|
||||
|
||||
" try to find the python headers with distutils
|
||||
function! s:_checkPython() " {{{2
|
||||
if executable('python')
|
||||
if !has_key(s:cflags, 'python')
|
||||
let s:cflags['python'] = system('python -c ''from distutils import ' .
|
||||
\ 'sysconfig; import sys; sys.stdout.write(sysconfig.get_python_inc())''')
|
||||
let s:cflags['python'] = substitute(s:cflags['python'], "\n", '', '')
|
||||
let s:cflags['python'] = ' -I' . s:cflags['python']
|
||||
endif
|
||||
return s:cflags['python']
|
||||
endif
|
||||
return ''
|
||||
endfunction " }}}2
|
||||
|
||||
" try to find the ruby headers with 'rbconfig'
|
||||
function! s:_checkRuby() " {{{2
|
||||
if executable('ruby')
|
||||
if !has_key(s:cflags, 'ruby')
|
||||
let s:cflags['ruby'] = system('ruby -r rbconfig -e ' .
|
||||
\ '''puts RbConfig::CONFIG["rubyhdrdir"] || RbConfig::CONFIG["archdir"]''')
|
||||
let s:cflags['ruby'] = substitute(s:cflags['ruby'], "\n", '', '')
|
||||
let s:cflags['ruby'] = ' -I' . s:cflags['ruby']
|
||||
endif
|
||||
return s:cflags['ruby']
|
||||
endif
|
||||
return ''
|
||||
endfunction " }}}2
|
||||
|
||||
" }}}1
|
||||
|
||||
" Utilities {{{1
|
||||
|
||||
" resolve checker-related user variables
|
||||
function! s:_getCheckerVar(scope, filetype, subchecker, name, default) " {{{2
|
||||
function! s:_get_checker_var(scope, filetype, subchecker, name, default) " {{{2
|
||||
let prefix = a:scope . ':' . 'syntastic_'
|
||||
if exists(prefix . a:filetype . '_' . a:subchecker . '_' . a:name)
|
||||
return {a:scope}:syntastic_{a:filetype}_{a:subchecker}_{a:name}
|
||||
@ -130,10 +206,10 @@ function! s:_getCheckerVar(scope, filetype, subchecker, name, default) " {{{2
|
||||
endfunction " }}}2
|
||||
|
||||
" resolve user CFLAGS
|
||||
function! s:_getCflags(ft, ck, opts) " {{{2
|
||||
function! s:_get_cflags(ft, ck, opts) " {{{2
|
||||
" determine whether to parse header files as well
|
||||
if has_key(a:opts, 'header_names') && expand('%') =~? a:opts['header_names']
|
||||
if s:_getCheckerVar('g', a:ft, a:ck, 'check_header', 0)
|
||||
if has_key(a:opts, 'header_names') && expand('%', 1) =~? a:opts['header_names']
|
||||
if s:_get_checker_var('g', a:ft, a:ck, 'check_header', 0)
|
||||
let flags = get(a:opts, 'header_flags', '') . ' -c ' . syntastic#c#NullOutput()
|
||||
else
|
||||
" checking headers when check_header is unset: bail out
|
||||
@ -143,21 +219,21 @@ function! s:_getCflags(ft, ck, opts) " {{{2
|
||||
let flags = get(a:opts, 'main_flags', '')
|
||||
endif
|
||||
|
||||
let flags .= ' ' . s:_getCheckerVar('g', a:ft, a:ck, 'compiler_options', '') . ' ' . s:_getIncludeDirs(a:ft)
|
||||
let flags .= ' ' . s:_get_checker_var('g', a:ft, a:ck, 'compiler_options', '') . ' ' . s:_get_include_dirs(a:ft)
|
||||
|
||||
" check if the user manually set some cflags
|
||||
let b_cflags = s:_getCheckerVar('b', a:ft, a:ck, 'cflags', '')
|
||||
let b_cflags = s:_get_checker_var('b', a:ft, a:ck, 'cflags', '')
|
||||
if b_cflags == ''
|
||||
" check whether to search for include files at all
|
||||
if !s:_getCheckerVar('g', a:ft, a:ck, 'no_include_search', 0)
|
||||
if !s:_get_checker_var('g', a:ft, a:ck, 'no_include_search', 0)
|
||||
if a:ft ==# 'c' || a:ft ==# 'cpp'
|
||||
" refresh the include file search if desired
|
||||
if s:_getCheckerVar('g', a:ft, a:ck, 'auto_refresh_includes', 0)
|
||||
let flags .= ' ' . s:_searchHeaders()
|
||||
if s:_get_checker_var('g', a:ft, a:ck, 'auto_refresh_includes', 0)
|
||||
let flags .= ' ' . s:_search_headers()
|
||||
else
|
||||
" search for header includes if not cached already
|
||||
if !exists('b:syntastic_' . a:ft . '_includes')
|
||||
let b:syntastic_{a:ft}_includes = s:_searchHeaders()
|
||||
let b:syntastic_{a:ft}_includes = s:_search_headers()
|
||||
endif
|
||||
let flags .= ' ' . b:syntastic_{a:ft}_includes
|
||||
endif
|
||||
@ -169,7 +245,7 @@ function! s:_getCflags(ft, ck, opts) " {{{2
|
||||
endif
|
||||
|
||||
" 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:_get_checker_var('g', a:ft, a:ck, 'config_file', '.syntastic_' . a:ft . '_config')
|
||||
let flags .= ' ' . syntastic#c#ReadConfig(config_file)
|
||||
|
||||
return flags
|
||||
@ -177,7 +253,7 @@ endfunction " }}}2
|
||||
|
||||
" get the gcc include directory argument depending on the default
|
||||
" includes and the optional user-defined 'g:syntastic_c_include_dirs'
|
||||
function! s:_getIncludeDirs(filetype) " {{{2
|
||||
function! s:_get_include_dirs(filetype) " {{{2
|
||||
let include_dirs = []
|
||||
|
||||
if a:filetype =~# '\v^%(c|cpp|objc|objcpp)$' &&
|
||||
@ -195,7 +271,7 @@ endfunction " }}}2
|
||||
|
||||
" search the first 100 lines for include statements that are
|
||||
" given in the handlers dictionary
|
||||
function! s:_searchHeaders() " {{{2
|
||||
function! s:_search_headers() " {{{2
|
||||
let includes = ''
|
||||
let files = []
|
||||
let found = []
|
||||
@ -221,7 +297,7 @@ function! s:_searchHeaders() " {{{2
|
||||
" search included headers
|
||||
for hfile in files
|
||||
if hfile != ''
|
||||
let filename = expand('%:p:h') . syntastic#util#Slash() . hfile
|
||||
let filename = expand('%:p:h', 1) . syntastic#util#Slash() . hfile
|
||||
|
||||
try
|
||||
let lines = readfile(filename, '', 100)
|
||||
@ -250,69 +326,6 @@ function! s:_searchHeaders() " {{{2
|
||||
return includes
|
||||
endfunction " }}}2
|
||||
|
||||
" try to find library with 'pkg-config'
|
||||
" search possible libraries from first to last given
|
||||
" argument until one is found
|
||||
function! s:_check_pkg(name, ...) " {{{2
|
||||
if executable('pkg-config')
|
||||
if !has_key(s:cflags, a:name)
|
||||
for pkg in a:000
|
||||
let pkg_flags = system('pkg-config --cflags ' . pkg)
|
||||
" since we cannot necessarily trust the pkg-config exit code
|
||||
" we have to check for an error output as well
|
||||
if v:shell_error == 0 && pkg_flags !~? 'not found'
|
||||
let pkg_flags = ' ' . substitute(pkg_flags, "\n", '', '')
|
||||
let s:cflags[a:name] = pkg_flags
|
||||
return pkg_flags
|
||||
endif
|
||||
endfor
|
||||
else
|
||||
return s:cflags[a:name]
|
||||
endif
|
||||
endif
|
||||
return ''
|
||||
endfunction " }}}2
|
||||
|
||||
" try to find PHP includes with 'php-config'
|
||||
function! s:_check_php() " {{{2
|
||||
if executable('php-config')
|
||||
if !has_key(s:cflags, 'php')
|
||||
let s:cflags['php'] = system('php-config --includes')
|
||||
let s:cflags['php'] = ' ' . substitute(s:cflags['php'], "\n", '', '')
|
||||
endif
|
||||
return s:cflags['php']
|
||||
endif
|
||||
return ''
|
||||
endfunction " }}}2
|
||||
|
||||
" try to find the ruby headers with 'rbconfig'
|
||||
function! s:_check_ruby() " {{{2
|
||||
if executable('ruby')
|
||||
if !has_key(s:cflags, 'ruby')
|
||||
let s:cflags['ruby'] = system('ruby -r rbconfig -e ' .
|
||||
\ '''puts RbConfig::CONFIG["rubyhdrdir"] || RbConfig::CONFIG["archdir"]''')
|
||||
let s:cflags['ruby'] = substitute(s:cflags['ruby'], "\n", '', '')
|
||||
let s:cflags['ruby'] = ' -I' . s:cflags['ruby']
|
||||
endif
|
||||
return s:cflags['ruby']
|
||||
endif
|
||||
return ''
|
||||
endfunction " }}}2
|
||||
|
||||
" try to find the python headers with distutils
|
||||
function! s:_check_python() " {{{2
|
||||
if executable('python')
|
||||
if !has_key(s:cflags, 'python')
|
||||
let s:cflags['python'] = system('python -c ''from distutils import ' .
|
||||
\ 'sysconfig; import sys; sys.stdout.write(sysconfig.get_python_inc())''')
|
||||
let s:cflags['python'] = substitute(s:cflags['python'], "\n", '', '')
|
||||
let s:cflags['python'] = ' -I' . s:cflags['python']
|
||||
endif
|
||||
return s:cflags['python']
|
||||
endif
|
||||
return ''
|
||||
endfunction " }}}2
|
||||
|
||||
" }}}1
|
||||
|
||||
" default include directories
|
||||
|
@ -61,11 +61,11 @@ endfunction " }}}2
|
||||
" @vimlint(EVL102, 0, l:OLD_VAR)
|
||||
|
||||
function! syntastic#log#debug(level, msg, ...) " {{{2
|
||||
if !s:isDebugEnabled(a:level)
|
||||
if !s:_isDebugEnabled(a:level)
|
||||
return
|
||||
endif
|
||||
|
||||
let leader = s:_logTimestamp()
|
||||
let leader = s:_log_timestamp()
|
||||
call s:_logRedirect(1)
|
||||
|
||||
if a:0 > 0
|
||||
@ -81,11 +81,11 @@ function! syntastic#log#debug(level, msg, ...) " {{{2
|
||||
endfunction " }}}2
|
||||
|
||||
function! syntastic#log#debugShowOptions(level, names) " {{{2
|
||||
if !s:isDebugEnabled(a:level)
|
||||
if !s:_isDebugEnabled(a:level)
|
||||
return
|
||||
endif
|
||||
|
||||
let leader = s:_logTimestamp()
|
||||
let leader = s:_log_timestamp()
|
||||
call s:_logRedirect(1)
|
||||
|
||||
let vlist = copy(type(a:names) == type("") ? [a:names] : a:names)
|
||||
@ -97,16 +97,16 @@ function! syntastic#log#debugShowOptions(level, names) " {{{2
|
||||
endfunction " }}}2
|
||||
|
||||
function! syntastic#log#debugShowVariables(level, names) " {{{2
|
||||
if !s:isDebugEnabled(a:level)
|
||||
if !s:_isDebugEnabled(a:level)
|
||||
return
|
||||
endif
|
||||
|
||||
let leader = s:_logTimestamp()
|
||||
let leader = s:_log_timestamp()
|
||||
call s:_logRedirect(1)
|
||||
|
||||
let vlist = type(a:names) == type("") ? [a:names] : a:names
|
||||
for name in vlist
|
||||
let msg = s:_formatVariable(name)
|
||||
let msg = s:_format_variable(name)
|
||||
if msg != ''
|
||||
echomsg leader . msg
|
||||
endif
|
||||
@ -116,7 +116,7 @@ function! syntastic#log#debugShowVariables(level, names) " {{{2
|
||||
endfunction " }}}2
|
||||
|
||||
function! syntastic#log#debugDump(level) " {{{2
|
||||
if !s:isDebugEnabled(a:level)
|
||||
if !s:_isDebugEnabled(a:level)
|
||||
return
|
||||
endif
|
||||
|
||||
@ -136,14 +136,14 @@ function! s:_isDebugEnabled_dumb(level) " {{{2
|
||||
return (g:syntastic_debug / a:level) % 2
|
||||
endfunction " }}}2
|
||||
|
||||
let s:isDebugEnabled = function(exists('*and') ? 's:_isDebugEnabled_smart' : 's:_isDebugEnabled_dumb')
|
||||
lockvar s:isDebugEnabled
|
||||
let s:_isDebugEnabled = function(exists('*and') ? 's:_isDebugEnabled_smart' : 's:_isDebugEnabled_dumb')
|
||||
lockvar s:_isDebugEnabled
|
||||
|
||||
function! s:_logRedirect(on) " {{{2
|
||||
if exists("g:syntastic_debug_file")
|
||||
if a:on
|
||||
try
|
||||
execute 'redir >> ' . fnameescape(expand(g:syntastic_debug_file))
|
||||
execute 'redir >> ' . fnameescape(expand(g:syntastic_debug_file, 1))
|
||||
catch /\m^Vim\%((\a\+)\)\=:/
|
||||
silent! redir END
|
||||
unlet g:syntastic_debug_file
|
||||
@ -154,11 +154,15 @@ function! s:_logRedirect(on) " {{{2
|
||||
endif
|
||||
endfunction " }}}2
|
||||
|
||||
function! s:_logTimestamp() " {{{2
|
||||
" }}}1
|
||||
|
||||
" Utilities {{{1
|
||||
|
||||
function! s:_log_timestamp() " {{{2
|
||||
return 'syntastic: ' . split(reltimestr(reltime(g:_SYNTASTIC_START)))[0] . ': '
|
||||
endfunction " }}}2
|
||||
|
||||
function! s:_formatVariable(name) " {{{2
|
||||
function! s:_format_variable(name) " {{{2
|
||||
let vals = []
|
||||
if exists('g:syntastic_' . a:name)
|
||||
call add(vals, 'g:syntastic_' . a:name . ' = ' . strtrans(string(g:syntastic_{a:name})))
|
||||
|
@ -30,7 +30,7 @@ endfunction " }}}2
|
||||
|
||||
function! syntastic#preprocess#checkstyle(errors) " {{{2
|
||||
let out = []
|
||||
let fname = expand('%')
|
||||
let fname = expand('%', 1)
|
||||
for err in a:errors
|
||||
if match(err, '\m<error\>') > -1
|
||||
let line = str2nr(matchstr(err, '\m\<line="\zs\d\+\ze"'))
|
||||
@ -59,6 +59,70 @@ function! syntastic#preprocess#cppcheck(errors) " {{{2
|
||||
return map(copy(a:errors), 'substitute(v:val, ''\v^\[[^]]+\]\zs( -\> \[[^]]+\])+\ze:'', "", "")')
|
||||
endfunction " }}}2
|
||||
|
||||
" @vimlint(EVL102, 1, l:true)
|
||||
" @vimlint(EVL102, 1, l:false)
|
||||
" @vimlint(EVL102, 1, l:null)
|
||||
function! syntastic#preprocess#flow(errors) " {{{2
|
||||
" JSON artifacts
|
||||
let true = 1
|
||||
let false = 0
|
||||
let null = ''
|
||||
|
||||
" A hat tip to Marc Weber for this trick
|
||||
" http://stackoverflow.com/questions/17751186/iterating-over-a-string-in-vimscript-or-parse-a-json-file/19105763#19105763
|
||||
try
|
||||
let errs = eval(join(a:errors, ''))
|
||||
catch
|
||||
let errs = {}
|
||||
endtry
|
||||
|
||||
let out = []
|
||||
if type(errs) == type({}) && has_key(errs, 'errors') && type(errs['errors']) == type([])
|
||||
for e in errs['errors']
|
||||
if type(e) == type({}) && has_key(e, 'message') && type(e['message']) == type([]) && len(e['message'])
|
||||
let m = e['message'][0]
|
||||
let t = e['message'][1:]
|
||||
|
||||
try
|
||||
let msg =
|
||||
\ m['path'] . ':' .
|
||||
\ m['line'] . ':' .
|
||||
\ m['start'] . ':' .
|
||||
\ (m['line'] ==# m['endline'] ? m['end'] . ':' : '') .
|
||||
\ ' ' . m['descr']
|
||||
|
||||
if len(t)
|
||||
let msg .= ' ' . join(map(t,
|
||||
\ 'v:val["descr"] . " (" . v:val["path"] . ":" . v:val["line"] . ":" . v:val["start"] . ' .
|
||||
\ '"," . (v:val["line"] !=# v:val["endline"] ? v:val["endline"] . ":" : "") . ' .
|
||||
\ 'v:val["end"] . ")"'))
|
||||
endif
|
||||
|
||||
let msg = substitute(msg, '\r', '', 'g')
|
||||
let msg = substitute(msg, '\n', ' ', 'g')
|
||||
|
||||
call add(out, msg)
|
||||
catch /\m^Vim\%((\a\+)\)\=:E716/
|
||||
call syntastic#log#warn('checker javascript/flow: unknown error format')
|
||||
let out = []
|
||||
break
|
||||
endtry
|
||||
else
|
||||
call syntastic#log#warn('checker javascript/flow: unknown error format')
|
||||
let out = []
|
||||
break
|
||||
endif
|
||||
endfor
|
||||
else
|
||||
call syntastic#log#warn('checker javascript/flow: unknown error format')
|
||||
endif
|
||||
|
||||
return out
|
||||
endfunction " }}}2
|
||||
" @vimlint(EVL102, 0, l:true)
|
||||
" @vimlint(EVL102, 0, l:false)
|
||||
" @vimlint(EVL102, 0, l:null)
|
||||
|
||||
function! syntastic#preprocess#killEmpty(errors) " {{{2
|
||||
return filter(copy(a:errors), 'v:val != ""')
|
||||
endfunction " }}}2
|
||||
@ -67,7 +131,7 @@ function! syntastic#preprocess#perl(errors) " {{{2
|
||||
let out = []
|
||||
|
||||
for e in a:errors
|
||||
let parts = matchlist(e, '\v^(.*)\sat\s(.*)\sline\s(\d+)(.*)$')
|
||||
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
|
||||
@ -76,6 +140,9 @@ function! syntastic#preprocess#perl(errors) " {{{2
|
||||
return syntastic#util#unique(out)
|
||||
endfunction " }}}2
|
||||
|
||||
" @vimlint(EVL102, 1, l:true)
|
||||
" @vimlint(EVL102, 1, l:false)
|
||||
" @vimlint(EVL102, 1, l:null)
|
||||
function! syntastic#preprocess#prospector(errors) " {{{2
|
||||
" JSON artifacts
|
||||
let true = 1
|
||||
@ -125,6 +192,9 @@ function! syntastic#preprocess#prospector(errors) " {{{2
|
||||
|
||||
return out
|
||||
endfunction " }}}2
|
||||
" @vimlint(EVL102, 0, l:true)
|
||||
" @vimlint(EVL102, 0, l:false)
|
||||
" @vimlint(EVL102, 0, l:null)
|
||||
|
||||
function! syntastic#preprocess#rparse(errors) " {{{2
|
||||
let errlist = copy(a:errors)
|
||||
|
@ -47,6 +47,13 @@ function! syntastic#util#tmpdir() " {{{2
|
||||
else
|
||||
let tempdir = '/tmp/vim-syntastic-' . getpid()
|
||||
endif
|
||||
|
||||
try
|
||||
call mkdir(tempdir, 'p', 0700)
|
||||
catch /\m^Vim\%((\a\+)\)\=:E739/
|
||||
call syntastic#log#error(v:exception)
|
||||
let tempdir = '.'
|
||||
endtry
|
||||
endif
|
||||
|
||||
return tempdir
|
||||
@ -54,6 +61,11 @@ endfunction " }}}2
|
||||
|
||||
" Recursively remove a directory
|
||||
function! syntastic#util#rmrf(what) " {{{2
|
||||
" try to make sure we don't delete directories we didn't create
|
||||
if a:what !~? 'vim-syntastic-'
|
||||
return
|
||||
endif
|
||||
|
||||
if getftype(a:what) ==# 'dir'
|
||||
if !exists('s:rmrf')
|
||||
let s:rmrf =
|
||||
@ -141,14 +153,14 @@ 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')
|
||||
lockvar s:width
|
||||
let s:_width = function(exists('*strwidth') ? 'strwidth' : 'strlen')
|
||||
lockvar s:_width
|
||||
|
||||
function! syntastic#util#screenWidth(str, tabstop) " {{{2
|
||||
let chunks = split(a:str, "\t", 1)
|
||||
let width = s:width(chunks[-1])
|
||||
let width = s:_width(chunks[-1])
|
||||
for c in chunks[:-2]
|
||||
let cwidth = s:width(c)
|
||||
let cwidth = s:_width(c)
|
||||
let width += cwidth + a:tabstop - cwidth % a:tabstop
|
||||
endfor
|
||||
return width
|
||||
@ -166,7 +178,7 @@ function! syntastic#util#wideMsg(msg) " {{{2
|
||||
"convert tabs to spaces so that the tabs count towards the window
|
||||
"width as the proper amount of characters
|
||||
let chunks = split(msg, "\t", 1)
|
||||
let msg = join(map(chunks[:-2], 'v:val . repeat(" ", &tabstop - s:width(v:val) % &tabstop)'), '') . chunks[-1]
|
||||
let msg = join(map(chunks[:-2], 'v:val . repeat(" ", &tabstop - s:_width(v:val) % &tabstop)'), '') . chunks[-1]
|
||||
let msg = strpart(msg, 0, &columns - 1)
|
||||
|
||||
set noruler noshowcmd
|
||||
@ -212,7 +224,7 @@ function! syntastic#util#findInParent(what, where) " {{{2
|
||||
|
||||
let old = ''
|
||||
while here != ''
|
||||
let p = split(globpath(here, a:what), '\n')
|
||||
let p = split(globpath(here, a:what, 1), '\n')
|
||||
|
||||
if !empty(p)
|
||||
return fnamemodify(p[0], ':p')
|
||||
@ -249,8 +261,19 @@ function! syntastic#util#shescape(string) " {{{2
|
||||
endfunction " }}}2
|
||||
|
||||
" A less noisy shellescape(expand())
|
||||
function! syntastic#util#shexpand(string) " {{{2
|
||||
return syntastic#util#shescape(expand(a:string))
|
||||
function! syntastic#util#shexpand(string, ...) " {{{2
|
||||
return syntastic#util#shescape(a:0 ? expand(a:string, a:1) : expand(a:string, 1))
|
||||
endfunction " }}}2
|
||||
|
||||
" Escape arguments
|
||||
function! syntastic#util#argsescape(opt) " {{{2
|
||||
if type(a:opt) == type('') && a:opt != ''
|
||||
return [a:opt]
|
||||
elseif type(a:opt) == type([])
|
||||
return map(copy(a:opt), 'syntastic#util#shescape(v:val)')
|
||||
endif
|
||||
|
||||
return []
|
||||
endfunction " }}}2
|
||||
|
||||
" decode XML entities
|
||||
@ -311,16 +334,38 @@ function! s:_translateFilter(filters) " {{{2
|
||||
endfunction " }}}2
|
||||
|
||||
function! s:_translateElement(key, term) " {{{2
|
||||
if a:key ==? 'level'
|
||||
let ret = 'v:val["type"] !=? ' . string(a:term[0])
|
||||
elseif a:key ==? 'type'
|
||||
let ret = a:term ==? 'style' ? 'get(v:val, "subtype", "") !=? "style"' : 'has_key(v:val, "subtype")'
|
||||
elseif a:key ==? 'regex'
|
||||
let ret = 'v:val["text"] !~? ' . string(a:term)
|
||||
elseif a:key ==? 'file'
|
||||
let ret = 'bufname(str2nr(v:val["bufnr"])) !~# ' . string(a:term)
|
||||
let fkey = a:key
|
||||
if fkey[0] == '!'
|
||||
let fkey = fkey[1:]
|
||||
let not = 1
|
||||
else
|
||||
call syntastic#log#warn('quiet_messages: ignoring invalid key ' . strtrans(string(a:key)))
|
||||
let not = 0
|
||||
endif
|
||||
|
||||
if fkey ==? 'level'
|
||||
let op = not ? ' ==? ' : ' !=? '
|
||||
let ret = 'v:val["type"]' . op . string(a:term[0])
|
||||
elseif fkey ==? 'type'
|
||||
if a:term ==? 'style'
|
||||
let op = not ? ' ==? ' : ' !=? '
|
||||
let ret = 'get(v:val, "subtype", "")' . op . '"style"'
|
||||
else
|
||||
let op = not ? '!' : ''
|
||||
let ret = op . 'has_key(v:val, "subtype")'
|
||||
endif
|
||||
elseif fkey ==? 'regex'
|
||||
let op = not ? ' =~? ' : ' !~? '
|
||||
let ret = 'v:val["text"]' . op . string(a:term)
|
||||
elseif fkey ==? 'file' || fkey[:4] ==? 'file:'
|
||||
let op = not ? ' =~# ' : ' !~# '
|
||||
let ret = 'bufname(str2nr(v:val["bufnr"]))'
|
||||
let mod = fkey[4:]
|
||||
if mod != ''
|
||||
let ret = 'fnamemodify(' . ret . ', ' . string(mod) . ')'
|
||||
endif
|
||||
let ret .= op . string(a:term)
|
||||
else
|
||||
call syntastic#log#warn('quiet_messages: ignoring invalid key ' . strtrans(string(fkey)))
|
||||
let ret = "1"
|
||||
endif
|
||||
return ret
|
||||
@ -332,7 +377,11 @@ function! s:_rmrf(what) " {{{2
|
||||
endif
|
||||
|
||||
if getftype(a:what) ==# 'dir'
|
||||
for f in split(globpath(a:what, '*'), "\n")
|
||||
if filewritable(a:what) != 2
|
||||
return
|
||||
endif
|
||||
|
||||
for f in split(globpath(a:what, '*', 1), "\n")
|
||||
call s:_rmrf(f)
|
||||
endfor
|
||||
silent! call system(s:rmdir . ' ' . syntastic#util#shescape(a:what))
|
||||
|
Reference in New Issue
Block a user