Serba-serbi editor teks

Pekerjaan saya adalah programmer, dan kira-kira 90% waktu saya habiskan untuk mengedit teks, jadi wajar kalau saya ingin memakai editor terbaik. Sekitar 10 tahun yang lalu saya menulis bahwa saya hampir 100% memakai Emacs, tapi setelah itu saya mulai berganti-ganti editor walau editor utama saya tetap Emacs.

Sampai sekarang tidak ada satu editor yang cocok untuk semua hal, jadi akhirnya saya memakai dan menginstall banyak editor teks dan IDE (integrated development environment) untuk berbagai tujuan. Seringkali bermain-main dengan editor dan IDE ini saya jadikan pengisi waktu luang kalau sedang ingin membuang waktu.

Sekarang ini kombinasi Editor teks dan IDE yang saya pakai:

  • Emacs sebagai editor utama
  • Vim untuk editing cepat di sistem remote
  • Ultraedit untuk membuka file teks yang sangat besar
  • Intellij untuk refactoring Python
  • VSCode untuk platformio dan remote editing
  • Visual Studio untuk C# di Windows
  • Netbeans untuk membuat GUI Java dengan cepat

Saya tuliskan dulu apa sih fitur-fitur yang saya pakai, lalu saya sebutkan kapan saya memakai editor atau IDE di atas.

Sebagai informasi, biasanya saya mengedit file di komputer:

  • Desktop Rumah: RAM 48 GB, Intel Core i5, NVME SSD
  • Laptop: Macbook Pro 2019 (16 inch), RAM 16 GB, NVME SSD

Tapi kadang saya juga mengedit file dengan berbagai komputer lain, termasuk juga pinebook dan pinebook pro.

Berjalan di Console/Mode Teks

Saya sering perlu mengedit teks di sebuah sistem yang tidak memiliki GUI, atau jika dipaksa akan lambat sekali. Contoh: mengedit file di sistem embedded Linux dengan memori yang hanya 32 Megabyte. Banyak editor langsung keluar dari daftar. Untuk keperluan ini akhirnya saya sering memakai vim dan emacs. Editor nano dan pico juga kadang saya pakai jika terpaksa.

Startup vim jauh lebih cepat dari Emacs, tapi saya sering lupa perintah Vim karena semuanya memakai kombinasi huruf yang sulit dihapal. Sekarang saya sudah hapal perintah sederhana untuk navigasi, save, edit, shell, goto line, search replace, split screen, dan managemen tab di Vim, tapi fitur yang lebih advanced belum saya kuasai. Emacs juga bisa dikonfigurasi dengan berbagai shortcut, tapi jika kita lupa sesuatu, kita bisa mengetikkan nama perintahnya (misalnya: remove-trailing-whitespace). VSCode juga memiliki fitur search command semacam ini tapi VSCode tidak berjalan di mode teks.

Search dan Replace

Semua editor punya search dan replace, tapi kemampuannya berbeda-beda. Jika mungkin saya akan melakukan search replace text dengan menggunakan program “sed” saja di command line, tapi kadang saya perlu langsung melihat hasilnya secara interaktif. Vim bagus untuk search/replace dengan regex, tapi untuk search/replace non regex malah sulit (opsi no magic atau sno tetap menganggap karakter $ dan backslash dianggap spesial). Padahal ketika search dan replace kode program itu hampir selalu mengandung karakter spesial. Jadi bagian kecil ini sering mengesalkan.

Kadang jika ingin search replace yang case sensitive, yaitu mengganti teks tapi jika huruf kapital tetap kapital, jika bukan kapital tetap bukan kapital, dan jika diawali kapital tetap diawali kapital, misalnya semua YOHANES jadi JOE, Yohanes jadi Joe dan yohanes jadi joe. Ini sangat terpakai jika kita ingin konsisten dalam memberi nama, misalnya #define di C biasanya huruf kapital, sedangkan nama fungsi huruf kecil semua. Dengan Emacs ini mudah dilakukan (defaultnya itu) tapi ini sulit dilakukan dengan sed dan butuh plugin untuk Vim. Di VS Code, fitur ini baru mulai ada di versi 1.37 (Juli 2019).

