VIM Kelime yapıştırma tamponunun içeriğiyle değiştirilsin mi?


110

Bir dosyada bir sürü kelime değişikliği yapmam gerekiyor ve bunu bir EX komutuyla değil, bir vi komutuyla yapmak istiyorum. :%s///g . Bunun, mevcut imleç konumundaki kelimeyi değiştirmenin tipik bir yolu olduğunu biliyorum: cw<text><esc>ancak bunu adsız yazıcının içeriğiyle yedek metin olarak ve yazıcının üzerine yazmadan yapmanın bir yolu var mı?


8
ÇÖZÜM: Acil ihtiyacım 12yliçin 12 karakter çeker ve "_cw^r0bir kelimeyi değiştirirdim. Daha sonra ., değiştirmeyi dosya boyunca tekrarlamak için komutu kullanabildim .
32'de plong

Yanıtlar:


127

"Yapıştır" derken adsız (yank / koy / değiştir / sil / ikame) kütüğü kastediyorsun, değil mi? (Değişim komutunun üzerine yazılan bu olduğundan.)

Yazmaçlar genellikle "daha sonra kütüğün ismini (tek karakter) yazarak, daha "aysonra "apkütüğün içine çekmek gibi, sonra kütüğün aiçeriğini koyarak belirtilir a. Aynı şey değiştirme komutu için de geçerli. Eğer değişim komutuyla kaldırmak metin yere gitmek istemiyorsanız bu durumda, sen kara delik kayıt kullanabilirsiniz "_: "_cw. Ardından, ekleme moduna girdikten sonra, ctrl-R tuşlarına ve ardından "bu yazıcının içeriğine koymak istediğiniz (muhtemelen ) kütüğe basabilirsiniz .

  • "* - seçim kaydı (orta düğme yapıştırma)
  • "+ - pano kaydı (muhtemelen terminal üzerinden ctrl-shift-v ile de erişilebilir)
  • "" - vim'in varsayılan (adsız) yank / put / change / delete / yedek kaydı.

Kısa cevap: "_cw^R"

Düzenleme: Diğerlerinin de önerdiği gibi, elbette metninizi varsayılan sicile aktaran yank (veya her neyse) için farklı bir kayıt kullanabilirsiniz. Yine de her zaman önce bunu düşünmezsiniz, bu yüzden tek bir değişiklik komutunu onu patlatmadan yapmak güzel. Tamamen uçup gitmemiş olsa da. Numaralandırılmış kayıtları vardır "0yoluyla "9:

Vim bu kayıtları yank ve delete komutlarından gelen metinlerle doldurur.

