web-dev-qa-db-fra.com

Comment pouvez-vous supprimer automatiquement les espaces blancs de fin dans vim

Je reçois des erreurs de "fin d’espace" en essayant de valider certains fichiers dans git.

Je souhaite supprimer ces derniers espaces automatiquement juste avant d’enregistrer les fichiers python.

Pouvez-vous configurer vim pour faire cela? Si c'est le cas, comment?

193
Paul D. Eden

J'ai trouvé la réponse ici .

L'ajout de ce qui suit à mon fichier .vimrc a fait l'affaire.

autocmd BufWritePre *.py :%s/\s\+$//e
202
Paul D. Eden

Compilation de la position du curseur plus haut et sauvegarde:

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

autocmd FileType c,cpp,Java,php,Ruby,python autocmd BufWritePre <buffer> :call <SID>StripTrailingWhitespaces()

Si vous souhaitez appliquer cela lors de la sauvegarde à n’importe quel fichier, omettez le second autocmd et utilisez un caractère générique *:

autocmd BufWritePre * :call <SID>StripTrailingWhitespaces()
164
stepancheg

J'ai aussi généralement un:

match Todo /\s\+$/

dans mon .vimrc fichier, afin que les espaces de fin de ligne soient affichés en surbrillance.

À présent, il s’agit d’un syntaxe de syntaxe nom-groupe qui est utilisée pour des mots clés tels que TODO, FIXME ou XXX. Il a une couleur de fond jaunâtre ennuyeuse et laide, et je trouve que c’est le mieux pour calmer les choses que vous ne voulez pas dans votre code :-)

68
mat

Je souligne à la fois les espaces de fuite existants et les supprime.

Je configure mon éditeur (vim) pour afficher des espaces à la fin, par exemple.

enter image description here

avec ceci au bas de mon .vimrc:

highlight ExtraWhitespace ctermbg=red guibg=red
match ExtraWhitespace /\s\+$/
autocmd BufWinEnter * match ExtraWhitespace /\s\+$/
autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
autocmd InsertLeave * match ExtraWhitespace /\s\+$/
autocmd BufWinLeave * call clearmatches()

et je le dépouille automatiquement des fichiers lors de leur enregistrement, dans mon cas * .rb pour Ruby, toujours dans mon ~/.vimrc

function! TrimWhiteSpace()
    %s/\s\+$//e
endfunction
autocmd BufWritePre     *.rb :call TrimWhiteSpace()
52
Michael Durrant

Voici un moyen de filtrer selon plusieurs types de fichiers.

autocmd FileType c,cpp,python,Ruby,Java autocmd BufWritePre <buffer> :%s/\s\+$//e
13
syvex

Copié et collé depuis http://blog.kamil.dworakowski.name/2009/09/unobtrusive-highlighting-of-trailing.html (le lien ne fonctionne plus, mais le bit dont vous avez besoin est ci-dessous )

"Cela présente l'avantage de ne pas mettre en surbrillance chaque espace que vous tapez à la fin de la ligne, uniquement lorsque vous ouvrez un fichier ou quittez le mode insertion. Très soigné."

highlight ExtraWhitespace ctermbg=red guibg=red
au ColorScheme * highlight ExtraWhitespace guibg=red
au BufEnter * match ExtraWhitespace /\s\+$/
au InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
au InsertLeave * match ExtraWhiteSpace /\s\+$/
7
lazysoundsystem

J'ai vu cette solution dans un commentaire à VIM Wikia - Supprimez les espaces indésirables

J'aime vraiment ça. Ajoute un . sur les espaces blancs indésirables.

enter image description here

Mettez ceci dans votre .vimrc

" Removes trailing spaces
function TrimWhiteSpace()
  %s/\s*$//
  ''
endfunction

set list listchars=trail:.,extends:>
autocmd FileWritePre * call TrimWhiteSpace()
autocmd FileAppendPre * call TrimWhiteSpace()
autocmd FilterWritePre * call TrimWhiteSpace()
autocmd BufWritePre * call TrimWhiteSpace()
6
Diego Juliao

C'est comme ça que je le fais. Je ne me souviens plus où je l'ai volé.

autocmd BufWritePre * :call <SID>StripWhite()
fun! <SID>StripWhite()
    %s/[ \t]\+$//ge
    %s!^\( \+\)\t!\=StrRepeat("\t", 1 + strlen(submatch(1)) / 8)!ge
endfun
5
gregf

Une solution qui supprime simplement les espaces en fin de fichier du fichier n’est pas acceptable dans toutes les circonstances. Cela fonctionnera dans un projet qui a cette politique depuis le début, et il n'y a donc aucun espace tel que vous ne vous soyez pas ajouté vous-même dans votre prochain commit.

Supposons que vous souhaitiez simplement ne pas ajouter de nouvelles instances d'espaces blancs de fin, sans affecter les espaces existants dans les lignes que vous n'avez pas modifiées, afin de maintenir votre commit exempt de modifications non pertinentes pour votre travail.

Dans ce cas, avec git, vous pouvez utiliser un script comme celui-ci:

#!/bin/sh

set -e # bail on errors

git stash save commit-cleanup
git stash show -p | sed '/^\+/s/ *$//' | git apply
git stash drop

C’est-à-dire que nous stockons les modifications, puis filtrons toutes les + _ lignes dans le diff pour supprimer leurs espaces blancs de fin lorsque nous réappliquons la modification au répertoire de travail. Si ce canal de commande réussit, nous lâchons la cachette.

3
Kaz

Les autres approches ici ne fonctionnaient pas pour moi dans MacVim quand elles étaient utilisées dans le .vimrc fichier. Donc, voici celui qui fait et met en évidence les espaces de fin:

set encoding=utf-8
set listchars=trail:·
set list
1
mb21

autocmd BufWritePre * :%s/\s\+$//<CR>:let @/=''<CR>

0
aemonge

Si vous réduisez les espaces, vous devriez seulement le faire sur des fichiers déjà propres. "Quand à Rome ...". C'est une bonne Etiquette lorsque vous travaillez sur des bases de code où des modifications parasites sont malvenues.

Cette fonction détecte les espaces finaux et active le rognage uniquement s'il était déjà propre.

Le mérite de cette idée va à un joyau d’un commentaire ici: https://github.com/atom/whitespace/issues/1 (le plus long flux de commentaires de tickets de bogues jamais enregistré)

autocmd BufNewFile,BufRead *.test call KarlDetectWhitespace()

fun! KarlDetectWhitespace()
python << endpython
import vim
nr_unclean = 0
for line in vim.current.buffer:
    if line.rstrip() != line:
        nr_unclean += 1

print "Unclean Lines: %d" % nr_unclean
print "Name: %s" % vim.current.buffer.name
cmd = "autocmd BufWritePre <buffer> call KarlStripTrailingWhitespace()"
if nr_unclean == 0:
    print "Enabling Whitespace Trimming on Save"
    vim.command(cmd)
else:
    print "Whitespace Trimming Disabled"
endpython
endfun

fun! KarlStripTrailingWhitespace()
    let l = line(".")
    let c = col(".")
    %s/\s\+$//e
    call cursor(l, c)
endfun
0
Karl Pickett

Pour les personnes qui souhaitent l'exécuter pour des types de fichiers spécifiques (les FileTypes ne sont pas toujours fiables):

autocmd BufWritePre *.c,*.cpp,*.cc,*.h,*.hpp,*.py,*.m,*.mm :%s/\s\+$//e

Ou avec vim7:

autocmd BufWritePre *.{c,cpp,cc,h,hpp,py,m,mm} :%s/\s\+$//e
0
Mr_Pouet