Як видалити рядок вище / нижче курсору, але не поточний рядок?


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`a для своєї карти? Встановлює позначку і повертається до неї згодом ... можливо, ви захочете змінити її на менш вживаний символ.
PhilippFrank

@PhilippFrank Або я можу використовувати ``, щоб повернути курсор і не займати реєстр (не те, що я використовую жоден :)).
Мартін Тот

Ні, що не працює, k не є стрибком, тому ви не можете повернутися за допомогою ``.
PhilippFrank

Відповіді:


30
:-d

обрізає лінію над поточною лінією.


:-5d

вирізає 5-й рядок над поточним рядком (але переміщує курсор).


:-5,-d

вирізає 5 рядків над поточною лінією.


:+,+5d

вирізає 5 рядків нижче поточної лінії.


2
Однак це все ще переміщує курсор.
PhilippFrank

1
Ви не можете уникнути переміщення курсору. Найкраще, що ви можете зробити - це перемістити курсор і перемістити його назад .
romainl

Дякую! Такий «вим шлях» - це те, що я шукав. Я буду використовувати це в поєднанні з ``, щоб повернути курсор туди, де він був.
Мартін Тот

6

Якщо ми використовуємо невеликий регістр видалення "-, ми можемо відновити позицію курсора після видалення вище n рядків.

Наприклад, d0dgk"-Pвидаляє вище 1 рядка та відновлює курсор назад там, де він був.

  1. d0видаляє символи з курсору до першого символу рядка. Оскільки 0винятковий рух, символ під курсором не видаляється. І видалені символи поміщаються в малий реситер видалення "-.

  2. dgkвидаляє вище 1 рядка. Це залишить поточну лінію, оскільки gkвона не є лінійною та виключною.

  3. "-P ставить текст з малого реєстру видалення "-.

Це свого роду хак. Але якщо ви шукаєте не-колишні команди, подумайте про його використання.


Приємне рішення! Хоча я думаю, ти цього "-Pне хочеш "-p. Останній трохи псує текст.
Джеймс

@DJMcMayhem Ви маєте рацію. Я виправив відповідь. Дякую, що вказали на це.
MS.Kim

5

EDIT Я не знав вбудованих функцій, запропонованих @Romainl у своїй відповіді: звичайно, слід віддати перевагу методу -dта +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>

Для створення відображень, що викликають функції.


Альтернативою збереженню / відновленню положення курсору є зняття / відновлення nostartoflineпараметра.
Багатий

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перестрибнути прямо на цей рядок.


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>

ЗАБЕЗПЕЧЕННЯ: Я також використав цю посаду в якості посилання.


Ви маєте на увазі @statox, а не @ MS.Kim?
Багатий

-1

Якщо ви хочете видалити повторювані рядки з усього файлу, просто виконайте наступне:

:g/any part of the string/d

Приклад:

У командному режимі

:g/I want to delete/d

Якщо ви просто хочете спочатку список рядків (ив):

:g/I want to delete/p

3
Я не дуже впевнений, як це відповідає на поставлене запитання?
Martin Tournoij
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.