tmux Setup Produktivitas Terminal Engineer

by Marcus Chen
tmux Setup Produktivitas Terminal Engineer

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:

  1. Buat script session per project — setiap project punya dev.sh sendiri di root folder-nya. Konsisten, mudah di-share ke teammate.

  2. 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"
}
  1. Setup tmux di server production — bukan buat deploy, tapi buat monitoring. Satu session dengan pane htop, tail -f log, dan shell siap pakai. Kalau kamu perlu tracking waktu development, best time tracking software for developers bisa membantu dokumentasi session-session penting.

  2. 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.