Как удалить строки (строки) ниже текущей строки в vim?
Есть ли команда для удаления строки (или нескольких строк), которая находится ниже текущей строки?
В настоящее время я делаю это как:
j dd, а затем . повторить по мере необходимости.
Есть ли команда, которая объединила бы все это?
UPDATE: Причина, по которой я хотел бы иметь такую команду, заключается в том, что мне не нравится удаляться от текущей позиции, но удаляю строки ниже.
Ответы
Ответ 1
Команда delete ex будет работать красиво.
:+,$d
Это приведет к удалению всех строк с текущего +1 до конца ($)
Чтобы удалить следующие две строки, следующий диапазон будет работать, +1,+2
или сокращенное +,+2
:+,+2d
В качестве @ib упомянутая команда :delete
или :d
переместит курсор к началу строки рядом с удаленным текстом. (Даже с установкой nostartofline
). Чтобы преодолеть это, мы можем выполнить команду нормального режима ``
. ``
вернется в точное положение перед последним прыжком, в этом случае команда :d
. Теперь наша команда
: + , + 2 d enter ` `
Или как одна команда ex
:+,+2d|norm! ``
Чтобы сделать это проще, мы завершаем все это командой:
command! -count=1 -register D :+,+<count>d <reg><bar>norm! ``
Теперь, чтобы удалить следующие следующие 3 строки:
:3D
Эта команда также может принимать {reg}
как :delete
и :yank
. Таким образом, удаление следующих 4 строк в регистр a
будет:
:4D a
Для получения дополнительной информации
:h :d
:h :command
:h :command-register
:h :command-count
:h ``
Ответ 2
"dG" должен работать. Это означает удаление всех строк до конца файла из текущего курсора.
Ответ 3
Это приведет к удалению всех строк ниже текущего:
jdG
К сожалению, это приведет к перемещению курсора к началу текущей строки после удаления.
Ответ 4
Хорошо, для этого просто вы можете использовать команду xxdd. Большую часть времени я знаю (по крайней мере, имею идею) размер script, который я редактирую. Итак, команды, как показано ниже, обычно более чем достаточно:
- 99dd
- 999dd, чтобы удалить 999 строк, начиная с позиции курсора.
- 9999dd
- 99999dd очень долго script;)
Ответ 5
Другие решения являются информативными, но я считаю, что для этого было бы проще использовать макрос:
qq
(начинает запись)
jddk
(спуститесь, удалите строку и вернитесь вверх - то есть вещь, которую вы хотите сделать)
q
(запись на конец)
Теперь вы можете сделать @q
для выполнения этого действия, поддерживая курсор в текущей позиции. Вы также можете сделать что-то вроде [email protected]
, чтобы удалить 5 строк под курсором.
И, наконец, если вы повторяете действие более одного раза, вы можете просто набрать @@
после первого запуска @q
(это повторяет последний использованный макрос - в этом случае q
)
Ответ 6
Это задание для отметок!
Попробуйте maj20dd`a
ma
устанавливает метку файла 'a', j20dd
делает удаление, которое вы хотите (20 строк в этом случае), и `a
восстанавливает вас в положение метки (строка и столбец).
Очевидно, что этот шаблон можно расширить, чтобы сделать все, что вам нужно, прежде чем возвращаться к знаку. Если вы используете ma
(или любую другую заглавную букву), метка будет действительно уникальной для разных файлов, поэтому вы можете даже редактировать ее в другом месте перед возвратом. Если у вас очень частое использование, вы можете сделать его макросом, как было предложено выше.
Ответ 7
Вы можете ввести количество удаляемых строк: j 2 0 d d k.
Ответ 8
Вы можете определить небольшую функцию, которая делает именно то, что вы описали:
удалите следующие строки 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 (один, по умолчанию) и имя регистра для использования в качестве необязательного
(как команда :delete
).
:command! -range=1 -register -bar D call DeleteNextLines(<count>, <q-reg>)
Кроме того, вы можете определить отображение для запуска :D
, если оно
необходимо.