Belajar Tmux - Nested Tmux & Advanced Input Handling
Series/Belajar Tmux/Episode 21
Episode 21 of 28

Belajar Tmux - Nested Tmux & Advanced Input Handling

Menangani nested tmux saat SSH ke server yang juga memakai tmux lewat send-prefix dan remap prefix, lalu mengoptimalkan input terminal: mouse, extended keys, focus events, clipboard OSC 52, dan true color end-to-end.

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

Pendahuluan

Di episode 20 sebelumnya kita membahas security & hardening — mengunci session, mengamankan socket, dan menyembunyikan secrets dari konfigurasi. Fondasi keamanan itu sekarang menjadi pijakan untuk sesuatu yang lebih halus: bagaimana kalian berinteraksi dengan tmux dalam skenario paling rumit sekaligus paling umum di lapangan. Dua tema besar menanti: nested tmux ketika kalian SSH ke server yang juga menjalankan tmux, dan advanced input handling agar terminal terasa secepat dan setajam mungkin.

Mengapa ini penting? Seorang engineer yang bekerja di infrastruktur nyata hampir pasti menghadapi tmux di dua lapisan sekaligus: di laptop dan di server produksi. Kalau kedua lapisan itu berebut prefix yang sama, kalian tidak bisa mengendalikan apa pun dengan tenang. Dan di sisi input, selisih beberapa milidetik pada ESC atau pemilihan warna yang salah bukan sekadar kenyamanan — itu menentukan apakah kalian bisa bekerja cepat atau malah berhenti karena teks tidak terbaca. Episode ini merujuk tmux 3.7b sebagai versi stabil terbaru.

Nested Tmux: Dua Lapisan Terminal dalam Satu Layar

Mengapa Nested Tmux Itu Nyata

Dari episode 18 kita tahu pola kerja remote: buka tmux di laptop, SSH ke server, dan di dalamnya sering ada tmux lagi — dijalankan oleh admin sebelumnya, oleh tool deploy, atau oleh kebiasaan tim. Hasilnya: dua lapisan yang sama-sama mengklaim prefix C-b. Setiap C-b yang kalian tekan ditelan oleh lapisan terluar, dan tmux di dalam server seolah "tidak bisa diajak bicara".

Konsep kuncinya adalah prefix bertingkat. Setiap lapisan punya prefix-nya sendiri; tugas kalian hanyalah mengirim prefix ke lapisan yang tepat. Bayangkan dua pintu bertumpuk: kunci pintu luar dan kunci pintu dalam boleh sama, selama kalian tahu kunci yang mana untuk pintu yang mana — dan di sini kuncinya adalah urutan penekanan tombol.

Mengirim Prefix ke Lapisan Dalam

Default tmux sebenarnya sudah punya mekanisme ini: C-b dua kali mengirim prefix ke aplikasi di dalam pane. Binding bawaan C-b pada tabel prefix adalah send-prefix — menekan C-b di dalam mode prefix akan meneruskan sebuah C-b literal ke program di pane, yaitu ke tmux lapisan dalam. Mari kita buat ini lebih nyaman dengan binding eksplisit:

~/.tmux.conf mesin lokal - binding send-prefix
set -g prefix C-b
bind C-a send-prefix

Dengan baris ini, C-b lalu C-a akan mengirim sebuah C-b ke pane — dan karena pane itu adalah tmux di server yang juga memakai C-b, server pun "mendengar" prefix-nya. Peta lengkapnya:

SituasiKombinasi
Perintah tmux lapisan luar (lokal)C-b lalu perintah, misal c
Kirim prefix ke tmux lapisan dalamC-b lalu C-a
Perintah tmux lapisan dalam (misal window baru)C-b C-a lalu c
Detach dari tmux lapisan dalamC-b C-a lalu d
Kirim C-b literal ke aplikasi di dalamC-b C-a lalu C-b

Perhatikan baris terakhir: setelah mengirim prefix ke lapisan dalam, kita memakai binding default lapisan dalam itu sendiri (C-b C-b) untuk meneruskan prefix lebih dalam lagi. Pola ini bersifat rekursif — selama tiap lapisan memakai C-b plus send-prefix, kalian bisa menembus berapa pun lapisan.

Remap Prefix untuk Tiap Lapisan

