Как автоматически убрать конечные пробелы при сохранении в Vi и Vim?


22

Есть ли .vimrcнастройка для автоматического удаления конечных пробелов при сохранении файла?

В идеале (для безопасности) я хотел бы иметь эту функцию только для определенных файлов, например *.rb

Ответы:


25

Это работает (в файле .vimrc) для всех файлов:

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

Это работает (в файле .vimrc) только для файлов ruby ​​(.rb):

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

6
Это решение хорошо, но я думаю, что решение @ Sukminder, представленное ниже, лучше, потому что оно правильно перемещает курсор.
hlin117

Что это использует последний e?
Acgtyrant

19

Чтобы сохранить положение курсора, используйте что-то вроде:

function! <SID>StripTrailingWhitespaces()
    let l = line(".")
    let c = col(".")
    %s/\s\+$//e
    call cursor(l, c)
endfun

иначе курсор окажется в начале строки последней замены после сохранения.

Пример : у вас есть пробел в конце строки 122, вы находитесь на линии 982и введите :w. Не восстановление позиции приведет к тому, что курсор окажется в начале строки122 .

Настройте вызов функции, используя autocmdнесколько примеров:

" 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.

Также можно использовать getpos () , но не нужно в этом случае :

let save_cursor = getpos(".")
" Some replace command
call setpos('.', save_cursor)

" To list values to variables use:
let [bufnum, lnum, col, off] = getpos(".")

2

Мой плагин DeleteTrailingWhitespace делает это и, в отличие от различных простых :autocmdsопераций с плавающей запятой, также обрабатывает особые случаи, может запрашивать пользователя или прерывать записи с конечными пробелами.

Страница плагина содержит ссылки на альтернативы; Есть также большая дискуссия на Vim Tips Wiki .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.