Kemungkinan penjelasan masalah
Saya pikir alasan mengapa :g/;/j
tidak bekerja adalah karena :g
perintah beroperasi dengan algoritma 2-pass:
- selama pass pertama itu menandai garis yang mengandung pola
;
- selama pass kedua beroperasi pada baris yang ditandai
Selama lintasan kedua, :g
gabungkan garis 1;
dengan garis 2;
karena 1;
ditandai selama lintasan pertama. Namun saya curiga (tidak yakin) bahwa itu tidak bergabung 1; 2;
dengan 3;
karena garis 2;
tidak ada lagi, isinya telah digabung dengan garis 1;
yang telah diproses.
Jadi :g
cari baris berikutnya yang ditandai saat pass pertama ( 3;
) dan gabung dengan yang berikutnya ( 4;
). Setelah itu masalah berulang, itu tidak bisa bergabung 3; 4;
dengan 5;
karena garis 4;
tidak ada lagi.
Solusi 1 (dengan vimscript)
Mungkin Anda bisa memanggil fungsi kapan pun baris yang ;
ditemukan ditemukan untuk memeriksa apakah baris sebelumnya juga mengandung tanda titik koma:
function! JoinLines()
if getline(line('.')-1) =~ ';'
.-1join
endif
endfunction
Kemudian gunakan perintah global berikut:
:g/;/call JoinLines()
Atau tanpa fungsi:
:g/;/if getline(line('.')-1) =~ ';' | -j | endif
Solusi 2 (tanpa skrip)
:g/;/.,/^[^;]*$/-1j
Setiap kali perintah global :g
menemukan pola ;
itu menjalankan perintah: .,/^[^;]*$/-1j
Itu bisa dipecah seperti ini:
:g/pattern/a,bj
Dimana:
pattern = ;
a = . = number of current line
b = /^[^;]*$/-1 = number of next line without any semicolon minus one
b
dapat dirinci lebih lanjut seperti ini:
/ = 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
adalah bentuk disingkat dari perintah Ex :join
yang seperti kebanyakan perintah Ex lainnya dapat didahului oleh suatu range.
Di sini diawali oleh rentang: .,/^[^;]*$/-1
( a,b
)
Suatu rentang mengikuti bentuk di a,b
mana a
dan b
biasanya 2 nomor garis, dan memungkinkan Anda untuk beroperasi pada sekelompok garis yang jumlahnya antara a
dan b
, bukan hanya satu.
Jadi j
perintah bergabung dengan semua baris antara yang sekarang ( a
) dan yang berikutnya yang tidak mengandung titik koma minus satu ( b
).
Untuk informasi lebih lanjut, lihat:
:help :global
:help :join
:help :range
:g/;/j
tidak berfungsi karena dilakukan dalam dua lintasan: pertama buffer dipindai, kemudian perintah diterapkan ke baris yang cocok.