web-dev-qa-db-fra.com

Indenter plusieurs lignes rapidement dans vi

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

2086
Allain Lalonde

Utilisez le > commander. Pour mettre en retrait 5 lignes, 5>>. Pour marquer un bloc de lignes et le mettre en retrait, Vjj> indenter 3 lignes (vim uniquement). Pour mettre en retrait un bloc d’accolades, placez votre curseur sur l’une des accolades et utilisez >% ou de n'importe où dans l'utilisation de bloc >iB.

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

De plus, le paramètre shiftwidth vous permet de contrôler le nombre d'espaces à mettre en retrait.

2463
Greg Hewgill

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

Dans les commandes ci-dessous, "ré-indenter" signifie "lignes d'indentation selon votre paramètres d'indentation ". shiftwidth est 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. =iB est une commande de retrait de bloc valide. Jetez un oeil sur "Indentation d'un bloc de code" pour un exemple intéressant sur lequel essayer ces commandes.

Aussi, rappelez-vous que

.    Repeat last command

, les commandes d’indentation peuvent donc être répétées facilement et commodément.

Réindenter des fichiers complets

Une autre situation courante consiste à exiger que l'indentation soit corrigée dans tout le 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 3 lines

En mode insertion

Ces commandes s'appliquent à la ligne en cours:

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

Celles-ci sont utiles lorsque vous souhaitez indenter une plage de lignes spécifique 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 via marqueurs :

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

... déplace le curseur vers la fin

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

Variables qui régissent 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 empreinte intelligente basée sur le type de fichier. Essayez d'ajouter ceci à votre fichier .vimrc:

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

Références

929
ire_and_curses

Un grand choix serait:

gg=G

C'est très rapide et tout est mis en retrait ;-)

121
Johan

Essayez aussi ceci pour indentation C indentation, 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 en cours.

107
svec

Presses à clé pour plus de visuels:

  1. Entrer en mode de commande:
    Escape

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

  3. Commencer un bloc:
    v

  4. Déplacez-vous à la fin de la zone pour indenter:
    hjkl

  5. (Facultatif) Saisissez le nombre de niveaux d'indentation souhaité.
    0..9

  6. Exécutez l'indentation sur le bloc:
    >

78
Kent Fredric

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 ma où vous voulez le haut de votre bloc indenté, faites glisser le curseur autant que vous le souhaitez, puis tapez >'a (notez que "a" peut remplacer tout marqueur valide Nom). C'est parfois plus facile que 5>> ou vjjj>.

65
Daniel Spiewak

Le maître de toutes les commandes est
gg=G

Cela met en retrait le fichier entier!

Vous trouverez ci-dessous quelques-unes des commandes simples et élégantes utilisées pour mettre rapidement en retrait des lignes dans Vim ou gVim.

Pour indenter la ligne courante
==

Pour indenter toutes les lignes en dessous de la ligne en cours

=G

Pour mettre en retrait n lignes en dessous de la ligne en cours

n==

Par exemple, pour mettre en retrait 4 lignes en dessous de 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 les plus puissantes pour indenter plusieurs lignes.

63
Sagar Jain

Aller au début du texte

  • presse v pour le mode visuel.
  • utilisation up/down flèche pour mettre en évidence le texte.
  • presse = pour mettre en retrait toutes les lignes que vous avez surlignées.
29
Michael Durrant

En plus des solutions proposées, j'aime bien faire les choses paragraphe par paragraphe avec >}

27
Paul Tomblin

Lorsque vous sélectionnez un bloc et utilisez > pour mettre en retrait, il met en retrait puis revient en mode normal. J'ai ceci dans mon fichier .vimrc:

vnoremap < <gv

vnoremap > >gv

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

26
Michael Ekoka

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

:set shiftwidth=2
  • Type 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 évidence les lignes que vous souhaitez mettre en retrait ou non.

Ensuite:

  • Type > mettre en retrait une fois (2 espaces).
  • Type 2> indenter deux fois (4 espaces).
  • Type 3> indenter trois fois (6 espaces).
  • ...
  • Type < désindenter une fois (2 espaces).
  • Type 2< désindent deux fois (4 espaces).
  • Type 3< désindentir trois fois (6 espaces).
  • ...

Vous avez eu l'idée.

(Les lignes vides ne seront pas indentées, ce qui, à mon avis, est plutôt gentil.)


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

:help visual-block
/indent

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

