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

Starr Horne
źródło

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.

Luc Hermitte
źródło
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
Jeff Lake
źródło
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.

Benoit
źródło
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
19

W Twoim .vimrc

xnoremap p "_dP

Znalazłem to z odpowiedzi w podobnym wątku, ale oryginalne źródło to http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text . Wspomina o pewnych wadach, ale dla mnie działa dobrze.

Jason Denney
źródło
2
Wydaje się, że to najprostsze rozwiązanie.
rudolph9
1
Pracował dla mnie. Ta odpowiedź jest jasna. .vimrc.localteż jest OK.
BaiJiFeiLong
3
Nie działa, jeśli wybór rozciąga się do końca wiersza.
John Freeman,
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  
Taine
źródło
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

mrak
źródło
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
danprice
źródło
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>
Joernsn
źródło
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<
steven_noble
źródło
-4

próbować -

:set guioptions-=a
:set guioptions-=A
Gowri
źródło
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,