Script Tmux đơn giản giúp tối ưu hóa phiên làm việc hàng ngày của lập trình viên
Bài viết chia sẻ một script Bash hữu ích giúp thiết lập môi trường làm việc tmux tự động với bố trí hai pane linh hoạt. Script này tích hợp Claude Code và đặt tên session theo nhánh git, giúp quản lý đa dự án hiệu quả hơn.

Cách đây vài năm, tôi từng viết về cách sao chép văn bản giữa các pane của tmux. Lúc đó, tôi vẫn đang tìm hiểu xem cách sắp xếp terminal của mình hoạt động như thế nào (một chủ đề lặp đi lặp lại, thành thật mà nói). Kể từ đó, tmux đã trở thành thứ đầu tiên tôi mở vào mỗi buổi sáng. Tôi đã viết một script bash nhỏ để thiết lập phiên làm việc (dev session) của mình, và sau nhiều lần tinh chỉnh, tôi thấy nó đáng được chia sẻ với mọi người.
Khởi đầu của tôi
Phiên bản đầu tiên tạo ra một bố cục gồm bốn pane:
+------------------+------------------+
| nvim | rails server |
+------------------+------------------+
| lazygit | claude |
+------------------+------------------+
Sử dụng Neovim để chỉnh sửa, Rails server chạy bin/dev (khởi động Overmind với Procfile.dev đầy đủ), lazygit để staging và commit, và Claude Code khi tôi cần một "bộ não thứ hai". Nó trông rất hiệu quả. Bốn pane! Mọi thứ đều hiển thị! Tôi thực sự là một lập trình viên!
Và sau đó tôi thực sự sử dụng nó một thời gian. Pane Rails server chỉ... ngồi đó, chiếm diện tích màn hình trong khi tôi viết code không cần server chạy. Lazygit rất tuyệt, nhưng tôi cũng thường xuyên sử dụng git status và git diff trong shell bình thường. Và bốn pane trên màn hình laptop? Mọi thứ đều quá nhỏ.
Giải pháp cuối cùng
Hai pane. Một shell ở bên trái và Claude Code ở bên phải.
+------------------+------------------+
| shell | claude |
+------------------+------------------+
Shell xử lý mọi thứ tôi cần tại thời điểm đó: chỉnh sửa, git, khởi chạy server, chạy test. Hóa ra là tôi không cần một pane riêng cho từng công cụ. Tôi chỉ cần một nơi để làm việc và một nơi để suy nghĩ thành tiếng.
Chi tiết về Script
Toàn bộ script nằm trong kho dotfiles của tôi, nhưng đây là những gì nó thực hiện:
#!/bin/bash
# Universal Development Session Script
# Creates a 2-pane tmux layout for any Rails project or worktree
# Usage: ./dev-session [session-name] [directory]
# Configuration
DEFAULT_EDITOR="nvim"
DEFAULT_PORT="3000"
get_current_dir() {
pwd
}
get_project_name() {
basename "$(get_current_dir)"
}
get_branch_name() {
if git rev-parse --git-dir > /dev/null 2>&1; then
git branch --show-current 2>/dev/null || echo "main"
else
echo "no-git"
fi
}
generate_session_name() {
local project_name=$(get_project_name)
local branch_name=$(get_branch_name)
if [[ "$branch_name" != "main" && "$branch_name" != "develop" && "$branch_name" != "no-git" ]]; then
safe_branch=$(echo "$branch_name" | sed 's/[\/:]/-/g')
echo "${project_name}-${safe_branch}"
else
echo "$project_name"
fi
}
SESSION_NAME="${1:-$(generate_session_name)}"
WORK_DIR="${2:-$(get_current_dir)}"
if [[ ! -d "$WORK_DIR" ]]; then
echo "Error: Directory $WORK_DIR does not exist"
exit 1
fi
# Reattach if session already exists
if tmux has-session -t "$SESSION_NAME" 2>/dev/null; then
echo "Session '$SESSION_NAME' already exists. Attaching..."
tmux attach-session -t "$SESSION_NAME"
exit 0
fi
# Create session and split into two panes
tmux new-session -d -s "$SESSION_NAME" -c "$WORK_DIR"
tmux split-window -h -c "$WORK_DIR"
# Left pane: shell, right pane: Claude Code
tmux send-keys -t 1 "# Ready for commands (server, etc.)" C-m
tmux send-keys -t 2 "claude" C-m
tmux select-pane -t 1
tmux rename-window "dev"
tmux attach-session -t "$SESSION_NAME"
Tôi tạo alias cho nó trong cấu hình shell để có thể chạy dev từ bất kỳ thư mục dự án nào:
alias dev="~/Documents/Repos/dev-scripts/dev-session"
Những điểm tôi thực sự thích
Nó đặt tên session dựa trên nhánh git của bạn. Nếu tôi đang ở nhánh main, session chỉ là tên dự án (qualify). Trên nhánh tính năng (feature branch), nó sẽ thêm tên nhánh vào (qualify-fix-event-registry). Các dấu gạch chéo trong tên nhánh sẽ được chuyển thành dấu gạch ngang để tmux không bị lỗi.
Đây là phần tôi thích nhất, vì tôi thường có nhiều session chạy cùng lúc, một session cho mỗi nhánh tính năng hoặc worktree. tmux list-sessions cho tôi cái nhìn nhanh về những gì tôi đang làm:
qualify: 1 windows (created Thu Apr 3 09:15:00 2026)
qualify-add-snapshot-tests: 1 windows (created Thu Apr 3 10:30:00 2026)
rubygems: 1 windows (created Wed Apr 2 14:00:00 2026)
Nó không tạo bản sao. Nếu một session với tên đó đã tồn tại, script sẽ chỉ attach vào nó. Tách ra với Ctrl-b d, đi pha cà phê, quay lại, chạy dev lần nữa, và bạn trở lại ngay nơi bạn đã dừng lại. Các session cũng tồn tại qua các chu kỳ ngủ/thức (sleep/wake) của máy, điều mà với tôi vẫn cảm giác như phép thuật vậy.
Nó hoạt động ở bất cứ đâu. Script không giả định là Rails hay thậm chí là git. Tôi dùng nó cho blog này, cho Ruby gems, cho các script ngẫu nhiên. Nếu có repo git, nó sử dụng tên nhánh. Nếu không, bạn chỉ nhận được tên thư mục. Không rắc rối.
Pane Claude Code
Pane bên phải tự động khởi chạy Claude Code. Tôi thích việc nó ở ngay đó thay vì trong một cửa sổ terminal riêng biệt. Tôi có thể liếc nhìn đầu ra của nó trong khi làm việc, và Ctrl-b z (tmux zoom) là người bạn tốt nhất của tôi ở đây, phóng to pane Claude lên toàn màn hình khi tôi đọc một phản hồi dài và sau đó quay lại chế độ chia đôi.
Điều hay khác là ngữ cảnh (context) của Claude Code vẫn được giữ nguyên. Tôi có thể hỏi nó điều gì đó, đi viết code ở pane trái trong hai mươi phút, quay lại và hỏi một câu tiếp theo mà không cần giải thích lại mọi thứ. Chỉ riêng điều đó đã xứng đáng với một pane dành riêng.
Những điều tôi sẽ thay đổi
File .tmux.conf của tôi vẫn tối giản một cách ngượng ngùng. Nó thực sự chỉ là tăng bộ đệm cuộn (scrollback buffer). README trong kho dotfiles của tôi ghi lại các phím tắt điều hướng pane kiểu vim mà tôi thực sự chưa cấu hình. Tôi sẽ làm điều đó. Cuối cùng thì cũng sẽ làm. (Tôi tự nhủ điều này mỗi tuần).
Phiên bản bốn pane (dev-session-fixed) vẫn nằm trong repo. Tôi giữ nó lại cho những lúc tôi đang debug cái gì đó thực sự cần xem log server liên tục. Nhưng tôi đã không cần dùng đến nó trong vài tuần, điều đó nói lên điều gì đó.
Hãy thử ngay
Lấy script từ kho dotfiles của tôi, thả nó vào đâu đó trong đường dẫn (path) của bạn, và tạo alias. Phụ thuộc thực sự duy nhất là chính tmux. Nếu bạn chưa cài đặt Claude Code, không sao, pane đó chỉ trở thành một shell bình thường.
cd your-project
dev
Chỉ vậy thôi. Hai pane, được đặt tên theo nhánh của bạn, sẵn sàng để sử dụng.
Bài viết liên quan

Phần mềm
Anthropic ra mắt Claude Opus 4.7: Nâng cấp mạnh mẽ cho lập trình nhưng vẫn thua Mythos Preview
16 tháng 4, 2026

Công nghệ
Qwen3.6-35B-A3B: Quyền năng Lập trình Agentic, Nay Đã Mở Cửa Cho Tất Cả
16 tháng 4, 2026

Công nghệ
Spotify thắng kiện 322 triệu USD từ nhóm pirate Anna's Archive nhưng đối mặt với bài toán thu hồi
16 tháng 4, 2026
