Jak automatycznie usuwać końcowe spacje podczas zapisywania w Vi i Vim?

22

Czy jest .vimrcustawienie automatycznego usuwania końcowych białych znaków podczas zapisywania pliku?

Idealnie (dla bezpieczeństwa) chciałbym mieć tę funkcję tylko dla niektórych plików, np *.rb

Michael Durrant
źródło

Odpowiedzi:

25

Działa to (w pliku .vimrc) dla wszystkich plików:

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

Działa to (w pliku .vimrc) tylko dla plików ruby ​​(.rb):

autocmd BufWritePre *.rb :%s/\s\+$//e
Michael Durrant
źródło
6
To rozwiązanie jest fajne, ale myślę, że poniższe rozwiązanie @ Sukminder jest lepsze, ponieważ poprawnie zmienia położenie kursora.
hlin117
Czego używa ten ostatni e?
acgtyrant
19

Aby zachować pozycję kursora, użyj czegoś takiego:

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

w przeciwnym razie kursor skończy na początku wiersza ostatniego zamiany po zapisaniu.

Przykład : Masz spację na końcu linii 122, jesteś w linii 982i wpisz :w. Brak przywracania pozycji spowodowałby, że kursor znalazłby się na początku linii, 122powodując w ten sposób przepływ pracy.

Skonfiguruj wywołanie funkcji za pomocą autocmdkilku przykładów:

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

Można również użyć, ale nie potrzebną w tym przypadku, getpos () poprzez:

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

" To list values to variables use:
let [bufnum, lnum, col, off] = getpos(".")
Runium
źródło
2

Moja wtyczka DeleteTrailingWhitespace robi to i, w przeciwieństwie do różnych prostych:autocmds , obsługuje także specjalne przypadki, może zapytać użytkownika lub przerwać pisanie z końcowymi spacjami.

Strona wtyczki zawiera linki do alternatyw; jest też duża dyskusja na Wiki Vim Tips .

Ingo Karkat
źródło