Vim : Search & Replace

Fitur penting dari sebuah editor teks di antaranya adalah kemampuan cari & ganti (search & replace). Bayangkan repotnya bila harus mengganti banyak kata (atau frase) satu persatu. Di editor Vim, saya biasa gunakan perintah berikut ini bila ingin melakukan search & replace teks tertentu :

:%s/<pattern>/<replacement>/g   

<pattern> maksudnya kata/frase yang ingin saya ganti sementara <replacement> adalah kata penggantinya. Misalnya saya punya berkas teks yang berisi data koneksi Oracle database seperti contoh berikut ini :

Saya ingin ganti informasi Oracle SID dari uimdb menjadi uimdbsit. Dengan menggunakan Vim, saya bisa mengedit satu persatu berkas tersebut lalu menjalankan perintah :

:%/uimdb/uimdbsit/g

Lalu tinggal Save dengan perintah :wq. Tapi sayangnya cara ini tidak praktis bila ternyata saya punya banyak sekali berkas. Cara yang paling sering saya gunakan adalah dengan bantuan perintah find, perl seperti ini :

find . -name "*pola nama file*" -exec perl -pi -e 's/<pattern>/<replacement>/g' {}\;

Contoh saat digunakan seperti ini berikut ini :

Perintah di atas bisa dimodifikasi untuk memanfaatkan fitur-fitur yang dimiliki perintah find. Misalnya fitur -maxdepth di atas berguna untuk membatasi area pencarian. Tanpa menggunakan opsi -maxdepth maka semua berkas berakhiran *.xml dalam semua sub-directori akan ikut terkena perubahan tadi. Misalnya contoh di bawah ini, ada banyak berkas *.xml dalam 3 sub-direktori (ditunjukkan dengan garis merah).

Karena saya hanya ingin memodifikasi berkas *.xml yang berada tepat di bawah direktori jdbc, saya harus menggunakan opsi maxdepth 1. Opsi tersebut akan membatasi area pencarian pada direktori itu saja (current directory) tanpa menyentuh berkas *.xml lain dalam setiap sub-direktori.

Vim : Hapus Semua Baris Sesuai Pola Tertentu

Saat menyunting berkas teks dengan Vim, biasanya saya perlu cara cepat untuk menghapus semua baris yang mengandung pola (pattern) tertentu. Cara lama saya tinggal search polanya lalu hapus satu persatu barisnya dengan perintah dd. Tapi cara ini kurang praktis dan rentan error bila mata sudah lelah mungkin saya bisa melewatkan sejumlah baris. Shortcut yang saya temukan dari Internet adalah dengan menggunakan perintah ini :

:g/<pattern>/d

Singkat perintahnya, cukup awali dengan :g/, diikuti dengan pola yang ingin kita temukan, dan terakhir diakhiri dengan /d.

Contoh penggunaannya seperti ini beberapa tangkapan layar berikut ini. Misalnya saya sedang menyunting sebuah berkas PL/SQL & ingin menghapus semua baris yang memiliki kata-kata “execute immediate”.

Saya masuk dulu ke command mode dengan menekan tombol Escape beberapa kali, lalu saya tinggal gunakan perintah tadi :g/execute immediate/d seperti terlihat di bawah ini :

Maka otomatis semua baris dari bagian awal sampai akhir dokumen yang mengandung kata “execute immediate” otomatis terhapus.

Saya ingin kumpulkan semua postingan tentang Vim dengan Tag : Vim. Dengan mengumpulkan aneka shortcut seperti ini, saya merasa jadi lebih produktif untuk mengedit berkas teks dengan Vim daripada dengan menggunakan editor visual lainnya.

Translate Characters

Catatan singkat tentang konversi karakter pada script Bash. Tepatnya saya ingin mengubah string variabel menjadi huruf besar semua (atau menjadi huruf kecil semua). Begini cara yang saya dapat dari banyak referensi di Internet :

ttirtawi@macbook-air:~$ TEST='MonkeyBANANA'
ttirtawi@macbook-air:~$ NEW=$(echo $TEST | tr '[a-z]' '[A-Z]')
ttirtawi@macbook-air:~$ echo $NEW
MONKEYBANANA
ttirtawi@macbook-air:~$ 

Seperti terlihat pada contoh di atas, saya cukup menggunakan perintah tr. Perintah tr sendiri artinya translate characters. Cara penggunaannya cukup mudah, cukup definisikan '[a-z]' '[A-Z]' untuk mengganti semua karakter dari huruf kecil menjadi huruf besar. Sebaliknya untuk mengubah semua karakter menjadi huruf kecil bisa dilihat pada contoh di bawah ini :

