Как вставить без перезаписи

Кто-нибудь знает способ вставки над визуально выбранной областью без выбора, помещенного в регистр по умолчанию?

Я знаю, что могу решить проблему, всегда вставляя явный регистр. Но это боль в шее, чтобы ввести " 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