Numaralı kayıt 0, komut ["x] ile başka bir kayıt belirtmedikçe, en son yank komutundan gelen metni içerir.

Numaralı kayıt 1, komut başka bir kayıt belirtmedikçe veya metin bir satırdan az olmadıkça (daha sonra küçük silme kaydı kullanılır) en son sil veya değiştir komutuyla silinen metni içerir. Bunun bir istisnası bu hareket komutlarıyla silme operatör için yapılır: %, (, ), `, /, ?, n, N, {ve }. Bu durumda "1 kaydı her zaman kullanılır (bu Vi uyumludur)." - kaydı, silme bir satır içindeyse de kullanılır.

Her bir ardışık silme veya değişiklikle Vim, kayıt 1'in önceki içeriğini kayıt 2'ye, 2'yi 3'e vb. Kaydırarak kayıt 9'un önceki içeriğini kaybeder.


1
Pekala, sicillerdeki yeterince dokümanı cevabıma kopyaladığımı mı düşünüyorsun? Hepsi orada altında :help registers.
Cascabel

48

Bu yazıdaki bilgileri kullanarak, bu yararlı haritayı oluşturdum. "Cp" yi seçtim çünkü "yapıştırmayı değiştir" anlamına geliyor

nmap <silent> cp "_cw<C-R>"<Esc>

DÜZENLE:

Ayrıca bunu bir adım daha ileri götürdüm ve her hareketi destekledim.

Yukarıdaki komutun eşdeğerini elde etmek cpwiçin "yapıştır kelimesini değiştir" olacaktır.

"This allows for change paste motion cp{motion}
nmap <silent> cp :set opfunc=ChangePaste<CR>g@
function! ChangePaste(type, ...)
    silent exe "normal! `[v`]\"_c"
    silent exe "normal! p"
endfunction

<silent> benim için çalışmamasına neden oluyor ... bunun neden olacağı hakkında bir fikriniz var mı? Haritalama ve işlevler konusunda bir n00b'im.
Hollister

Bununla ilgili tek sorun, yapıştırmak için bir kayıt seçememenizdir ... ancak bu durumda, cw ve CTRL + R
Steve Vermeulen

2
Kayıt adı eklemenin daha iyi bir yolu olabilir, ancak aşağıdakiler benim için çalışıyor: nmap <silent> cp :let g:currentRegister=v:register<cr>:set opfunc=ChangePaste<CR>g@ function! ChangePaste(type, ...) silent exe "normal! `[v`]\"_c".getreg(g:currentRegister) endfunction
Steve Vermeulen

@eventualEntropy bu satırları değiştirmek için iyi çalışıyor, bunu satırlar yerine kelimeler için nasıl çalıştırabilirim, hala vim öğreniyorum. Yardım için teşekkürler.
Xavitoj Cheema

@XavitojCheema Bu yorumu yaptığımı bile hatırlamıyorum, haha. Ama ortaya çıktığı gibi, o zamandan beri bu işlevi sağlamak için bir eklenti yazdım ( github.com/svermeulen/vim-easyclip )
Steve Vermeulen

27

Bunun için vim'in görsel modunu kullanabilirsiniz. örneğin bir kelimeyi kopyalayın: yeve ardından kopyalanan kelimeyle başka bir kelimenin üzerine yazın:vep


9
Bu çalışır, ancak görsel yapıştırmanın yeni silinen metin için yan tamponun üzerine yazdığına da dikkat edilmelidir.
ostler.c

24

İmleciniz, isimsiz kütüğün içeriği ile değiştirmek istediğiniz kelimenin üzerindeyse, kullanabilirsiniz viwp. vgörsel moda geçer, iwiç kelimeyi seçer vep yazıcının içeriğini koyar.

Pratikte, bir kelimeyi (fonksiyon adı vb.) Başka bir kelimeyle değiştirmem gerektiğinde, yerine geçecek kelimeye geçeceğim yiw, içteki kelimeyi adsız kayda çekeceğim ve sonra I kelimesine geçeceğim. Değiştirmek ve viwpdeğiştirmek için. Bir kelimeyi diğeriyle değiştirmenin oldukça hızlı yolu. /Değiştireceğiniz kelimeyi bulmak için ( ) aradıysanız, değiştirmeniz gereken bir sonraki kelimeye ulaşmak için sadece tuşuna basabilirsiniz n. Açıkçası, kullanmanın yerini hiçbir şey tutmaz :%s/find/replace/g, ancak birkaç hızlı değişiklik için, özellikle yeni kelimeyi bir kayıt defterinde zaten varsa, kullanışlı olabilir.


4
Bunun kabul edilen bir çözüm olmadığına şaşırdım: Yukarıdakilerin tümü, bazı uç durumlarda daha esnek olsalar da, basitçe 'mevcut isimsiz kaydı bir yerdeki bir seçimle değiştirmek' için çok daha ayrıntılı, orijinal durum budur Asker buraya için geldi.
ELLIOTTCABLE

1
Bu çok kullanışlı ve sezgiseldir.
lacostenycoder

6

Adlandırılmış bir kayıt kullanırsanız (yani yapıştırma kaydınızı doldurmak için "ayveya "advb. Kullanın), aşağıdaki gibi bir şey yapabilirsiniz:

cw<CTRL-R>a<esc>

Sözcüğü kayıt içeriğiyle değiştirecek a. Anlayabildiğim kadarıyla, varsayılan kaydı kullanamazsınız, çünkü siz cwo komutla kesilen sözcükle doldurulacaksınız.


Varsayılan kaydı kullanabilirsiniz! Cevabıma bak.
Cascabel

2

Sistem yapıştırma tamponu mu yoksa vi yazmacı mı?

Sistem yapıştırma tamponunu kullanmak istiyorsanız, o zaman iyisiniz ve yapabilirsin dw"+P- "bir kayıt seçer ve "+sistem yapıştırma tamponudur.

Aksi takdirde, varsayılan olmayan sicile "aykopyalayın, sicile kopyalayın ave ardından bir şeyi değiştirin.dw"aP


Teşekkürler Hamish. Bunu denedim, ancak dw"kelime" olarak düşündüğümden sonraki boşluğu siler, oysa cwyalnızca kelimeyi değiştirir. Bu nedenle dwbenim için çalışmayacak.
plong

Bu durumda desizin için çalışmalıdır - bu kelimenin sonuna kadar dwsilinirken bir sonraki kelimenin başına kadar silinir.
Hamish Downer

1

ywKelimeyi kopyalamak için kullanabilirsiniz , ardından vipwkelimeyi kopyalayıp önceden çekilmiş kelimeyi yapıştırmak için kelimeyi değiştirilmiş kelimeyle değiştirebilirsiniz .


0

Bunun için kayıtları kullanabilirsiniz:

kayıtta ilk yer değiştirme metni <mark some text>"ay

nerede akayıt adı

o zaman bu kaydı yedek olarak kullanabilirsiniz

ve"ap


Ne yazık ki, .yapmak istediğim başka bir şey olan son yapıştırma işlemini aracılığıyla tekrarlayamadım . Yine de teşekkürler. Çok minnettarım.
25'te plong

0

Veya Shift+ v- yapabilirsiniz p(tüm satırı seçin ve yerine yapıştırın)


1
veya pdw ... vim'i sevmiyor musun? : P
elimirks
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.