WezTerm
WezTerm là gì
Terminal emulator viết bằng Rust. Cross-platform, script được bằng Lua. Khác biệt chính so với Windows Terminal: tự động hóa được mọi thứ bằng code.
Cài đặt
Tải từ https://wezfurlong.org/wezterm/installation.html
Config file: C:\Users\{username}\.wezterm.lua
Lưu file là tự reload, không cần khởi động lại.
Workspace một phím: Ctrl+Shift+P
Bấm Ctrl+Shift+P → gõ đường dẫn project → WezTerm tự mở tab Claude và tab Opencode ở thư mục đó.
local wezterm = require 'wezterm'
local act = wezterm.action
{
key = 'p',
mods = 'CTRL|SHIFT',
action = act.PromptInputLine{
description = 'Enter project path (Enter = D:):',
action = wezterm.action_callback(function(window, pane, line)
local project_path = (line and line ~= '') and line or 'D:'
local tab1 = window:mux_window():spawn_tab{ cwd = project_path }
tab1:active_pane():send_text("claude\r")
local tab2 = window:mux_window():spawn_tab{ cwd = project_path }
tab2:active_pane():send_text("opencode\r")
end),
},
}
Đổi "claude" và "opencode" thành tool bạn dùng. Muốn thêm tab thì thêm spawn_tab.
Phím tắt
keys = {
{ key = 'w', mods = 'CTRL', action = act.CloseCurrentTab{confirm = false} },
{ key = 'Tab', mods = 'CTRL', action = act.ActivateTabRelative(1) },
{ key = 'Tab', mods = 'CTRL|SHIFT', action = act.ActivateTabRelative(-1) },
{ key = 'd', mods = 'CTRL|SHIFT', action = act.SplitHorizontal{domain = 'CurrentPaneDomain'} },
{ key = 'D', mods = 'CTRL|SHIFT', action = act.SplitVertical{domain = 'CurrentPaneDomain'} },
{ key = 'LeftArrow', mods = 'ALT', action = act.ActivatePaneDirection 'Left' },
{ key = 'RightArrow', mods = 'ALT', action = act.ActivatePaneDirection 'Right' },
}
- Ctrl+Tab / Ctrl+Shift+Tab: Chuyển tab
- Ctrl+W: Đóng tab, không hỏi
- Ctrl+Shift+D: Split ngang
- Ctrl+Shift+Shift+D: Split dọc
- Alt+mũi tên: Chuyển pane
Auto-maximize khi mở
wezterm.on('gui-startup', function(cmd)
local tab, pane, window = wezterm.mux.spawn_window(cmd or {})
window:gui_window():maximize()
end)
Giao diện tối giản
Tắt scrollbar, tắt fancy tab bar. Tab bar chỉ hiện khi có nhiều hơn 1 tab.
enable_scroll_bar = false,
use_fancy_tab_bar = false,
hide_tab_bar_if_only_one_tab = true,
font = wezterm.font 'Cascadia Code',
font_size = 13,
Màu ANSI tối hơn mặc định, đọc đỡ mắt trên nền trắng:
colors = {
background = "#FFFFFF",
foreground = "#000000",
ansi = {
"#1a1a1a", "#cc0000", "#008800", "#cc6600",
"#0066cc", "#cc00cc", "#0088aa", "#666666",
},
},
Workflow
Mỗi sáng:
- Mở WezTerm (tự maximize)
- Ctrl+Shift+P → Enter
- Claude và Opencode sẵn sàng trong 2 tab
5 giây. Không mở tab thủ công, không gõ lệnh lặp lại.
Config đầy đủ
local wezterm = require 'wezterm'
local act = wezterm.action
wezterm.on('gui-startup', function(cmd)
local tab, pane, window = wezterm.mux.spawn_window(cmd or {})
window:gui_window():maximize()
end)
return {
font = wezterm.font 'Cascadia Code',
font_size = 13,
default_cwd = "D:\\",
default_prog = {"powershell.exe"},
enable_scroll_bar = false,
use_fancy_tab_bar = false,
hide_tab_bar_if_only_one_tab = true,
colors = {
background = "#FFFFFF",
foreground = "#000000",
ansi = {
"#1a1a1a", "#cc0000", "#008800", "#cc6600",
"#0066cc", "#cc00cc", "#0088aa", "#666666",
},
},
keys = {
{ key = 'w', mods = 'CTRL', action = act.CloseCurrentTab{confirm = false} },
{ key = 'Tab', mods = 'CTRL', action = act.ActivateTabRelative(1) },
{ key = 'Tab', mods = 'CTRL|SHIFT', action = act.ActivateTabRelative(-1) },
{ key = 'd', mods = 'CTRL|SHIFT', action = act.SplitHorizontal{domain = 'CurrentPaneDomain'} },
{ key = 'D', mods = 'CTRL|SHIFT', action = act.SplitVertical{domain = 'CurrentPaneDomain'} },
{ key = 'LeftArrow', mods = 'ALT', action = act.ActivatePaneDirection 'Left' },
{ key = 'RightArrow', mods = 'ALT', action = act.ActivatePaneDirection 'Right' },
{
key = 'p',
mods = 'CTRL|SHIFT',
action = act.PromptInputLine{
description = 'Enter project path (Enter = D:):',
action = wezterm.action_callback(function(window, pane, line)
local project_path = (line and line ~= '') and line or 'D:'
local tab1 = window:mux_window():spawn_tab{ cwd = project_path }
tab1:active_pane():send_text("claude\r")
local tab2 = window:mux_window():spawn_tab{ cwd = project_path }
tab2:active_pane():send_text("opencode\r")
end),
},
},
},
}