From fb3c25becd1e4a565c4339b000b96ff519544dbd Mon Sep 17 00:00:00 2001 From: Tom Ryder Date: Sun, 10 Jun 2018 01:38:47 +1200 Subject: Refactor majorly for 0.2.0 - Do report counts of trimmed and deleted lines (and distinguish them accurately) - Fully backport to 6.0 (no cursor() func in that version) - Don't substitute on lines without trailing space --- plugin/strip_trailing_whitespace.vim | 64 +++++++++++++++++++++++++----------- 1 file changed, 44 insertions(+), 20 deletions(-) (limited to 'plugin') diff --git a/plugin/strip_trailing_whitespace.vim b/plugin/strip_trailing_whitespace.vim index 1b6d2f3..7055d26 100644 --- a/plugin/strip_trailing_whitespace.vim +++ b/plugin/strip_trailing_whitespace.vim @@ -13,29 +13,36 @@ let g:loaded_strip_trailing_whitespace = 1 " Define function for stripping whitespace function! s:StripTrailingWhitespace() - " Iterating line number - let l:li = 1 - " Line number of last line that had non-whitespace characters on it - let l:lw = 0 + let l:cutoff = 0 + + " Tracking lines trimmed between non-whitespace lines and then totalling + let l:trimmed_buffer = 0 + let l:trimmed = 0 " Line number of the file's last line - let l:ll = line('$') + let l:last = line('$') " Iterate over the lines - while l:li <= l:ll + let l:li = 1 + while l:li <= l:last " Get the line text let l:line = getline(l:li) - " Replace the line with a subsitution of its text stripping extraneous - " whitespace - call setline(l:li, substitute(l:line, '\m\C\s\+$', '', 'g')) + " If the current line contains trailing whitespace, substitute it out + if l:line =~# '\s\+$' + call setline(l:li, substitute(l:line, '\s\+$', '', '')) + let l:trimmed_buffer = l:trimmed_buffer + 1 + endif - " If this line has any non-whitespace characters on it, update l:lw with - " its index - if l:line =~# '\m\S' - let l:lw = l:li + " If this line has any non-whitespace characters on it, update our cutoff + " point using its index, and push the trimmed lines we've counted since + " the last non-whitespace line onto the trimmed total + if l:line =~# '\S' + let l:cutoff = l:li + let l:trimmed = l:trimmed + l:trimmed_buffer + let l:trimmed_buffer = 0 endif " Increment the line counter for the next iteration @@ -45,21 +52,38 @@ function! s:StripTrailingWhitespace() " If the last non-whitespace line was before the last line proper, we can " delete all lines after it - if l:lw < l:ll + let l:deleted = 0 + if l:cutoff < l:last " Get the current line and column so we can return to it " (Yes I know about winsaveview() and winrestview(); I want this to work " even on very old versions of Vim if possible) - let l:lc = line('.') - let l:cc = col('.') + let l:cursor_line = line('.') + let l:cursor_col = col('.') + + " Delete the rest of the lines, which will move the cursor + silent execute l:cutoff + 1 . ',$ delete _' + + " Return the cursor to the saved position (Vim 6.0 fallback) + if exists('*cursor') + call cursor(l:cursor_line, l:cursor_col) + else + execute 'normal! ' + \ . l:cursor_line . 'G' + \ . l:cursor_col . '|' + endif - " Delete the lines, which will move the cursor - silent execute l:lw + 1 . ',$ delete' + " Record the number of lines deleted + let l:deleted = l:last - l:cutoff - " Return the cursor to the saved position - call cursor(l:lc, l:cc) endif + " Print what we did + echomsg l:trimmed . ' trimmed, ' . l:deleted . ' deleted' + + " Return the number of affected lines + return l:trimmed + l:deleted + endfunction " Create mapping proxy to the function just defined -- cgit v1.2.3