VIM Замінити слово вмістом буфера вставки?


110

Мені потрібно виконати купу замінників слів у файлі і хочу зробити це командою vi, а не командою EX на зразок :%s///g. Я знаю, що це типовий спосіб замінити слово на поточній позиції курсору: cw<text><esc>але чи можна це зробити із вмістом неназваного реєстру як замісного тексту та без перезапису регістра?


8
РЕЗОЛЮЦІЯ: Для моєї негайної потреби я використовував 12yl12 символів і "_cw^r0замінював слово. Тоді мені вдалося скористатися .командою, щоб повторити заміну у всьому файлі.
плуг

Відповіді:


127

Я думаю, що під "вставити" ви маєте на увазі реєстр без назви (yank / put / change / delete / substitute), правда? (Оскільки це те, що буде перезаписано командою change.)

Регістри, як правило, задаються шляхом введення "потім імені (одного символу) реєстру, як "ayпотім, "apщоб перейти в реєстр a, а потім помістити вміст регістра a. Те саме стосується команди зміни. В цьому випадку, якщо ви не хочете, щоб текст видалити за допомогою команди зміни , щоб піти куди - небудь, ви можете використовувати чорну діру реєстр "_: "_cw. Потім, потрапивши в режим вставки, ви можете натиснути ctrl-R, а потім реєстр, який ви хочете (ймовірно ") внести до вмісту цього реєстру.

  • "* - регістр вибору (вставка середньої кнопки)
  • "+ - регістр буфера обміну (можливо, також доступний за допомогою ctrl-shift-v через термінал)
  • "" - регістр yank / put / зміни / видалення / заміни за замовчуванням (без назви) vim.

Коротка відповідь: "_cw^R"

Редагувати: як пропонують інші, ви, звичайно, можете використовувати інший реєстр для терезу (або будь-якого іншого), який увійшов ваш текст у регістр за замовчуванням. Ти не завжди думаєш про це спочатку, тому приємно виконувати одну команду зміни, не видуваючи її. Хоча це не зовсім здуло. Існують пронумеровані регістри "0через "9:

Vim заповнює ці регістри текстом з yank та видаляє команди.

