2025-01-04 03:30:56 +01:00

90 lines
2.2 KiB
VimL

" --- Define our prop types ---
" #pragma region
call prop_type_delete('ErrtagsHighlight')
call prop_type_delete('ErrtagsMessage')
hi link ErrTagsError ErrorMsg
hi link ErrTagsMessage Comment
call prop_type_add('ErrtagsHighlight', {
\ 'highlight': 'ErrTagsError',
\ })
call prop_type_add('ErrtagsMessage', {
\ 'highlight': 'ErrTagsMessage',
\ })
" #pragma endregion
" --- Main logic ---
" #pragma region
function! AddErrtagsNotice(lnum, col, message)
try " NOTE: the column might have been deleted, thats no excuse to halt and catch fire
call prop_add(a:lnum, a:col, {
\ 'type': 'ErrtagsHighlight',
\ 'length': 1
\ })
catch /E964/ | endtry
call prop_add(a:lnum, 0, {
\ 'type': 'ErrtagsMessage',
\ 'text': ' # E: ' . a:message,
\ 'text_align': 'after'
\ })
endfunction
function AddErrtagsNotices(notices)
for l:notice in a:notices
if l:notice['fname'] == expand('%:t')
call AddErrtagsNotice(l:notice.lnum, l:notice.col, l:notice.text)
endif
endfor
endfunction
function! ParseErrtagsNotices(lines)
let l:errors = []
for l:line in a:lines
let l:fields = split(l:line, ':')
if len(l:fields) >= 2
let l:filename = l:fields[0]
let l:line_number = l:fields[1]
let l:column_number = l:fields[2]
let l:message = join(l:fields[3:], ':')
call add(l:errors, {
\ 'fname': l:filename,
\ 'lnum': l:line_number,
\ 'col': l:column_number,
\ 'text': l:message,
\ 'type': 'E',
\ })
endif
endfor
return l:errors
endfunction
function! DoErrtagsNotices()
call prop_remove({ 'type': 'ErrtagsHighlight' })
call prop_remove({ 'type': 'ErrtagsMessage' })
let l:lines = readfile(expand('~/stow/.cache/errtags.tags'))
let l:notices = ParseErrtagsNotices(l:lines)
call AddErrtagsNotices(l:notices)
endfunction
" #pragma endregion
" --- Hook up everything ---
" #pragma region
if exists('g:errtags_events')
for e in g:errtags_events
execute "autocmd " . e . " * DoErrtagsNotices"
endfor
endif
command! DoErrtagsNotices :call DoErrtagsNotices()
" #pragma endregion