How to automatically strip trailing spaces on save in Vi and Vim?
Solution 1
This works (in the .vimrc file) for all files:
autocmd BufWritePre * :%s/\s\+$//e
This works (in the .vimrc file) for just ruby(.rb) files:
autocmd BufWritePre *.rb :%s/\s\+$//e
Solution 2
To keep cursor position use something like:
function! <SID>StripTrailingWhitespaces()
let l = line(".")
let c = col(".")
%s/\s\+$//e
call cursor(l, c)
endfun
else cursor would end up at beginning of line of last replace after save.
Example: You have a space at end of line 122
, you are on line 982
and
enter :w
. Not restoring position, would result in cursor ending up at beginning of line 122
thus killing work flow.
Set up call to function using autocmd
, some examples:
" Using file extension
autocmd BufWritePre *.h,*.c,*.java :call <SID>StripTrailingWhitespaces()
" Often files are not necessarily identified by extension, if so use e.g.:
autocmd BufWritePre * if &ft =~ 'sh\|perl\|python' | :call <SID>StripTrailingWhitespaces() | endif
" Or if you want it to be called when file-type i set
autocmd FileType sh,perl,python :call <SID>StripTrailingWhitespaces()
" etc.
One can also use, but not needed in this case, getpos() by:
let save_cursor = getpos(".")
" Some replace command
call setpos('.', save_cursor)
" To list values to variables use:
let [bufnum, lnum, col, off] = getpos(".")
Solution 3
My DeleteTrailingWhitespace plugin does this and, in contrast to the various simple :autocmds
floating around, also handles special cases, can query the user, or abort writes with trailing whitespace.
The plugin page contains links to alternatives; there's also a large discussion on the Vim Tips Wiki.
Related videos on Youtube
Comments
-
Michael Durrant over 1 year
Is there a
.vimrc
setting to automatically remove trailing whitespace when saving a file?Ideally (to be safe) I would like to only have this functionality for certain files, e.g.
*.rb
-
hlin117 about 9 yearsThis solution's nice, but I think @Sukminder's solution below is better, because it repositions the cursor correctly.
-
acgtyrant over 8 yearsWhat does that the lastet
e
use? -
Joe Holloway about 3 years@acgtyrant I tested with and without the 'e'. It seems to be what keeps Vim from spitting an error when you save a file that doesn't have any trailing whitespace. In other words, when the pattern can't be matched, Vim spits an "E486: Pattern not found" error and the 'e' seems to be what suppresses it since you don't really care in this case.