113 votes

Changer l'indent de 2 espaces en 4 espaces dans vim

J'ai quelques codes copié à partir de l'Internet qui ont 2-espace de mise en retrait et je veux le changer en 4-espace de mise en retrait. Je me demande si il y a un court vim routine pour accomplir la tâche sans avoir à écrire le script vim? Voici comment je suis en train de le faire avec un fichier HTML:

  • Enregistrer une macro
  • Aller au début d'une ligne
  • Visual sélectionnez tous les espaces jusqu'à la première occurrence de "<"
  • Copier et coller tous les espaces (essentiellement les doubler)
  • Rejouer la macro jusqu'à la fin du fichier

En court - qa0vt<yp<esc>jq

Les pièges:

La macro échoue pour une ligne vide ou une ligne qui ne commence pas par "<". Et je n'ai aucune idée de comment étendre cette solution à la non-fichier HTML.

197voto

Daan Points 1633

Une manière générale de changer le retrait est de changer le tabstop:

Collez votre fichier dans un tampon vide, puis:

 :set ts=2 sts=2 noet
:retab!
 

Cela change tous les 2 espaces en un caractère de tabulation, puis:

 :set ts=4 sts=4 et
:retab
 

Cela change chaque tabulation à 4 espaces.

L'avantage de cette méthode est que vous pouvez également l'utiliser en sens inverse, pour convertir de 4 à 2 espaces par exemple.

69voto

perreal Points 47912

Cela peut être possible avec :set shiftwidth=4 et gg=G .

40voto

spro Points 108

Ce que je fais est très similaire aux approches esneider et cforbish, mais un peu plus rapide à taper:

 :%s/^\s*/&&
 

Remplace simplement l'espace de début (espaces ou tabulations) par deux fois plus d'espace de début ( & est substitué par l'expression correspondante).

3voto

cforbish Points 3171

J'ai utilisé cette expression régulière (elle double le nombre d'espaces de début):

 %s;^\(\s\+\);\=repeat(' ', len(submatch(0))*2);g
 

1voto

esneider Points 152

Similaire (mais un peu plus simple) à la réponse de cforbish, cette expression régulière dupliquera les espaces de début

 :%s/^\( \+\)/\1\1
 

Ou vous pouvez utiliser cet autre regex pour transformer 2 espaces en 4 espaces, en préservant les espaces simples (et les montants impairs en général)

 :%s/^\(\(  \)\+\)/\1\1
 

C'est,

  • 1 espace ⇢ 1 espace
  • 2 espaces ⇢ 4 espaces
  • 3 espaces ⇢ 5 espaces
  • 4 espaces ⇢ 8 espaces

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X