From 7b6f54160279fb9ed16823a0a7396a4d0354ef95 Mon Sep 17 00:00:00 2001 From: gcrtnst <52910071+gcrtnst@users.noreply.github.com> Date: Sun, 27 Oct 2024 13:14:34 +0900 Subject: [PATCH] Improve performance by avoiding unnecessary highlighting updates --- plugin/better-whitespace.vim | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/plugin/better-whitespace.vim b/plugin/better-whitespace.vim index 402a360..410ae6c 100644 --- a/plugin/better-whitespace.vim +++ b/plugin/better-whitespace.vim @@ -152,20 +152,28 @@ if g:current_line_whitespace_disabled_soft == 1 if ShouldHighlight() exe 'syn match ExtraWhitespace excludenl "' . s:eol_whitespace_pattern . '"' endif + let w:better_whitespace_current_line = -1 endfunction " Match Whitespace on all lines except the current one function! s:HighlightEOLWhitespaceExceptCurrentLine() - call ClearHighlighting() - if ShouldHighlight() + if !ShouldHighlight() + call ClearHighlighting() + return + endif + + if !exists('w:better_whitespace_current_line') || w:better_whitespace_current_line !=# line('.') + call ClearHighlighting() exe 'syn match ExtraWhitespace excludenl "\%<' . line('.') . 'l' . s:eol_whitespace_pattern . \ '\|\%>' . line('.') . 'l' . s:eol_whitespace_pattern . '"' + let w:better_whitespace_current_line = line('.') endif endfunction " Remove Whitespace matching function! s:ClearHighlighting() syn clear ExtraWhitespace + let w:better_whitespace_current_line = -1 endfunction else " Match Whitespace on all lines @@ -175,15 +183,22 @@ else let w:better_whitespace_match_id = matchadd('ExtraWhitespace', \ s:eol_whitespace_pattern, 10, get(w:, 'better_whitespace_match_id', -1)) endif + let w:better_whitespace_current_line = -1 endfunction " Match Whitespace on all lines except the current one function! s:HighlightEOLWhitespaceExceptCurrentLine() - call ClearHighlighting() - if ShouldHighlight() + if !ShouldHighlight() + call ClearHighlighting() + return + endif + + if !exists('w:better_whitespace_current_line') || w:better_whitespace_current_line !=# line('.') + call ClearHighlighting() let w:better_whitespace_match_id = matchadd('ExtraWhitespace', \ '\%<' . line('.') . 'l' . s:eol_whitespace_pattern . \ '\|\%>' . line('.') . 'l' . s:eol_whitespace_pattern, 10, get(w:, 'better_whitespace_match_id', -1)) + let w:better_whitespace_current_line = line('.') endif endfunction @@ -194,6 +209,7 @@ else if match_id >= 0 && index(valid_ids, match_id) >= 0 call matchdelete(match_id) endif + let w:better_whitespace_current_line = -1 endfunction endif