vim - jak mogę zrobić „zmień słowo” przy użyciu bieżącego bufora wklejania


86

Mam trochę tekstu w buforze wklejania, np. Zrobiłem yw(szarpnięcie słowa), a teraz mam „foo” w buforze.

Teraz przechodzę do słowa „pasek” i chcę go zastąpić buforem do wklejania.

Aby ręcznie zastąpić tekst, mógłbym to zrobić, cwa następnie wpisać nowe słowo.

Jak zrobić „zmienić słowo”, ale korzystać z zawartości bufora wklejania zamiast ręcznie wpisywać słowo zastępujące?

Najlepszą opcją, jaką mam teraz, jest przejście do początku słowa, które chcę zastąpić i zrobienie dw(usunięcie słowa), następnie przejście do drugiego miejsca i zrobienie yw(słowo szarpnięcia), a następnie powrót do obszaru wymiany i zrobienie p(wklej), co jest dość niezdarne, szczególnie jeśli nie ma ich na tym samym ekranie.

Odpowiedzi:


120

opcja 1

Możesz to zrobić za pomocą rejestrów i przypisać klucz do tego procesu.

Wybierz słowo, które chcesz zastąpić yw.

Wyszarpane słowo znajduje się w 0rejestrze, który można zobaczyć, wydając :registers.

Przejdź do słowa, które chcesz zastąpić, i zrób to cw. Wykonaj Ctrl+, ra następnie 0wklej 0rejestr.

Mapa tego wyglądałaby mniej więcej tak (zakładając Ctrl+ jjako naszą kluczową kombinację):

:map <C-j> cw<C-r>0<ESC>

Opcja 2 (prostsza)

Po przeciągnięciu słowa najedź kursorem na słowo, które chcesz zastąpić i zrobić viwp. Który jest wizualny, wybierz wewnętrzne słowo i wklej.

Dzięki uprzejmości @tlo w komentarzach: możesz to zrobić vep. O jeden krótszy. Minusem jest ustawienie kursora na początku słowa i (jak w moim) zmiana bufora.

Komentarz (od Michaela):

To jest dobre. Dodatkowa uwaga: druga metoda jest rzeczywiście łatwiejsza, ale jak na razie działa tylko dla JEDNEJ podstawienia, ponieważ po każdej zamianie bufor jest następnie zmieniany na pole, które zostało zastąpione (stary tekst). Pierwsza metoda jest nieco trudniejsza w użyciu, ALE ma tę zaletę, że bufor 0 pozostaje „taki, jaki jest”, dzięki czemu można użyć tej metody do wykonania więcej niż 1 zamiany tego samego tekstu.


14
Opcja 3 (jeszcze prostsza): po przeciągnięciu słowa kursor na pierwszy znak słowa, które chcesz zastąpić i zrobić vep.
tlo

Podoba mi się opcja 3, gdy można zmienić tylko 1 słowo. Jeśli do zmiany jest więcej niż jedno słowo, Opcja 1 pozwala mi użyć. operator to powtórzyć ..
typelogic

3
ve"0pbędzie działać, aby umożliwić Ci powtórzenie zmiany
JKillian

Jeśli zamierzasz odwzorować to na coś, prawdopodobnie lepiej jest użyć: map <C-j> ciw<C-r>0<ESC>aby nie miało znaczenia, z którego miejsca słowa wciśniesz ^j.
Paul Parker

Każdy, kto chce wiedzieć, dlaczego CTRL-R robi magię: :help insertprzeszukaj CTRL-R /CTRL-R. Jak to ve"0pdziała, spójrz na:help registers
Paul Parker

12

ywaby szarpać słowo, a następnie przesuń kursor do słowa, które chcesz zastąpić, i użyj "_dwgo, aby je usunąć, wysyłając tekst do rejestru zerowego (aby nie zastępował zawartości "rejestru, w którym domyślnie szarpany / wycięty tekst jest domyślnie ), a następnie po prostu wklej za pomocą p.

