Jak wkleić blok wizualny zaczynając od innej linii

10

Bardzo długo zajęło mi uświadomienie sobie, że umieszczanie (wklejanie) czegoś plub za pomocą Pktórego blok wizualny wybiera ctrl+vi szarpanie (kopiowanie) yzachowuje sposób wcześniejszy, więc gdy kopiowany tekst znajdował się pośrodku wiersza, będą wtedy kopiowane pośrodku innego tekstu, o ile to możliwe. Przeciwnie, select-line z Vnie wkleja skopiowanej linii między innymi tekstem, ale zaczyna od innej linii.

Załóżmy na przykład, że mam:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
12/15:
12/16:
12/17:

Kiedy chcesz wyciąć Avocadoi Beani Cherryokreślając liczbę (wybór reprezentowane _)

12/12: ________ Apple.
12/13: ________ Banana.
12/14: ________ Citron.
12/15:
12/16:
12/17:

i naciskając yi przenieś kursor do następnej linii (kursor reprezentowany jako _),

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
_2/15:
12/16:
12/17:

i naciśnij P. To skutkuje:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
Avocado.12/15:
Bean.   12/16:
Cherry. 12/17:

Ale chciałem:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
Avocado.
Bean.   
Cherry. 
12/15:
12/16:
12/17:

Zmieszało mnie to za każdym razem, dopóki nie zdałem sobie sprawy, że ponieważ zostały skopiowane na środku linii, zostały wklejone na środku linii, naśladując sposób, w jaki były.

Wydaje się, że najlepszym sposobem na wklejenie czegoś zaczynającego się w innym wierszu jest przesunięcie kursora na początek 0i 3 linie w dół w nowe miejsce; i przejście do trybu wstawiania za pomocą ii naciśnięcie <return>3 razy i przesunięcie kursora do tyłu o 6 linii i w prawo, powrót do pierwotnego miejsca; i kopiowanie, i ponownie przenieś się do nowego miejsca i wklej, jak to zrobiłem powyżej.

Czy mogę zapisać kilka pociągnięć? A co zazwyczaj robisz?

(Edycja: To, co powiedziano powyżej, to to, jak to zrozumiałem w momencie, gdy o to poprosiłem. Zobacz te odpowiedzi, aby uzyskać prawidłowe wyjaśnienie:)

Skrzypce
źródło

Odpowiedzi:

11

Kiedy skopiujesz jakiś tekst, trafia on do rejestru. Tekst wewnątrz rejestru ma typ: characterwise, linewiselub blockwise.

Ten typ określa sposób umieszczenia tekstu.

W twoim przykładzie skopiowałeś trochę tekstu z trybu bloku wizualnego. Tak więc tekst miał typ blockwisei był przechowywany w rejestrze bez nazwy ".
Z powodu tego typu, gdy wkleisz go z powrotem do bufora, zostanie wklejony jako blok.


Jeśli chcesz wkleić go jako ciąg linii, zamiast bloku, istnieją 3 sposoby.

  1. W trybie wstawiania można wstawić, naciskając C-r ".
    Powinien wstawiać zawartość nienazwanego rejestru, tak jakby jego typ był liniowy.

  1. Z wiersza poleceń możesz użyć :putpolecenia.
    :putpowinien wkleić tekst do rejestru, tak jakby jego typ był liniowy, bez względu na oryginalny typ. Zauważ, że możesz podać nazwę rejestru jako argument, a także adres linii, aby określić, poniżej której linii chcesz wkleić rejestr.

Na przykład:

:42put a

... powinien umieścić zawartość rejestru aponiżej 42linii.

Bez nazwy rejestru Vim zakłada, że ​​chcesz wkleić rejestr nienazwany (lub +rejestr, jeśli poprawiłeś 'clipboard').
Bez adresu Vim zakłada, że ​​chcesz go wkleić poniżej bieżącego wiersza.


  1. W wierszu poleceń możesz zmienić typ rejestru bez nazwy za pomocą setreg()funkcji:

    :call setreg('"', '', 'al')

W tym miejscu setreg()należy dołączyć pusty ciąg do rejestru bez nazwy (dzięki aflagi przekazanej jako trzeci argument) i zmienić jego typ na liniowy (dzięki lflagi).

Następnie, z trybu normalnego, powinieneś być w stanie wkleić rejestr za pomocą pnormalnego polecenia, tak jakby jego typ był liniowo.


Nie jest to bezpośrednio związane z twoim problemem, ale kiedy skopiujesz jakiś tekst, trafi również do 0rejestru. A jeśli dodałeś wartość unnamedplusdo opcji 'clipboard', trafi ona również do +rejestru.

Możesz sprawdzić, jaki jest typ rejestru, korzystając z getregtype()funkcji:

:echo getregtype('"')

Jeśli zwraca małą literę v, oznacza to, że typ jest znakowy.
Jeśli zwraca wielką literę V, oznacza to, że typ jest liniowy.
Jeśli zwraca ^V{some number}, oznacza to, że typ jest blokowy, a szerokość bloku wynosi {some number}.

użytkownik9433424
źródło
3

Musiałem tak często „rzucać” rejestrowaną zawartość w określony tryb (znakowy / liniowy / blokowy), że napisałem dla niego wtyczkę UnconditionalPaste . Zapewnia gcp, glpitp., Alternatywy dla wbudowanych poleceń wklejania, które wymuszają określony tryb (i do tej pory kilka innych odmian tego tematu, takich jak wklejanie za pomocą przecinków lub zapytanych znaków).

Dzięki niemu możesz po prostu użyć glp/, glPaby wkleić po / przed bieżącą linią (jako nowe linie), niezależnie od tego, jak zaciągnąłeś tekst.

Ingo Karkat
źródło
Zazdroszczę ci, że masz czas na napisanie czegoś takiego QQ Ale jestem z tego zadowolony :put. (Również głosowałem na ciebie)
Violapterin
@Aminopterin: Odpowiedziałem tak często, że tak naprawdę mam fragment snipMate dla pierwszego akapitu. Muszę więc trochę dostosować. Dziękuję za docenienie mojej odpowiedzi i entuzjazmu!
Ingo Karkat
Och, powiedziałem, że zazdroszczę wam, że macie czas na samodzielne napisanie wtyczki, jak to zrobione beztrosko ... dopiero w zeszłym roku zacząłem pisać jakiś projekt c ++ jako projekt hobby, aby zmusić się do nauki programowania, i czy zacząłem używać vim ~~
Violapterin
2
@Aminopterin Ach, no cóż, wtyczka zaczęła się jako mały fragment skopiowany z Vimtipsa i powoli rosła z czasem. Jak mi się to przydało, stopniowo go znacznie poprawiałem. Wiele małych kroków ma większą moc niż pojedynczy wysiłek!
Ingo Karkat,