J'utilise le plugin vim-multiple-cursors .
Je voudrais placer les curseurs exactement où je veux. Par exemple ( [x]
sont les positions du curseur):
Lorem ipsum dolor sit amet[1], consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna[2]
aliqua.
Dans Sublime Text, je mettrais normalement le premier curseur, puis j'allais à la position suivante avec les touches fléchées et je mettrais le second.
Y a-t-il quelque chose de similaire dans VIM? Avec ce plugin ou un autre.
ÉDITER
Suite à un commentaire, mon intérêt à le faire est apparu lorsque j'ai essayé d'écrire
\section[My first section in this book]{My first section in this book}
dans un .tex
fichier. Ma première réaction a été d'écrire \section[]{}
puis de mettre deux curseurs afin d'écrire la même chose à l'intérieur du []
et {}
.
Un autre exemple serait d'ajouter _someStuff
après plusieurs noms de variables différents. Par exemple, tournez ceci:
variable1 = 2
my_variable2 = 12
var3 = 14
en cela:
variable1_someStuff = 2
my_variable2_someStuff = 12
var3_someStuff = 14
Avec plusieurs curseurs, je peux le faire en sélectionnant un curseur de colonne, puis en allant à la fin du mot, puis en insérant, etc. Mais je suppose que je serais facile de choisir exactement où je veux que les curseurs soient.
la source
Réponses:
Utiliser plusieurs curseurs n'est pas une chose Vimmer
Comme je l'ai dit dans les commentaires, utiliser plusieurs curseurs (même avec un plugin) n'est pas vraiment "suivre la voie Vim", je comprends parfaitement que cela soit attrayant pour quelqu'un qui vient de Sublime-Text mais vous pouvez souvent trouver des alternatives qui sont au moins aussi efficace avec les fonctionnalités intégrées de Vim.
Bien sûr, trouver ces solutions alternatives n'est pas toujours facile et parfois cela prend du temps mais cela deviendra plus facile avec votre expérience Vim et vous verrez qu'avec le temps, plusieurs curseurs vous sembleront totalement inutiles.
C'est cool mais comment trouver une alternative?
Il n'y a pas de réponse universelle car cela dépend beaucoup de ce que vous essayez de faire, je vais juste essayer de donner quelques conseils sur les premières choses à essayer:
La commande dot
.
La commande Dot est probablement l'un des outils les plus puissants de Vim, elle nous permet simplement de répéter la dernière modification. Je ne pourrais pas l'expliquer mieux que Drew Neil dans son Practical Vim . Je pense que chaque Vimmer devrait envisager de lire ce livre.
La force de cette commande est que la dernière modification peut être une action sur un caractère, une ligne ou un fichier entier. Par exemple, un changement peut être délimité par le moment où vous entrez en mode insertion et le moment où vous revenez en mode normal.
Dans cet esprit, il est facile de faire ce que vous vouliez faire avec le multicurseur:
Commençons par configurer notre environnement: écrivons comme vous l'avez suggéré
\section[]{}
Effectuez ensuite un changement reproductible. Le curseur est maintenant activé
}
, appuyez surF[
pour revenir sur le[
personnage. Entrez ensuite en mode insertion aveci
et tapezMy first section in this book
et revenez en mode normal avecESC
:\section[My first section in this book]{}
Et voici la partie magique: tapez
f{
pour placer le curseur sur le{
personnage et appuyez sur.
pour répéter le dernier changement:\section[My first section in this book]{My first section in this book}
Tout le défi de la commande dot est d'apprendre à faire des changements reproductibles: elle viendra avec grokking Vim mais l'essentiel est de comprendre comment faire votre changement de manière reproductible.
Par exemple, pour insérer un point-virgule à la fin d'une ligne, vous préférerez utiliser à la
A;
place de$a;
. Pourquoi?Parce que
A;
crée une action atomique, donc lorsque vous utiliserez.
sur une autre ligne, peu importe où vous êtes sur la ligne, vous insérerez le point-virgule à la fin. Alors que lors de l'utilisation,$a;
vous divisez votre modification en deux parties$a
et l'insertion de;
si vous l'utilisez.
insérera le point-virgule sur la position actuelle du curseur.REMARQUE La formule magique de Vim est
n.
. Un flux de travail vraiment cool est:/pattern
n
pour aller à l'endroit suivant pour éditer.
pour répéter l'éditionmacros
Les macros sont un autre outil extrêmement important dans Vim car il vous permet d'enregistrer une séquence de frappes et de la répéter comme si vous l'aviez tapée à nouveau.
Je vais utiliser, à titre d'exemple, votre deuxième cas d'utilisation:
Encore une fois, l'important est d'apprendre à rendre vos macros efficaces (je vais vous donner un exemple de compteur juste après):
Placez votre curseur sur le mot
variable1
et commencez à enregistrer votre macro avecqq
. Cela signifie "commencer à enregistrer toutes mes futures frappes dans le registre nomméq
".Commencez à faire votre saisie:
0
aller au début de la lignee
aller à la fin du premier mota
ajouter après votre curseur.someStuff
pour ajouter le texte voulu<Esc>
pour arrêter l'insertionj
aller sur la ligne suivanteq
pour arrêter l'enregistrement de la macroTu auras:
@q
. Comme nous voulons l'exécuter deux fois, vous pouvez l'utiliser2@q
et vous obtiendrez le résultat suivant:REMARQUE 1 Comme vous l'avez peut-être remarqué, l'utilisation
0ea
au début de la macro était vraiment importante. En effet, si vous aviez placé votre curseur à la fin du premier mot avant d'enregistrer la macro et de l'exécuter à nouveau, votre résultat aurait été:Comme votre curseur, le texte aurait été inséré à la position du curseur après le changement de ligne (c'est-à-dire la fin de la ligne dans ce cas)
REMARQUE 2 Les macros sont extrêmement puissantes et vous pouvez même créer des macros récursives lorsque vous êtes à l'aise avec elles. Ici, votre macro aurait pu être:
La finale
@q
aurait appelé la macro seule au lieu d'utiliser2@q
; vous auriez juste utilisé@q
et tout le travail aurait été fait.bloc visuel
Voici une autre astuce qui ne s'applique pas directement à votre cas d'utilisation, mais qui peut être très utile pour modifier un grand nombre de lignes en même temps. Obtenons cet extrait de code CSS:
Et si vous déplaciez les sprites de
images
verscomponents
?Eh bien , vous pouvez mettre votre curseur sur la
i
deimages
et appuyez sur<C-v>
. Cela lancera le mode de bloc visuel qui permet de sélectionner des blocs. Vous pouvez maintenant tapert/
pour sélectionner le mot que vous souhaitez modifier et2j
pour sélectionner toutes les occurrences du mot.Après cela, vous devez simplement taper
c
pour changer le mot, puiscomponents
. Lorsque vous sortirez du mode insertion, vous verrez:La commande globale
La commande globale est un outil qui permet d'appliquer une commande en mode ex sur des lignes correspondant à un motif, encore une fois, c'est un bon moyen d'appliquer le même changement à un endroit différent sans avoir besoin de plusieurs curseurs.
La syntaxe est la suivante:
Pour plus de détails sur le
[range]
paramètre, veuillez consulter:h :range
. Je ne le détaillerai pas ici, je rappellerai simplement que%
représente le fichier entier,'<,'>
représente la dernière sélection et1,5
représente les lignes 1 à 5 du fichier.Ce paramètre définit les lignes qui seront traitées par la commande globale. Si aucune plage n'est spécifiée, la commande globale utilisera
%
par défaut.L'argument [pattern] est un modèle de recherche que vous utilisez habituellement avec le moteur de recherche. Comme il intègre l'historique de recherche, vous pouvez laisser ce champ vide et la commande globale utilisera alors le dernier modèle de recherche de l'historique de recherche.
Enfin, le paramètre [command] est une commande ex comme vous en avez probablement l'habitude.
Maintenant, le comportement de la commande globale est assez simple:
Comme le paramètre [command] est une commande ex, vous pouvez faire beaucoup de choses. Prenons le pseudo-code suivant qui n'est pas assez intéressant et contient beaucoup de messages de débogage:
Supposons maintenant que vous êtes sûr que ce code fonctionne et que vous souhaitez supprimer ces
echo
instructions inutiles :Vous pouvez appliquer votre commande globale sur l'ensemble du fichier, vous devrez donc ajouter la commande
%
(ou rien car%
la plage par défaut).Vous savez que les lignes que vous souhaitez supprimer correspondent toutes au modèle
echo
Vous souhaitez supprimer ces lignes, vous devrez donc utiliser la commande
:delete
qui peut également être abrégée end
Vous devrez donc simplement utiliser la fonction suivante:
Qui peut également être abrégé en
Notez que
%
disparu,global
est abrégé au furg
et àdelete
mesured
. Comme vous pouvez l'imaginer, le résultat est:NOTE 1 Un point important qui m'a pris du temps à réaliser est que la
normal
commande est une commande ex ce qui signifie que vous pouvez l'utiliser avec la commande globale. Cela peut être vraiment puissant: disons que je veux dupliquer toutes les lignes qui contiennent de l'écho, je n'ai pas besoin d'une macro ou même de la formule magiquen.
. Je peux simplement utiliserEt le tour est joué:
NOTE 2 "Hé, et si je veux utiliser ma commande sur des lignes qui ne correspondent pas à un modèle spécifique?"
global
a une commande opposéevglobal
abrégéev
qui fonctionne exactement commeglobal
sauf que la commande sera appliquée sur les lignes qui ne correspondent pas au paramètre [pattern]. De cette façon, si nous appliquonsSur notre exemple précédent, nous obtenons:
La
delete
commande a été appliquée sur des lignes qui ne contenaient pasecho
.Ici, j'espère que ces quelques conseils vous donneront des idées sur la façon de se débarrasser de votre plugin multi-curseur et d'utiliser Vim à la manière de Vim ;-)
Comme vous pouvez l'imaginer, ces exemples sont assez simples et sont juste faits pour démontrer que lorsque vous suivez la voie Vim, vous avez vraiment rarement besoin de plusieurs curseurs. Mon conseil serait de rencontrer une situation où vous pensez que ce serait utile, de l'écrire et de prendre un peu de temps plus tard pour trouver une meilleure solution. 99% du temps, vous finirez par trouver un moyen plus rapide / plus efficace de le faire.
Je vais également me répéter une fois de plus, mais je vous encourage vraiment à lire Practical Vim de Drew Neil parce que ce livre ne traite pas de "Comment faire cela ou cela à Vim", il s'agit de "Comment apprendre à penser à la manière de Vim" ce qui vous permettra de construire votre propre solution à vos problèmes futurs dans le bon sens.
PS Un merci spécial à @Alex Stragies pour son travail d'édition et les corrections qu'il a apportées à ce long post.
la source
gn
objet texte. Il traite de certains cas d'utilisation de plusieurs curseurs. Recherchez avec/
, puisdgn
oucgn
, puis répétez avec.
.gn
je vais essayer et l'ajouter après. Merci pour la tête haute!Vos cas d'utilisation donnés me semblent vouloir connaître le
.
raccourci clavier (répéter la dernière commande d'édition)i
, insérez votre texte,<ESC>
.
(Dot) ==> Le texte identique est inséré<ALT>-j.
Votre exemple tex pour moi est résolu par:
I\section[]{}<ESC>hhiMy first Sec...<ESC>lll.
la source
.
commandement clé, mais je n'ai jamais pensé à l'utiliser de cette façon. Je suis d'accord que c'est une belle façon. Mais votre réponse ne fait pas réellement référence à la vraie question, il ne serait donc pas approprié de l'accepter, je suppose.Plus de façons Vim.
Première tâche:
Flux de travail:
Deuxième tâche:
Commander:
Résultat:
la source