Możesz użyć następującego mapowania, aby trochę ułatwić:

nnoremap <leader>d "_d

... więc w trybie normalnym możesz użyć \dwdo usunięcia słowa bez wpływu na "rejestr.


3

Aby to zrobić w sposób VIM, celowo używasz rejestrów yank, kasowania i innych.

Rejestr "0jest rejestrem szarpanym. Wszystko, co będziesz szarpać, zostanie tu umieszczone, ale nigdy nie dotykaj rejestru "0.

W twoim przykładzie właśnie szarpnąłeś słowo. Aby zamienić słowo na to, co właśnie szarpnąłeś, skorzystaj z usunięć, które nigdy nie dotykają rejestru szarpnięć. Więc przenieść się do słowa docelowej, usuń ją dw, a następnie wklej ze swoją Yank zarejestrować się "0p, lub jeszcze lepiej, cwa następnie ^R0(który jest powtarzalny).

Przeciwnie do rejestru szarpnięć jest rejestr drobnych skasowań "-. Każde małe usunięcie lub zmiana jest tutaj umieszczone, ale szarpnięcia nigdy nie dotykają "-. Usunięcie liczy się jako małe, jeśli jest mniejsze niż pełna linia.

Rejestry "1- "9to rejestry usuwania historii. Z "1zawierający ostatnią dużą usunięcia lub zmiany usunięcie, a "9zawierający najstarszą dużą usunięcia lub zmiany usunięcie. Usuwane są tylko te, które nie są małe, tj. Usuwanie jednej lub więcej linii, na "1- "9.

Dla każdej operacji, która zmienia rejestr, kopia jest również zawsze umieszczana w domyślnym, nienazwanym rejestrze "". Jest to rejestr używany, gdy nie podajesz nazwy rejestru.

Rejestr "_jest rejestrem czarnej dziury i zawsze jest pusty. Jeśli go usuniesz, nic w żadnym rejestrze się nie zmieni, nawet ""rejestr domyślny lub sam rejestr czarnej dziury. Usunięty tekst zniknął całkowicie poza historią cofania. Szarpanie się lub wklejanie z rejestru czarnej dziury w zasadzie nic nie robi.

Rejestr czarnej dziury "_pozwala na takie rzeczy, jak najpierw jedno małe usunięcie, a następnie szereg innych usunięć "_bez zmiany rejestru małych usunięć "-, a następnie wklejenie pierwszego małego usunięcia.

Inne rejestry to ostatnio wstawiony rejestr "., rejestry nazw plików "%oraz "#rejestr poleceń, rejestr ":wyszukiwania "/i rejestr wyrażeń "=.

Możesz uzyskać listę wszystkich tych rejestrów i ich zawartości za pomocą polecenia :register. To polecenie jest bardzo przydatne do eksperymentowania i dowiadywania się, gdzie się kończy.


2

Potrzebuję tego tak często, napisałem wtyczkę, aby uprościć i zezwolić na maksymalną prędkość: ReplaceWithRegister .

Ta wtyczka oferuje polecenie dwa w jednym, grktóre zastępuje tekst objęty obiektem {motion} / text, całą linię (linie) lub bieżące zaznaczenie zawartością rejestru; stary tekst jest usuwany do rejestru czarnej dziury, tzn. zniknął. Przejrzysto obsługuje wiele skrzynek narożnych i pozwala na szybkie powtórzenie za pomocą standardowego .polecenia. Jeśli ci się to nie podoba, jego strona zawiera linki do alternatyw.


2

Aby powtórzyć wklej, użyj polecenia zmiany.

cw ^R0ESC (^ R = Control + R; 0 dla rejestru 0)

zastąpi słowo zawartością z reg. 0 i powtórzmy to.

