Vim: Заміна рядка на іншу, яку вистрибували раніше


112

Принаймні раз на день у мене є така ситуація:

A: This line should also replace line X
...
X: This is line should be replaced

Я вважаю, що я не виконую це завдання ефективно.

Що я роблю:

  • Переходьте до рядка A: AG
  • Рядок Yank: yy
  • Перехід до рядка X: XG
  • Вставити рядок A: P
  • Перехід до старого рядка: j
  • Видалити старий рядок: dd

Це має додатковий недолік , що лінія X в сьогоденні час в реєстрі за замовчуванням, яка дратує , якщо я знайду іншу лінію , яка повинна бути замінена А. смикати , щоб і наклеюючи від додаткового регістра ( «його , » АР ) робить цю просту задачу навіть менш ефективний.

Мої запитання:

  • Невже я пропустив вбудовану команду Vim для заміни рядка, який раніше був пошкоджений?
  • Якщо ні, то як я можу прив’язати власну команду, яка залишає (або відновлює) витягнутий рядок у регістрі за замовчуванням?

2
Це моя найбільша проблема щодо моделі редагування Vim. Я хотів би знати рішення. Редактор CUA розрізняє різання та видалення, тому ви просто вирізаєте текст, після чого можете перейти до видалення та вставити все, що вам потрібно. За допомогою Vim, будь-яке видалення, ви робите кошики нарізаного тексту. Ви, в кінцевому підсумку, використовуєте набагато більше натискань клавіш, ніж інший редактор.
Грязь


@Mud дізнайся про :moveта зареєструй чорну діру ( _) (або насправді просто реєструєшся)
sehe

2
@sehe Я прекрасно знаю регістри, але це додає 4 натискання клавіш на операцію вирізання / вставки та вимагає більшого продумання. Коли ви багато редагуєте, це швидко додається.
Грязь

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

Відповіді:


91

Що я б робив:

  1. aG
  2. Y
  3. xG
  4. Vp

Ви не повинні залишити нормальний режим, але він робить смикати лінію. Однак ви можете використовувати, V"0pяка завжди буде ставити рядок, підкреслений на кроці 2.


11
@duddle: так, Yє синонімомyy
icecrime

8
Кроки 1 і 2 можна комбінувати, використовуючи: ay [Наприклад: 20y] Слідом за Vp слід виконати трюк. Не потрібно йти на лінію, щоб витягнути її.
Бхарад

2
Якщо ви перезаписуєте додаткові рядки ccCTRL + r0ESC замість V "0p, то всі наступні рядки можна замінити справедливими. (Повторювач)
Jordan Morris,

Yє синонімом для yy, але я пропоную переставити його y$на відповідність Dі C.
mgold

Перевірте відповідь Джордана Морріса stackoverflow.com/users/970673/jordan-morris нижче - дійсно використовує команди vim якнайкраще, дозволяючи повторити команду кілька разів.
JESii

105

Vp: виберіть рядок, вставте те, що було вирвано


3
VPпрацює так само добре, що зручно, тому що ви можете тримати Shift утримується протягом усієї послідовності.
Джордж Хілліард

24
дуже приємний трюк, хоча варто зазначити (можливо) суттєвий застереження: це призводить до оновлення реєстру yank змістом рядка, який перезаписується, тому він може не грати добре з деякими завданнями - наприклад, якщо ви хочете перезаписати одна і та ж лінія на декілька напрямків.
підкреслюйте_d

8
@underscore_d, це прекрасно відтворюється, якщо ви це робите V"0p, що вставляє з останнього реєстру, що вибився.
timblaktu

@timblaktu Чи можете ви пояснити, що V"0pробить? V переходить у режим візуальної лінії, а p - для вставки. Що "і 0 для Thanks?
theprogrammer

43

Це має додатковий недолік у тому, що рядок X зараз знаходиться в реєстрі за замовчуванням, що дратує, якщо я знайду інший рядок, який слід замінити на A.

Щоб видалити текст, не впливаючи на звичайні регістри, можна скористатися регістром Чорна діра "_:

"_dd

10
Я додав деякі відображення в моїй .vimrc зробити dі ddзавжди використовувати чорну діру, а xй xxвиконувати те , що більшість редакторів назвали б «вирізати» (видалити і зберегти в регістрі по замовчуванням):noremap x d noremap xx dd noremap d "_d noremap dd "_dd
IMSoP

2
Я насторожено переставляю речі в VIM, тому що це може бути непросто на інших комп’ютерах або в плагінах VIM-стилів для IDE. Також дизайнери VIM, як правило, вирішили проблеми із відображенням за замовчуванням, якщо ви дійсно копаєте.
Jordan Morris

15

Спираючись на відповіді, які пропонують використовувати Vpабо VPвставляти через рядок - щоб уникнути зміни вмісту регістра yank, я вважаю, що найбільш ергономічна команда - це просто:

VPY


Це найпростіше рішення, яке залишає вміст вибірки однаковим. Велике дякую!
heylookltsme

14
  1. yy
  2. j (перейдіть до рядка, який потрібно замінити), а потім
  3. Vp (великі регістри v, а потім p, замінять змістований вміст)

приголомшливий! Дійсно, дуже короткий і полегшує вибір декількох ліній у візуальному режимі. Він також зберігає буфер пасти недоторканим. Прикро, коли ДД перезаписує цей буфер ...
Актау,

@Aktau цей буфер не залишається недоторканим.
Джордан Морріс

9

Я б застосував режим командного рядка (Ex) і зробив наступні дві команди

:XmA
:Ad

Це просто переміщує рядок X трохи під A, а потім видаляє A переміщує цю лінію вгору

