Wie entferne ich automatisch abschließende Leerzeichen beim Speichern in Vi und Vim?

22

Gibt es eine .vimrcEinstellung, um nachgestellte Leerzeichen beim Speichern einer Datei automatisch zu entfernen?

Im Idealfall möchte ich (aus Sicherheitsgründen) diese Funktionalität nur für bestimmte Dateien haben, z *.rb

Michael Durrant
quelle

Antworten:

25

Dies funktioniert (in der .vimrc-Datei) für alle Dateien:

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

Dies funktioniert (in der .vimrc-Datei) nur für Ruby-Dateien (.rb):

autocmd BufWritePre *.rb :%s/\s\+$//e
Michael Durrant
quelle
6
Diese Lösung ist nett, aber ich denke, dass @ Sukminders Lösung unten besser ist, weil sie den Cursor richtig positioniert.
hlin117
Was nutzt das Lastet e?
acgtyrant
19

Verwenden Sie zum Beibehalten der Cursorposition Folgendes:

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

sonst würde der Cursor nach dem Speichern am Anfang der letzten Ersetzungszeile stehen.

Beispiel : Sie haben ein Leerzeichen am Ende der Zeile 122, Sie sind in der Zeile 982und geben ein :w. Wird die Position nicht wiederhergestellt, endet der Cursor am Zeilenanfang 122und der Arbeitsablauf wird beendet.

Richten Sie den Funktionsaufruf mit den folgenden autocmdBeispielen ein:

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

Man kann getpos () auch benutzen, aber in diesem Fall nicht brauchen, indem man:

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

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

Mein DeleteTrailingWhitespace-Plugin erledigt dies und kann im Gegensatz zu den verschiedenen einfachen :autocmdsFloating-Funktionen auch Sonderfälle behandeln, den Benutzer abfragen oder Schreibvorgänge mit nachgestellten Leerzeichen abbrechen.

Die Plugin-Seite enthält Links zu Alternativen. Es gibt auch eine große Diskussion im Vim Tips Wiki .

Ingo Karkat
quelle