So ersetzen Sie mehr als ein Zeichen, ohne in den Einfügemodus zu wechseln


12

Ich habe eine Datei mit einer Zeile, die so aussieht:

foofoo.xy.barbar

Ich möchte das ändern xyzu gh. Ich habe versucht zu tun 2r-> gh, aber offensichtlich , die nicht funktioniert hat, wie es die ersetzt xymit ggund zog dann meinen Cursor um eine Stelle nach links.

Gibt es eine Möglichkeit, dies zu tun, ohne in den Einfügemodus zu wechseln oder ohne viel mehr Tastenanschläge zu verwenden (z. B. :s/xy/gh/)?


2
Rwechselt in den Ersetzungsmodus. :help replace-modefür mehr Informationen.
Alxndr

Ich habe es versucht vt.rgh. Das Ergebnis war jedoch bis auf die Cursorposition das gleiche wie das Ihre.
Gonçalo Ribeiro

2
Warum möchten Sie nicht in den Einfügemodus wechseln? So etwas cwgh<esc>würde gut funktionieren.
Türknauf

1
@ durron597 Ich bin mir nicht sicher, ob minimize-keystrokeses sich um ein gutes Tag handelt. Normalerweise geht es nicht wirklich darum , worum es bei der Frage geht . (Ich habe Ihre vorgeschlagenen Änderungen abgelehnt) ... Vielleicht sollten Sie bei Meta diskutieren?
Martin Tournoij

Antworten:


19

Wenn der neue Text dieselbe Länge wie der alte Text hat, ist der Ersetzungsmodus von Vim eine Option. Aus dem normalen Modus R(das ist ein großes "r") gelangen Sie in den Ersetzungsmodus. Dies ähnelt dem "Überschreiben" in einigen anderen Texteditoren: Anstatt wie im Einfügemodus neue Zeichen einzufügen, wird durch Eingabe durch Eingabe das Zeichen unter dem Cursor ersetzt und anschließend zum nächsten Cursor weitergeleitet. (Stellen Sie sich das wie Kleinbuchstaben vor r, jedoch für mehr als nur ein Zeichen gleichzeitig.) Suchen Sie die Dokumentation zum Ersetzen durch :help replace-mode.

In Ihrem Fall: Wechseln Sie mit dem Cursor zwischen .und xin den Ersetzungsmodus, indem Sie drücken R. Wenn Sie jetzt eingeben g, ersetzt es das "x" und wechselt zum nächsten Zeichen, sodass Sie eingeben können h, um das "y" zu ersetzen. Ihre Bearbeitung ist jetzt abgeschlossen, Escapeum zum normalen Modus zurückzukehren.

(Dies funktioniert, wenn Ihr Ersatztext dieselbe Länge wie der alte Text hat. Wenn Ihr Ersatztext jedoch länger oder kürzer ist, ist dies cmöglicherweise alles, was Sie benötigen: Er ersetzt 1 den Text innerhalb einer Bewegung durch den Text, den Sie dann eingeben viele Möglichkeiten Gebrauch zu machen c, zum Beispiel: mit dem Cursor zwischen dem .und x, ct.ABCEscapesagt c hange den Text (bis ' t il die nächsten .) mit ‚ABC‘).


1 Der Text in der Bewegung wird in das unbenannte / "Register gezogen und dann in den Einfügemodus gewechselt, sodass Sie etwas eingeben können, um ihn zu ersetzen, und dann Escapein den normalen Modus zurückkehren.


2
Dies funktioniert in diesem Fall. Was wäre, wenn Sie diese 2 Zeichen durch beispielsweise 3 Zeichen ersetzen möchten?
Gonçalo Ribeiro

1
Gute Frage; geändert, um eine Möglichkeit zum Umgang mit Text unterschiedlicher Länge aufzunehmen.
Alxndr

Ja, das weiß ich. Auf diese Weise gelangen Sie in den Einfügemodus, und ich war gespannt, ob es in diesem Fall eine Möglichkeit gibt, den Einfügemodus nicht zu verwenden. Nicht, dass ich es für sehr nützlich halte (und dennoch könnte ich mich irren).
Gonçalo Ribeiro

1
Präfix mit einer Ziffer n, die bis zum n-ten Vorkommen des Zielzeichens ersetzt. Dies ist nützlich, um Teile von Etiketten durch das Format w_x_y_zund zu ersetzen a-b-c-d. Verwenden Sie fstatt t, um auch das einschränkende Zeichen zu entfernen.
pkfm

5

Es gibt einige Möglichkeiten, wie Sie dies tun können, aber die einfachste, die ich mir vorstellen kann, ist:

TL; DR

fxcw<REPLACEMENT TEXT>

Erläuterung

  • fxspringt dich zum x (siehe help *f*)
  • cwsagt, dass Sie das Wort ändern sollen (siehe :h *c*, :help *w*und :help cwfür weitere Informationen), den "xy" -Text entfernen und in den Einfügemodus wechseln, damit Sie alles, was Sie wollen, genau dort platzieren können.
  • <ERSATZTEXT> ist das, was Sie in Ihrem Beispiel durch "gh" ersetzen möchten.

Ein Vorteil dieses Ansatzes besteht darin, dass sehr häufig verwendete Textmanipulations- und Navigationsbefehle verwendet werden. Ein weiterer Grund ist, dass "xy" beliebig lang sein kann und dies immer noch funktionieren würde.

Das cwfunktioniert, weil Ihr Textobjekt von Punkten ( .) umgeben ist, die als Grenze zum Wort dienen.

Befindet sich Ihr Cursor bereits auf dem Zeichen "y" (oder einem beliebigen Zeichen im zu ersetzenden Text), können Sie verwenden ciw<REPLACEMENT TEXT>. Dies weist vim an, das Wort, in dem Sie sich befinden, zu ändern, auch wenn Sie nicht am Anfang stehen. Sehen Sie :help text-objectsfür weitere Informationen über ciwund Textobjekte im Allgemeinen.


Wird ihn das nicht in den Einfügemodus versetzen?
Elyashiv

1
Ah - hat diesen Teil seiner Frage nicht verstanden. In diesem Fall ist yes - R die am besten geeignete Lösung.
Cody Umfrage

3

Ersetzungsmodus:

Rgh<Esc>

ist die naheliegendste Lösung, wenn der Austausch dieselbe Länge wie das Original hat, Sie aber auch Folgendes tun können:

2sgh<Esc>

oder:

cegh<Esc>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.