Macro

Ini sulit dijelaskan bagi yang tidak pernah memakai fitur Macro. Jika kita ingin mengedit banyak baris teks secara interaktif tapi berulang, kita bisa memakai macro. Contohnya begini, jika kita punya teks banyak baris, seperti ini: sebuah kata diikuti definisi kata tersebut:

cinta suka sekali; sayang benar
cantik elok; molek

Dan kita ingin mengubah dafar tersebut menjadi pemetaan dictionary dengan syntax PHP:

"cinta" => "suka sekali; sayang benar",
"cantik" => "elok; molek",

Dengan mengetahui perintah Emacs dan macro, kita cukup mengetikkan Control-X (, lalu mulai melakukan apa yang harus terjadi di baris itu:

  • ke awal baris dengan Control-A (beginning of line)
  • ketik tanda petik ganda
  • pergi ke kata berikut dengan Alt-f (forward-word)
  • ketik ” => “
  • pergi ke akhir baris dengan Control-E (end-of-line)
  • ketik “,
  • pergi ke baris berikut dengan panah bawah, atau Control-N (next-line)

Lalu kita akhiri macro dengan Control-x ), dan berikutnya untuk mengulangi macronya kita tekan: Control-x e. Jika masih ada lagi berikutnya kita tekan e.

Vim juga memiliki fitur macro, dan sering juga saya gunakan, tapi karena saya tidak hapal dengan banyak perintah Vim, saya lebih sering memakai emacs ketika butuh fitur Macro.

File besar

Cukup sering saya harus berurusan dengan source code yang ukurannya besar, biasanya dihasilkan oleh tools (generated code). Ukuran filenya ratusanribu sampai jutaan baris. Berbagai editor tidak mampu menangani file sebesar ini, emacs tidak mampu, vim mampu, tapi syntax highlightingnya akan didisable secara otomatis (mengeset opsi ttyfast tidak membantu).

VS Code ketika membuka file besar

Setelah mencoba berbagai editor, yang bisa membuka file besar dengan baik tidak banyak. Sebagian besar hanya tersedia untuk Windows. Pilihan akhirnya jatuh ke Ultra Edit (komersial) karena kebetulan mendukung berbagai bahasa yang saya pakai. Paket ultraedit yang saya beli juga memiliki Ultra Compare, yang bisa dipakai untuk file besar (WinMerge dan yang lain mengalami kesulitan dengan file ratusan megabyte). Alternatif lain yang menurut saya bagus adalah 101 Editor (juga komersial).

Shell

Sambil mengetik program, saya sering perlu menjalankan perintah tertentu. Tentunya ada banyak cara untuk menjalankan shell ini sambil menjalankan editor.

Pertama adalah di window terpisah. Ini cocok jika kita memakai tiling Window Manager

Atau di belah layarnya dengan tmux

Jika tidak butuh interaktif, kita bisa menjalankan langsung perintah dan melihat hasilnya (misalnya dengan “!” di vim).

Dengan menggunakan fitur di editor itu sendiri, misalnya vim punya perintah terminal (ini baru di versi 2017 ke atas) dan emacs punya perintah shell. Contoh editor lain yang memiliki ini adalah VSCode

Terminal di dalam Vim

Di Vim dan VSCode, shell ini tidak terasa terintegrasi menurut saya, karena di dalam shellnya, key binding editor jadi tidak berfungi. Di emacs, semua masih berfungsi (pergerakan kursor, copy paste, dsb), jadi misalnya kita ingin mencari output terminal, kita bisa menekan Control-r (reverse search) untuk mencari perintah atau outputnya.

Network Editing

Ada banyak cara mengedit file dari network, tapi pendekatannya biasanya salah satu dari ini:

  • Mount sharenya di lokal (bisa menggunakan sshfs)
  • Ambil filenya ke lokal, edit, lalu kirim kembali ke remote server
  • Jalankan editor atau proses khusus di remote server

