diff --git a/autoload/ale/highlight.vim b/autoload/ale/highlight.vim index 8ff5120f..15b77d3d 100644 --- a/autoload/ale/highlight.vim +++ b/autoload/ale/highlight.vim @@ -15,11 +15,16 @@ endif " wait until the buffer is entered again to show the highlights, unless " the buffer is in focus when linting completes. let s:buffer_highlights = {} +let s:buffer_restore_map = {} function! ale#highlight#UnqueueHighlights(buffer) abort if has_key(s:buffer_highlights, a:buffer) call remove(s:buffer_highlights, a:buffer) endif + + if has_key(s:buffer_restore_map, a:buffer) + call remove(s:buffer_restore_map, a:buffer) + endif endfunction function! s:GetALEMatches() abort @@ -60,6 +65,11 @@ endfunction function! ale#highlight#UpdateHighlights() abort let l:buffer = bufnr('%') + + if has_key(s:buffer_restore_map, l:buffer) + call setmatches(s:buffer_restore_map[l:buffer]) + endif + 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) : [] @@ -85,9 +95,16 @@ function! ale#highlight#UpdateHighlights() abort endif endfunction +function! ale#highlight#BufferHidden(buffer) abort + " Remember all matches, so they can be restored later. + let s:buffer_restore_map[a:buffer] = getmatches() + call clearmatches() +endfunction + augroup ALEHighlightBufferGroup autocmd! autocmd BufEnter * call ale#highlight#UpdateHighlights() + autocmd BufHidden * call ale#highlight#BufferHidden(expand('')) augroup END function! ale#highlight#SetHighlights(buffer, loclist) abort diff --git a/test/test_highlight_placement.vader b/test/test_highlight_placement.vader index bca7bfda..14c16328 100644 --- a/test/test_highlight_placement.vader +++ b/test/test_highlight_placement.vader @@ -91,3 +91,19 @@ Execute(Highlights set by ALE should be removed when buffer cleanup is done): call ale#cleanup#Buffer(bufnr('%')) AssertEqual [], getmatches() + +Execute(Highlights should be cleared when buffers are hidden): + call ale#engine#InitBufferInfo(bufnr('%')) + call ale#highlight#SetHighlights(bufnr('%'), [ + \ {'bufnr': bufnr('%'), 'type': 'E', 'lnum': 3, 'col': 2}, + \]) + + AssertEqual 1, len(getmatches()), 'The highlights weren''t initially set!' + + call ale#highlight#BufferHidden(bufnr('%')) + + AssertEqual 0, len(getmatches()), 'The highlights weren''t cleared!' + + call ale#highlight#UpdateHighlights() + + AssertEqual 1, len(getmatches()), 'The highlights weren''t set again!'