Як я можу видалити кілька рядків у vi?


129

Я намагався слідувати наступному:

Як видалити вибраний текст у редакторі VI

але

5dd

дає

E492: Не команда редактора: 5dd

Потім я спробував:

5d

Який видаляє лише один рядок. Як я можу видалити кілька рядків?


2
Наскільки я пам'ятаю, 5dd повинен бути дійсним синтаксисом і повинен видаляти 5 рядків, починаючи з того, на якому знаходиться курсор. Будь-який шанс CAPS LOCK увімкнено, і ви використовуєте розкладку клавіатури, яка змушує цифрові клавіші зміщуватися, коли вона є?
Ерік Дж.

Відповіді:


132

Здається, що ви вводите команди в командному режимі (ака. "Ex mode"). У цьому контексті :5dбуде видалено рядок №5, нічого іншого. Для 5ddроботи за призначенням, тобто видаліть п’ять послідовних рядків, починаючи з курсору, - введіть її в звичайний режим і не встановлюйте префікс команд :.



142

Ви можете видалити кілька рядків (діапазон), якщо знаєте номери рядків:

:[start_line_no],[end_line_no]d

Примітка: d означає видалення

де
start_line_no - це початковий рядок, який ви не хочете видаляти, а end_line_no - це закінчувальний рядок, який ви не хочете видаляти. Рядки між початком і кінцем, включаючи початок і кінець, буде видалено.

Наприклад:

:45,101d

Рядки між 45 і 101, включаючи 45 і 101, будуть видалені.


14
Ви також можете $позначити останній рядок у файлі. Так :45,$dби видалити кожен рядок від 45 до кінця.
вільнолюби

Ви навіть можете використовувати такі шаблони, як/<\/div>/
Björn

1
Якщо ви хочете розпочати діапазон з lne, на якому ви зараз перебуваєте, ви можете зробити:.,[end_line_no]d
Джо

15

Команди, перелічені для використання в звичайному режимі (префікс :для для командного режиму).
Випробуваний у Вім.

За сумою рядка:

  • numdd - видалить числові рядки DOWN початковий відлік з поточного положення курсору (наприклад 5dd, видалить поточний рядок та 4 рядки під ним => видаляє поточний рядок та ( num-1 ) рядки під ним )
  • numdk - видалить числові рядки UP із поточного та поточного рядка (наприклад 3dk, видалить поточний рядок та 3 рядки над ним => видаляє поточний рядок та рядки num над ним )

За номерами рядків:

  • dnumG - видалить рядки з поточного рядка (включно) UP до номера рядка num (включно) (наприклад, якщо курсор наразі знаходиться на рядку 5, d2Gбуде видалено рядки 2-5 включно)
  • dnumgg - видалить рядки з поточного рядка (включно) DOWN до номера рядка num (включно) (наприклад, якщо курсор на даний момент на другому рядку d6ggбуде видалено рядки 2-6 включно)
  • ( лише в командному режимі ) :num1 ,num2d - видалить рядки номер рядка num1 (включно) Вниз ДО номера рядка num2 (включно) . Примітка: якщо num1 більше, ніж num2 - vim реагує наBackwards range given, OK to swap (y/n)?

1
Це допомогло мені, оскільки я не зрозумів, що число 'd' 'd' намагається видалити під курсором. У мене був курсор внизу файлу, який намагався видалити рядки над курсором! Дякую за допомогу!
Джонатан Чад Фалінг

Видалення за допомогою linenumber: ': <start>, $ d' буде видалено до кінця файлу.
Деволус

11

Якщо ви віддаєте перевагу методу невізуального режиму та визнаєте номери рядків, я хотів би запропонувати вам інший простий спосіб.

Приклад

Я хочу видалити текст з рядка 45 до рядка 101.

Мій метод пропонує вам ввести команду нижче в командному режимі:

45Gd101G

У ньому написано:

Перейдіть до рядка 45 ( 45G), а потім видаліть текст ( d) з поточного рядка до рядка 101 ( 101G).

Зауважте, що замість цього vimви можете використовувати .ggG

Порівняйте відповідь @Bonnie Varghese:

:45,101d[enter]

Команда, викладена вище, вимагає ввести 9 разів, в тому числі enter, коли моя відповідь вимагає введення 8 - 10 разів. Таким чином, швидкість мого методу порівнянна.

Особисто я 45Gd101Gбільше віддаю перевагу :45,101dтому, що мені подобається дотримуватися синтаксису команди vi, в даному випадку це:

+---------+----------+--------------------+
| syntax  | <motion> | <operator><motion> |
+---------+----------+--------------------+
| command |   45G    |        d101G       |
+---------+----------+--------------------+

8

d5d "обрізає" п'ять рядків

Зазвичай я просто кидаю число посередині, наприклад:

d7l = видалити 7 літер


7

Натисніть Escклавішу, щоб переконатися, що ви не перебуваєте в режимі редагування. Помістіть курсор на перший рядок, який потрібно видалити. Введіть :5dd. Поточний рядок та наступні чотири рядки слід видалити.

Крім того, якщо у вас включена нумерація рядків ...

Натисніть Escклавішу, щоб переконатися, що ви не перебуваєте в режимі редагування. Введіть, :#,#dде "#" означає номери початкових і кінцевих рядків, які потрібно видалити.


Я не думаю, що це працює з товстою кишкою на початку.
Обійний

@PoeteMaudit Це дійсні команди vi. Товста кишка змушує vi переміщувати курсор у нижній частині екрана та приймати команду редактора рядків.
Кенстер

5
  1. Esc для виходу з режиму вставки
  2. :1enter перейдіть до рядка 1 (замініть "1" на рядок, який вас цікавить)
  3. 5dd видалити 5 рядків (із поточного рядка)

Тип (для нумерованих рядків).:set number


3

Якщо ви хочете видалити діапазон ПІСЛЯ певного тригера рядка, ви можете використовувати щось подібне

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

Це видаляє 11 рядків (включно) після кожної зустрічі ^TMPDIR.


0

це dxd, а не ddx

якщо ви хочете видалити 5 рядків, натисніть курсор на початок першого рядка для видалення та d5d


0

Для видалення всіх ліній використовується - ESC gg dG Щоб видалити кілька рядків, скажімо, 5, тоді використовуйте ESC 5dd


-1

Це можна зробити так:

  1. Розташуйте курсор у місці, яке ви хочете видалити.
  2. Натисніть "v", щоб розпочати візуальний вибір.
  3. Перемістіть курсор у положення, яке потрібно видалити, за допомогою клавіші зі стрілкою.
  4. Натисніть "d", щоб видалити рядки.
  5. Тепер збережіть та вийдіть за допомогою ": x!"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.