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

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

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


person Starr Horne    schedule 14.11.2008    source источник


Ответы (10)


"{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, и который ожидает перезаписи регистра.

Этот код доступен в виде скрипта там. Инго Каркат также разработал плагин, решающий ту же проблему.

person Community    schedule 14.11.2008
comment
На самом деле, я думал, что есть изящный способ получить используемый регистр, но не мог вспомнить, как это сделать. Отсюда сложность функции. - person Luc Hermitte; 14.11.2008
comment
Я думаю, что это перебор, я не запомню regtype (линейно?) И достаточно переназначения p на pgvy. - person Benoit; 23.02.2011
comment
Это может показаться излишним, но у него нет побочных эффектов. На "xp это не перезаписывает содержимое @" на @x в отличие от pgvy - person Luc Hermitte; 24.02.2011
comment
тогда как насчет :xnoremap p pgv@=v:register.'y'<cr>? - person Benoit; 24.02.2011
comment
У меня это не работает. Я тоже пробовал скачать сценарий. Вот список команд, которые я выполняю: сначала я нажимаю v, затем e, чтобы выделить до конца слова, затем y, чтобы поднять его. После этого я перехожу к другому слову, которое хочу заменить. Я нажимаю v, e, затем p, чтобы заменить его. Затем я делаю это снова, но на этот раз следующее слово заменяется тем, которое я заменил ранее. - person Eddy; 19.02.2012
comment
Эдди, что тебе говорят :verbose vmap p и :verbose vmap x? Кстати, вы проверяли этот патч stackoverflow.com/a/4446608/15934? - person Luc Hermitte; 20.02.2012
comment
Спасибо, исправил, применив патч danprice к плагину repl-visual-no-reg-overwrite.vim - person Eddy; 27.03.2012

Мне не нравится стандартное поведение 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
person Jeff Lake    schedule 01.05.2009
comment
Какими бы полезными ни были эти сопоставления (я сам делаю нечто подобное), они не отвечают на вопрос OP, p все равно перезапишет то, что вы выдернули, вставив поверх выбранного контента. - person Magnus; 04.08.2020

Используйте следующее:

xnoremap p pgvy

это повторно выделит и восстановит любой текст, вставленный в визуальном режиме.

Изменить: чтобы это работало с "xp, вы можете:

xnoremap p pgv"@=v:register.'y'<cr>

v:register заменяется последним именем регистра, используемым в команде нормального режима.

person Benoit    schedule 23.02.2011
comment
На "xp этот подход заменяет @" на @x. - person Luc Hermitte; 24.02.2011
comment
Ваше предложение xnoremap p pgv"@=v:register.'y'<cr> не сработало для меня. Это, однако, делает: xnoremap <expr> p 'pgv"'.v:register.'y' - person mrak; 07.03.2013
comment
Это выглядит интересно. Не могли бы вы добавить строку о том, что делает g? Я такого раньше не видел. - person LondonRob; 14.07.2015
comment
@LondonRob: g сам по себе ничего не делает. Он предоставляет расширенные многоклавишные команды, такие как z. Например, go переходит к n-му байту в буфере, gj и gk переходят к следующей и предыдущей отображаемой строке (отличается от jk, когда строки переносятся), ga отображает информацию о символе под курсором, gJ объединяет строки без пробела, а здесь gv восстанавливает последний визуальный отбор. Вы можете использовать :help gv. - person Benoit; 16.07.2015
comment
@mark :xnoremap <expr> p 'pgv"'.v:register.'y`>' , я добавил `` ›` `Для восстановления позиции курсора - person rox; 10.02.2017
comment
Спасибо @LondonRob за прекрасное объяснение того, что, черт возьми, делает gv в pgvy. Я видел это решение раньше и использовал его, но не совсем понимал, что оно делает. - person Ogre Codes; 21.10.2019

В вашем .vimrc

xnoremap p "_dP

Я нашел это из ответа в аналогичной теме, но исходным источником был http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text. В нем упоминаются некоторые недостатки, но он мне подходит.

person Jason Denney    schedule 14.07.2015
comment
Это кажется самым простым решением. - person rudolph9; 11.11.2016
comment
Работал у меня. И этот ответ ясен. .vimrc.local тоже в порядке. - person BaiJiFeiLong; 20.04.2019
comment
Не работает, если ваш выбор продолжается до конца строки. - person John Freeman; 11.07.2019
comment
Это вызывает у меня некоторые визуальные щелчки (vim перерисовывает между командами). xnoremap <silent> p p:let @+=@0<CR>:let @"=@0<CR> не имеет такой проблемы - person mollerhoj; 14.09.2020

Решение Люка Эрмитта работает как шарм. Я использовал его около недели. Затем я обнаружил решение от .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  
person Taine    schedule 21.11.2012

Попробуйте это в своем ~/.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 - регистр.

Мне помог ответ на этот вопрос о переполнении стека: Vim - отображение с необязательным префиксом регистра в сочетании с ответом Бенуа на этой странице

person mrak    schedule 07.03.2013

Функция Люка работала у меня хорошо после того, как я внес изменения, поддерживающие тот факт, что у меня есть clipboard = un named set:

function! RestoreRegister()
    let @" = s:restore_reg
    if &clipboard == "unnamed"
        let @* = s:restore_reg
    endif
    return ''
endfunction
person danprice    schedule 15.12.2010
comment
Для справки: при использовании clipboard=unnamedplus это должно быть @+ вместо @*. - person Sebastian Blask; 13.01.2017

Люк Эрмитт сделал свое дело! Действительно хорошо. Вот его решение, добавленное в функцию переключения, чтобы вы могли переключаться между нормальным поведением и помещением без замены регистра.

команда 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>
person Joernsn    schedule 07.10.2009
comment
Вы также можете изменить s: Repl, чтобы вернуть p вместо p @ = RestoreRegister () \ ‹cr› в зависимости от значения s: putSwap. - person Luc Hermitte; 07.10.2009
comment
предпочитаю silent! vunmap вместо vnoremap <silent> <expr> p p - person Luc Hermitte; 24.02.2011

программирование изоленты, но у меня работает:

nmap viwp viwpyiw
nmap vi'p vi'pyi'
nmap vi"p vi"pyi"
nmap vi(p vi(pyi(
nmap vi[p vi[pyi[
nmap vi<p vi<pyi<
person steven_noble    schedule 03.02.2020

пытаться -

:set guioptions-=a
:set guioptions-=A
person Gowri    schedule 14.11.2008
comment
Они контролируют добавление выделенного текста в буфер обмена оконной системы (например, X11 или Win32), а не во внутренние регистры копирования Vim. - person Rob Kennedy; 14.11.2008