Jak mogę usunąć wiele wierszy w vi?

129

Próbowałem postępować zgodnie z następującymi wskazówkami:

Jak usunąć zaznaczony tekst w edytorze VI

ale

5dd

daje

E492: To nie jest polecenie edytora: 5dd

Wtedy spróbowałem:

5d

Który usuwa tylko jedną linię. Jak mogę usunąć wiele linii?

deltanovember
źródło
2
O ile dobrze pamiętam, 5dd powinno być poprawną składnią i powinno usunąć 5 wierszy, zaczynając od tego, na którym znajduje się kursor. Czy jest jakaś szansa, że ​​CAPS LOCK jest włączony i używasz układu klawiatury, który powoduje przesunięcie klawiszy numerycznych, gdy tak jest?
Eric J.

Odpowiedzi:

132

Wygląda na to, że wprowadzasz polecenia w trybie poleceń (inaczej „tryb Ex”). W tym kontekście :5dusunąłby wiersz numer 5, nic więcej. Aby 5dddziałać zgodnie z przeznaczeniem - to znaczy usunąć pięć kolejnych wierszy zaczynających się od kursora - wprowadź go w normalny tryb i nie poprzedzaj poleceń znakiem :.

nperson325681
źródło
142

Jeśli znasz numery wierszy, możesz usunąć wiele wierszy (zakresów):

:[start_line_no],[end_line_no]d

Uwaga: d oznacza usuń

gdzie
start_line_no to linia początkowa no, którą chcesz usunąć, a end_line_no to linia końcowa no, którą chcesz usunąć. Linie między początkiem a końcem, w tym początek i koniec, zostaną usunięte.

Na przykład:

:45,101d

Wiersze od 45 do 101, w tym od 45 do 101, zostaną usunięte.

Bonnie Varghese
źródło
14
Możesz również użyć $do oznaczenia ostatniej linii w pliku. Więc :45,$dusunie każdą linię od 45 do końca.
freehebees
Możesz nawet użyć wzorców, takich jak/<\/div>/
Björn,
1
Jeśli chcesz rozpocząć zasięg od lne, na którym aktualnie jesteś, możesz to zrobić:.,[end_line_no]d
Joe
15

Polecenia wymienione do użytku w trybie normalnym (przedrostek oznacza :tryb poleceń).
Przetestowane w Vimie.

Według kwoty linii:

  • numdd - usuwa num linii w dół począwszy od liczby pozycji kursora (na przykład 5ddusuwa bieżącej linii 4 linie pod nim => usuwa bieżącej linii ( Num-1 ), linie pod nią )
  • numdk - usunie num linii UP z bieżącej linii i samą bieżącą linię (np. 3dkusunie bieżącą linię i 3 linie nad nią => usuwa bieżącą linię i num linii nad nią )

Według numerów linii:

  • dnumG - usunie linie z bieżącej linii (włącznie) UP do numeru linii num (włącznie) (np. jeśli kursor jest obecnie w linii 5 d2G, usunie linie 2-5 włącznie)
  • dnumgg - usunie wiersze z bieżącej linii (włącznie) W DÓŁ do numeru linii num (włącznie) (np. jeśli kursor jest aktualnie na linii 2 d6gg, usunie linie 2-6 włącznie)
  • ( tylko tryb poleceń ) :num1 ,num2d - usunie linie numer linii num1 (włącznie) DOWN do numeru linii num2 (włącznie) . Uwaga: jeśli num1 jest większe niż num2 - vim zareaguje zBackwards range given, OK to swap (y/n)?

źródło
1
Pomogło mi to, ponieważ nie zdawałem sobie sprawy, że num 'd' d 'próbuje usunąć pod kursorem. Mój kursor znajdował się na dole pliku, próbując usunąć linie nad kursorem! dzięki za pomoc!
Jonathan Chad Faling
Usuwanie według numeru linii: ': <start>, $ d' usunie do końca pliku.
Devolus
11

Jeśli wolisz metodę niewizualną i znasz numery linii, chciałbym zasugerować Ci inny prosty sposób.

Przykład

Chcę usunąć tekst z linii 45 do linii 101.

Moja metoda sugeruje wpisanie poniższego polecenia w trybie poleceń:

45Gd101G

Brzmi:

Przejdź do wiersza 45 ( 45G), a następnie usuń tekst ( d) z bieżącego wiersza do wiersza 101 ( 101G).

Zauważ, że na vimmożesz użyć ggzamiast G.

Porównaj z odpowiedzią @Bonnie Varghese, która brzmi:

:45,101d[enter]

Powyższe polecenie z jego odpowiedzi wymaga wpisania 9 razy, w tym enter, gdzie moja odpowiedź wymaga wpisania 8 - 10 razy. Zatem szybkość mojej metody jest porównywalna.

Osobiście wolę coś 45Gd101Gwięcej, :45,101dponieważ lubię trzymać się składni polecenia vi, w tym przypadku:

+---------+----------+--------------------+
| syntax  | <motion> | <operator><motion> |
+---------+----------+--------------------+
| command |   45G    |        d101G       |
+---------+----------+--------------------+
fronthem
źródło
8

d5d "wycina" pięć linii

Zwykle po prostu wrzucam liczbę w środku, na przykład:

d7l = usuń 7 liter

Lon
źródło
7

Naciśnij Escklawisz, aby upewnić się, że nie jesteś w trybie edycji. Umieść kursor w pierwszej linii, która ma zostać usunięta. Wejdź :5dd. Bieżący wiersz i następne cztery wiersze powinny zostać usunięte.

Alternatywnie, jeśli masz włączoną numerację linii ...

Naciśnij Escklawisz, aby upewnić się, że nie jesteś w trybie edycji. Wpisz, :#,#dgdzie „#” oznacza początkowy i końcowy numer linii do usunięcia.

Brian S. Wilson
źródło
Nie sądzę, że na początku działa z okrężnicą.
Outcast
@PoeteMaudit To są prawidłowe polecenia vi. Dwukropek powoduje, że vi przesuwa kursor na dół ekranu i akceptuje polecenie edytora linii.
Kenster
5
  1. Esc aby wyjść z trybu wstawiania
  2. :1enter przejdź do wiersza 1 (zamień „1” na wiersz, który Cię interesuje)
  3. 5dd usuń 5 linii (z bieżącej linii)

Wpisz (dla numerowanych linii).:set number

JSON C11
źródło
3

Jeśli chcesz usunąć zakres PO wyzwoleniu określonej linii, możesz użyć czegoś takiego

:g/^TMPDIR/ :.,+11d

To usuwa 11 wierszy (włącznie) po każdym spotkaniu ^TMPDIR.

Evan Carroll
źródło
0

to jest dxd, a nie ddx

jeśli chcesz usunąć 5 linii, przesuń kursor na początek pierwszej linii do usunięcia i d5d

chris
źródło
0

Aby usunąć wszystkie linie użyj - ESC gg dG Aby usunąć kilka linii, powiedzmy 5, a następnie użyj ESC 5dd

kalariya parikshith
źródło
-1

Można to zrobić następująco:

  1. Ustaw kursor w miejscu, które chcesz usunąć.
  2. Naciśnij "v", aby rozpocząć wizualną selekcję.
  3. Przesuń kursor do pozycji, którą chcesz usunąć, używając klawisza strzałki.
  4. Naciśnij "d", co spowoduje usunięcie linii.
  5. Teraz zapisz i zakończ używając ": x!"
Sollymanul Islam
źródło