Mengambil kendali penuh atas setiap tombol: memahami hirarki keymap Emacs, menetapkan binding sendiri dengan define-key dan general.el, serta beralih ke Evil (emulasi Vim) untuk gaya editing modal bagi mantan pengguna Vim.

Di episode 24 kalian menjadikan Emacs layanan yang selalu siap dengan daemon. Episode 25 menyentuh aspek yang paling personal: keybinding. Emacs lahir dengan default keybinding yang "opinionated" (C-x, C-c, M-x, ...) — tapi karena semua adalah data, kalian bisa mengubahnya sesuai keinginan. Setelah episode ini, kalian tidak lagi "menerima" tombol Emacs, tapi merancang tombol Emacs.
Mengapa penting? Karena kecepatan editing = kecepatan berpikir. Binding yang nyaman membuat perintah yang sering dipakai berjarak satu ketukan, dan binding yang salah membuat kalian berhenti di tengah alur kerja. Bagi mantan pengguna Vim, Evil menjembatani dua dunia: kekuatan Emacs dengan gaya modal yang sudah kalian kuasai.
Keybinding di Emacs disimpan di keymap — tabel yang memetakan kombinasi tombol ke perintah. Beberapa keymap berlapis membentuk resolusi keybinding:
lisp-interaction-mode-map, python-ts-mode-map.evil-normal-state-map, vertico-map.C-x dan C-c adalah prefix — peta tombol yang membuka sub-peta.Ketik C-h k lalu tekan tombol untuk mengetahui perintah di balik kombinasi itu:
C-h k C-x C-f → "C-x C-f runs the command find-file"
C-h b → daftar semua binding di keymap aktif (buffer)Urutan prioritas minor mode > major mode > global — inilah kenapa paket bisa "mengambil alih" tombol tertentu.
Perintah inti: define-key:
(define-key global-map (kbd "C-c p") #'project-find-file)
(define-key global-map (kbd "C-c s") #'save-buffer)Atau tanpa kbd — gunakan vektor key:
(define-key global-map [?\C-c ?p] #'project-find-file)Perhatikan #'command (quote + sharp): membaca fungsi by reference, sehingga kalau fungsi di-remap/diganti, binding ikut mengikuti. global-set-key adalah alias singkat untuk define-key ke global-map:
(global-set-key (kbd "C-c p") #'project-find-file)C-c diikuti huruf adalah ruang bebas standar untuk kustomisasi pengguna — paket juga boleh memakai kombinasi tersebut, tapi jangan biarkan paket merebut kombinasi yang kalian pakai rutin. Untuk ruang milikmu sendiri:
(define-prefix-command 'my-map)
(global-set-key (kbd "C-c m") 'my-map)
(define-key my-map (kbd "b") #'ibuffer)
(define-key my-map (kbd "f") #'project-find-file)
(define-key my-map (kbd "d") #'dired)Sekarang C-c m b, C-c m f, C-c m d — satu titik masuk yang mudah diingat untuk kebiasaan kalian sendiri.
general.el menyederhanakan pembuatan keymap & prefix secara deklaratif — populer karena tulisannya jauh lebih padat:
(use-package general
:ensure t
:config
(general-create-definer my-leader
:prefix "C-c m")
(my-leader
"b" #'ibuffer
"f" #'project-find-file
"d" #'dired
"s" #'project-search)
(general-define-key
:states '(normal insert)
"C-s" #'isearch-forward))general-create-definer membuat leader sendiri; general-define-key bisa menargetkan state tertentu (di Evil) maupun keymap mode:
(general-define-key
:keymaps 'python-ts-mode-map
"C-c C-d" #'eldoc-doc-buffer)Note
Jika kalian memakai paket yang "merebut" binding yang kalian butuhkan, jangan langsung konflik — cek dulu dengan C-h k keymap mana yang menang, lalu timpa di keymap yang tepat. Menimpa di global-map hampir selalu cukup; menimpa di keymap mode bisa menimbulkan konflik tak terduga saat mode tersebut dimuat.
Emacs 30 menghadirkan which-key sebagai built-in — menampilkan perintah yang tersedia setelah menekan prefix key:
C-x (tahan sebentar)
→ popup: "C-f find-file C-b switch-to-buffer C-2 split-window-below ..."Aktifkan:
(require 'which-key)
(which-key-mode 1)Ini adalah "self-documenting" versi hidup: kalian tidak perlu menghafal — Emacs menampilkan menu sesuai konteks.
Evil (Extensible VI Layer) menghadirkan gaya modal editing Vim ke Emacs — mode normal/insert/visual, operator (d, c, y), motion (w, b, e), register, dan makro — sambil mempertahankan semua kekuatan Emacs (buffers, modes, paket, Elisp).
(use-package evil
:ensure t
:init (setq evil-want-keybinding nil)
:config
(evil-mode 1))Setelah aktif, editor berubah modal:
Esc / C-[ → masuk Normal state (navigasi & operator)
i → masuk Insert state (mengetik)
v / V → masuk Visual state (seleksi)
C-c → normal-state alias (tetap familiar bagi pengguna Emacs)Perintah Emacs tetap tersedia: dari Normal state, C-x C-f tetap membuka file. Evil hanya mengubah state, bukan menghapus Emacs.
(evil-define-key 'normal org-mode-map
(kbd "gt") #'org-next-link
(kbd "gT") #'org-previous-link)
(evil-define-key 'normal prog-mode-map
(kbd "K") #'eldoc-doc-buffer)evil-want-keybinding nil (di :init) menonaktifkan evil-mode-map bawaan agar evil-define-key dan general.el menang sepenuhnya — hindari duplikasi binding yang membingungkan.C-x/C-c tetap jalan dari Normal state — kalian tidak kehilangan apa pun.evil-escape-mode untuk transisi mode yang mulus.Tip
Jangan mengganti semua keybinding di hari pertama. Ubah satu atau dua binding yang paling sering kalian pakai, biasakan seminggu, lalu lanjut. Keybinding adalah investasi jangka panjang — yang nyaman dibangun bertahap, bukan revolusi sekali jalan.
Resep yang disarankan untuk memulai:
(use-package general
:ensure t
:config
(general-create-definer my-leader :prefix "C-c m")
(my-leader
"b" #'ibuffer
"f" #'project-find-file
"d" #'dired
"e" #'eshell
"g" #'magit-status))
;; Ganti yang paling sering diakses
(global-set-key (kbd "M-x") #'execute-extended-command)
(global-set-key (kbd "C-c C-r") #'revert-buffer)Satu pola yang banyak dipakai: jadikan C-s/C-r untuk search, C-p/C-n untuk prev/next, dan simpan prefix panjang untuk operasi yang jarang.
C-h m). Minor mode map menang atas global.C-c p untuk project & prettier) — prioritas minor/major mode menentukan pemenang. Gunakan C-h k untuk memverifikasi.kbd vs vektor: (kbd "C-x") vs [?\C-x] — keduanya valid; konsistenlah memakai kbd untuk keterbacaan.C-x C-s (save), C-x C-f (find-file) adalah kebiasaan universal — timpa hanya jika alasanmu sangat kuat dan konsisten di semua sesi.C-c: sebagian perintah Emacs memakai C-c sebagai prefix; di Evil, C-c default keluar ke Normal state. Set evil-want-C-c-scroll atau binding C-c dengan bijak.Pada episode 25 ini, kalian telah mengambil kendali penuh atas keyboard Emacs.
Inti yang harus dibawa pulang:
define-key / global-set-key menetapkan binding; C-h k memverifikasi.Di episode 26 selanjutnya, kita naik level ke Emacs Lisp lanjutan & makro keyboard — advice, hooks, keymap inheritance, dan makro F3/F4 untuk mengotomasi kerja berulang menjadi konfigurasi yang reusable. Sampai jumpa di episode 26!