Belajar Tmux - Custom Keybindings, Command Mode & Menus
Series/Belajar Tmux/Episode 11
Episode 11 of 28

Belajar Tmux - Custom Keybindings, Command Mode & Menus

Memetakan aksi ke tombol dengan bind-key, mengendalikan tmux lewat command prompt dan command chaining, serta membangun menu dan popup modern dengan display-menu dan display-popup.

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

Pendahuluan

Di episode 10 sebelumnya kita menguasai format strings — kemampuan membaca dan menampilkan informasi dari tmux. Pada episode ini kita membalik arah: belajar memerintah tmux. Dua cara untuk itu: mengikat perintah ke tombol dengan bind-key, dan mengetik perintah langsung lewat command prompt. Kita juga akan membangun antarmuka modern dengan display-menu dan display-popup — dua fitur yang mengubah tmux dari sekadar multiplexer menjadi launcher aplikasi dalam terminal.

Mengapa ini penting? Default keybinding tmux hanya menyediakan aksi generik. Workflow nyata kalian — "buka project api", "jalankan test", "lihat git log" — tidak ada di default. Custom keybinding dan menu adalah cara mengukir tmux mengikuti kebiasaan kalian. Engineer yang sudah mahir membangun "dashborad" tombol pribadi sehingga aksi paling sering dijalankan dalam satu atau dua ketukan, tanpa menyentuh mouse.

Sintaks bind-key dan unbind-key

Perintah inti adalah bind-key (alias bind). Bentuk dasarnya: bind <tombol> <command> — di dalam config atau command prompt, command ditulis tanpa awalan tmux.

Dasar bind-key
bind R source-file ~/.tmux.conf
bind S choose-tree -Zs
bind -n F12 detach
  • Baris pertama mengikat prefix + R untuk me-reload config (huruf besar dipakai agar tidak bentrok dengan prefix + r default rename).
  • Baris kedua mengikat prefix + S untuk membuka session picker.
  • Baris ketiga memakai flag -n (no-prefix): F12 langsung bekerja tanpa prefix.

Unbind untuk Menghindari Konflik

Sebelum mengikat tombol, lepas dulu ikatan default dengan unbind-key (alias unbind). Ini penting karena keybinding yang sama tidak bisa dua-duanya aktif.

Unbind sebelum bind ulang
unbind C-b
set -g prefix C-a
bind C-a send-prefix

Blok ini adalah cara klasik mengubah prefix dari Ctrl+B menjadi Ctrl+A. Urutan membaca: lepas Ctrl+B, set prefix baru, lalu ikat Ctrl+A untuk mengirim prefix (agar perintah send-prefix tetap bisa diakses saat nested).

Note

Mengubah prefix adalah keputusan besar — hampir semua keybinding lain tetap bekerja karena tmux merujuk pada konsep "prefix", bukan tombol spesifik. Namun keybinding yang menekan tombol lama secara eksplisit (misal bind C-b ...) perlu disesuaikan. Lihat daftar lengkap dengan tmux list-keys untuk memeriksa konflik.

Flag Penting bind-key

FlagArti
-nTanpa prefix (langsung)
-rRepeatable — tombol bisa diulang tanpa menekan prefix lagi
-T <table>Keybinding table (prefix, root, copy-mode, popup)
-N <note>Catatan yang tampil di list-keys

Command Prompt dan Command Chaining

Command Prompt

prefix + : membuka command prompt di bawah layar — tempat mengetik perintah tmux apa pun secara langsung. Ini adalah "REPL" tmux: semua perintah yang ada di tmux list-commands bisa dijalankan dari sini tanpa menulis di shell.

Command prompt
new-window -c ~/project/api -n editor
display-message "selamat datang di #{session_name}"
set-environment -g DEPLOY_TARGET staging

Command prompt adalah jembatan antara config dan interaksi live: kalian bisa menguji perintah di sini sebelum menuliskannya ke ~/.tmux.conf.

Command Chaining

Beberapa perintah bisa dirangkai dalam satu baris dengan titik koma ;. Ini membuat satu keybinding bisa melakukan banyak hal sekaligus.

Chaining perintah
bind T split-window -h \; send-keys 'htop' Enter
bind P new-window -n logs \; send-keys 'journalctl -f' Enter
bind R source-file ~/.tmux.conf \; display-message "Config reloaded"

Baris pertama: prefix + T membuka pane baru di kanan lalu langsung menjalankan htop. Baris kedua: prefix + P membuka window logs dan langsung menampilkan log system. Perhatikan cara menulis \; di dalam config — titik koma harus di-escape agar tidak dianggap pemisah baris config.

display-menu: Menu Modern

Fitur display-menu (tmux 3.3+) memungkinkan membangun menu interaktif di tengah layar — mirip menu kontekstual, sepenuhnya keyboard-driven. Ini cara paling elegan untuk mengelompokkan banyak aksi.

Menu kustom
bind m display-menu -T "Dev Menu" \
    "▶ Editor" E "send-keys 'nvim' Enter" \
    "▶ Server" S "send-keys 'npm run dev' Enter" \
    "▶ Git Log" L "display-popup -E 'git log --oneline'" \
    "" \
    "⏻ Kill Pane" k "kill-pane"

Hasilnya: prefix + m membuka menu dengan empat entri. Setiap baris terdiri dari tiga bagian: label, shortcut key, dan command yang dijalankan saat dipilih. Kalian bisa menavigasi dengan panah dan Enter, atau langsung menekan huruf shortcut.

Tip

display-menu juga bisa dipakai dari command prompt dan scripting. Untuk workflow development, menu adalah pengganti yang jauh lebih baik daripada menghafal selusin keybinding untuk aksi yang jarang dipakai: taruh aksi sering di keybinding, aksi jarang di menu.

