Membedah sistem options tmux: empat tingkatan scope (server, session, window, pane), options penting seperti history-limit dan escape-time, serta pengelolaan environment dan working directory yang konsisten.

Di episode 11 sebelumnya kita membahas keybinding — cara memetakan perintah ke kombinasi tombol dengan bind-key dan unbind-key sehingga aksi yang paling sering dipakai bisa diakses dalam satu ketukan. Namun tombol hanyalah pintu masuk; yang menentukan perilaku di balik pintu itu adalah options. Pada episode ini kita membedah sistem options tmux secara menyeluruh: empat tingkatan scope, cara membaca dan mengubahnya, options penting yang wajib kalian setel, serta pengelolaan environment dan working directory yang sering diabaikan padahal sangat menentukan konsistensi workflow.
Di dunia nyata, options adalah pembeda antara tmux yang sekadar "jalan" dan tmux yang "terasa enak". Dua orang bisa memakai tmux 3.7b yang sama persis, tetapi pengalamannya berbeda total hanya karena satu menyetel history-limit dan mouse on sedangkan yang lain tidak. Options juga menjadi bahasa komunikasi antar engineer: ketika rekan kerja bilang "set aggressive-resize on", kalian harus langsung memahami efeknya di mesin kalian.
Pembeda pertama yang harus kalian internalisasi: perintah (command) adalah aksi, options adalah keadaan. new-window adalah perintah — ia melakukan sesuatu seketika. history-limit 10000 adalah option — ia mengubah cara tmux berperilaku selama server hidup. Perintah dieksekusi sekali; options bertahan dan memengaruhi seluruh operasi sesudahnya.
Analogi yang pas adalah kabin mobil. Ada tombol yang bereaksi langsung saat ditekan (perintah), dan ada saklar yang mengubah pengaturan dasar kendaraan — posisi kursi, sensitivitas pedal, kecerahan panel (options). Saklar tidak menghasilkan aksi sesaat, tetapi setiap aksi berikutnya mengikuti pengaturan itu. Di tmux, kalian bisa membuat window baru kapan saja, tetapi apakah window itu membawa history 2000 baris atau 10000 baris ditentukan oleh option history-limit yang disetel jauh sebelumnya.
Tmux membagi options ke dalam empat tingkatan berdasarkan lingkup pengaruhnya. Memahami tingkatan ini adalah kunci, karena dua options bisa punya nama mirip tetapi perilaku berbeda tergantung di tingkat mana ia disetel — misalnya base-index di tingkat session mengatur penomoran window, sedangkan pane-base-index di tingkat window mengatur penomoran pane.
| Tingkatan | Lingkup | Melihat | Mengubah |
|---|---|---|---|
| Server | Seluruh server, semua session | tmux show-options -s | tmux set-option -s |
| Session | Satu session, atau semua (-g) | tmux show-options -g | tmux set-option -g |
| Window | Satu window, atau semua (-g) | tmux show-window-options | tmux set-window-option -g |
| Pane | Satu pane, atau semua (-g) | tmux show-options -p | tmux set-option -p |
Aturan praktisnya: jika kalian hanya ingat satu hal, ingat bahwa option yang disetel di tingkat yang lebih spesifik menimpa nilai global — persis seperti variabel di dalam scope function yang menimpa variabel global. Saat debugging, kalian tidak boleh hanya melihat nilai global; kalian harus memeriksa nilai per-session, per-window, dan per-pane untuk target yang bermasalah.
Perintah untuk membaca options adalah show-options (dengan flag scope) dan alias show-window-options untuk tingkat window. Tanpa argumen, keduanya mencetak semua options beserta nilainya; dengan nama option, hanya option tersebut yang dicetak.
tmux show-options -gDari dalam tmux, pemanggilan yang sama bisa dilakukan lewat command prompt dengan prefix + : lalu mengetik perintah tanpa awalan tmux. Berikut varian scope yang paling sering dipakai:
tmux show-options -s history-limit
tmux show-options -g mouse
tmux show-window-options -g aggressive-resize
tmux show-options -gp remain-on-exitPerhatikan bentuk output khas perintah ini: satu baris berisi option value, dengan nilai kosong untuk boolean yang off dan nilai ber-tanda kutip untuk option yang mengandung spasi. Format yang rapi ini bukan kebetulan — di episode 14 kita akan memakai show-options sebagai sumber data untuk scripting.
Untuk mengubah options, pakai set-option (alias set) dan set-window-option (alias setw). Bendera -g menyetel nilai global sehingga berlaku untuk semua session, window, atau pane sekarang dan yang akan datang. Tanpa -g, perubahan hanya berlaku pada target tertentu lewat -t.
set -g history-limit 10000
set -t dev status off
setw -g aggressive-resize on
setw -g pane-base-index 1Baris pertama menyetel kapasitas history untuk seluruh server, baris kedua mematikan status bar hanya untuk session dev, baris ketiga mengubah perilaku resize semua window, dan baris keempat mengubah penomoran pane di semua window. Pola set -g dan setw -g adalah yang paling sering muncul di ~/.tmux.conf, karena file konfigurasi memang dimaksudkan untuk menetapkan nilai global sejak server dimulai.
Note
Sebagian options hanya berlaku untuk entity yang baru dibuat. history-limit misalnya tidak mengubah kapasitas history pane yang sudah ada — ia hanya berlaku untuk pane yang dibuat setelahnya. Jika perubahan tidak terlihat, ada dua kemungkinan: config belum di-reload, atau option memang hanya memengaruhi object baru.
Default tmux menyimpan 2000 baris history per pane — sering terlalu sedikit untuk membaca log migrasi atau output build yang panjang. Nilai yang umum dipakai komunitas berkisar 10000 hingga 50000. Karena option ini server-wide dan hanya berlaku untuk pane baru, setel sedini mungkin di ~/.tmux.conf.
set -g history-limit 10000Dengan mouse on, kalian bisa scroll history, memilih pane dengan klik, resize border dengan drag, dan memilih teks dalam copy mode. Banyak engineer mematikannya di editor tertentu, tetapi sebagai default global, mouse on adalah keputusan paling banyak diambil di tim-tim produksi karena memangkas kurva belajar anggota baru.
Defaultnya, tmux me-resize window agar pas dengan client yang paling besar. aggressive-resize on membuat window me-resize mengikuti client yang sedang aktif — penting ketika satu window dibuka di banyak session dengan ukuran terminal yang berbeda. Trade-off-nya jelas: full-screen program seperti vim dan htop menyambutnya, tetapi program interaktif yang lambat merespon sinyal SIGWINCH akan terasa kasar.
default-terminal menentukan terminal emulation yang dipakai program di dalam pane. Nilai tmux-256color (default di tmux 3.7b) sudah mendukung 256 warna; kalian bisa mengujinya dengan membandingkan output tput colors di dalam dan di luar tmux. Pastikan terminal luar juga menyetel TERM yang sesuai — kalau tidak, warna akan tampak rusak atau tidak muncul sama sekali.
escape-time adalah berapa milidetik tmux menunggu untuk membedakan satu penekanan Esc dari awal urutan escape sequence seperti tombol panah. Default 500 ms membuat Esc di editor seperti Vim terasa berat — tekan lalu tunggu sepersekian detik sebelum mode berubah. Menurunkan ke 10 membuat respon Vim terasa seketika.
set -g escape-time 10base-index mengubah penomoran window dari 0 menjadi 1 — preferensi mayoritas pengguna. status on mengaktifkan status bar, yang nanti kita sulap menjadi pusat informasi workspace saat membahas format strings di episode lanjutan.
set -g base-index 1
set -g status onSelain options, tmux menyimpan environment variables untuk setiap session. Environment ini adalah snapshot variabel yang dibawa client saat attach, dan justru inilah yang membuat pengalaman berbeda ketika kalian membuka session dari mesin yang berbeda-beda.
Environment session dikelola dengan set-environment (alias setenv). Contoh paling praktis: memastikan EDITOR atau token internal tersedia di semua pane session itu.
set-environment -g EDITOR nvim
set-environment -g MY_APP_ENV staging
show-environmentBendera -g membuat variabel menjadi global sehingga diwarisi session-session baru. Kebalikannya, update-environment adalah daftar variabel yang disinkronkan dari client setiap kali kalian attach — defaultnya mencakup DISPLAY, SSH_AUTH_SOCK, SSH_CONNECTION, dan sejenisnya. Inilah alasan SSH agent forwarding tetap bekerja di dalam tmux meski client berpindah-pindah: tmux menimpa nilai variabel tersebut dari client yang baru attach.
Working directory adalah "alamat rumah" setiap pane. Defaultnya, new-session dan new-window memakai working directory client saat perintah dijalankan. Untuk menegakkan lokasi tertentu — misalnya saat script otomasi membuat session — pakai flag -c:
tmux new-session -d -s api -c /srv/api
tmux new-window -t api -n worker -c /srv/api/worker
tmux send-keys -t api:0 'pwd' EnterDi session api, setiap pane tahu persis berada di direktori proyeknya masing-masing. Inilah yang membuat session tmux lebih unggul daripada sekadar terminal yang dibuka manual: lokasi, environment, dan layout dikemas menjadi satu artefak yang bisa dibuka ulang.
Satu detail yang sering membingungkan: session baru yang dibuat dari dalam tmux mewarisi environment session saat itu, sedangkan session yang dibuat dari luar memakai environment shell luar. Dengan set-environment -g, kalian menjamin variabel tertentu selalu ada di semua session tanpa bergantung pada asal pembuatannya.
set-environment -g DEPLOY_TARGET prodKombinasi set-environment -g dan update-environment adalah dua arah yang saling melengkapi: yang pertama memaksakan nilai global, yang kedua menyinkronkan nilai "hidup" milik client. Memahami keduanya akan menyelamatkan kalian dari kebingungan klasik "kenapa env-nya beda di session itu?".
Berikut kumpulan options yang menjadi titik awal sehat untuk hampir semua pengguna tmux 3.7b:
set -g history-limit 10000
set -g escape-time 10
set -g default-terminal "tmux-256color"
set -g mouse on
set -g base-index 1
setw -g pane-base-index 1
setw -g aggressive-resize on
set -g status onReload dengan tmux source-file ~/.tmux.conf atau prefix + r jika kalian sudah mengikat reload di episode 11, lalu uji satu per satu. Jangan menyalin mentah — setiap baris punya trade-off, dan bagian Kesalahan Umum di bawah ini menjelaskan jebakan yang paling sering muncul.
-t lalu heran tidak berlaku global. set -t dev status off hanya memengaruhi session dev. Jika maksudnya semua session, gunakan set -g.escape-time tapi program dalam pane tetap lambat. escape-time bukan satu-satunya sumber latensi — aplikasi seperti Neovim punya ttimeoutlen sendiri. Setel keduanya bersama untuk hasil terbaik.history-limit mengubah pane yang sudah ada. Option ini hanya berlaku untuk pane baru. Setelah mengubahnya, buat window baru untuk menguji, jangan scroll window lama.update-environment tanpa menyertakan nilai default. List ini adalah pengganti total, bukan tambahan. Jika kalian menulis set -g update-environment FOO, variabel DISPLAY dan SSH_AUTH_SOCK berhenti disinkronkan — kecuali memang itu tujuannya.default-terminal tanpa menyesuaikan terminal luar. Nilai di dalam dan di luar tmux harus konsisten; mismatched TERM menghasilkan warna rusak atau karakter aneh di editor.tmux source-file ~/.tmux.conf setelah edit, dan jadikan ini kebiasaan sebelum menyalahkan option.Episode ini memberi kalian kendali penuh atas perilaku tmux: empat tingkatan scope options, pembacaan dengan show-options/show-window-options, perubahan dengan set-option/set-window-option, serta options kunci seperti history-limit, mouse, aggressive-resize, default-terminal, escape-time, base-index, dan status. Kalian juga kini mengelola environment via set-environment dan update-environment, serta mengendalikan working directory setiap pane dengan flag -c.
Poin yang harus kalian bawa:
set -g/setw -g adalah default di config; -t untuk target spesifik.update-environment menjaga variabel client tetap hidup; set-environment -g memaksakan nilai global.Semua pengaturan ini masih bisa hilang begitu server dimatikan — yang membawa kita ke masalah berikutnya: mempertahankan session beserta seluruh state-nya. Di episode 13 selanjutnya kita akan membahas persistence, session restore, dan data management — menghidupkan kembali session setelah reboot dengan tmux-resurrect dan tmux-continuum, menyimpan scrollback dengan capture-pane, serta logging window dengan pipe-pane. Sampai jumpa di episode 13!