Нумерований регістр 0 містить текст останньої команди yank, якщо тільки команда не вказала інший регістр з ["x].

Нумерований регістр 1 містить текст, видалений за допомогою останньої команди видалення або зміни, якщо тільки команда не вказала інший регістр або текст менше одного рядка (тоді використовується невеликий регістр видалення). Виняток робиться для видалення оператора з цими командами руху: %, (, ), `, /, ?, n, N, {і }. Реєстр "1 завжди використовується тоді (це сумісно з Vi). Реєстр" - використовується також, якщо видалення знаходиться в рядку.

З кожним послідовним вилученням або зміною Vim зміщує попередній вміст регістра 1 в регістр 2, 2 на 3 і так далі, втрачаючи попередній вміст регістра 9.


1
Гаразд, думаю, що я вже скопіював достатньо документів із реєстрів у свою відповідь? Це все там, під :help registers.
Каскабель

48

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

nmap <silent> cp "_cw<C-R>"<Esc>

Редагувати:

Також я зробив це на крок далі і підтримав будь-який рух.

Щоб отримати еквівалент команди вище, було б cpw"змінити вставити слово"

"This allows for change paste motion cp{motion}
nmap <silent> cp :set opfunc=ChangePaste<CR>g@
function! ChangePaste(type, ...)
    silent exe "normal! `[v`]\"_c"
    silent exe "normal! p"
endfunction

<silent> змушує його не працювати для мене ... будь-яка ідея, чому це було б? Я n00b у відображенні та функціях.
Холлістер

Єдина проблема з цим полягає в тому, що ви не можете вибрати реєстр, який потрібно вставити за допомогою ... але в такому випадку, я думаю, ви могли просто перезапустити та використовувати CTRL + R
Стів Вермеулен

2
Можливо, буде кращий спосіб додати назву реєстру, але для мене працює наступне: nmap <silent> cp :let g:currentRegister=v:register<cr>:set opfunc=ChangePaste<CR>g@ function! ChangePaste(type, ...) silent exe "normal! `[v`]\"_c".getreg(g:currentRegister) endfunction
Стів Вермеулен,

@eventualEntropy це добре працює для заміни рядків, як я можу зробити цю роботу для слів замість рядків, я все ще навчаюся vim. Дякую за допомогу.
Xavitoj Cheema

@XavitojCheema Я навіть не пам'ятаю робити цей коментар, ха-ха. Але, як виявляється, я фактично з тих пір написав плагін, щоб забезпечити цю функціональність ( github.com/svermeulen/vim-easyclip )
Стів Вермеулен

27

Для цього можна використовувати візуальний режим vim. наприклад, скопіюйте слово: yeа потім перезапишіть інше зі скопійованим словом:vep


9
Це працює, але слід також зазначити, що візуальна паста замінює yank буфер для щойно видаленого тексту.
ostler.c

24

Якщо ваш курсор є на слові, яке ви хочете замінити вмістом реєстру без назви, ви можете використовувати viwp. vпереходить у візуальний режим, iwвибирає внутрішнє слово і pставить вміст регістра на своє місце.

На практиці, коли мені потрібно замінити одне слово (назва функції тощо) на інше, я перейду до того, яке я буду використовувати як заміну, yiwпідтягнути внутрішнє слово до безіменного реєстру, а потім перейдіть до слова I ' м заміни та viwpзамінити його. Досить швидкий спосіб заміни одного слова іншим. Якщо ви шукали ( /) слово, яке ви замінюєте, щоб дістатися до нього, то можете просто натиснути, nщоб дістатись до наступного явища, яке вам потрібно замінити. Очевидно, що немає заміни для використання :%s/find/replace/g, але для декількох швидких підстановок це може бути зручно, особливо якщо ви вже маєте нове слово в реєстрі.


4
Я здивований, що це не прийняте рішення: все вищезазначене, хоча в деяких випадках гнучкіше , є набагато більш дослідним для простого "десь заміни поточного неназваного реєстру на вибір", яка така ситуація є оригінальною Аскер прийшов сюди за.
ELLIOTTCABLE

1
Це дуже корисно та інтуїтивно.
лакостенікодер

6

Якщо ви використовуєте названий реєстр (тобто використовувати "ayабо "adтощо, щоб заповнити свій регистр пасти), ви можете зробити щось подібне

cw<CTRL-R>a<esc>

Яке слово замінить на зміст реєстру a. Наскільки я можу сказати, ви не можете використовувати реєстр за замовчуванням, тому що коли ви cwбудете заповнені словом, яке було вирізане цією командою.


Ви можете використовувати регістр за замовчуванням! Перевірте мою відповідь.
Каскабель

2

Ви маєте на увазі буфер системної пасти або регістр vi?

Якщо ви хочете використовувати буфер системної пасти, то ви все добре і можете зробити dw"+P- "вибирає регістр, і "+це буфер системної пасти.

В іншому випадку скопіюйте в регістр, що не використовується за замовчуванням, скажіть "ayскопіювати в реєстр, aа потім замінити щосьdw"aP


Спасибі, Гаміш. Я спробував це, але dwвидаляє пробіли, що знаходяться після того, що я вважаю «словом», тоді як cwлише змінює слово. З цієї причини dwдля мене не вийде.
plong

У такому випадку це deповинно працювати для вас - воно видалить до кінця цього слова, тоді як dwвидалить до початку наступного слова.
Гаміш Даунер

1

Ви можете використовувати, ywщоб словити слово, а потім ви можете змінити слово з вирваним словом на на те, vipwщоб словити слово і вставити раніше вибите слово.


0

Ви можете використовувати регістри для цього:

перше місце заміни тексту в реєстрі <mark some text>"ay

де aназва реєстру

тоді ви можете використовувати цей реєстр для заміни

ve"ap


На жаль, я не міг просто повторити останню операцію вставки, через .що я ще хотів зробити. Спасибі, хоча. Цінується.
plong

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