Belajar Emacs - Daemon & emacsclient
Episode 24 of 30

Belajar Emacs - Daemon & emacsclient

Mengubah Emacs menjadi layanan yang selalu siap: menjalankan emacs --daemon, membuka buffer di frame/window yang sudah ada dengan emacsclient -c/-t, mengintegrasikan emacsclient sebagai EDITOR untuk git dan perintah shell, serta membangun workflow startup instan yang hemat memori.

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

Pendahuluan

Satu keluhan paling umum tentang Emacs (terutama sebelum native compilation): startup yang lambat — 1-3 detik setiap kali membuka Emacs. Episode 24 menyelesaikan masalah itu secara arsitektural: daemon Emacs berjalan di latar belakang sekali, dan emacsclient menyambung ke sesi itu dalam hitungan milidetik.

Mengapa penting? Karena kalau membuka file butuh instan, Emacs menjadi default editor untuk segalanyagit commit, crontab -e, EDITOR=..., semua perintah shell. Tidak ada lagi alasan "tunggu dulu, buka Emacs dulu". Ini juga alasan utama mengapa daemon adalah pola yang dipakai pengguna Emacs berpengalaman di produksi.

Konsep Daemon

100%
  • Daemon = satu proses Emacs tanpa antarmuka, hidup di latar belakang.
  • emacsclient = client yang menyambung ke daemon untuk membuka buffer baru di frame yang sudah ada.
  • Semua frame berbagi satu set buffer — menyimpan di satu frame langsung terlihat di frame lain.

Menjalankan Daemon

Mulai daemon Emacs
emacs --daemon

Verifikasi:

Cek daemon berjalan
emacsclient -n -e "(daemonp)"

Output t berarti daemon aktif. Otomatiskan di init shell (.zshrc):

Auto-start daemon di ~/.zshrc
pgrep -f "emacs --daemon" > /dev/null || emacs --daemon &

emacsclient: Membuka Buffer

emacsclient -c ~/proyek/app.py
FlagMakna
-cBuat frame baru (window OS baru)
-tFrame dalam terminal yang memanggil
-nNo-wait: jangan blokir shell sampai frame ditutup
-eJalankan ekspresi Elisp, misal -e "(find-file \"/tmp/x\")"
-a ""Alternate editor: kalau daemon mati, jalankan Emacs baru (-a emacs)

emacsclient -a "" file adalah idiom yang sangat berguna: kalau daemon tidak berjalan, ia menyalakan Emacs biasa otomatis.

Alias Praktis

Tambahkan ke shell kalian:

Alias emacsclient di ~/.zshrc
alias e="emacsclient -n -c"     # buka file di frame GUI baru
alias et="emacsclient -t"       # buka di terminal
alias ek="emacsclient -e '(kill-emacs)'"   # matikan daemon

Integrasi EDITOR: Git & Perintah Shell

Dengan daemon, EDITOR=emacsclient membuat semua tool menghormati Emacs:

Set EDITOR untuk emacsclient
export EDITOR="emacsclient -c"
export VISUAL="emacsclient -c"

Sekarang git commit membuka buffer commit di frame Emacs yang sudah ada — bukan di editor baru. Setelah menulis pesan, C-x # (server-edit) menutup frame dan memberi tahu git selesai:

text
git commit → Emacs membuka buffer pesan → tulis → C-x # → commit selesai

Warning

Perintah yang memanggil $EDITOR dan menunggu selesai (git commit, crontab -e, kubectl edit) harus menunggu emacsclient selesai. Jangan pakai -n untuk itu — gunakan emacsclient -c (blokir) dan akhiri dengan C-x #. Memakai -n membuat git commit menganggap pesan kosong.

Workflow Startup Instan

Setelah daemon aktif:

text
1. Shell: emacsclient -c → frame Emacs langsung muncul (tanpa loading)
2. git commit            → buffer commit di frame yang ada
3. crontab -e            → crontab terbuka di Emacs
4. kubectl edit deploy   → YAML terbuka di Emacs
5. e ~/catatan.org       → alias membuka file cepat

Semua operasi < 0,1 detik. Init file dimuat sekali saat daemon lahir — bukan setiap kali buka frame. Startup lambat bukan masalah lagi.

Daemon + Server Mode

Catatan: beberapa orang memakai M-x server-start (server-mode) tanpa daemon — Emacs berjalan normal, dan emacsclient dari shell menyambung ke sesi itu. Pola daemon hanyalah versi "berjalan tanpa frame". Keduanya menggunakan mekanisme server yang sama:

Aktifkan server-mode di init.el
(server-start)   ; izinkan emacsclient menyambung ke sesi ini

Ini memungkinkan emacsclient bekerja walau Emacs kalian berjalan sebagai aplikasi biasa.

Memory & Resource: Manajemen Daemon

Daemon hidup selama session — konsumsi memori mengikuti buffer yang terbuka. Praktik sehat:

  • Jangan menumpuk buffer tak terpakai: M-x ibufferd x untuk buffer mati.
  • (setq server-kill-new-buffers t) — buffer yang dibuka emacsclient dihapus saat frame ditutup (jika tanpa perubahan).
  • Matikan daemon saat tidak dipakai lama: emacsclient -e "(kill-emacs)".

Pitfall Daemon & emacsclient

  • Init file ganda: init dimuat sekali oleh daemon. Edit init lalu M-x load-file di frame mana pun — tidak perlu restart daemon untuk sebagian besar perubahan.
  • -n dan git: jangan -n untuk tool yang menunggu editor (lihat warning di atas).
  • Daemon tidak menemukan display: daemon yang dimulai dari shell tanpa DISPLAY bisa gagal buat frame GUI. Jalankan daemon dari sesi grafis, atau gunakan emacs --daemon setelah login.
  • Beberapa daemon: pastikan hanya satu emacs --daemon berjalan (pgrep -f "emacs --daemon"). Dua daemon = dua set buffer yang terpisah, membingungkan.
  • emacsclient -t di terminal remote: membutuhkan frame tty — di sesi SSH dengan TERM yang benar, ini bekerja (dan Tramp dari episode 18 juga memungkinkan frame tersebut).

Penutup

Pada episode 24 ini, kalian telah mengubah Emacs menjadi layanan yang selalu siap.

Inti yang harus dibawa pulang:

  • emacs --daemon menjalankan satu proses; emacsclient -c/-t menyambung dalam milidetik.
  • emacsclient -a "" file adalah idiom aman (fallback ke Emacs biasa).
  • Set EDITOR/VISUAL ke emacsclient — git, crontab, kubectl semua memakai Emacs.
  • Akhiri buffer editor yang dipanggil tool dengan C-x # (server-edit).
  • server-start mengaktifkan mekanisme yang sama tanpa daemon; kelola memori dengan ibuffer + server-kill-new-buffers.

Di episode 25 selanjutnya, kalian mengambil kendali penuh atas tombol: keybindings custom & Evil (Vim)define-key, general.el untuk mengatur binding secara deklaratif, dan Evil mode untuk mantan pengguna Vim yang ingin gaya modal. Sampai jumpa di episode 25!

Belajar Emacs - Daemon & emacsclient | Belajar Emacs