Wklej wiele razy

96

Jaki jest najlepszy sposób zastąpienia wielu wierszy zawartością schowka?

Problem, który mam polega na tym, że kiedy szarpię linię i wklejam ją w inną linię, „szarpnięcie” jest zastępowane linią, którą właśnie zastępuję. Teraz, jeśli chcę zastąpić inną linię tą samą linią, muszę cofnąć się i ponownie ją szarpnąć.

Musi być lepszy sposób na zrobienie tego.

jwerre
źródło

Odpowiedzi:

110

Mam to w moim .vimrc:

xnoremap p pgvy

(uwaga: zadziała to tylko z domyślnym rejestrem, ale to mapowanie jest łatwe do zapamiętania). Możliwe byłoby napisanie bardziej rozbudowanej wersji. Ponadto nadal możesz użyć P, aby uzyskać stare zachowanie.

Benoit
źródło
29
Sprytny. „p”, aby wkleić, „gv”, aby ponownie wybrać to, co zostało pierwotnie wybrane. „y”, aby ponownie skopiować.
Amjith
@SibbsGambling, prawdopodobnie używasz wersji wcześniejszej niż Vim 7? Następnie albo zaktualizuj Vima, albo użyj v zamiast x ( vnoremap). Plik pomocy Vima version7.txtstwierdza, że ​​xmap i smap pojawiły się w tej wersji.
Benoit
1
@Benoit Hmm, mam 7.4.52, ale ani xnoremapnie vnoremapdziała
Sibbs Gambling
8
Dlaczego nie jest to zachowanie domyślne?
Seth
27

"0powinien mieć zawartość twojego szarpnięcia. Pisanie jest nieco bardziej uciążliwe, ale "0ppowinno robić, co chcesz.

Alternatywnie, nie wybieraj i nie zastępuj starych linii z góry. Jeśli znajdziesz te wiersze za pomocą wyszukiwania, po prostu naciskaj wielokrotnie n.(po inicjału p), a gdy wszystkie zostaną wklejone, wykonaj nddtyle n.znaków, ile potrzeba.

Największym przełącznikiem mentalnym, jakiego musiałem dokonać, przechodząc do Vima, jest wymyślenie, jak po kolei zastosować edycje grupowe. To znaczy zamiast robić kilka zmian w jednym wierszu, a potem zrobić kilka takich samych zmian w innym wierszu, pierwszą edycję dokonam w kilku liniach (używając .do świetnego efektu), a następnie drugą edytuję w paczce linii itp. Alternatywnie, użycie makr może pomóc, ponieważ są fantastyczne, ale czasami trochę bardziej uciążliwe, aby poprawnie pracować ze „złożonymi” zmianami.

dash-tom-bang
źródło
2
brzmi jak miejsce, w którym wyrażenie regularne z :%s/.../.../gcpoleceniami typu potwierdzenia może być bliższe temu, czego chcesz
Milimetric
@Milimetric +1 nie wiedział, że możesz to potwierdzić.
1
Głosowanie za zgodą, ponieważ makra mogą sprawić, że nie będzie to problemem. Po prostu edytuj raz i możesz zrobić coś takiego 5@m(dla makra o nazwie m)
skatenerd
Dzięki za świetne wyjaśnienie. Teraz używam xnoremap p "0pw moim ~ / .vimrc
nexayq
13

Często używam innego rejestru, kopiuję potrzebną linię do jakiegoś nazwanego rejestru, "aya następnie wklejam stamtąd"ap

Facundo Casco
źródło
11

Kiedy wkleisz zaznaczenie w Vimie, zastąpi on domyślny rejestr zawartością zaznaczenia. Jeśli wklejenie zaznaczenia wymazuje zawartość rejestru schowka, to najprawdopodobniej masz następujący wiersz w swoim .vimrc

set clipboard=unnamed

Jedną z opcji jest usunięcie tego i użycie jawnego rejestru schowka "+

Inną opcją jest użycie dowolnego z innych jawnie nazwanych rejestrów (az). Po pierwszym wklejeniu, "cna przykład, przeciągnij linię z powrotem, a następnie użyj, "cpaby wkleić od tego miejsca.

JaredPar
źródło
Właściwie domyślnym (tutaj na Ubuntu) było clipboard = autoselect; mimo to dziękuję za najbardziej elegancką odpowiedź.
Tobu
8

użyj npgdzie nto liczba, ile czasu chcesz wkleić linie, np. 3pwklei 3 linie.

toopay
źródło
8
Nie działa, gdy chcesz wkleić tę samą linię do nieciągłych linii.
Tobu
@Tobu, ale odpowiada na tytuł tego pytania
``
7

Zamiast używać kopiuj / wklej, często lepiej jest użyć polecenia obiektu tekstowego, takiego jak ciwzmiana wewnętrznego słowa. Zaletą tej metody jest to, że można ją łatwo .powtórzyć za pomocą polecenia powtarzania.

  1. yiw Szarpnij słowo wewnętrzne (skopiuj słowo pod kursorem, powiedz „pierwsze”).
  2. ... Przenieś kursor na inne słowo (powiedz „drugie”).
  3. ciw<C-r>0 Zmień „drugi”, zastępując go „pierwszym” (to Ctrl-R).
  4. ... Przenieś kursor na inne słowo (powiedz „trzecie”).
  5. . Zmień „trzeci”, zastępując go „pierwszym”.
Jack Guan
źródło
1
ciw<C-r>0nie działa w moim przypadku. ciwprzechodzi do trybu wstawiania, w którym <C-r>staje się bezużyteczny. Czy istnieje na to proste wytłumaczenie? Czy może to mieć coś wspólnego z tekstem (nie używam pur VIM, ale powiązań klawiatury VIM w RStudio)
Bushroot
@Bushroot <C-r>jest przeznaczony do użytku w trybie wstawiania, ponieważ w ten sposób wklejasz z rejestru bez wychodzenia z trybu wstawiania - to znaczy w Vimie; Nie jestem zaznajomiony z RStudio, ale zgaduję, że masz rację i nie zaimplementowali tego konkretnego powiązania klucza.
owadobójczy,
@Sean H: Tak. Nie zaimplementowali powiązania klucza. Działa dobrze w VIM, a nawet z powiązaniami VIM w innych programach (np. Visual Studio Code).
Bushroot