Alternatif yang populer adalah memberi setiap lapisan "bahasa" sendiri sehingga tidak ada ambigu. Pendekatan yang dipakai banyak tim: lapisan lokal memakai C-b, dan lapisan server di-set eksplisit ke C-b juga — tetapi dengan bind C-a send-prefix di lokal, perpindahan terasa satu tombol tambahan yang ringan. Yang terpenting: tuliskan prefix secara eksplisit di kedua sisi, jangan mengandalkan default yang implisit.

set -g prefix C-b
bind C-a send-prefix

Menandai lapisan dalam lewat status bar yang berbeda (status-left "REMOTE ") adalah trik kecil yang sangat membantu: dalam sekejap kalian tahu sedang berada di lapisan mana, sehingga tidak salah menekan kombinasi detach. Konvensi yang jelas pada status bar mencegah kesalahan yang harganya mahal — misalnya detach dari lapisan yang salah.

Tip

Jika kalian lebih suka memakai C-a sebagai prefix utama, terapkan konfigurasi yang sama di kedua lapisan: set -g prefix C-a, unbind C-b, dan bind C-a send-prefix di lokal maupun remote. Selama kedua lapisan memakai prefix yang identik, C-a C-a akan selalu mengirim prefix ke lapisan berikutnya. Konsistensi antar mesin adalah kuncinya.

Advanced Input & Terminal Features

Mouse Support: Antara Nyaman dan Terkendali

~/.tmux.conf - aktifkan mouse
set -g mouse on

mouse on membuat tmux mengenali klik: memilih pane, me-resize border, scrollback dengan roda, bahkan mengklik window di status bar. Ini terasa seperti sihir bagi pengguna yang datang dari GUI. Namun ada trade-off: aplikasi yang memakai mouse di dalam terminal (misalnya TUI yang mendukung drag) kehilangan event-nya karena tmux menelannya. Untuk workload semacam itu, matikan sementara dengan set -g mouse off atau binding toggle.

Extended Keys: xterm-keys dan CSI-u

~/.tmux.conf - extended keys
set -g xterm-keys on
set -g extended-keys always

xterm-keys on membuat tmux menerjemahkan tombol-tombol spesial (Home, End, PageUp, PageDown, Ctrl+Panah) menjadi urutan yang benar sehingga aplikasi di dalam pane bisa membedakannya. Sejak tmux 3.2, xterm-keys defaultnya sudah aktif; extended-keys always menambahkan dukungan penuh CSI-u yang dipakai editor modern seperti Neovim dan Emacs untuk kombinasi tombol yang tidak ambigu. Efeknya paling terasa di editor: Ctrl+Panah untuk memindah kata, Ctrl+Home untuk ke awal dokumen, dan sejenisnya — bukan sekadar karakter aneh yang dicetak.

focus-events: Aplikasi yang Tahu Kapan Terlihat

~/.tmux.conf - fokus event
set -g focus-events on

Dengan focus-events on, tmux memberi tahu aplikasi di pane ketika pane mendapat atau kehilangan fokus — menggunakan bracketed focus events. Ini penting untuk editor dan tools yang bereaksi pada fokus: Neovim bisa auto-save saat kehilangan fokus, LSP bisa membuang cache saat kembali, dan runner seperti live-server bisa berhenti menyala saat pane tidak terlihat. Hasilnya: sistem yang hemat resource dan tidak mengganggu.

escape-time dan Latensi Input

~/.tmux.conf - tekan ESC tanpa jeda
set -sg escape-time 10

escape-time adalah berapa lama tmux menunggu setelah menerima ESC untuk memutuskan apakah itu tombol ESC saja atau awal dari escape sequence (misalnya Alt+key atau tombol panah). Default lama 500 milidetik membuat editor yang memakai ESC terasa "ngaret" — setiap keluar dari insert mode di vim menunggu setengah detik. Menurunkannya ke 10 membuat ESC terasa instan. Sejak tmux 3.5 defaultnya memang 10, tetapi menuliskannya secara eksplisit menjaga konsistensi antar mesin — sekaligus menutup jendela interpretasi yang kita bahas di episode 20.

Clipboard & Warna End-to-End

OSC 52: Clipboard yang Menembus Tmux

~/.tmux.conf - clipboard passthrough
set -g set-clipboard on

Masalah klasik: menyalin di copy mode tmux, lalu menempel di luar terminal — tidak bisa, karena clipboard pane dan clipboard sistem adalah dua dunia. set-clipboard on menjembatani keduanya lewat OSC 52, protokol yang memberi tahu terminal emulator untuk menyimpan teks ke clipboard sistem. Syaratnya terminal emulator kalian mendukungnya — iTerm2, kitty, foot, WezTerm, dan Windows Terminal semuanya mendukung. Ketika berfungsi, kalian tidak lagi butuh xclip/xsel atau plugin ekstra: seleksi di tmux langsung mendarat di clipboard sistem.

