Vim do szarpania linek

84

Jestem programistą C #, który niedawno postanowił poszerzyć swoją wiedzę o dostępnych mi narzędziach. Pierwszym narzędziem, którego postanowiłem się nauczyć, jest Vi / Vim. Jak dotąd wszystko szło dobrze, ale jest kilka pytań, na które nie mogę znaleźć odpowiedzi:

  1. Powiedzmy, że chciałem wyciągnąć szereg linek. Wiem, że jest na to wiele sposobów, ale chciałbym to zrobić według numeru linii. Pomyślałem, że będzie to podobne do działania poleceń zastępczych, coś w stylu 81,91y. Czy jest na to sposób?

  2. Jestem trochę zdezorientowany co do gpolecenia w trybie normalnym. Wydaje się, że robi mnóstwo rzeczy i nie mogę tak naprawdę określić, co robi polecenie g. Nie wiem, czy jest to polecenie ruchu, czy rodzaj „złap wszystko” dla innych poleceń wykonywanych w trybie normalnym. Czy ktoś może mi to wyjaśnić lub wskazać odniesienie, które daje dobre wyjaśnienie gpolecenia?

jnadro52
źródło
1
Czy wiesz o komendzie ": help" w vim (1)?
Steve Emmerson
Tak, ale nie udało mi się go znaleźć we wszystkich odniesieniach. Okazuje się, że myślałem, że zrobię to z trybu normalnego, ale hometoast pokazał, jak trzeba to zrobić z trybu poleceń. W przypadku polecenia g po prostu stwierdzam, że pomoc nie wiąże wszystkiego razem, tak jak oczekiwałbym od innych poleceń.
jnadro52
3
Na marginesie, może zechcesz napisać jeden post na każde pytanie.
Dana,
1
Zrobię to w przyszłości. Byłem bardziej zainteresowany pierwszym pytaniem, po prostu pomyślałem o drugim, gdy pisałem pierwsze.
jnadro52

Odpowiedzi:

140

Linie Yank 81-91

:81,91y<enter>

Jeśli twoje palce nie lubią znajdować klawiszy :i ,, to również zadziała (przejdź do linii 81, przeciągnij 11 linii)

81gg11yy 

Moje jedyne zastosowanie gto 5gg. Aby przejść do piątej linii. 22gg: 22 linia. Jak powiedział jimbo, tak naprawdę jest to tylko modyfikator niektórych innych poleceń.

