Jak cofnąć wklejony tekst w vimie?

10

TL; DR; wersja - Jak mogę cofnąć tekst wklejony z bufora kopii systemu operacyjnego bez cofania innego tekstu, który został wpisany od czasu przejścia do trybu wstawiania?

Dłuższy opis:

  1. Umieść coś w buforze kopii systemu operacyjnego (np. Zaznacz tekst i zrób Command-cna Macu)
  2. Przejdź do trybu wstawiania w vim ( i)
  3. Wpisz coś (np. asdf)
  4. Bez wychodzenia z trybu wstawiania, wklej z bufora kopiowania do vima ( Command-vna Macu)
  5. Trafienie escape
  6. Spróbuj cofnąć wklej ( u)

Cofa wszystko od ostatniego przejścia w tryb wstawiania. Innymi słowy, usuwa się asdfcały tekst, który wkleiłem.

Jak po prostu cofnąć wklejony tekst? Czy muszę zawsze wychodzić z trybu wstawiania i wracać przed wklejeniem tekstu, aby mieć opcję cofnięcia wklejonego tekstu?

Javid Jamae
źródło

Odpowiedzi:

4

Jednym ze sposobów jest bezpośrednie opuszczenie i powrót do trybu wstawiania przed wklejeniem. Po rozszerzeniu poleceń wklejania możesz także automatycznie ustawić punkt cofania przed wklejeniem:

" Any text fragment pasted in insert mode should be undone separately, without
" destroying what was typed before.
inoremap <C-R> <C-G>u<C-R>

Powyższe dotyczy wbudowanego i_CTRL-Rpolecenia. Nie wiem, jak Command-vjest zaimplementowany w MacVimie, ale przygotowanie <C-G>udo :imappolecenia powinno osiągnąć ten sam efekt.

Ingo Karkat
źródło
1
Działa jak urok, dzięki! I tak prawdopodobnie powinienem trzymać się standardowych metod vim do wklejania.
Javid Jamae
Wystarczy dodać to: :h i_CTRL-G_u(tzn. „Przerwij sekwencję cofania, rozpocznij nową zmianę” w trybie wstawiania).
toraritte
2

W MacVimie należy odznaczyć Edit > Pasteelement menu, aby zastąpić skrót, a następnie można ponownie przypisać Cmd-V ( D-vw języku MacVim) do odpowiedniego polecenia w każdym trybie. Dodałem to do mojego ~/.gvimrci teraz wszystko działa cudownie:

macmenu Edit.Paste key=<nop>
noremap <D-v> "*P
cnoremap <D-v> <C-r><C-o>*
inoremap <D-v> <C-g>u<C-r><C-o>*

Jest <C-g>uto konieczne tylko w trybie wstawiania, aby naprawić historię cofania; noremapi cnoremapsą po prostu przywrócić domyślne zachowanie Wklej w normalnych i dowodzenia trybach.

Dzięki Ingo Karkat za skierowanie mnie tutaj we właściwym kierunku.

Sophie Alpert
źródło
1

W rzeczywistości rozwiązaniem jest przejście do trybu poleceń (np. Esc) I ponowne wejście w tryb wstawiania, ale działa to tylko wtedy, gdy piszę ręcznie, ale wydaje się, że „losowo” przestaje działać, jeśli go przetestuję ~/.vimrc. Google wcale nie pomaga.

Spędzam dużo czasu, próbując naprawić ten problem, i po prostu znajduję przyczynę w moim przypadku:

Nie mapuj klucza wklejania tak samo jak istniejącego klucza wklejania w terminalu

np Ctrl+Shift+Vbędzie wklejać w moim terminalu Konsole, ale jeśli przypisać ten klucz <C-S-v>w ~/.vimrcThe „Cofnij do jednorazowego pasty zamiast wielu past” nie będzie działać.

W moim przypadku muszę użyć <C-v>zamiast <C-S-v>:

inoremap <C-v> <Esc>"+pi<Esc>i<Right><Right>

Twoja sprawa może się różnić, ale chodzi o to samo: nie przypisuj tego samego konfliktu klucza wklejania z istniejącym kluczem emulatora terminala.

W 100% udowodniłem ten wniosek, ustawiając mój klucz wklejania terminala na Ctrl+Vi teraz <C-v>przestaję działać, ale <C-S-v>działa.

Zauważ też, że vim jest zbyt wrażliwy i dziwny. Rozumiem, że muszę użyć, ia następnie 2 prawych klawiszy ręcznie, aby działało we właściwej pozycji kursora, to znaczy, że muszę umieścić ii 2 prawe klawisze ~/.vimrcteż. Twoja sprawa może się różnić, ale chodzi o to samo, upewnij się, że klucze + kolejność w ~ / .vimrc są w 100% zgodne z tym, co wpisujesz ręcznie.

Owoc
źródło