Belajar Zsh - Konfigurasi .zshrc (Best Practice)
Episode 9 of 23

Belajar Zsh - Konfigurasi .zshrc (Best Practice)

Menata .zshrc yang rapi dan mudah dirawat: struktur modular dengan sourcing terpisah, pemilihan setopt yang tepat (autocd, extendedglob, hist_ignore_dups, noclobber, share_history), urutan inisialisasi yang benar, dan cara menghindari .zshrc yang membengkak menjadi spaghetti code

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

Pendahuluan

Setelah di episode 8 history dan navigasi kalian sudah mumpuni, pada episode ini kita merapikan rumah: konfigurasi .zshrc dengan best practice. .zshrc adalah file yang dibaca setiap kali shell interaktif dimulai — dan inilah titik di mana banyak pengguna Zsh membuat kesalahan: menumpuk semua pengaturan dalam satu file sepanjang ratusan baris, tanpa struktur, tanpa komentar, sehingga sulit dirawat dan lambat dimuat.

Episode ini tentang struktur dan disiplin. Kita akan membangun .zshrc modular, memahami setopt yang benar, dan menyusun urutan sourcing yang membuat konfigurasi deterministik. Konsep ini menjadi fondasi untuk semua episode berikutnya — termasuk optimasi startup di episode 21.

Anatomi .zshrc yang Baik

.zshrc yang baik selalu memuat lima bagian dalam urutan yang konsisten:

  1. Environment — variabel yang tidak berubah (EDITOR, LANG, HISTFILE).
  2. Options (setopt) — perilaku shell.
  3. Completioncompinit dan zstyle.
  4. Keybindingbindkey.
  5. Aliases & functions — pengingat untuk kerja cepat.
~/.zshrc (template dasar)
# 1. Environment
export EDITOR=nvim
export LANG=en_US.UTF-8
HISTFILE=~/.zsh_history
HISTSIZE=10000
SAVEHIST=10000
 
# 2. Options
setopt autocd
setopt extendedglob
setopt hist_ignore_dups
setopt hist_ignore_space
setopt share_history
setopt noclobber
 
# 3. Completion
autoload -Uz compinit && compinit
 
# 4. Keybinding
bindkey '^A' beginning-of-line
bindkey '^E' end-of-line
 
# 5. Aliases & functions
alias ls='ls --color=auto'
alias ll='ls -l'

Urutan ini penting: setopt harus datang sebelum compinit karena beberapa perilaku completion bergantung pada opsi shell.

Modular: Pisahkan ke File-File Kecil

Untuk konfigurasi yang besar, pecah .zshrc menjadi modul. Struktur yang umum:

Struktur direktori zsh
~/.zsh/
├── .zshrc           # entry point, memuat modul
├── env.zsh          # variabel environment
├── options.zsh      # semua setopt
├── completion.zsh   # compinit + zstyle
├── keybindings.zsh  # bindkey
├── aliases.zsh      # alias
└── functions.zsh    # fungsi

.zshrc menjadi sangat tipis — hanya memuat modul-modul tersebut:

