Zwykle więc kopiuję tekst z jednego punktu do drugiego, zastępując stary tekst w miejscu wklejenia nowego:
blah1
newtext
blah2
wrong1
blah3
wrong2
blah4
Załóżmy, że oznaczyłem go wizualnie newtext
i y
potknąłem. Teraz wybieram wrong1
(co może być czymkolwiek, niekoniecznie tylko słowem) i i p
tak newtext
. Jeśli jednak teraz zrobię to samo wrong2
, zostanie zastąpione przez wrong1
zamiast newtext
.
Jak więc uniemożliwić zamianę tekstu znajdującego się w buforze na tekst, który obecnie zastępuję?
Edytuj 1
Chociaż podoba mi się sugestie ponownego rejestrowania (myślę, że zacznę więcej używać rejestrów, teraz kiedy odkryłem :dis
polecenie), idę z modyfikacją odpowiedzi jinfield , ponieważ nie używam trybu wymiany.
vnoremap p "0p
vnoremap P "0P
vnoremap y "0y
vnoremap d "0d
robi lewę idealnie.
Edytuj 2
Byłem zbyt szybki; Rozwiązanie romainl jest dokładnie tym, czego szukałem, bez włamania w Edycji 1 .
W rzeczywistości vnoremap p "_dP
wystarczy!
Zmieniając zaakceptowaną odpowiedź.
źródło
vnoremap p "_dP map
i zauważyłem, że nie działa dobrze dla ostatniego słowa / znaku w linii. Poszedłem z powrotem dovnoremap p "0p
,vnoremap P "0P
iset clipboard=unnamed
(dla OSX)vnoremap p "_dP
usuwa białe spacje po wklejeniu. Edycja 1 działa idealnie.Odpowiedzi:
Mam te mapowania w moim .vimrc:
"_
to „rejestr czarnej dziury”, zgodnie z:help "_
:„Podczas pisania do tego rejestru nic się nie dzieje. Można tego użyć do usunięcia tekstu bez wpływu na normalne rejestry. Podczas czytania z tego rejestru nic nie jest zwracane. {Not in Vi}"
źródło
vnoremap p "_dP map
i zauważyłem, że nie działa dobrze dla ostatniego słowa / znaku w linii. Poszedłem z powrotem dovnoremap p "0p
,vnoremap P "0P
iset clipboard=unnamed
(dla OSX)vnoremap p "_dP
przestań dla mnie pracować w trybie wyboru, alevnoremap <leader>p "_dP
działa<leader>
jest symbolem zastępczym, który powinienem wiedzieć, aby coś zastąpić, ale działało to dla mnie tylko wtedy, gdy go usunąłem. Co to znaczy tutaj?:help mapleader
.vnoremap <leader>p
mapowanie nie działa poprawnie w ostatnim wierszu bufora, ponieważ jak tylko usuniesz ten ostatni wiersz bufora, jesteś teraz w przedostatniej linii, aP
wkleisz powyżej tej linii, zamiast poniżej.Oprócz standardowego bufora możesz przeciągać tekst do nazwanych buforów, a następnie wstawiać z tych nazwanych buforów. Można użyć do 26 nazwanych buforów (jeden na każdą literę). Użyj podwójnych cudzysłowów i litery, aby uzyskać dostęp do nazwanego bufora. Przykłady:
"dyy
- Pociągnij bieżącą linię do bufora d."a7yy
- Wciągnij kolejne siedem linii do bufora a."dP
- Umieść zawartość bufora d przed kursorem."ap
- Umieść zawartość bufora za kursoremKolejna fajna rzecz, jeśli użyjesz dużej litery zamiast małych liter, tj
"Dyy
. Bieżąca linia zostanie dodana do bufora d zamiast jej zastąpienia. Więcej szczegółów w książce O`Reilly: http://docstore.mik.ua/orelly/unix/vi/ch04_03.htmźródło
"a
wszystko jest uciążliwe , ale w porządku.Podczas używania
put
w trybie wizualnym zastępowany tekstwrong1
jest zastępowany zawartością rejestru „unamed”.W rzeczywistości działa to poprzez „umieszczenie” rejestru po zaznaczeniu, a następnie usunięcie zaznaczenia. Problem polega na tym, że to usunięcie jest teraz przechowywane w
unnamed
rejestrze i zostanie wykorzystane do następnejput
akcji.Według rozwiązania rozwiązaniem
:h v_p
jest szarpnięcie do nazwanego rejestru, na przykład"0y
, a następnie wklejenie, używając"0p
tyle czasu, ile potrzebujesz. Pomocne może być mapowanie<leader>y
i<leader>p
korzystanie z nazwanego rejestru, jeśli robisz to często.Aby uzyskać więcej pomocy zobacz:
źródło
Wklejanie danych z
"0
rejestru jest ważne, ale często chcesz je wymienić wiele razy. Jeśli.
sprawisz , że będzie to powtarzalne działanie, możesz użyć operatora, o czym wspomniał garyjohn. Wyjaśniono to na wiki vim :źródło
Gdy szarpniesz tekst do rejestru bez nazwy *, kopia jest również umieszczana w rejestrze 0. Za każdym razem, gdy zastępujesz zaznaczony tekst, możesz po prostu wkleić go z rejestru 0. Widzieć
Ponadto, jeśli zastępujesz wiele słów tym samym słowem, możesz po prostu przejść do początku słowa, które chcesz zastąpić, i wpisać
.
. To powtórzy ostatnią operację edycji. Widzieć* Miejsca przechowywania, do których zaciągasz i z których wkładasz, nazywane są rejestrami. Bufor to element, który edytujesz, zwykle kopia pliku z dysku.
źródło
Potrzebuję tego tak często, napisałem wtyczkę: ReplaceWithRegister .
Ta wtyczka oferuje polecenie dwa w jednym,
gr
które zastępuje tekst objęty {ruch}, całą linię (liniami) lub bieżącym zaznaczeniem zawartością rejestru; stary tekst jest usuwany do rejestru czarnej dziury, tzn. zniknął.źródło
Ponieważ coś takiego
vnoremap p "_dP
(próbowałemx
lubc
) ma problemy z początkiem i końcem linii, skończyło się na tym,vnoremap p :<C-U>let @p = @+<CR>gvp:let @+ = @p<CR>
że znalazłem prostsze niż istniejące wtyczki (które również nie działały poset clipboard=unnamedplus
wyjęciu z pudełka). Więc to, co robi:C-U
)+
rejestr kopii zapasowej (z powodu nienazwanego plusu, alternatywne są"
i*
zależnie od konfiguracji) dop
źródło
To jest to, czego używam (dosłownie skopiowane z mojego .vimrc) do sterowania w stylu Windows + X cut / Control + C copy / Control + V paste / Control + S save / Control + F find / Control + H replace replace.
Funkcja smartpaste () powinna zawierać to, czego szukasz, czyli sposób wklejania podświetlonego tekstu bez jednoczesnego szarpania tego, co zostało wybrane.
źródło
tl; dr - vnoremap p "_c *
Oto lista moich pełnych mapowań:
„Napraw kopię / wklej
rejestr nnoremap DD” * dd
nnoremap D ”* d
vnoremap D" d
nnoremap d "_d
nnoremap dd" _dd
vnoremap d "_d
nnoremap s" _s
vnoremap s "_s
nnoremap c "
_c vnoremap c"
_c nnoremap x "_x
vnoremap x" _x
vnoremap p "_c
„Wklej w nowej linii
nnoremap, p op
nnoremap, P op
źródło