Кто-нибудь знает способ вставки над визуально выбранной областью без выбора, помещенного в регистр по умолчанию?
Я знаю, что могу решить проблему, всегда вставляя явный регистр. Но это боль в шее, чтобы ввести " x p вместо просто p
Кто-нибудь знает способ вставки над визуально выбранной областью без выбора, помещенного в регистр по умолчанию?
Я знаю, что могу решить проблему, всегда вставляя явный регистр. Но это боль в шее, чтобы ввести " x p вместо просто p
"{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 "[email protected]=RestoreRegister()\<cr>"
endfunction
" NB: this supports "rp that replaces the selection by the contents of @r
vnoremap <silent> <expr> p <sid>Repl()
Что должно быть хорошо, если вы не используете плагин с не-nore vmap для p и ожидает, что регистр будет перезаписан.
Этот код доступен как script там. Ingo Karkat также определил плагин решив ту же проблему.
Мне не нравится поведение vim по умолчанию для копирования всего текста, удаленного с помощью d
, d
, c
или c
в регистр по умолчанию.
Я обошел его, сопоставляя d
с "_d
, c
с "_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. В нем упоминаются некоторые недостатки, однако он отлично подходит для меня.
Решение Luc Hermitte работает как шарм. Я использовал его примерно неделю или около того. Затем я обнаружил решение от Стив Лош .vimrc, который хорошо работает, если 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
Функция Luc работала хорошо для меня после того, как я внес изменения, чтобы поддержать тот факт, что у меня есть clipboard = unnamed set:
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>
Попробуйте это в ~/.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 - сопоставление с дополнительным префиксом регистра в сочетании с Benoit ответьте на этой странице
попробуйте -
:set guioptions-=a
:set guioptions-=A