Refactoring von Code in überhöhtem Text 3

406
Wassadamo

Derzeit mache ich dies mit Find All( Cntrl+ F old_var, alt+ enter new_var), aber dies ersetzt Wörter in meinen Kommentaren und Zeichenfolgen.

Ein Kommentar in dieser Antwort schlug das PyRefactor-Plugin vor, für das ein Seil erforderlich ist . Diese Tools scheinen Standardwerte zu haben, die für meine Zwecke zu schwerfällig sind. Ich möchte nur Variablennamen in eigenständigen Python-Skripts mit Sublime Text 3 umgestalten.

Also in einem Skript wie

# Where did my hat go? hat = 0 print(hat) print("hat") 

Die hatVariable (nicht in Zeichenfolgen oder Kommentaren) kann bei Berührung eines Hotkeys durch etwas anderes ersetzt werden. Keine speziellen Projektordner / -Konfigurationen erforderlich, und bei mehreren Dateien hat sich nichts geändert. Tut leider Find All hat -> llama...

# Where did my llama go? llama = 0 print(llama) print("llama") 

BEARBEITEN:

Ich schätze @ Totos Regex-Lösung, aber ich bin noch nicht so fließend und möchte eine Methode, die konsistenter arbeitet und leichter zu merken ist. Gibt es ein Plugin (oder kann ich eines schreiben?), Das alle global definierten und angegebenen Variablen (Argumente in Funktionsaufrufen usw.) identifiziert und ein einfaches Suchen und Ersetzen ermöglicht?

2
Sie können wahrscheinlich einen Regex verwenden, um zu sehen, ob die Zeile mit # beginnt var firstName vor 5 Jahren 1
Haben Sie darüber nachgedacht, eine IDE zu verwenden, die das Refactoring so einfacher macht? Früher war ich Sublime treu, bis ich JetBrains IDEs entdeckte. DrZoo vor 5 Jahren 0

1 Antwort auf die Frage

1
Toto
  • Ctrl+H
  • Finden: (?:^(?<!#).*\K|(<?!"))\bhat\b(?!")
  • Ersetzen: llama
  • Überprüfen Sie den regulären Ausdruck
  • Ganzes Wort prüfen
  • Wrap überprüfen
  • Replace all

Erläuterung:

(?: ^ : beginning of line (?<!#) : negative lookbehind, zero-length assertion that makes sure we don't have # before .* : 0 or more any character \k : forget all we have seen until this position | : OR (?<!") : negative lookbehind, zero-length assertion that makes sure we don't have " before ) \b : word boundary to not match chat, remove it if you want to match chat also hat : literally \b : word boundary to not match hats, remove it if you want to match hats also (?!") : negative lookahead, zero-length assertion that makes sure we don't have " after 

Gegeben:

# Where did my hat go? hat = 0 chat = 0 print(hat) print("hat") print(chat) 

Ergebnis für gegebenes Beispiel:

# Where did my hat go? llama = 0 chat = 0 print(llama) print("hat") print(chat) 

Vor:

Nach dem:

Was ist mit "Roter Hut", oder "Roter Hut"? Beide werden ersetzt, sollten aber nicht Máté Juhász vor 5 Jahren 1
@ MátéJuhász: `" Roter Hut "` wird nicht ersetzt und `" Rot "+ Hut" wird zu "Rot" + Lama "Ist das nicht erwünscht? Toto vor 5 Jahren 1
ok, das ist klug, was ist mit "roter Mütze und Handschuhe"? Máté Juhász vor 5 Jahren 0
@ MátéJuhász: Natürlich wird es in diesem Fall nicht funktionieren :( In diesem Fall wird der Regex unlesbar. Dies zeigt die Grenze des Regex beim Parsen von nicht regulärer Sprache. Toto vor 5 Jahren 1
Kann immer mit Regex zur Rettung rechnen. Leider funktioniert dieser Fall auch nicht: `" Hat aß the hw "` wird zu "" Lama aß die hw "`. Wassadamo vor 5 Jahren 0
@Wassadamo: Richtig, es funktioniert nicht bei irgendeiner Saite wie `" blah hat blah "`. Ich weiß nicht, ob es ein Plugin gibt, das die Aufgabe erfüllt. Ich denke, der beste Weg ist, einen richtigen Parser zu schreiben. Toto vor 5 Jahren 0