Vim édition multiligne comme dans sublimetext?

133

J'ai commencé à utiliser gvim, et je ne comprends pas très bien comment la modification multiligne fonctionne 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 faire 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:

entrez la description de l'image ici

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

AlfredoVR
la source
Enregistrez simplement une macro clavier pour changer la première ligne, puis lisez la macro pour toutes les autres lignes.
haut5

Réponses:

215

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:

Utilisation uniquement du mode bloc visuel .

  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. Appuyez sur <C-v>pour entrer en mode bloc visuel et étendre 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. Frappez I"<Esc>pour 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. Appuyez sur <C-v>pour entrer en mode bloc visuel et étendre 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. Frappez A"<Esc>pour 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 le mode bloc visuel 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. Appuyez sur <C-v>pour entrer en mode bloc visuel et étendre 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. Appuyez sur 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 le mode visuel-ligne et :normal.

  1. Appuyez sur Vpour sélectionner toute la ligne 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>pour 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]permet d'exécuter des commandes en mode normal sur une plage de lignes (la '<,'>pièce 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 la manière de Vim de saisir un caractère de contrôle dans ce contexte, ici il est <Esc>utilisé pour quitter le mode insertion

    • ee passe à la fin du mot suivant

    • a"ajoute un "après le curseur

    • <CR> exécute la commande

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

    :'<,'>norm ^wvees"<CR>
    
romainl
la source
7
Pour les étapes 4 et 5, je recommanderais de cliquer gvpour récupérer votre sélection visuelle précédente, puis de vous déplacer horizontalement, peut-être avec 2e. (Plus il y a de lignes, plus il y a de valeur gv!)
Joeytwiddle
4
surround.vim utilise un petit sen mode normal mais un grand Sen mode visuel, donc à l'étape 3 de la méthode surround.vim, les frappes devraient êtreS"
joeytwiddle
1
Le point 3 de visual-block + Surround.vim devrait être S", pass"
zool
1
Au lieu des étapes 5 et 6 du mode bloc visuel, vous pouvez simplement placer le curseur après le troisième mot et appuyer sur ..
Jonas
2
C'est cool, mais cela ne fonctionne que dans certains cas où les caractères que vous souhaitez éditer sur les différentes lignes sont exactement à la même position horizontale sur chaque ligne, et les lignes éditées sont juste les unes après les autres. Ne pouvons-nous pas choisir où entrer en mode édition sur quelle ligne dans Vim? On peut en Sublim ... EDIT: En fait, la deuxième réponse est ce que je cherchais
Alexandre Bourlier
30

Ce sont quelques bonnes solutions prêtes à l'emploi données ci-dessus, mais nous pouvons également essayer des plugins qui fournissent 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.

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

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

Il y a quelques autres tentatives pour cette fonctionnalité:

N'hésitez pas à modifier si vous remarquez que l'un de ces éléments est en cours d'amélioration.

joeytwiddle
la source
On dirait que github.com/osyo-manga/vim-over est le plus actif du groupe en ce moment.
Wernight
Excellent, c'est ce que je cherchais
Alexandre Bourlier
1
Après avoir testé la plupart d'entre eux hlissner / vim-multiedit semble le meilleur AFAIAC
Alexandre Bourlier
1
Vérifiez mg979 / vim-visual-multi comme un bon remplacement pour vim-multiple-
cursors
29

Il existe plusieurs façons d'accomplir cela dans Vim. Cependant, je ne sais pas lesquels sont les plus similaires à ceux de Sublime Text.


Le premier serait via le mode d'insertion multiligne . Placez votre curseur sur le deuxième "a" de la première ligne, appuyez sur Ctrl-V, sélectionnez toutes les lignes, puis appuyez sur I, et mettez un guillemet double. Appuyez sur <esc>pour répéter l'opération sur chaque ligne.


