Jak zamienić więcej niż jeden znak bez wchodzenia w tryb wstawiania

12

Mam plik z linią, która wygląda następująco:

foofoo.xy.barbar

Chcę zmienić xyTO gh. Starałem się zrobić 2r-> gh, ale oczywiście, że nie działa, gdyż otrzymuje xysię gg, a następnie przeniósł mój kursor jedno miejsce w lewo.

Czy można to zrobić bez wchodzenia w tryb wstawiania lub bez użycia znacznie większej liczby naciśnięć klawiszy (np. :s/xy/gh/)?

durron597
źródło
2
Rwchodzi w tryb wymiany. :help replace-modepo więcej informacji.
alxndr
Próbowałem vt.rgh. Ale wynik był taki sam jak twój, z wyjątkiem pozycji kursora.
Gonçalo Ribeiro
2
Dlaczego nie chcesz wejść w tryb wstawiania? Coś takiego cwgh<esc>działałoby dobrze.
Klamka
1
@ durron597 Nie jestem pewien, czy minimize-keystrokesto dobry tag, to nie jest zwykle naprawdę to, co jest pytanie o jako taki. (Odrzuciłem proponowane przez ciebie zmiany) ... Może powinieneś porozmawiać na meta?
Martin Tournoij,

Odpowiedzi:

19

Jeśli nowy tekst ma taką samą długość jak stary tekst, tryb zastępowania Vima jest opcją. Z trybu normalnego R(to jest wielkie „r”) przenosi cię do trybu zastępowania. Jest to podobne do „zastępowania” w niektórych innych edytorach tekstu: zamiast wstawiać nowe znaki, jak w trybie wstawiania, pisanie zastąpi znak pod kursorem, a następnie przejdzie do następnego kursora. (Pomyśl o tym jak o małych literach r, ale więcej niż o jednym znaku na raz.) Znajdź dokumentację dotyczącą trybu zastępowania :help replace-mode.

W twoim przypadku: kursorem pomiędzy .i przejdź xdo trybu zastępowania, naciskając R. Teraz, gdy gpiszesz, zamienia „x” i przechodzi do następnego znaku, więc możesz pisać, haby zastąpić „y”. Twoja edycja jest teraz zakończona, więc Escapepowróć do normalnego trybu.

(Działa to, gdy tekst zastępujący ma taką samą długość jak stary tekst, ale jeśli zastąpienie jest dłuższe lub krótsze, cmoże być wszystkim, czego potrzebujesz: zastąpi 1 tekst w ruchu, a następnie tekst, który następnie wpiszesz. wiele sposobów, aby uczynić stosowanie c, na przykład: z kursorem między .i x, ct.ABCEscapemówi c mień tekst (up ' t il następnego .) z «ABC»).


1 Pociągnie tekst w ruchu do nienazwanego / "rejestru, a następnie przełączy się do trybu wstawiania, aby można było wpisać coś, co go zastąpi, a następnie z Escapepowrotem do trybu normalnego.

alxndr
źródło
2
Działa to w tym przypadku. Co jeśli chcesz zamienić te 2 znaki na powiedz 3 znaki?
Gonçalo Ribeiro,
1
Dobre pytanie; zmieniono, aby uwzględnić sposób obsługi tekstu o różnej długości.
alxndr
Tak, znam to. Ale w ten sposób wchodzisz w tryb wstawiania i byłem ciekawy, czy istnieje sposób, aby w tym przypadku nie używać trybu wstawiania. Nie dlatego, że uważam to za bardzo przydatne (a jednak mogę się mylić).
Gonçalo Ribeiro
1
Prefiks z cyfrą nzastępującą do-tego nwystąpienia znaku docelowego. Jest to przydatne do zastępowania części etykiet formatem w_x_y_zi a-b-c-d. Użyj fzamiast, taby usunąć również ograniczający znak.
pkfm,
5

Można to zrobić na kilka sposobów, ale najprostszy, jaki mogę wymyślić, to:

TL; DR

fxcw<REPLACEMENT TEXT>

Wyjaśnienie

  • fxskacze do x (patrz help *f*)
  • cwmówi, aby zmienić słowo (patrz :h *c*, :help *w*i :help cwuzyskać więcej informacji), usuwając tekst „xy” i wchodząc w tryb wstawiania, umożliwiając wstawienie tam, co chcesz.
  • <TEKST ZAMIENNY> to wszystko, co chcesz zastąpić - „gh” w twoim przykładzie.

Zaletą tego podejścia jest to, że używa on bardzo często używanych poleceń do manipulacji tekstem i nawigacji. Innym jest to, że „xy” może mieć dowolną długość, a to i tak będzie działać.

Te cwprace, ponieważ obiekt jest tekst otoczony okresów ( .), które działają jako granica do słowa.

Jeśli kursor znajduje się już na znaku „y” (lub dowolnym znaku w tekście, który ma zostać zastąpiony), możesz użyć ciw<REPLACEMENT TEXT>. To mówi vimowi, aby zmienił słowo, w którym się znajdujesz, nawet jeśli nie jesteś na początku. Zobacz :help text-objectswięcej informacji na temat ciwobiektów tekstowych w ogóle.

Ankieta Cody
źródło
czy to nie umieści go w trybie wstawiania?
elyashiv
1
Ach - nie zrozumiałem tej części jego pytania. W takim przypadku tak - R jest najbardziej odpowiednim rozwiązaniem.
Cody Poll
3

Tryb zamiany:

Rgh<Esc>

jest najbardziej oczywistym rozwiązaniem, jeśli zamiennik ma taką samą długość jak oryginał, ale możesz także:

2sgh<Esc>

lub:

cegh<Esc>
romainl
źródło