4 votes

`vi{` augmente la sélection visuelle, mais puis-je réduire la sélection visuelle de manière similaire?

Alors, si j'ai du texte comme suit:

if answer == 42 {                        #1
    if bugs == 'bunny' {                 #2
        if injury == 'but a scratch' {   #3
            // do the thing              #4
        }                                #5
    }                                    #6
}                                        #7

et que j'ai mon curseur sur // do the thing et que je fais la commande va{, je sélectionnerai alors les {} des lignes 3 à 5, et si je refais a{, je sélectionnerai les {} des lignes 2 à 6.

Mais oh non, je réalise maintenant que je voulais en fait seulement sélectionner les {} des lignes 3 à 5. À mon horreur, la méthode habituelle de vim de capitalisation => opposé ne fonctionne pas et A{ ajoute simplement un { à la fin de la ligne.

Puis-je passer d'une grande sélection à une plus petite sans annuler la sélection, déplacer mon curseur et tout refaire à partir de zéro? Dans cet exemple, il serait également assez simple d'utiliser certains des hjklwbeo pour modifier manuellement la sélection, mais en pratique, les blocs de code sont longs et complexes.

Je suis conscient que cela pourrait être ambigu s'il y a plusieurs blocs frères dans un bloc parent, mais je serais satisfait de simplement sélectionner le premier car cela m'arrive rarement.

Merci!

Édition: Un plugin qui fait cela serait une bonne alternative. S'il semble qu'aucun n'existe, je vais créer un MVP rapide et poster un lien ici pour récolter des commentaires.

4voto

romainl Points 55506

Les objets texte vont toujours vers l'extérieur, donc même si vous essayez quelque chose comme i{, qui couvre une région plus petite que a{, la sélection s'étendra inévitablement.

Comme vous l'avez mentionné, vous pouvez modifier la géométrie de la sélection avec o et divers mouvements mais c'est fastidieux et l'alternative, sortir du mode visuel, déplacer le curseur et sélectionner à nouveau, est malheureusement tout aussi fastidieuse.

Il pourrait être possible de créer un pseudo objet texte "rétrécissant" personnalisé, et quelque chose que la communauté accueillerait probablement avec joie.

--- MODIFIER ---

Le code rapide et simple ci-dessous semble fonctionner assez bien pour a{, a(, a[ et a<:

function! InvertObject()
    call getline('.')[getcurpos()[2] - 1]->search('b')
endfunction
xnoremap A{ call InvertObject()va{
xnoremap A( call InvertObject()va(
xnoremap A[ call InvertObject()va[
xnoremap A< call InvertObject()va<

Voir :help getcurpos(), :help getline() et :help search().

Ajouter des variantes "internes" pourrait être plus compliqué car, en fonction de divers paramètres, le curseur pourrait ne pas toujours se retrouver à la même position.

Pour plusieurs raisons, l'extrait ci-dessus ne peut pas être utilisé tel quel pour les objets texte suivants:

  • aw, aW, as et ap, car ils ne sont pas vraiment délimités par des jetons spécifiques. as pourrait être le plus facile à ajouter, cependant.
  • at, car les jetons délimiteurs sont plus complexes qu'un simple caractère.
  • a', a" et a`, car ils ne s'étendent pas de la même manière que leurs cousins "parenthèses", ils nécessitent donc une logique complètement différente.

2voto

mattb Points 938

Sur la base de votre publication, j'ai décidé de créer le plugin vim-visual-history qui garde un enregistrement traversable des sélections visuelles précédentes avec [v, ]v, [V et ]V. La version en minuscules de ces commandes prend également un compteur. Donc dans votre cas, il vous suffirait de faire [v pour revenir à une sélection précédente.

[count][v : Re-sélection de la sélection visuelle précédente
[count]]v : Re-sélection de la sélection visuelle suivante
[V : Re-sélection de la première sélection visuelle
]V : Re-sélection de la dernière sélection visuelle

entrer la description de l'image ici

Démonstration des commandes prenant un compteur :

entrer la description de l'image ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X