Bagian 3: Instalasi dan Cara Pakai Emacs
  |   Reading time: 12 minute(s).
Setelah berhasil menginstal Clojure, kita masih memerlukan IDE yang cocok untuk menulis program Clojure. Sintaksis Lisp di Clojure sangat merepotkan apabila kita menulis di editor teks biasa karena tidak ada fitur syntax highlighting, parenthesis matching, auto-indentation, dsb. IDE yang direkomendasikan untuk Clojure development adalah Emacs, karena ia sudah memiliki berbagai fitur yang dibutuhkan. Selain itu, Emacs sendiri dibuat dengan salah satu dialek Lisp, yaitu Emacs Lisp atau Elisp. Di tutorial ini, saya tidak akan memakai Emacs versi vanilla, melainkan Spacemacs. Spacemacs adalah configuration kit yang berisi berbagai macam setting yang bermanfaat untuk development, sehingga kita tidak perlu lagi mengkonfigurasi Emacs dari awal. Spacemacs juga memiliki Vim mode, sehingga bagi kalian yang sudah terbiasa dengan Vim, Spacemacs seharusnya tidak terlalu asing.
Di tulisan ini saya akan menjabarkan langkah-langkah instalasi Emacs dan Spacemacs beserta contoh cara pakainya untuk Clojure development. Jujur saja Emacs memang cukup ribet digunakan, khususnya bagi pemula. Pemakaian Emacs sangat mengandalkan kibor, sehingga kita harus hapal key bindings yang diperlukan. Jadi kalau setelah selesai bagian ini kalian merasa kesusahan saya sangat paham. Kalau ingin memakai IDE lain, saya akan memberikan IDE alternatif yang cocok untuk menulis program Clojure.
Saya ingatkan lagi, proses instalasi di bawah ini saya lakukan di Ubuntu 22.04. Jika di environment kalian belum ada Clojure compiler, silakan instal dulu seperti yang saya jelaskan di bagian 2.
Penting: Bagi pemula atau yang belum pernah mencoba Emacs, sebelum memutuskan untuk instalasi, silakan baca bagian 3 ini secara sekilas. Lihat apakah kalian tidak ada masalah atau cocok dengan alur kerja seperti di bawah. Kalau tidak cocok, silakan pakai IDE/editor teks pilihan dan pastikan instal plugin untuk Clojure development. Emacs hanya salah satu opsi yang direkomendasikan, bukan keharusan.
Bagi yang sudah terbisa dengan Emacs: Jika kalian sudah punya setup Emacs tersendiri, silakan disesuaikan untuk Clojure development.
Instalasi Emacs (dan Spacemacs)
-
Langkah pertama adalah instalasi Emacs di PC/Laptop kita kalau belum ada.
$ sudo apt install emacs ripgrep fd-find
-
Unduh konfigurasi Spacemacs dan tempatkan di direktori
~/.emacs.d
. Konfigurasi ini akan menggantikan konfigurasi existing. Silakan backup konfigurasi existing terlebih dahulu jika ingin mencoba Spacemacs. Setelah ini saya akan menyebut Emacs sebagai Spacemacs.$ git clone https://github.com/syl20bnr/spacemacs ~/.emacs.d
-
Buka Spacemacs GUI (di menu namanya mungkin masih tetap Emacs) dan di bagian bawah akan muncul Dotfile wizard installer. Kita akan diminta memilih editing style (Emacs, Vim, atau hybrid) dan distribusi Spacemacs (standard atau minimalist). Untuk kedua pilihan tersebut, saya pilih Vim dan standard distribution.
Setelah itu, Spacemacs akan mulai mengunduh packages yang dibutuhkan. Tunggu proses unduh packages dan instalasinya sampai selesai.
-
Setelah proses instalasi packages selesai, kita akan dihadapkan dengan tampilan yang berisi peringatan dan log dari proses instalasi, seperti pada gambar di bawah. Untuk saat ini tutup Spacemacs lalu buka lagi.
-
Apabila ada pesan warning, seperti font tidak ditemukan, kita bisa abaikan pesan warning tersebut. Namun, jika ada pesan error terutama karena instalasi package, coba restart Spacemacs dengan cara tutup dan buka Spacemacs seperti sebelumnya. Tiap restart, Spacemacs akan mencoba menginstal package yang masih tertinggal. Kadang koneksi ke server ELPA/MELPA tempat mengunduh package tidak stabil dan ada package yang terlewat.
-
Apabila masih ada error, kemungkinan disebabkan karena package sudah tidak ada di server. Seperti yang tertera di gambar bawah ini, saat instalasi package, Spacemacs di laptop saya tidak bisa instal package
evil-escape
. Setelah saya cek di server, ternyata package tersebut memang tidak tersedia saat saya instalasi. Oleh karena itu packageevil-escape
harus diinstal secara manual. Berikut adalah solusi untuk instal package secara manual:-
Cari repo
evil-escape
di Google. Biasanya tersedia di Github. -
Clone repo tersebut ke direktori home:
$ git clone https://github.com/syl20bnr/evil-escape.git
-
Buka file
~/.spacemacs
. (Tidak harus memakai Spacemacs, bisa dengan editor teks biasa.) -
Cari baris
dotspacemacs-additional-packages '()
lalu masukkan lokasi direktorievil-escape
di dalam'()
sehingga menjadi:dotspacemacs-additional-packages '((evil-escape :location "~/evil-escape"))
-
Restart Spacemacs. Harusnya tidak ada pesan error untuk
evil-escape
, kalau masih adawarning
yang lain biarkan saja.
-
-
Kalau masih ada error karena ada package yang belum terinstal (misalnya package
evil-ediff
di kasus saya), langkahnya mirip dengan sebelumnya:-
Cari reponya di Google, biasanya ada di Github.
-
Clone repo ke direktori home:
$ git clone https://github.com/emacs-evil/evil-ediff.git
-
Buka file
~/.spacemacs
dan tambahkan lokasi direktori package kedotspacemacs-additional-packages '()
. Karena ada 2 package yang diinstal secara manual, maka berikut adalah konfigurasi additional packages milik saya:dotspacemacs-additional-packages '((evil-escape :location "~/evil-escape") (evil-ediff :location "~/evil-ediff"))
-
-
Selanjutnya kita perlu mengaktifkan Spacemacs layer. Layer adalah sekumpulan konfigurasi dan package spesifik untuk bahasa pemrograman atau fungsi tertentu. Dalam hal ini, kita perlu mengaktifkan Clojure layer yang akan membantu kita saat menulis program Clojure. Layer bisa diaktifkan secara otomatis saat kita membuka file dengan ekstensi tertentu (contohnya
.clj
untuk Clojure) atau bisa ditambahkan di file.spacemacs
. Setelah diaktifkan, Spacemacs akan mengunduh package tambahan untuk layer yang diaktifkan. -
Kali ini, kita akan menambahkan layer secara manual lewat file
.spacemacs
. Buka.spacemacs
dan caridotspacemacs-configuration-layer
, yang merupakan list yang berisi layer yang sudah terinstal. Tanda;;
adalah komentar di Lisp, sehingga layer yang didepannya ada;;
adalah layer nonaktif. Tambahkanclojure
di list tersebut dan aktifkan beberapa layer bawaan jika diperlukan. Seperti pada gambar di bawah, saya juga mengaktifkan layerauto-completion
danbetter-defaults
. Jika sudah, simpan file.spacemacs
. -
Restart Spacemacs agar ia bisa mengunduh package untuk Clojure layer. Setelah selesai, Spacemacs siap dipakai untuk Clojure development.
IDE Alternatif
Jika tidak ingin memakai Spacemacs, laman resmi Clojure juga punya daftar IDE alternatif yang bisa dipakai untuk Clojure development. Silakan kunjungi https://clojure.org/guides/editors. Biasanya kita perlu memasang plugin tambahan untuk Clojure development. Misalnya di VS code perlu instal Calva. Emacs/Spacemacs sendiri juga ada plugin khusus, yaitu Cider, tapi proses instalasinya sudah dimudahkan via Clojure layer.
Sedikit Panduan Pemakaian
Setelah berhasil membangun environment untuk Clojure development, kita akan mencoba membuat program Clojure dengan tools yang sudah kita instal, khususnya Spacemacs dan Leiningen. Kita akan berinteraksi dengan Spacemacs via key bindings, sehingga mouse tidak terlalu dibutuhkan. Tidak usah takut karena saya akan memandu dari awal sampai selesai.
-
Pertama, buat project Clojure di terminal dengan perintah:
$ lein new app tes-clojure
Perintah di atas kurang lebih berarti “kita membuat project Clojure baru bernama
tes-clojure
dengan memakai template projectapp
”. -
Masuk ke direktori
tes-clojure
:$ cd tes-clojure
-
Periksa isi direktori
tes-clojure
dengan perintahtree
:$ tree
Seperti yang dapat dilihat, Leiningen sudah menyiapkan kerangka project untuk kita. Berikut adalah sedikit penjelasan dari direktori atau file yang penting bagi kita:
project.clj
: Berisi konfigurasi project seperti dependensi.resources
: Direktori Untuk menyimpan aset seperti gambar, data, dsb.src
: Direktori untuk menyimpan source code dari project kita.src/tes_clojure/core.clj
: File utama tempat fungsimain
berada.test
: Direktori untuk melalukantesting
.
-
Buka spacemacs GUI. Sebelum melangkah lebih jauh, ada key binding yang sangat penting dan perlu diingat yaitu
Ctrl-g
. Key binding ini sangat berguna untuk membatalkan key binding yang sedang berjalan. Misalkan key binding yang kita inginkan adalahSPC m ; e
, namun di tengah jalan kita salah ketik menjadiSPC n
. Di sini kita bisa tekanCtrl-g
untuk kembali ke awal, dan memulai key binding yang benar, yaituSPC m ; e
. -
Tekan
Spasi f f
secara berurutan membuka file atau membuat baru jika belum ada. (Setelah ini saya akan singkat tombol Spasi menjadiSPC
, jadi urutan tombol sebelumnya menjadiSPC f f
). Setelah itu akan muncul tampilan seperti di bawah: -
Ketikkan nama file yang ingin dibuka. Karena kita ingin mengedit source code
tes-clojure
, ketikkan path secara lengkap lalu tekanEnter
. Contohnya di laptop saya ada di path/home/riz/tes-clojure/src/tes_clojure/core.clj
. -
Berikut adalah isi dari
core.clj
dan penjelasannya per baris:(ns tes-clojure.core ;; 1 (:gen-class)) ;; 2 (defn -main ;; 3 "I don't do a whole lot ... yet." ;; 4 [& args] ;; 5 (println "Hello, World!")) ;; 6 ;; 1. Deklarasi namespace tes-clojure.core. ;; Perhatikan struktur namespace mirip dengan ;; struktur direktori src. ;; 2. Untuk membuat bytecode dari class. ;; 3. Definisi fungsi main. ;; Untuk sementara abaikan tanda - di depan main. ;; 4. Docstring (opsional). ;; 5. Parameter fungsi main. ;; & args berarti ia dapat menerima banyak argumen. ;; 6. Isi dari fungsi main.
-
Selanjutnya, buat fungsi baru di bawah fungsi
main
. Namun sebelumnya, perhatikan warna oranye di bagian pojok kiri bawah. Itu berarti kita sedang ada di Window 1, dan warna oranye berarti sedang ada dinormal
mode.Karena editing style yang saya pilih Vim, maka untuk masuk ke
insert
mode, kita perlu tekan tomboli
atauo
. Lalu, masukkan definisi fungsi di bawah ini (perhatikan jugainsert
mode berwarna hijau):(defn fungsi-tes "tes pembuatan fungsi" [] ;; tidak menerima argumen (println "halo dari lein"))
-
Tekan tombol
Esc
untuk keluar dariinsert
mode lalu tekanSPC f s
untuk menyimpan file. Perhatikan pesanWrote /home/...
di bagian bawah. Itu berarti file sudah berhasil disimpan. -
Sekarang kita akan bereksperimen dengan program kita secara interaktif melalui REPL. Pertama, kita harus tekan maximize window (pojok kanan atas) agar punya ruang yang cukup untuk source code dan REPL.
-
Tekan
SPC w 2
untuk membagi Spacemacs menjadi 2 window secara vertikal (Ya, istilah yang dipakai di Emacs adalah window). Nomor window yang sedang aktif adalah oranye/ungu/hijau, sedangkan window nonaktif berwarna hitam. Window 1 kita pakai untuk source code, window 2 akan kita pakai untuk REPL. -
Di window 1, tekan
SPC SPC
(spasi 2x), lalu ketikcider-jack-in
dan tekanEnter
untuk menjalankan REPL dan mengkoneksikan Spacemacs dengannya. Perhatikan pesan di bagian bawah. Kita akan melihat pesan[nREPL] Starting server via...
danConnected! ...
saat Spacemacs sudah terhubung dengan REPL. -
Pindah ke window 2 dengan perintah
SPC 2
. Perhatikan nomor window 2 jadi berwarna. -
Di window 2, untuk membuka REPL yang sudah kita jalankan, tekan
SPC b b
untuk melihat daftar buffer yang sedang aktif di Spacemacs. Lalu pilih buffer dengan namacider-repl ~/tes...
(ingat pakai tombol kibor, bukan mouse). -
Setelah REPL terbuka, kita perlu ketik
i
sebelum memasukkan perintah ke REPL, karena window 2 berwarna oranye (ingatnormal
mode). Lalu, ketik(fungsi-tes)
di REPL untuk memanggilfungsi-tes
yang kita definisikan sebelumnya. Saat dieksekusi, kita akan mendapatkan pesan di REPL. -
Selanjutnya, mari kita coba panggil
fungsi-tes
melaluimain
. Karena kita masih diinsert
mode di window 2, tekanEsc
laluSPC 1
untuk pindah ke window 1. -
Di window 1, ketik
i
lalu ubah baris(println "Hello, World!")
dimain
menjadi(fungsi-tes)
seperti di bawah. Lalu tekanEsc
danSPC f s
untuk simpan perubahan.(defn -main "I don't do a whole lot ... yet." [& args] (fungsi-tes))
-
Akan tetapi, di Clojure kita harus mendefinisikan fungsi dulu sebelum memanggilnya dari fungsi lain. Dalam hal ini kita harus meletakkan
fungsi-tes
di atasmain
(catatan: di REPL saat ini kita masih bisa memanggilfungsi-tes
darimain
karena sudah dikompilasi. Namun, saat kita memulai REPL lagi, source code akan dikompilasi dari atas ke bawah dan fungsimain
akan bingung karena tidak menemukan definisifungsi-tes
, sehingga perlu ditaruh di atasmain
). -
Kita akan mencoba fitur copy-paste di Spacemacs. Pertama arahkan kursor ke baris
(defn fungsi-tes
, lalu tekanCtrl-V
untuk membuat blok view satu baris tersebut (perhatikan perbedaan warna blok dan background). Selanjutnya tekan tombol arah bawah untuk membuat blok view sampai baris(println "halo dari lein")
, seperti gambar di bawah. -
Dengan blok view yang masih aktif, tekan tombol
d
untuk cut blok tersebut (tomboly
bisa digunakan untuk copy), lalu tempatkan kursor di bawah baris(:gen-class))
dan tekan tombolp
untuk paste. Silakan rapikan dengan menambahkan baris kosong baru apabila masih kurang rapi. -
Tekan
SPC f s
untuk menyimpan perubahan. -
Tekan
SPC m e b
untuk mengevaluasi (compile) buffer source code ke REPL, sehingga perubahan yang kita buat dapat dikenali oleh REPL. Perhatikan pesan di pojok bawah dan garis hijau disamping nama fungsi seperti pada gambar di bawah. Itu berarti semua definisi fungsi kita berhasil dikompilasi. Sekarang, coba sendiri pindah ke window 2, lalu panggil fungsimain
dengan perintah(-main)
di REPL. Lihat apakah ia bisa memanggilfungsi-tes
atau tidak. Dengan alur kerja seperti ini, kita bisa membuat program secara interaktif. -
Untuk menonaktifkan REPL, kita bisa tekan
Ctrl-x k
(Ctrl-x
laluk
), lalu pilih buffer REPL (*cider-repl ...
). Tekany
untuk konfirmasi. REPL sudah berhenti.
Development tanpa Emacs/IDE
Setelah menjelaskan cara memakai Spacemacs untuk membuat program secara dinamis, saya akan menjelaskan alur kerja saat kita tidak memakai IDE yang tidak mendukung Clojure atau hanya dengan editor teks biasa. Sekali lagi saya sarankan untuk memakai editor teks yang sudah punya fitur parenthesis/bracket matching, syntax highlighting, dan auto-indentation.
-
Masuk ke project yang sudah dibuat:
$ cd tes-clojure
-
Jalankan
lein repl
di terminal, lalu pastikan prompt yang muncul sesuai dengan namespace project, yaitutes-clojure.core
-
Panggil fungsi
fungsi-tes
(jika belum ada, tulisfungsi-tes
sesuai dengan definisi di atas): -
Buka editor teks, dan ubah fungsi
fungsi-tes
di filecore.clj
.(defn fungsi-tes "tes pembuatan fungsi" [] (println "halo dari lein repl")) ;; ubah pesan
-
Saat perubahan sudah disimpan dan
fungsi-tes
dipanggil ulang, pesan yang muncul masih sama seperti sebelumnya. Ini berarti kita perlu kompilasi ulang (salah satu kelebihan dari Spacemacs dan mungkin IDE Clojure lain adalah kompilasi tanpa perlu masuk ke REPL). Cara untuk kompilasi ulang filecore.clj
di REPL adalah dengan perintah(require 'tes-clojure.core :reload)
(Perhatikan tanda petik di ’tes-clojure.core). Saat kita panggilfungsi-tes
lagi setelah kompilasi ulang, kita akan melihat perubahan yang sudah dilakukan. -
Silakan ulangi proses di atas (edit-recompile) untuk membiasakan diri dengan REPL.
Sedikit tambahan tentang Lein
Sebagai tambahan, berikut adalah beberapa perintah Leiningen yang berguna saat kita menulis program Clojure:
-
lein run
: Untuk menjalankan program secara biasa (tanpa REPL). -
lein uberjar
: untuk kompilasi project menjadi executable. Dari kompilasi ini kita akan diberi 2 file SNAPSHOT JAR yang berada di direktoritarget
: standalone dan non-standalone. Jalankan file standalone jar dengan perintah berikut.$ java -jar target/default+uberjar/tes-clojure-0.1.0-SNAPSHOT-standalone.jar
-
lein clean
: untuk membersihkan file hasil kompilasi. -
lein help
: untuk memeriksa fungsi Leiningen lainnya.
Penutup
Di tulisan ini, saya harap kalian sudah cukup familiar dengan Emacs/Spacemacs beserta proses interactive development via REPL. Apabila tidak suka Spacemacs, silakan pilih IDE lain yang sudah mendukung Clojure development. Di sini saya tidak memakai istilah yang umum dipakai di komunitas Emacs, harapannya setelah ini kalian bisa coba mendalami sendiri. Dokumentasi Spacemacs dapat dipelajari di https://develop.spacemacs.org/doc/DOCUMENTATION.html. Di tulisan berikutnya, saya akan membahas sintaksis Lisp secara umum. Harapannya, setelah terbiasa dengan sintaksis Lisp, materi-materi selanjutnya lebih mudah dipahami.