membangun fondasi konfigurasi tmux: lokasi dan urutan loading file ~/.tmux.conf, grammar bind-key dan set-option beserta tingkatan opsi server/global/window, setting wajib seperti mouse, dan workflow reload.

Di episode 5 kita mengubah banyak perilaku tmux — mode-keys vi, set-clipboard on, history-limit — dan hampir semuanya kita lakukan lewat perintah sesaat di command prompt. Perintah sesaat itu efektif, tetapi ada satu masalah: ia lenyap begitu server tmux di-restart. Episode ini menutup lubang tersebut dengan membangun fondasi konfigurasi tmux — satu file teks bernama ~/.tmux.conf yang memuat seluruh pengaturan kalian dan bisa dibawa ke mana-mana.
Mengapa file konfigurasi ini begitu penting dalam dunia nyata? Karena cara engineer senior bekerja bukan dari ingatan, melainkan dari artefak yang bisa direproduksi. Konfigurasi tmux yang baik adalah dokumentasi hidup: ia mencatat keputusan-keputusan yang dulu pernah kalian ambil (kenapa prefix diubah ke Ctrl+A, kenapa escape-time diturunkan), sekaligus bisa di-version control di repo dotfiles dan disinkronkan dari laptop ke server. Di tmux 3.7b (rilis stabil terbaru saat artikel ini ditulis), satu ~/.tmux.conf membuat semua mesin kalian terasa identik — tidak ada lagi perasaan "aneh, kok di server ini % tidak jalan?"
Peta episode ini: pertama kita pahami di mana file konfigurasi tinggal dan kapan tmux membacanya. Lalu kita pelajari cara me-reload tanpa restart dengan source-file. Berikutnya grammar inti — bind-key, unbind-key, set-option, set-window-option — beserta tingkatan opsi server, global, session, dan window. Setelah itu kita bahas setting wajib yang harus ada di hampir semua config, dan kita tutup dengan starter config lengkap yang bisa langsung kalian pakai.
File konfigurasi utama tmux adalah ~/.tmux.conf di home directory kalian. Sejak tmux 3.1, kalian juga bisa memakai $XDG_CONFIG_HOME/tmux/tmux.conf jika mengikuti spesifikasi freedesktop — tmux memakainya selama file ~/.tmux.conf tidak ada. Pilih salah satu dan pertahankan konsistensi; jangan simpan di dua tempat sekaligus, karena itu hanya membuat dua sumber kebenaran yang bisa saling bertabrakan.
Urutan loading lengkapnya adalah sebagai berikut: jika ada, tmux membaca /etc/tmux.conf (konfigurasi sistem), lalu file user — ~/.tmux.conf atau varian XDG. Flag -f dari perintah tmux -f file.conf bisa memaksa tmux memakai file tertentu sebagai pengganti. Terakhir, jika ~/.tmux.conf.local ada, ia dibaca sesudahnya — ini pola yang bagus untuk override per-mesin: config utama di version control, sementara ~/.tmux.conf.local dibiarkan bebas di mesin lokal.
Poin krusial yang jarang dipahami: file konfigurasi dibaca sekali, ketika server tmux pertama kali dibuat — yaitu saat session pertama dijalankan. Ketika kalian menutup terminal dan tmux attach kembali ke session yang sama, server sudah hidup dan file config tidak dibaca ulang. Inilah sumber kebingungan klasik: "saya sudah edit ~/.tmux.conf, kenapa tidak berubah?" Jawabannya bukan karena config salah, melainkan karena config itu belum dibaca ulang. Memahami momen pembacaan ini menjadi dasar pentingnya workflow reload di bagian berikutnya.
Untuk menerapkan perubahan tanpa memutus session, tmux menyediakan source-file — perintah yang membaca dan mengeksekusi file konfigurasi seolah-olah baru saja dibaca saat startup. Jalankan dari command prompt dengan prefix + : lalu source-file ~/.tmux.conf, atau langsung dari shell dengan tmux source-file ~/.tmux.conf. Opsi lain yang berguna: tmux source-file ~/.tmux.conf \; display-message "Config reloaded!" — titik koma di sini adalah pemisah perintah tmux, bukan shell.
Mengetik perintah itu setiap kali melelahkan, jadi praktisi memasang keybinding reload di config:
bind r source-file ~/.tmux.conf
bind R source-file ~/.tmux.conf \; display-message "Config reloaded!"Pola di atas memakai dua binding: prefix + r untuk reload senyap, dan prefix + R untuk reload yang mengonfirmasi dengan pesan di status bar. Perhatikan \; — backslash sebelum titik koma memberi tahu tmux bahwa titik koma adalah pemisah perintah, bukan bagian dari argumen source-file. Inilah salah satu detail grammar tmux yang paling sering membuat pemula terjebak, dan menjadi bahan uji di bagian kesalahan umum. Workflow idealnya selalu: edit file → prefix + r → uji → commit ke dotfiles.
Tip
source-file juga berguna untuk memecah config besar menjadi beberapa file. Misalnya source-file ~/.tmux/bindings.conf di dalam ~/.tmux.conf — setiap file memegang satu domain (keybinding, tampilan, plugin), dan reload tetap satu ketukan. Ini pola yang akan kita pakai saat config mulai membengkak di episode-episode berikutnya.
Grammar ~/.tmux.conf mengikuti sintaks perintah tmux: setiap baris adalah satu perintah. Dua keluarga perintah yang paling sering dipakai adalah bind-key/unbind-key untuk keybinding, dan set-option untuk pengaturan.
bind-key KEY perintah menghubungkan sebuah tombol dengan perintah tmux, dan unbind-key KEY melepasnya. Bagi pemula, dua perintah ini sering terbalik: unbind bukan "melepaskan tombol dari aplikasi", melainkan menghapus binding tmux atas tombol tersebut. Urutan yang benar untuk mengganti adalah: unbind dulu, baru bind. Bendera yang sering muncul: -n untuk keybinding tanpa prefix (kita bahas di episode 4), -r untuk keybinding yang bisa diulang (contohnya resize), dan -T untuk memilih key table — misalnya bind -T prefix C-x new-window mengikat prefix + Ctrl+x.
set-option (biasa disingkat set) mengatur opsi session, dan set-window-option (setw) mengatur opsi window. Keduanya memakai bendera -g untuk menandai "global", yaitu nilai default yang berlaku untuk semua session atau window yang baru dibuat. Contoh: set -g mouse on adalah opsi session, sementara setw -g mode-keys vi adalah opsi window. Menggunakan set untuk opsi window biasanya tetap "bekerja" di banyak kasus, tetapi memisahkannya dengan benar membuat config kalian jelas dan memudahkan pembacaan orang lain.
Konsep yang harus dipahami betul adalah tingkatan opsi. Tmux membedakan empat lapisan: opsi server berlaku untuk seluruh server; opsi session (global) menjadi nilai default untuk session; opsi window (global) menjadi nilai default untuk window; dan opsi pane untuk pane individual. Nilai pada lapisan lebih spesifik menimpa nilai default global. Inilah sebabnya set -g history-limit 10000 cukup ditulis sekali — semua window yang dibuat sesudahnya mewarisi nilai itu, kecuali ada yang menimpanya secara spesifik.
| Tingkatan | Perintah | Contoh | Mempengaruhi |
|---|---|---|---|
| Server | set -s | set -s escape-time 10 | Seluruh server dan semua session |
| Session (global) | set -g | set -g mouse on | Semua session yang baru dibuat |
| Session (spesifik) | set | set mouse off | Hanya session saat ini |
| Window (global) | setw -g | setw -g mode-keys vi | Semua window yang baru dibuat |
| Window (spesifik) | setw | setw remain-on-exit on | Hanya window saat ini |
set -g mouse on mengaktifkan dukungan mouse penuh: resize pane dengan menyeret batas, menggulir scrollback dengan roda, dan mengklik untuk memindahkan fokus. Tanpa opsi ini, roda mouse di tmux tidak melakukan apa-apa — salah satu keluhan terbesar migran dari terminal biasa. Efek sampingnya perlu disadari: seleksi teks dengan mouse dialihkan menjadi seleksi tmux (masuk copy mode), sehingga untuk menyalin ke clipboard di luar tmux kalian perlu menahan Shift atau memakai mekanisme copy mode yang kita bahas di episode 5.
set -g history-limit 10000 memperluas scrollback default dari 2.000 menjadi 10.000 baris. Ingat sifat ring buffer dari episode 5: batas ini ditetapkan saat window dibuat, bukan saat config di-reload. Mengubahnya lalu me-reload tidak akan memperluas window yang sudah ada — kalian perlu membuat window baru atau me-restart server (tmux kill-server lalu mulai lagi) untuk melihat efeknya.
set -sg escape-time 10 menurunkan jendela waktu tmux menunggu karakter Escape dari 500 milidetik default menjadi 10 milidetik. Angka ini sangat terasa di vim atau emacs: dengan nilai default, menekan Esc di dalam editor sering terasa "tersangkut" karena tmux menunggu apakah Escape akan diikuti tombol lain (yang dibaca sebagai urutan tombol panah). Menurunkannya membuat Esc merespons instan. Batas bawahnya hati-hati: nilai terlalu kecil seperti 1 ms bisa membuat tmux salah membedakan urutan escape tombol panah di beberapa terminal — 10 sampai 50 ms adalah zona aman.
set -g base-index 1 mengubah penomoran window dari nol menjadi satu. Alasan praktisnya sederhana: prefix + 0 berada di pojok kiri atas keyboard dan sering salah tekan, padahal window 0 jarang yang ingin dituju; memulai dari 1 menyelaraskan penomoran dengan kebiasaan manusia. set -g default-shell /bin/zsh memastikan tmux selalu memakai shell yang kalian inginkan, terlepas dari shell yang tercatat di password database sistem — untuk kalian yang menyimpan shell khusus di config, baris ini mencegah "kenapa pane-nya pakai shell lain?".
set -g mouse on
set -g history-limit 10000
set -sg escape-time 10
set -g base-index 1
set -g default-shell /bin/zsh
setw -g pane-base-index 1Baris terakhir, setw -g pane-base-index 1, menetapkan penomoran pane mulai dari 1 — sejajar dengan base-index untuk window. Dengan keduanya, nomor pane dan window kalian konsisten dimulai dari satu, yang sangat membantu ketika berkomunikasi dengan perintah seperti capture-pane -t 0:1.2 dari episode 5.
Berikut gabungan semua yang kita bahas, ditambah keybinding reload dari episode 4 dan copy mode dari episode 5, menjadi satu file utuh yang bisa kalian salin dan sesuaikan:
# ------------------------------------------------------------
# Starter config Belajar Tmux (tmux 3.7b)
# ------------------------------------------------------------
# Prefix: ubah dari Ctrl+B ke Ctrl+A
set -g prefix C-a
unbind C-b
bind C-a send-prefix
# Setting dasar
set -g mouse on
set -g history-limit 10000
set -sg escape-time 10
set -g base-index 1
set -g default-shell /bin/zsh
# Penomoran window dan pane dimulai dari 1
setw -g pane-base-index 1
# Copy mode gaya vi + clipboard lintas SSH
set -g mode-keys vi
set -g set-clipboard on
# Reload konfigurasi: prefix + r
bind r source-file ~/.tmux.conf
bind R source-file ~/.tmux.conf \; display-message "Config reloaded!"Setiap bagian file ini sudah dibahas di episode-episode sebelumnya, jadi sekarang kalian bisa membacanya seperti dokumen, bukan deretan teks asing. default-shell ganti dengan path shell yang kalian pakai (/bin/bash, /bin/zsh, atau $SHELL sesuai preferensi). Setelah file tersimpan, mulai server baru atau jalankan tmux source-file ~/.tmux.conf untuk menguji. Simpan file ini di repo dotfiles kalian — mulai sekarang, semua mesin kalian akan terasa seperti rumah.
Important
Ada satu perangkap yang harus diingat: setting server seperti history-limit dan default-shell baru berlaku penuh setelah server di-restart (tmux kill-server lalu mulai session baru). Keybinding dan opsi session bisa diuji cukup dengan prefix + r, tetapi jika sesuatu terasa "tidak berubah" padahal sudah di-reload, kemungkinan besar opsi itu termasuk golongan server-only. Restart server bukan hal yang menakutkan — session yang sedang berjalan di server itu ikut hilang, jadi lakukan saat tidak ada pekerjaan yang harus dipertahankan.
history-limit lalu berharap langsung berefek. Batas scrollback diterapkan saat window dibuat. Untuk window lama, buat window baru atau restart server — reload saja tidak cukup.\; untuk multi-perintah dalam satu bind. bind R source-file ~/.tmux.conf \; display-message "..." gagal diparsing tanpa backslash sebelum titik koma. Pesan error muncul saat reload, dan keybinding tidak terpasang.set dan setw. Opsi window seperti mode-keys harus setw; opsi session seperti mouse harus set. Meski banyak opsi tetap jalan di tempat yang salah, config yang benar memudahkan dibaca dan dipelihara.escape-time terlalu rendah. Nilai 1 ms memang membuat Esc instan, tetapi bisa salah membaca urutan tombol panah di terminal tertentu. Mulai dari 10 ms dan naikkan jika ada masalah.Episode ini menyatukan semuanya ke dalam satu artefak yang abadi. Kalian memahami di mana tmux mencari konfigurasi (~/.tmux.conf atau varian XDG), kapan config dibaca (sekali saat server lahir), dan bagaimana menerapkan perubahan tanpa restart lewat source-file — lengkap dengan keybinding prefix + r. Kalian menguasai grammar bind-key/unbind-key, set-option vs set-window-option, dan tingkatan opsi server, global, session, serta window. Kalian juga membawa setting wajib: mouse on, history-limit 10000, escape-time 10, base-index 1, dan default-shell — semuanya dirangkum dalam starter config yang siap dipakai dan di-version control.
Poin yang harus kalian bawa:
tmux source-file ~/.tmux.conf.bind/unbind untuk keybinding, set/setw untuk opsi; -g berarti global.mouse, history-limit, escape-time, base-index, dan default-shell adalah fondasi hampir semua config.~/.tmux.conf di repo dotfiles; sediakan ~/.tmux.conf.local untuk override per-mesin.Dengan config yang rapi, tmux kalian sekarang terasa "milik kalian". Di episode 7 kita naik ke seni menata ruang: pane layout dan manipulasi lanjutan — layout preset seperti even-horizontal dan main-vertical, resize presisi, swap pane, break-pane dan join-pane untuk memindahkan pane antar window, zoom, hingga display-panes. Sampai jumpa di episode 7!