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ąć?


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.


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.


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                  

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

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


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.


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

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


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.


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.


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.


1

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


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