Thursday, December 02, 2010

Menggabungkan Multi Baris di gVim

Misalnya ada sebuah berkas teks, berisi untaian paragraf. Setiap paragraf memiliki karakteristik sebagai berikut: Setiap baris yang menyusun paragraf berdiri sebagai baris sendiri, tidak tergabung dengan baris-baris sebelumnya. Efek ini terjadi jika gVim menggunakan parameter

textwidth=70
wrapmargin=10

Setiap kali kursor sampai pada kolom ke-70 di layar, gVim akan membuat baris baru dengan secara implisit menyelipkan newline ('\n') ke akhir baris. Berikut ini adalah contoh sebuah paragraf yang ditulis dalam editor gVim dengan setting parameter di atas

Misalnya ada sebuah berkas teks, berisi untaian paragraf. Setiap
paragraf memiliki karakteristik sebagai berikut: Setiap baris yang
menyusun paragraf berdiri sebagai baris sendiri, tidak tergabung
dengan baris-baris sebelumnya. Efek ini terjadi jika gVim menggunakan
parameter

Kadang-kadang, berkas dengan karakteristik seperti ini justru diinginkan agar antara baris dalam semua paragraf tidak ada simbol newline ('\n'). Bagaimana caranya untuk membuang semua newline pada akhir setiap baris dari semua paragraf?


Cara Pertama


..adalah dengan operator pencarian dan ekspresi regular:

 /.\n./

Operator pencarian di atas akan mencari sembarang simbol (diwakili dengan simbol ekspresi regular '.'), diikuti oleh simbol newline, dan diikuti oleh sembarang simbol yang lain.

Setiap kali ditemukan pola ekspresi regular seperti ini, masukkan perintah:

 v, i, p, Shift-j

Perintah di atas akan menyorot (highlight) paragraf yang bersangkutan kemudian menggabungkan (join) semua baris pada paragraf tersebut.

Cara ini kurang efektif karena jika ada ratusan atau ribuan paragraf di dalam berkas yang ingin kita buang simbol newline-nya, maka proses melakukan pencarian, meng-highlight, dan menggabungkan baris seperti di atas akan membosankan.


Cara Kedua: Lebih cepat


Ada alternatif lain yang lebih cepat, yaitu dengan memanfaatkan ekspresi regular yang diperluas (extended regular expression):

 :1,$s/\(.\)\n\([^ ]\)/\1 \2/

Operasi di atas akan mencari semua bentuk pola urutan simbol seperti pada cara pertama, yaitu sembarang simbol, diikuti oleh newline, diakhiri dengan sembarang simbol. Jika diperhatikan, pada cara kedua ini, ada beberapa perbedaan pada bentuk ekspresi regular yang digunakan dibandingkan cara pertama. Berikut ini penjelasannya secara bertahap.

Pada cara pertama, ekspresi regular yang digunakan adalah:

/.\n./

Maksudnya, kita mencari pola sembarang simbol yang diikuti oleh newline dan diakhir dengan sembarang simbol yang lain. Dalam ekspresi regular, satu buah simbol '.' mewakili huruf atau angka, atau karakter-karakter yang lain, kecuali newline.

Perubahan pertama yang diterapkan adalah mengganti ekspresi regular agar mencari pola di mana setelah pergantian baris bukan simbol spasi:

/.\n[^ ]/

Ekspresi regular "[^ ]" artinya simbol selain spasi. Ini gunanya agar paragraf yang berbentuk kutipan seperti contoh berikut tidak dilakukan proses penggabungan baris.

8. When these five kinds of spy are all at work, none can discover
  the secret system.  This is called "divine manipulation of the
  threads."  It is the sovereign's most precious faculty.

Perubahan berikutnya adalah penambahan pasangan extended regular expression "\(" dan "\)":

/\(.\)\n\([^ ]\)/

Jika sebuah ekspresi regular diapit di antara "\(" dan "\)", maka ekspresi regular tersebut menjadi sebuah pola atau pattern. Pola ini dapat digunakan pada bagian lain dari ekspresi regular. Pada kasus ini, pola yang dibuat adalah pola

\(.\)

dan

\([^ ]\)

Karena ada dua pola, maka di bagian akhir dari ekspresi regular yang digunakan dalam kasus kita kali ini dicantumkan:

/\1 \2/

Ekspresi regular "\1" artinya kita mengacu pada pola ekspresi regular yang pertama, yaitu yang diciptakan melalui eksprei "\(.\)", sedangkan ekspresi "\2" maksudnya mengacu pada pola ekspresi regular kedua yaitu "\([^ ]\)".

Sebagai contoh, jika ada sebuah paragraf dalam berkas teks seperti berikut:

19. When a general, unable to estimate the enemy's strength, allows
an inferior force to engage a larger one, or hurls a weak
detachment against a powerful one, and neglects to place picked
soldiers in the front rank, the result must be rout.

Maka jika kita masukkan perintah ekspresi regular kepada gVim

 :1,$s/\(.\)\n\([^ ]\)/\1 \2/

hasilnya adalah penggabungan baris-baris dalam paragraf menjadi satu baris tunggal

19. When a general, unable to estimate the enemy's strength, allows an inferior force to engage a larger one, or hurls a weak detachment against a powerful one, and neglects to place picked soldiers in the front rank, the result must be rout.


Referensi


Potongan contoh teks yang digunakan dalam artikel ini adalah bagian dari teks The Art of War.