Виконання певних операцій без очищення реєстру


30

Часто в конфігураційні файли я можу скопіювати і вставити блок рядків, тоді я хочу внести невеликі зміни до цього блоку. Після вставки я використовую xдля видалення символів, які я хочу видалити, а потім переходжу до вставки наступного блоку. За винятком випадків, xколи вилучені символи ставлять у буфер обміну, тому мені доведеться знову копіювати блок рядків.

Чи є спосіб це зробити, не переходячи в режим вставки?


Джаспер знайшов подібні запитання щодо Stacka Overflow : [Будь-який спосіб видалити в vim, не перезаписуючи останній yank? [дублікат]] ( stackoverflow.com/questions/3638542/… ) і In vim чи є спосіб видалити, не додаючи текст до реєстру?
Жил "ТАК - перестань бути злим"

Відповіді:


35

Ваші варіанти:

  1. Використовуйте регістр чорної діри _. Наприклад, для видалення рядка, який ви введете "_dd. Це видаляється, не впливаючи на буфер обміну.
  2. Явно називають реєстр для оригінального yank. Наприклад, щоб перетягнути рядок у названий реєстр, ви введете "ayyпотім, щоб вставити його"ap
  3. Використовуйте регістри yank, щоб отримати замість цього вихідний yank. Ви можете витягнути, потім видалити по мірі необхідності, а потім, коли переходите до вставки"0p
  4. Використовуйте плагін, такий як vim-easyclip, щоб забезпечити оператор скорочення, який відрізняється від оператора видалення (повне розкриття: я це написав)

Біжіть :help registersдетальніше на перших 3


4
Так для чого xя б "_xтоді користувався?
durron597

1
Це правильно.
Стів Вермеулен

2
@ durron597, якщо ви одночасно видаляєте один символ x, вам, мабуть, слід навчитися рухати видалення, як, наприклад, dt)яке видаляє, до наступного закритого дужки, з d2Wякого буде видалено наступні два розділені лексеми пробілу. Тоді ви можете зробити щось на зразок "_di{внутрішньої області, яка є обмеженою, що я постійно роблю. У звичайному режимі це означає " видалити все, що знаходиться в цій підкресленій області, у чорну діру "
OregonTrail

Додано nnoremap x "_xдо мого ~/.vimrc(пояснення тут: stackoverflow.com/questions/54255/… ).
Вікторія Стюарт

11

xне ставить речі в буфер обміну, він вносить їх до реєстру . Якщо ви не скажете йому, в який реєстр його вносити, він вносить його до реєстру без назви, що, звичайно, перезаписує попередній вміст. Отже, замість цього, скажіть, який реєстр використовувати:, " REGISTER xде РЕЄСТРУЙТЕ будь-яку одну букву. Потім ви використовуєте той самий префікс реєстрації цитат, pщоб вставити з цього реєстру. (Примітка: малі регістри замінюють їхній вміст; великі регістри додаються).

Також є два спеціальні регістри "0та "1. "0це останній викручений ( y) текст, який залишиться, навіть якщо ви видалите якийсь текст за допомогою іншої команди (наприклад x). "1- це останній час видалений текст, якщо цей текст не малий (один рядок). Невеликий видалений текст надходить "-.

Нарешті, як вказує Стів Вермеулен, ви можете сказати vim не зберігати видалений текст, вказавши регістр чорної діри "_.

Відповідна команда довідки є :help registers.


3

:letКоманда дозволить вам перевизначити іменований регістр. У командному рядку vim натисніть Control+ R двічі 1, а потім ім’я регістру вставить вміст регістра в команду. Потім ви можете змінити те, що вставлено, і зберегти реєстр зі своїми модифікаціями.

Приклад:

  • У звичайному режимі в рядку, що містить текст "Foo Bar", вводите "fyyпо всій лінії ( yy) в fреєстр ( "f).
  • Введіть :let @f=', і Control+ r, Control+ r, потім f, і ви побачите, що це вставити у "Foo Bar", тож ваш командний рядок тепер читається :let @f='Foo Barз курсором у самому кінці.
  • Тепер ви можете використовувати стрілки та клавіші видалення для редагування того, що ви щойно вставили, наприклад :let @f='foo bar baz.
  • Закінчіть цитуванням: :let @f='foo bar baz'і натисніть Enter.

Тепер ви перезначили вміст fрегістра, щоб він був "foo bar baz".

(Це також працює для макросів! :help letДля отримання додаткової інформації.)


1 Control + rдозволяє вставити реєстр, коли ви вже перебуваєте в режимі вставки, як ніби ви набираєте символи. Використання цієї послідовності двічі важливо, оскільки "текст вставляється буквально, а не як набраний. Це відрізняється, коли реєстр містить такі символи <BS>". - vitdoc insert.txt,:help i_CTRL-R_CTRL-R


0

Зв'язаний з реєстром "_чорної дуги, згаданий @derobert, ви можете знайти корисну скріншот на http://vimcasts.org/episodes/meet-the-yank-register/

Vim використовує терміни delete, yank та put замість більш стандартної термінології вирізати, скопіювати та вставити. Починаючи з тієї самої літери, наносити і вставляти легко взаємозамінні. Як тільки ви звикнете до слова yank, воно стає синонімом копії. Але використання Vim слова "delete" є проблематичним. У більшості контекстів слово delete просто означає видалити. Але операція видалення Vim копіює текст у реєстр, після чого видаляє його з документа. Іншими словами, операція видалення Vim веде себе як розріз.


2
Це не дає відповіді на запитання. Щоб критикувати або вимагати роз'яснення у автора, залиште коментар під їх публікацією - ви завжди можете коментувати свої власні публікації, і як тільки у вас буде достатня репутація, ви зможете коментувати будь-яку публікацію .
Jamessan

Я спробував прокоментувати оригінальний пост, але не зміг. Єдиною альтернативою у мене була та, яку я вибрав @jamessan
Марлон Леон

0

Плагін ЗамінітьWithRegister

http://www.vim.org/scripts/script.php?script_id=2703 (2009-2014)

Це пропонує картування gr.

  1. ривок
  2. візуально виберіть текст, який потрібно замінити, і натисніть gr
  3. перейти до наступного блоку, який потрібно замінити

Крім того, використовуйте gr<text object>для цього без візуального вибору. точка-повторення підтримується при встановленні плагінів repeat.vimТіма Попа та visualrepeat.vimІнго Карката.

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