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?
110
12yl
szarpałem 12 znaków i"_cw^r0
zamieniałem słowo. Następnie mogłem użyć.
polecenia, aby powtórzyć zamianę w całym pliku.Odpowiedzi:
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"ay
wtedy,"ap
aby szarpnąć do rejestrua
, a następnie umieścić zawartość rejestrua
. 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
"0
poprzez"9
:źródło
:help registers
.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”źródło
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
Możesz do tego użyć wizualnego trybu vim. np. skopiuj słowo:
ye
a następnie nadpisz inne skopiowanym słowem:vep
źródło
Jeśli kursor znajduje się na słowie, które chcesz zastąpić zawartością nienazwanego rejestru, możesz użyć
viwp
.v
przełącza się w tryb wizualny,iw
wybiera wewnętrzne słowo ip
umieszcza 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,
yiw
szarpiąc wewnętrzne słowo do nienazwanego rejestru, a następnie przechodząc do słowa I ' m wymienić iviwp
wymienić. 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ąć,n
aby 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.źródło
Jeśli używasz nazwanego rejestru (tj. Użyj
"ay
lub"ad
itp., Aby wypełnić swój rejestr wklejania), możesz zrobić coś takiego jakcw<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ż zostaniecw
on wypełniony słowem, które zostało wycięte przez to polecenie.źródło
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,
"ay
aby skopiować do rejestru,a
a następnie coś zrobićdw"aP
źródło
dw
usuwam końcowe spacje po tym, co uważam za „słowo”, podczas gdycw
zmienia tylko słowo. Z tego powodudw
nie zadziała dla mnie.de
powinno działać dla Ciebie - usunie na koniec tego słowa, adw
usunie na początek następnego słowa.Możesz użyć,
yw
aby yankować słowo, następnie możesz zmienić słowo z yanked word by,vipw
aby yank słowo i wkleić poprzednio wyszarpane słowo.źródło
Możesz użyć do tego rejestrów:
tekst zastępujący pierwsze miejsce w rejestrze
<mark some text>"ay
gdzie
a
jest nazwa rejestruwtedy możesz użyć tego rejestru w zamian
ve"ap
źródło
.
, co jest kolejną rzeczą, którą chciałem zrobić. W każdym razie dzięki. Bardzo cenione.Lub możesz zrobić Shift+ v- p(zaznacz całą linię i wklej w jej miejscu)
źródło