Sorunun olası açıklaması
Bence neden :g/;/j
çalışmıyor çünkü :g
komut 2-pass algoritması ile çalışıyor:
- ilk geçişte deseni içeren çizgileri işaretler
;
- ikinci geçişte işaretli çizgiler üzerinde çalışır
İkinci geçiş sırasında :g
çizgiye çizgi 1;
ile katılır, 2;
çünkü 1;
ilk geçişte işaretlenmiştir. Ancak (değil emin) o katılmazsa şüpheli 1; 2;
ile 3;
hat çünkü 2;
artık var olmayan, içeriği hattı ile birleşti olmuştur 1;
işleme alındı.
Bu nedenle :g
, ilk geçiş ( 3;
) sırasında işaretlenen ve bir sonraki ( ) ile birleştirilen bir sonraki satırı arar 4;
. Sorun tekrarlar, bu katılamaz Bundan sonra 3; 4;
birlikte 5;
hat çünkü 4;
artık yok.
Çözüm 1 (vimscript ile)
Belki ;
de önceki satırın noktalı virgül içerip içermediğini kontrol etmek için bir satır bulunduğunda bir işlevi çağırabilirsiniz :
function! JoinLines()
if getline(line('.')-1) =~ ';'
.-1join
endif
endfunction
Ardından aşağıdaki global komutu kullanın:
:g/;/call JoinLines()
Veya bir işlev olmadan:
:g/;/if getline(line('.')-1) =~ ';' | -j | endif
Çözüm 2 (vimscript olmadan)
:g/;/.,/^[^;]*$/-1j
Global komut :g
kalıbı bulduğunda komutu ;
yürütür: .,/^[^;]*$/-1j
Bu şekilde parçalanabilir:
:g/pattern/a,bj
Nerede :
pattern = ;
a = . = number of current line
b = /^[^;]*$/-1 = number of next line without any semicolon minus one
b
bunun gibi daha fazla parçalanabilir:
/ = look for the number of the next line matching the following pattern
^ = a beginning of line
[^;] = then any character except a semicolon
* = the last character can be repeated 0 or more times
$ = an end of line
/ = end of pattern
-1 = removes one to the number you just got
j
Ex komutunun :join
çoğunda olduğu gibi Ex komutlarının çoğunun önünde bir aralık bulunabilecek kısaltılmış biçimidir .
Burada, aralığın önünde
şunlar bulunur : .,/^[^;]*$/-1
( a,b
)
Bir aralık , genellikle 2 satır numarasının a,b
bulunduğu formdan sonra gelir a
ve b
numarası yalnızca bir yerine a
ve arasında olan bir satır grubunda çalışmanıza olanak tanır b
.
Böylece j
komut, geçerli olan ( a
) ile sonraki noktalı virgül eksi bir ( b
) içermeyen tüm satırları birleştirir .
Daha fazla bilgi için, bkz:
:help :global
:help :join
:help :range
:g/;/j
iki geçişte yapıldığından çalışmaz: önce arabellek taranır, daha sonra komut eşleşen satırlara uygulanır.