Restreindre les opérations à une section de code

10

Il y a plusieurs fois dans ma vie professionnelle quotidienne que je dois opérer sur une fonction spécifique, des choses comme la mise en évidence ou la recherche d'une variable, mais je n'ai jamais réussi à limiter la portée des modifications / recherche.

Existe-t-il un moyen dans vim de dire de manière sélective, de trouver toutes les références à l' $colorintérieur de ces ensembles d'accolades, ou ce pli, etc. Si possible, il serait idéal que ce soit relativement générique, afin qu'il puisse être appliqué à l'édition / remplacement de texte.

Par exemple:

$color = "#fff";
function PickColor () {
  $color = "#bbb";
  $newColors = ["#000", "#fbf", $color];
  foreach ($newColors as $c) {
    if ($c == "#fff") {
       break;
    }
  }
}
$differentColor = $color;

Ce code est un exemple relativement mauvais, cependant, si je devais remplacer toutes les instances de $ color, comment procéder dans le contexte de la fonction PickColor. Comme autre exemple, en utilisant #et *Vous pouvez passer à l'instance suivante de cet objet texte, comment limiteriez-vous la portée de la recherche à cette fonction (en gros, la recherche) opposée au fichier entier qui pourrait s'étendre sur des milliers de lignes et perdre votre place, ou remplacer incorrectement quelque chose dans une autre fonction que vous ne devriez pas avoir?

Kyle Mcgill
la source

Réponses:

15

Voici quelques façons de procéder.

1  | $color = "#fff";
2  | function PickColor () {
3  |     $color = "#bbb";
4  |     $newColors = ["#000", "#fbf", $color];
5  |     foreach ($newColors as $c) {
6  |         if ($c == "#fff") {
7  |             break;
8  |         }
9  |     }
10 | }
11 | $differentColor = $color;

J'ai modifié votre exemple pour inclure des numéros de ligne.

Alors maintenant, vous pouvez remplacer les instances de $color, par exemple $newColor, des manières suivantes.

Plages de numéros de ligne

:1,11s/\$color/$newColor/g

Cela rend la substitution opérer sur les lignes 1-11 inclus.

Plages de lignes relatives

Placez votre curseur sur la ligne 1, puis ...

:.,11s/\$color/$newColor/g

Cela signifie que la plage commence par la ligne actuelle et se termine sur la ligne 11.

Plages de sélection visuelles

Allez à la ligne 1 et appuyez sur Shift+Vpuis G. Cela sélectionne visuellement la ligne 1. Ensuite ...

:'<,'>:s/\$color/$newColor/g

Cela limite la substitution à la plage couverte par votre sélection. Vim insérera automatiquement la '<,'>plage pour vous lorsque vous appuyez sur :avec une sélection active.

Quincy Bowers
la source
J'adore vim, il y a toujours quelque chose à apprendre et à découvrir pour rendre la vie plus facile et au quotidien :)
Kyle Mcgill
6

Si vous êtes à l'aise de prendre la route du plugin, il y a NrrwRgn .

Vous sélectionnez visuellement un bloc, puis exécutez la :NRcommande, qui ouvre un nouveau tampon (dans une division) avec le texte sélectionné. Vous pouvez apporter des modifications à ce tampon, et lorsque vous l'enregistrez, il est également enregistré dans le fichier d'origine.

À mon avis, ce plugin résout très bien le problème, vous permettant de vous concentrer sur les opérations que vous souhaitez faire sans repenser comment les appliquer à une plage spécifique.

tommcdo
la source
C'est l'un des plugins que je jure .. c'est comme avoir un petit tampon de travail que vous pouvez remettre dans votre fichier de code normal.
craigp
3

Vous sélectionnez le bloc qui vous intéresse en mode ligne visuelle (shift + v) puis vous tapez :et votre commande qui s'appliquera désormais au bloc.

Donc, si vous souhaitez remplacer dans la sélection, vous pouvez exécuter :s/string/replacement_string

Stefan Dorunga
la source
droite; par exemple,VaB:s/\$color/replaced/g
wchargin
Je viens d'ajouter ça, bon point :)
Stefan Dorunga
0

Utilisez l'objet texte accolades '}' et sélectionnez à l'intérieur des accolades avec 'i}'

sur la ligne avec l'accolade ouvrante de la fonction:

$<C-V>i}:s/\$color/$newColor/g

allez d'abord à la fin de la ligne (qui sera sur ou à l'intérieur de l'accolade ouvrante) puis pour aller en sélection visuelle, puis sélectionnez en utilisant l'objet texte accolades. 'i}' est à l'intérieur des accolades 'a}' est autour des accolades.

Pour les langages sans accolades, Vim Text Object: The Definitive Guide suggère quelques plugins:

  • Pour les langages comme Python et CoffeeScript, Indent Object fournit des objets texte basés sur le niveau d'indentation: aiinclut le niveau d'indentation actuel et la ligne ci-dessus; iicomprend le niveau d'indentation actuel à l'exclusion de la ligne ci-dessus.
  • Ruby Block ajoute la prise en charge des objets texte aret ir, en fonction de la présence du endmot - clé.
user50136
la source