21
John Sonderson

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 vers le haut de l'écran, L au fond, M au milieu
  • nG aller à la ligne n, G seul au bas du fichier, gg en haut
  • n passer à la recherche suivante, N au précédent
  • } à la fin du paragraphe
  • % au prochain support correspondant, entre parenthèses ou type de balise
  • enter à la ligne suivante
  • 'x marquer x où x est une lettre ou une autre '
  • beaucoup plus, y compris w et W pour Word, $ ou  aux bouts de la ligne, etc., qui ne s'appliquent pas ici car ne sont pas ligne mouvements.

Donc, pour utiliser vim, vous devez apprendre à déplacer le curseur et à vous rappeler un répertoire de commandes comme, par exemple, > mettre en retrait (et < "se faire").
Ainsi, pour marquer les lignes entre la position du curseur et le haut de l'écran, vous faites >H>G indenter au bas du fichier.

Si, au lieu de taper >H, vous tapez dH alors vous supprimez le même bloc de lignes, cH pour le remplacer, etc.

Certains mouvements du curseur s’adaptent mieux à des commandes spécifiques. En particulier, le % Cette commande est pratique pour mettre en retrait tout un bloc HTML ou XML.
Si la syntaxe du fichier est surlignée (:syn on), placez le curseur dans le texte d'une balise (comme dans le "i" de <div> et entrez >% indentera jusqu’à la balise de fermeture </ div>.

Voici comment fonctionne vim: il ne faut retenir que les mouvements du curseur et les commandes, et comment les mélanger.
Donc, ma réponse à cette question serait "allez à une extrémité du bloc de lignes que vous voulez mettre en retrait, puis tapez le > commande et un mouvement à l’autre extrémité du bloc "if indent est interprété comme un décalage des lignes, = if indent est interprété comme en jolie impression.

18
Juan Lanus

fais ça

$vi .vimrc

et ajouter cette ligne

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

ceci est seulement pour le fichier cpp vous pouvez le faire pour un autre type de fichier aussi simplement en modifiant le type de fichier ...

14
pankaj ukumar

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

Ceci est utile si vous préférez ne pas changer votre shiftwidth ou utiliser aucune directive set et être suffisamment souple pour fonctionner avec TABS, SPACES ou tout autre caractère.

  1. Placez le curseur au début du bloc
  2. v pour passer à -- VISUAL MODE --
  3. Sélectionnez le texte à mettre en retrait
  4. Tapez : pour passer à l'invite
  5. Remplacement par 3 espaces de début:

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

  6. Ou en remplaçant par des onglets principaux:

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

  7. Brève explication:

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

    s/^/ /g - Insère 3 espaces au début de chaque ligne de la plage

    (ou)

    s/^/\t/g - Insère Tab au début de chaque ligne de la plage entière

12
Eric Kigathi

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

