Tmux + sessionizer Quản lý terminal workflow như pro

Minh họa Tmux pane layout editor bên trái terminal chạy server bên phải logs dưới cùng

Tmux: Terminal multiplexer bất kỳ developer nào cũng nên biết

Tmux cho phép chia cửa sổ terminal thành nhiều pane, tạo nhiều session, detach/attach bất cứ lúc nào. Khi kết hợp với sessionizer (script fuzzy finder cho session), bạn có thể chuyển đổi giữa các project chỉ trong vài giây mà không cần nhớ đường dẫn hay tên session.

Cài đặt và cấu hình cơ bản Tmux

Trên Ubuntu/Debian: sudo apt install tmux. Trên macOS: brew install tmux. File cấu hình chính ở ~/.tmux.conf. Các setting quan trọng:

# Prefix key thay C-b bằng C-Space (dễ nhấn hơn)
unbind C-b
set -g prefix C-Space
bind C-Space send-prefix

# Cho phép mouse click chọn pane, resize
set -g mouse on

# Index từ 1 thay vì 0
set -g base-index 1
setw -g pane-base-index 1

# History limit lớn
set -g history-limit 10000

# Vi mode cho copy mode
setw -g mode-keys vi

Sessionizer: Fuzzy finder cho Tmux session

Sessionizer là một script shell (thường dùng fzf) cho phép tìm và switch session nhanh. Tạo file ~/scripts/tmux-sessionizer:

#!/bin/bash
# Tmux sessionizer - tìm và switch session bằng fzf

selected=$(find ~/projects ~/work ~/personal -mindepth 1 -maxdepth 1 -type d | fzf)
if [[ -z $selected ]]; then exit 0; fi

selected_name=$(basename "$selected" | tr . _)
tmux_running=$(pgrep tmux)

if [[ -z $TMUX ]] && [[ -z $tmux_running ]]; then
    tmux new-session -s "$selected_name" -c "$selected"
    exit 0
fi

if ! tmux has-session -t="$selected_name" 2>/dev/null; then
    tmux new-session -ds "$selected_name" -c "$selected"
fi

tmux switch-client -t "$selected_name"

Cấp quyền thực thi: chmod +x ~/scripts/tmux-sessionizer. Bind vào tmux prefix trong ~/.tmux.conf:

bind-key -r f run-shell "tmux neww ~/scripts/tmux-sessionizer"

Giờ bấm Prefix + f (C-Space f) sẽ mở fuzzy finder chọn project, tự tạo session mới nếu chưa có.

Workflow thực tế hàng ngày

  1. Khởi động ngày làm việc: Mở terminal, Tmux auto-start (qua systemd user service hoặc shell rc), bấm Prefix + f chọn project đầu tiên
  2. Chuyển project: Prefix + f → gõ tên project → Enter. Session cũ vẫn chạy nền với mọi process
  3. Chia màn hình trong project: Prefix + | (vertical split), Prefix + - (horizontal split). Navigate pane: Prefix + h/j/k/l (vim-style)
  4. Detach an toàn: Prefix + d → đóng terminal/laptop, mọi process vẫn chạy
  5. Attach lại: tmux attach hoặc tmux attach -t session_name

Mẹo nâng cao: Tmuxinator cho project phức tạp

Đối với project có nhiều service (backend, frontend, database, redis), dùng Tmuxinator để định nghĩa layout trong file YAML:

# ~/.config/tmuxinator/myproject.yml
name: myproject
root: ~/projects/myproject
windows:
  - editor: nvim .
  - backend: go run main.go
  - frontend: npm run dev
  - db: docker compose up db
  - logs: docker compose logs -f

Chạy tmuxinator myproject sẽ tự tạo session với 5 window, mỗi window chạy command tương ứng. Kết hợp với sessionizer: bấm Prefix + f, gõ myproject, nếu session chưa có thì tmuxinator sẽ tạo mới.

Minh họa Tmux pane layout editor bên trái terminal chạy server bên phải logs dưới cùng
Ghi màn hình demo workflow Prefix+f chọn project auto tạo session với tmuxinator layout

Kết luận

Tmux + sessionizer biến terminal thành workspace linh hoạt, bền vững. Bạn không bao giờ mất context khi chuyển project, không lo process bị kill khi đóng terminal. Thời gian setup một lần, hưởng lợi cả đời dev career.

Tài liệu tham khảo: Tmux trên GitHub, fzf trên GitHub, Tmuxinator documentation.

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

HTMX + Alpine.js: Xây Dựng Web Động Không Cần React Hay Vue

Trong thế giới web hiện đại, không còn nhiều ai chọn React hay Vue cho một trang web đơn giản – vì chúng tốn hàng chục MB bundle, require build…

Xem thêm

Hướng dẫn Nginx Reverse Proxy: cấu hình và tối ưu hiệu năng

Trong hạ tầng web hiện đại, Nginx Reverse Proxy đóng vai trò trung gian đón request từ client rồi chuyển tiếp tới backend, giúp ẩn cấu trúc nội bộ, phân…

Xem thêm

SQLite Streaming Replication: Litestream và libSQL Cho Production

SQLite Streaming Replication là gì? SQLite streaming replication là kỹ thuật sao chép dữ liệu SQLite liên tục từ source đến destination trong thời gian thực. Khác với backup định…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất