vim - Jak usunąć duży blok tekstu bez liczenia linii?

193

W vimie często zdarza mi się, że usuwam (lub kopiuję) duże bloki tekstu. Można policzyć wiersze tekstu i powiedzieć (na przykład), 50ddaby usunąć 50 wierszy.

Ale jak usunąć ten duży blok tekstu, nie wiedząc, ile wierszy należy usunąć?

Justin Ethier
źródło
1
Jeśli okno jest wystarczająco duże, pomocne jest tutaj względne numerowanie linii. Umieść kursor w górnej części okna, znajdź względny numer linii, która ma zostać usunięta (powiedzmy, n), dodaj jeden, następnie wpisz tę liczbę, a następnie wpisz dd. Np. Jeśli n = 50, to 51dd. Możesz też użyć polecenia ruchu -50d<down arrow>
BallpointBen,
„Znajdź względny numer linii” - lub użyj, :set rnua Vim zrobi to natychmiast! Linia, na której jesteś, nadal będzie ponumerowana absolutnie, ale linie powyżej i poniżej kursora będą symetrycznie ponumerowane 1, 2, ... (i zaktualizuj wraz z ruchem kursora, zdarzeniami na poziomie pliku itp.)
John P

Odpowiedzi:

287

Nie jestem guru vim, ale w tych okolicznościach używam „trybu wizualnego”. W trybie komend wpisz V(kapitał). Następnie przesuń w górę / w dół, aby podświetlić blok, który chcesz usunąć (działają wszystkie zwykłe polecenia ruchu). Następnie usuń go za pomocą xlub d.

Mata
źródło
2
Dziwne. Wiem, że działa dla mnie (tm) tutaj w systemie Linux (vim 7.3.50) i gVim w systemie Windows. Sądząc po innych odpowiedziach, działa dla innych ludzi. Może niektóre ustawienia w twoim ustawieniu .vimrcdziałają?
Mat
OK, z jakiegoś powodu nie zdawałem sobie sprawy, że możesz wejść w tryb linii wizualnej za pomocą Shift- v... Próbowałem również użyć CTRLklucza. Więc to działa i jest prawdopodobnie najwygodniejszym sposobem.
Justin Ethier
7
Możesz wyjaśnić, że istnieją dwa tryby wizualne - Visual Line ( CTRL- v) i Visual Block ( Shift- v).
Justin Ethier
2
Często to robię. Ale zawsze uważam to za oszustwo i niezbyt idealny vim.
Jim Mitchener
9
W rzeczywistości istnieją trzy tryby wizualne: Tryb wizualny (oparty na znakach {v}), tryb wizualny liniowy (oparty na liniach {Sv}) i tryb wizualnych bloków (umożliwia wybór bloków {Cv})
Tom Regner
293

Przejdź do linii początkowej i wpisz ma(zaznacz „a”). Następnie przejdź do ostatniego wiersza i wprowadź d'a(usuń, aby zaznaczyć „a”).

Spowoduje to usunięcie wszystkich wierszy z bieżącego do zaznaczonego (włącznie). Jest również kompatybilny z, via także vim, przy okazji, że twoje środowisko nie jest błogosławione tym drugim.

paxdiablo
źródło
3
Te cholerne skały! Nienawidzę tego, jak długo po prostu coś robię (jak liczenie linii), zanim szukam lepszego rozwiązania. Dzięki!
ryanjdillon
1
naprawdę niesamowite Zawsze używam trybu wizualnego, aby usunąć blok, ale w ten sposób jest lepiej +1
hish
4
Uważam, że jest to bardziej pomocne niż tryb wizualny przy usuwaniu linii 500k +
Michael - Where's Clay Shirky
Naprawdę praktyczna odpowiedź. Używam go, aby /var/mail/usernamezbiorczo usuwać wiadomości e-mail z mojego serwera i pozostawiać nietknięte ostatnie wiadomości. Robię znak, następnie wpisuję, na przykład, 50000następnie, ggaby przejść do wiersza 50.000, a następnie usuwam wszystkie wiersze pomiędzy nimi. działa jak marzenie!
otmezger
1
@horta, prawdopodobnie nie używałbym vimjako narzędzia do edycji plików gigabajtowych - wolę raczej narzędzia do przetwarzania tekstu, takie jak awki jego bracia :-)
paxdiablo
46

