Comment corriger l'indentation d'un fichier entier dans Vi?


625

Dans Vim, quelle est la commande pour corriger l'indentation de toutes les lignes?

Souvent, je vais copier et coller du code dans un terminal distant et tout gâcher. Je veux résoudre ce problème d'un seul coup.



8
Mieux vaut prévenir que guérir. Dans cet esprit vient ce commentaire. Faites un ": set paste" avant d'entrer en mode d'insertion et de coller le code depuis le terminal distant.
Chthonic Project

Réponses:


1215

=, la commande de retrait peut accepter des mouvements. Donc, ggpour obtenir le début du fichier, =au tiret, Gà la fin du fichier, gg=G.


39
Je ne pourrai jamais désapprendre mon précieux 1G =) Un de mes favoris est =% debout sur un support ouvrant. Il corrige les retraits de tout le bloc.
PEZ

2
: 0 <return> n'est pas si mal mais gg est sympa. (ouais, j'ai d'abord appris ed)
Erik Olson

8
Puis-je mettre en retrait l'intégralité du fichier sans quitter la ligne actuelle?
Fábio Perez

86
@ Fábio: ''(deux guillemets simples) vous ramène à l'endroit où vous étiez si vous gg=G''deviez mettre en retrait puis revenir.
Nemo157

@ArchimedesTrajano Le stock de vim de Mac OS est très ancien, je recommande la version de HomeBrew; c'est beaucoup plus récent. J'ai eu quelques problèmes ennuyeux avec le vim de Mac. De plus, j'ai entendu dire que vous ne devriez pas jouer avec celui intégré, alors n'essayez pas de le mettre à jour vous-même à moins d'être très prudent.
AlexMA

126

Avant de coller dans le terminal, essayez :set pastepuis :set nopasteaprès avoir terminé. Cela désactivera le retrait automatique, le retour à la ligne et d'autres fonctionnalités qui gâchent votre pâte.

edit: Aussi, je dois souligner qu'un résultat bien meilleur que l' =indentation peut généralement être obtenu en utilisant un programme externe. Par exemple, je cours :%!perltidytout le temps. astyle, cindentEtc. peuvent également être utilisés. Et, bien sûr, vous pouvez les mapper à un coup de clé et en mapper différents sur la même frappe en fonction du type de fichier.


5
Vous pouvez définir l' equalprgoption dans un plugin ft pour utiliser un filtre externe pour l' =indentation, plutôt qu'une liaison de touches personnalisée.
Josh Lee

Il existe également une option de raccourci clavier par exemple. : définir pt \ p pour basculer entre les modes
Michael

Remarque: dans vimconfig de grml, la clé pastetoggle est mappée sur F11
Thomas

J'utilise formatpgmavec rangé et astyle puis gq. Voici quelques exemples de mon .vimrc: au FileType xml set fp=tidy\ -q\ -i\ -xmletau FileType java set fp=/usr/local/bin/astyle\ --mode=java\ --indent=tab
Raffi Khatchadourian

vient de télécharger perltidy après avoir lu ceci, c'est tellement mieux que le retrait automatique par défaut de vim
Joey Ciechanowicz

29

Si vous voulez réindenter le bloc dans lequel vous vous trouvez sans avoir à taper d'accords, vous pouvez faire:

[[=]]

1
Désolé de faire revivre cela, mais qu'entendiez-vous par accords? Coords?
John P

7
"Accords" se réfère ici aux commandes émises en maintenant une touche enfoncée tout en appuyant sur une autre, par analogie aux accords musicaux où plusieurs notes étaient émises simultanément. Donc G est shift + g, ^] est ctrl +], et ainsi de suite. Celles-ci prennent plus de temps à taper que les liaisons à clé unique.
Ralph Giles

Vous pouvez également utiliser =aBce qui ne déplacera pas du tout le curseur.
amin

