Как удалить строку выше / ниже курсора, но не текущую строку?

11

Есть ли команда для удаления строки (или n строк) над текущей? Выше = ток не включен.

Т.е. есть альтернатива, dkкоторая не удаляет текущую строку? Подобно тому, как o/ Oи p/ Pработать, но с удалением.

В настоящее время я делаю kdd, что перемещает курсор на одну строку вверх и удаляет его. Я мог бы сделать nnoremap <Leader>d kddи nnoremap <Leader>D jdd-, но иметь альтернативу, которая не двигает курсор, кажется лучшим вариантом. Есть ли такие?

Мартин Тот
источник
Если ваша проблема в том, что ваши отображения перемещают курсор, почему бы вам не сделать nnoremap <Leader>d kddjи nnoremap <Leader>D jddk?
statox
Использование либо kddjили jddk, положение столбца не сохраняется. Я не говорю, что это большая проблема, но это раздражает. Для записи kddjперемещает курсор на 1 строку ниже исходной позиции. И jdd-кажется лучшей альтернативой, jddkпотому что, по крайней мере, я возвращаюсь к первому не пробелу. Если строка ниже той, которую я хочу удалить, пуста, я остаюсь в начале строки.
Мартин Тот
Как насчет использования makdd`а для вашей карты? Устанавливает метку и возвращает ее позже ... хотя вы можете изменить ее на менее используемый символ.
PhilippFrank
@PhilippFrank Или я могу использовать ``, чтобы вернуть курсор назад и не занимать регистр (не то чтобы я его использовал :)).
Мартин Тот
Нет, это не работает, k не прыжок, поэтому вы не можете вернуться назад, используя ``.
PhilippFrank

Ответы:

30
:-d

обрезает линию над текущей строкой.


:-5d

обрезает 5-ю строку над текущей строкой (но перемещает курсор).


:-5,-d

обрезает 5 строк над текущей строкой.


:+,+5d

обрезает 5 строк ниже текущей строки.

romainl
источник
2
Это все еще перемещает курсор, хотя.
PhilippFrank
1
Вы не можете избежать перемещения курсора. Лучшее, что вы можете сделать, это переместить курсор и переместить его назад .
Ромен
Спасибо! Этот вид "Vim Way" это то, что я искал. Я собираюсь использовать это в сочетании с ``, чтобы вернуть курсор туда, где он был.
Мартин Тот
5

РЕДАКТИРОВАТЬ Я не знал встроенных функций, предложенных @Romainl в своем ответе: конечно, метод -dand +dследует отдавать предпочтение, так как он намного проще, чем добавление функций к вашему..vimrc

Может быть, добавление чего-то такого к вашему .vimrcможет быть тем, что вы хотите:

function! DeleteOver()
   let save_cursor = getpos(".")
   normal k
   normal dd
   call setpos(".", save_cursor)
   normal k
endfunction

function! DeleteUnder()
   let save_cursor = getpos(".")
   normal j
   normal dd
   call setpos(".", save_cursor)
endfunction

Эти функции удаляют строку ниже или строку поверх текущей и возвращаются в позицию перед удалением.

Для функции DeleteOver()нам нужно подняться на одну строку normal kпосле удаления, потому что удаление меняет номер исходной строки, которая не происходит сDeleteUnder()

Вы также можете добавить это к вашему .vimrc

nnoremap <Leader>d :call DeleteOver()<CR>
nnoremap <Leader>D :call DeleteUnder()<CR>

Создать отображения, вызывающие функции.

statox
источник
Альтернативой сохранению / восстановлению позиции курсора является отмена / восстановление nostartoflineопции.
Rich
5

Если мы используем небольшой регистр удаления "-, мы можем восстановить позицию курсора после удаления выше n строк.

Например, d0dgk"-Pудаляет строку выше 1 и восстанавливает курсор туда, где он был.

  1. d0удаляет символы из курсора до первого символа строки. Поскольку 0это исключительное движение, символ под курсором не удаляется. И удаленные символы помещаются в маленький регистр удаления "-.

  2. dgkудаляет выше 1 строки. Это оставит текущую строку, потому что gkне является linewise и эксклюзивным.

  3. "-P помещает текст из небольшого регистра удаления "-.

Это своего рода хак. Но если вы ищете не-ex команды, подумайте об их использовании.

MS.Kim
источник
Отличное решение! Хотя, думаю, ты "-Pне хочешь "-p. Последний немного портит текст.
Джеймс
@DJMcMayhem Ты прав. Я исправил ответ. Спасибо за указание на это.
MS.Kim
2

Возможно, вы улучшите свой рабочий процесс, если не боитесь ... прыгать :)

Пример:

This is where cursor initially is: _.

[Some other stuff you want to keep/skip ...]

I want to delete these lines.
I want to delete these lines.
I want to delete these lines.
I want to delete these lines.
I want to delete these lines.

Ваши действия (нормальный режим, курсор находится _): /I want Enter 5dd Ctrl-o. Вот и все.

Конечно, romainl ответ будет наилучшим, если все, что вы хотите удалить целые строки, и вы можете легко посчитать их смещение (например, используя относительные числа белья). Выше приведен более общий способ «действовать»: перейдите туда, используя что-то, что считается прыжком: это означает, что вы всегда можете вернуться назад после изменения текста.

Например, если вы используете абсолютные номера строк, вы можете заменить их на /I want Enterчто-то вроде 78ggили, 78Gчтобы перейти непосредственно к этому номеру строки.

VanLaser
источник
0

Основываясь на решении ms-kim, я разработал несколько другой вариант, который сохраняет коллаж.

function! DeleteLineAbove()
    if line('.') == 1
        echom "You are at the first line!"
        return
    endif
    let l:colsave = col(".")
    exec  "normal! kdd"
    call cursor(line("."), l:colsave)
endfunction
nnoremap <Leader>k :call DeleteLineAbove()<CR>

OBS: я также использовал этот пост в качестве ссылки.

SergioAraujo
источник
Вы имеете в виду @statox, а не @ MS.Kim?
Рич
-1

Если вы хотите удалить повторяющиеся строки во всем файле, просто сделайте следующее:

:g/any part of the string/d

Пример:

В командном режиме

:g/I want to delete/d

Если вы просто хотите сначала получить список строк:

:g/I want to delete/p
user11509
источник
3
Я не совсем уверен, как это отвечает на заданный вопрос?
Мартин Турной