Beschränken von Vorgängen auf einen Codeabschnitt

10

Es gibt viele Male in meinem täglichen Arbeitsleben, in denen ich eine bestimmte Funktion ausführen muss, z. B. das Hervorheben oder Suchen einer Variablen, aber ich habe es nie geschafft, den Umfang der Änderungen / Suche einzuschränken.

Gibt es in vim eine Möglichkeit, selektiv zu sagen, alle Verweise auf $colordiese Sätze von Klammern oder diese Falte usw. zu finden? Wenn möglich, wäre dies ideal, wenn dies relativ allgemein gehalten ist, damit es auf das Bearbeiten / Ersetzen von Text angewendet werden kann.

Als Beispiel:

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

Dieser Code ist jedoch ein relativ schlechtes Beispiel, wenn ich alle Instanzen von $ color ersetzen müsste, wie würde man dies im Kontext der Funktion PickColor tun. Als weiteres Beispiel: Verwenden von #und *Sie können zur nächsten Instanz dieses Textobjekts wechseln. Wie würden Sie den Suchbereich auf diese Funktion beschränken (im Grunde genommen die Suche umbrechen), im Gegensatz zur gesamten Datei, die Tausende von Zeilen umfassen und verlieren könnte? Ihr Platz oder falsches Ersetzen von etwas in einer anderen Funktion, die Sie nicht haben sollten?

Kyle Mcgill
quelle

Antworten:

15

Hier sind einige Möglichkeiten, dies zu tun.

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;

Ich habe Ihr Beispiel so geändert, dass es Zeilennummern enthält.

So , jetzt können Sie Instanzen ersetzen $color, mit sagen wir $newColor, auf folgende Weise.

Zeilennummernbereiche

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

Dadurch wird die Substitution auf den Zeilen 1 bis einschließlich 11 ausgeführt.

Relative Linienbereiche

Setzen Sie den Cursor auf Zeile 1 und ...

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

Dies besagt, dass der Bereich mit der aktuellen Zeile beginnt und in Zeile 11 endet.

Visuelle Auswahlbereiche

Gehen Sie zu Zeile 1 und drücken Sie Shift+Vdann G. Dadurch wird Zeile 1 visuell ausgewählt. Dann ...

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

Dies beschränkt die Ersetzung auf den Bereich, den Ihre Auswahl abdeckt. Vim fügt den '<,'>Bereich automatisch für Sie ein, wenn Sie :mit einer aktiven Auswahl drücken .

Quincy Bowers
quelle
Ich liebe vim, es gibt immer etwas zu lernen und zu entdecken, um das Leben einfacher und täglich zu machen :)
Kyle Mcgill
6

Wenn Sie die Plugin-Route bevorzugen , gibt es NrrwRgn .

Sie wählen visuell einen Block aus und führen dann den :NRBefehl aus, der einen neuen Puffer (in einer Teilung) mit dem ausgewählten Text öffnet. Sie können Änderungen an diesem Puffer vornehmen. Wenn Sie ihn speichern, wird er auch wieder in der Originaldatei gespeichert.

Meiner Meinung nach löst dieses Plugin das Problem sehr gut, sodass Sie sich auf die Operationen konzentrieren können, die Sie ausführen möchten, ohne zu überlegen, wie Sie sie auf einen bestimmten Bereich anwenden sollen.

tommcdo
quelle
Dies ist eines der Plugins, auf die ich schwöre. Es ist wie ein kleiner Scratch-Puffer, den Sie wieder in Ihre normale Codedatei übertragen können.
Craig
3

Sie wählen den Block aus, an dem Sie im visuellen Linienmodus interessiert sind (Umschalt + v), und geben dann :Ihren Befehl ein, der nun auf den Block angewendet wird.

Wenn Sie also in der Auswahl ersetzen möchten, können Sie ausführen :s/string/replacement_string

Stefan Dorunga
quelle
Recht; zBVaB:s/\$color/replaced/g
wchargin
Gerade hinzugefügt, guter Punkt :)
Stefan Dorunga
0

Verwenden Sie das Textobjekt '}' für Klammern und wählen Sie innerhalb der Klammern mit 'i}' aus.

auf der Linie mit der öffnenden geschweiften Klammer der Funktion:

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

Gehen Sie zuerst zum Ende der Zeile (die sich auf oder innerhalb der öffnenden Klammer befindet), um dann zur visuellen Auswahl zu gelangen, und wählen Sie dann mit dem Textobjekt der Klammern aus. 'i}' befindet sich in geschweiften Klammern 'a}' befindet sich in geschweiften Klammern.

Für Sprachen ohne geschweifte Klammern schlägt Vim Text Object: The Definitive Guide einige Plugins vor:

  • Für Sprachen wie Python und CoffeeScript bietet Indent Object Textobjekte basierend auf der Einrückungsstufe: aiEnthält die aktuelle Einrückungsstufe und die obige Zeile; iiEnthält die aktuelle Einrückungsstufe ohne die obige Zeile.
  • Ruby Block bietet Unterstützung für Textobjekte arund irbasierend auf dem Vorhandensein des endSchlüsselworts.
user50136
quelle