Chương 09 — Tmux & productivity
Đây là chỗ bạn biến terminal thành môi trường làm việc thực sự: nhiều panes song song, session không chết khi mất Wi-Fi, alias gõ tắt, prompt đẹp và config dotfiles version-control như code.
1. Vì sao tmux
tmux (terminal multiplexer) cho phép bạn chạy nhiều shell trong cùng 1 cửa sổ, chia màn hình thành panes, gom panes thành windows, gom windows thành sessions — và quan trọng nhất: session vẫn sống ngay cả khi bạn ngắt kết nối.
So sánh với mở nhiều tab iTerm
| Tình huống | iTerm tabs | tmux |
|---|---|---|
| Đóng cửa sổ → tiến trình | Bị kill | Vẫn chạy trong session |
| SSH lên server, mất mạng | Tiến trình chết | Detach tự động, attach lại sau |
| Layout nhiều pane song song | Phải kéo chuột chia split | Vài phím tắt là xong |
| Mở lại đúng layout cũ | Không có | Session lưu sẵn, attach là nguyên xi |
Use case kinh điển: bạn SSH lên VPS, chạy npm run build mất 20 phút.
Đóng laptop đi café — về nhà attach lại session, build vẫn đang chạy hoặc đã xong, log còn nguyên.
2. Cài đặt & lệnh cơ bản
Cài tmux
$ brew install tmux # macOS
$ tmux -V # kiểm tra phiên bản
tmux 3.4
Vòng đời session
$ tmux new -s work # tạo session tên "work"
$ tmux ls # liệt kê session đang có
work: 1 windows (created Thu May 8 09:12:33 2026)
$ tmux attach -t work # quay lại session work (gõ tắt: tmux a -t work)
$ tmux a # attach session gần nhất
$ tmux kill-session -t work # xóa hẳn session work
$ tmux kill-server # tắt sạch mọi session
Prefix key — phím "kích hoạt"
Mọi phím tắt trong tmux đều bắt đầu bằng prefix. Mặc định là
Ctrl-b (giữ Ctrl + bấm b, thả ra, rồi mới bấm phím lệnh kế tiếp).
Cú pháp ta sẽ dùng xuyên suốt: Ctrl-b % nghĩa là "bấm prefix, thả, rồi bấm %".
Ctrl-aCtrl-b bắt tay phải vươn xa, dễ mỏi. Đa số tmux user remap sang Ctrl-a
(gần Caps Lock, tay trái với tới rất thoải mái — quen thuộc với ai từng dùng GNU screen).
Cách làm sẽ ở phần ~/.tmux.conf và bài tập về nhà.
3. Pane & window
Hierarchy của tmux: session chứa nhiều window (như tab), mỗi window chia thành nhiều pane (như split pane trong iTerm).
Pane — chia màn hình
# Bên trong tmux, gõ prefix rồi:
Ctrl-b % # split dọc (chia trái/phải)
Ctrl-b " # split ngang (chia trên/dưới)
Ctrl-b ←/→/↑/↓ # di chuyển giữa các pane
Ctrl-b o # nhảy qua pane kế tiếp
Ctrl-b z # zoom: phóng to pane hiện tại (toggle)
Ctrl-b x # đóng pane hiện tại (hỏi xác nhận)
Ctrl-b { # swap pane sang trái
Ctrl-b } # swap pane sang phải
Window — như tab
Ctrl-b c # tạo window mới
Ctrl-b n # next window
Ctrl-b p # previous window
Ctrl-b 0..9 # nhảy thẳng tới window số đó
Ctrl-b , # rename window hiện tại
Ctrl-b w # mở list window có sẵn để chọn
Ctrl-b & # kill window hiện tại
Bảng phím tắt cần thuộc
| Phím | Action |
|---|---|
Ctrl-b % | Split pane dọc |
Ctrl-b " | Split pane ngang |
Ctrl-b ←↑→↓ | Move giữa pane |
Ctrl-b z | Zoom toggle pane |
Ctrl-b x | Close pane |
Ctrl-b c | New window |
Ctrl-b n / p | Next/prev window |
Ctrl-b , | Rename window |
Ctrl-b w | List windows |
Ctrl-b d | Detach session |
Ctrl-b $ | Rename session |
Ctrl-b ? | Hiện toàn bộ key bindings (cứu cánh khi quên) |
4. Detach & resume — siêu năng lực thật sự
Đây là lý do chính người ta dùng tmux. Ctrl-b d sẽ detach —
tách bạn ra khỏi session, nhưng tiến trình bên trong vẫn tiếp tục chạy. Quay lại bằng tmux a.
$ tmux new -s deploy
# bên trong session, chạy lệnh dài:
$ npm run build && rsync -avz dist/ user@server:/var/www/
# Bấm Ctrl-b d → quay về terminal thường, build vẫn chạy ngầm
$ tmux ls
deploy: 1 windows (attached)
$ tmux a -t deploy # vào lại xem tiến độ
- SSH lên server, chạy migration database 30 phút → detach, đóng laptop, attach lại sau khi về.
- Chạy
npm run dev+npm run watch+ log tail trong 3 pane → ngày hôm sau attach lại đúng layout. - Pair programming: 2 người cùng attach 1 session, gõ chung 1 màn hình.
5. Alias & ~/.zshrc
Mỗi lần mở terminal, zsh đọc file ~/.zshrc. Đây là chỗ bạn định nghĩa alias,
biến môi trường, function — tóm lại là biến terminal thành của riêng mình.
Alias — gõ tắt
# Mở file config:
$ nano ~/.zshrc
# Thêm các dòng:
alias gs="git status"
alias gd="git diff"
alias gco="git checkout"
alias ll="ls -lah"
alias ..="cd .."
alias rmi="rm -i" # rm có hỏi xác nhận, an toàn hơn
Sau khi sửa file, reload mà không cần đóng terminal:
$ source ~/.zshrc
$ gs # giờ chạy được rồi
Bảng alias khuyến nghị
| Alias | Lệnh thật | Khi nào dùng |
|---|---|---|
gs | git status | Gõ liên tục mỗi vài phút |
gd | git diff | Trước khi commit |
gl | git log --oneline -20 | Xem lịch sử nhanh |
ll | ls -lah | List có size + hidden |
.. | cd .. | Lùi 1 cấp |
... | cd ../.. | Lùi 2 cấp |
tn | tmux new -s | Tạo session nhanh |
ta | tmux attach -t | Attach nhanh |
Biến môi trường & PATH
# Trong ~/.zshrc:
export EDITOR="nvim"
export PATH="$HOME/bin:$PATH" # thêm ~/bin vào đầu PATH
# Kiểm tra:
$ echo $PATH
$ echo $EDITOR
Nguyên tắc: bất kỳ lệnh nào bạn gõ > 3 lần/ngày — hãy đặt alias.
6. Dotfiles, oh-my-zsh, starship
Dotfiles — config là code
Các file cấu hình bắt đầu bằng dấu chấm (.zshrc, .tmux.conf,
.gitconfig) gọi chung là dotfiles. Best practice: đẩy
chúng lên 1 git repo riêng (vd github.com/you/dotfiles) để máy mới chỉ cần clone là có toàn bộ setup.
~/dotfiles/, đưa file thật vào trong, rồi symlink ra home:
$ mv ~/.zshrc ~/dotfiles/zshrc
$ ln -s ~/dotfiles/zshrc ~/.zshrc
$ cd ~/dotfiles && git init && git add . && git commit -m "init"
Sửa file ở repo = sửa file thật. Có version control, push lên GitHub, máy mới
git clone + chạy script là xong.
oh-my-zsh — framework cho zsh
$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
Sau khi cài, sửa ZSH_THEME và plugins=(...) trong ~/.zshrc.
Plugins hữu ích: git, z (jump tới folder hay dùng),
zsh-autosuggestions (gợi ý lệnh xám xám theo lịch sử),
zsh-syntax-highlighting.
starship — prompt đẹp, nhanh
$ brew install starship
# thêm vào CUỐI ~/.zshrc:
eval "$(starship init zsh)"
Starship hiện ra git branch, ngôn ngữ project (Node version, Python venv...),
thời gian chạy lệnh trước đó. Cấu hình ở ~/.config/starship.toml — chỉ chỉnh khi cần.
Khuyến nghị tối thiểu cho người mới: vài alias gõ tắt, prompt rõ ràng (starship hoặc
oh-my-zsh theme robbyrussell), không cần cài hết plugin trên đời.
Thêm dần khi thấy thật sự thiếu.
7. Thử ngay trong terminal giả lập
Lưu ý: simulator này không chạy tmux thật (tmux cần TTY). Nhưng bạn có thể thử các lệnh quanh việc cấu hình shell:
- Xem PATH hiện tại:
echo $PATH - Xem editor mặc định:
echo $EDITOR - Liệt kê alias có sẵn:
alias - Tạo alias tạm:
alias gs="git status"rồi gõgs - Export biến tạm:
export FOO=bar && echo $FOO
8. Bài tập về nhà
Trên Terminal thật (không phải simulator), làm tuần tự:
- Cài tmux:
brew install tmux. Kiểm tratmux -V. - Tạo session đầu tiên:
tmux new -s learn. Bên trong, split pane dọc (Ctrl-b %), chạytopở pane phải, gõ lệnh ở pane trái. - Detach (
Ctrl-b d), kiểm tratmux ls, attach lại bằngtmux a -t learn. - Tạo window thứ 2 (
Ctrl-b c), rename thànhlogsbằngCtrl-b ,. Nhảy qua lại bằngCtrl-b n/p. - Mở
~/.zshrc, viết 5 alias hữu ích cho bản thân (tham khảo bảng ở mục 5).source ~/.zshrcrồi test từng alias. - Cài starship (
brew install starship) và thêmeval "$(starship init zsh)"vào cuối~/.zshrc. Mở terminal mới — prompt khác chưa? - Tạo file
~/.tmux.confvới nội dung sau (đặt prefix thànhCtrl-a+ bật chuột):# remap prefix Ctrl-b → Ctrl-a unbind C-b set -g prefix C-a bind C-a send-prefix # bật mouse: kéo chia pane, scroll set -g mouse on # bắt đầu đếm window/pane từ 1 thay vì 0 set -g base-index 1 setw -g pane-base-index 1 - Reload config từ trong tmux:
Ctrl-a :rồi gõsource-file ~/.tmux.conf. Test prefix mới. - Tạo repo
~/dotfiles, đưa.zshrcvà.tmux.confvào, push lên GitHub (private repo cũng được).
9. Quiz — Kiểm tra kiến thức
10. Tổng kết
- ✅ tmux: terminal multiplexer — nhiều pane/window/session, sống sót qua disconnect
- ✅ Vòng đời:
tmux new -s,tmux ls,tmux a -t,kill-session - ✅ Prefix mặc định
Ctrl-b(hay remap thànhCtrl-a); thuộc > 10 phím tắt cốt lõi - ✅ Detach
Ctrl-b d= đóng cửa sổ mà tiến trình vẫn chạy - ✅ Alias trong
~/.zshrc; reload bằngsource ~/.zshrc - ✅ Dotfiles version-control bằng git repo riêng; cài
oh-my-zshhoặcstarshipcho prompt đẹp
Chương 10 chúng ta sẽ học Automation & cron — tự động hoá các tác vụ lặp lại: backup hằng ngày, fetch dữ liệu định kỳ, dọn rác cuối tuần. Terminal của bạn sẽ làm việc cả khi bạn đang ngủ.