Published on

WezTermターミナルを使ってみての感想

Authors

今日の築地市場跡地

ターミナルはこれまでiTermやbyobu、Fish Shell、Warp、Ghostty、Macのデフォルトのターミナルを使ってきたが、エディタに付属してるターミナルに落ち着き長らく使用していた。

開発中はターミナルを頻繁に操作することはないため、エディタ付属のもので十分だったがOpenAIやGeminiが出しているCLI型の生成AIを使い始めてからターミナルを使う頻度が増えてきた。

エディタ付属のターミナルでは物足りなくなってきたので、動作が快適で画面分割でき、おしゃれにカスタマイズできるターミナルを探したところWezTermというのを発見した。

WezTermはRustで作られており内部でGPUを利用しているため動作が重くなりにくい。
画面分割はtmuxといったツールを入れなくとも、標準で一画面を縦横に分割できるため導入コストが低い。
Lua言語でキーバインドやターミナルの装飾などを柔軟にカスタマイズできることも特徴で、プラグインを入れることもできる。

ちなみに私のターミナルの見た目はこのようになっている。

1ヶ月ほど使用した感想としては、一画面を分割してAIに指示を出しながら違う作業を進められるのでタブ切り替えやウィンドウの切り替え負荷が無くなった。
キーバインドも慣れてしまえば快適。
動作の軽さに関しては、そこまで重い操作を頻繁にすることはないので肌感ではあるが、他のターミナルでたまに感じた動作中の引っかかる感じが減ったような気もする。
CLIで生成AIにコマンド操作をすることがよくあるので、もしかしたら生成AIをCLIで使う時の快適さにも繋がっているかもしれない。
装飾自由度が高いため視認性も高くでき、背景画像も設定できるのでハイセンスになった気分になる。人気者間違いなし。

使っているオリジナルの設定

local wezterm = require 'wezterm'
local config = wezterm.config_builder()

-- 設定がリロードされるたびにプラグインが更新される
wezterm.plugin.update_all()

-- カラースキームの設定
config.color_scheme = "Cyberdyne"

-- フォントの設定
config.font = wezterm.font_with_fallback({
    "HackGen",
})

-- フォントサイズの設定
config.font_size = 16

-- tab bar
config.use_fancy_tab_bar = false
config.tab_bar_at_bottom = true
config.tab_max_width = 100