<} ou <{ même indentation

11
jash

Il existe un moyen supplémentaire qui n’a pas encore été mentionné - vous pouvez utiliser la commande norm i 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 

Rappelez-vous qu'il doit y avoir un caractère d'espacement à la fin de la commande - ce sera le caractère que nous voulons insérer. Nous pouvons également mettre en retrait la ligne avec tout autre texte, par exemple pour mettre en retrait chaque ligne du fichier avec 5 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#

À ré-indent utiliser x au lieu de i. Par exemple, pour supprimer les 5 premiers caractères de chaque ligne:

:%norm 5x
11
Nykakin

J'aime marquer le texte pour l'indentation:

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

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

11
SteveO

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

  1. Esc entrer en mode commande
  2. Passer au premier caractère de la dernière ligne que vous souhaitez identifier
  3. ctrl-v pour commencer bloc sélectionner
  4. Passer au premier caractère de la première ligne que vous souhaitez identifier
  5. shift-i entrer en mode d'insertion spécial
  6. tapez autant de spases/onglets que vous devez mettre en retrait (2 par exemple
  7. presse Esc et des espaces apparaîtront dans toutes les lignes

Ceci est utile lorsque vous ne souhaitez pas modifier les paramètres ident/tab dans vimrc ni les mémoriser pour les modifier lors de la modification.

Pour désindenter j'utilise le même ctrl-v bloquer la sélection pour sélectionner des espaces et le supprimer avec d.

9
NickSoft

5== indentera 5 lignes à partir de la position actuelle du curseur. afin que vous puissiez taper n'importe quel nombre avant ==, le nombre de lignes sera indenté. Ceci est en mode commande.

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

9
rohitkadam19

Pour moi, la solution MacVim (Visual) consistait à sélectionner avec la souris et appuyer sur ">", mais après avoir placé 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). Ainsi, depuis le répertoire d'assistance suivant "~/bin", 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 dérange beaucoup avec "~/.profile", donc la variable d'environnement PATH peut être assez longue.

9
mda

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

J'ai moi-même dû lutter beaucoup pour savoir que c'est très simple

éditez votre fichier .vimrc sous le répertoire personnel ajoutez cette ligne

set cindent

dans votre fichier où vous souhaitez mettre en retrait correctement

en mode normal/type de commande

10==   (this will indent 10 lines from the current cursor location )
gg=G   (complete file will be properly indented)
9
Kamlesh Karwande

:help left

Dans ex mode, vous pouvez utiliser :left ou :le pour aligner des lignes d'un montant spécifié. Plus précisément, :left will Alignement à gauche des lignes dans la [plage]. Il définit l'indentation dans les lignes sur [indent] (0 par défaut).

:%le3 ou :%le 3 ou :%left3 ou :%left 3 alignera le fichier entier en complétant avec trois espaces.

:5,7 le 3 alignera les lignes 5 à 7 en les plaçant avec 3 espaces.

:le sans aucune valeur ni :le 0 s'alignera à gauche avec un remplissage de 0.

Cela fonctionne dans vim et gvim.

9
zundarz
: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 3 tabs
8
Abhishesh Sharma

Utilisant beaucoup Python, je dois souvent déplacer plusieurs blocs d'un retrait. 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 5 lignes 3 fois - soit 12 espaces si vous utilisez 4 espaces pour les retraits

7
John La Rooy

Pour mettre en retrait chaque ligne dans un type de fichier, esc alors G = gg

7
kapil

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

Option 1: indentez un bloc de code dans vi dans trois espaces en mode Visual Block:

  1. Sélectionnez le bloc de code que vous souhaitez mettre en retrait. Faire cela en utilisant Ctrl+V en mode normal et en descendant pour sélectionner du texte. Une fois sélectionné, entrez : pour donner une commande au bloc de texte sélectionné.

  2. Ce qui suit apparaîtra dans la ligne de commande: :'<,'>

  3. Pour définir l'indent sur 3 espaces, tapez le 3 et appuyez sur entrée. Voici ce qui apparaît: :'<,'>le 3

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

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

  1. Ouvrez votre fichier dans VI.
  2. Placez votre curseur sur du code
  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 du texte.

    jjjj flèches vers le bas de 4 lignes, soulignant 4 lignes.

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

    le 3 signifie que le texte en surbrillance surligné est de 3 lignes.

    Le code sélectionné est immédiatement augmenté ou réduit à trois espaces d'indentation.

Option 3: utilisez le mode bloc visuel et le mode insertion spécial pour augmenter le retrait:

  1. Ouvrez votre fichier dans VI.
  2. Placez votre curseur sur du code
  3. Être en mode normal appuyez sur les touches suivantes:

    Ctrl+V

    jjjj
    

    (appuyez sur la barre d'espace 5 fois)

    EscShift+i

    Tout le texte surligné est mis en retrait de 5 espaces supplémentaires.

6
Eric Leschinski

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-v pour passer en mode bloc visuel.
  • Naviguez pour sélectionner une colonne devant les lignes.
  • Appuyez sur I (shift i) pour passer en mode insertion.
  • Tapez des espaces.
  • Appuyez sur ESC. Toutes les lignes vont changer.

Ce n'est pas un tâche unique. Ça marche:

  • Au milieu des lignes.
  • Pour insérer une chaîne sur toutes les lignes.
  • Pour changer une colonne (utilisez c au lieu de I).
  • yank, supprimer, remplacer, etc ...
4
sqqqrly

Pour mettre en retrait tout le fichier par 4:

esc 4G=G
4
Michael
  • Pour le bloc de code {}: = + %

  • Pour la ligne sélectionnée: Shift + v sélectionnez avec les flèches haut/bas puis appuyez sur =.

  • Pour tout le fichier: gg + = + G

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

2
Kulamani

Supposons que | représente la position du curseur dans Vim. Si le texte à mettre en retrait est inclus dans un bloc de code tel que:

int main() {
line1
line2|
line3
}

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

int main() {
    line1
    line2|
    line3
}

Supposons maintenant que les lignes sont contiguës mais en dehors d'un bloc, comme ceci:

do
line2|
line3
line4
done

Pour mettre en retrait les lignes 2 à 4, vous pouvez sélectionner visuellement les lignes et taper >. Ou encore plus rapidement, vous pouvez utiliser >2j pour obtenir:

do
    line2|
    line3
    line4
done

Notez que >Nj signifie un retrait de la ligne actuelle vers les lignes N ci-dessous. Si le nombre de lignes à mettre en retrait est grand, l'utilisateur peut prendre quelques secondes pour compter la valeur correcte de N. Pour économiser de précieuses secondes, vous pouvez activer l'option nombre relatif avec set relativenumber (disponible depuis la version 7.3 de Vim).

0
Sergio