VIM Zastąpić słowo zawartością bufora wklejania?


110

Muszę zrobić kilka zamienników słów w pliku i chcę to zrobić za pomocą polecenia vi, a nie polecenia EX, takiego jak :%s///g. Wiem, że jest to typowy sposób, w jaki zastępuje się słowo w bieżącej pozycji kursora: cw<text><esc>ale czy jest sposób, aby to zrobić z zawartością nienazwanego rejestru jako tekst zastępczy i bez nadpisywania rejestru?


8
ROZWIĄZANIE: Ze względu na swoją pilną potrzebę 12ylszarpałem 12 znaków i "_cw^r0zamieniałem słowo. Następnie mogłem użyć .polecenia, aby powtórzyć zamianę w całym pliku.
plong

Odpowiedzi:


127

Myślę przez „wklej” masz na myśli nienazwany (szarpnij / wstaw / zmień / usuń / zastąp) rejestr, prawda? (Ponieważ jest to ten, który zostałby nadpisany przez polecenie zmiany).

Rejestry są generalnie określane przez wpisanie, "a następnie nazwy (pojedynczego znaku) rejestru, tak jak "aywtedy, "apaby szarpnąć do rejestru a, a następnie umieścić zawartość rejestru a. To samo dotyczy polecenia zmiany. W tym przypadku, jeśli nie chcesz usunąć tekst z poleceniem zmiany nigdzie iść, można użyć czarnej dziury rejestru "_: "_cw. Następnie, będąc w trybie wstawiania, możesz nacisnąć ctrl-R, a następnie rejestr, który chcesz (prawdopodobnie ") umieścić w zawartości tego rejestru.

  • "* - rejestr wyboru (wklejanie środkowym przyciskiem)
  • "+ - rejestr schowka (prawdopodobnie również dostępny za pomocą ctrl-shift-v przez terminal)
  • "" - domyślny (bez nazwy) rejestr vima yank / put / change / delete / substitute.

Krótka odpowiedź: "_cw^R"

Edycja: jak sugerują inni, możesz oczywiście użyć innego rejestru dla szarpania (lub czegokolwiek), który przesłał twój tekst do rejestru domyślnego. Jednak nie zawsze myślisz o tym w pierwszej kolejności, więc fajnie jest wykonać jedną komendę zmiany bez odrzucania jej. Chociaż nie jest to całkowicie zdmuchnięte. Istnieją ponumerowane rejestry "0poprzez "9:

Vim wypełnia te rejestry tekstem z poleceń yank i delete.

