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


91

W vimie często muszę usuwać lub szarpać / umieszczać duże bloki tekstu.

Mogę policzyć wiersze tekstu i wprowadzić coś takiego, jak 50ddusunąć 50 wierszy.

Ale to trochę boli. Jak mogę usunąć ten duży blok tekstu, nie wiedząc wcześniej, ile wierszy usunąć?


4
Skąd wiesz, gdzie jest koniec? Jeśli potrafisz opisać koniec, możesz usunąć do tego momentu. Jeśli potrafisz opisać, jak możesz movedo końca. Usunięcie do końca nie różni się niczym od przejścia do końca.
Martin York

@Loki, przejście do końca zwykle polega tylko na przewijaniu strony i klawiszy strzałek, dopóki tam nie dotrę. Może to być pierwsza lub dziesiąta pusta linia, może to być pierwszy nawias zamykający. Najważniejsze jest to, że różni się dość.

2
sprawdź również tę odpowiedź: stackoverflow.com/a/16407391/164835
Kent

Odpowiedzi:


111

Przejdź do linii początkowej bloku i wpisz ma(oznacz „a”, chociaż możesz oczywiście użyć różnych liter, a nawet wielu liter dla różnych znaków, pod warunkiem, że możesz zachować to prosto w głowie, co oznacza każda litera) .

Następnie przejdź do ostatniego wiersza i wprowadź d'a(usuń, aby zaznaczyć „a”) lub y'a(szarpnij, aby zaznaczyć „a”) (a) .

Spowoduje to usunięcie / szarpnięcie wszystkich linii od bieżącego do zaznaczonego (włącznie).

Następnie możesz wkleić go w innym miejscu za pomocą zwykłych poleceń wklejania, takich jak plub P.

Jest również kompatybilny z, via także vim, przy okazji, że twoje środowisko nie jest błogosławione tym drugim.


(a) Używam tego również, aby zapisać swoje miejsce w pliku, jeśli muszę szukać gdzie indziej czegoś takiego, jak na przykład kopiowanie i wklejanie definicji funkcji, którą chcę wywołać.

Po prostu zaznaczam bieżącą linię w ten sam sposób ma, a następnie odchodzę, by znaleźć to, czego szukasz.

Następnie, gdy go znajdę i skopiuję do rejestru, po prostu wchodzę, 'aaby wrócić i zaznaczyć „a”, linię, którą wcześniej zapisałem, i gdzie mogę ją wkleić.


9
Czy można do tego użyć trybu wizualnego, prawda?
jmc

3
To jeden sposób, jmc, ale nie jestem pewien, czy standardowy vi ma tryb wizualny.

5
Od kiedy przeszedłem z selekcji wizualnej do znakowania i względnych numerów linii około rok temu, odkryłem, że polecenia ruchu vi są znacznie szybsze i wydajniejsze niż selekcja wizualna. Chociaż późniejsze jest łatwiejsze za każdym razem, gdy naciskam vklawisz, zadaję sobie pytanie, czy naprawdę go potrzebuję, czy jest lepszy sposób na ruch?
Sukima,

1
Tak, w ten sam interesujący sposób @Sukima, że ​​czuję się bardziej wydajny, im mniej używam myszy, nawet w GUI. Jestem szybszy, jeśli mogę pozostać na klawiaturze.

3
Jeśli kiedykolwiek edytujesz coś z naprawdę długimi liniami, bardzo przydatna może być również wersja wsteczna (która odnosi się do miejsca w linii, a nie całej linii).
msouth

65

W Vimie użyj trybu linii wizualnej :

  1. Umieść kursor w górnym wierszu bloku tekstu / kodu, aby go usunąć
  2. Naciśnij V(To jest duże „V”: Shift+ v)
  3. Przesuń kursor w dół do dolnej części bloku tekstu / kodu, aby go usunąć
  4. naciśnij d

W przypadku usuwania dużych bloków tekstu jest to preferowane w porównaniu z prostym trybem wizualnym, ponieważ nie trzeba się martwić, w której kolumnie znajduje się kursor.


3
W kroku 3. możesz poruszać się szybciej, używając ruchów obiektów. Na przykład można użyć, }aby zaznaczyć cały akapit lub )zdania. Więcej można przeczytać o nich w:h object-motions
mxlian

2
Również wyszukiwanie podciągów /something<CR>jest bardzo skuteczną metodą dotarcia do końca bloku wyboru
mxlian

