Хтось знає про спосіб наклеїти візуально вибрану область без вибору, розміщеного в реєстрі за замовчуванням?
Я знаю, що можна вирішити проблему, завжди вставляючи з явного реєстру. Але це біль у шиї, "xpа не простоp
Хтось знає про спосіб наклеїти візуально вибрану область без вибору, розміщеного в реєстрі за замовчуванням?
Я знаю, що можна вирішити проблему, завжди вставляючи з явного реєстру. Але це біль у шиї, "xpа не просто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 для p, і очікує, що реєстр буде перезаписаний.
Цей код доступний як сценарій там . Інго Каркат також визначив плагін, що вирішує ту саму проблему.
regtype
(лінійно?) І що переоформлення р до pgvy
достатньо.
"xp
@"
@x
pgvy
:xnoremap p pgv@=v:register.'y'<cr>
?
Мені не подобається поведінка 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
.
xnoremap p pgv"@=v:register.'y'<cr>
не працювала для мене. Однак це:xnoremap <expr> p 'pgv"'.v:register.'y'
g
робить? Я цього раніше не бачив.
g
один не робить нічого. Він надає розширені, багатоклавішні команди, наприклад z
. Наприклад, go
переходить до n-го байта в буфері gj
та gk
переходить до наступного та попереднього відображуваного рядка (відрізняється від того, jk
коли обертаються рядки), ga
відображає інформацію про символи під курсором, gJ
приєднує рядки без пробілу, і тут gv
відновлює останній візуальний вибір. Можна використовувати :help gv
.
:xnoremap <expr> p 'pgv"'.v:register.'y`>'
, я додав `` `>` `Щоб відновити позицію курсору
У вашому .vimrc
xnoremap p "_dP
Я знайшов це у відповіді на подібній темі, але початковим джерелом було http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text . Він згадує деякі недоліки, проте для мене це добре працює.
.vimrc.local
також добре.
Рішення Люка Ермітта працює як шарм. Я використовував його близько тижня або близько того. Тоді я знайшов рішення у .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
знаходиться реєстр.
Я допоміг відповідь на це питання StackOverflow: Вім - відображення з додатковим регістра префікса в поєднанні з Benoit відповідь «s на цій сторінці
Функція Люка добре працювала для мене після того, як я змінив, щоб підтримати той факт, що у мене буфер обміну = без назви:
function! RestoreRegister()
let @" = s:restore_reg
if &clipboard == "unnamed"
let @* = s:restore_reg
endif
return ''
endfunction
clipboard=unnamedplus
це потрібно @+
замість @*
.
Люк Ермітт зробив свою справу! Справді добре. Ось його рішення введено у функцію перемикання, тож ви можете перемикатися між нормальною поведінкою та не заміною реєструвати.
команда, 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
програмування канальних стрічок, але працює для мене:
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