vim - як я можу зробити "змінити слово", використовуючи поточний буфер вставки


86

У моєму буфері вставки є текст, наприклад, я зробив yw(yank word), і тепер у своєму буфері є 'foo'.

Тепер я переходжу до слова 'bar' і хочу замінити його буфером пасти.

Щоб замінити текст вручну, я міг би зробити, cwа потім набрати нове слово.

Як я можу зробити "змінити слово", але використовувати вміст мого буфера вставки, а не вводити слово заміни вручну?

Найкращий варіант, який я маю зараз, - це перейти до початку слова, яке я хочу замінити і зробити dw(видалити слово), потім перейти в інше місце і виконати yw(янне слово), потім повернутися в область заміни і зробити p(вставити), яка ніби незграбна, особливо якщо вони не на одному екрані.

Відповіді:


120

Варіант 1

Ви можете використовувати регістри, щоб зробити це і зробити прив'язку клавіш для процесу.

Дайте слово, яке ви хочете замінити yw.

Слово зірвано в 0реєстрі, який ви можете побачити, видавши :registers.

Перейдіть до слова, яке ви хочете замінити, і виконайте cw. Виконайте Ctrl+, rпісля чого 0вставити 0регістр.

Карта для цього виглядатиме приблизно так (якщо вважати Ctrl+ jнашим ключовим комбо):

:map <C-j> cw<C-r>0<ESC>

Варіант 2 (простіший)

Зі своїм словом натисніть курсор на слово, яке ви хочете замінити та виконати viwp. Що таке візуальне виділення внутрішнього слова та вставки.

Люб'язно від @tlo в коментарях: ви також могли просто зробити vep. Один чар коротший. Нижня частина повинна розташовувати курсор на початку слова і (як і у мене) змінює буфер.

Коментар (від Михайла):

Це добре. Додаткова примітка: другий метод справді простіший, але, як це працює, працює лише для ONE заміни, оскільки після кожної заміни буфер потім змінюється на поле, яке було замінено (старий текст). Перший метод трохи складніше у використанні, але має перевагу, що буфер 0 залишається "таким, як є", тому ви можете використовувати цей метод, щоб зробити більше 1 заміни того ж тексту.


14
Варіант 3 (навіть простіший). Коли ви закрутили слово, клацніть курсор на перший символ слова, яке ви хочете замінити та виконати vep.
тло

Мені подобається варіант 3, коли потрібно змінити лише 1 слово. Якщо потрібно змінити більше одного слова, варіант 1 дозволяє мені використовувати. оператор, щоб повторити це ..
typelogic

3
ve"0pбуде працювати, щоб ви могли повторити свою зміну
JKillian

Якщо ви збираєтеся відобразити це до чогось, мабуть, краще використовувати: map <C-j> ciw<C-r>0<ESC>так, щоб не було значення, звідки в слові, яке ви натискаєте ^j.
Пол Паркер

Усі, хто хоче знати, чому CTRL-R робить це магією: :help insertтоді шукайте CTRL-R /CTRL-R. Як це ve"0pпрацює, дивіться:help registers
Пол Паркер

12

ywщоб вирвати своє слово, а потім перемістити курсор на слово, яке ви хочете замінити, і використовувати його "_dwдля видалення, надсилаючи текст до нульового реєстру (щоб він не перезаписав вміст "реєстру, куди виправлений / вирізаний текст переходить за замовчуванням ), а потім просто вставити p.

Ви можете скористатися наступним картографуванням, щоб полегшити щось:

nnoremap <leader>d "_d

... тож у звичайному режимі ви можете \dwвидалити слово, не впливаючи на "реєстр.


3

Щоб зробити це шляхом VIM, ви навмисно використовуєте регістри yank, delete та інші регістри.

Регістр "0- це реєстр. Все, що ви захочете, буде розміщено тут, але видалення ніколи не торкаються реєстру "0.

Отже, у вашому прикладі ви щойно потягли слово. Щоб замінити слово на те, що ви щойно викрутили, ви скористаєтеся видаленням, не торкаючись реєстру yank. Тож перейдіть до цільового слова, видаліть його dw, а потім вставте зі свого реєстру "0p, або ще краще, cwтоді ^R0(що повторюється).

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

Регістри "1- "9це регістри видалення історії. З "1вмістом останнього великого видалення або видалення зміни та "9з найстарішим великим видаленням або зміненням видалення. Тільки делети, які не мають малого розміру, тобто вилучення однієї чи більше рядків, натискають на "1- "9.

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

Регістр "_- це регістр чорної діри, і він завжди порожній. Якщо ви видалите його, нічого в жодному реєстрі взагалі не змінюється, навіть не ""регістр за замовчуванням або сам регістр чорної діри. Вилучений текст повністю зник, окрім історії скасування. Янкувати або вставляти з реєстру чорних дір по суті нічого не робить.

