mirror of
https://github.com/amix/vimrc
synced 2025-06-24 07:44:59 +08:00
Updated plugins
This commit is contained in:
@ -19,7 +19,7 @@ if has('reltime')
|
||||
lockvar! g:syntastic_start
|
||||
endif
|
||||
|
||||
let g:syntastic_version = '3.4.0-117'
|
||||
let g:syntastic_version = '3.5.0-37'
|
||||
lockvar g:syntastic_version
|
||||
|
||||
" Sanity checks {{{1
|
||||
@ -56,12 +56,14 @@ let g:syntastic_defaults = {
|
||||
\ 'bash_hack': 1,
|
||||
\ 'check_on_open': 0,
|
||||
\ 'check_on_wq': 1,
|
||||
\ 'cursor_columns': 1,
|
||||
\ 'debug': 0,
|
||||
\ 'echo_current_error': 1,
|
||||
\ 'enable_balloons': 1,
|
||||
\ 'enable_highlighting': 1,
|
||||
\ 'enable_signs': 1,
|
||||
\ 'error_symbol': '>>',
|
||||
\ 'exit_checks': !(s:running_windows && &shell =~? '\m\<cmd\.exe$'),
|
||||
\ 'filetype_map': {},
|
||||
\ 'full_redraws': !(has('gui_running') || has('gui_macvim')),
|
||||
\ 'id_checkers': 1,
|
||||
@ -228,7 +230,7 @@ endfunction " }}}2
|
||||
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
|
||||
let b:syntastic_skip_checks = get(b:, 'syntastic_skip_checks', 0) || !syntastic#util#var('check_on_wq')
|
||||
call SyntasticLoclistHide()
|
||||
endfunction " }}}2
|
||||
|
||||
@ -481,7 +483,15 @@ function! SyntasticMake(options) " {{{2
|
||||
execute 'lcd ' . fnameescape(old_cwd)
|
||||
endif
|
||||
|
||||
silent! lolder
|
||||
try
|
||||
silent lolder
|
||||
catch /\m^Vim\%((\a\+)\)\=:E380/
|
||||
" E380: At bottom of quickfix stack
|
||||
call setloclist(0, [], 'r')
|
||||
catch /\m^Vim\%((\a\+)\)\=:E776/
|
||||
" E776: No location list
|
||||
" do nothing
|
||||
endtry
|
||||
|
||||
" restore options {{{3
|
||||
let &errorformat = old_errorformat
|
||||
@ -496,7 +506,7 @@ function! SyntasticMake(options) " {{{2
|
||||
|
||||
call syntastic#log#debug(g:SyntasticDebugLoclist, 'raw loclist:', errors)
|
||||
|
||||
if has_key(a:options, 'returns') && index(a:options['returns'], v:shell_error) == -1
|
||||
if syntastic#util#var('exit_checks') && has_key(a:options, 'returns') && index(a:options['returns'], v:shell_error) == -1
|
||||
throw 'Syntastic: checker error'
|
||||
endif
|
||||
|
||||
@ -555,9 +565,9 @@ endfunction " }}}2
|
||||
" Skip running in special buffers
|
||||
function! s:skipFile() " {{{2
|
||||
let fname = expand('%')
|
||||
let skip = (exists('b:syntastic_skip_checks') ? b:syntastic_skip_checks : 0) ||
|
||||
\ (&buftype != '') || !filereadable(fname) || getwinvar(0, '&diff') ||
|
||||
\ s:ignoreFile(fname) || fnamemodify(fname, ':e') =~? g:syntastic_ignore_extensions
|
||||
let skip = get(b:, 'syntastic_skip_checks', 0) || (&buftype != '') ||
|
||||
\ !filereadable(fname) || getwinvar(0, '&diff') || s:ignoreFile(fname) ||
|
||||
\ fnamemodify(fname, ':e') =~? g:syntastic_ignore_extensions
|
||||
if skip
|
||||
call syntastic#log#debug(g:SyntasticDebugTrace, 'skipFile: skipping')
|
||||
endif
|
||||
|
@ -46,11 +46,9 @@ function! g:SyntasticChecker.getName() " {{{2
|
||||
endfunction " }}}2
|
||||
|
||||
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
|
||||
return
|
||||
\ expand( exists('b:syntastic_' . self._name . '_exec') ? b:syntastic_{self._name}_exec :
|
||||
\ syntastic#util#var(self._filetype . '_' . self._name . '_exec', self._exec) )
|
||||
endfunction " }}}2
|
||||
|
||||
function! g:SyntasticChecker.getExecEscaped() " {{{2
|
||||
@ -147,10 +145,9 @@ function! g:SyntasticChecker._populateHighlightRegexes(errors) " {{{2
|
||||
endfunction " }}}2
|
||||
|
||||
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', '')) )
|
||||
call extend( ret, self._shescape(user_val != '' ? user_val : get(a:opts, a:name, a:default)) )
|
||||
call extend( ret, self._shescape(syntastic#util#var( a:basename . a:name, get(a:opts, a:name, a:default) )) )
|
||||
call extend( ret, self._shescape(get(a:opts, a:name . '_after', '')) )
|
||||
|
||||
return ret
|
||||
|
@ -20,7 +20,8 @@ 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('')))
|
||||
let b:oldLine = -1
|
||||
let b:syntastic_line = -1
|
||||
let b:syntastic_cursor_columns = a:loclist.getCursorColumns()
|
||||
autocmd! syntastic CursorMoved
|
||||
autocmd syntastic CursorMoved * call SyntasticRefreshCursor()
|
||||
endif
|
||||
@ -31,7 +32,7 @@ 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
|
||||
let b:syntastic_line = -1
|
||||
endfunction " }}}2
|
||||
" @vimlint(EVL103, 0, a:loclist)
|
||||
|
||||
@ -39,29 +40,99 @@ endfunction " }}}2
|
||||
|
||||
" Private methods {{{1
|
||||
|
||||
" The following defensive nonsense is needed because of the nature of autocmd
|
||||
function! SyntasticRefreshCursor() " {{{2
|
||||
if !exists('b:syntastic_messages') || empty(b:syntastic_messages)
|
||||
" file not checked
|
||||
return
|
||||
endif
|
||||
|
||||
if !exists('b:oldLine')
|
||||
let b:oldLine = -1
|
||||
if !exists('b:syntastic_line')
|
||||
let b:syntastic_line = -1
|
||||
endif
|
||||
let l = line('.')
|
||||
if l == b:oldLine
|
||||
return
|
||||
endif
|
||||
let b:oldLine = l
|
||||
let current_messages = get(b:syntastic_messages, l, {})
|
||||
|
||||
if has_key(b:syntastic_messages, l)
|
||||
call syntastic#util#wideMsg(b:syntastic_messages[l])
|
||||
if !exists('b:syntastic_cursor_columns')
|
||||
let b:syntastic_cursor_columns = g:syntastic_cursor_columns
|
||||
endif
|
||||
|
||||
if b:syntastic_cursor_columns
|
||||
let c = virtcol('.')
|
||||
if !exists('b:syntastic_idx')
|
||||
let b:syntastic_idx = -1
|
||||
endif
|
||||
|
||||
if s:_isSameIndex(l, b:syntastic_line, c, b:syntastic_idx, current_messages)
|
||||
return
|
||||
else
|
||||
let b:syntastic_line = l
|
||||
endif
|
||||
|
||||
if !empty(current_messages)
|
||||
let b:syntastic_idx = s:_findIndex(c, current_messages)
|
||||
call syntastic#util#wideMsg(current_messages[b:syntastic_idx].text)
|
||||
else
|
||||
let b:syntastic_idx = -1
|
||||
echo
|
||||
endif
|
||||
else
|
||||
echo
|
||||
if l == b:syntastic_line
|
||||
return
|
||||
endif
|
||||
let b:syntastic_line = l
|
||||
|
||||
if !empty(current_messages)
|
||||
call syntastic#util#wideMsg(current_messages[0].text)
|
||||
else
|
||||
echo
|
||||
endif
|
||||
endif
|
||||
endfunction " }}}2
|
||||
|
||||
" }}}1
|
||||
|
||||
" Private functions {{{1
|
||||
|
||||
function! s:_isSameIndex(line, old_line, column, idx, messages) " {{{2
|
||||
if a:old_line >= 0 && a:line == a:old_line && a:idx >= 0
|
||||
if len(a:messages) <= 1
|
||||
return 1
|
||||
endif
|
||||
|
||||
if a:messages[a:idx].scol <= a:column || a:idx == 0
|
||||
if a:idx == len(a:messages) - 1 || a:column < a:messages[a:idx + 1].scol
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
endif
|
||||
else
|
||||
return 0
|
||||
endif
|
||||
else
|
||||
return 0
|
||||
endif
|
||||
endfunction " }}}2
|
||||
|
||||
function! s:_findIndex(column, messages) " {{{2
|
||||
let max = len(a:messages) - 1
|
||||
if max == 0
|
||||
return 0
|
||||
endif
|
||||
let min = 0
|
||||
|
||||
" modified binary search: assign index 0 to columns to the left of the first error
|
||||
while min < max - 1
|
||||
let mid = (min + max) / 2
|
||||
if a:column < a:messages[mid].scol
|
||||
let max = mid
|
||||
else
|
||||
let min = mid
|
||||
endif
|
||||
endwhile
|
||||
|
||||
return a:column < a:messages[max].scol ? min : max
|
||||
endfunction " }}}2
|
||||
|
||||
" }}}1
|
||||
|
||||
" vim: set sw=4 sts=4 et fdm=marker:
|
||||
|
@ -21,6 +21,8 @@ function! g:SyntasticLoclist.New(rawLoclist) " {{{2
|
||||
let newObj._rawLoclist = llist
|
||||
let newObj._name = ''
|
||||
let newObj._owner = bufnr('')
|
||||
let newObj._sorted = 0
|
||||
let newObj._columns = g:syntastic_cursor_columns
|
||||
|
||||
return newObj
|
||||
endfunction " }}}2
|
||||
@ -39,7 +41,15 @@ function! g:SyntasticLoclist.extend(other) " {{{2
|
||||
endfunction " }}}2
|
||||
|
||||
function! g:SyntasticLoclist.sort() " {{{2
|
||||
call syntastic#util#sortLoclist(self._rawLoclist)
|
||||
if !self._sorted
|
||||
for e in self._rawLoclist
|
||||
call s:_setScreenColumn(e)
|
||||
endfor
|
||||
|
||||
call sort(self._rawLoclist, self._columns ? 's:_compareErrorItemsByColumns' : 's:_compareErrorItemsByLines')
|
||||
|
||||
let self._sorted = 1
|
||||
endif
|
||||
endfunction " }}}2
|
||||
|
||||
function! g:SyntasticLoclist.isEmpty() " {{{2
|
||||
@ -66,6 +76,10 @@ function! g:SyntasticLoclist.getBuffers() " {{{2
|
||||
return syntastic#util#unique(map(copy(self._rawLoclist), 'str2nr(v:val["bufnr"])') + [self._owner])
|
||||
endfunction " }}}2
|
||||
|
||||
function! g:SyntasticLoclist.getCursorColumns() " {{{2
|
||||
return self._columns
|
||||
endfunction " }}}2
|
||||
|
||||
function! g:SyntasticLoclist.getStatuslineFlag() " {{{2
|
||||
if !exists("self._stl_format")
|
||||
let self._stl_format = ''
|
||||
@ -183,8 +197,8 @@ endfunction " }}}2
|
||||
function! g:SyntasticLoclist.messages(buf) " {{{2
|
||||
if !exists("self._cachedMessages")
|
||||
let self._cachedMessages = {}
|
||||
let errors = self.errors() + self.warnings()
|
||||
|
||||
let errors = self.errors() + self.warnings()
|
||||
for e in errors
|
||||
let b = e['bufnr']
|
||||
let l = e['lnum']
|
||||
@ -194,9 +208,32 @@ function! g:SyntasticLoclist.messages(buf) " {{{2
|
||||
endif
|
||||
|
||||
if !has_key(self._cachedMessages[b], l)
|
||||
let self._cachedMessages[b][l] = e['text']
|
||||
let self._cachedMessages[b][l] = [e]
|
||||
elseif self._columns
|
||||
call add(self._cachedMessages[b][l], e)
|
||||
endif
|
||||
endfor
|
||||
|
||||
if self._columns
|
||||
if !self._sorted
|
||||
for b in keys(self._cachedMessages)
|
||||
for l in keys(self._cachedMessages[b])
|
||||
if len(self._cachedMessages[b][l]) > 1
|
||||
for e in self._cachedMessages[b][l]
|
||||
call s:_setScreenColumn(e)
|
||||
endfor
|
||||
call sort(self._cachedMessages[b][l], 's:_compareErrorItemsByColumns')
|
||||
endif
|
||||
endfor
|
||||
endfor
|
||||
endif
|
||||
|
||||
for b in keys(self._cachedMessages)
|
||||
for l in keys(self._cachedMessages[b])
|
||||
call s:_removeShadowedItems(self._cachedMessages[b][l])
|
||||
endfor
|
||||
endfor
|
||||
endif
|
||||
endif
|
||||
|
||||
return get(self._cachedMessages, a:buf, {})
|
||||
@ -210,7 +247,7 @@ endfunction " }}}2
|
||||
"
|
||||
"Note that all comparisons are done with ==?
|
||||
function! g:SyntasticLoclist.filter(filters) " {{{2
|
||||
let conditions = values(map(copy(a:filters), 's:translate(v:key, v:val)'))
|
||||
let conditions = values(map(copy(a:filters), 's:_translate(v:key, v:val)'))
|
||||
let filter = len(conditions) == 1 ?
|
||||
\ conditions[0] : join(map(conditions, '"(" . v:val . ")"'), ' && ')
|
||||
return filter(copy(self._rawLoclist), filter)
|
||||
@ -271,10 +308,93 @@ endfunction " }}}2
|
||||
|
||||
" Private functions {{{1
|
||||
|
||||
function! s:translate(key, val) " {{{2
|
||||
function! s:_translate(key, val) " {{{2
|
||||
return 'get(v:val, ' . string(a:key) . ', "") ==? ' . string(a:val)
|
||||
endfunction " }}}2
|
||||
|
||||
function! s:_setScreenColumn(item) " {{{2
|
||||
if !has_key(a:item, 'scol')
|
||||
let col = get(a:item, 'col', 0)
|
||||
if col != 0 && get(a:item, 'vcol', 0) == 0
|
||||
let buf = str2nr(a:item['bufnr'])
|
||||
try
|
||||
let line = getbufline(buf, a:item['lnum'])[0]
|
||||
catch /\m^Vim\%((\a\+)\)\=:E684/
|
||||
let line = ''
|
||||
endtry
|
||||
let a:item['scol'] = syntastic#util#screenWidth(strpart(line, 0, col), getbufvar(buf, '&tabstop'))
|
||||
else
|
||||
let a:item['scol'] = col
|
||||
endif
|
||||
endif
|
||||
endfunction " }}}2
|
||||
|
||||
function! s:_removeShadowedItems(errors) " {{{2
|
||||
" keep only the first message at a given column
|
||||
let i = 0
|
||||
while i < len(a:errors) - 1
|
||||
let j = i + 1
|
||||
let dupes = 0
|
||||
while j < len(a:errors) && a:errors[j].scol == a:errors[i].scol
|
||||
let dupes = 1
|
||||
let j += 1
|
||||
endwhile
|
||||
if dupes
|
||||
call remove(a:errors, i + 1, j - 1)
|
||||
endif
|
||||
let i += 1
|
||||
endwhile
|
||||
|
||||
" merge messages with the same text
|
||||
let i = 0
|
||||
while i < len(a:errors) - 1
|
||||
let j = i + 1
|
||||
let dupes = 0
|
||||
while j < len(a:errors) && a:errors[j].text == a:errors[i].text
|
||||
let dupes = 1
|
||||
let j += 1
|
||||
endwhile
|
||||
if dupes
|
||||
call remove(a:errors, i + 1, j - 1)
|
||||
endif
|
||||
let i += 1
|
||||
endwhile
|
||||
endfunction " }}}2
|
||||
|
||||
function! s:_compareErrorItemsByColumns(a, b) " {{{2
|
||||
if a:a['bufnr'] != a:b['bufnr']
|
||||
" group by file
|
||||
return a:a['bufnr'] - a:b['bufnr']
|
||||
elseif a:a['lnum'] != a:b['lnum']
|
||||
" sort by line
|
||||
return a:a['lnum'] - a:b['lnum']
|
||||
elseif a:a['scol'] != a:b['scol']
|
||||
" sort by screen column
|
||||
return a:a['scol'] - a:b['scol']
|
||||
elseif a:a['type'] !=? a:b['type']
|
||||
" errors take precedence over warnings
|
||||
return a:a['type'] ==? 'E' ? -1 : 1
|
||||
else
|
||||
return 0
|
||||
endif
|
||||
endfunction " }}}2
|
||||
|
||||
function! s:_compareErrorItemsByLines(a, b) " {{{2
|
||||
if a:a['bufnr'] != a:b['bufnr']
|
||||
" group by file
|
||||
return a:a['bufnr'] - a:b['bufnr']
|
||||
elseif a:a['lnum'] != a:b['lnum']
|
||||
" sort by line
|
||||
return a:a['lnum'] - a:b['lnum']
|
||||
elseif a:a['type'] !=? a:b['type']
|
||||
" errors take precedence over warnings
|
||||
return a:a['type'] ==? 'E' ? -1 : 1
|
||||
else
|
||||
" sort by screen column
|
||||
return a:a['scol'] - a:b['scol']
|
||||
endif
|
||||
endfunction " }}}2
|
||||
|
||||
" }}}1
|
||||
|
||||
" vim: set sw=4 sts=4 et fdm=marker:
|
||||
|
@ -72,10 +72,11 @@ let s:defaultCheckers = {
|
||||
\ 'scss': ['sass', 'scss_lint'],
|
||||
\ 'sh': ['sh', 'shellcheck'],
|
||||
\ 'slim': ['slimrb'],
|
||||
\ 'spec': ['rpmlint'],
|
||||
\ 'tcl': ['nagelfar'],
|
||||
\ 'tex': ['lacheck', 'chktex'],
|
||||
\ 'texinfo': ['makeinfo'],
|
||||
\ 'text': ['atdtool'],
|
||||
\ 'text': [],
|
||||
\ 'twig': ['twiglint'],
|
||||
\ 'typescript': ['tsc'],
|
||||
\ 'vala': ['valac'],
|
||||
@ -96,7 +97,8 @@ lockvar! s:defaultCheckers
|
||||
let s:defaultFiletypeMap = {
|
||||
\ 'gentoo-metadata': 'xml',
|
||||
\ 'lhaskell': 'haskell',
|
||||
\ 'litcoffee': 'coffee'
|
||||
\ 'litcoffee': 'coffee',
|
||||
\ 'mail': 'text'
|
||||
\ }
|
||||
lockvar! s:defaultFiletypeMap
|
||||
|
||||
@ -130,7 +132,7 @@ endfunction " }}}2
|
||||
" not checked for availability (that is, the corresponding IsAvailable() are
|
||||
" not run).
|
||||
function! g:SyntasticRegistry.getCheckers(ftalias, hints_list) " {{{2
|
||||
let ft = s:normaliseFiletype(a:ftalias)
|
||||
let ft = s:_normaliseFiletype(a:ftalias)
|
||||
call self._loadCheckersFor(ft)
|
||||
|
||||
let checkers_map = self._checkerMap[ft]
|
||||
@ -173,13 +175,13 @@ function! g:SyntasticRegistry.getKnownFiletypes() " {{{2
|
||||
endfunction " }}}2
|
||||
|
||||
function! g:SyntasticRegistry.getNamesOfAvailableCheckers(ftalias) " {{{2
|
||||
let ft = s:normaliseFiletype(a:ftalias)
|
||||
let ft = s:_normaliseFiletype(a:ftalias)
|
||||
call self._loadCheckersFor(ft)
|
||||
return keys(filter( copy(self._checkerMap[ft]), 'v:val.isAvailable()' ))
|
||||
endfunction " }}}2
|
||||
|
||||
function! g:SyntasticRegistry.echoInfoFor(ftalias_list) " {{{2
|
||||
let ft_list = syntastic#util#unique(map( copy(a:ftalias_list), 's:normaliseFiletype(v:val)' ))
|
||||
let ft_list = syntastic#util#unique(map( copy(a:ftalias_list), 's:_normaliseFiletype(v:val)' ))
|
||||
if len(ft_list) != 1
|
||||
let available = []
|
||||
let active = []
|
||||
@ -253,7 +255,7 @@ endfunction " }}}2
|
||||
|
||||
"resolve filetype aliases, and replace - with _ otherwise we cant name
|
||||
"syntax checker functions legally for filetypes like "gentoo-metadata"
|
||||
function! s:normaliseFiletype(ftalias) " {{{2
|
||||
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')
|
||||
|
Reference in New Issue
Block a user