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

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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.