Warning

OSC 52 adalah jembatan dua arah yang perlu disadari: apapun yang menempel di clipboard terminal ikut terlihat oleh proses dalam pane bila mereka meminta clipboard (misal lewat yank di Neovim). Di mesin yang shared, pertimbangkan apakah ini yang kalian inginkan — di environment multi-user yang ketat, nonaktifkan set-clipboard dan biarkan clipboard pane terpisah.

True Color End-to-End

Warna di terminal berjalan dalam rantai: aplikasi → tmux → terminal emulator. Setiap tautan harus sepakat pada kemampuan warna. Jika salah satu menyebut TERM yang terlalu rendah, warna 256 atau true color akan direduksi — tema editor jadi kusam, dan sintaks code yang seharusnya berwarna menjadi tidak terbaca.

~/.tmux.conf - warna end-to-end
set -g default-terminal "tmux-256color"
set -g terminal-features 'xterm*:RGB'

default-terminal menentukan TERM yang dilihat aplikasi di dalam pane — tmux-256color memberitahu aplikasi bahwa 256 warna tersedia. terminal-features 'xterm*:RGB' memberi tahu tmux bahwa terminal yang memakai TERM xterm* mendukung true color (RGB), sehingga tmux meneruskan warna 24-bit utuh. Verifikasi dengan membandingkan echo $TERM di dalam dan di luar tmux, lalu jalankan uji warna (misal tput colors harus mencetak 256).

set -g mouse on
set -g xterm-keys on
set -g focus-events on
set -sg escape-time 10

Kesalahan Umum (Common Pitfalls)

  1. Mengendalikan lapisan dalam tanpa mengirim prefix. Menekan C-b c di dalam nested tmux justru membuat window baru di lapisan luar. Kirim prefix dulu (C-b C-a), baru perintah.
  2. Tidak menandai lapisan dalam di status bar. Tanpa penanda seperti status-left "REMOTE ", kalian mudah lupa sedang berada di lapisan mana — dan detach dari lapisan yang salah. Beri identitas visual pada tiap lapisan.
  3. Memakai mouse on tanpa menyadari trade-off. TUI yang bergantung pada mouse kehilangan event-nya. Sediakan toggle (bind m set -g mouse misalnya) dan ketahui kapan harus mematikannya.
  4. Membiarkan escape-time default lama. Di tmux lama atau konfigurasi yang disalin dari mesin lama, ESC di vim terasa ngaret. Set eksplisit escape-time 10.
  5. TERM tidak konsisten di dalam dan luar. Aplikasi melihat warna yang salah karena default-terminal tidak di-set ke tmux-256color, atau fitur RGB tidak diiklankan. Bandingkan echo $TERM di kedua sisi.
  6. Mengira OSC 52 selalu jalan. set-clipboard on hanya berarti tmux mengirim sinyal; kalau terminal emulator tidak mendukung OSC 52, clipboard tetap tidak menempel. Pastikan terminal kalian mendukungnya sebelum menghapus xclip.

Penutup

Episode ini menuntaskan dua lapisan besar interaksi dengan tmux. Di nested tmux, kalian belajar mengirim prefix antar lapisan dengan send-prefix, memetakan kombinasi tombol untuk tiap lapisan, dan menandai lapisan dalam lewat status bar. Di advanced input, kalian mengoptimalkan mouse, extended keys, focus events, dan escape-time agar terminal terasa tajam — lalu menutup rantai clipboard dan warna dengan OSC 52 serta true color end-to-end.

Poin yang harus kalian bawa pulang:

  • C-b C-a mengirim prefix ke lapisan dalam; pola ini bersifat rekursif.
  • Tuliskan prefix secara eksplisit di kedua lapisan, dan beri penanda visual pada status bar.
  • escape-time 10 menghilangkan jeda ESC dan menutup celah interpretasi.
  • Rantai clipboard (OSC 52) dan warna (RGB) hanya sekuat tautan terlemahnya.

Di episode 22 selanjutnya kita akan membahas popups, menus, dan fitur stabil terbarudisplay-popup untuk terminal mengambang, display-menu untuk menu kustom, floating panes dan pane scrollbars dari tmux 3.6/3.7, plus studi kasus membangun menu development dengan popup dan keybinding git. Sampai jumpa di episode 22!