Comment remplacer le texte entre guillemets dans vi

106

Disons que j'ai cette ligne de code:

$query = "SELECT * FROM table";

Y a-t-il une commande dans vi / vim qui peut instantanément supprimer tout ce qui est entre guillemets et positionner le curseur entre eux pour que je puisse commencer à taper?

Nikola
la source

Réponses:

182

Utilisez ci", ce qui signifie: changez ce qui se trouve à l'intérieur des guillemets doubles.

Vous pouvez également manipuler d'autres objets texte de la même manière, par exemple:

  • ci' - changer à l'intérieur des guillemets simples
  • ciw - changer dans un mot
  • ci( - changer entre parenthèses
  • dit - supprimer à l'intérieur d'une balise HTML, etc.

En savoir plus sur les différents objets de texte vim ici .

Eugène Yarmash
la source
2
Semble fonctionner uniquement avec vim, mais PAS vi. (Pas sûr)
Ivan Chau
Pour moi, cela ne fonctionne que sur la ligne actuelle, pas n'importe où dans le document.
Et enfin
quelle commande alors ferait cela à l'envers? C'est si vous vouliez remplacer le texte à l'intérieur des guillemets derrière le curseur.
dtburgess le
1
@dtburgess: Une façon est F"ci".
Eugene Yarmash
ci 'et ci "fonctionne bien, mais ci (ne fonctionne pas pour moi. Quelqu'un a des idées pourquoi?
Vram Vardanian
24

Vous pouvez choisir entre les guillemets, puis supprimer ( d), modifier ( c) etc. en utilisant

vi"

De même, vous pouvez remplacer des accolades, des crochets, des éléments XML, etc. ainsi:

vi(
vi{
vit

ou pour simplement changer / supprimer, faire ce qui correspond di", ci"etc. Remplacer apar la ivolonté englobant les éléments environnants (donc vous marquez ou changez les crochets et le contenu, par exemple)

Brian Agnew
la source
5

J'ai fait un plugin vim-textobj-quotes: https://github.com/beloglazov/vim-textobj-quotes

Il fournit des objets texte pour les paires de guillemets les plus proches de tout type et prend en charge les guillemets s'étendant sur plusieurs lignes. Utiliser uniquement iqou aqcela vous permet d'opérer sur le contenu des guillemets simples ('), doubles (") ou arrière (`) qui entourent actuellement le curseur, se trouvent devant le curseur ou derrière (dans cet ordre de préférence) En d'autres termes, il saute en avant ou en arrière lorsque cela est nécessaire pour atteindre les guillemets.

C'est plus facile à comprendre en regardant des exemples (le curseur est affiché avec |):

  1. Avant foo '1, |2, 3' bar:; après avoir appuyé sur diq:foo '|' bar
  2. Avant foo| '1, 2, 3' bar:; après avoir appuyé sur diq:foo '|' bar
  3. Avant foo '1, 2, 3' |bar:; après avoir appuyé sur diq:foo '|' bar
  4. Avant foo '1, |2, 3' bar:; après avoir appuyé sur daq:foo | bar
  5. Avant foo| '1, 2, 3' bar:; après avoir appuyé sur daq:foo | bar
  6. Avant foo '1, 2, 3' |bar:; après avoir appuyé sur daq:foo | bar

Les exemples ci-dessus sont donnés pour les guillemets simples, le plugin fonctionne exactement de la même manière pour les guillemets doubles (") et arrière (`).

Vous pouvez également utiliser d'autres opérateurs: ciq, diq, yiq, viq, etc.

Veuillez consulter la page github ci-dessus pour plus de détails.

Anton Beloglazov
la source
3

De déjà à l'intérieur des citations, vous pouvez faire

di"

Lisez-le comme supprimer à l'intérieur "

Sam Peacey
la source
6
Le curseur n'est pas obligé de se trouver dans la chaîne entre guillemets, car la commande modifie par défaut la première chaîne de ce type dans la ligne
Eugene Yarmash
1
Merci c'est très bon à savoir! Cela montre simplement que je devrais lire les choses un peu plus attentivement. :)
Sam Peacey
3

En plus de la réponse de Brian, vous pouvez également p(coller) et y(copier) la nouvelle valeur, donc si vous souhaitez remplacer la valeur entre guillemets par une autre valeur, vous pouvez faire yi"sur la sélection que vous souhaitez copier, vi"pour sélectionner la zone que vous souhaitez remplacer, puis juste ppour remplacer correctement la valeur.

Ulisses Caon
la source
0

La réponse choisie convient UNIQUEMENT à ViM mais PAS à vi. La question est également inexacte parce que l'auteur n'a pas mentionné la position initiale du curseur. Si nous supposons que le curseur est à l'intérieur des guillemets, alors pour vi, la réponse sera:

T"ct"

Où:

T "- reculer juste après le caractère"

c - commande de changement

t "- fournit la position de fin de la commande c, où elle doit arrêter d'effacer les caractères, en d'autres termes la plage à changer

utilisateur1337
la source