Vim - Satırlar arasına boş satır ekleme


15

Boş olmayan her satır arasına nasıl boş satır ekleyebilirim?

Örneğin. itibaren

line 1
line 2
line 3

line 4
line 5

için

line 1

line 2

line 3

line 4

line 5

Yanıtlar:


28

Vim's: g komutu tam olarak bu tür görevler için tasarlanmıştır; belirli bir desene uyan her satırda tek bir işlem yürütmek. İşte cevabım:

:g/.\n\n\@!/norm o

Kullandığım desen /.\n\n\@!/. Bunu parça parçalarına ayırmak:

  • .Satırdaki herhangi bir karakterle eşleşir. (varolan boş satırları dikkate almamak için hemen kullanılır)
  • \n Yukarıdaki karakterin sonunda tek bir \ n ile eşleşir
  • \n\@! \ N başından hemen sonra başka bir \ n varsa eşleşme başarısız olur.

( Normal ifadelerde :h E59daha fazla bilgi \@!ve benzer eşleşme belirteçleri olup olmadığını kontrol edin - birkaç tane daha var!)

Yani: g komutunun normal ifadesi artık tek bir satırsonu tarafından sonlandırılan ve ardından boş bir satır olmayan boş olmayan her satırı seçti.

Bir ifadedeki desenden sonra :geşleşen satırlarda çalıştırma komutu gelir. Bu durumda, normal mod komutunu (kısaltılmış norm) çalıştırmasını söyledim ve çalıştırılacak komut basitçe o, geçerli satırın altına boş bir satır ekler.

Böylece birlikte ele alındığında, komut altında boş bir satır olmayan her satırı bulur ve bir satır ekler. Ve hepsi bu kadar! Yapabileceğiniz daha süslü şeyler için vim wiki'nin Gücü Gücü makalesini kontrol etmek isteyebilirsiniz :g(ve negatif kız kardeşi :v) - yakında güvenebileceğiniz ve faydalı olarak editörlerde çok özlediğiniz şaşırtıcı kullanışlı komutlardan biridir. ki buna sahip değil.


1
Tam. Genellikle kısayollar ararım, :%norm oancak bu durumun amaçlandığı gibi çalışmadığı ortaya çıkar o. +1
sehe

Yazın :%s/$/, ardından vurun ^V, sonra vurun Enter.
jpaugh

1
@jpaugh :%s/$/<C-V><CR><CR>( Anahtar basışlarının ortak vim-folk kodlamasını kullanmak için) demek istediğinizi varsayarsak , bu yaklaşım her satırdan sonra yeni bir satır ekler. Yani, zaten boşluklarla ayrılmış satırlar (örnek metinde Satır 3 -> Satır 4'e bakın) ekstra boş satırlar alır. Orijinal soru, başlangıç ​​metninde zaten var olan ekstra boş satırlar eklemekten kaçınmaktı.
Trevor Powell

3

@ NeilForester'ın küresel arama ve değiştirme cevabını test ettiğimde, satırların her birinde yalnızca bir karakter olması durumunda ardışık boş olmayan satırlarda her saniye değiştirilen yerini kaçırdığını buldum. Bunun nedeni , önceki durumla eşleştiği son karakterden sonra her bir durumda eşleşmeye başlayan paternden kaynaklanıyor gibi görünüyor .

Lookbehind ve lookahead kullanımı bu sorunu çözer ve normal ifadeyi de biraz daha kısaltır:

:%s/\n\@<!\n\n\@!/\r\r/g

Teşekkürler! Bu işe yarar ve aramayı tekrar çalıştırırsam daha fazla satır eklemez (diyelim, dosyama yeni satırlar ekledim).

1
Arama modelindeki normal ifadelerin her birinin ne anlama geldiğini açıklayabilir misiniz? Vim yardımına bakmak, \n\@<!\nbaşka bir linebreak'den hemen sonra olmayan herhangi bir linebreak anlamına gelir mi? Ama ne \n\@!anlama geldiğini anlayamadım . Öğrenmek ve diğer arama modellerine uygulamak için anlamak istiyorum :)

Evet, \n\@<!\nbaşka bir satır kesmesini hemen takip etmeyen herhangi bir satır sonu anlamına gelir. \n\@!önceki atom (yani \n), aşağıdakilerden hemen önce eşleşmezse sıfır genişliğiyle eşleşir . :help \@<!Bununla ilgili belgeleri vim'de görmeye çalışın . I
Simon

3

Diğer yol:

%s/\(.\)\n\(.\)/\1\r\r\2/

Yani,

\(.\) match and capture a non-newline character,
\n    match a newline
\(.\) match and capture a non-newline character

ile değiştirin: ilk yakalama, çift satırsonu ve ikinci yakalama.

Örneğin, ve ile line1\nLine2sonuçlanır .\1 = 1\2 = L


0

Eğer Yanlışsam beni düzelt. Bir satır aşağı gitmek için komut modundayken k harfini kullandığınıza inanıyorum. Ardından ekleme moduna girin ve sonraki satırı ekleyin. Gerektiği kadar tekrarlansın mı? Bu yardımcı olur umarım!


kbir satır yukarı taşır. jbir satır aşağı taşır.
Neil Forrester

Evet, gerçekten de öyle. Benim hatam. Teşekkürler Neil!

0
/[^\n]\n[^\n]
:map <F2> no<esc><F2>

Sonra tuşuna basın <F2>. Bu, art arda iki boş olmayan satır arar ve ardından art arda aralarına bir satır ekler.

Düzenle:

İşte bunu tek bir global arama ve değiştirme ile yapmanın alternatif bir yolu:

:%s/\([^\n]\)\n\([^\n]\)/\1\r\r\2/g

Dosyamda çok satır var. Tüm dosya için normal ifade arama yapmanın ve boş satır eklemenin bir yolu var mı? Stackoverflow.com/questions/2673209/… 'a bakıyordum, ancak tüm normal ifade komutlarının ne anlama geldiğini kavrayamadım.

Aynı şeyi tek bir komutta ve yinelemeli eşleme olmadan gerçekleştirmenin alternatif bir yolu için yukarıdaki düzenlememe bakın. İlk yol tüm dosya için çalışması gerekir.
Neil Forrester

0

Bu komutu deneyin ( 16karakterler):

:%!sed G|cat -s

Kısa bir komut "vimgolf" denemek yerine, kullanılan oldukça belirsiz seçeneklerin küçük bir açıklaması daha yararlı olacaktır.
Ingo Karkat

0

Dosyanızın ne kadar sürdüğünü bilmiyorum ama en basit yöntemlerden biri okomut modunda yazmaktır. Ve bir sonraki satırda .. Bu basit bir makroya yüklenebilir.

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.