Наприклад

:7m3
:3d

Чи можете ви навести приклад? Коли я натискаю, наприклад, 50Gm30G Vim переходить до рядка 50, а потім до низу, і все. Також: Оголошення нічого не робить для A = 50 або A = 50G
хрусткий

7
  1. Перехід до початку першого рядка.

  2. y, $- скопіюйте рядок без рядка рядка в кінці

  3. Перейти до початку цільової лінії.

    1. V, p- замінити лише один цільовий рядок

    2. c, c, Ctrlr, 0, Esc- замінити цільову рядок з оригінальним ривком

  4. Перехід до початку наступного цільового рядка.

  5. . - повторює команду, видану в 4.2.

Примітки:

  • 4.1 є y, $тому що якщо ви це зробите y, yабо Yви скопіюєте рядок рядка, і Ctrlr0фактично, додайте рядок рядка нижче цільової лінії

  • 4.2 замінює V p, що не працює з повтором, оскільки технічно остання дія видаляється, тому .просто видалить рядок.

  • Якщо хтось знає, як випустити «замінити поточний рядок на регістр» в режимі EX (командний рядок), я хотів би почути від вас (і знати, де ви знайшли документацію). Може існувати повторювана команда EX, яка швидше, ніж 4.2, та / або не має застереження про рядкові лінії.


1
Крок 4.2 є вбивцею, тому що тепер ви можете повторити весь процес із командою крапки, як в 4.3 - ось про що йдеться у vim!
JESii

1
Я цього не розумію. "AG" ставить мого виробника в кінець рядка, переходить у режим вставки та вводить "G". Що я не отримую?
gustafbstrom

@gustafbstrom чесна критика - вибачте, що A повинен був представляти номер рядка, але я не зміг цього зазначити. Відредаговано.
Джордан Морріс

5

Ось що б я зробив

  • Перемістити початок рядка A AG(де A очевидно номер рядка)
  • Лінія збору в якийсь регістр, наприклад, (без нового рядка). Тип"ay$
  • Перемістіть, щоб вставити рядок, XG
  • Заміна лінії, S
  • Вставити з реєстру а, Ctrl-Ra

4

Ви можете використовувати це у візуальному режимі.

  • Перехід до рядка А: AG
  • Виберіть рядок у візуальному режимі: VESC
  • перейти до рядка X: XG
  • Введіть режим заміщення рядка: S
  • Вставте рядок, який ви скопіювали: shift+ insert(або будь-яке інше, яке ви маєте для картування, щоб вставити з буфера обміну).

Ага. Не знаю , про V і S . Однак ваші кроки не спрацьовують для мене, оскільки я не добираюся до буфера обміну ОС, який є єдиним, до якого я можу отримати доступ у режимі вставки. Тому мені доведеться спочатку залишити режим вставки.
хрусткий

3

Ви також можете зробити:

Vy (in normal mode at the line you want to copy)
Vp (in normal mode at the line you want to replace)
  • Не створює пробілів або кінців рядків.
  • Курсор розміщується на початку скопійованого тексту.

Ті ж ключі можна використовувати для викручування / вставки більше одного рядка.

V (in normal mode at what you want to yank)
(use jk to move the selection)
y (to yank the selection)
V (in normal mode at where you want to paste)
(use jk to move the selection)
p (to replace the selection with the yanked lines)

2

Ці команди можна використовувати в звичайному режимі:

:AmX | Xd

mкоманда для m[ove], яка переміщує номер рядка А після рядка з номером X, якщо ви хочете скопіювати , а не перемістити лінію, використання co[py]. dкоманда для d[elete].

Ви можете переміщувати (копіювати за допомогою co) діапазон ліній, використовуючи

:start,end m X

2

У світлі недавнього коментаря cicld (дякую!), Я бачу, що не зрозумів оригінальний випуск повністю. Переміщення рядка не є доцільним, але копіювання - це (оскільки рядок закручено). Тому я би переглянув його на:

:1t20:20d_
  1. Скопіюйте перший рядок ( :tкоманда - псевдонім для :copy) після рядка 20 (буде розміщено його у рядку 21)

  2. Видаліть рядок 20, помістивши видалений рядок у регістр "чорної дуги" ( _) (тобто не впливаючи на поточний буфер вибивання)

Як було сказано в недавньому коментарі, це не вплине на поточну позицію курсору.


1
  1. : ay (де a - номер рядка. Приклад: 20y). Це пряде лінія (каламбур призначений).
  2. Vp

1

Мені простіше використовувати для цього команду Ex; колишній перейти лінію 9 до 46:

 :46|9m.|-1d

Це перемістить курсор на рядок 46, перемістить рядок 9 нижче поточного, а потім видалить попередній рядок (оскільки переміщена лінія є поточною).

Або за допомогою позначок "s":

:46ma a|9m'a|'ad

Краса команд EX полягає в тому, що ви можете запускати їх там, де знаходиться курсор (у звичайному режимі). Я віддаю перевагу :1m20|.+1d(перемістіть рядок 1 до рядка 20 та видаліть наступний рядок, тобто текст, який був у рядку 20 раніше). Та сама ідея, хоча!
обходив

1

Мені часто доводиться Y один рядок і замінювати його в декількох місцях, кожен з яких має інше значення (це означає, що я не можу зробити регулярний вираз).

Y вирвати потрібну оригінальну лінію

а потім у кожному рядку, який ви хочете замінити, VpzeroY


0

я б просто скористатися реєстром "Чорна діра":

дано:

nnoremap <Cd> "_dd

рішенням було б:

<Cd> yy

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