1
To jest moja preferowana metoda. Jednak alternatywnie, bez konieczności wielokrotnego naciskania, jaby przesunąć kursor w dół (krok 3), możesz wpisać numer linii, a następnie Gwybrać, aż do tej linii. Przykład:V150Gd
Ranhiru Jude Cooray,


39

Możesz łatwo usunąć duży blok tekstu, znając jego strukturę.

Jeśli jest to akapit, użyj: d{(np. Możesz poprzedzić go liczbą)

Jeśli jest to blok kodu w nawiasie, użyj: d%

Jeśli tekst pojawia się do końca pliku, użyj: dG

Jeśli wiesz, jak to się kończy, użyj: d/i wpisz tekst kończący, a następnie Enter(możesz także użyć wyrażenia regularnego, więc możliwości są nieograniczone).

Alternatywnie użyj trybu wizualnego ( V) i użyj klawiszy ruchu, aby szybko zaznaczyć tekst (np. Przez {) i usunąć go ( d).

Lub, jak sugeruje Lie Ryan, użyj, d/search-string/eaby usunąć tekst z bieżącego kursora do wyszukiwanego ciągu.

Zobacz: :help di :help motionwięcej informacji.


2
Istnieje również d/search-string/eusunięcie z bieżącego kursora do końca ciągu wyszukiwania, w tym samego łańcucha wyszukiwania, i c/search-queryprzejście do trybu wstawiania po usunięciu. Używanie d/z set incsearchjest zgrabną kombinacją, ponieważ pozwala interaktywnie dowiedzieć się, czy operujesz na odpowiednim zakresie tekstu, i pomaga Ci wiedzieć, kiedy przestać pisać zapytanie, aby uniknąć pisania więcej niż to konieczne.
Lie Ryan,

4
Uważam również za bardzo przydatny dz a(zewnętrznym) lub i(wewnętrznym) i specyfikatorem obiektu. Przedmioty takie jak ww słowo, pdla ustępu, (albo bza (...), [za [...], {lub Bza {...}itp dokumentacji wizualno-operatorów .
Shahbaz

22

Możesz używać ruchów i / lub obiektów tekstowych. Na przykład możesz usunąć wszystko od kursora do następnego pustego wiersza za pomocą d}. Jeśli kursor znajduje się w akapicie, akapit można usunąć za pomocą diplub dap. Jeśli kursor znajduje się w znaczniku HTML, możesz go usunąć za pomocą ditlub dat.

Dobre mnemoniki dla nich są „ d suĹ i nside” i „ d suĹ się rundę” (pkt / tag / nawias).


11

Zwyklę robię

:<start>,<end>d

co spowoduje usunięcie każdej linii między podanymi numerami linii początkowej i końcowej (w tym podanymi liniami).

Należy zauważyć, że zarówno starti endmoże być bezwzględne numery linii, wzorów lub przesunięcia z innej pozycji.

Zobacz także komentarz doubleDown na temat przeglądania dokumentacji zakresu Vima , zawiera kilka przydatnych wskazówek.

Przykład:

Powiedz, że masz następujący plik:

1. The quick brown
2. fox jumps
3. over the
4. lazy dog.

Następnie za pomocą polecenia :2,3dlub :/fox/,/over/dlub :/quick/+1,/lazy/-1lub :+1,+2djeśli jesteś na pierwszej linii lub :-1,.djeśli jesteś w trzeciej linii, możesz skończyć z:

1. The quick brown
4. lazy dog.

Ale to oznacza, że ​​nadal musisz liczyć linie? A może źle zrozumiałem twoją odpowiedź?
Martin Tournoij

7
Nie musisz liczyć linii, ale musisz znać numery linii.
jmc

Najpierw zrób :set ruler, a następnie przejdź do górnej i dolnej części tekstu, aby znaleźć starti endnumery wierszy, a następnie zrób:<start>,<end>d
roblogic

1
Możesz także użyć względnych numerów linii:+12,+24d
rpattabi

2
Faktycznie, można użyć parę numerów linii, parę wzorów lub mieszany na parę <start>i <end>za to. W celach informacyjnych patrz :h [range]. Jest więc w rzeczywistości nieco bardziej elastyczny niż się wydaje.
doubleDown

5

Jeśli masz do czynienia z blokami rozdzielonymi (np. Kodem lub znacznikami XML / HTML), możesz ustawić kursor na początku bloku i użyć trybu wizualnego, %aby szybko wybrać całe bloki kodu, a następnie nacisnąć daby je usunąć.


5
Alternatywnie, można użyć dapdo usunięcia paragrafu, da(, da{, da[, aby usunąć bloki delimeted nawiasy, szelki lub nawiasach kwadratowych. Dla html istnieje dat, który usuwa znacznik da'i da"usuwa ciągi. Istnieje również dip, di(itp warianty, które usunie wszystko wewnątrz ograniczników, ale pozostawić ograniczniki nienaruszone. Alternatywnie możesz użyć vap(resp vip), aby zaznaczyć cały akapit (odpowiednio wewnętrzny). (I tak jest va(i vi(.) Dalej jest capi cip(lub ca(i ci(), aby usunąć i przejść do trybu wstawiania (tj. „Zmień”). I yapszarpać
jmc

Myślę, że niektóre wiązania @jmc opisane w jego wcześniejszym komentarzu pochodzą z wtyczki surround.vim autorstwa Tima Pope'a. Jest to świetna wtyczka, którą poleciłbym zainstalować, ale to znaczy, że te wiązania nie są częścią domyślnej instalacji vima.
Haegin

5

Oprócz wszystkich innych dobrych rad dodaję d+ Shift+ Ldo usuwania wszystkiego od bieżącej pozycji kursora do ostatniej widocznej linii na ekranie. Powtórzenie polecenia spowoduje stosunkowo szybkie zejście na dół.


5

Numbers.vim Wtyczka jest bardzo przydatna dla. Jest to ulepszony sposób poprzedzania każdej linii numerem linii. Podobnie jak 'number'i 'relativenumber'obie role w jednym!

Jest on domyślnie włączony po instalacji, chcesz również dodać set numberdo vimrc, jeśli jeszcze go nie masz, ponieważ zachowuje się w dziwny sposób, jeśli go nie masz.

W trybie normalnym wygląda podobnie do :set relativenumber:

  3 call plug#begin('~/.vim/plugged')
  2 
  1 Plug 'myusuf3/numbers.vim'
7   set number█
  1 
  2 " Add indentation 'guidelines' (:IndentLinesToggle or <F11>)
  3 Plug 'Yggdroot/indentLine'

Pokazuje względne numery linii, z wyjątkiem linii, na której znajduje się kursor, gdzie pokazuje bezwzględną liczbę linii (w tym przypadku 7).

Jeśli następnie przejdziemy do trybu wstawiania , będzie on numberdziałał tak, jakby był ustawiony, zawsze pokazując bezwzględne numery linii:

  4 call plug#begin('~/.vim/plugged')
  5 
  6 Plug 'myusuf3/numbers.vim'
  7 set number█
  8   
  9 " Add indentation 'guidelines' (:IndentLinesToggle or <F11>)
 10 Plug 'Yggdroot/indentLine'

Jest jeszcze kilka opcji i kilka poleceń (sprawdź stronę główną), ale domyślne ustawienia powinny działać u większości osób.


Na początku myślałem, że ta odpowiedź jest nieco nie na temat, ale potem zainstalowałem wtyczkę i muszę powiedzieć, że to dla mnie zmieniacz gier. Zwykłem zamieniać ręcznie, a dodatkowy krok mentalny oznaczał, że unikałem używania tych ruchów. Dziękuję Ci!
Sukima,

1
To brzmi jak coś, co może zrobić jeden automatyczny insertEnter / InsertLeave do przełączania względnej numeracji linii. Czy coś brakuje?
Ben

Jestem BARDZO spóźniony na imprezę, ale @Ben ma rację, to tylko kilka wierszy polecenia automatycznego. Na przykład w moim vimrc mam set number, set relativenumberwtedy autocmd InsertEnter * :set norelativenumberiautocmd InsertLeave * :set relativenumber
B Warstwa

4

Inne podejście polega na tym, że jeśli próbujesz usunąć określony wzorzec, możesz po prostu wpisać d/delimEnter.


2

Możesz użyć normalnej procedury wprowadzania dplus ruch (jak już wyjaśniono w innych odpowiedziach). Wtyczka EasyMotion zapewnia nowe ruchy, których możesz użyć, które mogłyby rozwiązać problem w szybki i łatwy sposób.

Powiedzmy, że chcesz usunąć z bieżącej pozycji kursora do końca dowolnego słowa na ekranie, klawisze ruchu byłyby <Leader><Leader>e(podobnie jak eruch normalny ). Następnie wpisz wyróżnione litery, które pojawiają się na końcu danego słowa. Istnieje również ruch linii, dzięki czemu można usunąć bieżącą linię do danej linii za pomocą <Leader><Leader>j.

Mam <Leader>ustawiony klucz na ,. Zatem pełne polecenie to d<Leader><Leader>e{podświetlona litera (litery)}.

Od :help easymotion:

EasyMotion zapewnia znacznie prostszy sposób używania niektórych ruchów w vimie. Wyjmuje <number>z <number>w lub <number>f {char}, podświetlając wszystkie możliwe opcje i umożliwiając naciśnięcie jednego klawisza, aby przejść bezpośrednio do celu.

Po uruchomieniu jednego z dostępnych ruchów cały widoczny tekst przed kursorem lub po nim jest wygaszany, a obiekty ruchowe są podświetlone.

Edytować:

Repozytorium github EasyMotion znajduje się na stronie https://github.com/Lokaltog/vim-easymotion .

Ten reddit o ludziach korzystających z easymotion może być zabawną lekturą.


1

Istnieje proste rozwiązanie, które może rozwiązać Twój problem.

Umieść kursor na początku bloku tekstowego, który chcesz usunąć, i zrób to d50gg.

Spowoduje to usunięcie wszystkich linii z aktualnej pozycji do 50 linii tekstu.

eq: jeśli twój kursor znajduje się w linii 46 , d50ggusunie 4 linie.


1
Sugeruję użycie Gzamiast gg, ponieważ działa również w vi, i oczywiście :set numberzawsze jest przydatne do znalezienia numeru linii, do której chcesz przejść.
Random832

Chodzi o to, że nie wiesz, ile wierszy chcesz usunąć.
200_sukces

200_success, nie musisz wiedzieć, ile wierszy chcesz usunąć z odpowiedzi, którą opublikowałem. Wszystko, co musisz wiedzieć, to „do którego wiersza chcesz usunąć”
Geee

1

Użyj trybu wizualnego z podświetlaniem linii.

  1. Umieść kursor w górnym wierszu bloku tekstu / kodu, aby go usunąć
  2. Naciśnij Shift+v
  3. Przesuń kursor w dół do dolnej części bloku tekstu / kodu, aby go usunąć
  4. naciśnij d

Wolę tę metodę do usuwania bloków kodu, ponieważ usuwa ona całe linie w porównaniu do zwykłego trybu wizualnego, w którym musisz ustawić kursor w prawej kolumnie, aby usunąć to, co chcesz.


3
Zasadniczo powtarzasz odpowiedź do @ 200_success.
Martin Schröder

1

Nie lubię mieć relativenumberwłączonego przez cały czas, więc skonfigurowałem Vima, aby włączał go tylko w trybie wizualnym:

" Entering Visual mode
nnoremap <silent>     v :set relativenumber cursorcolumn<CR>v
nnoremap <silent> <C-q> :set relativenumber cursorcolumn<CR><C-q>
nnoremap <silent>    gv :set relativenumber cursorcolumn<CR>gv
nnoremap <silent>     V :set relativenumber<CR>V

" When finished
augroup ClearCursorColumnAndLine
    autocmd!
    autocmd CursorHold * set norelativenumber nocursorcolumn nocursorline
augroup END

Ułatwia to zadanie:

V49jd

ponieważ po trafieniu Vmożesz zobaczyć, jak daleko jest linia docelowa.

Na dłuższą metę może to być denerwujące (tekst przesuwa się w prawo i lewo, gdy relatywna liczba jest włączona / wyłączona), ale jak dotąd bardzo mi się to podoba.


1
Myślę, że używasz v<Esc>d50j?
Martin Tournoij

Dzięki, rzeczywiście napisałem to niepoprawnie. Właściwie zaczynam od tego, Vczy wiem, że będę wykonywał operacje liniowe, a potem mogę zostawić to ddo końca, dla większej pewności.
joeytwiddle

Moja odpowiedź wydaje się być przybliżeniem liczb przez biednego człowieka. Wtyczka vim oferowana w innej odpowiedzi. ;-)
joeytwiddle

1

Co mi pasowało vi:

  1. :set number aby wyświetlić numer linii do miejsca, w którym chciałem usunąć;

    +1289 idle 
    +1289 idle 
    +1290 # <- I want to delete until here
    +1291 if [[ ! -z "$SFIN" ]]
    
  2. Wróć do linii, od której musiało się rozpocząć usuwanie

  3. Użyto usunięcia z bieżącej linii, w trybie normalnym> d1290G
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.