mirror of
https://github.com/inkarkat/vim-ShowTrailingWhitespace.git
synced 2026-05-26 11:24:17 +02:00
91 lines
3.1 KiB
VimL
91 lines
3.1 KiB
VimL
" ShowTrailingWhitespace.vim: Detect unwanted whitespace at the end of lines.
|
|
"
|
|
" DEPENDENCIES:
|
|
" - ingo-library.vim plugin
|
|
"
|
|
" Copyright: (C) 2012-2021 Ingo Karkat
|
|
" The VIM LICENSE applies to this script; see ':help copyright'.
|
|
"
|
|
" Maintainer: Ingo Karkat <ingo@karkat.de>
|
|
let s:save_cpo = &cpo
|
|
set cpo&vim
|
|
|
|
function! ShowTrailingWhitespace#Pattern( isInsertMode )
|
|
return (exists('b:ShowTrailingWhitespace_ExtraPattern') ? b:ShowTrailingWhitespace_ExtraPattern : '') .
|
|
\ (a:isInsertMode ? '\s\+\%#\@<!$' : '\s\+$')
|
|
endfunction
|
|
function! s:UpdateMatch( isInsertMode )
|
|
let l:pattern = ShowTrailingWhitespace#Pattern(a:isInsertMode)
|
|
if exists('w:ShowTrailingWhitespace_Match')
|
|
" Info: matchadd() does not consider the 'magic' (it's always on),
|
|
" 'ignorecase' and 'smartcase' settings.
|
|
silent! call matchdelete(w:ShowTrailingWhitespace_Match)
|
|
call matchadd(g:ShowTrailingWhitespace#HighlightGroup, l:pattern, -1, w:ShowTrailingWhitespace_Match)
|
|
else
|
|
let w:ShowTrailingWhitespace_Match = matchadd(g:ShowTrailingWhitespace#HighlightGroup, l:pattern)
|
|
endif
|
|
endfunction
|
|
function! s:DeleteMatch()
|
|
if exists('w:ShowTrailingWhitespace_Match')
|
|
silent! call matchdelete(w:ShowTrailingWhitespace_Match)
|
|
unlet w:ShowTrailingWhitespace_Match
|
|
endif
|
|
endfunction
|
|
|
|
function! s:DetectAll()
|
|
call ingo#window#iterate#All(function('ShowTrailingWhitespace#Detect'), 0)
|
|
endfunction
|
|
|
|
function! ShowTrailingWhitespace#IsSet()
|
|
return (exists('b:ShowTrailingWhitespace') ? b:ShowTrailingWhitespace : get(g:, 'ShowTrailingWhitespace', 0))
|
|
endfunction
|
|
function! ShowTrailingWhitespace#NotFiltered()
|
|
let l:Filter = (exists('b:ShowTrailingWhitespace_FilterFunc') ? b:ShowTrailingWhitespace_FilterFunc : g:ShowTrailingWhitespace_FilterFunc)
|
|
return (empty(l:Filter) ? 1 : call(l:Filter, []))
|
|
endfunction
|
|
|
|
function! ShowTrailingWhitespace#Detect( isInsertMode )
|
|
if ShowTrailingWhitespace#IsSet() && ShowTrailingWhitespace#NotFiltered()
|
|
call s:UpdateMatch(a:isInsertMode)
|
|
else
|
|
call s:DeleteMatch()
|
|
endif
|
|
endfunction
|
|
|
|
" The showing of trailing whitespace be en-/disabled globally or only for a particular buffer.
|
|
function! ShowTrailingWhitespace#Set( isTurnOn, isGlobal )
|
|
if a:isGlobal
|
|
let g:ShowTrailingWhitespace = a:isTurnOn
|
|
call s:DetectAll()
|
|
else
|
|
let b:ShowTrailingWhitespace = a:isTurnOn
|
|
call ShowTrailingWhitespace#Detect(0)
|
|
endif
|
|
endfunction
|
|
function! ShowTrailingWhitespace#Reset()
|
|
unlet! b:ShowTrailingWhitespace
|
|
call ShowTrailingWhitespace#Detect(0)
|
|
endfunction
|
|
function! ShowTrailingWhitespace#Toggle( isGlobal )
|
|
if a:isGlobal
|
|
let l:newState = ! g:ShowTrailingWhitespace
|
|
else
|
|
if ShowTrailingWhitespace#NotFiltered()
|
|
let l:newState = ! ShowTrailingWhitespace#IsSet()
|
|
else
|
|
let l:newState = (ShowTrailingWhitespace#IsSet() > 1 ? 0 : 2)
|
|
endif
|
|
endif
|
|
|
|
call ShowTrailingWhitespace#Set(l:newState, a:isGlobal)
|
|
endfunction
|
|
|
|
function! ShowTrailingWhitespace#SetLocalExtraPattern( pattern )
|
|
let b:ShowTrailingWhitespace_ExtraPattern = a:pattern
|
|
call s:DetectAll()
|
|
endfunction
|
|
|
|
let &cpo = s:save_cpo
|
|
unlet s:save_cpo
|
|
" vim: set ts=8 sts=4 sw=4 noexpandtab ff=unix fdm=syntax :
|