Aby uzyskać kompletność, ( http://vim.wikia.com/wiki/Power_of_g ) wyjaśnia wiele, jak gdziała w trybie poleceń.

hometoast
źródło
2
Użycie wielkich liter również daje różne warianty: ggprzejdzie do pierwszej linii, a Gdo ostatniej. Również 5Gprzechodzi do linii 5. Znaki mogą być również używane zamiast numerów linii (dobre dla makr), np .: :'a,52y
NVRAM
1
Jeśli nie boisz się klawisza Shift, 81G11Yjest jeszcze „krótszy”.
Jens
1
Wadą trybu normalnego jest to, że tracisz swoje „miejsce”; można sobie wyobrazić mxprzed i 'xpo, ale wtedy wersja trybu poleceń staje się dużo bardziej zwięzła. Humm ... gdy tylko to napisałem, zobaczyłem odpowiedź od @Asta.
Eric Smith
1
@WilliamRoss to faktycznie umieszcza linie w buforze do użytku w vimie, niekoniecznie w schowku systemowym, gdzie możesz wkleić, powiedzmy, do Notatnika za pomocą CTRL + V. Zobacz powiązane pytanie: Jak skopiować / wkleić tekst z vi do różnych aplikacji
hometoast
1
Bawi mnie to, ponieważ jedynym powodem, dla którego szukałem pierwszego rozwiązania, było unikanie liczenia linii lub robienia odejmowania w głowie.
Paul Parker
22

Możesz także skopiować bieżące wiersze do aktualnej lokalizacji kursora za pomocą „t”.

:81,91t.<enter>

Spowoduje to wklejenie linii 81-91 pod linią, na której znajduje się kursor.

Nauczyłem się tego z http://vimcasts.org, który jest doskonałym źródłem informacji o VIM.

Asta
źródło
Co to t.oznacza?
CivFan
2
Z mojego zrozumienia tmożna uważać, że jest tchory lub to i .jest to adres bieżącej linii.
Asta
1
@CivFan to synonim:copy
D. Ben Knoble,
11

Lubię też używać opcji względnego numeru linii vima, co oznacza, że ​​mogę po prostu wpisać:

:-10,-7ya a

aby yankować tekst do nazwanego bufora a.

NB Podanie A doda to, co szarpiesz, do bieżącej zawartości bufora a.

Nie zapomnij, że możesz również kopiować bloki tekstu i przenosić bloki tekstu za pomocą podobnych poleceń:

:-10,-7co .

oznacza skopiowanie czterech wierszy tekstu 10 wierszy powyżej do poniżej bieżącego wiersza i

:-10,-7mo .

oznacza przeniesienie czterech wierszy tekstu o 10 linii powyżej do poniżej bieżącej linii.

Rob Wells
źródło
8

GKomenda trafia do pewnej liczby linii, jeśli jest mu towarzyszyć wartość licznika. 81Gwłącza cię do linii 81.

yPolecenie to może być połączone z ruchem, np G. Więc aby szarpnąć wszystko do linii 91, możesz użyć y91G.

Razem otrzymujesz:

81Gy91G

Idź do linii 81, a następnie szarp, jadąc do linii 91.

sth
źródło
1
Chciałbym móc zagłosować za tym więcej niż raz. Coś, co mi pomogło, to użycie tego do szarpnięcia do rejestru (w moim przypadku rejestr + tj. Schowek):81G"+y91G
mgarey
1
@mgarey czy nie ma sposobu, aby szarpnąć bezpośrednio do rejestru przy użyciu składni zakresu linii? 81,91yi jakoś wycelować w rejestr?
diplosaurus
1
@diplosaurus Prawdopodobnie, ale nie wiem. To brzmi jak pytanie, które możesz zadać na vi.stackexchange.com, jeśli jeszcze go tam nie ma lub tutaj na SO. Byłbym zainteresowany. Nie jestem ekspertem od Vimów.
mgarey
2
@mgarey Musiałem wykazać się kreatywnością dzięki wyszukiwarce Google, ale znalazłem to tutaj: stackoverflow.com/questions/16225366/… . :81,91y +
diplosaurus
@diplosaurus :81,91y +nie działa. Działa dla innych rejestrów, takich jak :81,91y ana przykład, ale wydaje się, że nie lubi tego +rejestru. Czy to zdecydowanie działa na innych ludzi?
ojunk
4

gsam nic nie robi. Jest to jedno z kilku meta-rozkazów, które przechowuje kilka niepowiązanych ze sobą poleceń.

z to kolejna taka komenda.

Jimbo
źródło
Dziękuję Ci. Rozumiem teraz, że jest używany tylko do różnych celów. Kiedy próbuję nauczyć się tych narzędzi, staram się skojarzyć polecenia z czymś, co potrafię wyabstrahować, aby pamiętać, jak go właściwie używać. Wygląda na to, że polecenie g jest tylko jedną z tych rzeczy, które musisz zapamiętać, aby poprawnie używać.
jnadro52
2

Vim :help indexopisuje gjako:

|g|             g{char}            extended commands, see |g| below

Przewiń w dół (lub :help g), aby wyświetlić listę.

Matthew Slattery
źródło
1
Znałem: pomoc, ale NIE byłem zaznajomiony z: pomoc (polecenie). Będzie to bardzo przydatne w przyszłości. Dziękuję uprzejmie, sir.
jnadro52
2

Najlepszym rozwiązaniem byłoby wejście w „tryb wizualny” wciskając v. A po zaznaczeniu linii wystarczy je skopiować naciskając y. Następnie wklej skopiowane linie, naciskając p.

Taras Vaskiv
źródło
Nie zgadzam się, ale tylko tryb wizualny bc jest czasami tak wolny.
D. Ben Knoble,
1

Oprócz :91,96y atego yank ( y) wiersze od 91 do 96 do rejestru a(wklejone "ap), yankowane wiersze mogą być dołączane do rejestru za pomocą:

:91,96y A

Tzn. Kapitalizacja Arejestru powoduje operację dołączania do rejestru azamiast nadpisywania. Kapitalizacja rejestru zawsze działa w ten sposób, np. :let @A=';'Dodaje ;do rejestru a.

Użycie plus (+) lub minus (-) wskazuje linie względem aktualnej pozycji kursora:

:-10,+10y b

To znaczy wyszarpnęłoby ( y) 21 linii wokół aktualnej pozycji kursora i umieściło je w rejestrze b.

Brak danych wejściowych w rzeczywistości reprezentuje również bieżącą pozycję kursora, co oznacza, że:

:-5,y a

wyszarpnąłby tekst z 5 linii powyżej do bieżącej pozycji kursora do nazwanego bufora ai:

:,+5y a

yankowałoby 5 linii za bieżącą pozycją kursora do bufora a.

Uwaga: Jeśli masz makro w buforze a, zostało ono właśnie nadpisane przez poprzednie yankowanie, ponieważ rejestry yank i rejestry makr to tak naprawdę to samo. Dlatego przypadkowo możesz wkleić makro, edytować je, a następnie wciągnąć z powrotem do rejestru. Osobiście używam liter, do których sięgam lewą ręką, do szarpania, a liter, do których dochodzi prawą ręką, do makr.

Przesuwanie bloków tekstu wygląda następująco:

:+10,+13m.

co oznacza przeniesienie czterech wierszy znajdujących się 10 wierszy przed bieżącym kursorem, poniżej bieżącej linii.

Uzupełnienie

I wcześniej zmieszany yaw :91,95ya abyć jakoś synonimem ya{motion}gdzie ruch został dostarczony 91,95. To było niepoprawne, a „a” yajest zupełnie niepotrzebne. Na moją obronę my help yanknie przekazuję, że yajest to możliwy alias yank.

Paul Parker
źródło
1
:yato skrót od :yank, więc nie jestem pewien, co myślę o szarpaniu wszystkich linii . Ale dobra robota, skondensowanie niektórych rozproszonych informacji
D. Ben Knoble,
Też tak myślałem, dopóki nie spojrzałem :help yank. Nie ma aliasu yadla yank. Masz jednak rację, ato nie oznacza „wszystko”, technicznie oznacza „a”. Wolę jednak powiedzieć „wszystko”, ponieważ wydaje mi się to bardziej sensowne.
Paul Parker,
2
:[range]y[ank] [x] Yank [range] lines [into register x]nawiasy kwadratowe w y[ank]wskazują, że [ank]są one opcjonalne. :y, :yai :yansą domniemanymi aliasami dla:yank
D. Ben Knoble,
Stoję poprawione :) Litera a nie jest konieczna. Zmieni odpowiedź, aby odzwierciedlić.
Paul Parker,
1
Twój dodatek jest fajny, ale :yay
odnosiłem się
0

Jako długi użytkownik Vi / Vim mam tendencję do używania „znaczników” zamiast numerów linii (lub „znaczników linii”). Działa to tak: mjest znakiem „mark”; następnie użyj dowolnej litery, aby zidentyfikować / nazwać znak. Aby powrócić do znaku poprzedzającego nazwany znak pojedynczym cudzysłowem ( 'a) Te znaki mogą być używane jako zakres. Przykłady:

File:
    <line 1>
    <line 2>
    <line 3>
    <line 4>
    <line 5>

W trybie poleceń przesuń kursor do linii 2, wpisz ma. przewiń do linii 4, wpisz mb. Aby szarpnąć od znaku a do znaku b, wpisz:

    :'a,'byank

Aby usunąć od znaku a do znaku b typu:

    :'a,'bdel

Aby wyszukać od znaku a do znaku b i zamienić „ine” na „atrament”:

    :'a,'bs/ine/ink/g

Aby skopiować znak od a do znaku b i wkleić poniżej bieżącej pozycji („kropka” zawsze odnosi się do wiersza, w którym obecnie znajduje się kursor):

    :'a,'bco . 

Przesuwaj wiersze kodu, między znakami od a do b , o jedną tabulację w prawo (użyj przeciwnej strzałki,, <aby przejść w lewo):

    :'a,'b> 

W trybie poleceń możesz wrócić do znaków, po prostu wpisując, 'aaby wrócić do zaznaczonej linii a. Wpisywanie ''przenosi cię z powrotem do poprzedniej pozycji (niestety pamięta tylko poprzednią pozycję, a nie dwie wstecz).

Możesz szarpać do nazwanych buforów, kopiować, usuwać linie, wyszukiwać i zamieniać tylko fragmenty kodu itp. Bez konieczności znajomości numerów linii.

BentChainRing
źródło
0

Aby wyrwać linie z linii numer 81 do 91:

podejście 1: 81gg11yy

nieźle, ale musisz trochę matematyki, aby dowiedzieć się, ile linii do szarpnięcia

Sposób 2: 81ggNastępnie shift+vczym 91ggnastępniey

NAJLEPSZE W MOJEJ OPINII, ponieważ jest to proste, musisz tylko wiedzieć, co oczywiste, tj. Z którego numeru linii do którego numeru chcesz szarpnąć

Firoj Siddiki
źródło