-- tabline.wez
local tabline = wezterm.plugin.require("https://github.com/michaelbrusegard/tabline.wez")
tabline.setup({
    options = {
        -- theme = "catppuccin-mocha",
	theme = "cyberpunk",
        -- theme = "Cobalt Neon",
        section_separators = {
            left = wezterm.nerdfonts.ple_upper_left_triangle,
            right = wezterm.nerdfonts.ple_lower_right_triangle,
        },
        component_separators = {
            left = wezterm.nerdfonts.ple_forwardslash_separator,
            right = wezterm.nerdfonts.ple_forwardslash_separator,
        },
        tab_separators = {
            left = wezterm.nerdfonts.ple_upper_left_triangle,
            right = wezterm.nerdfonts.ple_lower_right_triangle,
        },
        -- color_overrides = {
        theme_overrides = {
            tab = {
                active = { fg = "#091833", bg = "#59c2c6" },
            },
        },
    },
    sections = {
        tab_active = {
            "index",
            { "process", padding = { left = 0, right = 1 } },
            "",
            { "cwd",     padding = { left = 1, right = 0 } },
            { "zoomed",  padding = 1 },
        },
        tab_inactive = {
            "index",
            { "process", padding = { left = 0, right = 1 } },
            "󰉋",
            { "cwd",     padding = { left = 1, right = 0 } },
            { "zoomed",  padding = 1 },
        },
    },
})

-- カーソルの設定
config.default_cursor_style = "SteadyBlock"
config.colors = {
    cursor_fg = "#11111b",
    cursor_bg = "#59c2c6",
    cursor_border = "#59c2c6",
}

-- 背景の設定

config.background = {
  {
    source = { File = '/************/image.jpeg' },
    -- 繰り返し表示しない
    repeat_x = 'NoRepeat',
    repeat_y = 'NoRepeat',
    -- Hue, Saturation, Brightness (HSB) の調整
    hsb = {
      -- 明るさ
      brightness = 0.15,
      -- 彩度
      saturation = 1.0,
      -- 色相
      hue = 1.0
    }
  },
}

-- 背景透過の設定
-- config.window_background_opacity = 0.8
-- config.macos_window_background_blur = 20

-- window size
config.initial_rows = 20
config.initial_cols = 70

-- prefixキーの設定(Ctrl + Space)
config.leader = {
    key = "a",
    mods = "CMD",
    timeout_milliseconds = 2000,
}

config.keys = {
    -- quick select (tmux-fingers)
    {
        mods = "LEADER",
        key = "F",
        action = wezterm.action.QuickSelect,
    },

    -- activate copy mode or vim mode
    {
        mods = "LEADER",
        key = "[",
        action = wezterm.action.ActivateCopyMode,
    },

    -- splitting
    {
        mods = "LEADER",
        key = "-",
        action = wezterm.action.SplitVertical({ domain = "CurrentPaneDomain" }),
    },
    {
        mods = "LEADER",
        key = "|",
        action = wezterm.action.SplitHorizontal({ domain = "CurrentPaneDomain" }),
    },

    -- pane move
    {
        mods = "LEADER",
        key = "l",
        action = wezterm.action.ActivatePaneDirection("Right"),
    },
    {
        mods = "LEADER",
        key = "h",
        action = wezterm.action.ActivatePaneDirection("Left"),
    },
    {
        mods = "LEADER",
        key = "j",
        action = wezterm.action.ActivatePaneDirection("Down"),
    },
    {
        mods = "LEADER",
        key = "k",
        action = wezterm.action.ActivatePaneDirection("Up"),
    },

    -- pane zoom
    {
        mods = "LEADER",
        key = "z",
        action = wezterm.action.TogglePaneZoomState,
    },

    -- Create a new tab
    {
        mods = "LEADER",
        key = "c",
        action = wezterm.action.SpawnTab("DefaultDomain"),
    },
    -- Move to the next tab
    {
        mods = "LEADER",
        key = "n",
        action = wezterm.action.ActivateTabRelative(1),
    },
    -- Move to the previous tab
    {
        mods = "LEADER",
        key = "p",
        action = wezterm.action.ActivateTabRelative(-1),
    },
    -- Move to a specified tab ID
    {
        mods = "LEADER",
        key = "1",
        action = wezterm.action.ActivateTab(0),
    },
    {
        mods = "LEADER",
        key = "2",
        action = wezterm.action.ActivateTab(1),
    },
    {
        mods = "LEADER",
        key = "3",
        action = wezterm.action.ActivateTab(2),
    },
    {
        mods = "LEADER",
        key = "4",
        action = wezterm.action.ActivateTab(3),
    },
    {
        mods = "LEADER",
        key = "5",
        action = wezterm.action.ActivateTab(4),
    },
    -- Opt+左矢印でカーソルを前の単語に移動
    {
      key = "LeftArrow",
      mods = "OPT",
      action = wezterm.action.SendKey {
        key = "b",
        mods = "META",
      },
    },
    -- Opt+右矢印でカーソルを次の単語に移動
    {
      key = "RightArrow",
      mods = "OPT",
      action = wezterm.action.SendKey {
        key = "f",
        mods = "META",
      },
    },
    -- Opt+Backspaceで前の単語を削除
    {
      key = "Backspace",
      mods = "OPT",
      action = wezterm.action.SendKey {
        key = "w",
        mods = "CTRL",
      },
    },
}

return config

フォントはHackGenを使用している。
local tabline = wezterm.plugin.require("https://github.com/michaelbrusegard/tabline.wez")はWezTerm用のプラグインでターミナル下のバーがタブ、メモリ使用量、CPU利用率、時刻などが表示される。
config.backgroundで背景画像を設定でき、明るさ、再度、色相を指定することで見やすさを調整できる。
config.leaderconfig.keysはキーバインドの設定となっている。