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


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.


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ć.


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


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.


2

To powinno to zrobić:

:4,12y
p
k

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.)


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.