Wykonywanie niektórych operacji bez kasowania rejestru

30

Często w plikach konfiguracyjnych mogę skopiować i wkleić blok linii, a następnie chcę wprowadzić niewielkie zmiany w tym bloku. Po wklejeniu używam xdo usuwania znaków, które chcę usunąć, a następnie przechodzę do wklejania następnego bloku. Tyle że xumieszcza usunięte znaki w schowku, więc muszę ponownie skopiować blok wierszy.

Czy można to zrobić bez przechodzenia w tryb wstawiania?

durron597
źródło
Jasper znalazł podobne pytania na temat Przepełnienia stosu : [Jakikolwiek sposób usunąć w vimie bez nadpisywania ostatniego szarpnięcia? [duplikat]] ( stackoverflow.com/questions/3638542/... ) i czy w vim istnieje sposób na usunięcie bez wpisywania tekstu do rejestru?
Gilles „SO- przestań być zły”

Odpowiedzi:

35

Twoje opcje to:

  1. Użyj rejestru czarnej dziury _. Na przykład, aby usunąć wiersz, który wpisujesz "_dd. Spowoduje to usunięcie bez wpływu na schowek.
  2. Jawnie nazwij rejestr oryginalnego szarpnięcia. Na przykład, aby przeciągnąć linię do nazwanego rejestru, należy wpisać, "ayya następnie wkleić"ap
  3. Zamiast tego użyj rejestrów szarpnięć, aby odzyskać oryginalne szarpnięcia. Możesz szarpać, a następnie usuwać w razie potrzeby, a następnie, gdy przejdziesz do wklejania, wpisz"0p
  4. Użyj wtyczki, takiej jak vim-easyclip, aby udostępnić operator wycinania, który różni się od operatora usuwania (pełne ujawnienie: napisałem to)

Uruchom :help registerswięcej szczegółów na temat pierwszych 3

Steve Vermeulen
źródło
4
Więc do xczego używałbym "_x?
durron597
1
To jest poprawne.
Steve Vermeulen,
2
@ durron597, jeśli usuwasz jeden znak naraz x, prawdopodobnie powinieneś nauczyć się ruchów usuwania, takich jak dt)które usuwa, aż do następnego ścisłego nawiasu, d2Wktóry usuwa następne dwa tokeny oddzielone spacjami. Wtedy możesz zrobić coś takiego jak "_di{w zbrojonym regionie, co robię cały czas. W normalnym trybie to znaczy „ kasowania wszystko wewnątrz tej usztywnione regionu do czarnej dziury
OregonTrail
Dodano nnoremap x "_xdo mojego ~/.vimrc(wyjaśnienie tutaj: stackoverflow.com/questions/54255/… ).
Victoria Stuart,
11

xnie umieszcza rzeczy w schowku, umieszcza je w rejestrze . Jeśli nie powiesz, do którego rejestru należy go umieścić, umieszcza go w rejestrze bez nazwy, co oczywiście zastępuje poprzednią zawartość. Zamiast tego powiedz, którego rejestru użyć " REGISTER x:, gdzie REJESTR jest dowolną pojedynczą literą. Następnie użyj tego samego prefiksu rejestru cytatów, paby wkleić z tego rejestru. (Uwaga: małe litery zastępują ich treść; wielkie litery dołączają).

Istnieją również dwa specjalne rejestry "0i "1. "0jest ostatnim szarpanym ( y) tekstem, który pozostanie, nawet jeśli usuniesz jakiś tekst innym poleceniem (jak x). "1jest ostatnio usuniętym tekstem, o ile ten tekst nie jest mały (jedna linia). Wchodzi mały usunięty tekst "-.

Wreszcie, jak zauważa Steve Vermeulen, możesz powiedzieć vimowi, aby nie zapisywał usuniętego tekstu, podając rejestr czarnej dziury "_.

Odpowiednie polecenie pomocy to :help registers.

derobert
źródło
3

:letKomenda pozwoli Ci na nowo zdefiniować nazwany rejestr. W wierszu poleceń vima naciśnięcie Control+ R dwa razy 1, a następnie nazwa rejestru wklei zawartość rejestru do polecenia. Następnie możesz zmodyfikować to, co jest wklejone i zapisać rejestr ze swoimi modyfikacjami.

Przykład:

  • W trybie normalnym, w wierszu zawierającym tekst „Foo Bar”, wpisanie "fyyszarpa całą linię ( yy) do frejestru ( "f).
  • Wpisz ponownie :let @f='i Control+ r, Control+ , a powinieneś zobaczyć, jak wkleja się w „Foo Bar”, więc linia poleceń teraz czyta , z kursorem na samym końcu.rf:let @f='Foo Bar
  • Teraz możesz użyć strzałek i klawiszy usuwania, aby edytować to, co właśnie wkleiłeś, na przykład :let @f='foo bar baz.
  • Dokończ cytowanie: :let @f='foo bar baz'i naciśnij Enter.

Teraz zmieniłeś treść frejestru na „foo bar baz”.

(Działa to również w przypadku makr! :help letWięcej informacji.)


1 Control + rpozwala wstawić rejestr, gdy jesteś już w trybie wstawiania, tak jakbyś pisał znaki. Dwukrotne użycie tej sekwencji jest ważne, ponieważ „tekst jest wstawiany dosłownie, a nie jak napisany. Różni się, gdy rejestr zawiera znaki takie jak <BS>”. - insert.txt vimdoc,:help i_CTRL-R_CTRL-R

alxndr
źródło
0

W związku z rejestrem blackhole "_wspomnianym przez @derobert przydatny screencast można znaleźć na stronie http://vimcasts.org/episodes/meet-the-yank-register/

Vim używa terminów usuń, szarpnij i umieść zamiast bardziej standardowej terminologii wycinanie, kopiowanie i wklejanie. Zaczynając od tej samej litery, wstawianie i wklejanie można łatwo zamieniać. Kiedy przyzwyczaisz się do słowa yank, staje się ono synonimem kopiowania. Jednak użycie przez Vima słowa „usuń” jest problematyczne. W większości kontekstów słowo usuń oznacza po prostu usunięcie. Ale operacja usuwania Vima kopiuje tekst do rejestru, a następnie usuwa go z dokumentu. Innymi słowy, operacja usuwania Vima zachowuje się jak cięcie.

Marlon León
źródło
2
To nie daje odpowiedzi na pytanie. Aby skrytykować lub poprosić autora o wyjaśnienie, zostaw komentarz pod jego postem - zawsze możesz komentować własne posty, a gdy będziesz mieć odpowiednią reputację , będziesz mógł komentować każdy post .
jamessan
Próbowałem skomentować oryginalny post, ale nie mogłem. Jedyną alternatywą, jaką miałem, była ta, którą wybrałem @jamessan
Marlon León
0

Plugin ReplaceWithRegister

http://www.vim.org/scripts/script.php?script_id=2703 (2009-2014)

Sugeruje mapowanie gr.

  1. szarpać
  2. wizualnie wybierz tekst, który chcesz zastąpić i naciśnij gr
  3. przejdź do następnego bloku, który chcesz zastąpić

Alternatywnie użyj tego, gr<text object>aby to zrobić bez wizualnego wyboru. Funkcja powtarzania kropek jest obsługiwana, gdy są zainstalowane wtyczki Tim'a repeat.vimPope'a i visualrepeat.vimIngo Karkata.

Hotschke
źródło