Як видалити рядки нижче поточного рядка у vim?


79

Чи існує команда видалити рядок (або кілька рядків), який знаходиться безпосередньо під поточним рядком? В даний час я роблю це як: jddа потім .повторювати за потреби. Чи існує команда, яка б поєднала все це?

ОНОВЛЕННЯ: Причина, по якій я хотів би мати таку команду, полягає в тому, що я не люблю відходити від поточної позиції, але при цьому можу видаляти рядки нижче.


Я думаю, що відповідь @Peter Rincker повинна бути позначена як відповідь
gixxer

done @gixxer, дякую за голови
Валентин Васильєв

Відповіді:


161

Команда delete ex буде добре працювати.

:+,$d

Буде видалено всі рядки з поточного +1 до кінця ($)

Щоб видалити наступні 2 рядки, працював би наступний діапазон, +1,+2або скорочення+,+2

:+,+2d

Як @ib згадав, команда :deleteor :dперемістить курсор на початок рядка поруч із видаленим текстом. (Навіть із nostartoflineнабором). Щоб подолати це, ми можемо подати команду ``нормального режиму. ``перескочить назад у точне положення перед останнім стрибком, у цьому випадку це :dкоманда. Наша команда зараз

:+,+2denter``

Або як одна колишня команда

:+,+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 ``

3
Зверніть увагу, що це досить просте рішення, яке працює "нестандартно" та може бути узагальненим для інших команд (наприклад, :+1,+5s!a!b!gзамінить a на b в 4 рядках після курсору). Дивіться: довідкові діапазони команд для отримання додаткових прикладів.
Девід Уінслоу

Це прямолінійне рішення було б чудовим, лише б воно не рухало курсор. Принаймні, команда повинна виглядати так :+,$d|norm!``. До речі, як зазначено у питанні, автор запитання хотів би видалити кілька рядків нижче поточного, не обов'язково аж до кінця файлу.
Ігор Бураго

@ib: Чи покращить відповідь більш детальне пояснення діапазонів? Може бути set sol? Як використовувати `знак?
Пітер Рінкер

@Peter: Напевно, це було б. До речі, solвимкнення самостійно не вирішує проблему: коли ви видаляєте, скажімо, три рядки, використовуючи :+,+3d, курсор переміщується до рядка, що стоїть за видаленими.
Ігор Бураго,

@ib: Ваші пропозиції я включив у свою відповідь. Спасибі за ваш відгук.
Пітер Рінкер,


29

Це видалить ВСІ рядки під поточним:

jdG

На жаль, після переміщення курсор перемістить курсор на початок поточного рядка.


2
І також буде видаляти кожен рядок до кінця буфера.
Ігор Бураго,

Я неправильно прочитав оригінальне запитання, вибачте. Думав, що ОП хоче видалити ВСІ рядки нижче поточного. Змінив мій пост.
Закрито ID 02

7

ну, щоб зробити це просто, ви можете скористатися командою xxdd. Найчастіше я знаю (принаймні маю уявлення) про розмір сценарію, який редагую. Отже, команди, як показано нижче, зазвичай більш ніж достатньо:

  • 99дд
  • 999dd, щоб видалити 999 рядків, починаючи з позиції курсора.
  • 9999дд
  • 99999dd для дуже довгого сценарію;)

4

Інші рішення є інформативними, але я вважаю, що було б простіше використовувати для цього макрос:

qq (починається запис)

jddk (вниз, видаліть рядок і поверніться вгору - тобто те, що ви хочете зробити)

q (кінцевий запис)

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

І нарешті, якщо ви повторюєте дію більше одного разу, ви можете просто ввести текст @@після першого запуску @q(це повторює останній використаний макрос - у цьому випадку q)


2

Це робота для оцінок!

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

maвстановлює специфічну для файлу позначку "a", j20ddвиконує видалення, яке ви хочете (у цьому випадку 20 рядків), і `aповертає вас до позиції позначки (рядок і стовпець).

Очевидно, цей шаблон можна розширити, щоб зробити все, що завгодно, перш ніж повернутися до позначки. Якщо ви використовуєте mA(або будь-яку іншу велику літеру), марка насправді буде унікальною для всіх файлів, тому ви можете навіть редагувати її в іншому місці перед поверненням. Якщо ви використовуєте дуже часто, ви можете зробити його макросом, як було запропоновано вище.


1

Ви можете ввести кількість рядків для видалення: j 20 dd k.


Final kпереміщує курсор над початковим рядком. Крім того, позиція стовпця курсора буде втрачена через dd.
Ігор Бураго,

@ib: Ні в моїх тестах цього не відбувається. Ви насправді пробували? Зверніть увагу на початковий j .
Paul Ruane,

Вибачте, моя перша точка була неправильною (коли я спробував команду, я не помітив, що вказаний мною підрахунок ('20' у вашому прикладі) був більшим за кількість рядків до кінця буфер). Але другий залишається: позиція стовпчика курсора змінюється після dd(на перший, не порожній символ рядка поруч із видаленими рядками).
Ігор Бураго,

@ib: Так, я згоден із зміною позиції стовпця.
Paul Ruane,

Будь ласка, внесіть незначну редакцію своєї відповіді, щоб я міг підтримати її. Думаю, ваша відповідь, зрештою, не заслуговує негативного рейтингу.
Ігор Бураго

-1

Для задоволення ви можете визначити невелику функцію, яка виконує саме те, що ви описали: видаляє наступні 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 команди, якщо це необхідно.


наприклад, щоб зіставити з комою, d (натисніть ',' після чого d) вставте такі рядки (після введення вищевказаної відповіді @ib.) 1: let mapleader = ","2:nmap <leader>d :D<CR>
Кевін Лі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.