Comment supprimer automatiquement les espaces blancs dans vim

J’obtiens des erreurs de «traînage d’espaces» en essayant de valider des fichiers dans git.

Je veux supprimer automatiquement ces caractères blancs avant d’enregistrer les fichiers Python.

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

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 

Compilation de ci-dessus et sauvegarde de la position du curseur:

 fun! SsortingpTrailingWhitespaces() let l = line(".") let c = col(".") %s/\s\+$//e call cursor(l, c) endfun autocmd FileType c,cpp,java,php,ruby,python autocmd BufWritePre  :call SsortingpTrailingWhitespaces() 

Si vous souhaitez l’appliquer lors de l’enregistrement sur n’importe quel fichier, autocmd pas le premier autocmd et utilisez un caractère générique * :

 autocmd BufWritePre * :call SsortingpTrailingWhitespaces() 

J’ai aussi généralement un:

 match Todo /\s\+$/ 

dans mon fichier .vimrc , afin que les espaces en fin de ligne soient hilighted.

Il peut s’agir d’un nom de groupe qui utilise la syntaxe pour mettre en valeur les mots-clés tels que TODO , FIXME ou XXX . Il a une couleur d’arrière-plan jaunâtre horriblement moche, et je trouve que c’est le meilleur pour hilight choses que vous ne voulez pas dans votre code 🙂

Je mets tous les deux en évidence les espaces blancs et les bandes de fin.

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

entrer la description de l'image ici

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\+\%#\@ 

et je le "supprime automatiquement" des fichiers en les enregistrant, dans mon cas * .rb pour les fichiers ruby, encore une fois dans mon ~ / .vimrc

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

Voici un moyen de filtrer par plusieurs types de fichiers.

 autocmd FileType c,cpp,python,ruby,java autocmd BufWritePre  :%s/\s\+$//e 

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

“Cela a l’avantage de ne pas mettre en évidence chaque espace que vous tapez à la fin de la ligne, uniquement lorsque vous ouvrez un fichier ou quittez le mode d’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\+\%#\@ 

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

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

Une solution qui ne fait que supprimer les espaces blancs du fichier n’est pas acceptable en toutes circonstances. Cela fonctionnera dans un projet qui a eu cette politique depuis le début, et il n’y a donc pas de tels espaces que vous ne vous êtes pas contentés d’append vous-même lors de votre prochain commit.

Supposons que vous souhaitiez simplement ne pas append de nouvelles occurrences d’espaces blancs, sans affecter les espaces blancs existants dans les lignes que vous n’avez pas éditées, afin de garder votre engagement 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 nous filtrons toutes les lignes + dans le diff afin de supprimer leurs espaces lorsque nous réappliquons le changement dans le répertoire de travail. Si ce tube de commande réussit, nous supprimons le cache.

J’ai vu cette solution dans un commentaire sur Wikim VIM – Supprimer les espaces indésirables

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

entrer la description de l'image ici

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

Les autres approches ne fonctionnaient pas pour moi dans MacVim lorsqu’elles étaient utilisées dans le fichier .vimrc . Donc, voici une qui fait et souligne les espaces de fin:

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

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

Pour les personnes souhaitant 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 

Si vous rognez les espaces, vous ne devez le faire que sur des fichiers déjà propres. “Quand à Rome …”. Ceci est une bonne étiquette lorsque vous travaillez sur des codes de codes où les modifications inutiles sont indésirables.

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

Le mérite de cette idée revient à un petit commentaire ici: https://github.com/atom/whitespace/issues/10 (le plus long stream de commentaires sur les tickets de bogues)

 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  call KarlSsortingpTrailingWhitespace()" if nr_unclean == 0: print "Enabling Whitespace Trimming on Save" vim.command(cmd) else: print "Whitespace Trimming Disabled" endpython endfun fun! KarlSsortingpTrailingWhitespace() let l = line(".") let c = col(".") %s/\s\+$//e call cursor(l, c) endfun