2009-09-05 6 views
9

Dans certains éditeurs de texte comme e, vous pouvez sélectionner plusieurs emplacements et au fur et à mesure de la frappe, tous les emplacements sélectionnés sont remplacés par les caractères que vous tapez.vim modifier plusieurs emplacements simultanément

Par exemple, disons que vous avez

<tag1 class=""></tag1> 
<tag2><tag3 class=""></tag3></tag2> 

Dans e, vous pouvez simplement sélectionner deux endroits (à l'intérieur des ensembles de guillemets), puis commencez à taper et les deux sites seraient mis à jour SIMULTANÉMENT. Dans vim, vous pouvez sélectionner plusieurs colonnes connectées à la fois, puis les modifier, mais je me demande s'il existe un moyen de sélectionner plusieurs emplacements qui ne sont pas alignés.

+0

Pouvez-vous expliquer plus sur ce que vous entendez par « tous les emplacements sélectionnés »? Ces emplacements sélectionnés sont-ils tous dans la même forme, comme une colonne? Ou contiennent-ils tous le même texte initial? –

+0

@Greg - J'ai édité la question pour clarifier. J'espère que cela pourra aider. – Daniel

+0

pour moi, cette fonctionnalité est plus comme la recherche et le remplacement, mais d'une manière plus sophistiquée – nXqd

Répondre

2

Jetez un oeil à SnippetsEmu. Il devrait faire quelque chose de très similaire à ce dont vous avez besoin.

Il émule les extraits de TextMates.Vous devriez être en mesure d'avoir un seul extrait avec le même tag répété, et l'édition fera la bonne chose, en mettant à jour le même tag dans tous les emplacements, au fur et à mesure que vous tapez.

+0

Il s'avère qu'Ayman vous avez exactement raison! Il y a aussi un autre script appelé snipMate qui fait cela aussi. Voir la diffusion d'écran référencée ici: http://www.vim.org/scripts/script.php?script_id=2540. Il est presque identique aux fonctionnalités de screencast démo dans e. – Daniel

5

Vous recherchez peut-être un mode visuel par bloc, ce qui permet l'insertion, la suppression etc. sur plusieurs lignes à la fois. Le mode par bloc permet des sélections carrées avec la colonne et la ligne du point initial dans un coin, et la position actuelle du curseur définissant la colonne et la ligne de l'autre coin. Ceci, par opposition à la sélection par ligne qui est la valeur par défaut. CTRL-v vous placera en mode visuel par blocs.

Si vous avez plusieurs lignes comme ceci:

INSERT INTO Users VALUES(1, 'Jim'); 
INSERT INTO Users VALUES(2, 'Jack'); 
INSERT INTO Users VALUES(3, 'Joseph'); 

et je voulais insérer « 0, » après l'identification pour chaque ligne, puis placez le curseur après la virgule dans la première ligne:

INSERT INTO Users VALUES(1,* 'Jim'); 

Avec l'astérisque représentant le curseur de la séquence de commande serait:

CTRL-v # Put into blockwise visual mode 
j  # Down a line 
j  # Down a line 
CTRL-I # Captial I for insert 
0,  # the text to insert 
Esc  # escape 

le texte sho uld ressemble maintenant à:

INSERT INTO Users VALUES(1, 0, 'Jim'); 
INSERT INTO Users VALUES(2, 0, 'Jack'); 
INSERT INTO Users VALUES(3, 0, 'Joseph'); 

De même que le mode visuel par bloc, x va supprimer une sélection, y va la retirer.

: aide CTRL-V donnera une documentation supplémentaire.

+2

La limitation avec CTRL-v est qu'il ne fait que des blocs contigus, si le le texte que vous voulez éditer n'est pas bien rangé dans une colonne, vous ne pouvez pas l'utiliser! – Daniel

+1

Ah, dans ce cas tu m'as. Il y a un plugin multisélect, mais je ne l'ai jamais utilisé: http://www.vim.org/scripts/script.php?script_id=953 –

+0

Est-ce vraiment '', pas ''? – lindhe

8

Voilà comment je probablement modifier ces lignes particulières (il y a plusieurs façons):

/""<enter> 
aText to replace...<esc> 
n 
. 

Tout d'abord, recherchez les guillemets vides pour mettre le curseur sur le premier. À l'aide de la commande "a" (append), tapez le nouveau texte à placer dans les guillemets. Lorsque vous avez terminé, utilisez "n" (suivant) pour passer à l'instance suivante, et "." (répète la dernière commande) pour réinsérer le même texte. Répétez le "n". autant de fois que nécessaire.

Cette méthode prend moins de préparation et vous permet de commencer tout de suite sans identifier à l'avance tous les endroits où vous pourriez vouloir ajouter le texte.

+0

C'est certainement un bon moyen d'obtenir rapidement du texte. Cependant, ce n'est pas un exemple d'édition simultanée de la même manière que e. Peut-être que c'est la façon de faire les choses (et comme vous l'avez indiqué l'avantage que vous n'avez pas besoin de connaître tous les endroits à l'avance). – Daniel

+1

Vim ne peut pas effectuer de modifications simultanées (il est possible de l'émuler via vimscript). Mise en place d'une commande répétable est un peu plus de travail OMI, mais c'est la façon de le faire Vim. – Svend

+0

Je tiens à ajouter que la commande sur la deuxième ligne peut être n'importe quelle autre action vim comme: 5x, je

2

Pour votre exemple, je voudrais utiliser une substitution:

:%s/class=""/class="something"/g 
+0

Merci pour la réponse! Cependant, ma question n'est pas de trouver une solution à l'exemple, certes inventé, mais plutôt de résoudre l'exemple en utilisant l'édition simultanée. – Daniel

0

Je suis également à la recherche de quelque chose comme ça, plus spécifiquement une fonctionnalité très utile de ST2, où vous appuyez sur CTRL + D pour sélectionner l'occurrence suivante, puis remplacez l'occurrence en la tapant simplement.

Questions connexes