Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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

share|improve this question
up vote 18 down vote accepted

This works (in the .vimrc file) for all files:

autocmd BufWritePre * :%s/\s\+$//e

This works for just ruby(.rb) files:

autocmd BufWritePre *.rb :%s/\s\+$//e
share|improve this answer
This solution's nice, but I think @Sukminder's solution below is better, because it repositions the cursor correctly. – hlin117 Mar 19 '15 at 20:41
What does that the lastet e use? – acgtyrant Dec 28 '15 at 5:55

To keep cursor position use something like:

function! <SID>StripTrailingWhitespaces()
    let l = line(".")
    let c = col(".")
    call cursor(l, c)

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(".")
share|improve this answer
This should be the accepted answer. – kirbyfan64sos Jun 1 '15 at 22:22

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.

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.