Ich habe eine Datei mit einer Zeile, die so aussieht:
foofoo.xy.barbar
Ich möchte das ändern xy
zu gh
. Ich habe versucht zu tun 2r-> gh, aber offensichtlich , die nicht funktioniert hat, wie es die ersetzt xy
mit gg
und 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/)?
replace
repeated-commands
durron597
quelle
quelle
R
wechselt in den Ersetzungsmodus.:help replace-mode
für mehr Informationen.vt.rgh
. Das Ergebnis war jedoch bis auf die Cursorposition das gleiche wie das Ihre.cwgh<esc>
würde gut funktionieren.minimize-keystrokes
es 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?Antworten:
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
.
undx
in 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
c
mö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 machenc
, zum Beispiel: mit dem Cursor zwischen dem.
undx
, ct.ABC
Escapesagt 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.quelle
n
, die bis zumn
-ten Vorkommen des Zielzeichens ersetzt. Dies ist nützlich, um Teile von Etiketten durch das Formatw_x_y_z
und zu ersetzena-b-c-d
. Verwenden Sief
stattt
, um auch das einschränkende Zeichen zu entfernen.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
fx
springt dich zum x (siehehelp *f*
)cw
sagt, dass Sie das Wort ändern sollen (siehe:h *c*
,:help *w*
und:help cw
für weitere Informationen), den "xy" -Text entfernen und in den Einfügemodus wechseln, damit Sie alles, was Sie wollen, genau dort platzieren können.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
cw
funktioniert, 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-objects
für weitere Informationen überciw
und Textobjekte im Allgemeinen.quelle
Ersetzungsmodus:
ist die naheliegendste Lösung, wenn der Austausch dieselbe Länge wie das Original hat, Sie aber auch Folgendes tun können:
oder:
quelle