Как удалить строку (и) ниже текущей строки в vim? - PullRequest
62 голосов
/ 02 сентября 2010

Есть ли команда для удаления строки (или нескольких строк), которая находится непосредственно ниже текущей строки?В настоящее время я делаю это как: j dd и затем . , чтобы повторить при необходимости.Есть ли команда, которая бы объединяла все это?

ОБНОВЛЕНИЕ: Причина, по которой я хотел бы иметь такую ​​команду, заключается в том, что я не люблю отходить от текущей позиции, но могу удалить строки ниже.

Ответы [ 8 ]

132 голосов
/ 02 сентября 2010

Команда delete ex будет работать хорошо.

:+,$d

Это удалит все строки с текущего +1 до конца ($)

Чтобы удалить следующие 2 строки, будет работать следующий диапазон, +1,+2 или сокращение +,+2

:+,+2d

Как уже упоминалось @ib, команда :delete или :d переместит курсор в начало строки рядом с удаленным текстом. (Даже с nostartofline установленным). Чтобы преодолеть это, мы можем выполнить команду `` нормальный режим. `` вернется в точное положение перед последним прыжком, в этом случае команда :d. Наша команда сейчас

: * * + одна тысяча двадцать-одна , + 2 * ** 1029 тысяча двадцать восемь * д * * введите один тысяча тридцать один ``

Или как одна бывшая команда

:+,+2d|norm! ``

Чтобы упростить это, мы заключаем все это в команду:

command! -count=1 -register D :+,+<count>d <reg><bar>norm! ``

Теперь удалите следующие 3 строки:

:3D

Эта команда также может принимать {reg}, как :delete и :yank do. Таким образом, удаление следующих 4 строк в регистр a будет:

:4D a

Для получения дополнительной информации

:h :d
:h :command
:h :command-register
:h :command-count
:h ``
64 голосов
/ 17 марта 2015

d G должно работать.Это означает удаление всех строк до конца файла из текущего курсора.

26 голосов
/ 02 сентября 2010

Это удалит ВСЕ строки ниже текущей:

jdG

К сожалению, после перемещения курсор переместится в начало текущей строки.

7 голосов
/ 06 февраля 2015

ну, чтобы сделать это просто, вы можете использовать команду xxdd.Большую часть времени я знаю (по крайней мере, имею представление) размер сценария, который я редактирую.Таким образом, приведенной ниже команды обычно более чем достаточно:

  • 99dd
  • 999dd для удаления 999 строк, начиная с позиции курсора.
  • 9999dd
  • 99999dd для очень длинного сценария;)
4 голосов
/ 23 сентября 2013

Другие решения информативны, но я чувствую, что для этого было бы проще использовать макрос:

qq (начинает запись)

jddk (перейти вниз,удалите строку и вернитесь назад - то есть, что вы хотите сделать)

q (конец записи)

Теперь вы можете выполнить @q, чтобы выполнить это действие, поддерживаякурсор в текущей позиции.Вы также можете сделать что-то вроде 5@q, чтобы удалить 5 строк под курсором.

И, наконец, если вы повторяете действие более одного раза, вы можете просто набрать @@ после первого запуска@q (повторяет последний использованный макрос - в данном случае q)

2 голосов
/ 02 сентября 2010

Это работа для оценки!

Попробуйте maj20dd`a

ma устанавливает специфичную для файла метку 'a', j20dd выполняет удаление, которое вы хотите (в данном случае 20 строк), а `a восстанавливает положение метки (строка и столбец).

Очевидно, что этот шаблон можно расширить, чтобы сделать все, что вы хотите, прежде чем вернуться к отметке. Если вы используете mA (или любую другую заглавную букву), отметка на самом деле будет уникальной для всех файлов, поэтому вы можете даже редактировать ее в другом месте, прежде чем вернуться. Если вы используете очень часто, вы можете сделать это макросом, как предложено выше.

1 голос
/ 02 сентября 2010

Вы можете ввести количество строк для удаления: j 2 0 d d к .

0 голосов
/ 02 сентября 2010

Вы можете определить небольшую функцию, которая будет выполнять именно то, что вы описали: удалить следующие n строки ниже текущей строки и восстановить начальную позицию курсора.

function! DeleteNextLines(n, reg)
    let l = line('.')
    let m = min([a:n, line('$')-l])
    if m > 0
        let c = col('.')
        exe '+,+'.m 'd' a:reg
        call cursor(l, c)
    endif
endfunction

Также вы можете определить команду, котораяпринимает количество строк, которые нужно удалить (одна, по умолчанию), и имя регистра для использования в качестве необязательного аргумента (как команда :delete).

:command! -range=1 -register -bar D call DeleteNextLines(<count>, <q-reg>)

Кроме того, вы можете определить отображение для запуска:D, если это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...