Belajar Emacs - Init Config & use-package
Episode 10 of 30

Belajar Emacs - Init Config & use-package

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.

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

Pendahuluan

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.

Lokasi & Struktur Dasar

Emacs membaca konfigurasi dari ~/.emacs.d/init.el (atau ~/.config/emacs/init.el di distro modern). Cara termudah menemukannya:

text
C-h v user-emacs-directory RET

Buat direktori dan file pertamanya:

Buat init.el pertama
mkdir -p ~/.emacs.d
touch ~/.emacs.d/init.el

Buka dengan C-x C-f, lalu tulis pengaturan dasar:

~/.emacs.d/init.el — fondasi minimal
;;; 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 here

Simpan (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.

Custom-Set-Variables & Variabel "User Option"

M-x customize menyimpan pengaturan ke blok custom-set-variables di init file:

Blok custom-set-variables
(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: Standar Modern

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:

Contoh blok use-package
(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 use-package yang Paling Dipakai

KeywordMakna
:ensure tInstall otomatis bila belum ada (butuh package.el, episode 11)
:defer tLoad lazy — hanya saat file/paket memanggilnya
:initEvaluasi sebelum paket dimuat (variabel default)
:configEvaluasi setelah paket dimuat (binding, setq akhir)
:hookPasang hook — :hook (python-mode . my-func)
:bindDefinisi keybinding — :bind ("C-c p" . project-find-file)
:customSet variabel paket — :custom (tab-width 4)

Struktur Config yang Terorganisir

Hindari satu init.el 500 baris. Pisahkan per feature:

text
~/.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, font

Setiap modul diakhiri dengan (provide 'my-org) dan dipanggil dari init.el:

Memuat modul 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.

Membaca Error: C-h e & Messages

Saat init file error, Emacs biasanya masih jalan — tapi sesuatu tidak bekerja. Penyelidikan standar:

text
C-h e   →  buka *Messages* — pesan error terakhir tercatat di sini

Error load ditampilkan seperti:

text
Warning (initialization): An error occurred while loading
~/.emacs.d/init.el: Symbol's value as variable is void: tab

Contoh di atas berarti tab dipakai sebagai variabel tapi tidak ada — biasanya karena salah quote atau salah nama. Berikut prosedur debug cepat:

  1. Buka *Messages* (C-h e), baca pesan terakhir.
  2. Cari nama file/baris yang disebutkan error.
  3. Evaluasi ulang blok tersebut di *scratch* untuk melihat error lebih jelas.
  4. Perbaiki, simpan, M-x load-file RET init.el.

Konfigurasi Pertama yang Direkomendasikan

Blok use-package untuk pengalaman dasar yang nyaman:

~/.emacs.d/init.el — pengalaman dasar
;;; 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 here

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

Pitfall Init File

  • Memuat dua kali: 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.
  • Mengabaikan *Messages*: 90% misteri config terjelaskan di sana. Cek dulu sebelum googling.
  • Konfigurasi yang menyalin mentah dari internet: syntax use-package di artikel lama (misal use-package-always-ensure) mungkin sudah usang. Pastikan sumbernya memakai keyword yang valid di Emacs 29+.

Penutup

Pada episode 10 ini, kalian telah membangun fondasi konfigurasi permanen.

Inti yang harus dibawa pulang:

  • Init file dimuat tiap start; 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.
  • Pisahkan config per feature di ~/.emacs.d/lisp/.
  • C-h e membaca *Messages* — saksi utama debugging init.

Di episode 11 selanjutnya, kita membahas package managementpackage-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!

Belajar Emacs - Init Config & use-package | Belajar Emacs