Indenter plusieurs lignes rapidement en vi

devrait être trivial, et il pourrait même être dans l'aide, mais je ne peux pas comprendre comment le naviguer. Comment puis-je indenter plusieurs lignes rapidement en vi?

1994
demandé sur ProgramFOX 2008-10-25 07:27:28

29 réponses

utilisez la commande > . À l'alinéa 5 lignes, 5 > > . Pour marquer un bloc de lignes et l'indenter, V j j > à la troisième ligne du tiret (vim seulement). Pour indenter un bloc curly-braces, mettez votre curseur sur l'un des accolades et utilisez > % .

si vous copiez des blocs de texte autour de vous et que vous avez besoin d'aligner le tiret d'un bloc dans sa nouvelle position, utilisez ] p au lieu de juste p . Le bloc collé est aligné sur le texte environnant.

de plus, le réglage shiftwidth vous permet de contrôler le nombre d'espaces à indenter.

2353
répondu Greg Hewgill 2015-07-27 19:12:54

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 la vim wiki . Par souci de concision, cette réponse ne fait pas de distinction entre les commandes Vi et Vim spécifiques.

dans les commandes ci-dessous," re-indentation "signifie "lignes d'indentation selon votre paramètres d'indentation ." shiftwidth est la variable primaire 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 =iB est une commande valide d'indentation de bloc. Jetez un oeil à "Retrait d'un Bloc de Code" pour un bon exemple pour essayer ces commandes.

aussi, rappelez - vous que

.    Repeat last command

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

Re-mise en retrait des dossiers complets

une autre situation courante est celle où l'indentation doit être corrigée dans l'ensemble d'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

In Mode Visuel

Vjj> Visually mark and then indent 3 lines

dans le mode

ces commandes s'appliquent à la ligne courante:

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

les commandes Ex

ceux-ci sont utiles lorsque vous voulez indenter une gamme 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

mise en Retrait à l'aide de marqueurs

une autre approche est par marqueurs :

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

...déplacer le curseur à l'endroit de fin

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

Variables qui régissent l'indentation

vous pouvez les mettre dans votre .fichiers 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

898
répondu ire_and_curses 2013-11-21 20:47:16

une grande sélection serait:

gg=G

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

117
répondu Johan 2018-08-21 05:58:24

essayez aussi ceci pour c-indenting indentation, do :help = pour plus d'information:

={

qui va auto-indenter le bloc de code actuel dans lequel vous êtes.

ou juste:

==

pour auto-indenter la ligne courante.

105
répondu svec 2013-09-21 01:49:11

Clé-Presses pour plus de visuels de personnes:

  1. Entrer En Mode Commande:

    Escape

  2. déplacer au début de la zone à l'indentation:

    h j k l

  3. Démarrer un bloc:

    v

  4. se déplacer vers l'extrémité de la zone à l'indentation:

    h j k l

  5. (optionnel) tapez le nombre de niveaux d'indentation que vous voulez

    0..9

  6. exécuter l'indentation sur le bloc:

    >

73
répondu Kent Fredric 2012-07-06 03:56:48

en plus de la réponse déjà donnée et acceptée, il est également possible de placer un marqueur et ensuite tout indenter du curseur Courant au marqueur. Ainsi, entrez ma où vous voulez que le haut de votre bloc dentelé, curseur vers le bas autant que vous avez besoin et puis tapez >'a (notez que a " peut être substitué à n'importe quel nom de marqueur valide). C'est parfois plus facile que 5>> ou vjjj> .

62
répondu Daniel Spiewak 2008-10-25 04:00:31

le maître de tous les ordres est

gg=G

ceci indente le dossier entier!

et ci-dessous sont quelques-unes des commandes simples et élégantes utilisées pour indenter les lignes rapidement dans Vim ou gVim.

pour indenter la ligne courante

==

pour indenter toutes les lignes au-dessous de la ligne courante

=G

au tiret n lignes au-dessous de la ligne courante

n==

par exemple, à l'alinéa 4 lignes au-dessous de la ligne courante

4==

pour indenter un bloc de code, allez à l'une des bretelles et utilisez la commande

=%

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

61
répondu Sagar Jain 2017-01-26 22:00:58

Aller au début du texte

  • appuyez sur v pour le mode visuel.
  • utilisez haut / bas flèche pour mettre le texte en surbrillance.
  • appuyez sur = pour indenter toutes les lignes que vous avez surlignées.
29
répondu Michael Durrant 2013-12-23 08:51:08

ainsi que les solutions proposées, j'aime faire les choses un paragraphe à la fois avec >}

