Jak zaciągnąć określoną linię bez przesuwania kursora w vimie?

39

Na przykład

alternatywny tekst

Jak szarpać i wklejać linię 4 tylko do linii 12 bez konieczności przesuwania kursora do linii 4?

alternatywny tekst

Lazer
źródło
Odpowiedziałem na twoje pytanie na podstawie faktu, że „szarpnij mnie!” jest na linii 4. Na drugim zrzucie ekranu pojawia się na linii 5.
Louis Salin
Dzięki @Louis za odpowiedź. Zaktualizowałem zrzut ekranu.
Lazer,

Odpowiedzi:

51

Jeśli kursor jest już w linii 12, to prosty

: 4y
P.

robi to dla mnie.

frabjous
źródło
1
Miły! Czy istnieje odpowiednik dla x? Kiedy próbuję :4x, dostaję E140: Use ! to write partial buffer. Dzięki!
dotancohen
Muszę powiedzieć, że to niesamowite: D
nXqd
@dotancohen:4d
n.st
Czy istnieje dobry sposób na zrobienie tego z względnym numerem linii?
TrungDQ,
W przypadku liczb względnych wystarczy użyć + i -. Więc -4 to cztery rzędy nad kursorem, a +4 to cztery rzędy pod nim.
rickythefox
10

Co powiesz na to: Kursor jest w linii 11, jesteś w trybie „vi”.

:4co.<return>

Najwyraźniej możesz to również zrobić za pomocą wzoru:

:/^Yank/co.<return>

Możesz użyć „mo” (ruch) zamiast „co” (kopiowanie), aby po prostu przenieść linię zamiast szarpać i wstawiać.

Bruce Ediger
źródło
1
Jeszcze krótszy ( t jako polecenie kopiowania jest pozostałością po ed)::4t.
tarleb
9

Spróbuj tego:

:4,4y  
P
Louis Salin
źródło
8

Próbować:

:4co11

Możesz użyć argumentu lub, 0aby wkleić do linii 1. Będzie to również działać z zakresami:

:m,n co k

skopiuje linii mprzez nlinii k+1. Ponadto nie ma znaczenia, gdzie jesteś w buforze. movePolecenia m, działa podobnie.

gvkv
źródło
2

To powinno to zrobić:

:4,12y
p
k
Umang
źródło
1
Nie, to linia numeruje od 4 do 12.
Lazer
Miałem na myśli skopiowanie i wklejenie linii 4 do linii 12.
Lazer
Edytowane. Czy tego chciałeś?
Umang
2

Inni wspominali już o najbardziej bezpośredniej metodzie wykonania tej czynności, :4yale chcę dodać dwie uwagi na jej temat, które mogą być przydatne:

Po pierwsze, jeśli wpiszesz :help range, dowiesz się wszystkiego o używaniu zakresów w celu zastosowania do poleceń w stylu Ex. BARDZO przydatne w wielu przypadkach i znacznie bardziej wszechstronne niż używanie numerów linii. Na przykład, jeśli chcesz zaciągnąć pierwszy wiersz rozpoczynający się od „yank” po początku dokumentu (nawet jeśli znajduje się on w pierwszym wierszu), użyj :0/^yank/y. Najpotężniejszą częścią zakresów jest możliwość ich łączenia, np. :./^Chapter/+50?Pete?dOznacza „Znajdź następny wiersz, aby rozpocząć od słowa Rozdział (wyszukiwanie do przodu od bieżącej linii), a następnie przeskocz do przodu o 50 linii i wyszukaj słowo Pete do tyłu, i usuń pierwszy wiersz, w którym go znajdziesz. ” Oprócz tego, że tak naprawdę nie porusza kursorem, po prostu robi to, co mu mówisz.

(Użyłem tego rodzaju specyfikacji zakresu do zautomatyzowania tworzenia dokumentacji, która polega na wyszukiwaniu nazwy funkcji pod kursorem, a następnie szukaniu następnego wiersza z napisem „Opis” i ciągnięciu go do określonego rejestru ... itp.)

Drugą wskazówką jest to, że powinieneś wiedzieć o skokach. Pisz, :help jump-motionsaby dowiedzieć się o tym w pełni, ale sposób, w jaki się tu odnosi, jest taki, że możesz przeskoczyć do linii 4, pociągnąć ją, a następnie POWRÓT za pomocą 4Gyy''(lub użyć strzałek zamiast apostrofów, aby skoczyć z powrotem do dokładnej pozycji początkowej, a nie tylko tej samej linii zacząłeś o.)

Dzika karta
źródło
2

Najkrótszy:

:1t. kopiuje pierwszy wiersz poniżej bieżącego.

Z zakresami: :1,4t.kopiuje linie od 1 do 4 (włącznie) poniżej prądu.

Możliwe również z względnymi numerami linii:

:-1t. kopiuje poprzedni wiersz poniżej bieżącego.

W twoim przykładzie :4t-1skopiowałbyś czwartą linię poniżej poszukiwanej linii.

Uwaga: :tjest synonimem :co[py]polecenia.

Erwin Rooijakkers
źródło