Korzystając z Vima, często chcę zastąpić blok kodu blokiem, który właśnie szarpnąłem.
Ale kiedy usuwam blok kodu, który ma zostać zastąpiony, sam blok przechodzi do rejestru, który usuwa blok, który właśnie szarpnąłem. Mam więc zwyczaj szarpania, następnie wstawiania, a następnie usuwania tego, czego nie chciałem, ale przy dużych blokach kodu robi się bałagan, próbując zachować wstawiony blok i blok do oddzielenia.
Jaki jest najszybszy i najszybszy sposób na zamianę tekstu w Vimie?
- czy istnieje sposób na usunięcie tekstu bez umieszczania go w rejestrze?
- czy można powiedzieć np. „zamień następne słowo” lub „zamień do następnego akapitu”
- czy jest najlepszym sposobem na skorzystanie z funkcji rejestracji wielu?
vim
replace
vim-registers
Edward Tanguay
źródło
źródło
viwp
(dlaw
ord).Odpowiedzi:
Aby usunąć coś bez zapisywania go w rejestrze, możesz użyć „rejestru czarnej dziury”:
Oczywiście możesz również użyć dowolnego innego rejestru, który nie zawiera niczego, co Cię interesuje.
źródło
"<space>_d
. Potrzebne jest miejsce do wpisania „.dd
na pustej linii, idzie do czarnej dziury, w przeciwnym razie jestdd
to normalne)."_x
yy
„3yy” (lub cokolwiek innego), co umieszcza go w rejestrze bez nazwy, ale także w 0. Możesz dalej wklejać go"0p
, mimo że używałeś god
później.Tak. Jest to nieco bardziej skomplikowane niż usuwanie „starego” tekstu, ale:
Zaczynam od…
I shift+ vzaznaczam wiersz 1, wiersz 2, 3 i 4 i usuwam je za pomocą dpolecenia
Następnie usuwam stare 1-4 wiersze w ten sam sposób.
Więc zrób
To wklei ostatnie szarpane linie (linia 1-4).
"3p
zrobi trzecią od ostatniej i tak dalej ...Skończyło się na tym
Odniesienie: Dokumentacja Vima dotycząca rejestru numerowanego
źródło
Dokumenty VIM: Rejestr numerowany 0 zawiera tekst z ostatniego polecenia yank, chyba że polecenie to określiło inny rejestr za pomocą ["x].
Np. Szarpamy „foo” i usuwamy „pasek” - rejestr 0 nadal zawiera „foo”! Dlatego „foo” można wkleić za pomocą
"0p
źródło
Przydatne jest łatwe mapowanie, które pozwala zastąpić bieżące zaznaczenie buforem.
Na przykład, gdy umieścisz to w swoim .vimrc
następnie, po skopiowaniu czegoś do rejestru (tj. za pomocą „y”), możesz po prostu wybrać tekst, który chcesz zastąpić, i po prostu naciśnij „r” na klawiaturze. Wybór zostanie zastąpiony bieżącym rejestrem.
Wyjaśnienie:
źródło
vmap <C-P> "_dP
Vp
natychmiast zastępuje bieżącą linię szarpaną.d
który jest często używany do usuwania.W moim vimrc umieszczam:
Teraz szarpię do rejestru schowka i wkładam go i nie muszę się przejmować tym, co dzieje się z rejestrem domyślnym. Dodatkową korzyścią jest to, że mogę wkleić z innych aplikacji przy minimalnym wysiłku. Wiem, że tracę trochę funkcjonalności, ale i tak nie mogę śledzić więcej niż jednego rejestru / schowka.
źródło
set clipboard=unnamed
lubset clipboard=unnamedplus
, co zmienia domyślny schowek odpowiednio na*
lub+
.Dla konkretnego przykładu, który podałeś, jeśli rozumiem pytanie, może to działać:
źródło
Wszystkie operacje szarpania i usuwania są zapisywane domyślnie w rejestrze bez nazwy. Jednak ostatnie szarpnięcie i ostatnie usunięcie są zawsze przechowywane (osobno) w ponumerowanych rejestrach. Rejestr
0
zawiera ostatni szarpnięcie. Rejestry1-9
zawierają 9 ostatnich usunięć (z1
czym są najnowsze).Innymi słowy, usunięcie powoduje nadpisanie ostatniego szarpnięcia w rejestrze bez nazwy, ale nadal znajduje się w
0
rejestrze. Sztuczka z rejestracją w blackhole ("_dd
Wspomniany w innych odpowiedziach ) wspomniany w innych odpowiedziach działa, ponieważ zapobiega zastąpieniu rejestru bez nazwy, ale nie jest konieczny.Odwołujesz się do rejestru, używając podwójnych cudzysłowów, więc wklejanie ostatnio szarpanego tekstu można wykonać w następujący sposób:
To doskonała referencja:
źródło
Aby podkreślić to, co powiedział EBGreen :
Jeśli wkleisz podczas zaznaczania tekstu, zaznaczony tekst zostanie zastąpiony wklejonym tekstem.
Jeśli chcesz skopiować tekst, a następnie wkleić go w wielu lokalizacjach, użyj
"0p
do wklejenia. Rejestr numerowany 0 zawiera tekst z ostatniego polecenia szarpnięcia.Możesz także wyświetlić zawartość wszystkich swoich rejestrów:
To polecenie ułatwia ustalenie , jakiego rejestru chcesz dokonać, robiąc coś w rodzaju odpowiedzi dbr . Zobaczysz także rejestry /,%, #. (Zobacz także
:help registers
)Na koniec sprawdź
cW
icW
zmień słowo, w tym spację i bez spacji. (Korzystanie z kapitałuW
obejmuje interpunkcję).źródło
Jeśli używasz Vima, będziesz miał tryb wizualny, który przypomina wybieranie, ale z trybami oddzielania, które są podstawą vi / vim.
To, co chcesz zrobić, to użyć trybu wizualnego, aby wybrać źródło, następnie szarpnąć, a następnie użyć trybu wizualnego, aby wybrać zakres miejsca docelowego, a następnie wkleić do tekstu z domyślnego bufora.
Przykład:
W pliku tekstowym z:
w następującej kolejności:
ggVjyGVkp
skończysz na:Wyjaśnione:
gg
: przejdź do pierwszej liniiV
: uruchom tryb wizualny z całymi liniamij
: zejdź o jedną linię w dół (z zaznaczeniem rozpoczętym w poprzednich liniach zwiększa to zaznaczenie o jedną linię w dół)y
: szarpnij do domyślnego bufora (dwie wybrane linie i automatycznie wyjdzie z trybu wizualnego)G
: przejdź do ostatniej liniiV
: uruchom tryb wizualny (tak samo jak poprzednio)k
: przejdź w górę o jedną linię (jak poprzednio, z włączonym trybem wizualnym, zwiększa to wybór o jedną linię w górę)p
: wklej (po zaznaczeniu dwóch ostatnich linii zastąpi te linie tym, co jest w buforze - w tym przypadku 2 pierwsze linie)Ma to niewielką niedogodność, która umieszcza ostatni blok w buforze, więc w jakiś sposób nie jest pożądane w przypadku wielokrotnego wklejania tej samej rzeczy, więc będziesz chciał zapisać źródło w nazwanym buforze z czymś podobnym
"ay
(do bufora o nazwie „a ”) i wklej coś podobnego"ap
(ale wtedy, gdy programujesz, prawdopodobnie nie chcesz wklejać kilka razy, ale utworzyć funkcję i wywołać ją, prawda? PRAWO ?).Jeśli używasz tylko vi, będziesz musiał użyć niewidocznych znaków zamiast trybu wizualnego,
:he mark
aby uzyskać więcej informacji na ten temat, przepraszam, ale nie jestem zbyt dobry z tą rzeczą niewidocznych znaków, jestem dość zanieczyszczony trybem wizualnym.źródło
Aby zastąpić słowo, spróbuj
cw
w trybie normalnym.Aby zastąpić akapit, spróbuj
cap
w trybie normalnym.źródło
c}
w trybie normalnym.Minimalne rozwiązanie inwazyjne dla leniwych:
Rejestr
0
zawsze zawiera ostatnie szarpnięcie (jak już wspominali Rafael , alex2k8 i idbrii ). Niestety wybór rejestru przez0
cały czas może być dość irytujący, więc byłoby miło, gdyby byłp
używany"0
domyślnie. Można to osiągnąć, umieszczając następujące wiersze w swoim.vimrc
:Pierwszy wiersz odwzorowuje każde
p
pociągnięcie"0p
. Uniemożliwia to jednakp
dostęp do innych rejestrów. Dlatego wszystkiep
pociągnięcia z jawnie wybranym rejestrem są odwzorowywane na równoważne wyrażenie wiersza poleceń w pętli for. To samo zrobiono dlaP
.W ten sposób zachowane jest standardowe zachowanie, z wyjątkiem niejawnych
p
iP
obrysów, które teraz0
domyślnie używają rejestru .Wskazówka 1: Polecenie cięcia jest teraz
"0d
zamiast po prostud
. Ale ponieważ jestem leniwy, jest to dla mnie zdecydowanie za długo;) Dlatego używam następującego mapowania:Klucz wiodący jest
\
domyślnie, więc możesz łatwo wycinać tekst, wpisując\d
lub\D
.Wskazówka 2: Domyślny limit czasu dla mapowań z wieloma klawiszami jest dość krótki. Możesz go zwiększyć, aby mieć więcej czasu przy wyborze rejestru. Zobacz
:help timeoutlen
szczegóły, używam:źródło
Najpierw wykonaj to polecenie:
Wtedy zdasz sobie sprawę, że możesz usunąć do określonego rejestru. W ten sposób nie zmienisz zawartości domyślnego rejestru.
źródło
["x]d{motion} Delete text that {motion} moves over [into register x]
- Vim:h d
Moja sytuacja: w
Normal
trybie, gdy usuwam znaki za pomocąx
naciśnięcia klawisza, te usunięcia nadpisują mój najnowszy rejestr - komplikując zmiany, w których chcę usunąć znaki, używającx
i wklejając coś, co mam w moim ostatnim rejestrze (np. Wklejanie tego samego tekstu na dwa lub więcej miejsc).Wypróbowałem sugestię w zaakceptowanej odpowiedzi (
"_d
), ale nie zadziałała.Jednak z zaakceptowanej odpowiedzi / komentarzy na /vi/122/performing-certain-operations-with-clearing-register dodałem to do mojej
~/.vimrc
, która działa (być może będziesz musiał zrestartować Vima ):Oznacza to, że mogę teraz wykonywać moje normalne polecenia yank (
y
), delete (d
) i paste (p
) - a znaki, które usuwam,x
nie wypełniają już najnowszych rejestrów.źródło
Tekst usunięty w trybie wstawiania nie przechodzi do rejestru domyślnego.
źródło
Dwa rozwiązania, których używam we właściwych kontekstach, to:
VISUAL
trybie Vims , a następnie wklej rejestr.Używam tego głównie z przyzwyczajenia, ponieważ drugie rozwiązanie znalazłem znacznie później, np
<ctrl>+<p>
aby zastąpić poprzedni numerowany rejestr tym, który właśnie wkleiłeś.Zasadniczo zaczynasz wklejać, jak chcesz, ale kiedy zdasz sobie sprawę, że od tego czasu nadpisałeś domyślny rejestr, tracąc to, co naprawdę chciałeś wkleić, możesz
<C-P>
znaleźć i zastąpić historię YankRing!Jedna z nich musi mieć wtyczki ...
źródło
Znalazłem bardzo przydatne mapowanie do twojego celu:
Usunięty tekst jest umieszczany w „rejestrze czarnej dziury”, a tekst z naciągniętymi pozostaje.
Źródło: http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text
źródło
W wersji dla systemu Windows (prawdopodobnie także w systemie Linux) możesz przeciągać do bufora kopiowania / wklejania systemu za pomocą
"*y
(tj. Poprzedzając polecenie yank podwójnymi cudzysłowami i gwiazdką).Następnie możesz normalnie usunąć wymienne linie i wkleić skopiowany tekst za pomocą
"*p
.źródło
Często popełniam błąd, wykonując polecenia „y'ank, a następnie” „usuń” do czarnej dziury, a następnie „p” wklej. Wolę „y”, a następnie usuń, jak mi się podoba, a następnie „0p” z rejestr 0, do którego wypychany jest ostatni skopiowany tekst.
źródło
W przypadku użytkowników emacs-evil funkcja
(evil-paste-pop)
może zostać uruchomiona po wklejeniu i przełącza się między poprzednimi wpisami w pierścieniu zabijania. Zakładając, że jest to związane<C-p>
(domyślnie w Spacemacs), uderzyłbyś,p
a następnie tyle,<C-p>
ile potrzeba.źródło
Dla użytkowników Dvoraka jedną bardzo wygodną metodą jest po prostu usunięcie niepotrzebnego tekstu do rejestru „1 zamiast rejestru„ _ czarna dziura ”, choćby dlatego, że można nacisnąć„ + 1 za pomocą tego samego naciśnięcia Shift i szybkiego różowego ruchu, ponieważ 1 jest klawisz bezpośrednio powyżej ”w Dvorak (PLUS d znajduje się w drugiej ręce, co sprawia, że całe polecenie jest szybkie jak diabli).
Oczywiście rejestr „1 może być używany do innych celów ze względu na wygodę, ale chyba że masz cel bardziej powszechny niż zamiana tekstu, powiedziałbym, że to całkiem dobre wykorzystanie rejestru.
źródło
Dla tych, którzy są przede wszystkim zainteresowani nie nadpisywaniem nienazwanego rejestru podczas zastępowania tekstu za pomocą wirtualnego zaznaczania i wklejania.
Możesz użyć następującego rozwiązania, które jest łatwe i działa najlepiej dla mnie:
xnoremap <expr> p 'pgv"'.v:register.'y'
Pochodzi z odpowiedzi (i komentarzy) tutaj: Jak wkleić bez nadpisywania rejestru
Najpierw minie zaznaczenie, a następnie zaznaczenie z nowym tekstem jest ponownie zaznaczane (gv). Teraz rejestr, który był ostatnio używany w trybie wizualnym (zwykle rejestr bez nazwy, ale działa również bez skutków ubocznych, jeśli używasz innego rejestru do wklejania). Następnie ponownie pociągnij nową wartość do rejestru.
PS: Jeśli potrzebujesz prostszego wariantu, który działa również z symulacją vim-pluginu Intellj Idea, możesz wziąć ten (wada: nadpisać nienazwany rejestr, nawet jeśli podano inny rejestr do wklejenia):
vnoremap p pgvy
źródło
Dla tych, którzy używają JetBrans IDE (PhpStorm, WebStorm, IntelliJ IDEA) z IdeaVim. Być może masz problemy z ponownym mapowaniem, takim jak
nnoremap d "_d
użycie linii do usunięcia liniidd
. Możliwe rozwiązanie dla Ciebie:nnoremap dd "_dd
Masz problemy z youtrack, zagłosuj na nie: https://youtrack.jetbrains.com/issue/VIM-1189 https://youtrack.jetbrains.com/issue/VIM-1363
źródło
Sporadyczne preferencje Vima dotyczące złożoności nad praktycznością obciążają użytkownika stosowaniem rejestrów do kopiowania / usuwania akcji - gdy częściej niż nie, wystarczy po prostu wkleić to, co zostało skopiowane i „zapomnieć” o tym, co zostało usunięte.
Jednak zamiast walczyć ze skomplikowanymi rejestrami vima, uczyń je wygodniejszymi: wybierz rejestr „domyślny” do przechowywania ostatniego usunięcia. Na przykład wyślij usunięcia do rejestru d (pozostawiając ac otwarte do użytku ad-hoc; d to niezły mnemonik):
Takie podejście zapobiega kasowaniu szarpnięć, ALE nie powoduje utraty rejestracji - można wkleić (cofnąć) to, co zostało usunięte, zamiast stracić je w czarnej dziurze (jak w zaakceptowanej odpowiedzi). W powyższym przykładzie przywołanie odbywa się za pomocą dwóch mapowań linii odniesienia p. Zaletą tego podejścia jest to, że daje on możliwość wybrania, co należy wkleić: (a) co właśnie zostało szarpane lub (b) co właśnie zostało usunięte.
źródło
zarejestruj od 0 do 9 to najnowsze rzeczy, które szarpiesz lub wycinasz itp., i NIE dołączaj usuniętych rzeczy itp. Więc jeśli szarpiesz / wycinasz coś, jest ono również w rejestrze 0, nawet jeśli przez cały dzień mówisz o usuniętych rzeczach, zarejestruj 0 jest wciąż ostatnią rzeczą, którą szarpałeś / wycinałeś.
yiw # przechodzi zarówno do rejestru domyślnego, jak i do rejestru 0
wyrywa słowo, w którym znajduje się kursor
usunięte rzeczy itp. przejdą do rejestru domyślnego, ale NIE zarejestrują 0
w trybie standardowym:
„0p # wpisz treść rejestru 0
w trybie wstawiania:
ctrl-r 0 # wpisz treść rejestru 0
Miałem też przyjaciela, który zawsze szarpał / wycinał, aby zarejestrować x lol.
źródło