27
répondu Paul Tomblin 2008-10-25 04:08:38

lorsque vous sélectionnez un bloc et utilisez > pour indenter, il indents puis retourne en mode normal. J'ai ceci dans mon .fichiers vimrc:

vnoremap < <gv

vnoremap > >gv

Il vous permet d'indenter votre sélection autant de fois que vous le souhaitez.

25
répondu Michael Ekoka 2018-08-21 05:59:02

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

:set shiftwidth=2
  • Type v (pour entrer bloc visuelle mode d'édition)
  • déplacez le curseur avec les touches fléchées (ou avec h / j / k / l ) pour mettre en évidence les lignes que vous voulez indenter ou unindent.

puis:

  • Type > à indenter une fois (2 espaces).
  • Type
  • 2 > à indenter deux fois (4 espaces).
  • Type
  • 3 > à indenter trois fois (6 espaces).
  • ...
  • Type < unindent once (2 espaces).
  • Type 2 < annuler la mise en retrait à deux reprises (4 espaces).
  • Type
  • 3 < pour délier trois fois (6 espaces).
  • ...

vous avez l'idée.

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


j'ai trouvé la réponse dans la documentation (g)vim pour blocs d'indentation:

:help visual-block
/indent

si vous voulez donner un compte à la commande, faites-le juste avant de taper le caractère de l'opérateur: "v{move-around}3>" (déplacer la ligne 3 en retrait vers droit.)

21
répondu John Sonderson 2015-01-31 19:17:54

la beauté de L'interface utilisateur de vim est qu'elle est cohérente. Les commandes d'édition sont composées de la commande et d'un déplacement du curseur. Les mouvements du curseur sont toujours les mêmes:

  • H pour le haut de l'écran, L en bas, M moyen
  • n G pour aller à la ligne n, G seul au fond de fichier, g g vers le haut
  • n pour passer à la prochaine recherche de match, N précédent
  • } à la fin du paragraphe
  • % au prochain crochet correspondant, soit des parenthèses soit du type de l'étiquette
  • inscrivez à la ligne suivante
  • ' x à la marque x où x est une lettre ou une autre "
  • beaucoup plus, y compris w et W pour le mot, $ ou 0 aux extrémités de la ligne, etc, qui ne s'appliquent pas ici parce que ne sont pas ligne mouvements.

ainsi, pour utiliser vim vous devez apprendre à déplacer le curseur et se souvenir d'un répertoire de commandes comme, pour exemple, > tiret (et < à "hausser").

Ainsi, pour l'indentation des lignes à partir de la position du curseur en haut de l'écran, vous ne > H , > G tiret à la fin du fichier.

si, au lieu de taper > H , tapez d H alors vous supprimez le même bloc de lignes, c h pour le remplacer, etc.

certains mouvements du curseur conviennent mieux aux commandes spécifiques. En particulier, la commande % est pratique pour indenter tout un bloc HTML ou XML.

Si le fichier a la syntaxe surlignée ( :syn on ), puis la mise en place du curseur dans le texte d'une balise (comme, dans le "i" de < div> et entrée > % indentira jusqu'à la balise de fermeture

.

c'est ainsi que vim fonctionne: il faut se souvenir seulement 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 voulez indenter, puis tapez le > commande et un mouvement à l'autre extrémité du bloc " si le tiret est interprété comme un déplacement des lignes, = si le tiret est interprété comme une jolie impression.

18
répondu Juan Lanus 2013-01-02 18:04:26

faire

$vi .vimrc

et ajouter cette ligne

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

c'est seulement pour le fichier cpp que vous pouvez faire cela pour un autre type de fichier en modifiant simplement le type de fichier...

14
répondu pankaj ukumar 2011-12-25 18:00:52

une façon rapide de faire cela en utilisant VISUAL MODE utilise le même processus que de commenter un bloc de code.

ceci est utile si vous préférez ne pas changer votre shiftwidth ou utiliser des directives set et est assez flexible pour travailler avec des onglets ou des espaces ou tout autre caractère.

  1. placer le curseur au début sur le bloc
  2. V pour passer à -- VISUAL MODE --
  3. Sélectionnez le texte à indenter
  4. Type : pour passer au prompt
  5. remplaçant par 3 espaces avant:

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

  6. ou remplacement par des onglets principaux:

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

  7. Brève Explication:

    '<,'> - Sélection De La Gamme

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

    (ou)

    s/^/\t/g - insérer Tab au début de chaque ligne dans toute la gamme

  8. "
