Vim: Daha önce çekilen bir hattı başka bir hatla değiştirmek


112

Günde en az bir kez şu durumla karşılaşıyorum:

A: This line should also replace line X
...
X: This is line should be replaced

Bu görevi verimli bir şekilde yapmadığıma inanıyorum.

Ne yaptığım:

  • A: AG satırına git
  • Yank satırı A: yy
  • X satırına git: XG
  • A satırını yapıştırın: P
  • Eski satıra git: j
  • Eski satırı sil: dd

Bu çizgi X ben A. yanking ile değiştirilir ve ilave bir kasadan yapıştırarak edilmelidir başka bir satır bulursanız can sıkıcı varsayılan kayıt, şimdi ek dezavantajı vardır ( "ayy , " a P ) bile bu basit görevi yapar daha az verimli.

Sorularım:

  • Daha önce çekilen bir hattı değiştirmek için yerleşik bir Vim komutunu kaçırdım mı?
  • Değilse, yanmış satırı varsayılan yazmaçta bırakan (veya geri yükleyen) kendi komutumu nasıl bağlayabilirim?

2
Bu, Vim'in düzenleme modeliyle ilgili en büyük sorunum. Bir çözüm bilmek isterim. Bir CUA editörü, kes ve sil arasında ayrım yapar, böylece sadece biraz metin kesersiniz, ardından gidip istediğiniz her şeyi silebilir ve yapıştırabilirsiniz. Vim ile yaptığınız herhangi bir silme, kesilmiş metninizi çöpe atar. Başka bir düzenleyiciye göre çok daha fazla tuş vuruşu kullanırsınız.
Mud


Hakkında bilgi @Mud :moveve kara delik (register _) (veya aslında, sadece kayıtları)
sehe

2
@sehe, yazmaçların tamamen farkındayım, ancak bu, kesme / yapıştırma işlemi başına 4 tuş vuruşu ekler ve daha fazla öngörü gerektirir. Çok fazla düzenleme yaptığınızda, bu hızlı bir şekilde toplanır.
Mud

Birkaç baytlık bellek tasarrufu dışında, kara delik kaydını başka herhangi bir yazmacı yerine kullanmanın bir avantajı var mı? Okumazsanız, herhangi bir yazmacın bir kara delik kaydı olabileceğini iddia ediyorum.
sleblanc

Yanıtlar:


91

Ne yapardım:

  1. aG
  2. Y
  3. xG
  4. Vp

Normal modundan çıkmak gerekmez, ancak does hattını yank. Ancak V"0p, 2. adımda her zaman çizgiyi çekecek olanı kullanabilirsiniz .


11
@duddle: evet, Yeşanlamlıdıryy
icecrime

8
Adım 1 ve 2 aşağıdakiler kullanılarak birleştirilebilir: ay [Ör: 20y] Vp'nin ardından hile yapmalı. Çekmek için bir hatta gitmenize gerek yok.
Barad

2
V "0p yerine ccCTRL + r0ESC ile ek satırların üzerine yazarsanız, sonraki tüm satırlar sadece. (Tekrarlayıcı) ile değiştirilebilir
Jordan Morris

Yeşanlamlıdır yy, ancak y$eşleşmesi için yeniden eşleştirmenizi öneririm Dve C.
mgold

Aşağıdaki Jordan Morris stackoverflow.com/users/970673/jordan-morris tarafından verilen cevaba göz atın - komutu birden çok kez tekrarlamanıza izin vererek gerçekten vim komutlarını sonuna kadar kullanır.
JESii

105

Vp: çizgi seçin, çekilen şeyi yapıştırın


3
VPaynı şekilde çalışır, bu da kullanışlıdır çünkü tüm sekans boyunca Shift'i basılı tutabilirsiniz.
George Hilliard

24
çok güzel bir numara, ancak (belki) önemli bir uyarıyı belirtmeye değer: bu, yank yazmacının üzerine yazılan satırın içeriğiyle güncellenmesine neden olur, bu nedenle bazı görevlerde iyi oynamayabilir - örneğin üzerine yazmak istiyorsanız aynı hat birden çok hedefe.
underscore_d

8
@underscore_d, eğer yaparsanız güzelce çalıyor V"0p, ki bu son yanked kayıttan yapıştırıyor.
timblaktu

