tmux Setup Produktivitas Terminal Engineer
Kamu lagi SSH ke server, jalanin proses build yang butuh 20 menit, terus koneksi internet di warnet putus. Proses mati. Kamu mau nangis.
Atau skenario lain: kamu buka 7 tab terminal — satu buat server, satu buat log, satu buat database, sisanya entah buat apa — dan semuanya berantakan nggak ada struktur. Alt+Tab jadi olahraga jempol.
Dua masalah ini solved pakai satu tool: tmux. Bukan sekadar "terminal multiplexer", tapi fondasi workflow terminal yang serius.
Artikel ini bukan overview. Ini adalah setup yang gue pakai sehari-hari, lengkap dengan config, keybinding, dan gotcha yang sempat bikin gue frustrasi.
Kenapa tmux, Bukan Sekadar Tab Terminal Biasa
Tab terminal di iTerm2, Alacritty, atau Windows Terminal itu nyaman, tapi punya satu kelemahan fatal: session mati kalau terminal app-nya ditutup atau koneksi SSH putus.
tmux berbeda. Session tmux hidup di server (atau lokal), bukan di terminal emulator kamu. Kamu bisa:
- Detach dari session, tutup laptop, buka lagi besok — proses masih jalan.
- SSH dari device berbeda, attach ke session yang sama.
- Split pane horizontal/vertikal dalam satu window tanpa install plugin tambahan.
- Buat layout yang konsisten untuk tiap project.
Kalau kamu sering kerja dengan remote server atau punya workflow yang butuh banyak pane sekaligus, tmux bukan optional — ini essential.
Install tmux
Sebagian besar distro Linux dan macOS sudah bisa install tmux langsung:
# Ubuntu/Debian
sudo apt install tmux
# macOS dengan Homebrew
brew install tmux
# Arch
sudo pacman -S tmux
Cek versi setelah install:
tmux -V
# tmux 3.3a
Pastikan versi minimal 3.x. Beberapa fitur di config ini butuh tmux 3.0+.
Konfigurasi tmux yang Langsung Bisa Dipakai
File config tmux ada di ~/.tmux.conf. Kalau belum ada, buat baru. Ini config yang gue pakai, dengan penjelasan tiap bagian:
# ~/.tmux.conf
# Ganti prefix dari Ctrl+b ke Ctrl+a (lebih ergonomis)
unbind C-b
set -g prefix C-a
bind C-a send-prefix
# Reload config tanpa restart
bind r source-file ~/.tmux.conf \; display "Config reloaded!"
# Split pane dengan | dan - (lebih intuitif dari % dan ")
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
unbind '"'
unbind %
# Navigasi pane pakai Vim keys
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
# Resize pane
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5
# Mulai numbering window dari 1, bukan 0
set -g base-index 1
setw -g pane-base-index 1
# Renumber window otomatis saat ada yang ditutup
set -g renumber-windows on
# Aktifkan mouse support
set -g mouse on
# Increase scrollback buffer
set -g history-limit 10000
# Warna terminal
set -g default-terminal "screen-256color"
set -ga terminal-overrides ",xterm-256color:Rgb"
# Status bar minimalis
set -g status-position bottom
set -g status-bg colour235
set -g status-fg colour136
set -g status-left " #S "
set -g status-right " %H:%M %d-%b "
set -g status-left-length 20
set -g status-right-length 30
# Highlight window aktif
setw -g window-status-current-style fg=colour166,bold
# Vi mode untuk copy
setw -g mode-keys vi
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi y send-keys -X copy-selection-and-cancel
Setelah simpan, apply config:
tmux source-file ~/.tmux.conf
Atau kalau belum ada session tmux yang jalan, langsung buka tmux baru dan tekan Ctrl+a r.
Workflow Dasar: Session, Window, Pane
tmux punya tiga level hierarki yang penting dipahami:
Session
└── Window 1
│ ├── Pane kiri (editor)
│ └── Pane kanan (terminal)
└── Window 2
└── Pane penuh (log server)
Session = satu "workspace" project. Window = tab di dalam session. Pane = split di dalam window.
Command yang sering gue pakai:
# Buat session baru dengan nama
tmux new-session -s myproject
# List semua session
tmux ls
# Attach ke session
tmux attach -t myproject
# Detach dari session (session tetap jalan)
# Tekan: Ctrl+a d
# Kill session
tmux kill-session -t myproject
Di dalam tmux, semua command diawali prefix key. Dengan config di atas, prefix-nya Ctrl+a:
| Aksi | Keybinding |
|---|---|
| Split horizontal | Ctrl+a | |
| Split vertikal | Ctrl+a - |
| Navigasi pane | Ctrl+a h/j/k/l |
| Buat window baru | Ctrl+a c |
| Pindah window | Ctrl+a n / Ctrl+a p |
| Rename window | Ctrl+a , |
| Detach session | Ctrl+a d |
| Kill pane | Ctrl+a x |
Bikin Layout Project Otomatis dengan Script
Ini bagian yang paling menghemat waktu. Daripada setup pane manual tiap kali buka project, gue pakai shell script yang bikin layout otomatis.
Contoh untuk project Node.js dengan backend dan frontend:
#!/bin/bash
# ~/scripts/dev-session.sh
SESSION="dev"
PROJECT_DIR="$HOME/projects/myapp"
# Kalau session sudah ada, langsung attach
tmux has-session -t $SESSION 2>/dev/null
if [ $? == 0 ]; then
tmux attach-session -t $SESSION
exit 0
fi
# Buat session baru
tmux new-session -d -s $SESSION -n "editor" -c $PROJECT_DIR
# Window 1: Editor + terminal kecil di bawah
tmux split-window -v -p 25 -t $SESSION:editor -c $PROJECT_DIR
tmux send-keys -t $SESSION:editor.1 "nvim ." Enter
tmux send-keys -t $SESSION:editor.2 "git status" Enter
# Window 2: Server
tmux new-window -t $SESSION -n "server" -c $PROJECT_DIR
tmux send-keys -t $SESSION:server "npm run dev" Enter
# Window 3: Log + Database
tmux new-window -t $SESSION -n "logs" -c $PROJECT_DIR
tmux split-window -h -t $SESSION:logs -c $PROJECT_DIR
tmux send-keys -t $SESSION:logs.1 "tail -f logs/app.log" Enter
tmux send-keys -t $SESSION:logs.2 "psql -U postgres myapp" Enter
# Fokus ke window pertama
tmux select-window -t $SESSION:editor
tmux select-pane -t $SESSION:editor.1
# Attach
tmux attach-session -t $SESSION
Buat executable dan jalankan:
chmod +x ~/scripts/dev-session.sh
# Tambah alias di ~/.bashrc atau ~/.zshrc
alias dev="~/scripts/dev-session.sh"
# Sekarang cukup ketik:
dev
Setiap kali ketik dev, kamu langsung masuk ke workspace yang sudah tertata — editor, server, log, database — semua di tempat yang sama.
Gotcha yang Sempat Bikin Frustrasi
1. Warna terminal kacau setelah masuk tmux
Ini masalah paling umum. Fix-nya ada di config:
set -g default-terminal "screen-256color"
set -ga terminal-overrides ",xterm-256color:Rgb"
Pastikan terminal emulator kamu juga di-set ke xterm-256color. Di Alacritty, tambahkan di config:
# ~/.config/alacritty/alacritty.yml
env:
TERM: xterm-256color
2. Copy-paste tidak berfungsi seperti biasa
tmux punya clipboard sendiri. Dengan config mode-keys vi di atas, masuk copy mode dengan Ctrl+a [, navigasi dengan vim keys, tekan v untuk mulai select, y untuk copy. Paste dengan Ctrl+a ].
Kalau mau sync dengan system clipboard di macOS:
# Install reattach-to-user-namespace
brew install reattach-to-user-namespace
# Tambah di ~/.tmux.conf
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "reattach-to-user-namespace pbcopy"
Di Linux dengan xclip:
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xclip -selection clipboard"
3. Escape key delay di Vim/Neovim
tmux punya default escape time 500ms yang bikin Vim terasa lambat saat tekan Escape. Fix:
# ~/.tmux.conf
set -sg escape-time 10
4. SSH session tetap putus meski pakai tmux
tmux-nya tetap jalan di server, tapi SSH connection-nya yang putus. Solusinya bukan di tmux, tapi di SSH config:
# ~/.ssh/config
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
Ini kirim keepalive packet setiap 60 detik, jadi koneksi SSH lebih stabil.
Plugin tmux yang Worth It (Tanpa Plugin Manager Ribet)
Gue sengaja nggak pakai TPM (tmux Plugin Manager) karena satu dependency lagi = satu hal yang bisa rusak. Tapi ada dua plugin yang worth install manual:
tmux-resurrect: Save dan restore session tmux setelah reboot.
git clone https://github.com/tmux-plugins/tmux-resurrect ~/.tmux/plugins/tmux-resurrect
# Tambah di ~/.tmux.conf
run-shell ~/.tmux/plugins/tmux-resurrect/resurrect.tmux
# Keybinding:
# Ctrl+a Ctrl+s = save session
# Ctrl+a Ctrl+r = restore session
Setelah reboot server, Ctrl+a Ctrl+r dan semua window + pane kamu balik lagi. Proses yang sedang jalan memang nggak bisa di-restore otomatis, tapi layout-nya ada.
Langkah Lanjutan
Ini yang gue lakuin setelah setup dasar ini stabil:
-
Buat script session per project — setiap project punya
dev.shsendiri di root folder-nya. Konsisten, mudah di-share ke teammate. -
Integrasi dengan fzf — buat fuzzy finder untuk switch antar session tmux:
# Tambah di ~/.bashrc atau ~/.zshrc
tms() {
local session
session=$(tmux list-sessions -F "#{session_name}" 2>/dev/null | fzf --prompt="Switch session: ")
[ -n "$session" ] && tmux switch-client -t "$session"
}
-
Setup tmux di server production — bukan buat deploy, tapi buat monitoring. Satu session dengan pane
htop,tail -flog, dan shell siap pakai. Kalau kamu perlu tracking waktu development, best time tracking software for developers bisa membantu dokumentasi session-session penting. -
Pelajari tmux command mode —
Ctrl+a :buka command prompt tmux. Dari sini kamu bisa jalankan hampir semua command tmux secara interaktif, bagus buat eksplorasi fitur baru.
Config lengkap ada di gist yang bisa kamu fork dan modifikasi sesuai kebutuhan. Mulai dari config minimal dulu, tambah keybinding sesuai kebiasaan kamu — jangan langsung copy semua config orang lain tanpa ngerti isinya.