aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Ryder <tom@sanctum.geek.nz>2019-05-25 17:53:12 +1200
committerTom Ryder <tom@sanctum.geek.nz>2019-05-25 17:53:12 +1200
commitc8d73a50108d3d7e21f50a2aa3234dbb3c00b99b (patch)
treedc875d0a6bcb1873671ebb2e6ddb21139a008afc
parentMerge branch 'hotfix/v2.1.1' (diff)
parentBump VERSION (diff)
downloadvim-strip-trailing-whitespace-3.0.0.tar.gz (sig)
vim-strip-trailing-whitespace-3.0.0.zip
Merge branch 'release/v3.0.0'v3.0.0
* release/v3.0.0: Simplify cursor restoration Add exclamation mark to function declarations Inline backported s:Cursor() function Move functions into autoload
-rw-r--r--README.md2
-rw-r--r--VERSION2
-rw-r--r--autoload/strip_trailing_whitespace.vim98
-rw-r--r--doc/strip_trailing_whitespace.txt4
-rw-r--r--plugin/strip_trailing_whitespace.vim114
5 files changed, 104 insertions, 116 deletions
diff --git a/README.md b/README.md
index 11b56f0..f1e8618 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,7 @@ because I could not find a plugin that did this in exactly the way I wanted:
- Accept an optional range
- Strip trailing lines as well as trailing spaces
- Report what was changed, accurately
-- Work with even very old Vim (>=6.0)
+- Work with old Vim (>=7.0)
- Work with a single `undo`
- Don't move the cursor
- Don't change the search pattern
diff --git a/VERSION b/VERSION
index 3e3c2f1..4a36342 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.1.1
+3.0.0
diff --git a/autoload/strip_trailing_whitespace.vim b/autoload/strip_trailing_whitespace.vim
new file mode 100644
index 0000000..681016e
--- /dev/null
+++ b/autoload/strip_trailing_whitespace.vim
@@ -0,0 +1,98 @@
+" Wrapper function to strip both horizontal and vertical trailing whitespace,
+" return the cursor to its previous position, and report changes
+function! strip_trailing_whitespace#Strip(start, end) abort
+
+ " Save cursor position
+ let pos = getpos('.')
+
+ " Whether we made changes
+ let changed = 0
+
+ " If we're going to the end, strip vertical space; we do this first so we
+ " don't end up reporting having trimmed lines that we deleted
+ if a:end == line('$')
+ let vertical = s:StripVertical()
+ let changed = changed || vertical > 0
+ endif
+
+ " Strip horizontal space
+ let horizontal = s:StripHorizontal(a:start, a:end)
+ let changed = changed || horizontal > 0
+
+ " Return the cursor
+ call setpos('.', pos)
+
+ " Report what changed
+ let msg = horizontal.' trimmed'
+ if exists('vertical')
+ let msg = msg.', '.vertical.' deleted'
+ endif
+ echomsg msg
+
+ " Return whether anything changed
+ return changed
+
+endfunction
+
+" Strip horizontal trailing whitespace, return the number of lines changed
+function! s:StripHorizontal(start, end) abort
+
+ " Start a count of lines trimmed
+ let stripped = 0
+
+ " Iterate through buffer
+ let num = a:start
+ while num <= line('$') && num <= a:end
+
+ " If the line has trailing whitespace, strip it off and bump the count
+ let line = getline(num)
+ if line =~# '\s\+$'
+ call setline(num, substitute(line, '\s*$', '', ''))
+ let stripped = stripped + 1
+ endif
+
+ " Bump for next iteration
+ let num = num + 1
+
+ endwhile
+
+ " Return the number of lines trimmed
+ return stripped
+
+endfunction
+
+" Strip trailing vertical whitespace, return the number of lines changed
+function! s:StripVertical() abort
+
+ " Store the number of the last line we found with non-whitespace characters
+ " on it; start at 1 because even if it's empty it's never trailing
+ let eof = 1
+
+ " Iterate through buffer
+ let num = 1
+ while num <= line('$')
+
+ " If the line has any non-whitespace characters in it, update our pointer
+ " to the end of the file text
+ let line = getline(num)
+ if line =~# '\S'
+ let eof = num
+ endif
+
+ " Bump for next iteration
+ let num = num + 1
+
+ endwhile
+
+ " Get the number of lines to delete; if there are any, build a range and
+ " remove them with :delete, suppressing its normal output (we'll do it)
+ let stripped = line('$') - eof
+ if stripped
+ let range = (eof + 1).',$'
+ silent execute range.'delete'
+ endif
+
+ " Return the number of lines deleted
+ return stripped
+
+endfunction
diff --git a/doc/strip_trailing_whitespace.txt b/doc/strip_trailing_whitespace.txt
index 6a79128..dc2a324 100644
--- a/doc/strip_trailing_whitespace.txt
+++ b/doc/strip_trailing_whitespace.txt
@@ -1,4 +1,4 @@
-*strip_trailing_whitespace.txt* For Vim version 6.0 Last change: 2018 Jul 20
+*strip_trailing_whitespace.txt* For Vim version 7.0 Last change: 2019 May 25
DESCRIPTION *strip_trailing_whitespace*
@@ -13,7 +13,7 @@ because I could not find a plugin that did this in exactly the way I wanted:
- Accept an optional range
- Strip trailing lines as well as trailing spaces
- Report what was changed, accurately
-- Work with even very old Vim (>=6.0)
+- Work with old Vim (>=7.0)
- Work with a single |undo|
- Don't move the cursor
- Don't change the search pattern
diff --git a/plugin/strip_trailing_whitespace.vim b/plugin/strip_trailing_whitespace.vim
index f02f7a0..2cbfb5d 100644
--- a/plugin/strip_trailing_whitespace.vim
+++ b/plugin/strip_trailing_whitespace.vim
@@ -9,121 +9,11 @@
if exists('loaded_strip_trailing_whitespace') || &compatible
finish
endif
-if !has('user_commands') || v:version < 600
+if v:version < 700
finish
endif
let loaded_strip_trailing_whitespace = 1
-" Wrapper function to strip both horizontal and vertical trailing whitespace,
-" return the cursor to its previous position, and report changes
-function s:Strip(start, end) abort
-
- " Save cursor position
- let line = line('.')
- let col = col('.')
-
- " Whether we made changes
- let changed = 0
-
- " If we're going to the end, strip vertical space; we do this first so we
- " don't end up reporting having trimmed lines that we deleted
- if a:end == line('$')
- let vertical = s:StripVertical()
- let changed = changed || vertical > 0
- endif
-
- " Strip horizontal space
- let horizontal = s:StripHorizontal(a:start, a:end)
- let changed = changed || horizontal > 0
-
- " Return the cursor
- call s:Cursor(line, col)
-
- " Report what changed
- let msg = horizontal.' trimmed'
- if exists('vertical')
- let msg = msg.', '.vertical.' deleted'
- endif
- echomsg msg
-
- " Return whether anything changed
- return changed
-
-endfunction
-
-" Strip horizontal trailing whitespace, return the number of lines changed
-function s:StripHorizontal(start, end) abort
-
- " Start a count of lines trimmed
- let stripped = 0
-
- " Iterate through buffer
- let num = a:start
- while num <= line('$') && num <= a:end
-
- " If the line has trailing whitespace, strip it off and bump the count
- let line = getline(num)
- if line =~# '\s\+$'
- call setline(num, substitute(line, '\s*$', '', ''))
- let stripped = stripped + 1
- endif
-
- " Bump for next iteration
- let num = num + 1
-
- endwhile
-
- " Return the number of lines trimmed
- return stripped
-
-endfunction
-
-" Strip trailing vertical whitespace, return the number of lines changed
-function s:StripVertical() abort
-
- " Store the number of the last line we found with non-whitespace characters
- " on it; start at 1 because even if it's empty it's never trailing
- let eof = 1
-
- " Iterate through buffer
- let num = 1
- while num <= line('$')
-
- " If the line has any non-whitespace characters in it, update our pointer
- " to the end of the file text
- let line = getline(num)
- if line =~# '\S'
- let eof = num
- endif
-
- " Bump for next iteration
- let num = num + 1
-
- endwhile
-
- " Get the number of lines to delete; if there are any, build a range and
- " remove them with :delete, suppressing its normal output (we'll do it)
- let stripped = line('$') - eof
- if stripped
- let range = (eof + 1).',$'
- silent execute range.'delete'
- endif
-
- " Return the number of lines deleted
- return stripped
-
-endfunction
-
-" Position the cursor; use cursor() if we have it, :normal if not (Vim 6.0)
-function s:Cursor(line, col) abort
- if exists('*cursor')
- return cursor(a:line, a:col)
- else
- execute 'normal! '.a:line.'G'.a:col.'|'
- return 1
- endif
-endfunction
-
" User command for the above
command! -range=% StripTrailingWhitespace
- \ call <SID>Strip(<line1>, <line2>)
+ \ call strip_trailing_whitespace#Strip(<line1>, <line2>)