ttirtawi@macbook-air:~$ TEST='MonkeyBANANA'
ttirtawi@macbook-air:~$ NEW=$(echo $TEST | tr '[A-Z]' '[a-z]')
ttirtawi@macbook-air:~$ echo $NEW
monkeybanana
ttirtawi@macbook-air:~$ 

Memeriksa Jumlah CPU dari SQL*Plus

Saat bekerja dengan server Linux, cara untuk menentukan jumlah CPU yang terpasang pada sebuah server adalah dengan melihat berkas /proc/cpuinfo. Contohnya seperti tampilan berikut ini :

[oracle@uimdbsit01 ~]$ cat /proc/cpuinfo 
processor   : 0
vendor_id   : GenuineIntel
cpu family  : 6
model       : 37
model name  : Intel(R) Xeon(R) CPU E7- 4870  @ 2.40GHz
stepping    : 1
cpu MHz     : 2394.000
cache size  : 30720 KB
physical id : 0
siblings    : 5
core id     : 0
cpu cores   : 5
apicid      : 0
initial apicid  : 0
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm ida arat
bogomips    : 4788.00
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor   : 1
vendor_id   : GenuineIntel
cpu family  : 6
model       : 37
model name  : Intel(R) Xeon(R) CPU E7- 4870  @ 2.40GHz
stepping    : 1
cpu MHz     : 2394.000
cache size  : 30720 KB
physical id : 0
siblings    : 5
core id     : 1
cpu cores   : 5
apicid      : 1
initial apicid  : 1
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm ida arat
bogomips    : 4788.00
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor   : 2
vendor_id   : GenuineIntel
cpu family  : 6
model       : 37
model name  : Intel(R) Xeon(R) CPU E7- 4870  @ 2.40GHz
stepping    : 1
cpu MHz     : 2394.000
cache size  : 30720 KB
physical id : 0
siblings    : 5
core id     : 2
cpu cores   : 5
apicid      : 2
initial apicid  : 2
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm ida arat
bogomips    : 4788.00
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor   : 3
vendor_id   : GenuineIntel
cpu family  : 6
model       : 37
model name  : Intel(R) Xeon(R) CPU E7- 4870  @ 2.40GHz
stepping    : 1
cpu MHz     : 2394.000
cache size  : 30720 KB
physical id : 0
siblings    : 5
core id     : 3
cpu cores   : 5
apicid      : 3
initial apicid  : 3
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm ida arat
bogomips    : 4788.00
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor   : 4
vendor_id   : GenuineIntel
cpu family  : 6
model       : 37
model name  : Intel(R) Xeon(R) CPU E7- 4870  @ 2.40GHz
stepping    : 1
cpu MHz     : 2394.000
cache size  : 30720 KB
physical id : 0
siblings    : 5
core id     : 4
cpu cores   : 5
apicid      : 4
initial apicid  : 4
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm ida arat
bogomips    : 4788.00
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor   : 5
vendor_id   : GenuineIntel
cpu family  : 6
model       : 37
model name  : Intel(R) Xeon(R) CPU E7- 4870  @ 2.40GHz
stepping    : 1
cpu MHz     : 2394.000
cache size  : 30720 KB
physical id : 1
siblings    : 5
core id     : 0
cpu cores   : 5
apicid      : 8
initial apicid  : 8
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm ida arat
bogomips    : 4788.00
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor   : 6
vendor_id   : GenuineIntel
cpu family  : 6
model       : 37
model name  : Intel(R) Xeon(R) CPU E7- 4870  @ 2.40GHz
stepping    : 1
cpu MHz     : 2394.000
cache size  : 30720 KB
physical id : 1
siblings    : 5
core id     : 1
cpu cores   : 5
apicid      : 9
initial apicid  : 9
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm ida arat
bogomips    : 4788.00
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor   : 7
vendor_id   : GenuineIntel
cpu family  : 6
model       : 37
model name  : Intel(R) Xeon(R) CPU E7- 4870  @ 2.40GHz
stepping    : 1
cpu MHz     : 2394.000
cache size  : 30720 KB
physical id : 1
siblings    : 5
core id     : 2
cpu cores   : 5
apicid      : 10
initial apicid  : 10
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm ida arat
bogomips    : 4788.00
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor   : 8
vendor_id   : GenuineIntel
cpu family  : 6
model       : 37
model name  : Intel(R) Xeon(R) CPU E7- 4870  @ 2.40GHz
stepping    : 1
cpu MHz     : 2394.000
cache size  : 30720 KB
physical id : 1
siblings    : 5
core id     : 3
cpu cores   : 5
apicid      : 11
initial apicid  : 11
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm ida arat
bogomips    : 4788.00
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor   : 9
vendor_id   : GenuineIntel
cpu family  : 6
model       : 37
model name  : Intel(R) Xeon(R) CPU E7- 4870  @ 2.40GHz
stepping    : 1
cpu MHz     : 2394.000
cache size  : 30720 KB
physical id : 1
siblings    : 5
core id     : 4
cpu cores   : 5
apicid      : 12
initial apicid  : 12
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm ida arat
bogomips    : 4788.00
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

