Nasıl: g /^$/,/./- j (birden fazla boş çizgiyi tek bir boşa indirgemek) vim içinde nasıl çalışır?


21

Vim Düzenli İfadeler adlı makalede Oleg Raisky, birden fazla boş satırı tek bir boşluğa azaltmak için aşağıdaki komutu verir:

:g/^$/,/./-j

Birisi lütfen bunun nasıl çalıştığını açıklayabilir mi?

:gKomuta ve düzenli ifadeler biliyorum . Ama parçanın ne yaptığını anlamadım /,/./-j.

Yanıtlar:


24

Gerçekten de ustaca. Yıkalım. exkomuta

g/^$/xyzzy

tüm boş satırları arayacak ve her birine xyzzykomut (isteğe bağlı bir exkomut) uygulayacaktır . Not xyzzybir değil gerçek ex komut, bir sonraki paragrafta gereğince, yer tutucu olarak sadece var.

Buradaki zor bit, durumunuzdaki xyzzy"komut" un bir başka arama komutu olmasıdır:

,/./-j

,/./-Aralığını belirtir. Bu formda <start>,<end>ve virgülten önce hiçbir şey olmadığından, geçerli satırın (boş satırı bulduğunuz satır) başlangıç ​​olduğunu varsayar.

Virgülün ardından, bir /./-sonraki karakteri ara ( .herhangi bir karakter anlamına gelir) sonra bir satır yedekle ( eğer değer belirtilmezse, ima /./-edildiğinden kısa /./-1). Bu modeli ., üzerinde işlem yaptığınızdan sonraki ilk boş olmayan satırda bulacaksınız.

Başka bir deyişle, aralığın sonu, o anda çalışmakta olduğunuz satırdaki veya sondaki son boş satırdır.

Ardından, bu aralıkta bir birleşme gerçekleştirirsiniz.

Aralığın başlangıcı ve sonu eşitse (bölümdeki yalnızca bir boş satır vardı), birleştirme hiçbir şey yapmaz. Eşit değillerse, katılmak hepsine katılacak.

Birden fazla boş çizgiyi bire birleştirme şekli budur.

Bir örneğe bakalım (satır numaraları sadece açıklama içindir, gerçek dosyada değildir):

1 Line 1
2
3 Line 3
4 Line 4
5
6
7
8
9 Line 9

g/^$/Komut tüm boş kablolarını ve (bu hatlar 2, 5, 6, 7 ve 8) 'ü ile işlemini gerçekleştirir.

Satır 2 ,/./-jiçin 2 ile 2 arasında bir aralık belirlenir (bir sonraki .satır 3'te bulunur, sonra 1'i 2'ye çıkarır). 2,2 aralığındaki bir birleşme hiçbir şey yapmaz.

Satır 5 için, ,/./-j5 ile 8 arasında bir aralık belirleyecektir ( .daha sonra satır 9'da bulunur, sonra 1'i çıkarır). 5,8 aralığındaki bir birleşme tüm bu çizgileri bir araya getirecektir.

İşlem, daha önceki bir işlemin bir parçası olarak kaybolan çizgiler üzerinde gerçekleştirilmez. Bunun nedeni, döngünün önceki bölümlerinde silinmiş satırları işlemenin bir anlamı olmazdı.

Başka bir deyişle, 6'dan 8'e kadar olan satırlar silindiği için (5. satırla birlikte), genel komut onlardan sonra çalışmaz.

Bu, vimdokümantasyonun iki satırlı bir algoritma, aslında satırları işaretleyen, biri işlemi gerçekleştiren bir algoritma ifade ettiği gerçeğine dayanmaktadır .


2
Dosyanızın sonunda herhangi bir boş satır varsa, bu komutun şikayet edeceğini unutmayın.
Joker
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.