Comment réaliser la sélection de différentes longueurs de textes sur différentes lignes?

10

supposons que j'ai les textes suivants:

aaa-dd-e: "aaa",
bb-x: "bb",
c-9: "c"

Je veux faire une sélection comme ci-dessous:

aaa-dd-e:"aaa",
bb-x:"bb",
c-9:"c"

J'ai essayé d'utiliser cv pour créer un bloc visuel, mais après avoir créé la sélection sur la première colonne et j'ai appuyé sur "f:" (je voulais étendre la sélection au signe deux-points sur chaque ligne comme ci-dessus), ce que j'obtiens est:

aaa-dd-e: "aaa",:
bb-x"bb",
c-9:"c"

la sélection s'arrête au premier deux-points et crée un rectangle.

Aaron Shen
la source
6
Que voulez-vous réaliser avec cette sélection, il pourrait y avoir une autre façon
Arjen Dijkstra
S'il est séparé par caractère, vous pouvez essayer de réaligner d'abord le bloc et le sélectionner ensuite. Voir: Aligner le texte uniquement sur le premier séparateur dans VIM
kenorb

Réponses:

6

La sélection est généralement un moyen d'arriver à une fin, plus encore à Vim où la sélection n'est souvent pas nécessaire en premier lieu.

En supposant que vous souhaitiez toujours mettre des guillemets autour des noms de propriété dans votre fichier non JSON pour le transformer en JSON approprié:

  1. sélectionnez les lignes à modifier, en caractère ou en ligne, peu importe,
  2. :'<,'>norm I"^[f:i"( '<,'>est automatiquement inséré pour vous et ^[est obtenu avec <C-v><Esc>).

Si vous avez le magnifique plugin surround, l'étape 2 devient:

:'<,'>norm ^vt:S"

Avec une substitution, l'étape 2 pourrait devenir:

:'<,'>s/^\s*\([^:]*\):/"\1"
romainl
la source
vous avez raison, je trouve maintenant que la sélection visuelle est probablement inutile. avec l'aide ou :g/regex/norm, je peux simplement réaliser tout ce que je veux faire.
Aaron Shen
Existe-t-il un moyen de mettre tout le bloc sélectionné dans le presse-papiers du système et de le coller dans un autre fichier?
Aaron Shen
Bien sûr. En supposant que votre Vim est compilé avec le support du presse-papiers, vous pouvez le faire "+you "*y, selon le presse-papiers que vous souhaitez cibler. Il existe de nombreuses questions connexes ici.
romainl
14

Vim prend uniquement en charge les sélections rectangulaires par blocs, à l'exception de la bordure droite dentelée lorsque vous appuyez sur $.

Il existe des plugins (comme les curseurs multiples de vim ) qui peuvent émuler plusieurs sélections, mais vous devriez également être en mesure d'atteindre votre objectif réel (que vous n'avez malheureusement pas mentionné) avec des commandes Vim pures, par exemple :globalet :substitute(si vous pouvez formuler un régulier expression qui correspond à la sélection dans chaque ligne), ou en répétant des macros (s'il y a un mouvement particulier qui couvre la sélection dans chaque ligne).

Ingo Karkat
la source
que faire si je veux couper ces lignes et les coller dans un autre tampon?
Aaron Shen
1

Juste pour jeter un autre chapeau dans le ring, si vous voulez vraiment utiliser la sélection visuelle, vous pouvez utiliser le plugin Tabular pour aligner les deux-points, puis faites votre sélection visuelle.

Si vous prenez votre texte d'origine:

aaa-dd-e: "aaa",
bb-x: "bb",
c-9: "c"

:Tab /:\zs alignera tout après les deux points, comme ci-dessous

aaa-dd-e:  "aaa",
bb-x:      "bb",
c-9:       "c"

Et puis vous pouvez faire votre sélection visuelle de bloc.

Comme d'autres l'ont dit, cependant, la sélection visuelle n'est probablement pas nécessaire dans cette situation. L'utilisation normou la substitution peut probablement accomplir ce que vous voulez sans vous soucier des sélections visuelles.

Zach Ingbretsen
la source
1

J'ai trouvé une solution à ce problème qui est étonnamment simple! Démarrez le mode de blocage visuel à partir du bas de la sélection du texte que vous souhaitez copier et sélectionnez vers le haut! Il étendra le bloc au fur et à mesure que vous montez, tandis que si vous le mettez en surbrillance vers le bas, il semble rendre la sélection plus petite.

Arthur Bowers
la source
Mais de cette façon, ce sera toujours un bloc rectangulaire, non? Comme je l'ai lu, ce n'est pas ce que l'OP veut (ils mentionnent qu'ils ont essayé le mode de blocage visuel).
Martin Tournoij
Non. Ce sera toujours un bloc rectangulaire si toutes les lignes ont la même longueur. J'ai constaté qu'en commençant par le bas et en surlignant vers le haut, puis en appuyant sur $ pour aller à la fin de la ligne, toutes les lignes en surbrillance seront mises en surbrillance jusqu'à la fin de la ligne.
Arthur Bowers