Rejestr numerowany 0 zawiera tekst z ostatniego polecenia yank, chyba że polecenie określiło inny rejestr z ["x].

Rejestr numerowany 1 zawiera tekst usunięty przez ostatnie polecenie usunięcia lub zmiany, chyba że w poleceniu określono inny rejestr lub tekst jest mniejszy niż jedna linia (wtedy używany jest mały rejestr usuwania). Wyjątek dla usuwania operatora z tych rozkazów ruchu: %, (, ), `, /, ?, n, N, {i }. Rejestr "1 jest wtedy zawsze używany (jest to zgodne z Vi). Rejestr" - jest również używany, jeśli kasowanie znajduje się w linii.

Z każdym kolejnym usunięciem lub zmianą, Vim przesuwa poprzednią zawartość rejestru 1 do rejestru 2, 2 do 3 i tak dalej, tracąc poprzednią zawartość rejestru 9.


1
W porządku, myślisz, że skopiowałem już wystarczająco dużo dokumentów z rejestrów do mojej odpowiedzi? Wszystko jest tam pod :help registers.
Cascabel

48

Korzystając z informacji zawartych w tym poście, utworzyłem przydatne mapowanie. Wybrałem „cp”, ponieważ oznacza „zmień wklej”

nmap <silent> cp "_cw<C-R>"<Esc>

EDYTOWAĆ:

Poszedłem o krok dalej i poparłem każdy ruch.

Aby uzyskać odpowiednik polecenia powyżej, oznaczałoby to cpw„zmień słowo wklejania”

"This allows for change paste motion cp{motion}
nmap <silent> cp :set opfunc=ChangePaste<CR>g@
function! ChangePaste(type, ...)
    silent exe "normal! `[v`]\"_c"
    silent exe "normal! p"
endfunction

<silent> powoduje, że nie działa dla mnie ... masz pojęcie, dlaczego tak się dzieje? Jestem n00b w mapowaniach i funkcjach.
Hollister

Jedynym problemem jest to, że nie możesz wybrać rejestru do wklejenia ... ale w takim przypadku przypuszczam, że możesz po prostu cw i użyć CTRL + R
Steve Vermeulen

2
Może być lepszy sposób na dodanie nazw rejestrów, ale działa w moim przypadku: nmap <silent> cp :let g:currentRegister=v:register<cr>:set opfunc=ChangePaste<CR>g@ function! ChangePaste(type, ...) silent exe "normal! `[v`]\"_c".getreg(g:currentRegister) endfunction
Steve Vermeulen

@eventualEntropy to działa dobrze przy zastępowaniu wierszy, jak mogę to zrobić dla słów zamiast wierszy, wciąż uczę się vim. Dzięki za pomoc.
Xavitoj Cheema

@XavitojCheema Nawet nie pamiętam tego komentarza, haha. Ale jak się okazuje, nie mam właściwie odkąd napisał wtyczki, aby zapewnić tę funkcjonalność ( github.com/svermeulen/vim-easyclip )
Steve Vermeulen

27

Możesz do tego użyć wizualnego trybu vim. np. skopiuj słowo: yea następnie nadpisz inne skopiowanym słowem:vep


9
To działa, ale należy również zauważyć, że wizualna wklejanie nadpisuje bufor szarpania dla nowo usuniętego tekstu.
ostler.c

24

Jeśli kursor znajduje się na słowie, które chcesz zastąpić zawartością nienazwanego rejestru, możesz użyć viwp. vprzełącza się w tryb wizualny, iwwybiera wewnętrzne słowo i pumieszcza zawartość rejestru w jego miejscu.

W praktyce, gdy muszę zamienić jedno słowo (nazwa funkcji itp.) Na inne, przechodzę do tego, które będzie używane jako zamiennik, yiwszarpiąc wewnętrzne słowo do nienazwanego rejestru, a następnie przechodząc do słowa I ' m wymienić i viwpwymienić. Dość szybki sposób na zastąpienie jednego słowa innym. Jeśli szukałeś ( /) słowa, które zastępujesz, aby go znaleźć, możesz po prostu nacisnąć, naby przejść do następnego wystąpienia, które musisz zamienić. Oczywiście nie zastąpi używania :%s/find/replace/g, ale w przypadku kilku szybkich podstawień może być przydatny, szczególnie jeśli masz już nowe słowo w rejestrze.


4
Dziwię się, że nie jest to akceptowane rozwiązanie: wszystkie powyższe, choć bardziej elastyczne w niektórych skrajnych przypadkach, są znacznie bardziej szczegółowe, aby po prostu `` zamienić bieżący nienazwany rejestr gdzieś na wybór '', co jest sytuacją w oryginale Asker przyszedł tutaj po.
ELLIOTTCABLE

1
Jest to bardzo przydatne i intuicyjne.
lacostenycoder

6

Jeśli używasz nazwanego rejestru (tj. Użyj "aylub "aditp., Aby wypełnić swój rejestr wklejania), możesz zrobić coś takiego jak

cw<CTRL-R>a<esc>

Który zastąpi słowo zawartością rejestru a. O ile wiem, nie możesz użyć rejestru domyślnego, ponieważ zostanie cwon wypełniony słowem, które zostało wycięte przez to polecenie.


Możesz użyć domyślnego rejestru! Sprawdź moją odpowiedź.
Cascabel

2

Czy masz na myśli systemowy bufor wklejania czy rejestr vi?

Jeśli chcesz użyć systemowego bufora wklejania, jesteś w porządku i możesz to zrobić dw"+P- "wybiera rejestr i "+jest systemowym buforem wklejania.

W przeciwnym razie skopiuj do rejestru innego niż domyślny, powiedzmy, "ayaby skopiować do rejestru, aa następnie coś zrobićdw"aP


Dzięki, Hamish. Próbowałem tego, ale dwusuwam końcowe spacje po tym, co uważam za „słowo”, podczas gdy cwzmienia tylko słowo. Z tego powodu dwnie zadziała dla mnie.
plong

W takim przypadku depowinno działać dla Ciebie - usunie na koniec tego słowa, a dwusunie na początek następnego słowa.
Hamish Downer

1

Możesz użyć, ywaby yankować słowo, następnie możesz zmienić słowo z yanked word by, vipwaby yank słowo i wkleić poprzednio wyszarpane słowo.


0

Możesz użyć do tego rejestrów:

tekst zastępujący pierwsze miejsce w rejestrze <mark some text>"ay

gdzie ajest nazwa rejestru

wtedy możesz użyć tego rejestru w zamian

ve"ap


Niestety nie mogłem po prostu powtórzyć ostatniej operacji wklejania za pomocą ., co jest kolejną rzeczą, którą chciałem zrobić. W każdym razie dzięki. Bardzo cenione.
plong

0

Lub możesz zrobić Shift+ v- p(zaznacz całą linię i wklej w jej miejscu)


1
lub pdw ... Czy nie kochasz vima? : P
elimirks
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.