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ąć?
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.
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.
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),
vipvapaby zaznaczyć akapit, v2apaby zaznaczyć dwa akapity
dap, d2aprównież. Możesz usunąć w blokach []podobnychda[
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
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
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ąć.
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
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.
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.
51dd
. Możesz też użyć polecenia ruchu -50d<down arrow>
:set rnu
a 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.)Odpowiedzi:
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ąx
lubd
.źródło
.vimrc
działają?Shift
-v
... Próbowałem również użyćCTRL
klucza. Więc to działa i jest prawdopodobnie najwygodniejszym sposobem.CTRL
-v
) i Visual Block (Shift
-v
).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,
vi
a takżevim
, przy okazji, że twoje środowisko nie jest błogosławione tym drugim.źródło
/var/mail/username
zbiorczo usuwać wiadomości e-mail z mojego serwera i pozostawiać nietknięte ostatnie wiadomości. Robię znak, następnie wpisuję, na przykład,50000
następnie,gg
aby przejść do wiersza 50.000, a następnie usuwam wszystkie wiersze pomiędzy nimi. działa jak marzenie!vim
jako narzędzia do edycji plików gigabajtowych - wolę raczej narzędzia do przetwarzania tekstu, takie jakawk
i jego bracia :-)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
źródło
dap
bardzo łatwo zapamiętać jako „usuń akapit”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
Możesz także szarpać linie za pomocą
I znajdź i zamień za pomocą linii 24-39 za pomocą
źródło
Jeśli włączysz numery linii
set number
, możesz po prostudNNG
usunąć linie NN z bieżącej pozycji. Możesz więc przejść do początku linii, którą chcesz usunąć, i po prostud50G
zakładając, że jest to ostatnia linia, którą chcesz usunąć.źródło
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.
źródło
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:
V
,S-V
...), zaznacz tekst z ruchem kursora i naciśnijd
dap
źródło
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
źródło
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.
źródło
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>
.V
jest tutaj, aby wymusić ruch liniowo, ponieważ domyślnie/
ma charakter znakowy.źródło
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:
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.
źródło
Możesz także wprowadzić bardzo dużą liczbę, a następnie nacisnąć,
dd
jeśli chcesz usunąć wszystkie linie poniżej kursora.źródło
dG
, który usuwa się na końcu dokumentu, ponieważG
domyślnie przechodzi do ostatniego wiersza.Usuwanie bloku tekstu
Zakładając, że kursor znajduje się na początku bloku:
Wyjaśnienie
V
/^$<CR>
d
Wiązanie klucza
Bardziej niezawodne rozwiązanie:
Wyjaśnienie
:set nowrapscan
D
klucza (do następujących poleceń)::nnoremap D
V
/^\s*$\\|\%$<CR>
d
źródło