mirror of
https://github.com/dense-analysis/ale.git
synced 2026-02-17 15:34:14 +08:00
Fix #171 - Implement basic error highlighting
This commit is contained in:
@@ -10,6 +10,11 @@ function! ale#cleanup#Buffer(buffer) abort
|
||||
call ale#engine#ClearJob(l:job)
|
||||
endfor
|
||||
|
||||
" Clear delayed highlights for a buffer being removed.
|
||||
if g:ale_set_highlights
|
||||
call ale#highlight#UnqueueHighlights(a:buffer)
|
||||
endif
|
||||
|
||||
call remove(g:ale_buffer_info, a:buffer)
|
||||
endif
|
||||
endfunction
|
||||
|
||||
@@ -234,9 +234,6 @@ function! s:HandleExit(job) abort
|
||||
|
||||
" Call user autocommands. This allows users to hook into ALE's lint cycle.
|
||||
silent doautocmd User ALELint
|
||||
|
||||
" Mark line 200, column 17 with a squiggly line or something
|
||||
" matchadd('ALEError', '\%200l\%17v')
|
||||
endfunction
|
||||
|
||||
function! ale#engine#SetResults(buffer, loclist) abort
|
||||
@@ -252,6 +249,10 @@ function! ale#engine#SetResults(buffer, loclist) abort
|
||||
" Don't load/run if not already loaded.
|
||||
call ale#statusline#Update(a:buffer, a:loclist)
|
||||
endif
|
||||
|
||||
if g:ale_set_highlights
|
||||
call ale#highlight#SetHighlights(a:buffer, a:loclist)
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! s:HandleExitNeoVim(job, data, event) abort
|
||||
|
||||
75
autoload/ale/highlight.vim
Normal file
75
autoload/ale/highlight.vim
Normal file
@@ -0,0 +1,75 @@
|
||||
scriptencoding utf8
|
||||
" Author: w0rp <devw0rp@gmail.com>
|
||||
" Description: This module implements error/warning highlighting.
|
||||
|
||||
if !hlexists('ALEError')
|
||||
highlight link ALEError SpellBad
|
||||
endif
|
||||
|
||||
if !hlexists('ALEWarning')
|
||||
highlight link ALEWarning SpellCap
|
||||
endif
|
||||
|
||||
" This map holds highlights to be set when buffers are opened.
|
||||
" We can only set highlights for whatever the current buffer is, so we will
|
||||
" wait until the buffer is entered again to show the highlights, unless
|
||||
" the buffer is in focus when linting completes.
|
||||
let s:buffer_highlights = {}
|
||||
|
||||
function! ale#highlight#UnqueueHighlights(buffer) abort
|
||||
if has_key(s:buffer_highlights, a:buffer)
|
||||
call remove(s:buffer_highlights, a:buffer)
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! s:RemoveOldHighlights() abort
|
||||
for l:match in getmatches()
|
||||
if l:match['group'] ==# 'ALEError' || l:match['group'] ==# 'ALEWarning'
|
||||
call matchdelete(l:match['id'])
|
||||
endif
|
||||
endfor
|
||||
endfunction
|
||||
|
||||
function! ale#highlight#UpdateHighlights() abort
|
||||
let l:buffer = bufnr('%')
|
||||
let l:has_new_items = has_key(s:buffer_highlights, l:buffer)
|
||||
let l:loclist = l:has_new_items ? remove(s:buffer_highlights, l:buffer) : []
|
||||
|
||||
if l:has_new_items || !g:ale_enabled
|
||||
call s:RemoveOldHighlights()
|
||||
endif
|
||||
|
||||
if l:has_new_items
|
||||
for l:item in l:loclist
|
||||
let l:col = l:item.col
|
||||
let l:group = l:item.type ==# 'E' ? 'ALEError' : 'ALEWarning'
|
||||
let l:line = l:item.lnum
|
||||
let l:size = 1
|
||||
|
||||
call matchaddpos(l:group, [[l:line, l:col, l:size]])
|
||||
endfor
|
||||
endif
|
||||
endfunction
|
||||
|
||||
augroup ALEHighlightBufferGroup
|
||||
autocmd!
|
||||
autocmd BufEnter * call ale#highlight#UpdateHighlights()
|
||||
augroup END
|
||||
|
||||
function! ale#highlight#SetHighlights(buffer, loclist) abort
|
||||
" Only set set items for the buffer if ALE is enabled.
|
||||
if g:ale_enabled
|
||||
" Set a list of items to be set as highlights for a buffer when
|
||||
" we next open it.
|
||||
"
|
||||
" We'll filter the loclist down to items we can set now.
|
||||
let s:buffer_highlights[a:buffer] = filter(
|
||||
\ a:loclist,
|
||||
\ 'v:val.bufnr == a:buffer && v:val.col > 0'
|
||||
\)
|
||||
|
||||
" Update highlights for the current buffer, which may or may not
|
||||
" be the buffer we just set highlights for.
|
||||
call ale#highlight#UpdateHighlights()
|
||||
endif
|
||||
endfunction
|
||||
@@ -12,14 +12,6 @@ if !hlexists('ALEWarningSign')
|
||||
highlight link ALEWarningSign todo
|
||||
endif
|
||||
|
||||
if !hlexists('ALEError')
|
||||
highlight link ALEError SpellBad
|
||||
endif
|
||||
|
||||
if !hlexists('ALEWarning')
|
||||
highlight link ALEWarning SpellCap
|
||||
endif
|
||||
|
||||
" Signs show up on the left for error markers.
|
||||
execute 'sign define ALEErrorSign text=' . g:ale_sign_error
|
||||
\ . ' texthl=ALEErrorSign'
|
||||
|
||||
Reference in New Issue
Block a user