Retrait rapide de plusieurs lignes dans vi

2158

Cela devrait être trivial, et cela pourrait même être dans l'aide, mais je ne sais pas comment y naviguer. Comment mettre en retrait rapidement plusieurs lignes dans vi?

Allain Lalonde
la source

Réponses:

2552

Utilisez la >commande. Pour mettre en retrait cinq lignes, 5>>. Pour marquer un bloc de lignes et le mettre en retrait, Vjj>mettre en retrait trois lignes (Vim uniquement). Pour mettre en retrait un bloc d'accolades, placez votre curseur sur l'un des accolades et utilisez >%ou depuis n'importe où à l'intérieur du bloc >iB.

Si vous copiez des blocs de texte et que vous devez aligner le retrait d'un bloc à son nouvel emplacement, utilisez ]pplutôt que juste p. Cela aligne le bloc collé avec le texte environnant.

En outre, le shiftwidthparamètre vous permet de contrôler le nombre d'espaces à indenter.

Greg Hewgill
la source
77
J'utilise> i} (indentation du bloc {} intérieur). Fonctionne en vim. Pas sûr que cela fonctionne dans vi.
R. Martinho Fernandes
11
Mon problème (dans gVim) est que la commande> indente beaucoup plus de 2 blancs (je veux juste deux blancs mais> indente quelque chose comme 5 blancs)
Kamran Bigdely
28
@Kamran: Voir le shiftwidthparamètre pour savoir comment changer cela.
Greg Hewgill
4
@MattStevens: Vous pouvez trouver une discussion approfondie sur ce phénomène ici: meta.stackexchange.com/questions/9731/…
Greg Hewgill
5
J'indente souvent des blocs visuels plusieurs fois de suite, par exemple en corrigeant certaines balises collées dans un fichier XML. Plutôt que de resélectionner le bloc en mode visuel à chaque fois, on peut utiliser 'gv' pour réutiliser le dernier bloc visuel. Référence superuser.com/questions/220666/…
David Mann
958

Cette réponse résume les autres réponses et commentaires de cette question et ajoute des informations supplémentaires basées sur la documentation Vim et le wiki Vim . Par souci de concision, cette réponse ne fait pas de distinction entre les commandes spécifiques à Vi et à Vim.

Dans les commandes ci-dessous, "ré-indentation" signifie "indentation des lignes selon vos paramètres d'indentation ". shiftwidthest la variable principale qui contrôle l'indentation.

Commandes générales

>>   Indent line by shiftwidth spaces
<<   De-indent line by shiftwidth spaces
5>>  Indent 5 lines
5==  Re-indent 5 lines

>%   Increase indent of a braced or bracketed block (place cursor on brace first)
=%   Reindent a braced or bracketed block (cursor on brace)
<%   Decrease indent of a braced or bracketed block (cursor on brace)
]p   Paste text, aligning indentation with surroundings

