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:

  1. Mở WezTerm (tự maximize)
  2. Ctrl+Shift+P → Enter
  3. 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),
      },
    },
  },
}