Memanfaatkan fitur modern tmux 3.3 hingga 3.7: display-popup untuk terminal mengambang, display-menu untuk menu kustom, floating panes, pane scrollbars, hyperlinks, dan line numbers copy mode plus studi kasus menu development.

Di episode 21 sebelumnya kita membahas nested tmux & advanced input handling — mengirim prefix antar lapisan dan mengoptimalkan mouse, extended keys, focus events, clipboard, serta warna end-to-end. Kali ini kita menaikkan level antarmuka: dari sekadar membagi layar menjadi membangun UI interaktif di atas tmux — popup, menu, dan fitur-fitur stabil terbaru yang mengubah cara tmux dirasa.
Kenapa topik ini penting? Terminal modern bukan lagi "layar hijau monokrom". Sebagai engineer, kalian melakukan aksi yang sama berulang kali: switch session, cek git status, melihat log, menjalankan test. Setiap aksi membutuhkan beberapa keypress dan perpindahan konteks. display-popup dan display-menu mengubah aksi-aksi itu menjadi satu panggilan: tekan satu tombol, pilih dari menu, selesai. Di production, mengurangi friksi seperti ini berarti mengurangi kesalahan — semakin sedikit langkah, semakin sedikit yang bisa salah. Episode ini merujuk tmux 3.7b sebagai versi stabil terbaru.
display-popup (sejak tmux 3.0) membuka terminal kecil yang mengambang di tengah layar — seperti popup window, tetapi tetap berada di dalam tmux. Ukuran dan posisinya bisa diatur dengan -w, -h, -x, dan -y:
tmux display-popup -E -w 80% -h 80% "lazygit"-w dan -h menerima angka absolut atau persentase; -x dan -y mengatur posisi relatif. Tanpa argumen, popup menggunakan setengah ukuran terminal di tengah. Flag -E membuat popup menjalankan perintah dan menutup saat perintah selesai; tanpa -E, popup membuka shell interaktif yang bertahan sampai kalian menutupnya. -d menentukan direktori awal, misalnya -d ~/project.
Sejak tmux 3.3, popup bisa diberi judul dan border yang bisa disesuaikan — dan kini terlihat seperti jendela sungguhan, bukan sekadar kotak:
tmux display-popup -E -w 70% -h 70% -T "Lazygit" -b rounded "lazygit"
tmux display-popup -B -h 40% -E "htop"-T "Judul" menampilkan judul di border atas (tmux 3.3+).-b rounded mengatur jenis garis border; -B menghapus border sepenuhnya (untuk tool yang sudah punya border sendiri).-e VAR=value menyuntikkan environment untuk popup; -s dan -S mengatur style popup dan border-nya.-k (tmux 3.6+) membiarkan popup ditutup dengan tombol apa pun setelah perintah selesai, bukan hanya menunggu Enter.Note
Popup adalah overlay: selama terbuka, input tertuju ke popup, sementara pane di belakangnya tetap berjalan dan bisa melihat output. Ini membedakannya dari floating panes yang akan kita bahas sebentar lagi — popup bersifat modal untuk input, floating pane tidak.
display-menu (sejak tmux 3.0) membangun menu popup dari deretan argumen nama, key, dan command — diulang untuk setiap item:
bind M display-menu -T "Action" \
"New window" n "new-window" \
"Split right" v "split-window -h" \
"" \
"Detach" d "detach-client"nama kosong menjadi pemisah (keduanya key dan command dihilangkan).- membuat item nonaktif (diredupkan, tidak bisa dipilih).key adalah shortcut untuk memilih item dari keyboard; kosongkan bila tidak diperlukan.-T "Judul" menampilkan judul menu; -C menentukan item yang terpilih saat menu terbuka.Menu menunggu input keyboard: pilih dengan Up/Down + Enter, q untuk menutup. Opsi -O mencegah menu tertutup otomatis saat tombol mouse dilepas tanpa memilih, dan -M mengaktifkan penanganan mouse penuh — keduanya berguna ketika menu dipicu dari binding mouse.
Menu yang tidak bisa dipanggil adalah menu yang tidak berguna. Ikat ke key pada prefix, atau ke tombol tanpa prefix (-n) untuk aksi yang sangat sering dipakai:
bind M display-menu -T "Quick" \
"List sessions" s "choose-tree -s" \
"Paste buffer" p "choose-buffer"Pola ini mengubah tiga keypress abstrak menjadi satu menu yang terlihat. Semakin sering sebuah aksi dilakukan, semakin layak ia menjadi item menu — bukan sebaliknya.
Floating pane adalah fitur terbaru dari tmux 3.7: sebuah pane yang mengambang di atas layout seperti popup, tetapi tidak modal — ia berperilaku seperti pane biasa dan mendukung escape sequence yang sama. Buat dengan binding default Prefix + *, lalu geser dan resize dengan mouse. Format pane_floating_flag memberi tahu apakah sebuah pane mengambang.
tmux display-message -p '#{pane_floating_flag}'Caution
Floating pane adalah fitur muda. Di rilis awal, pergerakan dan resize hanya lewat mouse, dan beberapa operasi seperti resize-pane, swap pane, atau restore custom layout belum mendukung pane mengambang. Cocok untuk pane "sementara" yang mudah dibuang — jadikan fitur ini sebagai bonus, bukan fondasi layout kerja.
Sejak tmux 3.6, setiap pane bisa menampilkan scrollbar di sampingnya — indikator posisi scrollback yang selama ini hanya bisa dirasakan secara samar:
set -g pane-scrollbars on
set -g pane-scrollbars-position right
set -g pane-scrollbars-style fg=#555pane-scrollbars-position memilih kiri atau kanan; pane-scrollbars-style mengatur warnanya. Scrollbar muncul saat masuk copy mode dan sangat membantu memetakan seberapa dalam scrollback — apalagi di pane dengan output panjang seperti log.
Tmux mendukung OSC 8 hyperlinks (sejak 3.4): URL yang dicetak aplikasi di dalam pane menjadi tautan yang bisa diklik di terminal emulator yang mendukung. Di copy mode (tmux 3.5+), hyperlink ditampilkan dan bisa disalin dengan format copy_cursor_hyperlink — misalnya menyalin URL yang sedang diarahkan kursor, bukan menyalin baris yang mungkin terpotong.
Tmux 3.7 menambahkan nomor baris di copy mode lewat copy-mode-line-numbers:
set -g copy-mode-line-numbers relative| Nilai | Arti |
|---|---|
off | Tanpa nomor baris |
default | Penomoran tmux normal (baris teratas terlihat = 0) |
absolute | Baris pertama di history = 1 |
relative | Nomor relatif terhadap kursor |
hybrid | Baris kursor absolut, lainnya relatif |
Bersamaan dengan itu, perintah copy-line dan copy-line-and-cancel membuat seleksi per baris menjadi eksplisit — drag dengan mouse untuk memilih baris, atau jalankan perintah untuk menyalin baris yang sedang diarahkan kursor. Ini menyelesaikan pekerjaan "salin baris log tertentu" yang tadinya harus dilakukan seleksi manual.
Mari rakit semuanya menjadi satu workflow nyata. Bayangkan kalian bekerja di sebuah project Go: menjalankan test, memeriksa git, dan berpindah session adalah aktivitas harian. Kita bangun menu project yang bisa dipanggil dengan Prefix + P, plus popup untuk tool yang butuh layar besar.
Menu statis tidak bisa menampilkan session yang berubah-ubah. Solusinya: buat daftar session dari tmux list-sessions, lalu bangun argumen menu secara dinamis:
#!/usr/bin/env bash
mapfile -t sessions < <(tmux list-sessions -F '#S')
menu=()
for s in "${sessions[@]}"; do
menu+=("$s" "" "switch-client -t $s")
done
tmux display-menu -T "Switch session" "${menu[@]}"Bind skrip itu ke satu tombol, dan menu akan menampilkan semua session yang ada — item ditambahkan dan dihapus mengikuti kondisi nyata server. Inilah pola dynamic menu: data dari sistem, tampilan dari tmux.
bind S run-shell ~/.config/tmux/scripts/session-menu.shUntuk aksi yang perlu melihat banyak output — git log, status, atau proses berat — popup lebih cocok daripada menu. display-popup menjalankan perintah, menampilkan hasilnya di tengah layar, dan menutup dirinya sendiri:
bind L display-popup -E -w 80% -h 80% -T "Git log" \
"git log --oneline --graph --decorate -20"bind P display-menu -T "Project" \
"Run tests" t "display-popup -E -T 'Test' 'pytest -q'" \
"Git status" g "display-popup -E -T 'Git' 'git status -sb'" \
"Git log" l "display-popup -E -T 'Log' 'git log --oneline -20'" \
"" \
"Detach" d detach-clientPerhatikan pembagian peran: display-menu untuk pilihan cepat (apa yang mau dilakukan), display-popup untuk ruang kerja sementara (tool yang butuh layar). Keduanya mengurangi langkah — dan setiap langkah yang hilang adalah satu kesempatan untuk salah menekan tombol.
list-sessions/list-buffers lewat run-shell, bukan item yang ditulis mati di konfigurasi.-E pada display-popup. Tanpa -E, popup membuka shell interaktif dan tidak menutup setelah perintah selesai — hasilnya popup "menempel" dan harus ditutup manual.display-popup/display-menu butuh tmux 3.0+, pane-scrollbars butuh 3.6, floating panes dan line numbers butuh 3.7. Periksa tmux -V sebelum memakai fitur di server produksi.Episode ini membuka dimensi baru antarmuka tmux. Kalian memahami display-popup sebagai terminal mengambang dengan geometri, judul, dan border yang bisa diatur; display-menu sebagai menu kustom berbasis nama, key, dan command; serta fitur stabil terbaru dari 3.6 sampai 3.7 — floating panes, pane scrollbars, hyperlinks OSC 8, dan line numbers di copy mode. Studi kasus menu development menunjukkan cara merakit semuanya menjadi workflow yang benar-benar dipakai: switch session dinamis, popup git, dan menu project dalam satu konfigurasi.
Poin yang harus kalian bawa pulang:
display-popup untuk ruang kerja sementara; display-menu untuk pilihan cepat.list-sessions), bukan ditulis mati.Di episode 23 selanjutnya kita akan membahas troubleshooting & debugging — ketika tmux tidak berperilaku seperti yang diharapkan: membaca log server, mendiagnosis masalah status bar dan warna, menelusuri konflik keybinding, dan mereproduksi masalah dengan konfigurasi minimal. Sampai jumpa di episode 23!