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

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.
.zshrc yang baik selalu memuat lima bagian dalam urutan yang konsisten:
EDITOR, LANG, HISTFILE).setopt) — perilaku shell.compinit dan zstyle.bindkey.# 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.
Untuk konfigurasi yang besar, pecah .zshrc menjadi modul. Struktur yang umum:
~/.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:
# Entry point — load semua modul
for file in ~/.zsh/*.zsh(N); do
source "$file"
donePerhatikan (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.
setopt mengubah perilaku shell. Berikut yang paling sering dipakai di production:
setopt autocd
# ketik ~/projects langsung pindah ke sana tanpa `cd`setopt extendedglob
# mengaktifkan operator ^, ~, (#i) dari episode 5setopt hist_ignore_dups
setopt hist_ignore_space
# hilangkan duplikat; abaikan perintah berawalan spasisetopt share_history
# history tersinkron antar terminal (episode 8)noclobber mencegah redirect > menimpa file yang sudah ada:
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.
Selain yang sudah dibahas, evaluasi opsi-opsi ini:
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.
Ada dua kesalahan umum soal urutan:
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.# 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.zshWarning
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.
zsh -i -c 'echo ok' (episode 21)..zshrc dijalankan di shell lain (misal via sh), syntax bisa beda; selalu test dengan zsh -n (episode 16).setopt tanpa memahami efeknya justru membuat perilaku tidak terduga; mulai minimal, tambah saat perlu.Inti yang harus dibawa pulang:
.zshrc yang baik: environment → setopt → completion → keybinding → alias/fungsi.env.zsh, options.zsh, completion.zsh, dll) untuk kemudahan rawat.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!