Możesz także użyć trybu wizualnego (niektóre polecenia są również dostępne z opcją usuwania), vip vapaby zaznaczyć akapit, v2apaby zaznaczyć dwa akapity dap, d2aprównież. Możesz usunąć w blokach [ ]podobnychda[

Dla odniesienia: rodzaje obiektów. Z dokumentacji vima: sekcja 4. http://vimdoc.sourceforge.net/htmldoc/visual.html

4. Operating on the Visual area             *visual-operators*

...    
The objects that can be used are:
aw  a word (with white space)           
iw  inner word                  
aW  a WORD (with white space)           
iW  inner WORD                  
as  a sentence (with white space)           
is  inner sentence                  
ap  a paragraph (with white space)          
ip  inner paragraph                 
ab  a () block (with parenthesis)           
ib  inner () block                  
aB  a {} block (with braces)            
iB  inner {} block                  
a<  a <> block (with <>)                
i<  inner <> block                  
a[  a [] block (with [])                
i[  inner [] block                  
M'vy
źródło
1
da [, da {, da "wszystko przydatne dla programistów
Rene Wooller
1
dzięki! dapbardzo łatwo zapamiętać jako „usuń akapit”
Tropilio,
38

Istnieje tutaj wiele lepszych odpowiedzi, ale dla kompletności wspomnę o metodzie, której użyłem przed przeczytaniem niektórych świetnych odpowiedzi wymienionych powyżej.

Załóżmy, że chcesz usunąć z wierszy 24–39. Możesz użyć polecenia ex

:24,39d

Możesz także szarpać linie za pomocą

:24,39y

I znajdź i zamień za pomocą linii 24-39 za pomocą

:24,39s/find/replace/g
daviewales
źródło
11

Jeśli włączysz numery linii set number, możesz po prostu dNNGusunąć linie NN z bieżącej pozycji. Możesz więc przejść do początku linii, którą chcesz usunąć, i po prostu d50Gzakładając, że jest to ostatnia linia, którą chcesz usunąć.

Jim Mitchener
źródło
10

To zależy od tego, czym jest ten duży blok . Może po prostu chcesz usunąć akapit, w którym to przypadku dipzrobiłoby to.

René Nyffenegger
źródło
Dzięki za wskazówkę. Niestety pracuję tu z kodem i zwykle potrzebuję więcej drobiazgowej kontroli.
Justin Ethier
1
Pracuję też z kodem i logiczne bloki oddzielam pustą linią. Ta wskazówka właśnie zrobiła mi dzień. Teraz mogę usunąć duże bloki logiki za pomocą trzech naciśnięć klawiszy.
miniml
działa, ponieważ „d” oznacza usuń, „p” w tym kontekście oznacza akapit
użytkownik98761,
7

Istnieje kilka możliwości. To, co najlepsze, zależy od tekstu, nad którym pracujesz.

Przychodzą mi na myśl dwie możliwości:

  • Przełącznik trybu wizualnego ( V, S-V...), zaznacz tekst z ruchem kursora i naciśnijd
  • usuń cały akapit za pomocą: dap
Tom Regner
źródło
używam dap bardzo często teraz, kiedy o nim wiem i wolę, aby dis i dip, ale zawsze usuwa blok i pustą linię, która pojawia się po bloku, ale był sposobem na usunięcie bloku i pustej linii, która jest przed nim?
Funkodebat
W środku tekstu z akapitami nie ma różnicy składniowej wyniku, prawda? Jeśli tak, proponuję napisać, co chcesz, z przykładami, w nowym pytaniu.
Tom Regner
6

Jeśli cały blok jest widoczny na ekranie, możesz użyć ustawienia liczby względnej. Zobacz: pomoc relativenumber. Dostępne w 7.3

Rumple Stiltskin
źródło
Nie zdawałem sobie sprawy z tego, jak przydatne: se rnu było, dopóki nie zacząłem go używać - świetny do znajomości 50dd i nawigacji, 50j
rshdev
3

Możesz umieścić kursor na początku lub na końcu bloku i przejść do trybu wizualnego (shift-v). Następnie po prostu przesuwaj w górę lub w dół, aż żądany blok zostanie podświetlony. Na koniec skopiuj tekst, naciskając y lub wytnij go, naciskając d.

Sędzia Maygarden
źródło
może dziwne, ale na tej podstawie wymyśliłem sposób zaznaczania tekstu z wybranego punktu środkowego w linii i zaznaczania wielu linii poniżej w tym samym punkcie na końcu każdej linii. Dokładnie tego szukałem.
nanker
3

Oprócz innych ruchów, które już tu wspomniano, istnieje również /{pattern}<CR>ruch, więc jeśli wiesz, że chcesz usunąć do wiersza zawierającego foo, możesz to zrobić dV/foo<CR>. Vjest tutaj, aby wymusić ruch liniowo, ponieważ domyślnie /ma charakter znakowy.

ZyX
źródło
3

Liczenie linii jest dla mnie zbyt uciążliwe, ale liczenie „akapitów” nie jest takie złe. „{” i „}” przesuwają kursor do pierwszego pustego wiersza odpowiednio przed i za kursorem. Operacje przesuwania kursora można łączyć z usuwaniem, a kilka innych odpowiedzi używało podobnego podejścia (dd dla linii, dG na końcu dokumentu itp.)
Na przykład:

/* Lorem ipsum dolor sit amet, consectetur adipiscing elit. */

Lorem *ipsum(void) {
  return dolor(sit, amet);
}

Jeśli kursor zaczyna się powyżej bloku komentarza, „d}” usuwa blok komentarza, a „d2}” usuwa zarówno blok komentarza, jak i blok kodu. Jeśli kursor zaczyna się poniżej bloku kodu, „d {” usuwa kod, a „d2 {” usuwa oba. Oczywiście możesz pominąć jeden blok, przesuwając najpierw kursor: „{d {” lub „} d}”.

Jeśli jesteś zgodny ze swoją białą spacją lub możesz policzyć akapity na pierwszy rzut oka, powinno to działać. Plik pomocy Vima zawiera więcej sztuczek kursora, jeśli jesteś zainteresowany.

John P.
źródło
1

Możesz także wprowadzić bardzo dużą liczbę, a następnie nacisnąć, ddjeśli chcesz usunąć wszystkie linie poniżej kursora.

Rohit Pruthi
źródło
Może być jeszcze łatwiejszy w użyciu dG, który usuwa się na końcu dokumentu, ponieważ Gdomyślnie przechodzi do ostatniego wiersza.
andyg0808
1

Usuwanie bloku tekstu

Zakładając, że kursor znajduje się na początku bloku:

V/^$<CR>d (where <CR> is the enter/return key)

Wyjaśnienie

  • Wejdź w tryb „liniowo-wizualny”: V
  • Podświetl do następnego pustego wiersza: /^$<CR>
  • Usunąć: d

Wiązanie klucza

Bardziej niezawodne rozwiązanie:

:set nowrapscan
:nnoremap D V/^\s*$\\|\%$<CR>d

Wyjaśnienie

  • Wyłącz zawijanie wyszukiwania: :set nowrapscan
  • Zmień przypisanie Dklucza (do następujących poleceń)::nnoremap D
  • Wejdź w tryb „liniowo-wizualny”: V
  • Podświetl, aż do następnej pustej / białej linii lub EOF: /^\s*$\\|\%$<CR>
  • Usunąć: d
Jon Nadal
źródło