Kekuatan sesungguhnya di balik status bar: seluruh variabel format tmux, ekspresi komputasi bersyarat, dan membuat variabel kustom dengan set-environment untuk status bar yang benar-benar hidup.

Di episode 9 sebelumnya kita menyulap status bar menjadi dashboard dengan variabel sederhana seperti #{session_name} dan #{host_short}. Namun itu baru permukaan. Pada episode ini kita masuk ke inti kekuatan tmux yang membedakannya dari multiplexer lain: format strings — bahasa template yang memungkinkan kalian memeriksa, menghitung, dan menyusun informasi secara dinamis. Setelah episode ini, kalian tidak lagi "menempelkan variabel", melainkan membangun ekspresi yang beradaptasi dengan keadaan.
Mengapa ini penting? Di dunia nyata, informasi yang berguna hampir selalu kontekstual. "Menampilkan nama session" itu statis; "menampilkan nama session, dan menyorotnya merah ketika ada proses error" itu dinamis dan jauh lebih berguna. Format strings memungkinkan hal-hal seperti itu tanpa menulis program eksternal. Ini juga dasar dari scripting (episode 14) — karena display-message -p memakai mesin format yang sama.
Tmux menyediakan ratusan variabel format. Semua bisa dipakai di dalam string dengan sintaks #{nama}. Berikut yang paling sering dipakai dalam praktik:
| Variabel | Arti | Contoh Nilai |
|---|---|---|
#{session_name} | Nama session aktif | api |
#{session_windows} | Jumlah window di session | 3 |
#{window_index} | Nomor window aktif | 1 |
#{window_name} | Nama window aktif | nvim |
#{pane_index} | Nomor pane aktif | 0 |
#{pane_current_path} | Path direktori pane | /srv/api |
#{pane_current_command} | Perintah yang berjalan di pane | node |
#{pane_title} | Judul pane | api-0 |
#{host} / #{host_short} | Nama host / host pendek | devbox |
#{session_created_string} | Waktu session dibuat | 2d ago |
#{pane_width} / #{pane_height} | Ukuran pane | 120 |
#{client_width} / #{client_height} | Ukuran client | 120 |
#{cursor_x} / #{cursor_y} | Posisi kursor | 0 |
Cara paling cepat untuk melihat semua variabel yang tersedia beserta nilainya:
tmux display-message -p '#{session_name}'
tmux display-message -p '#{pane_current_path}'
tmux display-message -p '#{pane_current_command}'
tmux display-message -p '#{window_index}:#{window_name}'display-message -p mencetak string hasil format ke stdout tanpa menampilkan popup — inilah jembatan antara status bar dan scripting. Apa pun yang kalian tulis di sini, bisa kalian tangkap di shell.
Note
Variabel yang tersedia bergantung pada konteks evaluasi. Dalam status bar, konteksnya adalah session aktif. Dalam window-status-format, konteksnya adalah masing-masing window. Dalam pane-border-format, konteksnya adalah pane. Variabel yang tidak relevan dengan konteks akan menghasilkan string kosong.
Kekuatan format strings ada pada operator komputasi. Sintaksnya #{<op>:<arg1>,<arg2>,...} — operator diikuti titik dua, lalu argumen dipisahkan koma. Operator paling sering dipakai:
| Operator | Fungsi | Contoh |
|---|---|---|
#{==:a,b} | True jika a == b | #{==:#{pane_current_command},nvim} |
#{!=:a,b} | True jika a != b | #{!=:...#{...},nvim} |
#{||:...} | OR logis | #{||:#{==:...#{...},vim},#{==:...#{...},nvim}} |
#{&&:...} | AND logis | #{&&:a,b} |
#{m:regexp,text} | Regex match | #{m:node.*,...#{...}} |
#{e|...} | Evaluasi ekspresi | #{e|...} |
#{?:cond,then,else} | Ternary | #{?cond,ya,tidak} |
Operator boolean menghasilkan string 1 (true) atau 0 (false). Untuk mengubah boolean menjadi teks, pakai ternary #{?:cond,true,false}.
Contoh nyata — menampilkan indikator "EDITOR" ketika pane aktif menjalankan editor:
set -g status-right "#[fg=#f9e2af]#{?#{==:#{pane_current_command},nvim},NVIM,}"Baris ini menampilkan teks NVIM di status bar hanya jika perintah pane aktif adalah nvim; jika tidak, hasilnya string kosong. Perhatikan bahwa kondisi ternary memuat ekspresi boolean di dalamnya — pola #{?<bool>,<true>,<false>}.
Format strings juga membaca environment variables yang disetel dengan set-environment (alias setenv). Ini cara paling sederhana membuat "variabel buatan sendiri".
tmux set-environment -g MY_TARGET staging
tmux display-message -p 'deploy target: #{MY_TARGET}'Karena variabel ini global (-g), nilainya diwarisi semua session — dan bisa diubah kapan saja. Ini berguna untuk konfigurasi yang nilainya berubah per environment (dev/staging/prod) tanpa harus mengubah file config.
Tip
Kombinasi set-environment -g dengan ekspresi #{==:...} memungkinkan tema status bar yang berubah otomatis: misalnya set-environment -g DEPLOY_TARGET prod lalu status bar menampilkan label merah "PROD" hanya ketika target-nya prod. Tanpa menulis satu baris skrip pun.
Ekspresi format bisa disusun berjenjang (nested) — kondisi di dalam kondisi. Contoh: menampilkan indikator berbeda untuk editor vs dev server vs lainnya:
set -g status-right "#[fg=#89b4fa]#{?#{==:#{pane_current_command},nvim},EDIT,}:#{?#{==:#{pane_current_command},node},SRV,}"Hasilnya: EDIT saat editor aktif, SRV saat node aktif, kosong jika lainnya. Meskipun terlihat padat, setiap blok #{?...} independen dan mudah dipahami jika dibaca per blok.
Mesin format yang sama juga dipakai di tempat lain:
window-status-format dan window-status-current-format — menampilkan info per window.pane-border-format (tmux 3.2+) — menampilkan info di border pane.set -g pane-border-format "#[fg=#89b4fa] #{pane_index}:#{pane_current_path} "
set -g pane-border-status topDengan pane-border-status top dan pane-border-format, setiap pane menampilkan nomor dan path-nya di bagian atas border — sangat membantu di layout dengan banyak pane.
Warning
Variabel yang dievaluasi berulang-ulang (misalnya pane_current_command) menambah sedikit beban CPU karena tmux harus memeriksa status proses. Pada session dengan sangat banyak pane, pemakaian variabel berat di semua pane sekaligus bisa terasa. Di episode 24 kita akan membahas keseimbangan antara kekayaan informasi dan performa.
#{pane_index} di dalam window-status-format tidak bermakna karena konteksnya window, bukan pane. Gunakan variabel yang relevan dengan konteks evaluasi.#{==:...} menghasilkan 1/0. Untuk menampilkan teks, bungkus dalam #{?:cond,true,false}.#{?kondisi,nilai_true,nilai_false} — salah urut menghasilkan output yang membingungkan.#{session_name} benar, session_name di luar kurung kurawal tidak akan diganti.set-environment -g MY_VAR menimpa nilai sebelumnya. Pastikan nama variabel tidak bentrok dengan variabel internal tmux (huruf besar umumnya aman).display-message tanpa -p. tmux display-message '#{...}' menampilkan popup di layar; -p mencetak ke stdout — gunakan -p saat ingin menangkap output di shell.Episode ini membuka mesin format strings tmux secara penuh: katalog variabel utama, operator komputasi bersyarat (#{==:}, #{||:}, #{&&:}, #{m:}, #{?:}), cara menambahkan variabel kustom dengan set-environment -g, teknik ekspresi bertingkat, serta penerapan format di window status dan pane border.
Poin yang harus kalian bawa:
#{?:cond,then,else} mengubah boolean menjadi teks.set-environment -g menciptakan variabel kustom yang bisa diubah runtime.Kemampuan "membaca dan menampilkan" informasi ini berpasangan sempurna dengan kemampuan "menyuruh dan meniru". Di episode 11 selanjutnya kita membahas custom keybindings, command mode & menus — memetakan perintah ke tombol, memakai display-menu dan display-popup untuk antarmuka cepat, serta mengendalikan tmux dari command prompt. Sampai jumpa di episode 11!