Membangun fondasi konfigurasi permanen: struktur ~/.emacs.d/init.el, menulis kustomisasi dasar dengan setq dan custom-set-variables, memahami use-package yang menjadi standar sejak Emacs 29.1, pola config terstruktur per-feature, dan membaca error serta log lewat C-h e.

Sampai episode 9, semua latihan berlangsung di sesi yang hilang saat Emacs ditutup. Episode 10 mengubah itu: kalian membangun init file — file yang dimuat setiap Emacs menyala. Inilah konfigurasi = program yang dijanjikan episode 1, dan setelah ini Emacs kalian akan terasa seperti "rumah".
Kenapa ini penting? Karena konfigurasi yang baik adalah investasi jangka panjang: Emacs 30 yang kalian tulis hari ini tetap berjalan hampir tanpa perubahan di Emacs 31, 32, dan seterusnya. Init file yang terstruktur juga membuat debugging jauh lebih mudah — bukan satu file raksasa, melainkan modul yang jelas.
Emacs membaca konfigurasi dari ~/.emacs.d/init.el (atau ~/.config/emacs/init.el di distro modern). Cara termudah menemukannya:
C-h v user-emacs-directory RETBuat direktori dan file pertamanya:
mkdir -p ~/.emacs.d
touch ~/.emacs.d/init.elBuka dengan C-x C-f, lalu tulis pengaturan dasar:
;;; init.el --- Konfigurasi Emacs pribadi -*- lexical-binding: t; -*-
;;; Commentary: Semua pengaturan dimuat berurutan dari atas ke bawah.
;;; Code:
(setq-default tab-width 4)
(setq inhibit-startup-screen t) ; skip layar welcome
(global-display-line-numbers-mode 1) ; nomor baris global
(setq make-backup-files nil) ; nonaktifkan backup files (episode 23)
(setq ring-bell-function #'ignore) ; matikan bel
(provide 'init)
;;; init.el ends hereSimpan (C-x C-s) dan restart Emacs (atau M-x load-file RET ~/.emacs.d/init.el). Layar welcome hilang, nomor baris muncul — config pertama kalian bekerja.
M-x customize menyimpan pengaturan ke blok custom-set-variables di init file:
(custom-set-variables
'(c-basic-offset 4)
'(scroll-margin 3)
'(package-archives '(("gnu" . "https://elpa.gnu.org/packages/")
("melpa" . "https://melpa.org/packages/"))))Blok ini jangan diedit manual — Emacs menimpanya saat customize dipakai. Untuk variabel yang kalian atur sendiri, gunakan setq biasa (episode 9). Aturan praktisnya: setq untuk kustomisasi pribadi, customize-set-variable untuk variabel yang punya UI customize.
use-package — macro yang dibundel sejak Emacs 29.1 — mendeklarasikan konfigurasi paket secara deklaratif dan lazy (paket baru dimuat saat benar-benar dibutuhkan). Sebelum use-package, orang menulis (require 'xyz) + setq + binding di mana-mana; sekarang semuanya satu blok:
(use-package magit
:ensure t
:defer t
:config
(setq magit-diff-refine-hunk t))Membaca blok di atas: "pastikan magit terinstall (:ensure t), jangan load dulu sampai dipakai (:defer t), dan setelah dimuat jalankan config ini". Emacs 29+ punya use-package bawaan, jadi tidak perlu install apa pun.
| Keyword | Makna |
|---|---|
:ensure t | Install otomatis bila belum ada (butuh package.el, episode 11) |
:defer t | Load lazy — hanya saat file/paket memanggilnya |
:init | Evaluasi sebelum paket dimuat (variabel default) |
:config | Evaluasi setelah paket dimuat (binding, setq akhir) |
:hook | Pasang hook — :hook (python-mode . my-func) |
:bind | Definisi keybinding — :bind ("C-c p" . project-find-file) |
:custom | Set variabel paket — :custom (tab-width 4) |
Hindari satu init.el 500 baris. Pisahkan per feature:
~/.emacs.d/
├── init.el → bootstrap: package setup, use-package settings, (require 'my-modules)
├── lisp/
│ ├── my-org.el → konfigurasi Org-mode
│ ├── my-eglot.el → konfigurasi Eglot/LSP
│ └── my-ui.el → tema, modeline, fontSetiap modul diakhiri dengan (provide 'my-org) dan dipanggil dari init.el:
(add-to-list 'load-path (expand-file-name "lisp" user-emacs-directory))
(require 'my-org)
(require 'my-eglot)Episode 27 akan menambahkan teknik defer agar startup tetap cepat meski modul banyak.
Warning
Aturan pertama debugging config: selalu bisa menjalankan Emacs bersih. Kapan pun config bikin Emacs macet di startup, jalankan emacs -Q (tanpa init sama sekali) untuk memastikan masalahnya di init kalian — bukan di core Emacs. Pola ini akan menyelamatkan kalian berkali-kali.
Saat init file error, Emacs biasanya masih jalan — tapi sesuatu tidak bekerja. Penyelidikan standar:
C-h e → buka *Messages* — pesan error terakhir tercatat di siniError load ditampilkan seperti:
Warning (initialization): An error occurred while loading
~/.emacs.d/init.el: Symbol's value as variable is void: tabContoh di atas berarti tab dipakai sebagai variabel tapi tidak ada — biasanya karena salah quote atau salah nama. Berikut prosedur debug cepat:
*Messages* (C-h e), baca pesan terakhir.*scratch* untuk melihat error lebih jelas.M-x load-file RET init.el.Blok use-package untuk pengalaman dasar yang nyaman:
;;; init.el --- Setup awal yang direkomendasikan -*- lexical-binding: t; -*-
(require 'package)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))
(package-initialize)
;;; Pengaturan dasar
(setq-default tab-width 4
indent-tabs-mode nil)
(global-display-line-numbers-mode 1)
(setq backup-directory-alist '(("." . "~/.emacs.d/backups")))
(setq create-lockfiles nil)
;;; Package yang membantu sejak dini
(use-package which-key
:ensure t
:defer t
:config (which-key-mode 1))
(use-package recentf
:config (recentf-mode 1))
(provide 'init)
;;; init.el ends herewhich-key menampilkan kemungkinan lanjutan saat menekan prefix (C-x diikuti jeda) — sangat membantu mengingat shortcut. Episode 11 akan mengubah bagian require 'package menjadi setup yang lebih rapi dengan package-install dan straight.el.
M-x load-file memuat ulang definisi — biasanya aman, tapi jangan dobel add-to-list untuk variabel yang harus unik.setq sebelum paket dimuat: variabel paket yang di-setq sebelum load kadang ditimpa saat paket di-load. Gunakan :custom atau taruh di :config.*Messages*: 90% misteri config terjelaskan di sana. Cek dulu sebelum googling.use-package-always-ensure) mungkin sudah usang. Pastikan sumbernya memakai keyword yang valid di Emacs 29+.Pada episode 10 ini, kalian telah membangun fondasi konfigurasi permanen.
Inti yang harus dibawa pulang:
emacs -Q adalah emergency escape kalian.setq untuk kustomisasi pribadi, custom-set-variables untuk hasil customize.use-package (bawaan Emacs 29+) membuat config deklaratif & lazy: :ensure, :defer, :hook, :bind, :custom.~/.emacs.d/lisp/.C-h e membaca *Messages* — saksi utama debugging init.Di episode 11 selanjutnya, kita membahas package management — package-refresh-contents, package-install, arsitektur archive ELPA/non-GNU/MELPA, verifikasi tanda tangan paket, dan alternatif modern straight.el untuk reproduksibilitas config. Sampai jumpa di episode 11!