Ersetzen. mit -> an bestimmten Stellen

7

Manchmal muss ich ersetzen .mit , ->wenn der Code zu fixieren.

Normalerweise kann Suchen und Ersetzen nicht verwendet werden, da es viele (Hunderte von) Punkten ( .) gibt und nur einige von ihnen geändert werden müssen.

Allerdings habe ich die , die finden, die geändert werden müssen , wenn ich durch ein Make werde Änderungsliste .

Die Verwendung des Wiederholungsoperators funktioniert nicht ganz, denn wenn ich eine Instanz ändere und dann mit dem Punktbefehl wiederhole, erhalte ich Folgendes:

structBlah->.memberBlah

Wenn ich dann xden fremden Punkt lösche, funktionieren Einfügen und Punkt nicht mehr, da die letzte Änderung ein Löschen war.

Grundsätzlich besteht das Problem darin, dass der Wiederholungsoperator eine Bewegung und eine Bearbeitung wiederholt, während wir hier zwei Änderungen wiederholen müssen: eine Löschung und eine Einfügung.

Gibt es eine bequeme Möglichkeit, dies zu tun? Eine Idee, die ich hatte, war, vielleicht ein Makro wie dieses zu verwenden:

xi-><ESC>
Tyler Durden
quelle
Mit welchen Befehlen nehmen Sie die erste Änderung vor? Mein erster naiver Versuch, a<BS>-><Esc>(ebenfalls i<Del>-><Esc>) Befehle sind für mich perfekt wiederholbar.
Random832
Verwenden Sie sstatt i, um ein Zeichen zu löschen und in den Einfügemodus zu wechseln.
Shahbaz

Antworten:

8

Der Befehl cw (Wort ändern) löst Ihr Problem.

Setzen Sie den Cursor auf den Punkt und geben Sie ihn ein cw-><Escape>

etwas anderes

verwandelt sich in

etwas-> etwas anderes

und der .Operator wird weiterhin arbeiten, da cw eine Operation ist, die sowohl das Löschen als auch das Ersetzen ausführt.

DoYouEvenCodeBro
quelle
1
Ich habe nie daran gedacht, ein Änderungswort für ein einzelnes Zeichen zu verwenden. Das macht durchaus Sinn. Ich wusste nicht, dass eine Periode als "Wort" betrachtet wird. Gibt es einen Befehl "Zeichen ändern" (Zeichen löschen und Eingabemodus aufrufen)?
Tyler Durden
1
@ Tyler Durden Change ist eigentlich ein Befehl, dem jede Bewegung folgen kann, ähnlich wie der Löschbefehl (d). Sie können also cl eingeben, um das Zeichen nach links zu ändern, c2l, um 2 Zeichen zu ändern, c $, um das Zeilenende zu ändern, ct; zu Semikolon ändern, etc ...
DoYouEvenCodeBro
8
Die Verwendung von cw für ein einzelnes Zeichen ist zu viel Eingabe. Verwenden Sie einfach s.
Kevin
1
@ Tyler Durden Haha, hast du überhaupt meine Lösung ausprobiert? Das Gleiche gilt für weniger Tastenanschläge. Ersatz sfür cwund haben Sie es.
Tumbler41
11

Sie könnten die verwenden s Operator verwenden, der das Zeichen unter Ihrem Cursor löscht und Sie in den Einfügemodus versetzt. Sie können dann den Ersatz eingeben und später verwenden ., um den gesamten Ersatz zu wiederholen. Workflow wird:

  1. /\. um alle Perioden hervorzuheben.
  2. n zum ersten Punkt
  3. s-> und dann Esc . Dadurch wird der Punkt ersetzt und der Text mit einem einzigen Vorgang eingefügt.
  4. n zum nächsten Punkt
  5. . bei Bedarf ändern.

:h s Für mehr Information.

