| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- if exists('g:loaded_syntastic_notifier_signs') || !exists('g:loaded_syntastic_plugin')
- finish
- 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)
- let s:first_sign_id = 5000
- let s:next_sign_id = s:first_sign_id
- let g:SyntasticSignsNotifier = {}
- let s:setup_done = 0
- " }}}1
- " Public methods {{{1
- function! g:SyntasticSignsNotifier.New() abort " {{{2
- let newObj = copy(self)
- if !s:setup_done
- call self._setup()
- let s:setup_done = 1
- lockvar s:setup_done
- endif
- return newObj
- endfunction " }}}2
- function! g:SyntasticSignsNotifier.enabled() abort " {{{2
- return has('signs') && syntastic#util#var('enable_signs')
- endfunction " }}}2
- function! g:SyntasticSignsNotifier.refresh(loclist) abort " {{{2
- call syntastic#log#debug(g:_SYNTASTIC_DEBUG_NOTIFICATIONS, 'signs: refresh')
- let old_signs = copy(self._bufSignIds())
- if self.enabled()
- call self._signErrors(a:loclist)
- endif
- call self._removeSigns(old_signs)
- endfunction " }}}2
- " }}}1
- " Private methods {{{1
- " One time setup: define our own sign types and highlighting
- function! g:SyntasticSignsNotifier._setup() abort " {{{2
- if has('signs')
- if !hlexists('SyntasticErrorSign')
- highlight link SyntasticErrorSign error
- endif
- if !hlexists('SyntasticWarningSign')
- highlight link SyntasticWarningSign todo
- endif
- if !hlexists('SyntasticStyleErrorSign')
- highlight link SyntasticStyleErrorSign SyntasticErrorSign
- endif
- if !hlexists('SyntasticStyleWarningSign')
- highlight link SyntasticStyleWarningSign SyntasticWarningSign
- endif
- if !hlexists('SyntasticStyleErrorLine')
- highlight link SyntasticStyleErrorLine SyntasticErrorLine
- endif
- if !hlexists('SyntasticStyleWarningLine')
- highlight link SyntasticStyleWarningLine SyntasticWarningLine
- endif
- " define the signs used to display syntax and style errors/warns
- execute 'sign define SyntasticError text=' . g:syntastic_error_symbol .
- \ ' texthl=SyntasticErrorSign linehl=SyntasticErrorLine'
- execute 'sign define SyntasticWarning text=' . g:syntastic_warning_symbol .
- \ ' texthl=SyntasticWarningSign linehl=SyntasticWarningLine'
- execute 'sign define SyntasticStyleError text=' . g:syntastic_style_error_symbol .
- \ ' texthl=SyntasticStyleErrorSign linehl=SyntasticStyleErrorLine'
- execute 'sign define SyntasticStyleWarning text=' . g:syntastic_style_warning_symbol .
- \ ' texthl=SyntasticStyleWarningSign linehl=SyntasticStyleWarningLine'
- endif
- endfunction " }}}2
- " Place signs by all syntax errors in the buffer
- function! g:SyntasticSignsNotifier._signErrors(loclist) abort " {{{2
- let loclist = a:loclist
- if !loclist.isEmpty()
- let buf = bufnr('')
- if !bufloaded(buf)
- " signs can be placed only in loaded buffers
- return
- endif
- " errors come first, so that they are not masked by warnings
- let issues = copy(loclist.errors())
- call extend(issues, loclist.warnings())
- call filter(issues, 'v:val["bufnr"] == buf')
- let seen = {}
- for i in issues
- if i['lnum'] > 0 && !has_key(seen, i['lnum'])
- let seen[i['lnum']] = 1
- let sign_severity = i['type'] ==? 'W' ? 'Warning' : 'Error'
- let sign_subtype = get(i, 'subtype', '')
- let sign_type = 'Syntastic' . sign_subtype . sign_severity
- execute 'sign place ' . s:next_sign_id . ' line=' . i['lnum'] . ' name=' . sign_type . ' buffer=' . i['bufnr']
- call add(self._bufSignIds(), s:next_sign_id)
- let s:next_sign_id += 1
- endif
- endfor
- endif
- endfunction " }}}2
- " Remove the signs with the given ids from this buffer
- function! g:SyntasticSignsNotifier._removeSigns(ids) abort " {{{2
- if has('signs')
- for s in reverse(copy(a:ids))
- execute 'sign unplace ' . s
- call remove(self._bufSignIds(), index(self._bufSignIds(), s))
- endfor
- endif
- endfunction " }}}2
- " Get all the ids of the SyntaxError signs in the buffer
- function! g:SyntasticSignsNotifier._bufSignIds() abort " {{{2
- if !exists('b:syntastic_private_sign_ids')
- let b:syntastic_private_sign_ids = []
- endif
- return b:syntastic_private_sign_ids
- endfunction " }}}2
- " }}}1
- " vim: set sw=4 sts=4 et fdm=marker:
|