Jest to świetne dla cgn(VIM 7.4), aby zastąpić wzorce wyszukiwania:

  • Pierwsze wyszukiwanie za pomocą /lub*
  • cgn ^R0ESC
  • .powtórzyć w następnym meczu lub npominąć

1

Ponieważ nie jest jeszcze uwzględniony, zwykle zamieniasz ciągi na :%s/.../.../i możesz to zrobić również ze słowem pod kursorem.

  1. Podajesz pierwszą część polecenia, czego szukasz: :s/find/
  2. Następnie kliknij <ctrl-r>i wybierz kursorem słowo, które chcesz zastąpić.
  3. Następnie kliknij <ctrl-w>(małe „słowo”) lub <ctrl-a>(duże ”słowo), aby wkleić słowo pod kursorem do wiersza polecenia
  4. Następnie dokończ polecenie.

Zobacz link o korzystaniu z kursora w wierszu poleceń .


1

Zwykle używam tego: ywszarpać foo, a następnie usuwać za barpomocą dw, a jako ostatni krok wstawiać fooz rejestru, 0który przechowuje szarpany tekst za pomocą "0p. W .razie potrzeby powtórz wprowadzanie za pomocą kropki ( ).

Ponadto zamiast ywi dwmożesz używać yiwi diw(zauważ dodatkowe i- oznacza to wewnątrz ). Dzięki temu możesz szarpać lub usuwać słowa z dowolnego miejsca w nim, nie tylko na początku słowa.


0

Używam tej wtyczki do rozwijania regionu wyboru: https://github.com/terryma/vim-expand-region

Tak więc moja kombinacja zmiany słowa będzie: vvpw dowolnym miejscu słowa.

Mam też hack do zapisywania nienazwanej zawartości rejestru po wklejeniu, więc mogę to powtórzyć.

vnoremap p p:let @"=@0 <CR>
vnoremap P P:let @"=@0 <CR>

(mój schowek jest automatycznie wybierany)


0

Korzystam z mapowania klawiszy poniżej, aby zastąpić bieżące słowo skopiowanym słowem.
" replace with Register 0
map <leader>rr ciw<C-r>0<Esc>

yiwskopiuj słowo. Przejdź do słowa. ,rrzamień słowo.
Kluczem lidera jest mapa do ,.


,rwmiałoby to większy sens, a na QWERTY jest prawdopodobnie łatwiejsze i szybsze do rozebrania. W DVORAK wybrałem ,rc, co choć nie ma większego sensu, jest łatwiejsze i szybsze niż wszystkie. Na DVORAK ,rwznajduje się horror;)
Paul Parker

0

Najpierw przejdź do początku słowa, które chcesz zaciągnąć. Jeśli jesteś w środku słowa, po prostu zrób to, baby wrócić do jego początku. Następnie zrób yeszarpnięcie całym słowem, bez spacji końcowych (od yank do end). Na koniec przejdź do słowa, które chcesz zastąpić - być może wykonując wkilka razy - i zrób przejście vepdo vtrybu zaznaczania rzeczywistego, wybierz na edrugą stronę słowa i psprawdź ostatnią szarpniętą zawartość.

(Jeśli ktoś chce wiedzieć, dlaczego nie skomentowałem zaakceptowanej odpowiedzi, z powodu małej modyfikacji używania yezamiast yw, to dlatego, że moja reputacja na tym stosie jest wciąż zbyt niska).


0
  1. użyj, ywaby szarpać świat, idź do świata, który chcesz zmienić.
  2. za pomocą vwybierz świat velub w vwzależności od sytuacji.
  3. enter, paby wkleić skopiowany świat, aby zastąpić wybrany blok

0

Dodanie do innych lepszych odpowiedzi. Trochę zbyt oczywiste, ale możesz po prostu wkleić przed usunięciem. „yw”, a następnie wpisz słowo, które chcesz zastąpić, „pldw” (wklej, przesuń jeden znak w prawo, usuń słowo.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.