Tumbler41
quelle
Wie ich in meiner Frage sagte, ist dies nicht praktikabel, da es Hunderte von Punkten und nur wenige bestimmte Stellen gibt, an denen der Austausch durchgeführt werden muss.
Tyler Durden
3
Ok, an diesem Punkt wird Ihr Problem zu einem Filterproblem, was Sie nicht gefragt haben. Ich habe versucht, Ihre Frage zu zwei Änderungen zu beantworten. Jetzt kann es in einem gemacht werden. Ich empfehle Ihnen, Ihre Frage zu bearbeiten, wenn das Problem tatsächlich darin besteht, die zu ersetzenden Punkte zu finden.
Tumbler41
1
Ich sagte , speziell in meiner Frage „... Suchen und Ersetzen kann nicht verwendet werden , weil es viele sein (mehrere hundert) Punkte (.) Und nur ein paar ausgewählt diejenigen von ihnen muss geändert werden“ . Die Änderungsliste wird verwendet, um die Fälle zu finden, in denen die Änderung vorgenommen werden muss, wie in meiner Frage angegeben.
Tyler Durden
1
Nehmen Sie die Änderung dann einmal mit der soben vorgeschlagenen Lösung vor, und Sie können sie für das nächste Element in Ihrer Änderungsliste verwenden.
nobe4
2
@ TylerDurden Dies ist kein Suchen und Ersetzen; @ tumbler41 schlug vor, die Suche zu verwenden und sie nzu finden, aber die Schlüsseloptimierung hier ist die Verwendung von s->Esc. Mit diesen vier Tastenanschlägen wird die .gewünschte Textänderung erstellt, und Sie können diese Aktion verwenden, wo immer Sie möchten.
Desty
7

Ich empfehle die Verwendung des Ersatzbefehls:

:%s/\./->/gc

Dieser Wille:

:%s     substitute over all lines
/\.     match dot
/->     replace by arrow
/g      replace all on lines
c       ask for confirmation

Dies wird alles durchgehen . Ihre Datei und jedes Mal fragen, ob Sie ersetzen möchten.

Drücken Sie yfür Ersatz,n um zum nächsten Punkt zu gelangen.

siehe :h :s_cfür alle Optionen.

nobe4
quelle
1
Wie gesagt, dies ist nicht praktikabel, da es Hunderte von Punkten und nur wenige bestimmte Stellen gibt, an denen der Austausch durchgeführt werden muss.
Tyler Durden
1
Sie können ersetzen :%mit :g/.../auf passenden Linien nur Ersatz, mit :'<,'>für die aktuell ausgewählten Linien oder mit :.oder :für die aktuelle Zeile und die Verwendung @:des Befehls auf bestimmte Zeilen zu wiederholen , dass Sie in einer anderen Art und Weise navigieren.
Deltab
7

Wenn Sie keine Substitution oder den Punktbefehl verwenden möchten, wie in den anderen Antworten vorgeschlagen, ist es wahrscheinlich am besten, ein Makro zu erstellen, das Sie verwenden können, wenn sich Ihr Cursor neben einem Punkt befindet.

Sie können das Makro aufzeichnen

qaf.vc->^[q

Mit dem folgenden Punkt in der Zeile ( f.) wird es visuell ausgewählt ( v) und ersetzt ( c->).

Wenn Sie nun in Ihrem Code navigieren und einen Punkt erkennen, der geändert werden soll, können Sie das Makro mit aufrufen @a.

Sie können das sogar in Ihre einfügen .vimrc, um das Makro zwischen verschiedenen Codierungssitzungen zu halten:

let @a="f.vc->^["

Bearbeiten Sie @gro♀ und schlagen Sie in den Kommentaren vor, ein zweites Register zu verwenden, um ein sich rückwärts bewegendes Makro zu erhalten, was ziemlich nützlich erscheint:

let @e="F.vc->^["
statox
quelle
Das würde ich tun. Der einzige Unterschied ist, dass ich zwei Register let @q="F.vc->^["und verwenden würde let @w="f.vc->^[""und einen vorherigen Punkt und einen nächsten Punktbefehl hätte .
gro♀
@gro♀: Ich habe nicht darüber nachgedacht, aber das ist klug :-)
statox
Benötigen Sie keine <ESC>vor dem qim Makro? (Ich habe keinen Zugriff auf einen Computer, daher habe ich ihn nicht getestet.)
Loovjo
@loovjo: du hast recht ich werde das bearbeiten, danke!
Statox