Jak wkleić bez nadpisywania rejestru


112

Czy ktoś wie, jak wkleić wizualnie wybrany obszar bez umieszczania zaznaczenia w domyślnym rejestrze?

Wiem, że mogę rozwiązać problem, zawsze wklejając z jawnego rejestru. Ale pisanie na maszynie "xpzamiast po prostu bolip

Odpowiedzi:


33

"{register}pnie będzie działać tak, jak opisujesz. Zastąpi wybór treścią rejestru. Zamiast tego będziesz musiał zrobić coś takiego:

" 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()

Co powinno być w porządku, o ile nie używasz wtyczki, która ma mapę vmap inną niż nore na p i która oczekuje nadpisania rejestru.

Kod ten jest dostępny jako skrypt tam . Ingo Karkat zdefiniował również wtyczkę rozwiązującą ten sam problem.


Właściwie myślałem, że istnieje zgrabny sposób na pobranie używanego rejestru, ale nie pamiętam, jak to zrobić. Stąd złożoność funkcji.
— Luc Hermitte

1
Myślę, że to przesada, nie pamiętam regtype(linewise?) I że ponowne odwzorowanie p do pgvyjest wystarczające.
— Benoit

2
Może to być przesada, ale nie ma skutków ubocznych. Na a "xp, to nie nadpisuje @"treści @xinnympgvy
— Luc Hermitte,

1
a co z tym :xnoremap p pgv@=v:register.'y'<cr>?
— Benoit

1
Na mnie to nie działa. Próbowałem też pobrać skrypt. Oto lista poleceń, które wykonuję: Najpierw naciskam v, następnie e, aby zaznaczyć na końcu słowa, a następnie y, aby je szarpnąć. Następnie przechodzę do innego słowa, które chcę zastąpić. Naciskam v, e, a następnie p, aby zastąpić to. Potem robię to ponownie, ale tym razem następne słowo jest zastępowane tym, które zastąpiłem wcześniej.
— Eddy,

41

Nie lubię domyślne zachowanie vim kopiowania cały tekst usunięty z d, D, club Cw domyślnym rejestrze.

Poradziłem sobie z tym, mapując ddo "_d, cdo "_ci tak dalej.

Z mojego .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

Chociaż te mapowania są przydatne (sam robię coś podobnego), nie odpowiadają na pytanie OP, p nadal nadpisze to, co wyszarpnąłeś, wklejając wybrane treści.
— Magnus

32

Użyj następujących:

xnoremap p pgvy

spowoduje to ponowne zaznaczenie i ponowne szarpnięcie dowolnego tekstu wklejonego w trybie wizualnym.

Edycja: aby to działało "xp, możesz wykonać:

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

v:register rozwija się do ostatniej nazwy rejestru używanej w poleceniu trybu normalnego.


W przypadku "xptego podejścia nadpisuje @"się @x.
— Luc Hermitte

3
Twoja sugestia xnoremap p pgv"@=v:register.'y'<cr>nie zadziałała dla mnie. To jednak robi:xnoremap <expr> p 'pgv"'.v:register.'y'
— mrak

To wygląda interesująco. Czy mógłbyś dodać wiersz o tym, co grobi? Nie widziałem tego wcześniej.
— LondonRob

4
@LondonRob: gsam nic nie robi. Zapewnia rozszerzone, wieloprzyciskowe polecenia, takie jak z. Na przykład, goprzechodzi do n-tego bajtu w buforze gji gkprzechodzi do następnej i poprzedniej wyświetlanej linii (różni się od tego, jkkiedy linie są zawijane), gawyświetla informacje o znaku pod kursorem, gJłączy linie bez spacji i tutaj gvprzywraca ostatnią wizualną selekcję. Możesz użyć :help gv.
— Benoit

6
@mark :xnoremap <expr> p 'pgv"'.v:register.'y`>' , dodałem ``> '' Aby przywrócić pozycję kursora
— rox


6

Rozwiązanie Luc Hermitte działa jak urok. Używałem go około tygodnia. Potem odkryłem rozwiązanie z .vimrc Steve'a Losha, które działa dobrze, jeśli YankRing jest częścią twojego zestawu wtyczek / pakietów:

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

Spróbuj tego w swoim ~/.vimrc:

xnoremap <expr> p 'pgv"'.v:register.'y'
  • xnoremapoznacza, że ​​dotyczy to tylko Visualtrybu, a nie Visual + Selecttrybów.

  • <expr>oznacza, że {rhs}z xnoremap {lhs} {rhs}ustawieniem jest oceniany jako wyrażenia.

  • W tym przypadku nasze wyrażenie 'pgv"'.v:register.'y'jest using .do konkatenacji.

  • v:register jest oceniana do rejestru używanego podczas wykonywania mapowania.

Wynik "xpbyłby oceniany do pgv"xy, gdzie xjest rejestr.

Pomogła mi o odpowiedź na to pytanie stackoverflow: Vim - odwzorowanie z opcjonalnym przedrostkiem rejestru w związku z Benoit odpowiedź „s na tej stronie


4

Funkcja Luca działała dobrze dla mnie po wprowadzeniu zmiany, aby wspierać fakt, że mam zestaw clipboard = unnamed:

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

1
Dla porównania: używanie clipboard=unnamedplustego musi być @+zamiast @*.
— Sebastian Blask

2

Luc Hermitte załatwił sprawę! Naprawdę dobry. Oto jego rozwiązanie, w którym zastosowano funkcję przełączania, dzięki czemu można przełączać się między normalnym zachowaniem a umieszczaniem rejestru bez zastępowania.

polecenie, u włącza zachowanie

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>

Możesz także zmienić s: Repl, aby zwracało „p” zamiast „p @ = RestoreRegister () \ <cr>” w zależności od wartości s: putSwap.
— Luc Hermitte

1
wolę silent! vunmapzamiastvnoremap <silent> <expr> p p
— Luc Hermitte

0

programowanie taśmą klejącą, ale działa dla mnie:

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

próbować -

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

3
Te kontrolują, czy zaznaczony tekst jest dodawany do schowka systemu okienkowego (np. X11 lub Win32), a nie do wewnętrznych rejestrów kopii Vima.
— Rob Kennedy,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.