Kaydın üzerine yazmadan nasıl yapıştırılır


112

Seçimi varsayılan kayıt defterine yerleştirmeden görsel olarak seçilen bir alanı yapıştırmanın bir yolunu bilen var mı?

Her zaman açık bir kayıttan yapıştırarak sorunu çözebileceğimi biliyorum. Ama yazmak "xpyerine boynundaki bir acıp

Yanıtlar:


33

"{register}ptarif ettiğiniz gibi çalışmayacak. Seçimi kayıt içeriğiyle değiştirecektir. Bunun yerine şöyle bir şey yapmanız gerekecek:

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

Bu, p'ye nore olmayan bir vmap'e sahip bir eklenti kullanmadığınız ve bir yazmacın üzerine yazılmasını bekleyen bir eklenti kullanmadığınız sürece iyi olacaktır.

Bu kod, orada bir komut dosyası olarak mevcuttur . Ingo Karkat da aynı sorunu çözen bir eklenti tanımladı .


Aslında, kullanılan kasayı getirmenin düzgün bir yolu olduğunu düşündüm, ancak nasıl olduğunu hatırlayamadım. Dolayısıyla işlevin karmaşıklığı.
Luc Hermitte

1
Bunun aşırı olduğunu düşünüyorum, regtype(linewise?) 'I hatırlamayacaktır ve p'yi yeniden eşleştirmek pgvyyeterlidir.
Benoit

2
Aşırı olabilir, ancak hiçbir yan etkisi yoktur. Bir üzerinde "xp, bu @"içeriklerin üzerine @xfarklı yazmazpgvy
Luc Hermitte

1
o zaman ne olacak :xnoremap p pgv@=v:register.'y'<cr>?
Benoit

1
Benim için çalışmıyor. Ayrıca komut dosyasını indirmeyi denedim. İşte yaptığım komutların listesi: Önce v'ye, sonra e'ye basarak sözcüğün sonunu seçiyorum, sonra yank'a basıyorum. Ondan sonra değiştirmek istediğim başka bir kelimeye geçiyorum. Bunu değiştirmek için v, e sonra p'ye basarım. Sonra tekrar yapıyorum ama bu sefer bir sonraki kelime daha önce değiştirdiğim kelimeyle değiştiriliyor.
Eddy

41

Birlikte silinen tüm metin kopyalama varsayılan vim davranışı sevmiyorum d, D, c, veya Ciçine varsayılan kayıt.

Ben eşleyerek etrafında ele verdik diçin "_d, ciçin "_c, vb.

.Vimrc dosyamdan:

"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

Bu eşlemeler ne kadar yararlı olsa da (ben de benzer bir şey yapıyorum), OP'nin sorusuna cevap vermiyorlar, p yine de seçilen içeriğin üzerine yapıştırdığınız şeyin üzerine yazacak.
Magnus

32

Aşağıdakileri kullanın:

xnoremap p pgvy

bu görsel modda yapıştırılan herhangi bir metni yeniden seçecek ve yeniden çekecektir.

Düzenleme: bunun birlikte çalışması için "xpşunları yapabilirsiniz:

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

v:register normal mod komutunda kullanılan son kayıt adına genişler.


Bir günü "xp, bu yaklaşım üzerine yazar @"ile @x.
Luc Hermitte

3
Önerin xnoremap p pgv"@=v:register.'y'<cr>benim için işe yaramadı. Ancak bu şunları yapar:xnoremap <expr> p 'pgv"'.v:register.'y'
mrak

Bu ilginç görünüyor. Ne gyaptığı hakkında bir satır ekleyebilir misiniz ? Daha önce görmedim.
LondonRob

4
@LondonRob: gtek başına hiçbir şey yapmaz. Gibi genişletilmiş, çok tuşlu komutlar sağlar z. Örneğin, gotampon içerisinde n'inci byte gider gjve gkbir sonraki ve önceki görüntülenen hattına (farklılık gitmek jk, çizgiler sarılmış zaman) ga, imlecin altındaki karakteri üzerinde bilgileri görüntüler gJboşluk bırakmadan çizgiler katılır ve burada gvgeçen görsel seçimi geri yükler. Kullanabilirsiniz:help gv .
Benoit

6
@mark :xnoremap <expr> p 'pgv"'.v:register.'y`>' , ``> `` İmleç konumunu geri yüklemek için
rox


6

Luc Hermitte'nin çözümü bir cazibe gibi çalışıyor. Yaklaşık bir hafta kadar kullanıyordum. Sonra Steve Losh'un .vimrc dosyasından, YankRing eklenti / paket programınızın bir parçasıysa iyi çalışan bir çözüm keşfettim :

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

Bunu şu cihazınızda deneyin ~/.vimrc:

xnoremap <expr> p 'pgv"'.v:register.'y'
  • xnoremapVisualbunun Visual + Selectmodlar için değil , yalnızca mod için olduğu anlamına gelir .

  • <expr>bu araçlar {rhs}arasında xnoremap {lhs} {rhs}ayarı bir ifade olarak değerlendirilir.

  • Bu durumda bizim ifademiz birleştirme için 'pgv"'.v:register.'y'kullanılıyor ..

  • v:register eşlemenin gerçekleştirilmesi sırasında kullanılan sicile değerlendirilir.

Sonucu "xpşu şekilde değerlendirilirpgv"xy , nerede xkayıt olduğunu.

Bu stackoverflow sorusunun cevabından yardım aldım: Vim - Benoit'in bu sayfadaki cevabı ile birlikte isteğe bağlı bir kayıt öneki ile eşleme


4

Clipboard = isimsiz setim olduğu gerçeğini desteklemek için bir değişiklik yaptıktan sonra Luc'un işlevi benim için iyi çalıştı:

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

1
Referans için: bunun yerine kullanılması clipboard=unnamedplusgerekir . @+@*
Sebastian Blask

2

Luc Hermitte hile yaptı! Gerçekten iyi. İşte onun çözümü bir geçiş fonksiyonuna yerleştirilmiş, böylece normal davranış ve kayıt değiştirmeyen koyma arasında geçiş yapabilirsiniz.

komut, u davranışı değiştirir

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>

Ayrıca s: putSwap değerine bağlı olarak "p @ = RestoreRegister () \ <cr>" yerine "p" döndürmek için s: Repl'i değiştirebilirsiniz.
Luc Hermitte

1
silent! vunmapyerine tercih etvnoremap <silent> <expr> p p
Luc Hermitte

0

koli bandı programlama, ancak benim için çalışıyor:

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

Deneyin -

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

3
Bunlar, seçilen metnin Vim'in dahili kopya kayıtlarına değil, pencereleme sisteminin panosuna (örneğin, X11 veya Win32) eklenip eklenmeyeceğini kontrol eder.
Rob Kennedy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.