diff --git a/autoload/ale/highlight.vim b/autoload/ale/highlight.vim index 1669ebd2..54103aa9 100644 --- a/autoload/ale/highlight.vim +++ b/autoload/ale/highlight.vim @@ -22,12 +22,16 @@ function! ale#highlight#UnqueueHighlights(buffer) abort endif endfunction -function! s:RemoveOldHighlights() abort +function! s:GetALEMatches() abort + let l:list = [] + for l:match in getmatches() if l:match['group'] ==# 'ALEError' || l:match['group'] ==# 'ALEWarning' - call matchdelete(l:match['id']) + call add(l:list, l:match) endif endfor + + return l:list endfunction function! ale#highlight#UpdateHighlights() abort @@ -36,7 +40,9 @@ function! ale#highlight#UpdateHighlights() abort let l:loclist = l:has_new_items ? remove(s:buffer_highlights, l:buffer) : [] if l:has_new_items || !g:ale_enabled - call s:RemoveOldHighlights() + for l:match in s:GetALEMatches() + call matchdelete(l:match['id']) + endfor endif if l:has_new_items @@ -46,7 +52,10 @@ function! ale#highlight#UpdateHighlights() abort let l:line = l:item.lnum let l:size = 1 - call matchaddpos(l:group, [[l:line, l:col, l:size]]) + " Rememeber the match ID for the item. + " This ID will be used to preserve loclist items which are set + " many times. + let l:item.match_id = matchaddpos(l:group, [[l:line, l:col, l:size]]) endfor endif endfunction @@ -64,7 +73,7 @@ function! ale#highlight#SetHighlights(buffer, loclist) abort " " We'll filter the loclist down to items we can set now. let s:buffer_highlights[a:buffer] = filter( - \ deepcopy(a:loclist), + \ copy(a:loclist), \ 'v:val.bufnr == a:buffer && v:val.col > 0' \) diff --git a/autoload/ale/sign.vim b/autoload/ale/sign.vim index 1a39ba89..fc12e158 100644 --- a/autoload/ale/sign.vim +++ b/autoload/ale/sign.vim @@ -125,8 +125,7 @@ function! ale#sign#SetSigns(buffer, loclist) abort \ : 'ALEWarningSign' " Save the sign IDs we are setting back on our loclist objects. - " These IDs can be used later for changing line numbers of items - " we keep, based on what Vim adjusts automatically. + " These IDs will be used to preserve items which are set many times. for l:obj in l:sublist let l:obj.sign_id = l:sign_id endfor diff --git a/test/test_highlight_placement.vader b/test/test_highlight_placement.vader index b3e40c18..2bf37d19 100644 --- a/test/test_highlight_placement.vader +++ b/test/test_highlight_placement.vader @@ -4,27 +4,18 @@ Before: \ { \ 'lnum': 1, \ 'col': 1, - \ 'bufnr': bufnr('%'), - \ 'vcol': 0, - \ 'nr': -1, \ 'type': 'E', \ 'text': 'foo', \ }, \ { \ 'lnum': 2, \ 'col': 1, - \ 'bufnr': bufnr('%'), - \ 'vcol': 0, - \ 'nr': -1, \ 'type': 'W', \ 'text': 'bar', \ }, \ { \ 'lnum': 3, \ 'col': 5, - \ 'bufnr': bufnr('%'), - \ 'vcol': 0, - \ 'nr': -1, \ 'type': 'E', \ 'text': 'wat', \ }, @@ -59,3 +50,5 @@ Execute(Highlights should be set when a linter runs): \ {'group': 'ALEError', 'id': 6, 'priority': 10, 'pos1': [3, 5, 1]} \ ], \ getmatches() + + AssertEqual [4, 5, 6], map(copy(g:ale_buffer_info[bufnr('')].loclist), 'v:val.match_id') diff --git a/test/test_linting_updates_loclist.vader b/test/test_linting_updates_loclist.vader index 2e106d05..a73a5048 100644 --- a/test/test_linting_updates_loclist.vader +++ b/test/test_linting_updates_loclist.vader @@ -36,4 +36,8 @@ Execute(The loclist should be updated after linting is done): call ale#engine#WaitForJobs(2000) AssertEqual ['' . bufnr('%')], keys(g:ale_buffer_info) + + let g:expected_data[0].match_id = getmatches()[0].id + let g:expected_data[1].match_id = getmatches()[1].id + AssertEqual g:expected_data, g:ale_buffer_info[bufnr('%')].loclist