Поэтому я обычно копирую текст из одной точки в другую, перезаписывая старый текст, куда вставляется новый:
blah1
newtext
blah2
wrong1
blah3
wrong2
blah4
Предположим, я визуально пометил newtext
и y
добавил это. Теперь я выбираю wrong1
(что может быть что угодно, не обязательно просто слово) и p
выбираю newtext
. Однако, если я сейчас сделаю то же самое, wrong2
он будет заменен wrong1
вместо newtext
.
Итак, как я могу предотвратить замену текста, который находится в буфере, текстом, который я сейчас перезаписываю?
Редактировать 1
Хотя мне очень нравятся предложения по повторной регистрации (я думаю, что я начну использовать регистры больше, теперь, когда я обнаружил :dis
команду), я собираюсь изменить ответ jinfield , потому что я не использую режим обмена.
vnoremap p "0p
vnoremap P "0P
vnoremap y "0y
vnoremap d "0d
делает трюк отлично.
Редактировать 2
Я был слишком быстр; Решение romainl - это именно то, что я искал, без взлома в Edit 1 .
На самом деле, vnoremap p "_dP
достаточно!
Итак, меняем принятый ответ.
источник
vnoremap p "_dP map
, и я заметил, что это не очень хорошо работает для последнего слова / символа в строке. Я вернулась кvnoremap p "0p
,vnoremap P "0P
иset clipboard=unnamed
(для OSX)vnoremap p "_dP
удаляет пустое пространство на пасте. Edit 1 работает отлично.Ответы:
У меня есть эти сопоставления в моем .vimrc:
"_
это «регистр черной дыры», согласно:help "_
:«При записи в этот регистр ничего не происходит. Это можно использовать для удаления текста, не затрагивая обычные регистры. При чтении из этого регистра ничего не возвращается. {Не в Vi}»
источник
vnoremap p "_dP map
и заметил, что он не работает хорошо для последнего слова / символа в строке. Я вернулась кvnoremap p "0p
,vnoremap P "0P
иset clipboard=unnamed
(для OSX)vnoremap p "_dP
перестать работать на меня в режиме выбора, ноvnoremap <leader>p "_dP
работает<leader>
, это заполнитель, который я должен знать, чтобы заменить чем-то, но это сработало только для меня, если я удалил его. Что это значит здесь?:help mapleader
.vnoremap <leader>p
отображение не работает должным образом в последней строке буфера, потому что как только вы удаляете эту последнюю строку буфера, вы находитесь в последней строке раз в секунду, и строкаP
вставляется над этой строкой, вместо ниже.В дополнение к стандартному буферу, вы можете вытянуть текст в именованные буферы, а затем поместить из этих именованных буферов. Вы можете использовать до 26 именованных буферов (по одному на каждую букву). Используйте двойные кавычки и букву для доступа к названному буферу. Примеры:
"dyy
- вырвать текущую строку в буфер d."a7yy
- Снять следующие семь строк в буфер a."dP
- Поместите содержимое буфера d перед курсором."ap
- Поместить содержимое буфера после курсораЕще одна крутая вещь, если вы используете заглавную букву вместо нижнего регистра, то есть
"Dyy
текущая строка будет добавлена в буфер d вместо ее замены. Подробнее в книге О`Рейли: http://docstore.mik.ua/orelly/unix/vi/ch04_03.htmисточник
"a
, но хорошо.При использовании
put
в визуальном режиме текст, который вы заменяете,wrong1
перезаписывается содержимым регистра «unamed».Это на самом деле работает, «помещая» регистр после выбора, а затем удаляя выбор. Проблема в том, что это удаление теперь хранится в
unnamed
реестре и будет использовано для следующегоput
действия.В соответствии с этим
:h v_p
, решение состоит в том, чтобы вставить в именованный регистр, например"0y
, затем вставить"0p
столько раз, сколько вам нужно. Может быть полезно отобразить<leader>y
и<leader>p
использовать именованный регистр, если вы часто этим занимаетесь.для получения дополнительной помощи см .:
источник
"0
Важно знать вставку из реестра, но вы часто хотите заменить много раз. Если вы делаете это повторяемое действие, вы можете использовать.
оператор, на который ссылается garyjohn. Это объясняется на вики-сайте vim :источник
Когда вы вставляете текст в безымянный регистр *, копия также помещается в регистр 0. Каждый раз, когда вы заменяете выделенный текст, вы можете просто вставить из регистра 0. Видеть
Кроме того, если вы заменяете несколько слов одним и тем же словом, вы можете просто перейти к началу слова, которое нужно заменить, и ввести
.
. Это будет повторять последнюю операцию редактирования. Видеть* Места хранения, в которые вы вставляете и кладете, называются регистрами. Буфер - это то, что вы редактируете, обычно это копия файла с диска.
источник
Мне нужно это так часто, я написал для этого плагин: ReplaceWithRegister .
Этот плагин предлагает
gr
команду « два в одном», которая заменяет текст, покрытый {motion}, всю строку (строки) или текущий выбор, содержимым регистра; старый текст удаляется в регистр черной дыры, т.е.источник
Поскольку что-то вроде
vnoremap p "_dP
(я также пыталсяx
илиc
) имеет проблемы с началом и концом строки, я закончил тем, что сделал это:vnoremap p :<C-U>let @p = @+<CR>gvp:let @+ = @p<CR>
что я нашел проще, чем существующие плагины (которые также не работалиset clipboard=unnamedplus
из коробки). Итак, что это делает:C-U
)+
регистр (из-за un namedplus, альтернативы"
и в*
зависимости от вашей конфигурации)p
источник
Это то, что я использую (буквально скопировано из моего .vimrc) для стиля Windows Control + X вырезать / Control + C копировать / Control + V paste / Control + S сохранить / Control + F найти / Control + H заменить поведение.
Функция smartpaste () должна содержать то, что вы ищете, то есть способ вставить поверх выделенного текста без одновременного восстановления выбранного.
источник
tl; dr - vnoremap p "_c *
Вот список моих полных сопоставлений:
«Исправление копирования / вставки регистра
nnoremap DD» * dd
nnoremap D »* d
vnoremap D« d
nnoremap d »_d
nnoremap dd« _dd
vnoremap d »_d
nnoremap s» _s
vnoremap s »_s
nnoremap c "_c
vnoremap c" _c
nnoremap x "_x
vnoremap x" _x
vnoremap p "_c
"Вставить на новую строку
nnoremap, p op
nnoremap, P Op
источник