Ich versuche, viel C / Perl-Code über Vim zu lesen, der viele Ein-Buchstaben-Variablennamen enthält.
Es wäre schön, einen Befehl zu haben, der mir helfen könnte, den Namen einer Variablen in einen aussagekräftigeren zu ändern, während ich gerade den Code lese, damit ich den Rest schneller lesen kann.
Gibt es in Vim einen Befehl, mit dem ich das schnell erledigen kann?
Ich glaube nicht, dass Regexe funktionieren würden, weil:
Der gleiche Name eines einzelnen Buchstabens kann in verschiedenen Bereichsblöcken unterschiedliche Zwecke haben
Die gleiche Buchstabenkombination könnte Teil eines anderen größeren Variablennamens sein oder in einer Zeichenfolge oder einem Kommentar ... möchte diese nicht ändern
Irgendwelche bekannten Lösungen?
quelle
:
zweimal Doppelpunkt ( ) drücken . Als ich es zum ersten Mal drückte, sah ich:'<,'>
. Wenn ich nurs/
von dort aus tippte , funktionierte es nicht. Ich musste vor dem einen weiteren Doppelpunkt eingebens/
.<C-R>
den Ersatzbefehl nicht benötigen. Wenn Sie die Suche einfach weglassen, verwendet vim das zuletzt gesuchte Muster, das in diesem Fall aus demgd
Befehl erstellt wurde. Es reicht also aus, es einfach zu tun:s//<newname>/gc
.AFAIK, es gibt keine tatsächliche Refactoring-Unterstützung in VIM. Bei einer Umbenennung mit der Absicht eines Refaktors treffe ich normalerweise die folgenden Vorsichtsmaßnahmen:
Meine Endänderung sieht ungefähr so aus
Ich würde gerne falsch liegen, wenn es kein Refactoring-Tool für VIM gibt, aber ich habe es nicht gesehen.
quelle
Ich weiß, dass es eine alte Frage ist, und @ mykola-golubyevs Weg ist offensichtlich die beste Antwort für den speziellen Fall in der OP-Frage (die vermutlich verschleierten Code durchläuft, bei dem Sie wahrscheinlich mehrere Blöcke mit denselben Variablennamen haben). ;; Aber mit dem Namen dieser Frage suchen viele Leute, die von Google Search hierher kommen, wahrscheinlich nach weniger situationsspezifischen Möglichkeiten, Variablen in VIM umzubenennen - und diese können präziser sein
Ich bin überrascht, dass niemand so vorgeschlagen hat:
Das
*
ist die gleiche wiegn
- es ist für das nächste Vorkommen des Wortes unter Cursor sucht , und es wird die letzte Muster gesucht, so dass , wenn Sie das Suchmuster in dem Ersatz Befehl weglassen, VIM setzt dies voraus , das Muster zu suchen ist.Für kleine Mengen von Var-Kopien eine noch schnellere:
Suche nach Vorkommen,
cw
ist der Befehl zum Ändern des Wortes , wechseltn
zum nächsten Vorkommen des zuletzt gesuchten Begriffs und.
wiederholt den letzten Befehl (das ist das Ändern des Wortes in NEWNAME ).(Credits für mich, das alles zu wissen, gehen an @doomedbunnies auf Reddit )
Ein weiterer cooler Trick ist folgender: ( Credits für @ nobe4 )
cgn
ist "Ändern, was auch immer das Ergebnis ist (nächstes Vorkommen finden)". Jetzt, da dies der letzte Befehl ist , müssen Sie nichtn
mehr zum nächsten Vorkommen wechseln, also wieder weniger Striche und, was noch wichtiger ist, müssen Sie nicht abwechselnn
und.
. Aber offensichtlich hat dieser den Nachteil, dass es nicht möglich ist, ein Ereignis zu überspringen.Hier sind einige Vorteile:
*
odergn
zur Wortauswahl ist sehr schnell - nur ein Tastendruck (sagen wir mal 1,5)*
oder stellengn
Sie sicher, dass Sie keine Übereinstimmungen mit anderen Worten erhalten, genau wie dies der:%s/<C-R>//gc
Fall ist. Beats, die:%s/\<OLDNAME\>/NEWNAME/gc
von Hand tippen : Ich persönlich vergesse oft, die\<
Dinge zu verwenden, um Übereinstimmungen nur auf ganze Wörter zu beschränken.n
, um unerwünschte Übereinstimmungen zu überspringen - wahrscheinlich sogar weniger als die zusätzlichen Striche, die zum Einschränken des Bereichs erforderlich sind. Unter normalen Umständen sind Ihre Variablen höchstwahrscheinlich ohnehin etwas in einem bestimmten Codeblock lokalisiert.quelle
Tragen Sie dies in Ihre .vimrc ein
Nennen Sie es mit
:call Rnvar()
expand("<cword>")
Ruft das Wort unter den Cursor. Die Suchzeichenfolge verwendet%
für Datei-Umfang und die\(\W\)
aussehen Muster für Nicht-Wort - Zeichen an der Grenze des Wortes, zu ersetzen und sie in Variablen speichern\1
und\2
so wie im Ersetzungsmuster wieder eingesetzt werden.quelle
Sie können den Modifikator 'c' in der globalen Suche und Ersetzung verwenden, der Sie für jede Ersetzung um Bestätigung bittet. Es würde länger dauern, aber es könnte für eine nicht humongous Codedatei funktionieren:
Das c steht für bestätigen.
quelle
In c können Sie möglicherweise mit cscope einige Fortschritte erzielen. Es wird versucht, die Syntax zu verstehen, sodass Sie wissen können, wann der Buchstabe eine Variable war.
quelle
Wenn dies mehrere Dateien umfasst, sollten Sie sich sed ansehen. Verwenden Sie find, um Ihre Dateien und xargs plus sed für einen Ersatz abzurufen. Angenommen, Sie möchten a in allen Dateien, die mit * .c übereinstimmen, durch a_better_name ersetzen
finden . -name "* .c" | xargs sed -i -es / a / a_better_name / g '
Denken Sie daran, dass dies ALLE Vorkommen von a ersetzt, sodass Sie möglicherweise einen robusteren regulären Ausdruck wünschen.
quelle