Il est assez courant, lors de la programmation ou de l’ouverture de fichiers texte, de rencontrer des fichiers avec des espaces en fin de ligne. vim a un moyen de le montrer en définissant l' trail
option dans l' listchars
option puis en l'activant list
.
Cependant, quel est le moyen le plus simple d’éliminer globalement l’espace caché dans l’ensemble du fichier (idéalement sans plugin)?
whitespace
line-breaks
Andrew Ferrier
la source
la source
:h vim-faq
et effectuer une recherche/trailing
. Le tag difficile à mémoriser est:h faq-12.1
.Réponses:
Utilisez un raccourci clavier pour effacer tous les espaces finaux
Étant donné que certaines pages que je modifie ont réellement besoin d'espaces de fin (par exemple, de markdown) et d'autres non, j'ai configuré une liaison de clé pour F5qu'il soit facile de le faire sans être automatique. Pour ce faire, ajoutez le code ci-dessous (de vim.wikia) ou une variante de celui-ci à votre
.vimrc
:nnoremap <F5>
effectue un mappage non récursif sur la cléF5
en mode normal:let _s=@/
stocke le dernier terme de recherche (de la macro@/
) dans la variable_s
<Bar>
Fonctionne comme un symbole de canal|
pour séparer les commandes, mais|
mettrait fin à une commande dans ce contexte, elle<Bar>
doit donc être utilisée à la place.:%s/\s\+$//e
recherche les espaces de fin et les supprime partout dans le tampon (voir la réponse de CarpetSmoker pour une analyse détaillée de cette expression)let @/=_s
restaure votre dernier terme de recherche dans la macro@/
, afin qu'il soit disponible lors de votre prochain contactn
.<CR>
termine la cartographie... ou être plus sélectif
Si vous avez des cas dans lesquels vous ne souhaitez pas effacer tous les espaces finaux, vous pouvez utiliser un modèle pour être plus sélectif. Par exemple, le code suivant montre comment je supprime les espaces en fin de champ uniquement s'ils sont placés après un point-virgule (ici, ils sont liés F8).
Ceci est utile si, comme moi, vous avez des fichiers avec des heredocs de type markdown, intercalés entre des instructions de programmation terminées par des points-virgules.
la source
:keeppatterns
d'éviter de passer outre@/
. Et aussi jeter un oeil à:keepjumps
.:help keeppattern
et je n'ai rien eu.:nohl
soit, si si vous surlignant quelque chose, il gardera mettre en évidence le (voir ma réponse mise à jour).Le "plus simple" consiste simplement à utiliser
:substitute
::%s
pour exécuter:substitute
sur la plage%
, qui est la totalité du tampon.\s
Ne correspond pas à tous les caractères blancs.\+
pour les répéter 1 fois ou plus.$
jeter l'ancre au bout de la ligne.e
indicateur pour ne pas donner d'erreur s'il n'y a pas de correspondance (c'est-à-dire que le fichier est déjà sans espaces de fin).Cependant, ce n’est probablement pas le "meilleur" moyen car il a deux effets secondaires:
Vous pouvez corriger les deux éléments en les transformant en une fonction:
Et puis l'utiliser comme:
winsaveview()
sauvegarde enregistrera la "vue" actuelle, qui comprend la position du curseur, les replis, les sauts, etc. La dernièrewinrestview()
la restaurera à partir de la variable enregistrée.:keeppatterns
empêche le\s\+$
motif d'être ajouté à l'historique de recherche.Comme il est un peu ennuyeux de taper
:call
tout le temps, vous pouvez définir une commande:Qui peut être utilisé sans le
:call
:Et vous pouvez bien sûr le lier à une clé:
Certaines personnes aiment le faire automatiquement avant d’écrire un fichier sur le disque, comme ceci:
Je n'aime pas ça, car certains formats nécessitent des espaces de fin (tels que Markdown) et, à d'autres occasions, vous souhaitez même des espaces de fin dans votre code (tels que le formatage d'un e-mail et l'utilisation du
--<Space>
marqueur pour indiquer le début d'une signature.) ).Mode plug éhonté: il y a quelque temps, j'ai écrit un petit script Python pour nettoyer les espaces d'un projet entier à la fois.
la source
`
deux fois sur cette option une fois le remplacement terminé. Cela ouvre la possibilité de créer un oneliner comme celui-ci:%s/\s\+$//e | exe "normal ``"
Pour supprimer tous les espaces finaux (à la fin de chaque ligne), vous pouvez utiliser la commande suivante:
Pour inclure des onglets, utilisez
\s
plutôt que l'espace.A partir de la ligne de commande:
Tous les fichiers du répertoire en cours (à utiliser de manière récursive
**/*.*
):Façon Python:
ou:
Utilisez-le
lstrip()
pour la bande gauche (tirée),rstrip()
pour la bande droite (avant) oustrip()
pour la retirer des deux côtés.Voici une fonction utile qui supprime les blancs superflus de la fin d'une ligne que vous pouvez ajouter à votre
.vimrc
:Il existe également un plugin DeleteTrailingWhitespace pour cela.
Mise en évidence des espaces blancs
Pour vérifier si tous les espaces de fin ont disparu, utilisez:
Tapez
/ $
pour les trouver. S'il y en a, vim les mettra en évidence pour vous.Utilisez des couleurs pour les mettre en évidence:
Utilisez des caractères visibles ( source ):
Voir aussi: Mettre en évidence les espaces non désirés
Pour mettre en évidence les espaces finaux par défaut, vous pouvez configurer votre
.vimrc
comme suit:Supprimer les espaces blancs par défaut
Si vous souhaitez vous assurer que tous les espaces finaux d'un fichier sont automatiquement supprimés lors de l'enregistrement, vous pouvez ajouter la commande suivante dans votre
.vimrc
:ce qui n'est pas recommandé, car il supprimera les espaces finaux de chaque fichier enregistré par l'utilisateur (même lorsque des espaces peuvent être souhaités).
Voir également:
la source
En réponse à la réponse de Christopher Bottoms : Jonathan Palardy a écrit un bon article à ce sujet . Il y écrit une fonction
Preserve(command)
qui préserve l’état de l’éditeur (principalement la position du curseur et le dernier motif de recherche) lors de l’exécution d’une commande quelconque:Cela a l’avantage d’être polyvalent. Par exemple, vous pouvez l’utiliser pour remplacer tous les espaces finaux (comme le fait Jonathan) en les mappant sur:
Vous pouvez également l'utiliser pour un mappage en mode visuel afin de simplement supprimer les espaces de fin sur les lignes sélectionnées visuellement:
Et vous pouvez l’utiliser pour d’autres appels, tels que le formatage de l’ensemble du document
=
tout en conservant votre emplacement (utilisez une autre clé pour éviter tout conflit):Dans l’ensemble, j’ai trouvé la
Preserve(command)
fonction très utile.la source
@/
ne devrait pas être nécessaire (dans ce cas, de toute façon).winsaveview()
etwinrestview()
sont de loin supérieurs.Une autre version de la fonction StripTrailingSpaces:
ACTUELLEMENT, IL Y A UN BUG DANS CETTE FONCTION (celle-ci): l’option n’est pas conservée à cause de l’option "range". si elle est supprimée, cela fonctionne très bien, mais je partage le code pour recevoir de l’aide.
Comme vous pouvez le constater, il utilise également la fonction Préserver décrite ci-dessus, mais d'une manière légèrement différente.
La différence ici est que je peux sélectionner une plage de lignes ou un paragraphe avec
vip
, puis la plage:'<,'>
apparaîtra automatiquement à l'invite de commande.L'idée est venue du message de Bez Hermoso .
la source