Belajar Zsh - Prompt, RPROMPT & Line Editor
Episode 7 of 23

Belajar Zsh - Prompt, RPROMPT & Line Editor

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

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

Pendahuluan

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.

Anatomi Prompt Zsh

Zsh punya beberapa variabel prompt dengan peran berbeda:

VariabelFungsi
PROMPT/PS1Prompt utama (kiri)
RPROMPTPrompt kanan
PROMPT2/PS2Prompt kelanjutan (multi-line)
SPROMPTPrompt koreksi spelling
PS3Prompt untuk select

Semua ini adalah string yang berisi prompt escapes — urutan %X yang dirender sebagai warna, teks, atau informasi:

Prompt escapes dasar
%n    # username
%m    # hostname (short)
%~    # direktori aktif (dengan ~)
%1~   # hanya 1 segmen terakhir path
%#    # # jika root, % jika user biasa
%F{green}...%f   # teks hijau

PROMPT Pertama

Set PROMPT dasar
PROMPT='%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: Prompt Kanan

RPROMPT menempel di sisi kanan terminal. Ideal untuk informasi sekunder yang tidak mengganggu:

Set RPROMPT
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.

PROMPT2: Prompt Kelanjutan

Saat menulis perintah multi-line (misalnya for loop tanpa menutup done), Zsh menggunakan PROMPT2. Set indentation yang jelas agar terlihat rapi:

Set PROMPT2
PROMPT2='%F{cyan}%_>%f '

%_ menampilkan token yang sedang menunggu penutupan (misalnya for, if, {). Ini membantu kalian tahu di level mana sedang menulis.

vcs_info: Git Branch di Prompt

Menampilkan git branch di prompt membutuhkan eksekusi git setiap prompt — mahal. Solusi Zsh: vcs_info, modul bawaan yang membaca informasi VCS secara efisien.

Aktifkan vcs_info
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:

  1. autoload -Uz vcs_info mendaftarkan modul.
  2. precmd() adalah function yang dijalankan Zsh setiap kali sebelum menampilkan prompt — tempat ideal untuk memperbarui info prompt.
  3. zstyle ':vcs_info:git:*' formats '%F{green}(%b)%f ' mengatur format: %b adalah nama branch.
  4. ${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:

Prompt dengan git branch
~/projects/devvnull.vercel.app (main)> 

ZLE: Zsh Line Editor

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:

Cek keymap aktif
bindkey
echo $KEYMAP   # emacs atau viins

bindkey tanpa argumen menampilkan semua binding. Untuk melihat binding tombol spesifik:

Cek satu keybinding
bindkey '^A'      # ^A → beginning-of-line
bindkey '^R'      # ^R → history-incremental-search-backward

Mengubah Keybinding dengan bindkey

Ganti atau tambah binding dengan bindkey <key> <widget>:

Bind history search ke tombol panah
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-search

Setelah 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: Unit Fungsional ZLE

Widget adalah function yang diregistrasi ke ZLE dan bisa diikat ke tombol. Zsh punya ratusan widget bawaan:

WidgetFungsi
accept-lineMenjalankan perintah (default Enter)
beginning-of-lineLompat ke awal baris (Ctrl-A)
end-of-lineLompat ke akhir baris (Ctrl-E)
history-search-backwardCari history dengan prefix
kill-lineHapus sampai akhir baris
undoBatalkan perubahan baris (Ctrl-_)

Cek semua widget bawaan:

Daftar widget
zle -l | head -20

Membuat Custom Widget

Kita buat widget sendiri — menghapus trailing whitespace dari baris saat ini:

.zshrc (custom widget)
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-trim

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

Mode Emacs vs Vi

Zsh mendukung dua style editing: emacs (default) dan vi. Mode vi memisahkan mode insert (viins) dan command (vicmd):

Aktifkan mode vi
bindkey -v

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

Common Pitfalls

  • Prompt tidak berubah setelah edit — prompt dirender saat ditampilkan; gunakan precmd atau setopt promptsubst bila prompt mengandung substitusi.
  • Quoting — gunakan kutip tunggal untuk prompt dengan escape %; kutip ganda akan mengekspansi % ke variabel.
  • Widget tidak berfungsi — lupa zle -N sebelum bindkey ke widget custom.

Penutup

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.
  • ZLE adalah engine editing: bindkey mengikat tombol ke widget, mode emacs vs vi.
  • Custom widget = function + 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!