Как вставить без перезаписи
Кто-нибудь знает способ вставки над визуально выбранной областью без выбора, помещенного в регистр по умолчанию?
Я знаю, что могу решить проблему, всегда вставляя явный регистр. Но это боль в шее, чтобы ввести " x p вместо просто p
Ответы
Ответ 1
"{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 также определил плагин решив ту же проблему.
Ответ 2
Мне не нравится поведение 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
Ответ 3
Используйте следующее:
xnoremap p pgvy
это приведет к повторному выбору и повторному отображению любого текста, который будет вставлен в визуальном режиме.
Изменить: для работы с "xp
вы можете:
xnoremap p pgv"@=v:register.'y'<cr>
v:register
расширяется до последнего имени регистра, используемого в команде нормального режима.
Ответ 4
В .vimrc
xnoremap p "_dP
Я нашел это из ответа на аналогичный поток, но исходный источник был http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text. В нем упоминаются некоторые недостатки, однако он отлично подходит для меня.
Ответ 5
Решение 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
Ответ 6
Функция Luc работала хорошо для меня после того, как я внес изменения, чтобы поддержать тот факт, что у меня есть clipboard = unnamed set:
function! RestoreRegister()
let @" = s:restore_reg
if &clipboard == "unnamed"
let @* = s:restore_reg
endif
return ''
endfunction
Ответ 7
Люк Хермит сделал трюк! Действительно хорошо. Здесь его решение помещается в функцию переключения, поэтому вы можете переключаться между обычным поведением и помещением без замены.
команда, 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>
Ответ 8
Попробуйте это в ~/.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 ответьте на этой странице
Ответ 9
попробуйте -
:set guioptions-=a
:set guioptions-=A