@timblaktu Ne yaptığını açıklar V"0pmısınız? V, Görsel çizgi moduna girer ve p yapıştırmak içindir. "Ve 0 nedir? Teşekkürler
theprogrammer

43

Bu, X satırının şu anda varsayılan kayıtta olması gibi ek bir dezavantaja sahiptir; bu, A ile değiştirilmesi gereken başka bir satır bulursam can sıkıcıdır.

Normal kayıtları etkilemeden metni silmek için Kara delik kaydını kullanabilirsiniz "_:

"_dd

10
Kara deliği yapmak dve ddher zaman kullanmak xve xxçoğu editörün "kesme" dediği şeyi gerçekleştirmek için .vimrc dosyama bazı eşlemeler ekledim (sil ve varsayılan kayda kaydet):noremap x d noremap xx dd noremap d "_d noremap dd "_dd
IMSoP

2
VIM'deki şeyleri yeniden eşleştirmekten çekiniyorum çünkü bu, diğer bilgisayarlarda veya IDE'ler için VIM tarzı eklentilerde kolay olmayabilir. Ayrıca VIM tasarımcıları, gerçekten kazarsanız, varsayılan eşlemelerle ilgili sorunları çözme eğilimindedir.
Jordan Morris

15

Kullanmayı Vpveya VPbir satır üzerine yapıştırmayı öneren cevaplar üzerine inşa etmek - yank yazmacının içeriğini değiştirmekten kaçınmak için en ergonomik komutu basitçe buluyorum:

VPY


Bu, yank içeriğini aynı bırakan en basit çözümdür. Çok teşekkürler!
heylookltsme

14
  1. yy
  2. j (değiştirmek istediğiniz satıra gidin) ve sonra
  3. Vp (büyük harf v ve ardından p, yanked içerikle değiştirilecektir)

müthiş! Gerçekten çok kısadır ve görsel mod ile birden fazla satır seçmeyi kolaylaştırır. Ayrıca, yapıştırma tamponunu sağlam tutar.
DD'nin

@Aktau bu arabelleği olduğu gibi bırakmaz.
Jordan Morris

9

Komut satırı (Ex) modunu kullanırdım ve aşağıdaki iki komutu yapardım

:XmA
:Ad

Bu basitçe X çizgisini A'nın hemen altına taşır, sonra A'yı silmek bu satırı yukarı taşır.

Örneğin

:7m3
:3d

Bir örnek verebilir misin? Örneğin 50Gm30G'ye bastığımda Vim 50. satıra ve sonra aşağıya gidiyor ve hepsi bu. Ayrıca: Reklam, A = 50 veya A = 50G için hiçbir şey yapmaz
gevrek

7
  1. İlk satırın başına gidin.

  2. y, $- satırı satır sonu olmadan kopyala

  3. Hedef satırın başına gidin.

    1. V, p- sadece bir hedef hattını değiştirin

    2. c, c, Ctrlr, 0, Esc- Orijinal yank ile hedef hattını değiştirmek

  4. Sonraki hedef hattının başlangıcına gidin.

  5. . - 4.2'de verilen komutu tekrarlar.

Notlar:

  • 4.1 olduğu y, $bunu yaparsanız çünkü y, yya Ysen linebreak kopyalar ve Ctrlr0aslında hedef sınırının altında linebreak ekler.

  • 4.2 V p, teknik olarak son eylem silindiğinden, yinelemeyle çalışmayan değiştirir , bu nedenle .yalnızca bir satırı siler.

  • EX modundan (komut satırı) 'mevcut satırı yazmaçla değiştir'i bilen biri varsa, sizden haber almak (ve belgeleri nerede bulduğunuzu bilmek) isterim. 4.2'den daha hızlı ve / veya satır sonu uyarısına sahip olmayan tekrarlanabilir bir EX komutu olabilir.


1
Adım 4.2 burada katildir, çünkü artık tüm süreci 4.3'teki gibi nokta komutuyla tekrarlayabileceksiniz - işte vim bununla ilgili!
JESii

1
Ben anlamadım. 'AG' yapımcımı satırın sonuna koyar, ekleme moduna girer ve bir 'G' girer. Anlamadığım şey nedir?
gustafbstrom