Реєстр чорної діри "_дозволяє вам робити такі речі, як спочатку одне невелике видалення, потім ряд інших видалень, "_не змінюючи реєстру невеликих видалень "-, а потім вставити перше невелике видалення.

Інші регістри - це останній вставлений регістр "., регістри імен файлів "%і "#, регістр команд, реєстр ":пошуку "/та регістр виразів "=.

Ви можете отримати список всіх цих регістрів та їх вміст за допомогою команди :register. Ця команда дуже корисна для експерименту та вивчення того, що закінчується де.


2

Мені це потрібно часто, я написав плагін, щоб спростити та дозволити максимальну швидкість: ReplaceWithRegister .

Цей плагін пропонує grкоманду « два в одному», яка замінює текст, охоплений об’єктом {motion} / текст, цілими рядками або поточним виділенням вмістом регістра; старий текст видаляється в регістр чорних дір, тобто його немає. Він прозоро обробляє багато кутових справ і дозволяє швидко повторити за допомогою стандартної .команди. Якщо вам це не подобається, на його сторінці є посилання на альтернативи.


2

Для повторення вставки використовуйте команду change.

cw ^R0ESC (^ R = Control + R; 0 для регістра 0)

замінить слово змістом з рег. 0 і давайте повторимо це з.

Це відмінно підходить для cgn(VIM 7.4) для заміни шаблонів пошуку:

  • Перший пошук за допомогою /або*
  • cgn ^R0ESC
  • .повторити на наступному матчі або nпропустити

1

Оскільки він ще не включений, ви зазвичай замінюєте рядки на, :%s/.../.../і ви можете це зробити і під словом під курсором.

  1. Ви вводите першу частину команди, що шукаєте: :s/find/
  2. Потім ви клацаєте <ctrl-r>та вибираєте курсором слово, на яке хочете його замінити.
  3. Потім ви натискаєте <ctrl-w>(невелике "слово") або <ctrl-a>(велике "слово), щоб вставити слово під курсором у командний рядок
  4. Потім ви закінчите команду.

Дивіться посилання про те, як використовувати курсорні речі в командному рядку .


1

Зазвичай я використовую це: ywyank foo, потім видаляю за barдопомогою dwі, як остаточний крок, кладемо fooз реєстру, в 0якому зберігається текст, що закручується "0p. Повторіть введення з періодом ( .) за потребою.

Також замість ywі dw, ви можете використовувати yiwі diw(зауважте зайве i- це означає всередині ). З цим ви можете вилучити або видалити слово з будь-якого місця всередині нього, а не лише на початку слова.


0

Я використовую цей плагін для розширення регіону вибору: https://github.com/terryma/vim-expand-region

Тож моє поєднання для зміни слова буде: vvpу будь-якому місці слова.

У мене також є хак для збереження неназваного вмісту реєстру після вставки, щоб я міг повторити це.

vnoremap p p:let @"=@0 <CR>
vnoremap P P:let @"=@0 <CR>

(мій буфер обміну є автоматичним вибором)


0

Я використовую нижче відображення клавіш для заміни поточного слова на скопійоване слово.
" replace with Register 0
map <leader>rr ciw<C-r>0<Esc>

yiwскопіюйте слово. Перейдіть до слова. ,rrзамінити слово.
Ключ лідера - це карта ,.


,rwбуло б більше сенсу, а на QWERTY, мабуть, зміг легше і швидше викреслити. На DVORAK я вибрав ,rc, що, хоча це взагалі не має великого сенсу, це простіше і швидше, ніж усі вони. На DVORAK ,rw- шоу жахів;)
Пол Паркер

0

Спочатку перейдіть до початку слова, яке ви хочете погладити. Якщо ви в середині слова, просто зробіть, bщоб повернутися до початку цього слова. Тоді виконайте, yeщоб витягнути все слово, не маючи пробілів (від yank до end). І, нарешті, перейти на слово , яке ви хочете замінити - можливо, виконавши wкілька разів - і зробити , vepщоб увійти в vрежим isual вибору, виберіть в eго слова, і pAste умістів останнього ривком.

(Якщо хтось хоче знати, чому я не просто коментував прийняту відповідь, за невелику модифікацію використання, yeа не ywтому, що моя репутація в цій стеці все ще занадто низька.)


0
  1. використовуйте ywдля поривання світу, перейдіть до світу, який ви хочете змінити.
  2. використовувати vдля вибору світу, veабо vwзалежно від вашої ситуації.
  3. введіть, pщоб вставити світ, який ви скопіювали, щоб замінити вибраний блок

0

Додавання до інших кращих відповідей. Трохи занадто очевидно, але ви можете просто вставити перед видаленням. 'yw', тоді перейдіть до слова, яке ви хочете замінити, 'pldw' (вставити, перемістити один символ праворуч, видалити слово.

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