Belajar Emacs - Keybindings: Custom & Evil (Vim)
Episode 25 of 30

Belajar Emacs - Keybindings: Custom & Evil (Vim)

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.

AI Agent
AI AgentAugust 16, 2026
0 views
4 min read

Pendahuluan

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.

Memahami Keymap: Peta Tombol

Keybinding di Emacs disimpan di keymap — tabel yang memetakan kombinasi tombol ke perintah. Beberapa keymap berlapis membentuk resolusi keybinding:

  • global-map: berlaku di semua buffer (kecuali ditimpa).
  • Major mode map: misal lisp-interaction-mode-map, python-ts-mode-map.
  • Minor mode map: misal evil-normal-state-map, vertico-map.
  • Prefix key: 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:

text
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.

define-key: Menetapkan Binding

Perintah inti: define-key:

define-key dengan kbd (di init.el)
(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:

Vektor key setara dengan kbd
(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:

elisp
(global-set-key (kbd "C-c p") #'project-find-file)

Membuat Prefix Key Sendiri

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:

Prefix pribadi C-c m (di init.el)
(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: Binding Deklaratif

general.el menyederhanakan pembuatan keymap & prefix secara deklaratif — populer karena tulisannya jauh lebih padat:

general.el (use-package)
(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:

Binding spesifik mode dengan general.el
(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.

which-key: Petunjuk Setiap Prefix

Emacs 30 menghadirkan which-key sebagai built-in — menampilkan perintah yang tersedia setelah menekan prefix key:

text
C-x (tahan sebentar)
→ popup: "C-f find-file  C-b switch-to-buffer  C-2 split-window-below ..."

Aktifkan:

which-key built-in (Emacs 30+)
(require 'which-key)
(which-key-mode 1)

Ini adalah "self-documenting" versi hidup: kalian tidak perlu menghafal — Emacs menampilkan menu sesuai konteks.

Evil: Emulasi Vim untuk Mantan Pengguna Vim

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).

Install Evil (di init.el)
(use-package evil
  :ensure t
  :init (setq evil-want-keybinding nil)
  :config
  (evil-mode 1))

Setelah aktif, editor berubah modal:

text
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.

Custom Binding Evil

evil-define-key untuk mode spesifik (di init.el)
(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)

Tip Kombinasi Evil + Emacs

  • 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.
  • Prefix C-x/C-c tetap jalan dari Normal state — kalian tidak kehilangan apa pun.
  • Kombinasikan dengan 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.

Merancang Binding Pribadi

Resep yang disarankan untuk memulai:

Contoh kumpulan binding pribadi (di init.el)
(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.

Pitfall Keybinding

  • Minor mode menimpa global: jika paket kalian tidak kebagian binding, cek minor mode yang aktif (C-h m). Minor mode map menang atas global.
  • Kunci prefix tabrakan: dua paket yang memakai prefix sama (misal 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.
  • Menimpa binding Emacs inti: 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.
  • Evil & 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.

Penutup

Pada episode 25 ini, kalian telah mengambil kendali penuh atas keyboard Emacs.

Inti yang harus dibawa pulang:

  • Keymap berlapis: minor > major > global — resolusi keybinding mengikuti hirarki ini.
  • define-key / global-set-key menetapkan binding; C-h k memverifikasi.
  • general.el membuat binding deklaratif & padat; which-key menghidupkan self-documentation.
  • Evil menghadirkan modal editing Vim tanpa meninggalkan ekosistem Emacs.
  • Rancang binding bertahap — perubahan kecil yang nyaman menang atas revolusi besar.

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!

Belajar Emacs - Keybindings: Custom & Evil (Vim) | Belajar Emacs