Выполнение определенных операций без очистки регистра

30

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

Есть ли способ сделать это без перехода в режим вставки?

durron597
источник
Джаспер нашел похожие вопросы о переполнении стека : [Есть ли способ удалить в vim, не перезаписывая ваш последний рывок? [duplicate]] ( stackoverflow.com/questions/3638542/… ) и в vim есть способ удалить без внесения текста в реестр?
Жиль "ТАК - перестань быть злым"

Ответы:

35

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

  1. Используйте регистр черной дыры _. Например, чтобы удалить строку, вы наберете "_dd. Это удаляет без ущерба для буфера обмена.
  2. Явно назовите регистр для оригинального янки. Например, чтобы вставить строку в именованный регистр, вы должны ввести "ayyзатем вставить"ap
  3. Вместо этого используйте регистры янки, чтобы получить оригинал янки. Вы можете дернуть, затем удалить по необходимости, затем, когда вы идете, чтобы вставить тип"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где REGISTER это любая отдельная буква. Затем вы используете тот же префикс регистра цитаты pдля вставки из этого регистра. (Примечание: строчные буквы заменяют их содержимое; заглавные буквы добавляются).

Есть также два специальных регистра "0и "1. "0является последним yтекстом yanked ( ), который останется, даже если вы удалите какой-либо текст другой командой (например x). "1является последним удаленным текстом, если он не маленький (одна строка). Небольшой удаленный текст входит "-.

Наконец, как указывает Стив Вермейлен, вы можете сказать vim не сохранять удаленный текст, указав регистр черной дыры "_.

Соответствующая команда справки :help registers.

derobert
источник
3

Команда :letпозволит вам переопределить именованный регистр. В командной строке vim, дважды нажав Control+ 1 и затем имя регистра, будет вставлено содержимое регистра в команду. Затем вы можете изменить то, что он вставил, и сохранить реестр с вашими изменениями.R

Пример:

  • В обычном режиме, в строке, содержащей текст «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>». - insert.txt vimdoc,:help i_CTRL-R_CTRL-R

alxndr
источник
0

Относительно регистра "_черной дыры, упомянутого @derobert, вы можете найти полезный скринкаст в http://vimcasts.org/episodes/meet-the-yank-register/

Vim использует термины delete, yank и put вместо более стандартной терминологии вырезать, копировать и вставить. Начиная с одной буквы, вставка и вставка легко взаимозаменяемы. Как только вы привыкнете к слову янки, оно становится синонимом копии. Но использование Vim слова «удалить» проблематично. В большинстве случаев слово «удалить» означает просто «удалить». Но операция удаления Vim копирует текст в регистр, а затем удаляет его из документа. Другими словами, операция удаления Vim ведет себя как вырезка.

Марлон Леон
источник
2
Это не дает ответа на вопрос. Чтобы критиковать или запрашивать разъяснения у автора, оставьте комментарий под его постом - вы всегда можете комментировать свои собственные посты, и, когда у вас будет достаточно репутации, вы сможете комментировать любые посты .
jamessan
Я пытался прокомментировать исходное сообщение, но не смог. Единственная альтернатива, которую я выбрал, была та, которую я выбрал @jamessan
Марлон Леон
0

Плагин ReplaceWithRegister

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

Это предлагает сопоставление gr.

  1. дергать
  2. визуально выделите текст, который хотите заменить, и нажмите gr
  3. перейти к следующему блоку, который вы хотите заменить

Альтернативно, используйте, gr<text object>чтобы сделать это без визуального выбора. dot-repeat поддерживается, когда установлены плагины repeat.vimTim Pope и visualrepeat.vimIngo Karkat.

Hotschke
источник