=i{  Re-indent the 'inner block', i.e. the contents of the block
=a{  Re-indent 'a block', i.e. block and containing braces
=2a{ Re-indent '2 blocks', i.e. this block and containing block

>i{  Increase inner block indent
<i{  Decrease inner block indent

Vous pouvez remplacer {par }ou B, par exemple, =iBest une commande de retrait de bloc valide. Jetez un oeil à "Retrait d'un bloc de code" pour un bel exemple pour essayer ces commandes.

N'oubliez pas non plus que

.    Repeat last command

, de sorte que les commandes d'indentation peuvent être répétées facilement et commodément.

Ré-indentation de fichiers complets

Une autre situation courante exige que l'indentation soit corrigée dans un fichier source:

gg=G  Re-indent entire buffer

Vous pouvez étendre cette idée à plusieurs fichiers:

" Re-indent all your C source code:
:args *.c
:argdo normal gg=G
:wall

Ou plusieurs tampons:

" Re-indent all open buffers:
:bufdo normal gg=G:wall

En mode visuel

Vjj> Visually mark and then indent three lines

En mode insertion

Ces commandes s'appliquent à la ligne actuelle:

CTRL-t   insert indent at start of line
CTRL-d   remove indent at start of line
0 CTRL-d remove all indentation from line

Commandes Ex

Ils sont utiles lorsque vous souhaitez mettre en retrait une plage spécifique de lignes, sans déplacer votre curseur.

:< and :> Given a range, apply indentation e.g.
:4,8>   indent lines 4 to 8, inclusive

Retrait à l'aide de marqueurs

Une autre approche consiste à utiliser des marqueurs :

ma     Mark top of block to indent as marker 'a'

... déplacer le curseur vers la position finale

>'a    Indent from marker 'a' to current location

Variables régissant l'indentation

Vous pouvez les définir dans votre fichier .vimrc .

set expandtab       "Use softtabstop spaces instead of tab characters for indentation
set shiftwidth=4    "Indent by 4 spaces when using >>, <<, == etc.
set softtabstop=4   "Indent by 4 spaces when pressing <TAB>

set autoindent      "Keep indentation from previous line
set smartindent     "Automatically inserts indentation in some cases
set cindent         "Like smartindent, but stricter and more customisable

Vim a une indentation intelligente basée sur le type de fichier. Essayez d'ajouter ceci à votre .vimrc:

if has ("autocmd")
    " File type detection. Indent based on filetype. Recommended.
    filetype plugin indent on
endif

Références

ire_and_curses
la source
13
Cette réponse et celle ci-dessus étaient excellentes. Mais j'ai attribué +1 à cela car cela m'a rappelé l'opérateur 'dot', qui répète la dernière commande. Ceci est extrêmement utile lorsque vous devez indenter un bloc entier plusieurs espaces de décalage (ou indentations) sans avoir besoin de continuer à appuyer >}. Merci beaucoup
Amit
1
5 >> Retrait de 5 lignes: cette commande met en retrait la cinquième ligne, pas 5 lignes. Cela pourrait-il être dû à mes paramètres VIM ou votre formulation est-elle incorrecte?
Wipqozn du
1
@Wipqozn - C'est étrange. Il met définitivement en retrait les cinq prochaines lignes pour moi, testées sur Vim 7.2.330.
ire_and_curses
8
> 42gg ​​Retrait de l'endroit où vous allez à la ligne 42.
Steve
Excellent résumé! Notez également que le "retrait à l'intérieur du bloc" et "retrait à tous les blocs" (<i {> a {etc.) fonctionne également avec des parenthèses et des crochets:> a (<i] etc. (Et pendant que j'y suis, dans en plus des <>, ils fonctionnent aussi avec d, c, y etc.)
aqn

123

Une grande sélection serait:

gg=G

C'est vraiment rapide, et tout est mis en retrait ;-)


1
J'ai un fichier XML et j'ai activé la coloration syntaxique. La saisie gg=Gmet simplement chaque ligne à partir de la position 1. Tous les espaces blancs ont été supprimés. Existe-t-il autre chose spécifique à XML?
asgs

2
Je pense que set cindentdevrait être dans vimrc ou devrait s'exécuter :set cindentavant d'exécuter cette commande
Amanuel Nega

3
Je pense que cindent doit être réglé en premier. et @asgs je pense que cela ne fonctionne que pour les langages de programmation cstyle.
Amanuel Nega

110

Essayez également cette option pour l' indentation en C. Faites :help =pour plus d'informations:

={

Cela indentera automatiquement le bloc de code actuel dans lequel vous vous trouvez.

Ou juste:

==

pour indenter automatiquement la ligne actuelle.


2
ne fonctionne pas pour moi, vide simplement mon curseur sur la ligne au-dessus de l'accolade d'ouverture du bloc de code actuel dans lequel je suis.
underscore_d

79

Appuyez sur les touches pour plus de personnes visuelles:

  1. Entrer en mode commande:
    Escape

  2. Déplacez-vous au début de la zone pour mettre en retrait:
    hjkl

  3. Démarrer un bloc:
    v

  4. Déplacez-vous jusqu'à la fin de la zone pour mettre en retrait:
    hjkl

  5. (Facultatif) Tapez le nombre de niveaux d'indentation que vous souhaitez
    0..9

  6. Exécutez le retrait sur le bloc:
    >


2
C'est très bien, mais cela utilise des espaces et non des tabulations. Une façon possible de résoudre ce problème?
Shane Reustle

12
Si son utilisation d'espaces au lieu de tabulations, c'est probablement parce que vous avez défini l'indentation pour utiliser des espaces. =).
Kent Fredric

4
Lorsque l'option 'expandtab' est désactivée (c'est la valeur par défaut), Vim utilise autant de <Tab> que possible pour faire le retrait. (: aide:>)
Kent Fredric

1
Le seul paramètre vim lié à l'espace / tabulation que j'ai changé est: set tabstop = 3. Il s'agit en fait de l'insérer à chaque fois que j'utilise >>: "<tab> <space> <space>". Même chose avec l'indentation d'un bloc. Des idées?
Shane Reustle

3
Les trois paramètres que vous souhaitez rechercher pour "espaces vs tabulations" sont 1. tabstop 2. shiftwidth 3. expandtab. Vous avez probablement "shiftwidth = 5 noexpandtab", donc un "tab" est de 3 espaces, et un niveau d'indentation est de "5" espaces, il constitue donc le 5 avec 1 tab et 2 espaces.
Kent Fredric

66

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 la ligne actuelle
==

Pour mettre en retrait toutes les lignes sous la ligne actuelle

=G

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

=%

Ce sont les commandes les plus simples mais puissantes pour indenter plusieurs lignes.


3
C'est juste dedans vim, non vi.
rojomoke

3
Pas sur mes boîtiers Solaris ou AIX, ce n'est pas le cas. La clé d'égalité a toujours été l'une de mes affectations de macro ad hoc standard. Êtes-vous sûr que vous ne regardez pas un vimlien vers un vi?
rojomoke

3
Oui, sous Linux, vi est presque toujours un lien vers vim. Essayez d'exécuter la commande: ve dans vi.
rojomoke

4
J'adore ce genre de réponses: claires, précises et succinctes. A travaillé pour moi dans Debian Jessie. Merci, @SJain
digitai

1
Depuis que j'utilise vim, pas vi, assez excité, cette réponse est ici. Merci.
Dan Nissenbaum

66

En plus de la réponse déjà donnée et acceptée, il est également possible de placer un marqueur puis de tout mettre en retrait du curseur actuel au marqueur.

Ainsi, entrez maoù vous voulez le haut de votre bloc en retrait, faites glisser le curseur vers le bas autant que vous le souhaitez, puis tapez >'a(notez que " a" peut être remplacé par n'importe quel nom de marqueur valide). C'est parfois plus facile que 5>>ou vjjj>.


1
C'est vraiment utile. Je vais devoir chercher ce qui fonctionne avec ça. Je sais d'a et y'a, quoi d'autre?
user606723

2
Ceci est très utile car il évite de compter le nombre de lignes que vous souhaitez mettre en retrait.
ziggy

29

Aller au début du texte

  • appuyez sur vpour le mode visuel.
  • utilisez up/ downflèche pour mettre en surbrillance le texte.
  • appuyez sur =pour mettre en retrait toutes les lignes que vous avez mises en surbrillance.

28

En plus des solutions proposées, j'aime faire les choses un paragraphe à la fois avec >}


2
Ouaip, et c'est pourquoi l'un de mes gros problèmes est les espaces blancs sur une ligne autrement vide: ils gâchent la notion de Vim d'un "paragraphe".
aqn

28

Lorsque vous sélectionnez un bloc et que vous utilisez >pour mettre en retrait, celui-ci revient ensuite en mode normal. J'ai ceci dans mon fichier .vimrc:

vnoremap < <gv

vnoremap > >gv

Il vous permet de mettre en retrait votre sélection autant de fois que vous le souhaitez.


17
Pour mettre en retrait la sélection plusieurs fois, vous pouvez simplement appuyer sur. pour répéter la commande précédente.
sundar

2
Le problème avec. dans cette situation, c'est que vous devez déplacer vos doigts. Avec la solution de @ mike (la même que j'utilise), vous avez déjà les doigts sur la touche de retrait et pouvez simplement continuer à la frapper pour continuer à mettre en retrait plutôt que de changer et de faire autre chose. Utiliser les règles prend plus de temps car vous devez bouger vos mains et cela demande plus de réflexion car il s'agit d'une seconde opération différente.
masukomi

21

Supposons que vous utilisez 2 espaces pour indenter votre code. Type:

:set shiftwidth=2
  • Tapez v(pour entrer en mode d'édition de bloc visuel)
  • Déplacez le curseur avec les touches fléchées (ou avec h/ j/ k/ l) pour mettre en surbrillance les lignes à mettre en retrait ou à retirer.

Alors:

  • Tapez >pour mettre en retrait une fois (2 espaces).
  • Type 2> pour mettre en retrait deux fois (4 espaces).
  • Tapez 3>pour mettre en retrait trois fois (6 espaces).
  • ...
  • Tapez <pour annuler l'indentation une fois (2 espaces).
  • Tapez 2<pour annuler l'indentation deux fois (4 espaces).
  • Tapez 3<pour annuler l'indentation trois fois (6 espaces).
  • ...

Vous avez eu l'idée.

( Les lignes vides ne seront pas indentées, ce qui je pense est plutôt sympa. )


J'ai trouvé la réponse dans la documentation (g) vim pour les blocs en retrait:

:help visual-block
/indent

Si vous souhaitez donner un compte à la commande, faites-le juste avant de taper le caractère de l'opérateur: "v {move-around} 3>" (déplacez les lignes 3 retraits vers la droite).

John Sonderson
2
Je dirais que vi / vim est la plupart du temps cohérent. Par exemple, D ne se comporte pas de la même manière que S et Y! :)
aqn
1
cela commence du côté gauche du fichier ... pas la position actuelle du bloc
Eliethesaiyan
1
Génial, juste ce que je cherchais (un moyen d'insérer un nombre spécifique d'espaces - 4 espaces pour le code de démarque - pour remplacer mon retrait normal). Dans mon cas, je voulais indenter un nombre spécifique de lignes en mode visuel, donc shift-v pour mettre en évidence les lignes, puis :'<,'>le4insérer les espaces. Merci!
Subfuzion
1
Il existe clairement de nombreuses façons de résoudre ce problème, mais c'est la plus simple à mettre en œuvre, car les numéros de ligne s'affichent par défaut dans vim et ne nécessitent pas de calculs.
HoldOffHunger
Les numéros de ligne @HoldOffHunger ne s'affichent pas par défaut. Vous devez utiliser :set numberpour basculer les numéros de ligne (ils sont désactivés par défaut) ou mettre set numbervotre vimrc.
DryLabRebel
C'est lourd, mais c'est la voie à suivre si vous effectuez un formatage en dehors du noyau VIM (par exemple, en utilisant vim-prettierau lieu du moteur d'indentation par défaut). >Sinon, l' utilisation augmentera royalement le formatage effectué par Prettier.
oligofren
C'est drôle, je trouve ça tout sauf lourd. Ce n'est pas un uni-tasker! L'apprentissage de cette méthode a de nombreuses utilisations au-delà du retrait.
sqqqrly
Je la trouve meilleure que la réponse acceptée, car je peux voir ce qui se passe, les lignes que je sélectionne et l'action que je fais, et pas seulement taper une sorte d'incantation de vim.
user4052054
3
...quoi? «indentation de 4 espaces»? Non, cela passe à la ligne 4, puis indente tout à partir de là jusqu'à la fin du fichier, en utilisant le mode de retrait actuellement sélectionné (le cas échéant).
underscore_d
18

La beauté de l'interface utilisateur de Vim réside dans sa cohérence. Les commandes d'édition sont composées de la commande et d'un déplacement du curseur. Les déplacements du curseur sont toujours les mêmes:

  • Hen haut de l'écran, Len bas, Mau milieu
  • nG pour aller à la ligne n , Gseul en bas du fichier, ggen haut
  • npour passer à la recherche suivante, Nà la précédente
  • } à la fin du paragraphe
  • % à la parenthèse correspondante suivante, soit entre parenthèses, soit le type de balise
  • enter à la ligne suivante
  • 'xpour marquer xx est une lettre ou une autre '.
  • beaucoup plus, y compris wet Wpour le mot, $ou 0aux bouts de la ligne, etc., qui ne s'appliquent pas ici car ce ne sont pas des mouvements de ligne .

Donc, pour utiliser vim, vous devez apprendre à déplacer le curseur et à vous souvenir d'un répertoire de commandes comme, par exemple, >mettre en retrait (et< "sortir").

Ainsi, pour mettre en retrait les lignes de la position du curseur vers le haut de l'écran que vous faites >H, >Gpour mettre en retrait vers le bas du fichier.

Si, au lieu de taper >H, vous tapez, dHvous supprimez le même bloc de lignes, cHpour le remplacer, etc.

Certains mouvements de curseur correspondent mieux à des commandes spécifiques. En particulier, la %commande est pratique pour indenter un bloc HTML ou XML entier. Si le fichier a la syntaxe en surbrillance ( :syn on), placer le curseur dans le texte d'une balise (comme, dans le "i" de <div> et saisir>% va mettre en retrait jusqu'à la balise de fermeture </div>.

Voici comment fonctionne Vim: il suffit de se souvenir uniquement des mouvements du curseur et des commandes, et comment les mélanger. Donc, ma réponse à cette question serait "aller à une extrémité du bloc de lignes que vous souhaitez mettre en retrait, puis tapez la >commande et un mouvement à l'autre extrémité du bloc" si le retrait est interprété comme décalant les lignes, =si le retrait est interprété comme en jolie impression.

Juan Lanus
la source
2
Je dirais que vi / vim est la plupart du temps cohérent. Par exemple, D ne se comporte pas de la même manière que S et Y! :)
aqn
14

Faites ceci:

$vi .vimrc

Et ajoutez cette ligne:

autocmd FileType cpp setlocal expandtab shiftwidth=4 softtabstop=4 cindent

C'est uniquement pour un fichier cpp. Vous pouvez le faire pour un autre type de fichier, également en modifiant simplement le type de fichier ...

pankaj ukumar
la source
13

Vous pouvez utiliser la norm icommande pour insérer un texte donné au début de la ligne. Pour insérer 10 espaces avant les lignes 2-10:

:2,10norm 10i 

N'oubliez pas qu'il doit y avoir un caractère espace à la fin de la commande - ce sera le caractère que nous voulons insérer. Nous pouvons également mettre en retrait une ligne avec n'importe quel autre texte, par exemple pour mettre en retrait chaque ligne d'un fichier avec cinq caractères de soulignement:

:%norm 5i_

Ou quelque chose d'encore plus sophistiqué:

:%norm 2i[ ]

Un exemple plus pratique consiste à commenter le code Bash / Python / etc avec le caractère #:

:1,20norm i#

Pour ré-indenter l'utilisation xau lieu de i. Par exemple, pour supprimer les 5 premiers caractères de chaque ligne:

:%norm 5x
Nykakin
la source
1
cela commence du côté gauche du fichier ... pas la position actuelle du bloc
Eliethesaiyan
12

Un moyen rapide de le faire en utilisant VISUAL MODE le même processus que de commenter un bloc de code.

Ceci est utile si vous préférez ne pas modifier votre shiftwidthou utiliser des setdirectives et est suffisamment flexible pour fonctionner avec TABS ou SPACES ou tout autre caractère.

  1. Positionner le curseur au début sur le bloc
  2. v pour basculer vers -- VISUAL MODE --
  3. Sélectionnez le texte à mettre en retrait
  4. Tapez :pour passer à l'invite
  5. Remplacement par 3 espaces de tête:

    :'<,'>s/^/ /g

  6. Ou en remplaçant par des onglets de tête:

    :'<,'>s/^/\t/g

  7. Brève explication:

    '<,'> - Dans la plage sélectionnée visuellement

    s/^/ /g - Insérez 3 espaces au début de chaque ligne dans toute la plage

    (ou)

    s/^/\t/g- Insérer Tabau début de chaque ligne dans toute la gamme

Eric Kigathi
la source
12

>} ou >{ retrait de la ligne actuelle jusqu'au paragraphe suivant

<}ou <{même retrait

jash
la source
11

J'aime marquer le texte pour l'indentation:

  1. aller au début de la ligne de texte puis taper ma( ac'est l'étiquette du 'm'ark: ça peut être n'importe quelle lettre)
  2. aller à la fin de la ligne de texte et taper mz(encore une fois, zpeut être n'importe quelle lettre)
  3. :'a,'z>ou :'a,'z<sera en retrait ou en retrait (est-ce un mot?)
  4. Voila! Le texte est déplacé (les lignes vides restent vides sans espaces)

PS: vous pouvez utiliser la :'a,'ztechnique pour marquer une plage pour toute opération (d, y, s ///, etc.) où vous pourriez utiliser des lignes, des nombres ou %.

SteveO
la source
10

:help left

Dans ex modevous pouvez utiliser :leftou :lepour aligner les lignes d'un montant spécifié. Plus précisément, :leftseront les lignes aligner à gauche dans la [gamme]. Il définit le retrait dans les lignes sur [retrait] (par défaut 0).

:%le3ou :%le 3 ou :%left3ou :%left 3alignera le fichier entier en remplissant trois espaces.

:5,7 le 3 alignera les lignes 5 à 7 en les remplissant de trois espaces.

:lesans aucune valeur ou :le 0s'alignera à gauche avec un remplissage de 0.

Cela fonctionne dans Vim et gVim.

zundarz
la source
1
Génial, juste ce que je cherchais (un moyen d'insérer un nombre spécifique d'espaces - 4 espaces pour le code de démarque - pour remplacer mon retrait normal). Dans mon cas, je voulais indenter un nombre spécifique de lignes en mode visuel, donc shift-v pour mettre en évidence les lignes, puis :'<,'>le4insérer les espaces. Merci!
Subfuzion
9

Pour moi, la solution MacVim (Visual) était, sélectionnez avec la souris et appuyez sur ">", mais après avoir mis les lignes suivantes dans "~ / .vimrc" car j'aime les espaces au lieu des tabulations:

set expandtab
set tabstop=2
set shiftwidth=2

Il est également utile de pouvoir appeler MacVim à partir de la ligne de commande (Terminal.app), donc puisque j'ai le répertoire d'assistance suivant "~ / bin", où je place un script appelé "macvim":

#!/usr/bin/env bash
/usr/bin/open -a /Applications/MacPorts/MacVim.app $@

Et bien sûr dans "~ / .bashrc":

export PATH=$PATH:$HOME/bin

MacPorts salit beaucoup "~ / .profile", donc la variable d'environnement PATH peut devenir assez longue.

mda
la source
9

5== indentera cinq lignes à partir de la position actuelle du curseur.

Vous pouvez donc taper n'importe quel nombre avant ==. Il mettra en retrait le nombre de lignes. C'est en mode commande.

gg=G indentera l'intégralité du fichier de haut en bas.

rohitkadam19
la source
9

Je n'ai pas trouvé de méthode que j'utilise dans les commentaires, donc je vais la partager (je pense que Vim uniquement):

  1. Esc pour entrer en mode commande
  2. Accéder au premier caractère de la dernière ligne à mettre en retrait
  3. Ctrl+ Vpour démarrer la sélection de bloc
  4. Accéder au premier caractère de la première ligne à mettre en retrait
  5. Shift+ Ipour entrer en mode d'insertion spécial
  6. Tapez autant d'espaces / tabulations que vous devez mettre en retrait (deux par exemple
  7. La presse Escet les espaces apparaîtront sur toutes les lignes

Ceci est utile lorsque vous ne souhaitez pas modifier les paramètres d'indentation / tabulation vimrcou les mémoriser pour les modifier lors de la modification.

Pour annuler l'indentation, j'utilise le même bloc Ctrl+ Vsélection pour sélectionner des espaces et le supprimer avec D.

NickSoft
la source
9

Je ne sais pas pourquoi il est si difficile de trouver une réponse simple comme celle-ci ...

J'ai moi-même dû beaucoup lutter pour le savoir. C'est très simple:

  • Modifiez votre .vimrcfichier sous le répertoire personnel.
  • Ajoutez cette ligne

    set cindent
    

    dans votre fichier où vous souhaitez mettre en retrait correctement.

  • En mode normal / commande

    10==   (This will indent 10 lines from the current cursor location)
    gg=G   (Complete file will be properly indented)
    
Kamlesh Karwande
la source
8
:line_num_start,line_num_end>

Par exemple,

14,21> shifts line number 14 to 21 to one tab

Augmentez le symbole «>» pour plus d'onglets.

Par exemple,

14,21>>> for three tabs
attaboyabhipro
la source
1
Il existe clairement de nombreuses façons de résoudre ce problème, mais c'est la plus simple à mettre en œuvre, car les numéros de ligne s'affichent par défaut dans vim et ne nécessitent pas de calculs.
HoldOffHunger
Les numéros de ligne @HoldOffHunger ne s'affichent pas par défaut. Vous devez utiliser :set numberpour basculer les numéros de ligne (ils sont désactivés par défaut) ou mettre set numbervotre vimrc.
DryLabRebel
7

En utilisant beaucoup Python, je me retrouve à avoir fréquemment besoin de décaler des blocs de plusieurs indentations. Vous pouvez le faire en utilisant l'une des méthodes de sélection de bloc, puis entrez simplement le nombre de retraits que vous souhaitez sauter juste avant le>

Par exemple, V5j3>indentera cinq lignes trois fois - ce qui correspond à 12 espaces si vous utilisez quatre espaces pour les retraits.

John La Rooy
la source
7

Pour mettre en retrait chaque ligne d'un type de fichier, Escpuis G=gg.

kapil
la source
6

Comment mettre en retrait le code surligné dans vi immédiatement par un certain nombre d'espaces:

Option 1: indenter un bloc de code dans vi à trois espaces avec le mode Visual Block:

  1. Sélectionnez le bloc de code que vous souhaitez mettre en retrait. Pour ce faire, utilisez Ctrl+Ven mode normal et flèches vers le bas pour sélectionner le texte. Pendant qu'il est sélectionné, entrez :pour donner une commande au bloc de texte sélectionné.

  2. Les éléments suivants apparaîtront sur la ligne de commande: :'<,'>

  3. Pour définir un retrait de trois espaces, tapez le 3et appuyez sur Entrée. Voici ce qui apparaît::'<,'>le 3

  4. Le texte sélectionné est immédiatement mis en retrait sur trois espaces.

Option 2: indenter un bloc de code dans vi à trois espaces avec le mode Visual Line:

  1. Ouvrez votre fichier dans vi.
  2. Placez votre curseur sur du code
  3. Soyez en mode normal et appuyez sur les touches suivantes:

    Vjjjj:le 3
    

    Interprétation de ce que vous avez fait:

    V signifie commencer à sélectionner du texte.

    jjjj flèches vers le bas de quatre lignes, mettant en évidence quatre lignes.

    : indique à vi que vous saisirez une instruction pour le texte en surbrillance.

    le 3 signifie mettre en retrait le texte en surbrillance de trois lignes.

    Le code sélectionné est immédiatement augmenté ou diminué à une indentation de trois espaces.

Option 3: utilisez le mode Visual Block et le mode d'insertion spécial pour augmenter le retrait:

  1. Ouvrez votre fichier dans vi.
  2. Placez votre curseur sur du code
  3. En mode normal, appuyez sur les touches suivantes:

    Ctrl+V

    jjjj
    

    (appuyez cinq fois sur la barre d'espace)

    Esc Shift+i

    Tout le texte en surbrillance est en retrait de cinq espaces supplémentaires.

Eric Leschinski
la source
6

J'utilise la sélection visuelle en mode bloc:

  • Allez à l'avant du bloc pour vous déplacer (en haut ou en bas).
  • Appuyez sur Ctrl+ Vpour passer en mode de blocage visuel.
  • Naviguez pour sélectionner une colonne devant les lignes.
  • Appuyez sur I( Shift+ I) pour entrer en mode d'insertion.
  • Tapez quelques espaces.
  • Appuyez sur Esc. Toutes les lignes changeront.

Ce n'est pas un uni-tasker. Ça marche:

  • Au milieu des lignes.
  • Pour insérer une chaîne sur toutes les lignes.
  • Pour changer une colonne (utilisez cau lieu de I).
  • tirer, supprimer, remplacer, etc ...
sqqqrly
la source
C'est lourd, mais c'est la voie à suivre si vous effectuez un formatage en dehors du noyau VIM (par exemple, en utilisant vim-prettierau lieu du moteur d'indentation par défaut). >Sinon, l' utilisation augmentera royalement le formatage effectué par Prettier.
oligofren
C'est drôle, je trouve ça tout sauf lourd. Ce n'est pas un uni-tasker! L'apprentissage de cette méthode a de nombreuses utilisations au-delà du retrait.
sqqqrly
Je la trouve meilleure que la réponse acceptée, car je peux voir ce qui se passe, les lignes que je sélectionne et l'action que je fais, et pas seulement taper une sorte d'incantation de vim.
user4052054
5
  • Pour un bloc de code, {}: =+%

  • Pour une ligne sélectionnée: Shift+ vsélectionnez à l'aide des touches fléchées haut / bas, puis appuyez sur =.

  • Pour l'ensemble du fichier: gg+ =+G

Remarque: «gg» signifie aller à la ligne 1, «=» est la commande de retrait et «G» déplace le curseur à la fin du fichier .

Kulamani
la source
4

Pour mettre en retrait tout le fichier par quatre:

esc 4G=G
Michael
la source
3
...quoi? «indentation de 4 espaces»? Non, cela passe à la ligne 4, puis indente tout à partir de là jusqu'à la fin du fichier, en utilisant le mode de retrait actuellement sélectionné (le cas échéant).
underscore_d