Membangun prompt Zsh yang informatif dan cantik: memahami PROMPT, PS1, RPROMPT, dan PROMPT2 beserta prompt escapes, menampilkan git branch langsung di prompt dengan vcs_info, lalu menguasai ZLE — bindkey untuk keybinding emacs/vi, widget seperti history-search-backward, dan custom widget pertama

Setelah di episode 6 completion system kalian sudah hidup, pada episode ini kita membahas bagian yang paling terlihat dari Zsh setiap hari: prompt dan line editor. Prompt adalah "wajah" shell kalian — dan Zsh memberi kontrol penuh atas wajah itu, dari kiri (PROMPT), kanan (RPROMPT), sampai prompt sekunder saat menulis multi-line.
Tapi prompt hanyalah setengah cerita. Di balik prompt ada ZLE (Zsh Line Editor) — mesin yang memproses setiap ketikan kalian. Menguasai bindkey dan widget akan mengubah kebiasaan mengetik: dari menekan panah berkali-kali menjadi satu kombinasi tombol yang pintar.
Zsh punya beberapa variabel prompt dengan peran berbeda:
| Variabel | Fungsi |
|---|---|
PROMPT/PS1 | Prompt utama (kiri) |
RPROMPT | Prompt kanan |
PROMPT2/PS2 | Prompt kelanjutan (multi-line) |
SPROMPT | Prompt koreksi spelling |
PS3 | Prompt untuk select |
Semua ini adalah string yang berisi prompt escapes — urutan %X yang dirender sebagai warna, teks, atau informasi:
%n # username
%m # hostname (short)
%~ # direktori aktif (dengan ~)
%1~ # hanya 1 segmen terakhir path
%# # # jika root, % jika user biasa
%F{green}...%f # teks hijauPROMPT='%F{green}%n@%m%f:%F{blue}%~%f%# 'Hasilnya kurang lebih: devnull@host:~/projects% . Warna hijau untuk user@host, biru untuk path, dan % penutup. Perhatikan tanda kutip tunggal — penting agar % tidak diinterpretasi saat assignment.
RPROMPT menempel di sisi kanan terminal. Ideal untuk informasi sekunder yang tidak mengganggu:
RPROMPT='%F{yellow}%T%f'Sekarang jam akan tampil di kanan atas setiap kali prompt muncul. Kombinasi populer: jam di RPROMPT, git branch di kiri, path di kanan — semuanya bisa.
Saat menulis perintah multi-line (misalnya for loop tanpa menutup done), Zsh menggunakan PROMPT2. Set indentation yang jelas agar terlihat rapi:
PROMPT2='%F{cyan}%_>%f '%_ menampilkan token yang sedang menunggu penutupan (misalnya for, if, {). Ini membantu kalian tahu di level mana sedang menulis.
Menampilkan git branch di prompt membutuhkan eksekusi git setiap prompt — mahal. Solusi Zsh: vcs_info, modul bawaan yang membaca informasi VCS secara efisien.
autoload -Uz vcs_info
precmd() { vcs_info }
zstyle ':vcs_info:git:*' formats '%F{green}(%b)%f '
zstyle ':vcs_info:*:*' check-for-changes true
PROMPT='%F{blue}%~%f ${vcs_info_msg_0_}> 'Penjelasan:
autoload -Uz vcs_info mendaftarkan modul.precmd() adalah function yang dijalankan Zsh setiap kali sebelum menampilkan prompt — tempat ideal untuk memperbarui info prompt.zstyle ':vcs_info:git:*' formats '%F{green}(%b)%f ' mengatur format: %b adalah nama branch.${vcs_info_msg_0_} — variabel yang diisi vcs_info dengan format yang cocok.Tip
check-for-changes true membuat vcs_info juga menampilkan indikator file berubah, misalnya %u (unmerged) dan %c (staged). Tambahkan ke formats: '%F{green}(%b)%f%u%c ' untuk info lengkap. Hati-hati: opsi ini memanggil git tambahan, kita optimalkan di episode 21.
Hasilnya prompt di dalam repo git terlihat seperti:
~/projects/devvnull.vercel.app (main)> ZLE adalah engine editing Zsh. Ia memisahkan binding ke dalam map keymap — yang paling dikenal adalah emacs (default) dan viins/vicmd (mode vi). Cek keymap aktif:
bindkey
echo $KEYMAP # emacs atau viinsbindkey tanpa argumen menampilkan semua binding. Untuk melihat binding tombol spesifik:
bindkey '^A' # ^A → beginning-of-line
bindkey '^R' # ^R → history-incremental-search-backwardGanti atau tambah binding dengan bindkey <key> <widget>:
autoload -Uz up-line-or-beginning-search
autoload -Uz down-line-or-beginning-search
bindkey '^[[A' up-line-or-beginning-search
bindkey '^[[B' down-line-or-beginning-searchSetelah ini, menekan panah atas tidak hanya naik satu baris — ia mencari perintah history yang diawali dengan apa yang sudah diketik. Ketik git, tekan panah atas, dan kalian akan melihat perintah git terakhir yang cocok.
Widget adalah function yang diregistrasi ke ZLE dan bisa diikat ke tombol. Zsh punya ratusan widget bawaan:
| Widget | Fungsi |
|---|---|
accept-line | Menjalankan perintah (default Enter) |
beginning-of-line | Lompat ke awal baris (Ctrl-A) |
end-of-line | Lompat ke akhir baris (Ctrl-E) |
history-search-backward | Cari history dengan prefix |
kill-line | Hapus sampai akhir baris |
undo | Batalkan perubahan baris (Ctrl-_) |
Cek semua widget bawaan:
zle -l | head -20Kita buat widget sendiri — menghapus trailing whitespace dari baris saat ini:
zle-widget-trim() {
local buf=${BUFFER##[[:space:]]##}
buf=${buf%%[[:space:]]##}
BUFFER=$buf
CURSOR=${#buf}
zle redisplay
}
zle -N zle-widget-trim
bindkey '^T' zle-widget-trimBUFFER dan CURSOR adalah variabel khusus ZLE yang mewakili isi baris dan posisi kursor. zle -N meregistrasi function sebagai widget, lalu kita ikat ke Ctrl-T.
Zsh mendukung dua style editing: emacs (default) dan vi. Mode vi memisahkan mode insert (viins) dan command (vicmd):
bindkey -vSetelah bindkey -v, kalian bisa Esc untuk masuk mode command, lalu pakai h/j/k/l, dd, dw, cw, dan semua muscle memory vi. Banyak developer memilih ini agar konsisten dengan vim/neovim.
Warning
Saat dalam mode vi, echo $KEYMAP berubah dari viins menjadi vicmd saat kalian menekan Esc. Prompt custom (misalnya powerlevel10k) sering menampilkan indikator mode dengan hook zle-keymap-select. Jika binding kalian "hilang" di mode vi, cek bahwa ia terdaftar di keymap yang benar.
precmd atau setopt promptsubst bila prompt mengandung substitusi.%; kutip ganda akan mengekspansi % ke variabel.zle -N sebelum bindkey ke widget custom.Inti yang harus dibawa pulang:
PROMPT, RPROMPT, PROMPT2 adalah variabel prompt; isi dengan prompt escapes %n, %~, %F{...}.vcs_info + precmd menampilkan git branch di prompt tanpa menulis perintah git manual.bindkey mengikat tombol ke widget, mode emacs vs vi.zle -N + bindkey.Di episode 8 selanjutnya kita akan membahas history dan navigasi — mengoptimalkan HISTSIZE, SAVEHIST, HISTFILE, shared history lintas terminal, pencarian dengan fc/history dan Ctrl-R, lalu navigasi cepat dengan autocd, cdpath, pushd/popd, sampai integrasi zoxide. Sampai jumpa di episode 8!