Вставити кілька разів


93

Який найкращий спосіб замінити кілька рядків вмістом буфера обміну?

Проблема, яка виникає у мене, полягає в тому, що коли я рву рядок і вставляю його на інший рядок, "yank" замінюється рядком, який я щойно замінюю. Тепер, якщо я хочу замінити інший рядок таким же рядком, я повинен повернутися вгору і знову потягнути його.

Це повинен бути кращий спосіб.

Відповіді:


108

У мене це є у моєму .vimrc:

xnoremap p pgvy

(примітка: це буде працювати лише з регістром за замовчуванням, але це відображення легко запам'ятати). Можливе написання більш докладної версії. Крім того, ви все ще можете використовувати P, щоб отримати стару поведінку.


28
Розумна. 'p' вставити, 'gv' повторно вибрати те, що було вибрано спочатку. "y", щоб скопіювати його знову.
Amjith

@SibbsGambling, ймовірно, використовуючи версію до Vim 7? Потім або оновіть Vim, або використовуйте v замість x ( vnoremap). version7.txtУ цій версії з'явилися файли довідки Vim: xmap та smap.
Бенуа

1
@Benoit Хм, у мене 7.4.52, але ні, xnoremapні vnoremapпрацює
Sibbs Gambling 04

8
Чому це не поведінка за замовчуванням ??
Сет,

27

"0повинен містити вміст вашої тяги. Набирати текст трохи втомливіше, але "0pслід робити те, що хочеш.

Крім того, не слід вибирати та замінювати старі рядки спереду. Якщо ви знайдете ці рядки під час пошуку, просто натискайте n.знову і знову (після початкової букви p), тоді, коли всі вони будуть вставлені, виконайте nddнаступну кількість n.s, скільки потрібно.

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


2
звучить як місце, де регулярний вираз із :%s/.../.../gcкомандами підтвердження типу може бути ближчим до того, що ви хочете
Milimetric

@Milimetric +1 не знав, що ти можеш підтвердити це.

1
Прихильність, тому що макроси можуть зробити це проблемою. Просто внесіть редагування один раз, і ви зможете зробити щось на зразок 5@m(для макросу з іменем m)
skatenerd

Дякую за чудове пояснення. Зараз я використовую xnoremap p "0pу своєму ~ / .vimrc
nexayq

13

Я часто використовую інший реєстр, копіюю потрібний вам рядок до якогось іменованого реєстру, "ayа потім вставляю звідти"ap


11

Коли ви вставите виділення у Vim, він замінить реєстр за замовчуванням вмістом виділення. Якщо обробка виділення знищує вміст реєстру буфера обміну, то, швидше за все, у вашому .vimrc є такий рядок

set clipboard=unnamed

Один з варіантів - це видалити та використовувати явний регістр буфера обміну "+

Інший варіант - використовувати будь-який з інших явно названих регістрів (az). Після першої вставки, "cнаприклад, поверніть лінію назад, а потім використовуйте "cpдля вставки звідти назовні.


Власне за замовчуванням (тут, на Ubuntu) був буфер обміну = автовибір; все-таки дякую за найелегантнішу відповідь на сьогодні.
Тобу

8

використовуйте npде n- кількість часу, протягом якого ви хочете вставити рядки, наприклад 3p, вставите 3 рядки.


7
Не працює, коли ви хочете вставити один і той же рядок через несуміжні рядки.
Тобу

@Tobu, але він відповідає на назву цього запитання "як вставити кілька разів"
icc97

6

Замість того, щоб використовувати copy / paste, часто краще використовувати команду текстового об'єкта, таку як ciwзміна внутрішнього слова. Перевага цього методу полягає в тому, що його легко .повторити за допомогою команди repeat.

  1. yiw Потягніть внутрішнє слово (скопіюйте слово під курсором, скажіть "перший").
  2. ... Перемістіть курсор на інше слово (скажіть "друге").
  3. ciw<C-r>0 Змініть "другий", замінивши його на "перший" (це Ctrl-R).
  4. ... Перемістіть курсор на інше слово (скажіть "третє").
  5. . Змініть "третій", замінивши його на "перший".

1
ciw<C-r>0не працює в моєму випадку. переходить у ciwрежим вставки, де <C-r>стає марним. Чи є цьому просте пояснення? Чи може це бути пов’язано з текстовим редактором (я не використовую pur VIM, а прив’язки клавіатури VIM у RStudio)
Бушрут,

@Bushroot <C-r>призначений для використання у режимі вставки, оскільки це те, як ви вставляєте з реєстру, не виходячи з режиму вставки - у Vim, тобто; Я не знайомий з RStudio, але я здогадуюсь, що ви маєте рацію, і вони не реалізували цю конкретну прив'язку ключів.
комаха

@ Sean H: Так. Вони не реалізували прив’язку ключів. Він чудово працює у VIM і навіть із прив'язками VIM в інших програмах (наприклад, Visual Studio Code).
Бушрут
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.