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ốngiTerm tabstmux
Đóng cửa sổ → tiến trìnhBị killVẫn chạy trong session
SSH lên server, mất mạngTiến trình chếtDetach tự động, attach lại sau
Layout nhiều pane song songPhải kéo chuột chia splitVà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 %".

💡 Tip: remap prefix sang Ctrl-a
Ctrl-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ímAction
Ctrl-b %Split pane dọc
Ctrl-b "Split pane ngang
Ctrl-b ←↑→↓Move giữa pane
Ctrl-b zZoom toggle pane
Ctrl-b xClose pane
Ctrl-b cNew window
Ctrl-b n / pNext/prev window
Ctrl-b ,Rename window
Ctrl-b wList windows
Ctrl-b dDetach 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 độ
📘 Use case thật
  • 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ị

AliasLệnh thậtKhi nào dùng
gsgit statusGõ liên tục mỗi vài phút
gdgit diffTrước khi commit
glgit log --oneline -20Xem lịch sử nhanh
llls -lahList có size + hidden
..cd ..Lùi 1 cấp
...cd ../..Lùi 2 cấp
tntmux new -sTạo session nhanh
tatmux attach -tAttach 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.

📘 Pattern dotfiles repo
Tạo folder ~/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_THEMEplugins=(...) 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:

  1. Xem PATH hiện tại: echo $PATH
  2. Xem editor mặc định: echo $EDITOR
  3. Liệt kê alias có sẵn: alias
  4. Tạo alias tạm: alias gs="git status" rồi gõ gs
  5. Export biến tạm: export FOO=bar && echo $FOO
you@mac — chuong9 practice
you@mac ~ $

8. Bài tập về nhà

Trên Terminal thật (không phải simulator), làm tuần tự:

  1. Cài tmux: brew install tmux. Kiểm tra tmux -V.
  2. Tạo session đầu tiên: tmux new -s learn. Bên trong, split pane dọc (Ctrl-b %), chạy top ở pane phải, gõ lệnh ở pane trái.
  3. Detach (Ctrl-b d), kiểm tra tmux ls, attach lại bằng tmux a -t learn.
  4. Tạo window thứ 2 (Ctrl-b c), rename thành logs bằng Ctrl-b ,. Nhảy qua lại bằng Ctrl-b n/p.
  5. Mở ~/.zshrc, viết 5 alias hữu ích cho bản thân (tham khảo bảng ở mục 5). source ~/.zshrc rồi test từng alias.
  6. Cài starship (brew install starship) và thêm eval "$(starship init zsh)" vào cuối ~/.zshrc. Mở terminal mới — prompt khác chưa?
  7. Tạo file ~/.tmux.conf với nội dung sau (đặt prefix thành Ctrl-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
  8. Reload config từ trong tmux: Ctrl-a : rồi gõ source-file ~/.tmux.conf. Test prefix mới.
  9. Tạo repo ~/dotfiles, đưa .zshrc.tmux.conf vào, push lên GitHub (private repo cũng được).

9. Quiz — Kiểm tra kiến thức

10. Tổng kết

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

Trước ← Chương 08: Networking & SSH Tiếp theo Chương 10: Automation & cron →