From c658ff15a53824175067f9e9b64cb1ed36b9f2fa Mon Sep 17 00:00:00 2001 From: LCD 47 Date: Mon, 17 Feb 2014 23:32:53 +0200 Subject: [PATCH 1/7] Registry refactor. Simplify registry data structure. Simplify registru functions. Optimisations. --- plugin/syntastic.vim | 12 +-- plugin/syntastic/registry.vim | 185 +++++++++++++++------------------- syntax_checkers/sh/sh.vim | 3 +- 3 files changed, 88 insertions(+), 112 deletions(-) diff --git a/plugin/syntastic.vim b/plugin/syntastic.vim index 877d8d8d..d9ba5fee 100644 --- a/plugin/syntastic.vim +++ b/plugin/syntastic.vim @@ -138,9 +138,7 @@ let s:modemap = g:SyntasticModeMap.Instance() function! s:CompleteCheckerName(argLead, cmdLine, cursorPos) let checker_names = [] for ft in s:ResolveFiletypes() - for checker in s:registry.availableCheckersFor(ft) - call add(checker_names, checker.getName()) - endfor + call extend( checker_names, keys(s:registry.getCheckersMap(ft)) ) endfor return join(checker_names, "\n") endfunction @@ -153,7 +151,7 @@ endfunction " @vimlint(EVL103, 1, a:cmdLine) " @vimlint(EVL103, 1, a:argLead) function! s:CompleteFiletypes(argLead, cmdLine, cursorPos) - return join(s:registry.knownFiletypes(), "\n") + return join(s:registry.getKnownFiletypes(), "\n") endfunction " @vimlint(EVL103, 0, a:cursorPos) " @vimlint(EVL103, 0, a:cmdLine) @@ -294,7 +292,6 @@ function! s:CacheErrors(checkers) let newLoclist = g:SyntasticLoclist.New([]) if !s:SkipFile() - let active_checkers = 0 let names = [] call syntastic#log#debugShowOptions(g:SyntasticDebugTrace, s:debug_dump_options) @@ -307,10 +304,9 @@ function! s:CacheErrors(checkers) let decorate_errors = (aggregate_errors || len(filetypes) > 1) && syntastic#util#var('id_checkers') for ft in filetypes - let clist = empty(a:checkers) ? s:registry.getActiveCheckers(ft) : s:registry.getCheckers(ft, a:checkers) + let clist = s:registry.getCheckers(ft, a:checkers) for checker in clist - let active_checkers += 1 call syntastic#log#debug(g:SyntasticDebugTrace, 'CacheErrors: Invoking checker: ' . checker.getName()) let loclist = checker.getLocList() @@ -341,7 +337,7 @@ function! s:CacheErrors(checkers) endif endif - if !active_checkers + if empty(clist) if !empty(a:checkers) if len(a:checkers) == 1 call syntastic#log#warn('checker ' . a:checkers[0] . ' is not active for filetype ' . &filetype) diff --git a/plugin/syntastic/registry.vim b/plugin/syntastic/registry.vim index 433325c6..7621b374 100644 --- a/plugin/syntastic/registry.vim +++ b/plugin/syntastic/registry.vim @@ -3,6 +3,8 @@ if exists("g:loaded_syntastic_registry") endif let g:loaded_syntastic_registry = 1 +" Initialisation {{{1 + let s:defaultCheckers = { \ 'actionscript':['mxmlc'], \ 'ada': ['gcc'], @@ -95,17 +97,19 @@ let s:defaultFiletypeMap = { let g:SyntasticRegistry = {} +" }}}1 + +" Public methods {{{1 + " TODO: Handling of filetype aliases: all public methods take aliases as " parameters, all private methods take normalized filetypes. Public methods " are thus supposed to normalize filetypes before calling private methods. -" Public methods {{{1 - function! g:SyntasticRegistry.Instance() if !exists('s:SyntasticRegistryInstance') let s:SyntasticRegistryInstance = copy(self) + let s:SyntasticRegistryInstance._checkerRaw = {} let s:SyntasticRegistryInstance._checkerMap = {} - let s:SyntasticRegistryInstance._cachedCheckersFor = {} endif return s:SyntasticRegistryInstance @@ -117,166 +121,143 @@ function! g:SyntasticRegistry.CreateAndRegisterChecker(args) call registry._registerChecker(checker) endfunction -function! g:SyntasticRegistry.checkable(ftalias) - return !empty(self.getActiveCheckers(a:ftalias)) +function! g:SyntasticRegistry.isCheckable(ftalias) + let ft = s:normaliseFiletype(a:ftalias) + call self._loadCheckers(ft) + return !empty(self._checkerMap[ft]) endfunction -function! g:SyntasticRegistry.getActiveCheckers(ftalias) - let filetype = s:SyntasticRegistryNormaliseFiletype(a:ftalias) - let checkers = self.availableCheckersFor(a:ftalias) - - if self._userHasFiletypeSettings(filetype) - return self._filterCheckersByUserSettings(checkers, filetype) - endif - - if has_key(s:defaultCheckers, filetype) - return self._filterCheckersByDefaultSettings(checkers, filetype) - endif - - return checkers[0:0] +function! g:SyntasticRegistry.getCheckersMap(ftalias) + let ft = s:normaliseFiletype(a:ftalias) + call self._loadCheckers(ft) + return self._checkerMap[ft] endfunction function! g:SyntasticRegistry.getCheckers(ftalias, list) - return self._filterCheckersByName(self.availableCheckersFor(a:ftalias), a:list) -endfunction - -function! g:SyntasticRegistry.availableCheckersFor(ftalias) - 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) + let checkers_map = self.getCheckersMap(a:ftalias) + if empty(checkers_map) + return [] endif - return self._cachedCheckersFor[a:ftalias] + let ft = s:normaliseFiletype(a:ftalias) + call self._checkDeprecation(ft) + + let ft_list = + \ !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, []) + + return !empty(ft_list) ? + \ self._filterCheckersByName(checkers_map, ft_list) : [checkers_map[keys(checkers_map)[0]]] endfunction -function! g:SyntasticRegistry.knownFiletypes() +function! g:SyntasticRegistry.getKnownFiletypes() let types = keys(s:defaultCheckers) + call extend(types, keys(s:defaultFiletypeMap)) + if exists('g:syntastic_filetype_map') call extend(types, keys(g:syntastic_filetype_map)) endif + if exists('g:syntastic_extra_filetypes') && type(g:syntastic_extra_filetypes) == type([]) call extend(types, g:syntastic_extra_filetypes) endif + return syntastic#util#unique(types) endfunction function! g:SyntasticRegistry.echoInfoFor(ftalias_list) echomsg "Syntastic info for filetype: " . join(a:ftalias_list, '.') - let available = [] - let active = [] - for ftalias in a:ftalias_list - call extend(available, self.availableCheckersFor(ftalias)) - call extend(active, self.getActiveCheckers(ftalias)) - endfor + if len(a:ftalias_list) != 1 + let available = [] + let active = [] - echomsg "Available checker(s): " . join(syntastic#util#unique(map(available, "v:val.getName()"))) - echomsg "Currently enabled checker(s): " . join(syntastic#util#unique(map(active, "v:val.getName()"))) + for ftalias in a:ftalias_list + let ft = s:normaliseFiletype(ftalias) + call extend(available, map( keys(self.getCheckersMap(ftalias)), 'ft . "/" . v:val' )) + call extend(active, map( self.getCheckers(ftalias, []), 'ft . "/" . v:val.getName()' )) + endfor + else + let ft = a:ftalias_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 +" }}}1 + " Private methods {{{1 function! g:SyntasticRegistry._registerChecker(checker) abort let ft = a:checker.getFiletype() - if !has_key(self._checkerMap, ft) - let self._checkerMap[ft] = [] + if !has_key(self._checkerRaw, ft) + let self._checkerRaw[ft] = [] + let self._checkerMap[ft] = {} endif call self._validateUniqueName(a:checker) - call add(self._checkerMap[ft], a:checker) -endfunction + let name = a:checker.getName() + call add(self._checkerRaw[ft], name) -function! g:SyntasticRegistry._allCheckersFor(filetype) - call self._loadCheckers(a:filetype) - if empty(self._checkerMap[a:filetype]) - return [] + if a:checker.isAvailable() + let self._checkerMap[ft][name] = a:checker endif - - return self._checkerMap[a:filetype] endfunction -function! g:SyntasticRegistry._filterCheckersByDefaultSettings(checkers, filetype) - if has_key(s:defaultCheckers, 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()") +function! g:SyntasticRegistry._filterCheckersByName(checkers_map, list) + return filter( map(copy(a:list), 'get(a:checkers_map, v:val, {})'), '!empty(v:val)' ) endfunction function! g:SyntasticRegistry._loadCheckers(filetype) - if self._haveLoadedCheckers(a:filetype) + if has_key(self._checkerRaw, a:filetype) return endif execute "runtime! syntax_checkers/" . a:filetype . "/*.vim" - if !has_key(self._checkerMap, a:filetype) - let self._checkerMap[a:filetype] = [] + if !has_key(self._checkerRaw, a:filetype) + let self._checkerRaw[a:filetype] = [] + let self._checkerMap[a:filetype] = {} endif endfunction -function! g:SyntasticRegistry._haveLoadedCheckers(filetype) - return has_key(self._checkerMap, a:filetype) -endfunction - -function! g:SyntasticRegistry._userHasFiletypeSettings(filetype) - if exists("g:syntastic_" . a:filetype . "_checker") && !exists("g:syntastic_" . a:filetype . "_checkers") - let g:syntastic_{a:filetype}_checkers = [g:syntastic_{a:filetype}_checker] - call syntastic#log#deprecationWarn("variable g:syntastic_" . a:filetype . "_checker is deprecated") - endif - return exists("b:syntastic_checkers") || exists("g:syntastic_" . a:filetype . "_checkers") -endfunction - function! g:SyntasticRegistry._validateUniqueName(checker) abort - 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 + let ft = a:checker.getFiletype() + let name = a:checker.getName() + if index(self._checkerRaw[ft], name) > -1 + throw 'Syntastic: Duplicate syntax checker name: ' . ft . '/' . name + endif endfunction +" Check for obsolete variable g:syntastic__checker +function! g:SyntasticRegistry._checkDeprecation(filetype) + if exists('g:syntastic_' . a:filetype . '_checker') && !exists('g:syntastic_' . a:filetype . '_checkers') + let g:syntastic_{a:filetype}_checkers = [g:syntastic_{a:filetype}_checker] + call syntastic#log#deprecationWarn('variable g:syntastic_' . a:filetype . '_checker is deprecated') + endif +endfunction + +" }}}1 + " Private functions {{{1 "resolve filetype aliases, and replace - with _ otherwise we cant name "syntax checker functions legally for filetypes like "gentoo-metadata" -function! s:SyntasticRegistryNormaliseFiletype(ftalias) +function! s:normaliseFiletype(ftalias) let ft = get(s:defaultFiletypeMap, a:ftalias, a:ftalias) let ft = get(g:syntastic_filetype_map, ft, ft) let ft = substitute(ft, '\m-', '_', 'g') return ft endfunction +" }}}1 + " vim: set sw=4 sts=4 et fdm=marker: diff --git a/syntax_checkers/sh/sh.vim b/syntax_checkers/sh/sh.vim index 76182cdc..0cae2429 100644 --- a/syntax_checkers/sh/sh.vim +++ b/syntax_checkers/sh/sh.vim @@ -41,12 +41,11 @@ endfunction function! s:ForwardToZshChecker() let registry = g:SyntasticRegistry.Instance() - if registry.checkable('zsh') + if registry.isCheckable('zsh') return registry.getCheckers('zsh', ['zsh'])[0].getLocListRaw() else return [] endif - endfunction function! s:IsShellValid() From 0f3a1bf450b32e94e2fb0175535ce9c3b3318ed1 Mon Sep 17 00:00:00 2001 From: LCD 47 Date: Sun, 23 Feb 2014 10:22:37 +0200 Subject: [PATCH 2/7] Cleanup. Enforce sane loading order. Group global initialization. Minor logging fixes. New option: g:syntastic_bash_hack. --- autoload/syntastic/c.vim | 4 +- autoload/syntastic/log.vim | 56 ++++-------- autoload/syntastic/postprocess.vim | 4 +- autoload/syntastic/util.vim | 5 +- plugin/syntastic.vim | 138 +++++++++++++---------------- plugin/syntastic/autoloclist.vim | 6 +- plugin/syntastic/balloons.vim | 6 +- plugin/syntastic/checker.vim | 2 +- plugin/syntastic/cursor.vim | 6 +- plugin/syntastic/highlighting.vim | 6 +- plugin/syntastic/loclist.vim | 2 +- plugin/syntastic/modemap.vim | 2 +- plugin/syntastic/notifiers.vim | 2 +- plugin/syntastic/registry.vim | 2 +- plugin/syntastic/signs.vim | 23 +---- 15 files changed, 93 insertions(+), 171 deletions(-) diff --git a/autoload/syntastic/c.vim b/autoload/syntastic/c.vim index 82f4c704..6bdbe855 100644 --- a/autoload/syntastic/c.vim +++ b/autoload/syntastic/c.vim @@ -1,4 +1,4 @@ -if exists("g:loaded_syntastic_c_autoload") +if exists("g:loaded_syntastic_c_autoload") || !exists("g:loaded_syntastic_plugin") finish endif let g:loaded_syntastic_c_autoload = 1 @@ -327,4 +327,4 @@ call s:Init() let &cpo = 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: diff --git a/autoload/syntastic/log.vim b/autoload/syntastic/log.vim index 99698533..afc63476 100644 --- a/autoload/syntastic/log.vim +++ b/autoload/syntastic/log.vim @@ -1,4 +1,4 @@ -if exists("g:loaded_syntastic_log_autoload") +if exists("g:loaded_syntastic_log_autoload") || !exists("g:loaded_syntastic_plugin") finish endif let g:loaded_syntastic_log_autoload = 1 @@ -6,36 +6,6 @@ let g:loaded_syntastic_log_autoload = 1 let s:save_cpo = &cpo 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 = [] " Public functions {{{1 @@ -94,10 +64,10 @@ function! syntastic#log#debugShowOptions(level, names) let leader = s:logTimestamp() 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) - let vals = map(copy(vlist), "'&' . v:val . ' = ' . strtrans(string(eval('&' . v:val)))") - echomsg leader . join(vals, ', ') + call map(vlist, "'&' . v:val . ' = ' . strtrans(string(eval('&' . v:val)))") + echomsg leader . join(vlist, ', ') endif call s:logRedirect(0) endfunction @@ -112,7 +82,10 @@ function! syntastic#log#debugShowVariables(level, names) let vlist = type(a:names) == type("") ? [a:names] : a:names for name in vlist - echomsg leader . s:formatVariable(name) + let msg = s:formatVariable(name) + if msg != '' + echomsg leader . msg + endif endfor call s:logRedirect(0) @@ -123,7 +96,7 @@ function! syntastic#log#debugDump(level) return endif - call syntastic#log#debugShowVariables(a:level, s:global_options) + call syntastic#log#debugShowVariables( a:level, sort(keys(g:syntastic_defaults)) ) endfunction " Private functions {{{1 @@ -166,11 +139,11 @@ let s:logTimestamp = function(has('reltime') ? 's:logTimestamp_smart' : 's:logTi function! s:formatVariable(name) let vals = [] - if exists('g:' . a:name) - call add(vals, 'g:' . a:name . ' = ' . strtrans(string(g:{a:name}))) + if exists('g:syntastic_' . a:name) + call add(vals, 'g:syntastic_' . a:name . ' = ' . strtrans(string(g:syntastic_{a:name}))) endif - if exists('b:' . a:name) - call add(vals, 'b:' . a:name . ' = ' . strtrans(string(b:{a:name}))) + if exists('b:syntastic_' . a:name) + call add(vals, 'b:syntastic_' . a:name . ' = ' . strtrans(string(b:syntastic_{a:name}))) endif return join(vals, ', ') @@ -178,4 +151,5 @@ endfunction let &cpo = 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: diff --git a/autoload/syntastic/postprocess.vim b/autoload/syntastic/postprocess.vim index 877bb507..04ff731e 100644 --- a/autoload/syntastic/postprocess.vim +++ b/autoload/syntastic/postprocess.vim @@ -1,4 +1,4 @@ -if exists("g:loaded_syntastic_postprocess_autoload") +if exists("g:loaded_syntastic_postprocess_autoload") || !exists("g:loaded_syntastic_plugin") finish endif let g:loaded_syntastic_postprocess_autoload = 1 @@ -64,4 +64,4 @@ endfunction let &cpo = s:save_cpo unlet s:save_cpo -" vim: set et sts=4 sw=4: +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/autoload/syntastic/util.vim b/autoload/syntastic/util.vim index 1ab837a1..17557fc4 100644 --- a/autoload/syntastic/util.vim +++ b/autoload/syntastic/util.vim @@ -1,4 +1,4 @@ -if exists('g:loaded_syntastic_util_autoload') +if exists('g:loaded_syntastic_util_autoload') || !exists("g:loaded_syntastic_plugin") finish endif let g:loaded_syntastic_util_autoload = 1 @@ -248,4 +248,5 @@ endfunction let &cpo = 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: diff --git a/plugin/syntastic.vim b/plugin/syntastic.vim index d9ba5fee..a39652c8 100644 --- a/plugin/syntastic.vim +++ b/plugin/syntastic.vim @@ -19,8 +19,6 @@ if has('reltime') let g:syntastic_start = reltime() endif -runtime! plugin/syntastic/*.vim - let s:running_windows = syntastic#util#isRunningWindows() for s:feature in ['autocmd', 'eval', 'modify_fname', 'quickfix', 'user_commands'] @@ -39,59 +37,38 @@ if !s:running_windows && executable('uname') endtry endif -if !exists("g:syntastic_always_populate_loc_list") - let g:syntastic_always_populate_loc_list = 0 -endif +let g:syntastic_defaults = { + \ 'aggregate_errors': 0, + \ '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_auto_jump") - let g:syntastic_auto_jump = 0 -endif - -if !exists("g:syntastic_quiet_messages") - let g:syntastic_quiet_messages = {} -endif - -if !exists("g:syntastic_stl_format") - let g:syntastic_stl_format = '[Syntax: line:%F (%t)]' -endif - -if !exists("g:syntastic_check_on_open") - let g:syntastic_check_on_open = 0 -endif - -if !exists("g:syntastic_check_on_wq") - let g:syntastic_check_on_wq = 1 -endif - -if !exists("g:syntastic_aggregate_errors") - let g:syntastic_aggregate_errors = 0 -endif - -if !exists("g:syntastic_id_checkers") - let g:syntastic_id_checkers = 1 -endif - -if !exists("g:syntastic_loc_list_height") - let g:syntastic_loc_list_height = 10 -endif - -if !exists("g:syntastic_ignore_files") - let g:syntastic_ignore_files = [] -endif - -if !exists("g:syntastic_filetype_map") - let g:syntastic_filetype_map = {} -endif - -if !exists("g:syntastic_full_redraws") - let g:syntastic_full_redraws = !(has('gui_running') || has('gui_macvim')) -endif - -" TODO: not documented -if !exists("g:syntastic_reuse_loc_lists") - " a relevant bug has been fixed in one of the pre-releases of Vim 7.4 - let g:syntastic_reuse_loc_lists = (v:version >= 704) -endif +for s:key in keys(g:syntastic_defaults) + if !exists('g:syntastic_' . s:key) + let g:syntastic_{s:key} = g:syntastic_defaults[s:key] + endif +endfor 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") @@ -119,6 +96,8 @@ if v:version > 703 || (v:version == 703 && has('patch446')) call add(s:debug_dump_options, 'shellxescape') endif +runtime! plugin/syntastic/*.vim + " debug constants let g:SyntasticDebugTrace = 1 @@ -296,13 +275,14 @@ function! s:CacheErrors(checkers) call syntastic#log#debugShowOptions(g:SyntasticDebugTrace, s:debug_dump_options) 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()) let filetypes = s:ResolveFiletypes() let aggregate_errors = syntastic#util#var('aggregate_errors') let decorate_errors = (aggregate_errors || len(filetypes) > 1) && syntastic#util#var('id_checkers') + let clist = [] for ft in filetypes let clist = s:registry.getCheckers(ft, a:checkers) @@ -372,16 +352,6 @@ function! s:ShowLocList() call g:SyntasticLoclist.current().show() endfunction -"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 @@ -442,12 +412,7 @@ function! SyntasticMake(options) let old_lc_messages = $LC_MESSAGES let old_lc_all = $LC_ALL - if s:OSSupportsShellredirHack() - "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 + call s:bashHack() if has_key(a:options, 'errorformat') let &errorformat = a:options['errorformat'] @@ -483,7 +448,7 @@ function! SyntasticMake(options) let &shellredir = old_shellredir let &shell = old_shell - if s:IsRedrawRequiredAfterMake() + if !s:running_windows && (s:uname() =~ "FreeBSD" || s:uname() =~ "OpenBSD") call syntastic#util#redraw(g:syntastic_full_redraws) endif @@ -494,12 +459,12 @@ function! SyntasticMake(options) endif if has_key(a:options, 'defaults') - call SyntasticAddToErrors(errors, a:options['defaults']) + call s:addToErrors(errors, a:options['defaults']) endif " Add subtype info if present. if has_key(a:options, 'subtype') - call SyntasticAddToErrors(errors, { 'subtype': a:options['subtype'] }) + call s:addToErrors(errors, { 'subtype': a:options['subtype'] }) endif if has_key(a:options, 'postprocess') && !empty(a:options['postprocess']) @@ -512,8 +477,8 @@ function! SyntasticMake(options) return errors endfunction -"take a list of errors and add default values to them from a:options -function! SyntasticAddToErrors(errors, options) +" Take a list of errors and add default values to them from a:options +function! s:addToErrors(errors, options) for err in a:errors for key in keys(a:options) if !has_key(err, key) || empty(err[key]) @@ -525,4 +490,23 @@ function! SyntasticAddToErrors(errors, options) return a:errors endfunction -" 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() + 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 + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/plugin/syntastic/autoloclist.vim b/plugin/syntastic/autoloclist.vim index f0038e11..3e6de2d8 100644 --- a/plugin/syntastic/autoloclist.vim +++ b/plugin/syntastic/autoloclist.vim @@ -1,12 +1,8 @@ -if exists("g:loaded_syntastic_notifier_autoloclist") +if exists("g:loaded_syntastic_notifier_autoloclist") || !exists("g:loaded_syntastic_plugin") finish endif 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 = {} " Public methods {{{1 diff --git a/plugin/syntastic/balloons.vim b/plugin/syntastic/balloons.vim index 184a0528..38b88ecb 100644 --- a/plugin/syntastic/balloons.vim +++ b/plugin/syntastic/balloons.vim @@ -1,12 +1,8 @@ -if exists("g:loaded_syntastic_notifier_balloons") +if exists("g:loaded_syntastic_notifier_balloons") || !exists("g:loaded_syntastic_plugin") finish endif let g:loaded_syntastic_notifier_balloons = 1 -if !exists("g:syntastic_enable_balloons") - let g:syntastic_enable_balloons = 1 -endif - if !has('balloon_eval') let g:syntastic_enable_balloons = 0 endif diff --git a/plugin/syntastic/checker.vim b/plugin/syntastic/checker.vim index 94cbdb03..148d406c 100644 --- a/plugin/syntastic/checker.vim +++ b/plugin/syntastic/checker.vim @@ -1,4 +1,4 @@ -if exists("g:loaded_syntastic_checker") +if exists("g:loaded_syntastic_checker") || !exists("g:loaded_syntastic_plugin") finish endif let g:loaded_syntastic_checker = 1 diff --git a/plugin/syntastic/cursor.vim b/plugin/syntastic/cursor.vim index 5e24ae14..c5f8c1d5 100644 --- a/plugin/syntastic/cursor.vim +++ b/plugin/syntastic/cursor.vim @@ -1,12 +1,8 @@ -if exists("g:loaded_syntastic_notifier_cursor") +if exists("g:loaded_syntastic_notifier_cursor") || !exists("g:loaded_syntastic_plugin") finish endif 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 = {} " Public methods {{{1 diff --git a/plugin/syntastic/highlighting.vim b/plugin/syntastic/highlighting.vim index 80d31f19..98f6e147 100644 --- a/plugin/syntastic/highlighting.vim +++ b/plugin/syntastic/highlighting.vim @@ -1,4 +1,4 @@ -if exists("g:loaded_syntastic_notifier_highlighting") +if exists("g:loaded_syntastic_notifier_highlighting") || !exists("g:loaded_syntastic_plugin") finish endif let g:loaded_syntastic_notifier_highlighting = 1 @@ -6,10 +6,6 @@ let g:loaded_syntastic_notifier_highlighting = 1 " Highlighting requires getmatches introduced in 7.1.040 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 s:setup_done = 0 diff --git a/plugin/syntastic/loclist.vim b/plugin/syntastic/loclist.vim index 052501c4..570ba382 100644 --- a/plugin/syntastic/loclist.vim +++ b/plugin/syntastic/loclist.vim @@ -1,4 +1,4 @@ -if exists("g:loaded_syntastic_loclist") +if exists("g:loaded_syntastic_loclist") || !exists("g:loaded_syntastic_plugin") finish endif let g:loaded_syntastic_loclist = 1 diff --git a/plugin/syntastic/modemap.vim b/plugin/syntastic/modemap.vim index 9b04235c..a0e43293 100644 --- a/plugin/syntastic/modemap.vim +++ b/plugin/syntastic/modemap.vim @@ -1,4 +1,4 @@ -if exists("g:loaded_syntastic_modemap") +if exists("g:loaded_syntastic_modemap") || !exists("g:loaded_syntastic_plugin") finish endif let g:loaded_syntastic_modemap = 1 diff --git a/plugin/syntastic/notifiers.vim b/plugin/syntastic/notifiers.vim index 58f3448a..0dcc82cf 100644 --- a/plugin/syntastic/notifiers.vim +++ b/plugin/syntastic/notifiers.vim @@ -1,4 +1,4 @@ -if exists("g:loaded_syntastic_notifiers") +if exists("g:loaded_syntastic_notifiers") || !exists("g:loaded_syntastic_plugin") finish endif let g:loaded_syntastic_notifiers = 1 diff --git a/plugin/syntastic/registry.vim b/plugin/syntastic/registry.vim index 7621b374..64c72286 100644 --- a/plugin/syntastic/registry.vim +++ b/plugin/syntastic/registry.vim @@ -1,4 +1,4 @@ -if exists("g:loaded_syntastic_registry") +if exists("g:loaded_syntastic_registry") || !exists("g:loaded_syntastic_plugin") finish endif let g:loaded_syntastic_registry = 1 diff --git a/plugin/syntastic/signs.vim b/plugin/syntastic/signs.vim index 3b1e7522..487634af 100644 --- a/plugin/syntastic/signs.vim +++ b/plugin/syntastic/signs.vim @@ -1,29 +1,8 @@ -if exists("g:loaded_syntastic_notifier_signs") +if exists("g:loaded_syntastic_notifier_signs") || !exists("g:loaded_syntastic_plugin") finish endif let g:loaded_syntastic_notifier_signs = 1 -if !exists("g:syntastic_enable_signs") - 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 " with any other code that places signs (not sure if this precaution is " actually needed) From 47e5739f2e08e8aab3fc68d8498716d459bf9c1c Mon Sep 17 00:00:00 2001 From: LCD 47 Date: Sun, 23 Feb 2014 11:07:39 +0200 Subject: [PATCH 3/7] Formatting. Improved folding. Consistent naming of private methods. Moving a few functions arround. --- autoload/syntastic/c.vim | 120 +++++++++---------- autoload/syntastic/log.vim | 60 +++++----- autoload/syntastic/postprocess.vim | 28 +++-- autoload/syntastic/util.vim | 88 +++++++------- plugin/syntastic.vim | 179 ++++++++++++++++------------- plugin/syntastic/autoloclist.vim | 14 ++- plugin/syntastic/balloons.vim | 24 ++-- plugin/syntastic/checker.vim | 62 +++++----- plugin/syntastic/cursor.vim | 24 ++-- plugin/syntastic/highlighting.vim | 24 ++-- plugin/syntastic/loclist.vim | 90 ++++++++------- plugin/syntastic/modemap.vim | 36 +++--- plugin/syntastic/notifiers.vim | 20 ++-- plugin/syntastic/registry.vim | 52 ++++----- plugin/syntastic/signs.vim | 36 +++--- 15 files changed, 468 insertions(+), 389 deletions(-) diff --git a/autoload/syntastic/c.vim b/autoload/syntastic/c.vim index 6bdbe855..bf6a4917 100644 --- a/autoload/syntastic/c.vim +++ b/autoload/syntastic/c.vim @@ -10,14 +10,14 @@ set cpo&vim " convenience function to determine the 'null device' parameter " 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() return known_os ? '-o ' . syntastic#util#DevNull() : '' -endfunction +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) +function! syntastic#c#ReadConfig(file) " {{{2 " search in the current file's directory upwards let config = findfile(a:file, '.;') if config == '' || !filereadable(config) @@ -57,12 +57,12 @@ function! syntastic#c#ReadConfig(file) endfor return join(map(parameters, 'syntastic#util#shescape(v:val)')) -endfunction +endfunction " }}}2 " GetLocList() for C-like compilers -function! syntastic#c#GetLocList(filetype, subchecker, options) +function! syntastic#c#GetLocList(filetype, subchecker, options) " {{{2 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$/ return [] endtry @@ -70,9 +70,9 @@ function! syntastic#c#GetLocList(filetype, subchecker, options) 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: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'] : [] " process makeprg @@ -80,34 +80,45 @@ function! syntastic#c#GetLocList(filetype, subchecker, options) \ 'makeprg': makeprg, \ 'errorformat': errorformat, \ 'postprocess': postprocess }) -endfunction +endfunction " }}}2 + +" }}}1 " Private functions {{{1 " initialize c/cpp syntax checker handlers -function! s:Init() +function! s:init() " {{{2 let s:handlers = [] let s:cflags = {} - call s:RegHandler('\m\', 'syntastic#c#CheckPhp', []) - call s:RegHandler('\m\', 'syntastic#c#CheckPython', []) - call s:RegHandler('\m\', 'syntastic#c#checkPHP', []) + call s:regHandler('\m\', 'syntastic#c#checkPython', []) + call s:regHandler('\m\" echohl ErrorMsg echomsg "syntastic: error: " . a:msg 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 return endif call add(s:deprecation_notices_issued, 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) return endif @@ -54,9 +54,9 @@ function! syntastic#log#debug(level, msg, ...) endif 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) return endif @@ -70,9 +70,9 @@ function! syntastic#log#debugShowOptions(level, names) echomsg leader . join(vlist, ', ') endif 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) return endif @@ -89,30 +89,32 @@ function! syntastic#log#debugShowVariables(level, names) endfor call s:logRedirect(0) -endfunction +endfunction " }}}2 -function! syntastic#log#debugDump(level) +function! syntastic#log#debugDump(level) " {{{2 if !s:isDebugEnabled(a:level) return endif call syntastic#log#debugShowVariables( a:level, sort(keys(g:syntastic_defaults)) ) -endfunction +endfunction " }}}2 + +" }}}1 " Private functions {{{1 -function! s:isDebugEnabled_smart(level) +function! s:isDebugEnabled_smart(level) " {{{2 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 return (g:syntastic_debug / a:level) % 2 -endfunction +endfunction " }}}2 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 a:on try @@ -125,19 +127,19 @@ function! s:logRedirect(on) silent! redir END endif endif -endfunction +endfunction " }}}2 -function! s:logTimestamp_smart() +function! s:logTimestamp_smart() " {{{2 return 'syntastic: ' . split(reltimestr(reltime(g:syntastic_start)))[0] . ': ' -endfunction +endfunction " }}}2 -function! s:logTimestamp_dumb() +function! s:logTimestamp_dumb() " {{{2 return 'syntastic: debug: ' -endfunction +endfunction " }}}2 let s:logTimestamp = function(has('reltime') ? 's:logTimestamp_smart' : 's:logTimestamp_dumb') -function! s:formatVariable(name) +function! s:formatVariable(name) " {{{2 let vals = [] if exists('g:syntastic_' . a:name) call add(vals, 'g:syntastic_' . a:name . ' = ' . strtrans(string(g:syntastic_{a:name}))) @@ -147,7 +149,9 @@ function! s:formatVariable(name) endif return join(vals, ', ') -endfunction +endfunction " }}}2 + +" }}}1 let &cpo = s:save_cpo unlet s:save_cpo diff --git a/autoload/syntastic/postprocess.vim b/autoload/syntastic/postprocess.vim index 04ff731e..1558f0f8 100644 --- a/autoload/syntastic/postprocess.vim +++ b/autoload/syntastic/postprocess.vim @@ -6,7 +6,9 @@ let g:loaded_syntastic_postprocess_autoload = 1 let s:save_cpo = &cpo set cpo&vim -function! s:compareErrorItems(a, b) +" Public functions {{{1 + +function! s:compareErrorItems(a, b) " {{{2 if a:a['bufnr'] != a:b['bufnr'] " group by files return a:a['bufnr'] - a:b['bufnr'] @@ -18,15 +20,15 @@ function! s:compareErrorItems(a, b) else return get(a:a, 'col', 0) - get(a:b, 'col', 0) endif -endfunction +endfunction " }}}2 " natural sort -function! syntastic#postprocess#sort(errors) +function! syntastic#postprocess#sort(errors) " {{{2 return sort(copy(a:errors), 's:compareErrorItems') -endfunction +endfunction " }}}2 " merge consecutive blanks -function! syntastic#postprocess#compressWhitespace(errors) +function! syntastic#postprocess#compressWhitespace(errors) " {{{2 for e in a:errors let e['text'] = substitute(e['text'], "\001", '', 'g') let e['text'] = substitute(e['text'], '\n', ' ', 'g') @@ -34,10 +36,10 @@ function! syntastic#postprocess#compressWhitespace(errors) endfor return a:errors -endfunction +endfunction " }}}2 " remove spurious CR under Cygwin -function! syntastic#postprocess#cygwinRemoveCR(errors) +function! syntastic#postprocess#cygwinRemoveCR(errors) " {{{2 if has('win32unix') for e in a:errors let e['text'] = substitute(e['text'], '\r', '', 'g') @@ -45,21 +47,23 @@ function! syntastic#postprocess#cygwinRemoveCR(errors) endif return a:errors -endfunction +endfunction " }}}2 " decode XML entities -function! syntastic#postprocess#decodeXMLEntities(errors) +function! syntastic#postprocess#decodeXMLEntities(errors) " {{{2 for e in a:errors let e['text'] = syntastic#util#decodeXMLEntities(e['text']) endfor return a:errors -endfunction +endfunction " }}}2 " 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('')) -endfunction +endfunction " }}}2 + +" }}}1 let &cpo = s:save_cpo unlet s:save_cpo diff --git a/autoload/syntastic/util.vim b/autoload/syntastic/util.vim index 17557fc4..a6d94b15 100644 --- a/autoload/syntastic/util.vim +++ b/autoload/syntastic/util.vim @@ -6,27 +6,23 @@ let g:loaded_syntastic_util_autoload = 1 let s:save_cpo = &cpo 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 -function! syntastic#util#isRunningWindows() +function! syntastic#util#isRunningWindows() " {{{2 return has('win16') || has('win32') || has('win64') -endfunction +endfunction " }}}2 -function! syntastic#util#DevNull() +function! syntastic#util#DevNull() " {{{2 if syntastic#util#isRunningWindows() return 'NUL' endif return '/dev/null' -endfunction +endfunction " }}}2 " Get directory separator -function! syntastic#util#Slash() abort +function! syntastic#util#Slash() abort " {{{2 return (!exists("+shellslash") || &shellslash) ? '/' : '\' -endfunction +endfunction " }}}2 "search the first 5 lines of the file for a magic number and return a map "containing the args and the executable @@ -38,7 +34,7 @@ endfunction "returns " "{'exe': '/usr/bin/perl', 'args': ['-f', '-bar']} -function! syntastic#util#parseShebang() +function! syntastic#util#parseShebang() " {{{2 for lnum in range(1,5) let line = getline(lnum) @@ -50,25 +46,25 @@ function! syntastic#util#parseShebang() endfor return { 'exe': '', 'args': [] } -endfunction +endfunction " }}}2 " 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 \ exists('b:syntastic_' . a:name) ? b:syntastic_{a:name} : \ exists('g:syntastic_' . a:name) ? g:syntastic_{a:name} : '' -endfunction +endfunction " }}}2 " 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\.') -endfunction +endfunction " }}}2 " Run 'command' in a shell and parse output as a version string. " Returns an array of version components. -function! syntastic#util#getVersion(command) +function! syntastic#util#getVersion(command) " {{{2 return syntastic#util#parseVersion(system(a:command)) -endfunction +endfunction " }}}2 " Verify that the 'installed' version is at least the 'required' version. " @@ -76,7 +72,7 @@ endfunction " the "missing" elements will be assumed to be 0 for the purposes of checking. " " 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)])) let installed_element = get(a:installed, idx, 0) let required_element = get(a:required, idx, 0) @@ -86,10 +82,14 @@ function! syntastic#util#versionIsAtLeast(installed, required) endfor " Everything matched, so it is at least the required version. 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 -function! syntastic#util#wideMsg(msg) +function! syntastic#util#wideMsg(msg) " {{{2 let old_ruler = &ruler let old_showcmd = &showcmd @@ -110,10 +110,10 @@ function! syntastic#util#wideMsg(msg) let &ruler = old_ruler let &showcmd = old_showcmd -endfunction +endfunction " }}}2 " 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 let buf = str2nr(a:buffer) @@ -129,11 +129,11 @@ function! syntastic#util#bufIsActive(buffer) endfor return 0 -endfunction +endfunction " }}}2 " start in directory a:where and walk up the parent folders until it " 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 root = syntastic#util#Slash() @@ -162,10 +162,10 @@ function! syntastic#util#findInParent(what, where) endwhile return '' -endfunction +endfunction " }}}2 " Returns unique elements in a list -function! syntastic#util#unique(list) +function! syntastic#util#unique(list) " {{{2 let seen = {} let uniques = [] for e in a:list @@ -175,20 +175,20 @@ function! syntastic#util#unique(list) endif endfor return uniques -endfunction +endfunction " }}}2 " 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) -endfunction +endfunction " }}}2 " A less noisy shellescape(expand()) -function! syntastic#util#shexpand(string) +function! syntastic#util#shexpand(string) " {{{2 return syntastic#util#shescape(expand(a:string)) -endfunction +endfunction " }}}2 " decode XML entities -function! syntastic#util#decodeXMLEntities(string) +function! syntastic#util#decodeXMLEntities(string) " {{{2 let str = a:string let str = substitute(str, '\m<', '<', 'g') let str = substitute(str, '\m>', '>', 'g') @@ -196,17 +196,17 @@ function! syntastic#util#decodeXMLEntities(string) let str = substitute(str, '\m'', "'", 'g') let str = substitute(str, '\m&', '\&', 'g') return str -endfunction +endfunction " }}}2 -function! syntastic#util#redraw(full) +function! syntastic#util#redraw(full) " {{{2 if a:full redraw! else redraw endif -endfunction +endfunction " }}}2 -function! syntastic#util#dictFilter(errors, filter) +function! syntastic#util#dictFilter(errors, filter) " {{{2 let rules = s:translateFilter(a:filter) " call syntastic#log#debug(g:SyntasticDebugFilters, "applying filter:", rules) try @@ -215,11 +215,13 @@ function! syntastic#util#dictFilter(errors, filter) let msg = matchstr(v:exception, '\m^Vim\%((\a\+)\)\=:\zs.*') call syntastic#log#error('quiet_messages: ' . msg) endtry -endfunction +endfunction " }}}2 + +" }}}1 " Private functions {{{1 -function! s:translateFilter(filters) +function! s:translateFilter(filters) " {{{2 let conditions = [] for k in keys(a:filters) if type(a:filters[k]) == type([]) @@ -229,9 +231,9 @@ function! s:translateFilter(filters) endif endfor return len(conditions) == 1 ? conditions[0] : join(map(conditions, '"(" . v:val . ")"'), ' && ') -endfunction +endfunction " }}}2 -function! s:translateElement(key, term) +function! s:translateElement(key, term) " {{{2 if a:key ==? 'level' let ret = 'v:val["type"] !=? ' . string(a:term[0]) elseif a:key ==? 'type' @@ -244,7 +246,9 @@ function! s:translateElement(key, term) let ret = "1" endif return ret -endfunction +endfunction " }}}2 + +" }}}1 let &cpo = s:save_cpo unlet s:save_cpo diff --git a/plugin/syntastic.vim b/plugin/syntastic.vim index a39652c8..7bec8da0 100644 --- a/plugin/syntastic.vim +++ b/plugin/syntastic.vim @@ -19,7 +19,7 @@ if has('reltime') let g:syntastic_start = reltime() endif -let s:running_windows = syntastic#util#isRunningWindows() +" Sanity checks {{{1 for s:feature in ['autocmd', 'eval', 'modify_fname', 'quickfix', 'user_commands'] if !has(s:feature) @@ -28,6 +28,7 @@ for s:feature in ['autocmd', 'eval', 'modify_fname', 'quickfix', 'user_commands' endif endfor +let s:running_windows = syntastic#util#isRunningWindows() if !s:running_windows && executable('uname') try let s:uname = system('uname') @@ -37,6 +38,10 @@ if !s:running_windows && executable('uname') endtry endif +" }}}1 + +" Defaults {{{1 + let g:syntastic_defaults = { \ 'aggregate_errors': 0, \ 'always_populate_loc_list': 0, @@ -82,6 +87,10 @@ if exists("g:syntastic_quiet_warnings") endif endif +" }}}1 + +" Debug {{{1 + let s:debug_dump_options = [ \ 'shell', \ 'shellcmdflag', @@ -96,9 +105,6 @@ if v:version > 703 || (v:version == 703 && has('patch446')) call add(s:debug_dump_options, 'shellxescape') endif -runtime! plugin/syntastic/*.vim - - " debug constants let g:SyntasticDebugTrace = 1 let g:SyntasticDebugLoclist = 2 @@ -106,21 +112,26 @@ let g:SyntasticDebugNotifications = 4 let g:SyntasticDebugAutocommands = 8 let g:SyntasticDebugVariables = 16 +" }}}1 + +runtime! plugin/syntastic/*.vim + let s:registry = g:SyntasticRegistry.Instance() let s:notifiers = g:SyntasticNotifiers.Instance() let s:modemap = g:SyntasticModeMap.Instance() +" Commands {{{1 " @vimlint(EVL103, 1, a:cursorPos) " @vimlint(EVL103, 1, a:cmdLine) " @vimlint(EVL103, 1, a:argLead) -function! s:CompleteCheckerName(argLead, cmdLine, cursorPos) +function! s:CompleteCheckerName(argLead, cmdLine, cursorPos) " {{{2 let checker_names = [] - for ft in s:ResolveFiletypes() + for ft in s:resolveFiletypes() call extend( checker_names, keys(s:registry.getCheckersMap(ft)) ) endfor return join(checker_names, "\n") -endfunction +endfunction " }}}2 " @vimlint(EVL103, 0, a:cursorPos) " @vimlint(EVL103, 0, a:cmdLine) " @vimlint(EVL103, 0, a:argLead) @@ -129,14 +140,13 @@ endfunction " @vimlint(EVL103, 1, a:cursorPos) " @vimlint(EVL103, 1, a:cmdLine) " @vimlint(EVL103, 1, a:argLead) -function! s:CompleteFiletypes(argLead, cmdLine, cursorPos) +function! s:CompleteFiletypes(argLead, cmdLine, cursorPos) " {{{2 return join(s:registry.getKnownFiletypes(), "\n") -endfunction +endfunction " }}}2 " @vimlint(EVL103, 0, a:cursorPos) " @vimlint(EVL103, 0, a:cmdLine) " @vimlint(EVL103, 0, a:argLead) - command! SyntasticToggleMode call s:ToggleMode() command! -nargs=* -complete=custom,s:CompleteCheckerName SyntasticCheck \ call s:UpdateErrors(0, ) @@ -144,12 +154,16 @@ command! -nargs=* -complete=custom,s:CompleteCheckerName SyntasticCheck command! Errors call s:ShowLocList() command! -nargs=? -complete=custom,s:CompleteFiletypes SyntasticInfo \ call s:modemap.echoMode() | - \ call s:registry.echoInfoFor(s:ResolveFiletypes()) + \ call s:registry.echoInfoFor(s:resolveFiletypes()) command! SyntasticReset \ call s:ClearCache() | \ call s:notifiers.refresh(g:SyntasticLoclist.New([])) command! SyntasticSetLoclist call g:SyntasticLoclist.current().setloclist() +" }}}1 + +" Autocommands and hooks {{{1 + augroup syntastic autocmd BufReadPost * call s:BufReadPostHook() autocmd BufWritePost * call s:BufWritePostHook() @@ -168,31 +182,30 @@ if v:version > 703 || (v:version == 703 && has('patch544')) augroup END endif - -function! s:BufReadPostHook() +function! s:BufReadPostHook() " {{{2 if g:syntastic_check_on_open call syntastic#log#debug(g:SyntasticDebugAutocommands, \ 'autocmd: BufReadPost, buffer ' . bufnr("") . ' = ' . string(bufname(str2nr(bufnr(""))))) call s:UpdateErrors(1) endif -endfunction +endfunction " }}}2 -function! s:BufWritePostHook() +function! s:BufWritePostHook() " {{{2 call syntastic#log#debug(g:SyntasticDebugAutocommands, \ 'autocmd: BufWritePost, buffer ' . bufnr("") . ' = ' . string(bufname(str2nr(bufnr(""))))) call s:UpdateErrors(1) -endfunction +endfunction " }}}2 -function! s:BufWinEnterHook() +function! s:BufWinEnterHook() " {{{2 call syntastic#log#debug(g:SyntasticDebugAutocommands, \ 'autocmd: BufWinEnter, buffer ' . bufnr("") . ' = ' . string(bufname(str2nr(bufnr("")))) . \ ', &buftype = ' . string(&buftype)) if &buftype == '' call s:notifiers.refresh(g:SyntasticLoclist.current()) endif -endfunction +endfunction " }}}2 -function! s:BufEnterHook() +function! s:BufEnterHook() " {{{2 call syntastic#log#debug(g:SyntasticDebugAutocommands, \ 'autocmd: BufEnter, buffer ' . bufnr("") . ' = ' . string(bufname(str2nr(bufnr("")))) . \ ', &buftype = ' . string(&buftype)) @@ -202,18 +215,22 @@ function! s:BufEnterHook() if &buftype == 'quickfix' && !empty(loclist) && empty(filter( buffers, 'syntastic#util#bufIsActive(v:val)' )) call g:SyntasticLoclistHide() endif -endfunction +endfunction " }}}2 -function! s:QuitPreHook() +function! s:QuitPreHook() " {{{2 call syntastic#log#debug(g:SyntasticDebugAutocommands, \ 'autocmd: QuitPre, buffer ' . bufnr("") . ' = ' . string(bufname(str2nr(bufnr(""))))) let b:syntastic_skip_checks = !g:syntastic_check_on_wq call g:SyntasticLoclistHide() -endfunction +endfunction " }}}2 + +" }}}1 + +" Main {{{1 "refresh and redraw all the error info for this buf when saving or reading -function! s:UpdateErrors(auto_invoked, ...) - if s:SkipFile() +function! s:UpdateErrors(auto_invoked, ...) " {{{2 + if s:skipFile() return endif @@ -252,25 +269,20 @@ function! s:UpdateErrors(auto_invoked, ...) endif call s:notifiers.refresh(loclist) -endfunction +endfunction " }}}2 "clear the loc list for the buffer -function! s:ClearCache() +function! s:ClearCache() " {{{2 call s:notifiers.reset(g:SyntasticLoclist.current()) unlet! b:syntastic_loclist -endfunction - -function! s:ResolveFiletypes(...) - let type = a:0 ? a:1 : &filetype - return split( get(g:syntastic_filetype_map, type, type), '\m\.' ) -endfunction +endfunction " }}}2 "detect and cache all syntax errors in this buffer -function! s:CacheErrors(checkers) +function! s:CacheErrors(checkers) " {{{2 call s:ClearCache() let newLoclist = g:SyntasticLoclist.New([]) - if !s:SkipFile() + if !s:skipFile() let names = [] call syntastic#log#debugShowOptions(g:SyntasticDebugTrace, s:debug_dump_options) @@ -278,7 +290,7 @@ function! s:CacheErrors(checkers) call syntastic#log#debugShowVariables(g:SyntasticDebugTrace, 'aggregate_errors') call syntastic#log#debug(g:SyntasticDebugTrace, 'getcwd() = ' . getcwd()) - let filetypes = s:ResolveFiletypes() + let filetypes = s:resolveFiletypes() let aggregate_errors = syntastic#util#var('aggregate_errors') let decorate_errors = (aggregate_errors || len(filetypes) > 1) && syntastic#util#var('id_checkers') @@ -338,51 +350,19 @@ function! s:CacheErrors(checkers) endif let b:syntastic_loclist = newLoclist -endfunction +endfunction " }}}2 -function! s:ToggleMode() +function! s:ToggleMode() " {{{2 call s:modemap.toggleMode() call s:ClearCache() call s:UpdateErrors(1) call s:modemap.echoMode() -endfunction +endfunction " }}}2 "display the cached errors for this buf in the location list -function! s:ShowLocList() +function! s:ShowLocList() " {{{2 call g:SyntasticLoclist.current().show() -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 +endfunction " }}}2 "Emulates the :lmake command. Sets up the make environment according to the "options given, runs make, resets the environment, returns the location list @@ -401,7 +381,7 @@ endfunction " 'postprocess' - a list of functions to be applied to the error list " 'cwd' - change directory to the given path before running 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) let old_shell = &shell @@ -475,10 +455,44 @@ function! SyntasticMake(options) endif return errors -endfunction +endfunction " }}}2 + +"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() " {{{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) +function! s:addToErrors(errors, options) " {{{2 for err in a:errors for key in keys(a:options) if !has_key(err, key) || empty(err[key]) @@ -488,11 +502,11 @@ function! s:addToErrors(errors, options) endfor return a:errors -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:bashHack() +function! s:bashHack() " {{{2 if !exists('s:bash') if !s:running_windows && (s:uname() !~# "FreeBSD") && (s:uname() !~# "OpenBSD") let s:bash = @@ -507,6 +521,15 @@ function! s:bashHack() let &shell = s:bash let &shellredir = '&>' endif -endfunction +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: diff --git a/plugin/syntastic/autoloclist.vim b/plugin/syntastic/autoloclist.vim index 3e6de2d8..7e6e9ee6 100644 --- a/plugin/syntastic/autoloclist.vim +++ b/plugin/syntastic/autoloclist.vim @@ -7,17 +7,17 @@ let g:SyntasticAutoloclistNotifier = {} " Public methods {{{1 " -function! g:SyntasticAutoloclistNotifier.New() +function! g:SyntasticAutoloclistNotifier.New() " {{{2 let newObj = copy(self) 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 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') if !a:loclist.isEmpty() if g:syntastic_auto_loc_list == 1 @@ -31,6 +31,8 @@ function! g:SyntasticAutoloclistNotifier.AutoToggle(loclist) lclose endif endif -endfunction +endfunction " }}}2 + +" }}}1 " vim: set sw=4 sts=4 et fdm=marker: diff --git a/plugin/syntastic/balloons.vim b/plugin/syntastic/balloons.vim index 38b88ecb..c97f7fae 100644 --- a/plugin/syntastic/balloons.vim +++ b/plugin/syntastic/balloons.vim @@ -11,17 +11,17 @@ let g:SyntasticBalloonsNotifier = {} " Public methods {{{1 -function! g:SyntasticBalloonsNotifier.New() +function! g:SyntasticBalloonsNotifier.New() " {{{2 let newObj = copy(self) return newObj -endfunction +endfunction " }}}2 -function! g:SyntasticBalloonsNotifier.enabled() +function! g:SyntasticBalloonsNotifier.enabled() " {{{2 return has('balloon_eval') && syntastic#util#var('enable_balloons') -endfunction +endfunction " }}}2 " Update the error balloons -function! g:SyntasticBalloonsNotifier.refresh(loclist) +function! g:SyntasticBalloonsNotifier.refresh(loclist) " {{{2 let b:syntastic_balloons = {} if self.enabled() && !a:loclist.isEmpty() call syntastic#log#debug(g:SyntasticDebugNotifications, 'balloons: refresh') @@ -38,25 +38,29 @@ function! g:SyntasticBalloonsNotifier.refresh(loclist) set beval bexpr=SyntasticBalloonsExprNotifier() endif endif -endfunction +endfunction " }}}2 " Reset the error balloons " @vimlint(EVL103, 1, a:loclist) -function! g:SyntasticBalloonsNotifier.reset(loclist) +function! g:SyntasticBalloonsNotifier.reset(loclist) " {{{2 if has('balloon_eval') call syntastic#log#debug(g:SyntasticDebugNotifications, 'balloons: reset') set nobeval endif -endfunction +endfunction " }}}2 " @vimlint(EVL103, 0, a:loclist) +" }}}1 + " Private functions {{{1 -function! SyntasticBalloonsExprNotifier() +function! SyntasticBalloonsExprNotifier() " {{{2 if !exists('b:syntastic_balloons') return '' endif return get(b:syntastic_balloons, v:beval_lnum, '') -endfunction +endfunction " }}}2 + +" }}}1 " vim: set sw=4 sts=4 et fdm=marker: diff --git a/plugin/syntastic/checker.vim b/plugin/syntastic/checker.vim index 148d406c..ecc33d00 100644 --- a/plugin/syntastic/checker.vim +++ b/plugin/syntastic/checker.vim @@ -7,7 +7,7 @@ let g:SyntasticChecker = {} " Public methods {{{1 -function! g:SyntasticChecker.New(args) +function! g:SyntasticChecker.New(args) " {{{2 let newObj = copy(self) let newObj._filetype = a:args['filetype'] @@ -34,29 +34,29 @@ function! g:SyntasticChecker.New(args) endif return newObj -endfunction +endfunction " }}}2 -function! g:SyntasticChecker.getFiletype() +function! g:SyntasticChecker.getFiletype() " {{{2 return self._filetype -endfunction +endfunction " }}}2 -function! g:SyntasticChecker.getName() +function! g:SyntasticChecker.getName() " {{{2 return self._name -endfunction +endfunction " }}}2 -function! g:SyntasticChecker.getExec() +function! g:SyntasticChecker.getExec() " {{{2 if exists('g:syntastic_' . self._filetype . '_' . self._name . '_exec') return expand(g:syntastic_{self._filetype}_{self._name}_exec) endif return self._exec -endfunction +endfunction " }}}2 -function! g:SyntasticChecker.getExecEscaped() +function! g:SyntasticChecker.getExecEscaped() " {{{2 return syntastic#util#shescape(self.getExec()) -endfunction +endfunction " }}}2 -function! g:SyntasticChecker.getLocListRaw() +function! g:SyntasticChecker.getLocListRaw() " {{{2 let name = self._filetype . '/' . self._name try let list = self._locListFunc() @@ -69,13 +69,13 @@ function! g:SyntasticChecker.getLocListRaw() call syntastic#log#debug(g:SyntasticDebugLoclist, name . ' raw:', list) call self._quietMessages(list) return list -endfunction +endfunction " }}}2 -function! g:SyntasticChecker.getLocList() +function! g:SyntasticChecker.getLocList() " {{{2 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 parts = [] @@ -86,23 +86,25 @@ function! g:SyntasticChecker.makeprgBuild(opts) call extend(parts, self._getOpt(a:opts, basename, 'tail', '')) return join(parts) -endfunction +endfunction " }}}2 -function! g:SyntasticChecker.isAvailable() +function! g:SyntasticChecker.isAvailable() " {{{2 return self._isAvailableFunc() -endfunction +endfunction " }}}2 + +" }}}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' if exists(filter) && type({filter}) == type({}) && !empty({filter}) call syntastic#util#dictFilter(a:errors, {filter}) call syntastic#log#debug(g:SyntasticDebugLoclist, 'filtered by ' . filter . ':', a:errors) endif -endfunction +endfunction " }}}2 -function! g:SyntasticChecker._populateHighlightRegexes(errors) +function! g:SyntasticChecker._populateHighlightRegexes(errors) " {{{2 if has_key(self, '_highlightRegexFunc') for e in a:errors if e['valid'] @@ -113,9 +115,9 @@ function! g:SyntasticChecker._populateHighlightRegexes(errors) endif endfor 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 ret = [] call extend( ret, self._shescape(get(a:opts, a:name . '_before', '')) ) @@ -123,9 +125,9 @@ function! g:SyntasticChecker._getOpt(opts, basename, name, default) call extend( ret, self._shescape(get(a:opts, a:name . '_after', '')) ) return ret -endfunction +endfunction " }}}2 -function! g:SyntasticChecker._shescape(opt) +function! g:SyntasticChecker._shescape(opt) " {{{2 if type(a:opt) == type('') && a:opt != '' return [a:opt] elseif type(a:opt) == type([]) @@ -133,12 +135,16 @@ function! g:SyntasticChecker._shescape(opt) endif return [] -endfunction +endfunction " }}}2 + +" }}}1 " Non-method functions {{{1 -function! SyntasticCheckerIsAvailableDefault() dict +function! SyntasticCheckerIsAvailableDefault() dict " {{{2 return executable(self.getExec()) -endfunction +endfunction " }}}2 + +" }}}1 " vim: set sw=4 sts=4 et fdm=marker: diff --git a/plugin/syntastic/cursor.vim b/plugin/syntastic/cursor.vim index c5f8c1d5..71492543 100644 --- a/plugin/syntastic/cursor.vim +++ b/plugin/syntastic/cursor.vim @@ -7,16 +7,16 @@ let g:SyntasticCursorNotifier = {} " Public methods {{{1 -function! g:SyntasticCursorNotifier.New() +function! g:SyntasticCursorNotifier.New() " {{{2 let newObj = copy(self) return newObj -endfunction +endfunction " }}}2 -function! g:SyntasticCursorNotifier.enabled() +function! g:SyntasticCursorNotifier.enabled() " {{{2 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() call syntastic#log#debug(g:SyntasticDebugNotifications, 'cursor: refresh') let b:syntastic_messages = copy(a:loclist.messages(bufnr(''))) @@ -24,21 +24,23 @@ function! g:SyntasticCursorNotifier.refresh(loclist) autocmd! syntastic CursorMoved autocmd syntastic CursorMoved * call g:SyntasticRefreshCursor() endif -endfunction +endfunction " }}}2 " @vimlint(EVL103, 1, a:loclist) -function! g:SyntasticCursorNotifier.reset(loclist) +function! g:SyntasticCursorNotifier.reset(loclist) " {{{2 call syntastic#log#debug(g:SyntasticDebugNotifications, 'cursor: reset') autocmd! syntastic CursorMoved unlet! b:syntastic_messages let b:oldLine = -1 -endfunction +endfunction " }}}2 " @vimlint(EVL103, 0, a:loclist) +" }}}1 + " Private methods {{{1 " 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) " file not checked return @@ -58,6 +60,8 @@ function! g:SyntasticRefreshCursor() else echo endif -endfunction +endfunction " }}}2 + +" }}}1 " vim: set sw=4 sts=4 et fdm=marker: diff --git a/plugin/syntastic/highlighting.vim b/plugin/syntastic/highlighting.vim index 98f6e147..997b2e32 100644 --- a/plugin/syntastic/highlighting.vim +++ b/plugin/syntastic/highlighting.vim @@ -12,7 +12,7 @@ let s:setup_done = 0 " Public methods {{{1 -function! g:SyntasticHighlightingNotifier.New() +function! g:SyntasticHighlightingNotifier.New() " {{{2 let newObj = copy(self) if !s:setup_done @@ -21,14 +21,14 @@ function! g:SyntasticHighlightingNotifier.New() endif return newObj -endfunction +endfunction " }}}2 -function! g:SyntasticHighlightingNotifier.enabled() +function! g:SyntasticHighlightingNotifier.enabled() " {{{2 return s:has_highlighting && syntastic#util#var('enable_highlighting') -endfunction +endfunction " }}}2 " Sets error highlights in the cuirrent window -function! g:SyntasticHighlightingNotifier.refresh(loclist) +function! g:SyntasticHighlightingNotifier.refresh(loclist) " {{{2 if self.enabled() call self.reset(a:loclist) call syntastic#log#debug(g:SyntasticDebugNotifications, 'highlighting: refresh') @@ -55,11 +55,11 @@ function! g:SyntasticHighlightingNotifier.refresh(loclist) endif endfor endif -endfunction +endfunction " }}}2 " Remove all error highlights from the window " @vimlint(EVL103, 1, a:loclist) -function! g:SyntasticHighlightingNotifier.reset(loclist) +function! g:SyntasticHighlightingNotifier.reset(loclist) " {{{2 if s:has_highlighting call syntastic#log#debug(g:SyntasticDebugNotifications, 'highlighting: reset') for match in getmatches() @@ -68,13 +68,15 @@ function! g:SyntasticHighlightingNotifier.reset(loclist) endif endfor endif -endfunction +endfunction " }}}2 " @vimlint(EVL103, 0, a:loclist) +" }}}1 + " Private methods {{{1 " One time setup: define our own highlighting -function! g:SyntasticHighlightingNotifier._setup() +function! g:SyntasticHighlightingNotifier._setup() " {{{2 if s:has_highlighting if !hlexists('SyntasticError') highlight link SyntasticError SpellBad @@ -84,6 +86,8 @@ function! g:SyntasticHighlightingNotifier._setup() highlight link SyntasticWarning SpellCap endif endif -endfunction +endfunction " }}}2 + +" }}}1 " vim: set sw=4 sts=4 et fdm=marker: diff --git a/plugin/syntastic/loclist.vim b/plugin/syntastic/loclist.vim index 570ba382..b7a4e413 100644 --- a/plugin/syntastic/loclist.vim +++ b/plugin/syntastic/loclist.vim @@ -7,7 +7,7 @@ let g:SyntasticLoclist = {} " Public methods {{{1 -function! g:SyntasticLoclist.New(rawLoclist) +function! g:SyntasticLoclist.New(rawLoclist) " {{{2 let newObj = copy(self) let llist = filter(copy(a:rawLoclist), 'v:val["valid"] == 1') @@ -22,34 +22,34 @@ function! g:SyntasticLoclist.New(rawLoclist) let newObj._name = '' return newObj -endfunction +endfunction " }}}2 -function! g:SyntasticLoclist.current() +function! g:SyntasticLoclist.current() " {{{2 if !exists("b:syntastic_loclist") let b:syntastic_loclist = g:SyntasticLoclist.New([]) endif return b:syntastic_loclist -endfunction +endfunction " }}}2 -function! g:SyntasticLoclist.extend(other) +function! g:SyntasticLoclist.extend(other) " {{{2 let list = self.copyRaw() call extend(list, a:other.copyRaw()) return g:SyntasticLoclist.New(list) -endfunction +endfunction " }}}2 -function! g:SyntasticLoclist.isEmpty() +function! g:SyntasticLoclist.isEmpty() " {{{2 return empty(self._rawLoclist) -endfunction +endfunction " }}}2 -function! g:SyntasticLoclist.copyRaw() +function! g:SyntasticLoclist.copyRaw() " {{{2 return copy(self._rawLoclist) -endfunction +endfunction " }}}2 -function! g:SyntasticLoclist.getRaw() +function! g:SyntasticLoclist.getRaw() " {{{2 return self._rawLoclist -endfunction +endfunction " }}}2 -function! g:SyntasticLoclist.getStatuslineFlag() +function! g:SyntasticLoclist.getStatuslineFlag() " {{{2 if !exists("self._stl_format") let self._stl_format = '' endif @@ -100,52 +100,52 @@ function! g:SyntasticLoclist.getStatuslineFlag() endif return self._stl_flag -endfunction +endfunction " }}}2 -function! g:SyntasticLoclist.getFirstIssue() +function! g:SyntasticLoclist.getFirstIssue() " {{{2 return get(self._rawLoclist, 0, {}) -endfunction +endfunction " }}}2 -function! g:SyntasticLoclist.getName() +function! g:SyntasticLoclist.getName() " {{{2 return len(self._name) -endfunction +endfunction " }}}2 -function! g:SyntasticLoclist.setName(name) +function! g:SyntasticLoclist.setName(name) " {{{2 let self._name = a:name -endfunction +endfunction " }}}2 -function! g:SyntasticLoclist.decorate(name, filetype) +function! g:SyntasticLoclist.decorate(name, filetype) " {{{2 for e in self._rawLoclist let e['text'] .= ' [' . a:filetype . '/' . a:name . ']' endfor -endfunction +endfunction " }}}2 -function! g:SyntasticLoclist.quietMessages(filters) +function! g:SyntasticLoclist.quietMessages(filters) " {{{2 call syntastic#util#dictFilter(self._rawLoclist, a:filters) -endfunction +endfunction " }}}2 -function! g:SyntasticLoclist.errors() +function! g:SyntasticLoclist.errors() " {{{2 if !exists("self._cachedErrors") let self._cachedErrors = self.filter({'type': "E"}) endif return self._cachedErrors -endfunction +endfunction " }}}2 -function! g:SyntasticLoclist.warnings() +function! g:SyntasticLoclist.warnings() " {{{2 if !exists("self._cachedWarnings") let self._cachedWarnings = self.filter({'type': "W"}) endif return self._cachedWarnings -endfunction +endfunction " }}}2 " Legacy function. Syntastic no longer calls it, but we keep it " around because other plugins (f.i. powerline) depend on it. -function! g:SyntasticLoclist.hasErrorsOrWarningsToDisplay() +function! g:SyntasticLoclist.hasErrorsOrWarningsToDisplay() " {{{2 return !self.isEmpty() -endfunction +endfunction " }}}2 " cache used by EchoCurrentError() -function! g:SyntasticLoclist.messages(buf) +function! g:SyntasticLoclist.messages(buf) " {{{2 if !exists("self._cachedMessages") let self._cachedMessages = {} let errors = self.errors() + self.warnings() @@ -165,7 +165,7 @@ function! g:SyntasticLoclist.messages(buf) endif return get(self._cachedMessages, a:buf, {}) -endfunction +endfunction " }}}2 "Filter the list and return new native loclist "e.g. @@ -174,14 +174,14 @@ endfunction "would return all errors for buffer 10. " "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 filter = len(conditions) == 1 ? \ conditions[0] : join(map(conditions, '"(" . v:val . ")"'), ' && ') return filter(copy(self._rawLoclist), filter) -endfunction +endfunction " }}}2 -function! g:SyntasticLoclist.setloclist() +function! g:SyntasticLoclist.setloclist() " {{{2 if !exists('w:syntastic_loclist_set') let w:syntastic_loclist_set = 0 endif @@ -189,10 +189,10 @@ function! g:SyntasticLoclist.setloclist() call syntastic#log#debug(g:SyntasticDebugNotifications, 'loclist: setloclist ' . (replace ? '(replace)' : '(new)')) call setloclist(0, self.getRaw(), replace ? 'r' : ' ') let w:syntastic_loclist_set = 1 -endfunction +endfunction " }}}2 "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 self.setloclist() @@ -220,19 +220,25 @@ function! g:SyntasticLoclist.show() endif endfor endif -endfunction +endfunction " }}}2 + +" }}}1 " Non-method functions {{{1 -function! g:SyntasticLoclistHide() +function! g:SyntasticLoclistHide() " {{{2 call syntastic#log#debug(g:SyntasticDebugNotifications, 'loclist: hide') silent! lclose -endfunction +endfunction " }}}2 + +" }}}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) -endfunction +endfunction " }}}2 + +" }}}1 " vim: set sw=4 sts=4 et fdm=marker: diff --git a/plugin/syntastic/modemap.vim b/plugin/syntastic/modemap.vim index a0e43293..8f7d3a4e 100644 --- a/plugin/syntastic/modemap.vim +++ b/plugin/syntastic/modemap.vim @@ -7,16 +7,16 @@ let g:SyntasticModeMap = {} " Public methods {{{1 -function! g:SyntasticModeMap.Instance() +function! g:SyntasticModeMap.Instance() " {{{2 if !exists('s:SyntasticModeMapInstance') let s:SyntasticModeMapInstance = copy(self) call s:SyntasticModeMapInstance.synch() endif return s:SyntasticModeMapInstance -endfunction +endfunction " }}}2 -function! g:SyntasticModeMap.synch() +function! g:SyntasticModeMap.synch() " {{{2 if exists('g:syntastic_mode_map') let self._mode = get(g:syntastic_mode_map, 'mode', 'active') let self._activeFiletypes = get(g:syntastic_mode_map, 'active_filetypes', []) @@ -26,9 +26,9 @@ function! g:SyntasticModeMap.synch() let self._activeFiletypes = [] let self._passiveFiletypes = [] endif -endfunction +endfunction " }}}2 -function! g:SyntasticModeMap.allowsAutoChecking(filetype) +function! g:SyntasticModeMap.allowsAutoChecking(filetype) " {{{2 let fts = split(a:filetype, '\m\.') if self.isPassive() @@ -36,13 +36,13 @@ function! g:SyntasticModeMap.allowsAutoChecking(filetype) else return self._noFiletypesArePassive(fts) endif -endfunction +endfunction " }}}2 -function! g:SyntasticModeMap.isPassive() +function! g:SyntasticModeMap.isPassive() " {{{2 return self._mode ==# 'passive' -endfunction +endfunction " }}}2 -function! g:SyntasticModeMap.toggleMode() +function! g:SyntasticModeMap.toggleMode() " {{{2 call self.synch() if self._mode ==# 'active' @@ -56,20 +56,24 @@ function! g:SyntasticModeMap.toggleMode() let g:syntastic_mode_map = {} endif 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" -endfunction +endfunction " }}}2 + +" }}}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')) -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')) -endfunction +endfunction " }}}2 + +" }}}1 " vim: set sw=4 sts=4 et fdm=marker: diff --git a/plugin/syntastic/notifiers.vim b/plugin/syntastic/notifiers.vim index 0dcc82cf..c268c19b 100644 --- a/plugin/syntastic/notifiers.vim +++ b/plugin/syntastic/notifiers.vim @@ -9,16 +9,16 @@ let s:notifier_types = ['signs', 'balloons', 'highlighting', 'cursor', 'autolocl " Public methods {{{1 -function! g:SyntasticNotifiers.Instance() +function! g:SyntasticNotifiers.Instance() " {{{2 if !exists('s:SyntasticNotifiersInstance') let s:SyntasticNotifiersInstance = copy(self) call s:SyntasticNotifiersInstance._initNotifiers() endif 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') for type in self._enabled_types let class = substitute(type, '\m.*', 'Syntastic\u&Notifier', '') @@ -26,9 +26,9 @@ function! g:SyntasticNotifiers.refresh(loclist) call self._notifier[type].refresh(a:loclist) endif endfor -endfunction +endfunction " }}}2 -function! g:SyntasticNotifiers.reset(loclist) +function! g:SyntasticNotifiers.reset(loclist) " {{{2 call syntastic#log#debug(g:SyntasticDebugNotifications, 'notifiers: reset') for type in self._enabled_types let class = substitute(type, '\m.*', 'Syntastic\u&Notifier', '') @@ -40,11 +40,13 @@ function! g:SyntasticNotifiers.reset(loclist) call self._notifier[type].reset(a:loclist) endif endfor -endfunction +endfunction " }}}2 + +" }}}1 " Private methods {{{1 -function! g:SyntasticNotifiers._initNotifiers() +function! g:SyntasticNotifiers._initNotifiers() " {{{2 let self._notifier = {} for type in s:notifier_types let class = substitute(type, '\m.*', 'Syntastic\u&Notifier', '') @@ -52,6 +54,8 @@ function! g:SyntasticNotifiers._initNotifiers() endfor let self._enabled_types = copy(s:notifier_types) -endfunction +endfunction " }}}2 + +" }}}1 " vim: set sw=4 sts=4 et fdm=marker: diff --git a/plugin/syntastic/registry.vim b/plugin/syntastic/registry.vim index 64c72286..ff589180 100644 --- a/plugin/syntastic/registry.vim +++ b/plugin/syntastic/registry.vim @@ -105,7 +105,7 @@ let g:SyntasticRegistry = {} " parameters, all private methods take normalized filetypes. Public methods " are thus supposed to normalize filetypes before calling private methods. -function! g:SyntasticRegistry.Instance() +function! g:SyntasticRegistry.Instance() " {{{2 if !exists('s:SyntasticRegistryInstance') let s:SyntasticRegistryInstance = copy(self) let s:SyntasticRegistryInstance._checkerRaw = {} @@ -113,27 +113,27 @@ function! g:SyntasticRegistry.Instance() endif 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 registry = g:SyntasticRegistry.Instance() call registry._registerChecker(checker) -endfunction +endfunction " }}}2 -function! g:SyntasticRegistry.isCheckable(ftalias) +function! g:SyntasticRegistry.isCheckable(ftalias) " {{{2 let ft = s:normaliseFiletype(a:ftalias) call self._loadCheckers(ft) return !empty(self._checkerMap[ft]) -endfunction +endfunction " }}}2 -function! g:SyntasticRegistry.getCheckersMap(ftalias) +function! g:SyntasticRegistry.getCheckersMap(ftalias) " {{{2 let ft = s:normaliseFiletype(a:ftalias) call self._loadCheckers(ft) return self._checkerMap[ft] -endfunction +endfunction " }}}2 -function! g:SyntasticRegistry.getCheckers(ftalias, list) +function! g:SyntasticRegistry.getCheckers(ftalias, list) " {{{2 let checkers_map = self.getCheckersMap(a:ftalias) if empty(checkers_map) return [] @@ -150,9 +150,9 @@ function! g:SyntasticRegistry.getCheckers(ftalias, list) return !empty(ft_list) ? \ self._filterCheckersByName(checkers_map, ft_list) : [checkers_map[keys(checkers_map)[0]]] -endfunction +endfunction " }}}2 -function! g:SyntasticRegistry.getKnownFiletypes() +function! g:SyntasticRegistry.getKnownFiletypes() " {{{2 let types = keys(s:defaultCheckers) call extend(types, keys(s:defaultFiletypeMap)) @@ -166,9 +166,9 @@ function! g:SyntasticRegistry.getKnownFiletypes() endif return syntastic#util#unique(types) -endfunction +endfunction " }}}2 -function! g:SyntasticRegistry.echoInfoFor(ftalias_list) +function! g:SyntasticRegistry.echoInfoFor(ftalias_list) " {{{2 echomsg "Syntastic info for filetype: " . join(a:ftalias_list, '.') if len(a:ftalias_list) != 1 @@ -188,13 +188,13 @@ function! g:SyntasticRegistry.echoInfoFor(ftalias_list) echomsg "Available checker(s): " . join(sort(available)) echomsg "Currently enabled checker(s): " . join(active) -endfunction +endfunction " }}}2 " }}}1 " Private methods {{{1 -function! g:SyntasticRegistry._registerChecker(checker) abort +function! g:SyntasticRegistry._registerChecker(checker) abort " {{{2 let ft = a:checker.getFiletype() if !has_key(self._checkerRaw, ft) @@ -210,13 +210,13 @@ function! g:SyntasticRegistry._registerChecker(checker) abort if a:checker.isAvailable() let self._checkerMap[ft][name] = a:checker endif -endfunction +endfunction " }}}2 -function! g:SyntasticRegistry._filterCheckersByName(checkers_map, list) +function! g:SyntasticRegistry._filterCheckersByName(checkers_map, list) " {{{2 return filter( map(copy(a:list), 'get(a:checkers_map, v:val, {})'), '!empty(v:val)' ) -endfunction +endfunction " }}}2 -function! g:SyntasticRegistry._loadCheckers(filetype) +function! g:SyntasticRegistry._loadCheckers(filetype) " {{{2 if has_key(self._checkerRaw, a:filetype) return endif @@ -227,23 +227,23 @@ function! g:SyntasticRegistry._loadCheckers(filetype) let self._checkerRaw[a:filetype] = [] let self._checkerMap[a:filetype] = {} endif -endfunction +endfunction " }}}2 -function! g:SyntasticRegistry._validateUniqueName(checker) abort +function! g:SyntasticRegistry._validateUniqueName(checker) abort " {{{2 let ft = a:checker.getFiletype() let name = a:checker.getName() if index(self._checkerRaw[ft], name) > -1 throw 'Syntastic: Duplicate syntax checker name: ' . ft . '/' . name endif -endfunction +endfunction " }}}2 " Check for obsolete variable g:syntastic__checker -function! g:SyntasticRegistry._checkDeprecation(filetype) +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] call syntastic#log#deprecationWarn('variable g:syntastic_' . a:filetype . '_checker is deprecated') endif -endfunction +endfunction " }}}2 " }}}1 @@ -251,12 +251,12 @@ endfunction "resolve filetype aliases, and replace - with _ otherwise we cant name "syntax checker functions legally for filetypes like "gentoo-metadata" -function! s:normaliseFiletype(ftalias) +function! s:normaliseFiletype(ftalias) " {{{2 let ft = get(s:defaultFiletypeMap, a:ftalias, a:ftalias) let ft = get(g:syntastic_filetype_map, ft, ft) let ft = substitute(ft, '\m-', '_', 'g') return ft -endfunction +endfunction " }}}2 " }}}1 diff --git a/plugin/syntastic/signs.vim b/plugin/syntastic/signs.vim index 487634af..9c860da2 100644 --- a/plugin/syntastic/signs.vim +++ b/plugin/syntastic/signs.vim @@ -3,6 +3,8 @@ if exists("g:loaded_syntastic_notifier_signs") || !exists("g:loaded_syntastic_pl endif let g:loaded_syntastic_notifier_signs = 1 +" Initialisation {{{1 + " 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 " actually needed) @@ -13,9 +15,11 @@ let g:SyntasticSignsNotifier = {} let s:setup_done = 0 +" }}}1 + " Public methods {{{1 -function! g:SyntasticSignsNotifier.New() +function! g:SyntasticSignsNotifier.New() " {{{2 let newObj = copy(self) if !s:setup_done @@ -24,13 +28,13 @@ function! g:SyntasticSignsNotifier.New() endif return newObj -endfunction +endfunction " }}}2 -function! g:SyntasticSignsNotifier.enabled() +function! g:SyntasticSignsNotifier.enabled() " {{{2 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') let old_signs = copy(self._bufSignIds()) if self.enabled() @@ -38,12 +42,14 @@ function! g:SyntasticSignsNotifier.refresh(loclist) endif call self._removeSigns(old_signs) let s:first_sign_id = s:next_sign_id -endfunction +endfunction " }}}2 + +" }}}1 " Private methods {{{1 " One time setup: define our own sign types and highlighting -function! g:SyntasticSignsNotifier._setup() +function! g:SyntasticSignsNotifier._setup() " {{{2 if has('signs') if !hlexists('SyntasticErrorSign') highlight link SyntasticErrorSign error @@ -74,10 +80,10 @@ function! g:SyntasticSignsNotifier._setup() exe 'sign define SyntasticStyleWarning text=' . g:syntastic_style_warning_symbol . \ ' texthl=SyntasticStyleWarningSign linehl=SyntasticStyleWarningLine' endif -endfunction +endfunction " }}}2 " Place signs by all syntax errors in the buffer -function! g:SyntasticSignsNotifier._signErrors(loclist) +function! g:SyntasticSignsNotifier._signErrors(loclist) " {{{2 let loclist = a:loclist if !loclist.isEmpty() @@ -102,24 +108,26 @@ function! g:SyntasticSignsNotifier._signErrors(loclist) endif endfor endif -endfunction +endfunction " }}}2 " Remove the signs with the given ids from this buffer -function! g:SyntasticSignsNotifier._removeSigns(ids) +function! g:SyntasticSignsNotifier._removeSigns(ids) " {{{2 if has('signs') for i in a:ids execute "sign unplace " . i call remove(self._bufSignIds(), index(self._bufSignIds(), i)) endfor endif -endfunction +endfunction " }}}2 " 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") let b:syntastic_sign_ids = [] endif return b:syntastic_sign_ids -endfunction +endfunction " }}}2 + +" }}}1 " vim: set sw=4 sts=4 et fdm=marker: From 2940b0c721b150bcceb4745ffbaa52c1f169bd0e Mon Sep 17 00:00:00 2001 From: LCD 47 Date: Sun, 23 Feb 2014 11:47:52 +0200 Subject: [PATCH 4/7] Bug fix: checker ordering. Formatting. --- plugin/syntastic.vim | 51 +++++++++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/plugin/syntastic.vim b/plugin/syntastic.vim index 7bec8da0..cc26559f 100644 --- a/plugin/syntastic.vim +++ b/plugin/syntastic.vim @@ -285,10 +285,12 @@ function! s:CacheErrors(checkers) " {{{2 if !s:skipFile() let names = [] + " debug logging {{{3 call syntastic#log#debugShowOptions(g:SyntasticDebugTrace, s:debug_dump_options) call syntastic#log#debugDump(g:SyntasticDebugVariables) call syntastic#log#debugShowVariables(g:SyntasticDebugTrace, 'aggregate_errors') call syntastic#log#debug(g:SyntasticDebugTrace, 'getcwd() = ' . getcwd()) + " }}}3 let filetypes = s:resolveFiletypes() let aggregate_errors = syntastic#util#var('aggregate_errors') @@ -296,28 +298,29 @@ function! s:CacheErrors(checkers) " {{{2 let clist = [] for ft in filetypes - let clist = s:registry.getCheckers(ft, a:checkers) - - for checker in clist - 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 + call extend(clist, s:registry.getCheckers(ft, a:checkers)) endfor + for checker in clist + 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 + + " set names {{{3 if !empty(names) if len(syntastic#util#unique(map(copy(names), 'v:val[1]'))) == 1 let type = names[0][1] @@ -328,7 +331,9 @@ function! s:CacheErrors(checkers) " {{{2 call newLoclist.setName(join(map(names, 'v:val[1] . "/" . v:val[0]'), ', ')) endif endif + " }}}3 + " issue warning about no active checkers {{{3 if empty(clist) if !empty(a:checkers) if len(a:checkers) == 1 @@ -340,6 +345,7 @@ function! s:CacheErrors(checkers) " {{{2 call syntastic#log#debug(g:SyntasticDebugTrace, 'CacheErrors: no active checkers for filetype ' . &filetype) endif endif + " }}}3 call syntastic#log#debug(g:SyntasticDebugLoclist, 'aggregated:', newLoclist) @@ -384,6 +390,7 @@ endfunction " }}}2 function! SyntasticMake(options) " {{{2 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_shellredir = &shellredir let old_local_errorformat = &l:errorformat @@ -391,6 +398,7 @@ function! SyntasticMake(options) " {{{2 let old_cwd = getcwd() let old_lc_messages = $LC_MESSAGES let old_lc_all = $LC_ALL + " }}}3 call s:bashHack() @@ -423,10 +431,13 @@ function! SyntasticMake(options) " {{{2 endif silent! lolder + + " restore options {{{3 let &errorformat = old_errorformat let &l:errorformat = old_local_errorformat let &shellredir = old_shellredir let &shell = old_shell + " }}}3 if !s:running_windows && (s:uname() =~ "FreeBSD" || s:uname() =~ "OpenBSD") call syntastic#util#redraw(g:syntastic_full_redraws) From b0191a144c0cd2557c96bd66713ea98de7c2696e Mon Sep 17 00:00:00 2001 From: LCD 47 Date: Mon, 24 Feb 2014 01:10:33 +0200 Subject: [PATCH 5/7] Refactor of quiet_message filters. Optimisation: merge handling of global and per-checker filters. Feature: allow [] and '' values for quiet_messages filter elements. Feature: allow overrides for quiet_messages filters. Feature: buffer-local auto_jump and quiet_messages. Safety: add magic specifiers to catch regexps. Cleanup: minor restructuring for the forthcoming foreign checkers feature. --- autoload/syntastic/c.vim | 4 ++-- autoload/syntastic/log.vim | 2 +- autoload/syntastic/util.vim | 10 +++++++-- doc/syntastic.txt | 24 ++++++++++++++++---- plugin/syntastic.vim | 34 +++++++++++++---------------- plugin/syntastic/checker.vim | 25 +++++++++++++++++---- plugin/syntastic/loclist.vim | 6 +---- syntax_checkers/haskell/ghc-mod.vim | 2 +- syntax_checkers/python/pylint.vim | 2 +- syntax_checkers/vim/vimlint.vim | 2 +- 10 files changed, 71 insertions(+), 40 deletions(-) diff --git a/autoload/syntastic/c.vim b/autoload/syntastic/c.vim index bf6a4917..4bd79472 100644 --- a/autoload/syntastic/c.vim +++ b/autoload/syntastic/c.vim @@ -30,7 +30,7 @@ function! syntastic#c#ReadConfig(file) " {{{2 " try to read config file try let lines = readfile(config) - catch /^Vim\%((\a\+)\)\=:E48[45]/ + catch /\m^Vim\%((\a\+)\)\=:E48[45]/ return '' endtry @@ -225,7 +225,7 @@ function! s:searchHeaders() " {{{2 try let lines = readfile(filename, '', 100) - catch /^Vim\%((\a\+)\)\=:E484/ + catch /\m^Vim\%((\a\+)\)\=:E484/ continue endtry diff --git a/autoload/syntastic/log.vim b/autoload/syntastic/log.vim index fb068006..05a3d24e 100644 --- a/autoload/syntastic/log.vim +++ b/autoload/syntastic/log.vim @@ -119,7 +119,7 @@ function! s:logRedirect(on) " {{{2 if a:on try execute 'redir >> ' . fnameescape(expand(g:syntastic_debug_file)) - catch /^Vim\%((\a\+)\)\=:/ + catch /\m^Vim\%((\a\+)\)\=:/ silent! redir END unlet g:syntastic_debug_file endtry diff --git a/autoload/syntastic/util.vim b/autoload/syntastic/util.vim index a6d94b15..d1dc2618 100644 --- a/autoload/syntastic/util.vim +++ b/autoload/syntastic/util.vim @@ -49,10 +49,11 @@ function! syntastic#util#parseShebang() " {{{2 endfunction " }}}2 " Get the value of a variable. Allow local variables to override global ones. -function! syntastic#util#var(name) " {{{2 +function! syntastic#util#var(name, ...) " {{{2 return \ 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} : + \ a:0 > 0 ? a:1 : '' endfunction " }}}2 " Parse a version string. Return an array of version components. @@ -230,6 +231,10 @@ function! s:translateFilter(filters) " {{{2 call add(conditions, s:translateElement(k, a:filters[k])) endif endfor + + if conditions == [] + let conditions = ["1"] + endif return len(conditions) == 1 ? conditions[0] : join(map(conditions, '"(" . v:val . ")"'), ' && ') endfunction " }}}2 @@ -243,6 +248,7 @@ function! s:translateElement(key, term) " {{{2 elseif a:key ==? 'file' let ret = 'bufname(str2nr(v:val["bufnr"])) !~# ' . string(a:term) else + call syntastic#log#warn('quiet_messages: ignoring invalid key ' . strtrans(string(a:key))) let ret = "1" endif return ret diff --git a/doc/syntastic.txt b/doc/syntastic.txt index 4d04bee5..86a5ed2b 100644 --- a/doc/syntastic.txt +++ b/doc/syntastic.txt @@ -417,17 +417,16 @@ Default: {} Use this option to filter out some of the messages produced by checkers. The option should be set to something like: > - let g:syntastic_quiet_messages = { "level": "warnings", \ "type": "style", \ "regex": '\m\[C03\d\d\]', \ "file": ['\m^/usr/include/', '\m\c\.h$'] } < - Each element turns off messages matching the patterns specified by the 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 -["style"]). +element you can omit adding the brackets (e.g. you can write "style" instead +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" "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 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 control. They are named |'syntastic___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___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'* Default: [Syntax: line:%F (%t)] Use this option to control what the syntastic statusline text contains. Several diff --git a/plugin/syntastic.vim b/plugin/syntastic.vim index cc26559f..d2c57711 100644 --- a/plugin/syntastic.vim +++ b/plugin/syntastic.vim @@ -32,7 +32,7 @@ let s:running_windows = syntastic#util#isRunningWindows() if !s:running_windows && executable('uname') try 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") finish endtry @@ -128,7 +128,7 @@ let s:modemap = g:SyntasticModeMap.Instance() function! s:CompleteCheckerName(argLead, cmdLine, cursorPos) " {{{2 let checker_names = [] for ft in s:resolveFiletypes() - call extend( checker_names, keys(s:registry.getCheckersMap(ft)) ) + call extend(checker_names, keys(s:registry.getCheckersMap(ft))) endfor return join(checker_names, "\n") endfunction " }}}2 @@ -242,15 +242,16 @@ function! s:UpdateErrors(auto_invoked, ...) " {{{2 let loclist = g:SyntasticLoclist.current() - let w:syntastic_loclist_set = 0 - let do_jump = g:syntastic_auto_jump - if g:syntastic_auto_jump == 2 + " populate loclist and jump {{{3 + let do_jump = syntastic#util#var('auto_jump') + if do_jump == 2 let first = loclist.getFirstIssue() let type = get(first, 'type', '') let do_jump = type ==? 'E' 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 setloclist(0, loclist.getRaw()) let w:syntastic_loclist_set = 1 @@ -267,6 +268,7 @@ function! s:UpdateErrors(auto_invoked, ...) " {{{2 endif endif endif + " }}}3 call s:notifiers.refresh(loclist) endfunction " }}}2 @@ -283,8 +285,6 @@ function! s:CacheErrors(checkers) " {{{2 let newLoclist = g:SyntasticLoclist.New([]) if !s:skipFile() - let names = [] - " debug logging {{{3 call syntastic#log#debugShowOptions(g:SyntasticDebugTrace, s:debug_dump_options) call syntastic#log#debugDump(g:SyntasticDebugVariables) @@ -301,6 +301,7 @@ function! s:CacheErrors(checkers) " {{{2 call extend(clist, s:registry.getCheckers(ft, a:checkers)) endfor + let names = [] for checker in clist call syntastic#log#debug(g:SyntasticDebugTrace, 'CacheErrors: Invoking checker: ' . checker.getName()) @@ -308,9 +309,9 @@ function! s:CacheErrors(checkers) " {{{2 if !loclist.isEmpty() if decorate_errors - call loclist.decorate(checker.getName(), checker.getFiletype()) + call loclist.decorate(checker.getFiletype(), checker.getName()) endif - call add(names, [checker.getName(), checker.getFiletype()]) + call add(names, [checker.getFiletype(), checker.getName()]) let newLoclist = newLoclist.extend(loclist) @@ -322,13 +323,13 @@ function! s:CacheErrors(checkers) " {{{2 " set names {{{3 if !empty(names) - if len(syntastic#util#unique(map(copy(names), 'v:val[1]'))) == 1 - let type = names[0][1] - let name = join(map(names, 'v:val[0]'), ', ') + if len(syntastic#util#unique(map(copy(names), 'v:val[0]'))) == 1 + let type = names[0][0] + let name = join(map(names, 'v:val[1]'), ', ') call newLoclist.setName( name . ' ('. type . ')' ) else " 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 " }}}3 @@ -348,11 +349,6 @@ function! s:CacheErrors(checkers) " {{{2 " }}}3 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 let b:syntastic_loclist = newLoclist diff --git a/plugin/syntastic/checker.vim b/plugin/syntastic/checker.vim index ecc33d00..504342d4 100644 --- a/plugin/syntastic/checker.vim +++ b/plugin/syntastic/checker.vim @@ -97,10 +97,27 @@ endfunction " }}}2 " Private methods {{{1 function! g:SyntasticChecker._quietMessages(errors) " {{{2 - let filter = 'g:syntastic_' . self._filetype . '_' . self._name . '_quiet_messages' - if exists(filter) && type({filter}) == type({}) && !empty({filter}) - call syntastic#util#dictFilter(a:errors, {filter}) - call syntastic#log#debug(g:SyntasticDebugLoclist, 'filtered by ' . filter . ':', a:errors) + " wildcard quiet_messages + let quiet_filters = copy(syntastic#util#var('quiet_messages', {})) + if type(quiet_filters) != type({}) + call syntastic#log#warn('ignoring invalid syntastic_quiet_messages') + unlet quiet_filters + let quiet_filters = {} + endif + + " 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 diff --git a/plugin/syntastic/loclist.vim b/plugin/syntastic/loclist.vim index b7a4e413..2e328765 100644 --- a/plugin/syntastic/loclist.vim +++ b/plugin/syntastic/loclist.vim @@ -114,16 +114,12 @@ function! g:SyntasticLoclist.setName(name) " {{{2 let self._name = a:name endfunction " }}}2 -function! g:SyntasticLoclist.decorate(name, filetype) " {{{2 +function! g:SyntasticLoclist.decorate(filetype, name) " {{{2 for e in self._rawLoclist let e['text'] .= ' [' . a:filetype . '/' . a:name . ']' endfor endfunction " }}}2 -function! g:SyntasticLoclist.quietMessages(filters) " {{{2 - call syntastic#util#dictFilter(self._rawLoclist, a:filters) -endfunction " }}}2 - function! g:SyntasticLoclist.errors() " {{{2 if !exists("self._cachedErrors") let self._cachedErrors = self.filter({'type': "E"}) diff --git a/syntax_checkers/haskell/ghc-mod.vim b/syntax_checkers/haskell/ghc-mod.vim index 9a140fea..7a86ffa6 100644 --- a/syntax_checkers/haskell/ghc-mod.vim +++ b/syntax_checkers/haskell/ghc-mod.vim @@ -54,7 +54,7 @@ function! s:GhcModNew(exe) try 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]) - catch /^Vim\%((\a\+)\)\=:E684/ + catch /\m^Vim\%((\a\+)\)\=:E684/ call syntastic#log#error("checker haskell/ghc_mod: can't parse version string (abnormal termination?)") let ret = -1 endtry diff --git a/syntax_checkers/python/pylint.vim b/syntax_checkers/python/pylint.vim index 421b31b9..5cc74bb0 100644 --- a/syntax_checkers/python/pylint.vim +++ b/syntax_checkers/python/pylint.vim @@ -68,7 +68,7 @@ function! s:PylintNew(exe) 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 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?)") let ret = -1 endtry diff --git a/syntax_checkers/vim/vimlint.vim b/syntax_checkers/vim/vimlint.vim index 552e1291..7f380d7b 100644 --- a/syntax_checkers/vim/vimlint.vim +++ b/syntax_checkers/vim/vimlint.vim @@ -40,7 +40,7 @@ function! SyntaxCheckers_vim_vimlint_IsAvailable() dict try call vimlint#vimlint(syntastic#util#DevNull(), { 'output': [], 'quiet': 1 }) let ret = 1 - catch /^Vim\%((\a\+)\)\=:E117/ + catch /\m^Vim\%((\a\+)\)\=:E117/ " do nothing endtry return ret From 25271f89ae70b7d5cb30ed939ed08305f28493e3 Mon Sep 17 00:00:00 2001 From: LCD 47 Date: Mon, 24 Feb 2014 10:10:18 +0200 Subject: [PATCH 6/7] Add buffer-local versions for auto_loc_list and loc_list_height. --- plugin/syntastic/autoloclist.vim | 4 ++-- plugin/syntastic/loclist.vim | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugin/syntastic/autoloclist.vim b/plugin/syntastic/autoloclist.vim index 7e6e9ee6..5362ad6a 100644 --- a/plugin/syntastic/autoloclist.vim +++ b/plugin/syntastic/autoloclist.vim @@ -20,11 +20,11 @@ endfunction " }}}2 function! g:SyntasticAutoloclistNotifier.AutoToggle(loclist) " {{{2 call syntastic#log#debug(g:SyntasticDebugNotifications, 'autoloclist: toggle') if !a:loclist.isEmpty() - if g:syntastic_auto_loc_list == 1 + if syntastic#util#var('auto_loc_list') == 1 call a:loclist.show() endif 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 "something other than syntastic diff --git a/plugin/syntastic/loclist.vim b/plugin/syntastic/loclist.vim index 2e328765..f95173b5 100644 --- a/plugin/syntastic/loclist.vim +++ b/plugin/syntastic/loclist.vim @@ -194,7 +194,7 @@ function! g:SyntasticLoclist.show() " {{{2 if !self.isEmpty() let num = winnr() - execute "lopen " . g:syntastic_loc_list_height + execute "lopen " . syntastic#util#var('loc_list_height') if num != winnr() wincmd p endif From e323437303389dd03c0212fd072cb0c246426a47 Mon Sep 17 00:00:00 2001 From: LCD 47 Date: Mon, 24 Feb 2014 11:04:34 +0200 Subject: [PATCH 7/7] More preparations for the foreign checkers feature. --- plugin/syntastic.vim | 28 +++++++++++++++------------- plugin/syntastic/registry.vim | 12 ++++++------ 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/plugin/syntastic.vim b/plugin/syntastic.vim index d2c57711..5e541941 100644 --- a/plugin/syntastic.vim +++ b/plugin/syntastic.vim @@ -66,7 +66,7 @@ let g:syntastic_defaults = { \ 'stl_format': '[Syntax: line:%F (%t)]', \ 'style_error_symbol': 'S>', \ 'style_warning_symbol': 'S>', - \ 'warning_symbol': '>>', + \ 'warning_symbol': '>>' \ } for s:key in keys(g:syntastic_defaults) @@ -280,7 +280,7 @@ function! s:ClearCache() " {{{2 endfunction " }}}2 "detect and cache all syntax errors in this buffer -function! s:CacheErrors(checkers) " {{{2 +function! s:CacheErrors(checker_names) " {{{2 call s:ClearCache() let newLoclist = g:SyntasticLoclist.New([]) @@ -297,21 +297,23 @@ function! s:CacheErrors(checkers) " {{{2 let decorate_errors = (aggregate_errors || len(filetypes) > 1) && syntastic#util#var('id_checkers') let clist = [] - for ft in filetypes - call extend(clist, s:registry.getCheckers(ft, a:checkers)) + for type in filetypes + call extend(clist, s:registry.getCheckers(type, a:checker_names)) endfor let names = [] for checker in clist - call syntastic#log#debug(g:SyntasticDebugTrace, 'CacheErrors: Invoking checker: ' . checker.getName()) + 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(checker.getFiletype(), checker.getName()) + call loclist.decorate(type, name) endif - call add(names, [checker.getFiletype(), checker.getName()]) + call add(names, [type, name]) let newLoclist = newLoclist.extend(loclist) @@ -323,7 +325,7 @@ function! s:CacheErrors(checkers) " {{{2 " set names {{{3 if !empty(names) - if len(syntastic#util#unique(map(copy(names), 'v:val[0]'))) == 1 + if len(syntastic#util#unique(map( copy(names), 'v:val[0]' ))) == 1 let type = names[0][0] let name = join(map(names, 'v:val[1]'), ', ') call newLoclist.setName( name . ' ('. type . ')' ) @@ -336,14 +338,14 @@ function! s:CacheErrors(checkers) " {{{2 " issue warning about no active checkers {{{3 if empty(clist) - if !empty(a:checkers) - if len(a:checkers) == 1 - call syntastic#log#warn('checker ' . a:checkers[0] . ' is not active for filetype ' . &filetype) + if !empty(a:checker_names) + if len(a:checker_names) == 1 + call syntastic#log#warn('checker ' . a:checker_names[0] . ' is not available') 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 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 " }}}3 diff --git a/plugin/syntastic/registry.vim b/plugin/syntastic/registry.vim index ff589180..d731fff2 100644 --- a/plugin/syntastic/registry.vim +++ b/plugin/syntastic/registry.vim @@ -171,17 +171,17 @@ endfunction " }}}2 function! g:SyntasticRegistry.echoInfoFor(ftalias_list) " {{{2 echomsg "Syntastic info for filetype: " . join(a:ftalias_list, '.') - if len(a:ftalias_list) != 1 + let ft_list = syntastic#util#unique(map( copy(a:ftalias_list), 's:normaliseFiletype(v:val)' )) + if len(ft_list) != 1 let available = [] let active = [] - for ftalias in a:ftalias_list - let ft = s:normaliseFiletype(ftalias) - call extend(available, map( keys(self.getCheckersMap(ftalias)), 'ft . "/" . v:val' )) - call extend(active, map( self.getCheckers(ftalias, []), 'ft . "/" . v:val.getName()' )) + for ft in ft_list + call extend(available, map( keys(self.getCheckersMap(ft)), 'ft . "/" . v:val' )) + call extend(active, map( self.getCheckers(ft, []), 'ft . "/" . v:val.getName()' )) endfor else - let ft = a:ftalias_list[0] + let ft = ft_list[0] let available = keys(self.getCheckersMap(ft)) let active = map(self.getCheckers(ft, []), 'v:val.getName()') endif