7
Sur le clavier nordique, [[=]]nécessite 5 accords :(
k4kuz0

29

Le maître de toutes les commandes est

gg=G

Cela indente l'intégralité du fichier!

Et voici quelques-unes des commandes simples et élégantes utilisées pour indenter rapidement des lignes dans Vim ou gVim.

Pour mettre en retrait toutes les lignes sous la ligne actuelle

=G

Pour mettre en retrait la ligne actuelle

==

Pour mettre en retrait des nlignes sous la ligne actuelle

n==

Par exemple, pour mettre en retrait 4 lignes sous la ligne actuelle

4==

Pour mettre en retrait un bloc de code, accédez à l'un des accolades et utilisez la commande

=%

17

Vous pouvez utiliser une application / un utilitaire bien rangé pour mettre en retrait des fichiers HTML et XML et cela fonctionne assez bien pour mettre en retrait ces fichiers.

Prettifier un fichier XML

:!tidy -mi -xml %

Prettifier un fichier HTML

:!tidy -mi -html %

16

appuyez sur Échap, puis tapez rapidement les combinaisons ci-dessous:

gg=G

28
J'ai tapé lentement, vous ne croirez pas ce qui s'est passé ensuite.
k0pernikus

Je viens de donner la réponse et le commentaire une upvote car c'était inestimable! lol @ k0pernikus
lunettes

12

1G=G. Cela devrait mettre en retrait toutes les lignes du fichier. 1Gvous prend la première ligne, =démarre le retrait automatique et la finale Gvous prend la dernière ligne du fichier.


Ou même1gg=G
Biggybi

1G = G l'a corrigé pour moi. Impressionnant!
Natus Drew

8

:set pasteest votre ami, j'utilise du mastic et je finis par copier du code entre les fenêtres. Avant d'être activé :set paste(et :set nopaste) copier / coller m'a donné des ajustements pour cette raison.


1
Oui, j'utilise aussi du mastic. : définir la pâte est génial
mmcdole

7

Dans Vim, utilisez :insert. Cela conservera toute votre mise en forme et ne fera pas d'indentation automatique. Pour plus d'informations help :insert.


7

si vous ne souhaitez pas utiliser :set paste, cliquez avec le bouton du milieu set nopaste, vous pouvez également coller le contenu du presse-papiers:

"*p
"+p

De cette façon, vous n'avez pas à quitter le mode normal. si vous devez coller +ou *dépend de la façon dont vous avez sélectionné le texte, voir :help quoteplus.


4

vim-autoformat formate vos fichiers sources à l'aide de programmes externes spécifiques à votre langue, par exemple la gemme "rbeautify" pour les fichiers Ruby, le package npm "js-beautify" pour JavaScript.


3

Pour les fichiers C ++ complexes, vim n'obtient pas toujours le bon formatage lors de l'utilisation de la =commande de filtre de vim . Donc, pour de telles situations, il est préférable d'utiliser un formateur C ++ externe comme astyle (ou non crustify ), par exemple:

:%!astyle

La fonction '=' de Vim utilise son formateur interne par défaut (ce qui ne fait pas toujours bien les choses) mais on peut également le configurer en utilisant un formateur externe, comme astyle, en le configurant correctement comme discuté dans cette question .



1

Vous pouvez créer un mappage pour le faire pour vous.

Celui-ci mettra automatiquement en retrait tout le fichier et gardera toujours votre curseur dans la position où vous vous trouvez:

nmap <leader>ai mzgg=G`z

0

Pour vi Editor, utilisez: insert. Cela gardera toute votre mise en forme et n'insérera pas l'indentation automatique. comme ^ je par exemple:

public static void main(String[] args) {
^I
^I System.out.println("Some Garbage printed upon using :insert"); 
}

0

Passez simplement en mode visuel dans vim, et sélectionnez de haut en bas après avoir sélectionné simplement appuyez sur =, toute la ligne sélectionnée sera indentée.


J'éviterais ça. Le mode visuel est pour quand vous n'êtes pas sûr de vos mouvements, si vous savez capturer un ensemble de caractères, alors il n'y a aucun intérêt à l'étape supplémentaire de passer en mode visuel. Pourquoi ggvG=quand tu peux gg=G. Quel était l'intérêt de rendre la motion visible? Cela vaut pour toutes les actions qui prennent des motions.
alextes
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.