Comment supprimer automatiquement les espaces de fin lors de l'enregistrement dans Vi et Vim?

22

Existe-t-il un .vimrcparamètre pour supprimer automatiquement les espaces de fin lors de l'enregistrement d'un fichier?

Idéalement (pour être sûr), je voudrais avoir cette fonctionnalité uniquement pour certains fichiers, par exemple *.rb

Michael Durrant
la source

Réponses:

25

Cela fonctionne (dans le fichier .vimrc) pour tous les fichiers:

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

Cela fonctionne (dans le fichier .vimrc) pour les fichiers uniquement rubis (.rb):

autocmd BufWritePre *.rb :%s/\s\+$//e
Michael Durrant
la source
6
Cette solution est agréable, mais je pense que la solution de @ Sukminder ci-dessous est meilleure, car elle repositionne le curseur correctement.
hlin117
Qu'est-ce que le lastet eutilise?
acgtyrant
19

Pour conserver la position du curseur, utilisez quelque chose comme:

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

sinon, le curseur se retrouverait au début de la ligne du dernier remplacement après la sauvegarde.

Exemple : Vous avez un espace en fin de ligne 122, vous êtes en ligne 982et entrez :w. Si vous ne restaurez pas la position, le curseur se retrouverait au début de la ligne 122, tuant ainsi le flux de travail.

Configurer l'appel à la fonction à l'aide de autocmdquelques exemples:

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

On peut également utiliser, mais pas nécessaire dans ce cas, getpos () en:

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

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

Mon plugin DeleteTrailingWhitespace fait cela et, contrairement aux différents simples :autocmdsflottants, gère également des cas spéciaux, peut interroger l'utilisateur ou abandonner les écritures avec des espaces en fin.

La page du plugin contient des liens vers des alternatives; il y a aussi une grande discussion sur le Wiki Vim Tips .

Ingo Karkat
la source