~/.zshrc (modular)
# Entry point — load semua modul
for file in ~/.zsh/*.zsh(N); do
    source "$file"
done

Perhatikan (N) — glob qualifier (episode 5) yang membuat loop tidak error saat tidak ada file yang cocok. Inilah keunggulan Zsh: dukungan glob qualifier langsung di dalam loop source.

Tip

Beberapa framework (misalnya zsh-unplugged, prezto) memakai nama yang sama untuk plugin dan modul. Jika kalian memakai Oh My Zsh, modul kalian cukup ditaruh setelah plugins=(...) agar tidak tertimpa. Detail integrasi ini kita bahas di episode 12.

Memahami setopt Penting

setopt mengubah perilaku shell. Berikut yang paling sering dipakai di production:

autocd

autocd
setopt autocd
# ketik ~/projects langsung pindah ke sana tanpa `cd`

extendedglob

extendedglob
setopt extendedglob
# mengaktifkan operator ^, ~, (#i) dari episode 5

hist_ignore_dups dan hist_ignore_space

History hygiene
setopt hist_ignore_dups
setopt hist_ignore_space
# hilangkan duplikat; abaikan perintah berawalan spasi

share_history

Shared history
setopt share_history
# history tersinkron antar terminal (episode 8)

noclobber

noclobber mencegah redirect > menimpa file yang sudah ada:

noclobber
setopt noclobber
echo data > file.txt    # OK, file baru
echo lagi > file.txt    # ERROR: file exists (tidak menimpa)
echo lagi >! file.txt   # paksa menimpa dengan >!

Dengan noclobber, Zsh menolak menimpa file kecuali dengan >!. Ini mencegah kecelakaan menghapus data. Untuk append tetap pakai >> seperti biasa.

Options yang Perlu Dipertimbangkan

Selain yang sudah dibahas, evaluasi opsi-opsi ini:

Set lain yang berguna
setopt notify              # laporkan job selesai langsung
setopt no_beep             # matikan bunyi bel
setopt auto_pushd          # cd otomatis mendorong ke stack (episode 8)
setopt prompt_subst        # izinkan substitusi dalam prompt
setopt interactivecomments # izinkan # komentar di prompt interaktif
setopt correct_all         # koreksi ejaan perintah (contoh: git stattus)
setopt nomatch             # glob tidak match → literal (bukan error)

correct_all adalah fitur Zsh yang menawarkan perbaikan ejaan saat perintah typo. nomatch mengubah perilaku glob yang error di episode 4 menjadi literal seperti bash.

Urutan Sourcing yang Benar

Ada dua kesalahan umum soal urutan:

  1. Modul dimuat sebelum compinit — completion function (_*) yang dimuat plugin tidak akan ter-index. Aturan: compinit dipanggil setelah plugin dimuat (Oh My Zsh mengurus ini otomatis), tetapi sebelum konfigurasi zstyle yang bergantung padanya.
  2. Alias ditimpa — jika alias didefinisikan sebelum plugin dimuat, plugin bisa menimpa. Definisikan alias yang "jangan diganggu" setelah pemuatan plugin.
~/.zshrc (urutan benar)
# 1. Environment
source ~/.zsh/env.zsh
 
# 2. Options
source ~/.zsh/options.zsh
 
# 3. Plugin (Oh My Zsh / zinit) — BUKAN bagian ini episode 12
 
# 4. Completion — SETELAH plugin
source ~/.zsh/completion.zsh
 
# 5. Keybinding, alias, functions
source ~/.zsh/keybindings.zsh
source ~/.zsh/aliases.zsh
source ~/.zsh/functions.zsh

Warning

Kesalahan paling umum: memanggil compinit di bagian awal file, lalu memuat plugin yang juga memanggil compinit atau menambahkan completion. Hasilnya completion rusak atau dobel. Pastikan compinit dipanggil sekali, setelah semua plugin selesai dimuat.

Common Pitfalls

  • .zshrc membengkak — 500+ baris tanpa struktur; pecah ke modul atau pindahkan ke Oh My Zsh.
  • Error di .zshrc tak terlihat — Zsh menampilkan error sourcing, tapi mudah terlewat; uji dengan zsh -i -c 'echo ok' (episode 21).
  • Sulit dibedakan shell mana — jika .zshrc dijalankan di shell lain (misal via sh), syntax bisa beda; selalu test dengan zsh -n (episode 16).
  • Over-configure — terlalu banyak setopt tanpa memahami efeknya justru membuat perilaku tidak terduga; mulai minimal, tambah saat perlu.

Penutup

Inti yang harus dibawa pulang:

  • .zshrc yang baik: environment → setopt → completion → keybinding → alias/fungsi.
  • Pisahkan ke modul (env.zsh, options.zsh, completion.zsh, dll) untuk kemudahan rawat.
  • Kenali setopt inti: autocd, extendedglob, hist_ignore_dups, noclobber, share_history.
  • compinit dipanggil sekali, setelah plugin dimuat.

Di episode 10 selanjutnya kita akan membahas alias dan functions — simple alias, global alias alias -g, suffix alias alias -s, shortcut git, sampai fungsi Zsh: deklarasi, $0/$@/$#, autoload, dan struktur direktori fpath untuk memuat fungsi on-demand. Sampai jumpa di episode 10!