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.

mmcdole
la source
Similaire: Ré-indentation de code mal indenté à Vi SE
kenorb
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.

Logan Capaldo
la source
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.

derobert
la source
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:

[[=]]
Andrew Wagner
la source
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

=%
Sagar Jain
la source
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 %
Naga Kiran
la source
16

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

gg=G
tokhi
la source
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.

Amjith
la source
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.

Elsporko
la source
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.

Eric Johnson
la source
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.

0x89
la source
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.

Wojtek Kruszewski
la source
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 .

Pierz
la source
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
Sergio D. Márquez
la source
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"); 
}
ps2090
la source
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.

Ramanand Yadav
la source
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