12
répondu Eric Kigathi 2012-01-04 00:41:53

je tiens à marquer le texte pour l'indentation:

  1. aller au début de la ligne de texte, puis tapez ma (a est l'étiquette du 'm'Ark: il pourrait s'agir de n'importe quelle lettre)
  2. passez à la ligne de fin du texte et tapez mz (là encore z peut être n'importe quelle lettre)
  3. :','z> ou :'a,'z< tiret ou hausser (est-ce un mot?)
  4. voilà! le texte est déplacé (les lignes vides restent vides sans espaces)

PS: Vous pouvez utiliser: 'A,' Z technique pour marquer une gamme pour n'importe quelle opération (d,y,s///, etc) où vous pourriez utiliser des lignes, des nombres, ou %

11
répondu SteveO 2010-11-10 19:16:06

>} ou >{ retrait de la ligne courante jusqu'à la prochaine paragraphe

<} ou <{ même Numéro ONU

11
répondu jash 2012-02-17 18:39:22

il y a une autre façon qui n'a pas encore été mentionnée - vous pouvez utiliser la commande norm i pour insérer un texte donné au début de la ligne. Insérer 10 espaces avant les lignes 2 à 10:

:2,10norm 10i 

rappelez - vous qu'il doit y avoir un caractère spatial à la fin de la commande-ce sera le caractère que nous voulons avoir inséré. Nous pouvons aussi indenter la ligne avec n'importe quel autre texte, par exemple pour indenter chaque ligne dans le dossier avec 5 caractères de soulignement:

:%norm 5i_

Ou quelque chose d'encore plus de fantaisie:

:%norm 2i[ ]

un exemple plus pratique est de commenter le code Bash/Python/etc avec # character:

:1,20norm i#

Pour re-tiret utiliser x au lieu de je . Par exemple pour supprimer les 5 premiers caractères de chaque ligne:

:%norm 5x
11
répondu Nykakin 2015-08-21 13:33:52

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

set expandtab
set tabstop=2
set shiftwidth=2

il est également utile de pouvoir appeler MacVim depuis la ligne de commande (Terminal.depuis que j'ai le répertoire d'aide 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 mess with"~/.profile " beaucoup, donc la variable D'environnement PATH peut être assez longue.

9
répondu mda 2012-06-04 05:12:04

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

  1. Esc pour entrer en mode commande
  2. déplacer au premier caractère de la dernière ligne que vous voulez identifier
  3. ctrl - v pour démarrer le bloc sélectionner
  4. déplacer au premier caractère de la première ligne que vous voulez identifier
  5. shift - je pour entrer dans le spécial mode insertion
  6. tapez autant de spases/onglets que vous devez indenter à (2 par exemple
  7. appuyez sur Esc et des espaces apparaissent dans toutes les lignes

c'est utile lorsque vous ne voulez pas changer les paramètres ident/tab dans vimrc ou de se rappeler de les changer pendant l'édition.

À unindent-je utiliser le même bloc ctrl - v sélectionnez pour sélectionner les espaces et supprimez-le avec d .

9
répondu NickSoft 2013-11-05 22:14:26

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

j'ai moi-même dû lutter beaucoup pour savoir cela son son très simple

éditez votre fichier .vimrc sous home directory ajouter la ligne

set cindent

dans votre fichier où vous voulez inscrire correctement

normal/mode de commande de type

10==   (this will indent 10 lines from the current cursor location )
gg=G   (complete file will be properly indented)
9
répondu Kamlesh Karwande 2014-02-06 04:23:25

5== inclura 5 lignes à partir de la position actuelle du curseur. ainsi, vous pouvez taper n'importe quel nombre avant == , il tiret nombre de lignes. C'est en mode commande.

gg=G indente le fichier entier de haut en bas.

9
répondu rohitkadam19 2014-07-15 04:06:39

:help left

Dans ex mode vous pouvez utiliser :left ou :le pour aligner les lignes d'un montant spécifié. Plus précisément, :left va aligner les lignes à gauche dans la [gamme]. Il positionne le tiret dans les lignes à [indent] (par défaut 0).

:%le3 ou :%le 3 ou :%left3 ou :%left 3 va aligner l'ensemble du fichier par remplissage avec trois espaces.

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

:le sans aucune valeur ou :le 0 s'alignera à gauche avec un rembourrage de 0.

cela fonctionne dans vim et gvim .

9
répondu zundarz 2015-09-10 18:48:23

en utilisant beaucoup Python, j'ai souvent besoin de changer de blocs de plus d'un tiret. Vous pouvez faire cela en utilisant n'importe laquelle des méthodes de sélection de bloc, et puis juste entrer le nombre d'indents que vous souhaitez sauter juste avant le >

par exemple. V5j3> sera indenté 5 lignes 3 fois-qui est de 12 espaces si vous utilisez 4 espaces pour les tirets

7
répondu John La Rooy 2013-07-02 07:24:33
:line_num_start,line_num_end>

p.ex.

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

Augmenter le '>' symbole pour plus d'onglets

p.ex.

14,21>>> for 3 tabs
7
répondu Abhishesh Sharma 2014-07-15 09:22:47

pour indenter chaque ligne d'un type de fichier, esc puis G=gg

7
répondu kapil 2016-10-04 12:37:01

comment indenter le code en surbrillance dans vi immédiatement par un nombre d'espaces:

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

  1. sélectionnez le bloc de code que vous souhaitez indenter. Faites ceci en utilisant Ctrl+V en mode normal et en descendant pour sélectionner le texte. Lorsqu'il est sélectionné, entrez : donner une commande pour le bloc de le texte sélectionné.

  2. le texte suivant apparaîtra dans la ligne de commande: :'<,'>

  3. pour régler le tiret à 3 espaces, tapez le 3 et appuyez sur Entrée. C'est ce qui apparaît: :'<,'>le 3

  4. le texte choisi est immédiatement indenté à 3 espaces.

Option 2: Retrait d'un bloc de code dans vi à trois espaces avec le mode de ligne visuelle:

  1. ouvrir votre fichier in VI.
  2. Placez votre curseur sur un code quelconque
  3. être en mode normal appuyez sur les touches suivantes:

    Vjjjj:le 3
    

    interprétation de ce que vous avez fait:

    V signifie commencer à sélectionner le texte.

    jjjj flèches 4 lignes en bas, 4 lignes en surbrillance.

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

    le 3 signifie tiret surligné de texte 3 lignes.

    le code sélectionné est immédiatement augmenté ou diminué à trois espaces d'indentation.

Option 3: Utiliser le mode bloc visuel et le mode insertion spéciale pour augmenter l'indentation:

  1. ouvrir votre fichier in VI.
  2. Placez votre curseur sur un code quelconque
  3. être en mode normal appuyez sur les touches suivantes:

    Ctrl+V

    jjjj
    

    (appuyez sur la barre d'espacement 5 fois)

    Esc Shift+i

    tous les le texte en surbrillance est indenté de 5 espaces supplémentaires.

6
répondu Eric Leschinski 2013-12-23 03:43:53

Pour le retrait de tous les fichiers par 4:

esc 4G=G
4
répondu Michael 2014-12-19 21:07:35

I use block-mode sélection visuelle:

  • Aller à l'avant du bloc à déplacer (en haut ou en bas).
  • appuyez sur ctrl-v pour passer en mode bloc visuel.
  • sélectionnez une colonne devant les lignes.
  • appuyer sur I (majuscule i) pour entrer en mode insertion.
  • Tapez quelques espaces.
  • Appuyez sur la touche ECHAP. Toutes les lignes vont changer.

ce n'est pas un uni-tasker. Il fonctionne:

  • au milieu des lignes.
  • pour insérer n'importe quelle chaîne sur toutes les lignes.
  • pour changer une colonne (utilisez c au lieu de I).
  • copier, supprimer, remplacer, etc...
3
répondu sqqqrly 2018-06-15 16:32:59

Suppose | représente la position du curseur dans Vim. Si le texte à découper est inclus dans un bloc de code tel que:

int main() {
line1
line2|
line3
}

vous pouvez faire >i{ qui signifie indent ( > ) à l'intérieur ( i ) bloc ( { ) "et obtenir:

int main() {
    line1
    line2|
    line3
}

supposons maintenant que les lignes sont contiguës mais à l'extérieur d'un bloc, comme:

do
line2|
line3
line4
done

à l'alinéa lignes 2 à 4 Vous pouvez sélectionner visuellement les lignes et taper > . Ou encore plus rapide, vous pouvez faire >2j pour obtenir:

do
    line2|
    line3
    line4
done

noter que >Nj signifie le tiret de la ligne courante aux lignes N ci-dessous. Si le nombre de lignes à découper est important, l'utilisateur peut mettre quelques secondes à compter la valeur correcte de N . Pour sauver des secondes précieuses vous pouvez activer l'option de nombre relatif avec set relativenumber (disponible depuis la version 7.3 de Vim).

0
répondu Sergio 2018-04-25 07:14:41