Vim ile nasıl yapıştırabilirim (üzerine yazma)?


31

Gelen vimkullandığım yyve pher zaman yank ve satırları yapıştırın. Ben dosyasında bir satır birden yerleri değiştirmek istiyorsanız, ancak, ben kullanamıyorum yy p dd pçünkü dd panoya çizgiyi siler / kaydeder. Muhtemelen kayıtları nasıl daha iyi kullanacağımı bilmem gerekirken, muhtemelen pşu anki satırın yerini alacak bir yol olduğunu hissediyorum .

Yanıtlar:


27

Varsayılan olarak, yapıştırma komutları "(“adsız”) kayıt defterini kullanır . Etkili olarak, bir sicile yazılan herhangi bir komut, adsız sicile de yazar; bu nedenle, yanklar, siler ve değiştirir; Bu nedenle yank-delete-paste dizininiz silinen metni, yerine metin yerine yapıştırır.

0Kayıt burada yardımcı olabilir. Bir yazmaç belirtmeyen tüm yank komutları, yankılan metinleri yazara 0ekler (ayrıca "). Silme veya değiştirme işlemlerinden etkilenmez; bu nedenle, orta düzeydeki silmeler veya değişiklikler yapsanız bile, yanmış çizgiyi birden çok kez yapıştırmak için kullanabilirsiniz.

  1. yy: Kayıtlar 0ve "her ikisi de şimdi yanmış çizgiye sahip.
  2. Değiştirmek için bir satıra gidin.
  3. dd: "Şimdi kayıt silindi satırı var, ancak kayıt 0hala yanmış satırı var.
    "0P: Aslen yanmış satırı kayıt defterinden yapıştırın 0.
  4. Değiştirmek için bir sonraki satıra geçin.
  5. dd"0P (yukarıdaki gibi)

(İmlecin konumlandırılmasının arabelleğin son satırını değiştirirken çalışma şekli nedeniyle "0pyerine kullanmak istersiniz "0P.)

Bu, Bruce Ediger'in cevabına çok yakın , ancak başlangıçta yanarken bir kayıt belirtmeniz gerekmiyor. Birini kullanarak ya da gerekiyorsa (örneğin) ile bazı satırları değiştirmek gerçi daha adlandırılmış kayıtları çok kullanışlı olabilir AAA, ancak diğer hatlar BBB(koymak AAAsicilinde ave BBBkayıt b(veya sicilinde bunlardan birini bırakın 0), sonra onları uygun şekilde yapıştırın ).

Ayrıca yapıştrabilirsiniz 0hat-bilge görsel modda ( Vbir tuş kaydetmek için): V"0p.

Yazmak istemezseniz "0, daha uygun bir haritalama bulabilirsiniz:

noremap <Leader>p "0p
noremap <Leader>P "0P
vnoremap <Leader>p "0p

Alternatif bir yaklaşım _(“karadelik”) siciline silmektir . Bunu sildiğinizde, "kayıt defteri etkilenmez, bu nedenle yank-delete-paste diziniz hala adlandırılmış metni adsız kayıt defterine yapıştırabilir.

  1. yy: Kayıt ol 0ve "her ikisinde de yanık çizgi var.
  2. "_dd: Kayıtlarda değişiklik yok.
    P: Orijinali yanmış metni, kayıt defterinden yapıştırın ".

Yine, bir haritalamayı daha uygun bulabilirsiniz:

noremap <Leader>d "_d

2
Veya, tl; dr, sadece kullanın yy(değiştirilecek çizgiye gidin) S<C-r>0<Esc>. Komutla tekrarlanabilir olma avantajına sahiptir ..
Joker

11

Kevin'in oldukça iyi bir cevabı var gibi görünüyor, ancak sildiğiniz her satıra göz atmak istiyorsanız, o zaman değiştirin, biraz farklı bir çözüm var.

1. Find line to copy in some select number of places.
2. Put cursor on it.
3. "ayy copies that line into register 'a'.
4. Find line to replace. Put cursor on it.
5. dd deletes that line. "aP inserts the copied line above where the cursor now lies.
6. Repeat steps 4 and 5.

Bu tür bir tarif, silinecek ve değiştirilecek satırları bulmak için desen eşleştirmesini kullanmanıza izin verir ve dosyanın başlangıcına (1G) geri dönebilir ve istediğiniz sıklıkta ileriye doğru arama yapabilirsiniz. Tekrar tekrar toplamak ve yerleştirmek için 2 veya daha fazla satırım varsa "ayy, ilk satır "byyiçin, ikinci "cyyiçin, üçüncü için vb. Kullanırım. Üzerimdeki zihinsel yükü azaltmak için (tarifin genelliğini azaltan) bir alışkanlık yaptım.


Çok hoş. Yani kullanırsanız "ayyve sonra dd, ddiçinde ne olduğunu yerini almayacak a, ancak yazarsanız psadece kullanılarak silindi yapıştırmak olacaktır dd. Ve sildiklerimin içinde olanı değiştirmek isteseydim "ayy, o zaman kullanırdım "add- doğru mu?
cwd

"ayy bir satırı 'a' kaydına kopyalar." dd "bir satırı 'a' değil, varsayılan bir sicile keser. p '' s 'varsayılan sicilini yapıştırır, doğru. , içeriği "ayy komutundan değiştirir.
Bruce Ediger

5

:sNe kadar yazmak istediğinize bağlı olarak, bunu yapmanın birkaç yolu vardır . En kolay yol basit bir arama ve değiştirme:

:%s/find this line/replace with this/

%Tüm dosyayı arama ve tüm oluşumları yerini alacak.

Bu sizin için çok fazla yazıyorsa, hedef dizgiyi ( yy) çırabilir ve "(varsayılan) kayıt defterini kullanarak ekleyerek Ctrl+r ":

:%s/<ctrl+r><">/replacement/

Eğer yedek dizinin bir kopyasını varsa Ya da, ayrı kayıtları içine iki yank "ayyve "byyiçine yank için ave bkayıtları sırasıyla (eğer kayıtları için herhangi bir harf kullanabilirsiniz). Ardından kullanmak Ctrl+r ave Ctrl+r barama yapıştırın ve alanları yerine.

Bire bir Bruce'a değil, ama onları değiştirmeden önce çizgileri kontrol etmek istiyorsanız, sadece cseçeneği ekleyin :

:%s/find this line/replace with this/c

2

VGörsel Mod'da değiştirmek istediğiniz çizgiyi vurgulamak için kullanabilirsiniz ve ardından ppbu çizginin üzerine yapıştırmak için simgesine basabilirsiniz .

Bu sadece bir tuşa basılmasını sağlar, bu yüzden oldukça iyi bir çözüm gibi görünüyor.


Bu işe yaramaz: yapıştırmadan sonra, pano tarafından işaretlenen metni içerenV
daniel kullmann 12:11

Sadece bir tane p.
Aaron Thoma,

2

Kullandığım cnormal arama ile kombine bu tür şeyleri, oldukça sık, "değişimi", komut. Dosyayı ilgilendiğiniz her metin satırı için arayabilir ve ardışık n.komutları kullanabilirsiniz (bir nsonraki ve daha sonra .son değişikliği tekrarlamak için).

/^hello- merhaba ile başlayan çizgiyi bulmak;
c$goodbye- çizgiyi elveda olarak değiştir;
n.- tekrar bul, değişikliği tekrar et

Satırı zaten dosyada bulunan bir satırla değiştirmek istiyorsanız, giriş arabelleğinize (GUI'nizin izin verdiğini varsayarak) kopyalayıp, ilk change komutunun içeriğini almak için yapıştırabilirsiniz.

Her şeyde olduğu gibi, ne tür bir düzenleme yapmak istediğinize bağlı olarak cebinizde birçok seçenek olması iyi bir fikirdir.

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.