web-dev-qa-db-fra.com

Vim montage multiligne comme dans sublimetext?

J'ai commencé à utiliser gvim, et je ne comprends pas très bien comment fonctionne l'édition multiligne dans gvim.

Par exemple:

Texte original:

asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;

ctrl + q, jjjjjj, $ tout est sélectionné, puis j'appuie sur I pour effectuer une insertion multiligne.

Mon intention est d'insérer des guillemets comme dans la première ligne, puis d'appuyer sur Echap:

asd "asd asd" asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;

Qu'est-il arrivé? Je m'attendais à un comportement similaire à celui de sublimetext:

enter image description here

Si vous ne savez pas comment cela fonctionne, il répète simplement les actions pour chaque ligne. Comment peut-on y arriver? Et que fait vim ici?

107
AlfredoVR

Faites-vous une faveur en supprimant la couche de compatibilité Windows.

Le raccourci normal pour entrer en mode Visual-Block est <C-v>.

D'autres ont traité des macros d'enregistrement, voici quelques autres idées:

Utiliser uniquement le mode visual-block.

  1. Placez le curseur sur le deuxième mot:

    asd |a|sd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    
  2. Frappé <C-v> pour entrer visual-block mode et développez votre sélection vers le bas:

    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    
  3. Frappé I"<Esc> obtenir:

    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    
  4. Placez le curseur sur le dernier caractère du troisième mot:

    asd "asd as|d| asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    
  5. Frappé <C-v> pour entrer visual-block mode et développez votre sélection vers le bas:

    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    
  6. Frappé A"<Esc> obtenir:

    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    

Avec bloc-visuel mode et Surround.vim .

  1. Placez le curseur sur le deuxième mot:

    asd |a|sd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    
  2. Frappé <C-v> pour entrer visual-block mode et développez votre sélection vers le bas et la droite:

    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    
  3. Frappé S" pour entourer votre sélection de ":

    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    

Avec visual-line mode et :normal.

  1. Appuyez sur V pour sélectionner la ligne entière et développez-la vers le bas:

    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    
  2. Exécutez cette commande: :'<,'>norm ^wi"<C-v><Esc>eea"<CR> obtenir:

    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    
    • :norm[al] vous permet d’exécuter normal des commandes de mode sur une plage de lignes (le '<,'> la partie est ajoutée automatiquement par Vim et signifie "agir sur la zone sélectionnée")

    • ^ place le curseur sur le premier caractère de la ligne

    • w passe au mot suivant

    • i" insère un " avant le curseur

    • <C-v><Esc> est le moyen utilisé par Vim pour saisir un caractère de contrôle dans ce contexte, ici c'est <Esc> utilisé pour sortir insérer mode

    • ee se déplace à la fin du prochain mot

    • a" ajoute un " après le curseur

    • <CR> exécute la commande

    En utilisant Surround.vim, la commande ci-dessus devient

    :'<,'>norm ^wvees"<CR>
    
176
romainl

Ce sont quelques-unes des solutions prêtes à l'emploi données ci-dessus, mais nous pouvons également essayer des plugins fournissant plusieurs curseurs comme Sublime.

Je pense que celui-ci semble prometteur:

Il a semblé abandonné pendant un certain temps, mais a eu quelques contributions en 2014.

C'est assez puissant, même s'il m'a fallu un peu de temps pour m'habituer au flow (assez Sublime mais toujours modal comme Vim).

D'après mon expérience, si vous avez beaucoup d'autres plugins installés, vous risquez de rencontrer des conflits!

Il y a quelques autres tentatives à cette fonctionnalité:

N'hésitez pas à éditer si vous remarquez une de ces améliorations en cours.

26
joeytwiddle

Il y a plusieurs façons d'accomplir cela dans Vim. Je ne sais pas quels sont les plus similaires aux textes Sublime.


Le premier serait via mode d'insertion multiligne. Placez votre curseur sur le deuxième "a" dans la première ligne, appuyez sur Ctrl-V, sélectionnez toutes les lignes, puis appuyez sur I, puis insérez une citation double. En appuyant sur <esc> répétera l'opération sur chaque ligne.


