Gerçekten de ustaca. Yıkalım. ex
komuta
g/^$/xyzzy
tüm boş satırları arayacak ve her birine xyzzy
komut (isteğe bağlı bir ex
komut) uygulayacaktır . Not xyzzy
bir 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 ,/./-j
iç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, ,/./-j
5 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, vim
dokü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 .