Як вставити без перезапису регістра


112

Хтось знає про спосіб наклеїти візуально вибрану область без вибору, розміщеного в реєстрі за замовчуванням?

Я знаю, що можна вирішити проблему, завжди вставляючи з явного реєстру. Але це біль у шиї, "xpа не простоp

Відповіді:


33

"{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, і очікує, що реєстр буде перезаписаний.

Цей код доступний як сценарій там . Інго Каркат також визначив плагін, що вирішує ту саму проблему.


Насправді я хоч і мав акуратний спосіб отримати використаний реєстр, але не міг пригадати, як. Звідси складність функції.
Люк Ермітт

1
Я думаю, що це надмірність, не згадаєш regtype(лінійно?) І що переоформлення р до pgvyдостатньо.
Бенуа

2
Це може бути надмірним, але це не має побічних ефектів. На "xp@"@xpgvy
екрані

1
то про що :xnoremap p pgv@=v:register.'y'<cr>?
Бенуа

1
Це не працює для мене. Я також спробував завантажити сценарій. Ось список команд, які я виконую: Спочатку натискаю кнопку v, потім e to, щоб вибрати до кінця слова, потім y, щоб вирвати його. Після цього переходжу до іншого слова, яке хочу замінити. Я натискаю v, e, а потім p, щоб замінити цю. Потім я роблю це ще раз, але цього разу наступне слово замінено на те, яке я замінив раніше.
Едді

41

Мені не подобається поведінка 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

Настільки ж корисні, як ці відображення (я роблю щось подібне самостійно), вони не відповідають на питання ОП, P все одно перезаписать те, що ви проклеїли, вставляючи вибраний контент.
Магнус

32

Використовуйте наступне:

xnoremap p pgvy

це дозволить повторно вибрати і повторно вилучити будь-який текст, який вставлений у візуальному режимі.

Редагувати: для того, щоб це працювало з "xpвами, можна зробити:

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

v:register розширюється до останнього імені регістра, що використовується в команді звичайного режиму.


На a "xp, цей підхід перезаписується @"з @x.
Люк Ермітт

3
Ваша пропозиція xnoremap p pgv"@=v:register.'y'<cr>не працювала для мене. Однак це:xnoremap <expr> p 'pgv"'.v:register.'y'
mrak

Це виглядає цікаво. Чи можете ви додати рядок про те, що gробить? Я цього раніше не бачив.
LondonRob

4
@LondonRob: gодин не робить нічого. Він надає розширені, багатоклавішні команди, наприклад z. Наприклад, goпереходить до n-го байта в буфері gjта gkпереходить до наступного та попереднього відображуваного рядка (відрізняється від того, jkколи обертаються рядки), gaвідображає інформацію про символи під курсором, gJприєднує рядки без пробілу, і тут gvвідновлює останній візуальний вибір. Можна використовувати :help gv.
Бенуа

6
@mark :xnoremap <expr> p 'pgv"'.v:register.'y`>' , я додав `` `>` `Щоб відновити позицію курсору
rox

19

У вашому .vimrc

xnoremap p "_dP

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


2
Це здається найпростішим рішенням.
rudolph9

1
Працювали для мене. І ця відповідь зрозуміла. .vimrc.localтакож добре.
BaiJiFeiLong

3
Не працює, якщо ваш вибір поширюється на кінець рядка.
Джон Фріман

6

Рішення Люка Ермітта працює як шарм. Я використовував його близько тижня або близько того. Тоді я знайшов рішення у .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

Спробуйте це у вашому ~/.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 на цій сторінці


4

Функція Люка добре працювала для мене після того, як я змінив, щоб підтримати той факт, що у мене буфер обміну = без назви:

function! RestoreRegister()
    let @" = s:restore_reg
    if &clipboard == "unnamed"
        let @* = s:restore_reg
    endif
    return ''
endfunction

1
Для довідки: використовувати clipboard=unnamedplusце потрібно @+замість @*.
Себастьян Бласк

2

Люк Ермітт зробив свою справу! Справді добре. Ось його рішення введено у функцію перемикання, тож ви можете перемикатися між нормальною поведінкою та не заміною реєструвати.

команда, 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>

Ви також можете змінити s: Repl, щоб повернути "p" замість "p @ = RestoreRegister () \ <cr>" залежно від значення s: putSwap.
Люк Ермітт

1
віддайте перевагу silent! vunmapзамістьvnoremap <silent> <expr> p p
Люк Ермітт

0

програмування канальних стрічок, але працює для мене:

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<

-4

спробувати -

:set guioptions-=a
:set guioptions-=A

3
Вони контролюють, чи доданий вибраний текст до буфера обміну віконної системи (наприклад, X11 або Win32), а не до внутрішніх регістрів копій Vim.
Роб Кеннеді
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.