Кто-нибудь знает способ оклеить визуально выбранную область, не помещая выделение в регистр по умолчанию?
Я знаю, что могу решить проблему, всегда вставляя данные из явного регистра. Но набирать " 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 "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, и который ожидает перезаписи регистра.
Этот код доступен в виде скрипта там. Инго Каркат также разработал плагин, решающий ту же проблему.
regtype (линейно?) И достаточно переназначения p на pgvy.
- person Benoit; 23.02.2011
"xp это не перезаписывает содержимое @" на @x в отличие от pgvy
- person Luc Hermitte; 24.02.2011
:xnoremap p pgv@=v:register.'y'<cr>?
- person Benoit; 24.02.2011
:verbose vmap p и :verbose vmap x? Кстати, вы проверяли этот патч stackoverflow.com/a/4446608/15934?
- person Luc Hermitte; 20.02.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
Используйте следующее:
xnoremap p pgvy
это повторно выделит и восстановит любой текст, вставленный в визуальном режиме.
Изменить: чтобы это работало с "xp, вы можете:
xnoremap p pgv"@=v:register.'y'<cr>
v:register заменяется последним именем регистра, используемым в команде нормального режима.
"xp этот подход заменяет @" на @x.
- person Luc Hermitte; 24.02.2011
xnoremap p pgv"@=v:register.'y'<cr> не сработало для меня. Это, однако, делает: xnoremap <expr> p 'pgv"'.v:register.'y'
- person mrak; 07.03.2013
g? Я такого раньше не видел.
- person LondonRob; 14.07.2015
g сам по себе ничего не делает. Он предоставляет расширенные многоклавишные команды, такие как z. Например, go переходит к n-му байту в буфере, gj и gk переходят к следующей и предыдущей отображаемой строке (отличается от jk, когда строки переносятся), ga отображает информацию о символе под курсором, gJ объединяет строки без пробела, а здесь gv восстанавливает последний визуальный отбор. Вы можете использовать :help gv.
- person Benoit; 16.07.2015
:xnoremap <expr> p 'pgv"'.v:register.'y`>' , я добавил `` ›` `Для восстановления позиции курсора
- person rox; 10.02.2017
gv в pgvy. Я видел это решение раньше и использовал его, но не совсем понимал, что оно делает.
- person Ogre Codes; 21.10.2019
В вашем .vimrc
xnoremap p "_dP
Я нашел это из ответа в аналогичной теме, но исходным источником был http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text. В нем упоминаются некоторые недостатки, но он мне подходит.
.vimrc.local тоже в порядке.
- person BaiJiFeiLong; 20.04.2019
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
Попробуйте это в своем ~/.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 - отображение с необязательным префиксом регистра в сочетании с ответом Бенуа на этой странице
Функция Люка работала у меня хорошо после того, как я внес изменения, поддерживающие тот факт, что у меня есть clipboard = un named set:
function! RestoreRegister()
let @" = s:restore_reg
if &clipboard == "unnamed"
let @* = s:restore_reg
endif
return ''
endfunction
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>
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<
пытаться -
:set guioptions-=a
:set guioptions-=A