[oracle@uimdbsit01 ~]$ 

Pada contoh ini server yang sedang saya akses memiliki 10 buah CPU Intel(R) Xeon(R). Penomoran CPUnya dimulai dari angka 0.

Server pada contoh ini dipakai untuk menjalankan Oracle Database 11g. Bila sedang mengakses database melalui SQL*Plus, kita bisa juga memeriksa jumlah CPU yang terpasang. Lihat contoh berikut ini :

SQL> select a.inst_id,a.instance_name,b.name,b.value
  2  from gv$instance a, gv$parameter b
  3  where a.inst_id=b.inst_id
  4  and
  5  b.name in ('cpu_count','parallel_threads_per_cpu')
  6  ;

   INST_ID INSTANCE_NAME    NAME                                     VALUE
---------- ---------------- ---------------------------------------- ------------
         1 uimdbsit1        parallel_threads_per_cpu                 2
         1 uimdbsit1        cpu_count                                10
         2 uimdbsit2        parallel_threads_per_cpu                 2
         2 uimdbsit2        cpu_count                                10

SQL>

Karena databasenya adalah cluster RAC, maka akan muncul informasi CPU yang dimiliki oleh masing-masing node RAC. Dalam contoh tadi, dari SQL*Plus kita bisa melihat bahwa masing-masing node RAC beroperasi pada server berkekuatan 10 CPU. Sebagai catatan, untuk bisa menggunakan perintah SQL di atas, user harus punya privilege untuk mengakses gv$parameter (atau jalankan saja lewat user sysdba)

Vim : Folding

Setiap hari saya sering bekerja dengan menggunakan Vim, Vim adalah aplikasi editor teks berbasis CLI (command line interface). Beberapa waktu ini saya baru mempelajari satu lagi fiturnya Vim, fitur tersebut adalah folding. Folding di sini maksudnya menyembunyikan sementara bagian dokumen yang tidak ingin dibaca. Misalnya saya sedang menulis sebuah script PL/SQL, dan saya ingin menyembunyikan dulu bagian deklarasi variabel yang cukup panjang dan menyesaki layar. Pertama saya pindahkan kursor ke bagian awal dokumen yang ingin ditutup :

Lalu saya tekan kombinasi tombol Control & V untuk mengaktifkan mode visual :

Lalu saya gunakan tombol panah bawah untuk menandai semua bagian dokumen yang ingin saya sembunyikan :

Setelah menandai semua baris yang ingin disembunyikan, saya tekan tombol z dan f secara berurutan (zf). Secara otomatis Vim akan menyembunyikan semua baris tadi. Vim akan menampilkan indikator tanda +, diikuti dengan jumlah baris yang disembunyikan, serta tampilan baris awal yang disembunyikan seperti terlihat pada contoh di bawah ini :

Secara instan, 29 baris deklarasi variabel tersebut hilang tersembunyi dalam 1 baris saja. Dengan ukuran layar Terminal yang sama saya bisa melihat bagian script berikutnya.

Lalu bagaimana bila saya ingin memunculkan kembali semua baris tadi? Saya cukup mengarahkan kursor pada baris indikator tadi lalu menekan kombinasi tombol z dan o. Dan untuk menyembunyikan kembali baris-baris tersebut saya gunakan kombinasi tombol z dan c. Supaya mudah mengingat kombinasi tadi saya cukup hapalkan tombol pertamanya saja, cukup ingat tombol z untuk mulai menggunakan menu folding. Lalu ingat f untuk fold, o untuk open fold, dan c untuk close fold

Canggihnya lagi, semua pengaturan fold tadi bisa disimpan dengan menggunakan perintah mkview. Dengan menggunakan perintah mkview saya tidak perlu repot-repot menyembunyikan baris-baris tadi setiap saat membuat dokumen tersebut. Tanpa menggunakan mkview, setiap kali membuka dokumen yang sama saya perlu mengatur lagi bagian-bagian mana yang ingin saya sembunyikan.

Misalnya saya membuka lagi dokumen tersebut, saya cukup gunakan perintah loadview untuk mengaktifkan semua pengaturan yang sudah saya buat sebelumnya :

Tips ini saya temukan di website http://vim.wikia.com/wiki/Folding. Tips ini sangat berguna saat menggunakan Vim untuk mengolah dokumen (atau script) yang cukup panjang. Layar jadi tidak lagi disesaki dengan bagian yang sedang tidak kita perlukan. Menghemat waktu memindahkan kursor naik turun dokumen. Kita jadi bisa fokus pada salah satu bagian saja & menyembunyikan bagian lain untuk sementara waktu.