@gustafbstrom adil eleştiri - üzgünüm A'nın satır numarasını temsil etmesi gerekiyordu, ancak bunu gösteremedim. Düzenlenen.
Jordan Morris

5

İşte yapacağım şey

  • A satırının başına git, AG (burada A açıkça bir satır numarasıdır)
  • Satırı bazı kayıtlara aktarın, örneğin a (yeni satır olmadan). tip"ay$
  • Satır eklemek için hareket edin, XG
  • Yedek satır, S
  • A kütüğünden ekle, Ctrl-Ra

4

Bunu görsel mod ile kullanabilirsiniz.

  • A satırına gidin: AG
  • Görsel modlu satırı seçin: VESC
  • X satırına git: XG
  • Satır için ikame modunu girin: S
  • Kopyaladığınız satırı yapıştırın: shift+ insert(veya panodan yapıştırmak için elinizde ne varsa).

Ah. V ve S'yi bilmiyordum . Ancak, ekleme modunda erişebildiğim tek işletim sistemi panomu tutmadığım için adımlarınız benim için çalışmıyor. Bu yüzden önce ekleme kipinden çıkmam gerekecek.
gevrek

3

Ayrıca şunları da yapabilirsiniz:

Vy (in normal mode at the line you want to copy)
Vp (in normal mode at the line you want to replace)
  • Boşluk veya satır sonu oluşturmaz.
  • İmleç, kopyalanan metnin başlangıcına yerleştirilir.

Aynı anahtarlar, birden fazla satırı çekmek / yapıştırmak için kullanılabilir.

V (in normal mode at what you want to yank)
(use jk to move the selection)
y (to yank the selection)
V (in normal mode at where you want to paste)
(use jk to move the selection)
p (to replace the selection with the yanked lines)

2

Bu komutları Normal Modda kullanabilirsiniz:

:AmX | Xd

miçin komut m[ove]kopyalamak yerine, kullanımı çizgisini taşımak istiyorsanız, satır numarası X sonra satır numarası A taşır, hangi co[py]. dKomut içindir d[elete].

Kullanarak cobir dizi satırı taşıyabilirsiniz (kullanarak kopyalayabilirsiniz )

:start,end m X

2

Cicld'nin son yorumu ışığında (teşekkür ederim!), Orijinal meseleyi tam olarak kavrayamadığımı görüyorum. Çizgiyi hareket ettirmek uygun değildir, ancak kopyalamaktır (çizgi çekildiğinden.) Bu yüzden onu şu şekilde revize ederim:

:1t20:20d_
  1. 1. satırı ( :tkomutun takma adıdır :copy) 20. satırdan sonra kopyala ( 21. satıra yerleştirecektir)

  2. 20. satırı silin, silinen satırı 'kara delik' yazmacına ( _) koyun (yani mevcut yank tamponunu etkilemez)

Son yorumda belirtildiği gibi, bu mevcut imleç konumunu etkilemeyecektir.


1
  1. : ay (burada a satır numarasıdır. Örnek: 20y). Bu bir repliktir (amaçlanan).
  2. Vp

1

Bunun için Ex komutunu kullanmayı daha kolay buluyorum; ex. 9. satırı 46'ya taşımak için:

 :46|9m.|-1d

Bu, imleci satır 46'ya hareket ettirecek, satır 9'u mevcut satırın altına taşıyacak, sonra önceki satırı silecektir (taşınan satır geçerli satır olduğundan).

Veya 'a' işaretini kullanarak işaret (ler) kullanarak:

:46ma a|9m'a|'ad

EX komutlarının güzelliği, onları imlecinizin olduğu her yerde (normal modda) çalıştırabilmenizdir. Tercih ederim :1m20|.+1d(1. satırı 20. satıra kaydır ve sonraki satırı, yani daha önce 20. satırda olan metni). Yine de aynı fikir!
2018

1

Çoğunlukla bir satır Y'yi ve her biri farklı bir değere sahip olan birden fazla yerde değiştirmem gerekir (bu, bir normal ifade yapamayacağım anlamına gelir).

Y istenen orijinal çizgiyi çekmek

ve sonra değiştirmek istediğiniz her satırda, VpzeroY


0

"Kara delik" yazmacını basitçe kullanırdım:

verilen:

nnoremap <Cd> "_dd

çözüm şöyle olacaktır:

<Cd> yy

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.