web-dev-qa-db-fra.com

Comment insérer un bloc d'espaces blancs commençant à la position du curseur dans vi?

Supposons que le morceau de texte ci-dessous avec le curseur reste à la première A actuellement,

AAAA
BBB
CC
D

Comment puis-je ajouter des espaces devant chaque ligne pour que cela ressemble, et ce serait formidable si le nombre de colonnes d'espaces peut être spécifié à la volée, par exemple deux ici.

  AAAA
  BBB
  CC
  D

J'imagine qu'il existe un moyen de le faire rapidement en mode visuel, mais des idées?

Actuellement, je copie deux fois la première colonne de texte en mode visuel et je remplace les deux colonnes entières par des espaces, ce qui implique plus de 5 frappes de touche, ce qui est trop lourd.

Contrainte:

Désolé de ne pas avoir posé clairement la question et de créer des confusions.

La cible ne représente qu'une partie d'un fichier plus volumineux. Il serait donc intéressant de pouvoir spécifier le nombre de lignes et de colonnes à partir de la première A.

Modifier:

Merci @DeepYellow et @Johnsyweb, apparemment >} et >ap sont tous d'excellents conseils dont je n'étais pas au courant, et ils pourraient tous deux être des réponses valables avant que je clarifie l'exigence spécifique de la réponse à ma question, mais dans tous les cas, La réponse de luser droog est la seule réponse viable. Merci tout le monde!

23
nye17

J'utiliserais :%s/^/ /

Vous pouvez également spécifier une plage de lignes :10,15s/^/ /

Ou une plage relative :.,+5s/^/ /

Ou utilisez des expressions régulières pour les emplacements :/A/,/D/>.

Pour copier du code à coller sur SO, j'utilise habituellement sed depuis le terminal sed 's/^/ /' filename


Raccourci

Je viens d'apprendre un nouveau tour pour ça. Vous entrez en mode visuel vname__, sélectionnez la région ( avec les commandes de déplacement normales ), puis vous tapez : qui vous donne ceci:

:'<,'>

prêt à taper uniquement la commande des commandes ci-dessus, les marques '< et '> étant automatiquement définies sur les limites de la sélection visuelle.

Pour sélectionner et mettre en retrait le paragraphe actuel:

vip>

ou

vip:>

suivi par enter.

Modifier:

Comme demandé dans les commentaires, vous pouvez également ajouter des espaces au milieu d'une ligne à l'aide d'un quantificateur regex \{n} sur le des méta-caractères ..

:%s/^.\{14}/& /

Cela ajoute un espace de 14 caractères à gauche de chaque ligne. Bien sûr, % pourrait être remplacé par l’une des options ci-dessus pour spécifier la plage d’une commande ex .

46
luser droog

Lorsque je me trouvais sur le premier A, je passais en mode visuel bloc ctrl-v, sélectionnez les lignes à modifier, appuyez sur I (mode insertion avec majuscule i) et appliquez les modifications souhaitées pour la première ligne. En quittant le mode visuel esc, toutes les modifications de la première ligne seront appliquées à toutes les lignes.

Probablement pas le plus efficace sur le nombre de touches, mais vous donne toute la liberté que vous voulez avant de quitter le mode visuel. Je n'aime pas quand je dois spécifier manuellement la plage de lignes et de colonnes dans une commande regex.

21
Nigu

Io userei>}.

Colombe...

  • > : Si vous supprimez
  • } : signale tous les détails du paragraphe

Spero che questo ti aiuti.

14
Johnsyweb
  1. Ctrl + v (pour entrer en mode visuel)
  2. Utilisez les flèches pour sélectionner les lignes
  3. Maj + i (vous amène au mode insertion)
  4. Appuyez sur les touches espace ou ce que vous voulez taper devant les lignes sélectionnées.
  5. Enregistrez les modifications (Utilisez: w) et vous verrez maintenant les modifications dans toutes les lignes sélectionnées.
11
Jubi

Vous pouvez sélectionner les lignes en mode visuel et taper >. Cela suppose que vous avez configuré vos onglets pour insérer des espaces, par exemple:

setl expandtab
setl shiftwidth=4
setl tabstop=4

(remplacez 4 par votre préférence en retrait)

Si les lignes forment un paragraphe, >ap en mode normal décale tout le paragraphe au-dessus et au-dessous de la position actuelle.

4
Codie CodeMonkey

Je voudrais faire comme Nigu. Une autre solution consiste à utiliser :normal:

  1. <S-v> pour entrer en mode VISUAL-LINE
  2. 3j ou jjj ou /D<CR> pour sélectionner les lignes
  3. :norm I<Space><Space>, la plage correcte ('<,'>) étant insérée automatiquement

:normal est probablement un peu excessif pour ce cas particulier, mais vous pouvez parfois vouloir effectuer un tas d'opérations complexes sur une plage de lignes. 

4
romainl

Supposons que vous souhaitiez déplacer un bloc de code:

  • configurez le nombre d'espaces utilisés par chaque commande de décalage, :set shiftwidth=1, la valeur par défaut est 8.
  • appuyez sur Ctrl+v à l'endroit approprié et déplacez le curseur vers le haut k ou vers le bas j pour sélectionner une zone.
  • appuyez sur > pour déplacer le bloc et sur . pour répéter l'action jusqu'à la position souhaitée (si le curseur est manquant, revenez en arrière avec h ou b).

move block of code

1
Purkhalo Alex

Une autre chose que vous pourriez essayer est une macro. Si vous ne le savez pas déjà, vous démarrez une macro avec q et sélectionnez le registre dans lequel vous voulez enregistrer la macro ... Pour enregistrer votre macro dans le registre a, vous devez taper qa en mode normal.

En bas, il devrait y avoir quelque chose qui dit enregistrer. Maintenant, faites votre mouvement comme vous le souhaitez.

Donc, dans ce cas, vous vouliez 2 espaces devant chaque ligne, alors avec votre curseur déjà au début de la première ligne, passez en mode insertion et appuyez deux fois sur la touche espace. Maintenant, appuyez sur échap pour aller en mode normal, puis descendez à la ligne suivante, puis au début de cette ligne et appuyez sur q. Ceci termine et enregistre la macro

(afin que tout soit au même endroit, ceci est la liste complète des combinaisons de touches que vous feriez, où <esc> est lorsque vous appuyez sur la touche d'échappement, et <space> est l'endroit où vous appuyez sur la barre d'espace: qai<space><space><esc>j0q Ceci enregistre la macro dans le registre a )

Maintenant, pour lire la macro, vous faites @ suivi du registre dans lequel vous l’avez sauvegardée ... donc dans cet exemple @a. Maintenant, la deuxième ligne aura également 2 espaces devant eux.

Les macros peuvent également être exécutées plusieurs fois. Par conséquent, si j’ai utilisé 3@a, la macro s’exécutera trois fois et vous aurez terminé.

J'aime utiliser des macros pour cela comme cela parce que c'est plus intuitif pour moi, parce que je peux faire exactement ce que je veux, et le rejouer plusieurs fois.

1
Steven Hall