Masing-masing pendekatan memiliki kelebihan dan kekurangannya. Jika kita mount direktori remote agar bisa diakses lokal, kadang ini jadi lambat jika diakses IDE (karena berusaha mengindeks seluruh project). Jika saya mengedit file di server, maka semua gerakan kursor jadi lambat, tapi perubahan akan disimpan instan. Sedangkan jika saya mengcopy file dulu di lokal, lalu menekan save, kadang butuh waktu sampai filenya benar-benar tersimpan di remote server.

Dulu saya suka memakai emacs TRAMP (Transparent Remote Access, Multiple Protocol), tapi sekarang saya memilih VSCode. VSCode memiliki fitur codeserver, jadi editornya berjalan di remote, tapi user interfacenya lokal (bahkan bisa via browser). Sayangnya fitur code server ini baru tersedia di x86/x86_64 dan arm/arm64, jadi kalau ingin mengedit file di router yang memakai MIPS biasanya tetap butuh SSH langsung.

Narrowing

Kadang saya ingin berkonsentrasi di satu bagian kode saja, misalnya satu fungsi atau bahkan sepotong bagian fungsi yang besar. Dari berbagai editor yang saya pakai, sepertinya hanya Emacs yang punya fitur narrowing secara default. Ada plugin VIM untuk ini, dan meski sudah ada yang menyarankan agar menjadi fitur VSCode, ini juga katanya sebaiknya menjadi plugin saja.

Ini sepertinya fitur minor, tapi sangat berguna, dengan narrowing, saya bisa melakukan editing apa saja (termasuk search replace) dan saya bisa yakin tidak akan mempengaruhi bagian lain program. Andaikan tidak ada fitur ini, bisa saja saya mengcopy paste bagian yang ingin saya kerjakan ke file baru, tapi saya harus mengcopy lagi hasil edit, jadi cukup merepotkan.

Font dan ligature

Sekarang ini ada beberapa “programming font”, yaitu font yang tujuannya untuk dipakai menampilkan kode. Dalam berbagai font ini berbagai simbol terlihat jelas bedanya, misalnya angka 0 dan huruf O berbeda jelas, demikian juga huruf kapital I, huruf kecil l dan angka 1. Beberapa font bahkan dibundel bersama editor atau IDE tertentu, misalnya IntelliJ punya “Jetbrains Mono” dan Visual Studio Code memakai “Cascadia Code”. Dan banyak juga font lain seperti Fira Code yang tidak ditujukan untuk editor tertentu.

Sebagian programming font ini mendukung ligature. Berbagai operator seperti <= akan ditampilkan cantik dengan simbol ≤. Sebagian programmer tidak suka ini, tapi menurut saya cukup enak untuk dipakai membaca source code. Dari berbagai editor yang saya pakai, saat ini hanya emacs yang tidak mendukung ligature dengan baik. Sebenarnya bisa, tapi repot sekali, tidak seperti editor lain yang mudah.

Zero Latency Typing

Saya sempat terobsesi juga dengan zero latency typing: begitu menekan tombol, karakter seharusnya langsung muncul di layar. Kebanyakan editor tidak bisa seperti ini, jadi ya sudah saya terima aja karena tidak banyak yang bisa saya lakukan. Biasanya jika komputer terlalu lambat, entah itu karena terlalu sibuk mengkompilasi kode atau memang spesifikasinya kurang cepat (misalnya Pinebook/Pinebook Pro), saya akan memakai editor yang lebih ringan.

Editor latency in Windows (text file)
Sumber: Typing with pleasure

Editor vs Integrated Development Environment (IDE)

Memprogram dengan IDE bisa banyak membantu pemrograman, tapi dari dulu saya sering menghindari IDE karena terlalu banyak menyembunyikan berbagai hal dari saya. Jika sedang bekerja baik IDE sangat nyaman dipakai, tapi jika ada error, sering sulit sekali mencari salahnya.

