Вопрос
Кто-нибудь знает способ вставить визуально выделенную область без помещения выделения в регистр по умолчанию?
Я знаю, что могу решить проблему, всегда вставляя данные из явного регистра.Но печатать - это боль в шее "Иксп вместо того, чтобы просто п
Решение
"{register}p
не будет работать, как вы описываете. Это заменит выбор с содержанием регистра. Вместо этого вам придется сделать что-то вроде:
" I haven't found how to hide this function (yet)
function! RestoreRegister()
let @" = s:restore_reg
return ''
endfunction
function! s:Repl()
let s:restore_reg = @"
return "p@=RestoreRegister()\<cr>"
endfunction
" NB: this supports "rp that replaces the selection by the contents of @r
vnoremap <silent> <expr> p <sid>Repl()
Что должно быть хорошо, если вы не используете плагин, имеющий vmap без nore для p, и который ожидает, что регистр будет перезаписан.
Этот код доступен в виде сценария там . Инго Каркат также определил плагин , решающий ту же проблему.
Другие советы
Мне не нравится поведение vim по умолчанию при копировании всего текста, удаленного с помощью d
, D
, c
или C
, в регистр по умолчанию.
Я справился с этим, сопоставив "_d
с "_c
, <=> с <=> и т. д.
Из моего .vimrc:
"These are to cancel the default behavior of d, D, c, C
" to put the text they delete in the default register.
" Note that this means e.g. "ad won't copy the text into
" register a anymore. You have to explicitly yank it.
nnoremap d "_d
vnoremap d "_d
nnoremap D "_D
vnoremap D "_D
nnoremap c "_c
vnoremap c "_c
nnoremap C "_C
vnoremap C "_C
Используйте следующее:
xnoremap p pgvy
это позволит повторно выбрать и повторно восстановить любой текст, вставленный в визуальном режиме.
Изменить: для работы с "xp
вы можете сделать:
xnoremap p pgv"@=v:register.'y'<cr>
v:register
расширяется до последнего имени регистра, использованного в команде нормального режима.
В вашем .vimrc
xnoremap p "_dP
Я нашел это в ответе на похожую тему, но исходный источник был http: // vim. wikia.com/wiki/Replace_a_word_with_yanked_text . В нем упоминаются некоторые недостатки, однако он прекрасно работает для меня.
Решение Люка Эрмита работает как шарм. Я использовал его около недели или около того. Затем я обнаружил решение от Стива Лоша nicev .vim. если YankRing является частью вашей линейки плагинов / пакетов:
function! YRRunAfterMaps()
" From Steve Losh, Preserve the yank post selection/put.
vnoremap p :<c-u>YRPaste 'p', 'v'<cr>gv:YRYankRange 'v'<cr>
endfunction
Попробуйте это в своем ~/.vimrc
:
xnoremap <expr> p 'pgv"'.v:register.'y'
xnoremap
означает, что это только дляVisual
режим, неVisual + Select
режимы.<expr>
Значит это{rhs}
принадлежащийxnoremap {lhs} {rhs}
настройка оценивается как выражение.В этом случае наше выражение
'pgv"'.v:register.'y'
использует.
для конкатенации.v:register
оценивается в регистре, используемом во время выполнения сопоставления.
Результат "xp
оценил бы pgv"xy
, где x
это регистр.
Мне помог ответ на этот вопрос stackoverflow: Vim — сопоставление с необязательным префиксом регистрав сочетании с Бенуаответ на этой странице
Функция Люка сработала хорошо для меня после того, как я внес изменение, чтобы поддержать тот факт, что у меня есть набор clipboard = безымянный:
function! RestoreRegister()
let @" = s:restore_reg
if &clipboard == "unnamed"
let @* = s:restore_reg
endif
return ''
endfunction
Люк Эрмитт сделал свое дело! Действительно хорошо. Вот его решение, заключенное в функцию переключения, так что вы можете переключаться между обычным поведением и положением без замены регистра.
команда, u переключает поведение
let s:putSwap = 1
function TogglePutSwap()
if s:putSwap
vnoremap <silent> <expr> p <sid>Repl()
let s:putSwap = 0
echo 'noreplace put'
else
vnoremap <silent> <expr> p p
let s:putSwap = 1
echo 'replace put'
endif
return
endfunction
noremap ,p :call TogglePutSwap()<cr>
попробуй -
:set guioptions-=a
:set guioptions-=A