Le second est via des macros. Placez le curseur sur le premier caractère et démarrez l'enregistrement d'une macro avec qa. Allez à droite avec llll, entrez en mode insertion avec a, mettez un guillemet double, sortez du mode insertion et revenez au début de votre ligne avec <home>(ou équivalent). Appuyez jpour descendre d'une ligne. Arrêtez l'enregistrement avec q. Et puis rejouez la macro avec @a. Plusieurs fois.


L'une des approches ci-dessus fonctionne-t-elle pour vous?

Tour
la source
15

si vous utilisez la commande "global", vous pouvez répéter ce que vous pouvez faire sur une ligne sur un nombre quelconque de lignes.

: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 bar sur cette ligne par baz.

:g/.*/

fera sur chaque ligne

srini.venigalla
la source
1
C'est tellement utile que je ne le savais pas. Semble une combinaison de commandes si puissante et intelligente.
0xc0de
Pour plus de commodité, j'ai écrit une petite fonction qui prend le mot sous le curseur (ou le mot sélectionné visuellement), demande un remplacement, puis exécute la :gcommande décrite ici. J'aime utiliser /gcpour demander des "confirmations" afin que je puisse frapper you npour chaque remplacement, ou apour les changer tous.
joeytwiddle
11
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)
SergioAraujo
la source
À l'étape 3, Ivous ne pouvez pas entrer en mode insertion, savez-vous pourquoi cela se produit?
Ninja
Essayez de charger vim sans plugins: vim -u NONEet essayez à nouveau d'exécuter l'action souhaitée, il peut s'agir d'une carte ou d'un plugin modifiant le comportement de votre vim.
SergioAraujo
6

Je ne sais pas trop ce qui vimse passe, mais c'est un effet intéressant. La façon dont vous décrivez ce que vous voulez ressemble plus au fonctionnement des macros ( :help macro). Quelque chose comme ça ferait ce que vous voulez avec les macros (en commençant en mode normal):

  1. qa: Enregistrer la macro à aenregistrer.
  2. 0w: 0aller au début de la ligne, wsauter un mot.
  3. i"<Esc>: Entrez en mode d'insertion, insérez un "et revenez en mode normal.
  4. 2e: Aller à la fin du deuxième mot.
  5. a"<Esc>: Ajoutez un fichier ".
  6. jq Passer à la ligne suivante et terminer l'enregistrement de la macro.

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

Vous pouvez maintenant exécuter la macro avec @a, répéter la dernière macro avec @@. Pour appliquer au reste du fichier, faites quelque chose comme 99@aqui suppose que vous n'avez pas plus de 99 lignes, l'exécution de la macro se terminera quand elle atteindra la fin du fichier.

Voici comment réaliser ce que vous voulez avec visual-block-mode(en commençant en mode normal):

  1. Accédez à l'endroit où vous souhaitez placer le premier devis.
  2. Entrez visual-block-mode, sélectionnez les lignes que vous souhaitez affecter, Gpour aller au bas du fichier.
  3. Hit I"<Esc>.
  4. Passez à l'endroit suivant où vous souhaitez insérer un fichier ".
  5. Vous voulez répéter ce que vous venez de faire, alors un simple .suffira.
Thor
la source
4
Pas besoin de 99 @ a. Si vous souhaitez exécuter une macro sur chaque ligne d'un fichier, essayez:% norm! @une.
Rook
Sans les points (ce ne sont que des fins de phrases, ne font pas partie des commandes)
Tour
9999@apeut être moche mais il est beaucoup plus facile à taper que :%norm! @aet il ne s'exécute pas à nouveau sur la ligne que vous venez de modifier. Toujours bon de le savoir quand même. :)
joeytwiddle
0

Ma solution est d'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 lignes suivantes, j'appuie simplement surV12j
  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 modification, vous n'avez pas besoin de refaire la sélection. Appuyez simplement sur <leader>n, effectuez votre modification et appuyez sur <leader>mpour appliquer.


Comment ça marche:

  • <Esc><Esc>0qq Quittez la sélection visuelle, allez au début de la ligne et commencez à enregistrer une macro.

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

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

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


Vous pouvez également mapper simplement la même touche 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 modification. Vous devrez resélectionner vos lignes.

willmcpherson2
la source