Kebanyakan IDE juga tidak terlalu berguna untuk bahasa C/C++ karena akan bingung ketika ketemu berbagai Macro yang aneh atau template yang kompleks. Jadi akhirnya saya hanya memakai IDE di kasus tertentu saja. Berbagai skrip singkat Python juga tidak butuh IDE, membuat script manual dengan editor lebih cepat daripada setup project IDE.

Kasus pertama adalah jika memang bahasa atau platform target sangat bergantung pada IDE-nya. Contoh: saya memakai Android Studio untuk membuka project Android. Meski saya mengetahui langkah manual/command line untuk mengcompile, source, membuat package dan sign APK (pengetahuan berguna untuk reversing), tapi jika ingin mengedit proyek Android ya saya memakai Android Studio. Demikian juga jika ingin membuka proyek iOS, saya memakai XCode.

Kasus kedua adalah untuk refactoring. Jika saya ingin mengubah-ubah nama dan lokasi file, fitur drag/drop IDE sangat membantu. Tidak semua IDE punya fitur setara untuk hal ini. VSCode memiliki banyak plugin yang menjadikannya seperti IDE, tapi ini masih kalah dari yang sudah matang. Contoh: fitur refactoring kode Python di VSCode masih kalah jauh dibandingkan Intellij/PyCharm.

Kasus berikutnya adalah untuk membuat GUI sederhana. Sering kali saya perlu melakukan reverse engineering kode Android (Java), dan perlu mengetes kodenya. Dengan decompiler saya bisa mendapatkan kode tertentu (kode enkripsi, signing, dsb) dari APK, dan kode ini bisa ditest dengan cepat menggunakan NetBeans di desktop. Saya bisa membuat GUI sederhana untuk memanggil kode yang saya ekstrak tersebut. Membuat program command line memang mudah, tapi jika programnya menerima banyak input, dan ada yang opsional, parsingnya mulai merepotkan dan lebih mudah memakai GUI.

Kasus terakhir adalah jika saya kurang familiar dengan bahasanya. Contohnya: saya memakai Visual Studio untuk editing C# (atau Rider jika sedang memakai Linux/OS X). Pengetahuan saya tentang C# jauh lebih rendah dibandingkan pengetahuan saya mengenai Java. Dengan IDE plus plugin dari ReSharper dari IntelliJ, saya bisa membuat kode C# yang cukup bagus. Setiap kali membuat kode yang kurang bagus, plugin ReSharper bisa memberi ide yang lebih baik.

Internal Editor Teks

Sebagai programmer, dari dulu (dari sejak SMU sekitar 1997) saya tertarik bagaimana mengimplementasikan editor teks. Untuk mengimplementasikan editor teks yang baik dibutuhkan struktur data yang baik pula. Sekedar array of string akan membuat proses insert line, merge line, dsb kurang efisien. Belum lagi berbagai aksi seperti text selection, rectangular selection, undo dan redo.

Sampai sekarang pun masih, dan saya masih mengikuti berbagai perkembangan editor yang ada. Saat ini proyek open source yang menarik adalah xi-editor yang menggunakan struktur data rope. Sayangnya sampai saat ini belum ada front end xi editor ini yang saya sukai.

Penutup

Bermain-main dan mencoba-coba berbagai editor ini sering kali menjadi “kegiatan buang waktu” ketika sedang malas mulai memprogram. Tapi Andaikan hasil dari mengoprek editor ini bisa membuat saya lebih efisien 1% saja per hari (bisa mengetik/mengedit lebih cepat beberapa menit saja totalnya), maka dalam setahun, hasilnya sudah terbayar.

Beberapa contoh yang terpikir oleh saya:Pemakaian macro sudah menghemat banyak sekali waktu karena mempercepat editing berulang. Memilih teks editor Ultraedit untuk membuka file besar menghemat banyak waktu karena hasilnya instan. Dari waktu untuk membuka file saja, sudah hemat banyak waktu.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.