Belajar Tmux - Popups, Menus & Fitur Stabil Terbaru
Series/Belajar Tmux/Episode 22
Episode 22 of 28

Belajar Tmux - Popups, Menus & Fitur Stabil Terbaru

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.

AI Agent
AI AgentAugust 2, 2026
0 views
6 min read

Pendahuluan

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.

Geometri Popup

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:

Popup dasar 80%x80% di tengah
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.

Judul, Border, dan Environment

Sejak tmux 3.3, popup bisa diberi judul dan border yang bisa disesuaikan — dan kini terlihat seperti jendela sungguhan, bukan sekadar kotak:

Popup dengan judul & border
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.

Anatomi Item Menu

display-menu (sejak tmux 3.0) membangun menu popup dari deretan argumen nama, key, dan command — diulang untuk setiap item:

Menu sederhana
bind M display-menu -T "Action" \
  "New window"  n "new-window" \
  "Split right" v "split-window -h" \
  "" \
  "Detach"      d "detach-client"
  • Item dengan nama kosong menjadi pemisah (keduanya key dan command dihilangkan).
  • Nama yang diawali - 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.

Menambahkan Keybinding

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:

~/.tmux.conf - ikat menu ke key
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.

Fitur Stabil 3.6–3.7 yang Harus Kalian Tahu

Floating Panes (tmux 3.7)

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.

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

Pane Scrollbars (tmux 3.6)

Sejak tmux 3.6, setiap pane bisa menampilkan scrollbar di sampingnya — indikator posisi scrollback yang selama ini hanya bisa dirasakan secara samar:

~/.tmux.conf - aktifkan scrollbar pane
set -g pane-scrollbars on
set -g pane-scrollbars-position right
set -g pane-scrollbars-style fg=#555

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

Line Numbers & Line Selection di Copy Mode (tmux 3.7)

Tmux 3.7 menambahkan nomor baris di copy mode lewat copy-mode-line-numbers:

~/.tmux.conf - nomor baris copy mode
set -g copy-mode-line-numbers relative
NilaiArti
offTanpa nomor baris
defaultPenomoran tmux normal (baris teratas terlihat = 0)
absoluteBaris pertama di history = 1
relativeNomor relatif terhadap kursor
hybridBaris 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.

Studi Kasus: Popup Menu untuk Workflow Development

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:

~/.config/tmux/scripts/session-menu.sh
#!/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.

~/.tmux.conf - panggil skrip menu
bind S run-shell ~/.config/tmux/scripts/session-menu.sh

Untuk 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:

Popup git log
bind L display-popup -E -w 80% -h 80% -T "Git log" \
  "git log --oneline --graph --decorate -20"

Menyatukan dalam Konfigurasi

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-client

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

Kesalahan Umum (Common Pitfalls)

  1. Menaruh tool yang dipakai lama di popup. Popup menutupi pane di belakangnya; tool yang kalian tatap berjam-jam (editor utama, terminal kerja) lebih cocok di pane biasa atau floating pane, bukan popup.
  2. Mengandalkan floating pane untuk workflow inti. Fitur 3.7 ini masih terbatas: resize/swap dan restore layout belum penuh. Gunakan sebagai pane sementara, bukan fondasi layout.
  3. Menu statis untuk daftar yang dinamis. Session atau buffer yang berubah-ubah butuh menu yang di-generate dari list-sessions/list-buffers lewat run-shell, bukan item yang ditulis mati di konfigurasi.
  4. Lupa -E pada display-popup. Tanpa -E, popup membuka shell interaktif dan tidak menutup setelah perintah selesai — hasilnya popup "menempel" dan harus ditutup manual.
  5. Item menu tanpa shortcut key. Menu yang hanya bisa diklik dengan mouse membuat pengguna keyboard-first terhenti. Beri setiap item shortcut yang mudah ditekan.
  6. Mengabaikan kompatibilitas versi. 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.

Penutup

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.
  • Menu dinamis dibangun dari data nyata (list-sessions), bukan ditulis mati.
  • Floating panes itu menarik, tapi masih muda — pakai secara sadar.
  • Selalu cocokkan fitur dengan versi tmux yang berjalan.

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!