display-popup: Popup Terminal

display-popup (tmux 3.3+, popup dirender di atas layout) membuka window kecil yang mengambang di atas pane — sempurna untuk menjalankan perintah yang butuh konteks tapi tidak mau meninggalkan pane utama. Fitur ini berkembang signifikan di tmux 3.7 (floating panes yang bisa diinteraksi penuh).

Popup terminal
bind g display-popup -E -w 80% -h 60% 'git log --oneline --graph --decorate'
bind f display-popup -E "find . -name '*.ts' | fzf"
bind a display-popup -E "nvim -c 'lua require(\"telescope\").extensions.git.branches()'"
  • bind g — membuka popup git log di tengah layar (80% lebar, 60% tinggi).
  • bind f — fuzzy file finder dalam popup.
  • bind a — membuka editor dalam popup.

Flag -E menutup popup otomatis setelah command selesai; -w/-h mengatur ukuran. Popup sangat cocok untuk "quick glance" yang tidak mengganggu alur kerja pane utama.

command-prompt: Input Dinamis

Terkadang kalian butuh nilai dari pengguna saat keybinding dijalankan. command-prompt menampilkan prompt input dan meneruskan hasilnya ke command.

Prompt dinamis
bind r command-prompt -p "Rename window: " {rename-window '%%'}
bind s command-prompt -I "#{pane_current_path}" -p "New window in: " {new-window -c '%%'}
  • bind r — meminta nama baru lalu me-rename window.
  • bind s — meminta path (dengan nilai awal dari path pane saat ini) lalu membuat window di path tersebut.

Notasi '%%' adalah placeholder untuk input yang diberikan pengguna — hasil prompt disisipkan di posisi itu.

Important

Perhatikan penulisan placeholder: prompt di dalam kurung kurawal harus memakai %% untuk input. Ini mudah terlewat — jika kalian menulis %1 seperti di tmux lama, hasilnya tidak akan berfungsi di versi 3.7b. Selalu uji satu keybinding baru di command prompt terlebih dahulu sebelum menyimpannya ke config.

Menggabungkan Semuanya: Launchpad Pribadi

Berikut contoh config yang menggabungkan semua teknik episode ini menjadi "launchpad" workflow development:

~/.tmux.conf — launchpad workflow
# ===== PREFIX =====
set -g prefix C-a
unbind C-b
bind C-a send-prefix
 
# ===== RELOAD =====
bind R source-file ~/.tmux.conf \; display-message "Config reloaded"
 
# ===== LAUNCHER =====
bind m display-menu -T "Launchpad" \
    "▶ Editor" e "send-keys 'nvim' Enter" \
    "▶ Dev Server" s "send-keys 'npm run dev' Enter" \
    "▶ Git Log" l "display-popup -E 'git log --oneline --graph'" \
    "" \
    "⏻ Kill Pane" k "kill-pane"
 
# ===== POPUP =====
bind g display-popup -E -w 80% -h 60% 'git log --oneline --graph --decorate'
bind f display-popup -E "find . -name '*.ts' | fzf"
 
# ===== PROMPT =====
bind r command-prompt -p "Rename window: " {rename-window '%%'}

Reload dengan prefix + R, lalu uji prefix + m, prefix + g, prefix + r. Ini hanya contoh — prinsipnya adalah: ulangi aksi yang sering dipakai, kelompokkan yang jarang, dan biarkan prompt menangani yang butuh input.

Kesalahan Umum (Common Pitfalls)

  1. Konflik keybinding yang tidak diperiksa. Setelah mengubah bind, cek tmux list-keys atau prefix + ? untuk memastikan tidak ada yang bertabrakan. Unbind dulu sebelum bind ulang.
  2. Titik koma tidak di-escape di config. Dalam ~/.tmux.conf, perintah chaining harus menulis \; — tanpa escape, titik koma dianggap akhir baris config.
  3. Lupa bahwa -n menempatkan keybinding di root table. Keybinding -n bisa bentrok dengan tombol yang dipakai program di dalam pane (misal F1 di editor). Gunakan dengan sadar.
  4. Placeholder prompt salah. Gunakan '%%' di dalam kurung kurawal command-prompt, bukan %1.
  5. Popup menutup terlalu cepat. Tanpa -E, popup menunggu; dengan -E, popup menutup saat command selesai. Pilih sesuai kebutuhan — untuk editor interaktif jangan pakai -E.
  6. Terlalu banyak keybinding custom. Setiap bind baru adalah beban memori. Jaga jumlahnya wajar dan tempatkan aksi jarang di menu/popup.

Penutup

Episode ini memberi kalian kendali penuh atas perintah tmux: bind-key/unbind-key dengan flag -n/-r/-T, command prompt prefix + : untuk menguji perintah, command chaining dengan ;, menu interaktif display-menu, popup terminal display-popup, dan input dinamis command-prompt.

Poin yang harus kalian bawa:

  • bind-key adalah cara utama mengukir tmux mengikuti workflow kalian.
  • Unbind sebelum bind ulang untuk menghindari konflik.
  • display-menu dan display-popup adalah antarmuka modern tmux 3.3+.
  • Command prompt adalah tempat menguji perintah sebelum masuk config.
  • '%%' adalah placeholder input untuk command-prompt.

Semua keybinding yang kita buat tadi akan disimpan di ~/.tmux.conf — dan file itulah yang mengatur perilaku tmux dari server pertama hidup. Di episode 12 selanjutnya kita membedah options & environment management — empat tingkatan scope options, options penting seperti history-limit dan escape-time, serta pengelolaan environment dan working directory yang konsisten. Sampai jumpa di episode 12!

Belajar Tmux - Custom Keybindings, Command Mode & Menus | Belajar Tmux