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

StackOverflow https://stackoverflow.com/questions/290465

  •  08-07-2019
  •  | 
  •  

Вопрос

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

Я знаю, что могу решить проблему, всегда вставляя данные из явного регистра.Но печатать - это боль в шее "Иксп вместо того, чтобы просто п

Это было полезно?

Решение

"{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  

Функция Люка сработала хорошо для меня после того, как я внес изменение, чтобы поддержать тот факт, что у меня есть набор 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top