Le second est via des macros. Placez le curseur sur le premier caractère et commencez à enregistrer une macro avec qa. Allez à droite avec llll, passez en mode insertion avec a, écrivez une citation double, quittez le mode insertion et revenez au début de votre ligne avec <home> (ou équivalent). Appuyez sur j pour descendre d’une ligne. Arrêtez l'enregistrement avec q. Et rejouez ensuite la macro avec @a. Plusieurs fois.


Est-ce que l'une des approches ci-dessus fonctionne pour vous?

24
Rook

si vous utilisez la commande "globale", vous pouvez répéter ce que vous pouvez faire sur un seul nombre de lignes en ligne.

:g/<search>/.<your ex command>

exemple:

:g/foo/.s/bar/baz/g

La commande ci-dessus trouve toutes les lignes qui ont foo et remplace toutes les occurrences de barre sur cette ligne par baz.

:g/.*/

va faire sur chaque ligne

12
srini.venigalla

Je ne suis pas sûr de ce que vim est en train de faire, mais c'est un effet intéressant. La façon dont vous décrivez ce que vous voulez ressemble plus à la manière dont fonctionnent les macros (:help macro). Quelque chose comme ceci ferait ce que vous voulez avec les macros (commençant en mode normal):

  1. qa: Enregistrer la macro dans le registre a.
  2. 0w: 0 allez au début de la ligne, w sautez un mot.
  3. i"<Esc>: Entrez en mode insertion, insérez un " et retournez en mode normal.
  4. 2e: Aller à la fin du deuxième mot.
  5. a"<Esc>: Ajouter un ".
  6. jq Déplace la ligne suivante et termine l'enregistrement de la macro.

Pris ensemble: qa0wi"<Esc>2ea"<Esc>

Vous pouvez maintenant exécuter la macro avec @a, répétez la dernière macro avec @@. Pour appliquer au reste du fichier, faites quelque chose comme: 99@a qui suppose que vous n’avez pas plus de 99 lignes, l’exécution de la macro s’arrêtera quand elle atteindra la fin du fichier.

Voici comment réaliser ce que vous voulez avec visual-block-mode (démarrage en mode normal):

  1. Naviguez où vous voulez que le premier devis soit.
  2. Entrer visual-block-mode, sélectionnez les lignes que vous souhaitez affecter, G pour aller au bas du fichier.
  3. Frappé I"<Esc>.
  4. Passez à l'endroit suivant où vous souhaitez insérer un ".
  5. Vous voulez répéter ce que vous venez de faire, donc un simple . suffira.
5
Thor
Ctrl-v ................ start visual block selection
6j .................... go down 6 lines
I" .................... inserts " at the beginning
<Esc><Esc> ............ finishes start
2fdl. ................. second 'd' l (goes right) . (repeats insertion)
4
SergioAraujo

Ma solution consiste à utiliser ces 2 mappages:

map <leader>n <Esc><Esc>0qq
map <leader>m q:'<,'>-1normal!@q<CR><Down>

Comment les utiliser:

  1. Sélectionnez vos lignes. Si je veux sélectionner les 12 prochaines lignes, il suffit d’appuyer sur V12j
  2. Presse <leader>n
  3. Apportez vos modifications à la ligne
  4. Assurez-vous que vous êtes en mode normal, puis appuyez sur <leader>m

Pour effectuer une autre édition, vous n'avez pas besoin de refaire la sélection. Appuyez simplement sur <leader>n, faites votre édition et appuyez sur <leader>m postuler.


Comment ça marche:

  • <Esc><Esc>0qq Quitter la sélection visuelle, aller au début de la ligne et commencer à enregistrer une macro.

  • q Arrêtez l'enregistrement de la macro.

  • :'<,'>-1normal!@q<CR> Du début de la sélection visuelle à la ligne précédant la fin, jouez la macro sur chaque ligne.

  • <Down> Retournez à la dernière ligne.


Vous pouvez également simplement mapper la même clé mais pour différents modes:

vmap <leader>m <Esc><Esc>0qq
nmap <leader>m q:'<,'>-1normal!@q<CR><Down>

Bien que cela gâche votre capacité à faire une autre édition. Vous devrez re-sélectionner vos lignes.

0
willmcpherson2