diff options
-rw-r--r-- | README.markdown | 31 | ||||
-rw-r--r-- | doc/strip_trailing_whitespace.txt | 54 | ||||
-rw-r--r-- | plugin/strip_trailing_whitespace.vim | 75 |
3 files changed, 160 insertions, 0 deletions
diff --git a/README.markdown b/README.markdown new file mode 100644 index 0000000..0fc2117 --- /dev/null +++ b/README.markdown @@ -0,0 +1,31 @@ +strip\_trailing\_whitespace.vim +=============================== + +This plugin provides a mapping target and an optional custom command with the +author's approach to stripping trailing whitespace from an entire buffer, +including removing empty or whitespace-only lines at the end of the buffer, +without making command noise and without moving the cursor from its current +position. + +This is a very commonly written and implemented plugin, but I wrote my own +because I could not find a plugin that did this in exactly the way I wanted: + +- Provide a `<Plug>` mapping +- Provide a user command to do the stripping as well if wanted +- Strip trailing lines as well as trailing spaces +- Work with even very old Vim (>=6.0) +- Work with a single `undo` +- Don't move the cursor +- Don't change the search pattern +- Don't emit output +- Don't define an `autocmd` +- Don't force a key mapping +- Don't define a global function + +License +------- + +Copyright (c) [Tom Ryder][1]. Distributed under the same terms as Vim itself. +See `:help license`. + +[1]: https://sanctum.geek.nz/ diff --git a/doc/strip_trailing_whitespace.txt b/doc/strip_trailing_whitespace.txt new file mode 100644 index 0000000..3e1807b --- /dev/null +++ b/doc/strip_trailing_whitespace.txt @@ -0,0 +1,54 @@ +*strip_trailing_whitespace.txt* For Vim version 6.0 Last change: 2018 May 31 + +DESCRIPTION *strip_trailing_whitespace* + +This plugin provides a mapping target and an optional custom command with the +author's approach to stripping trailing whitespace from an entire buffer, +including removing empty or whitespace-only lines at the end of the buffer, +without making command noise and without moving the cursor from its current +position. + +This is a very commonly written and implemented plugin, but I wrote my own +because I could not find a plugin that did this in exactly the way I wanted: + +- Provide a |<Plug>| mapping +- Provide a user command to do the stripping as well if wanted +- Strip trailing lines as well as trailing spaces +- Work with even very old Vim (>=6.0) +- Work with a single |undo| +- Don't move the cursor +- Don't change the search pattern +- Don't emit output +- Don't define an |autocmd| +- Don't force a key mapping +- Don't define a global function + +REQUIREMENTS *strip_trailing_whitespace-requirements* + +This plugin is only available if 'compatible' is not set. + +COMMANDS *strip_trailing_whitespace-commands* + + *:StripTrailingWhitespace* +The plugin provides a single `:StripTrailingWhitespace` command if Vim has the +|+user_commands| feature, but this is not required. It operates on the entire +buffer, and accepts neither a range nor arguments. + +MAPPINGS *strip_trailing_whitespace-mappings* + + *<Plug>StripTrailingWhitespace* +The single mapping target provided is |<Plug>StripTrailingWhitespace|, +mappable in any mode. There is no default key mapping to the target; you +should define this yourself in your |vimrc|. For example: +> + :nmap <Leader>x <Plug>StripTrailingWhitespace +< +AUTHOR *strip_trailing_whitespace-author* + +Written and maintained by Tom Ryder <tom@sanctum.geek.nz>. + +LICENSE *strip_trailing_whitespace-license* + +Licensed for distribution under the same terms as Vim itself (see |license|). + + vim:tw=78:ts=8:ft=help:norl: diff --git a/plugin/strip_trailing_whitespace.vim b/plugin/strip_trailing_whitespace.vim new file mode 100644 index 0000000..1b6d2f3 --- /dev/null +++ b/plugin/strip_trailing_whitespace.vim @@ -0,0 +1,75 @@ +" +" strip_trailing_whitespace.vim: User-defined key mapping and optional command +" to strip trailing whitespace in the whole document. +" +" Author: Tom Ryder <tom@sanctum.geek.nz> +" License: Same as Vim itself +" +if exists('g:loaded_strip_trailing_whitespace') || &compatible + finish +endif +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 + + " Line number of the file's last line + let l:ll = line('$') + + " Iterate over the lines + while l:li <= l:ll + + " 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 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 + endif + + " Increment the line counter for the next iteration + let l:li = l:li + 1 + + endwhile + + " If the last non-whitespace line was before the last line proper, we can + " delete all lines after it + if l:lw < l:ll + + " 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('.') + + " Delete the lines, which will move the cursor + silent execute l:lw + 1 . ',$ delete' + + " Return the cursor to the saved position + call cursor(l:lc, l:cc) + endif + +endfunction + +" Create mapping proxy to the function just defined +noremap <silent> <unique> + \ <Plug>StripTrailingWhitespace + \ :<C-U>call <SID>StripTrailingWhitespace()<CR> + +" Define a user command too, if we can +if has('user_commands') + command -nargs=0 + \ StripTrailingWhiteSpace + \ call <SID>StripTrailingWhitespace() +endif |