【最大80% OFF】Kindle本クリスマスセール開催中(12/26まで)

【Mac】WezTermで快適なターミナル体験

12 min

こんにちは。ナミレリです。

今回は、高性能でモダンなターミナルエミュレータであるWezTermの魅力や快適に使う設定を紹介していきます。WezTermは、Alacrittyと同じでRustで開発されています。Alacrittyと同様に高速で軽量な動作を実現しつつ、設定にLuaを採用していますので、私のようなNeovimユーザーにとって、親しみのある言語で設定を管理でき、カスタマイズの自由度が非常に高いです。Neovimユーザーにもおすすめのターミナルです。

また、tmuxの機能も一部内包しているため、私のようなAlacritty + tmuxユーザーにもおすすめのターミナルです。

WezTerm:下部にタブバーを配置

タブバーを下に配置したWezTerm
タブバーを下に配置したWezTerm

この記事はこんな人にオススメ

  • Alacrittyの軽量で高速な動作が好みの方
  • tmuxの設定が煩雑だと感じる人
  • Luaでの設定に慣れているNeovimユーザー
  • RustやGPUアクセラレーションに興味があるユーザー
  • MacのデフォルトのTerminalやiTerm2からの乗り換えを考えているユーザー
この記事のMac環境
  • M3 MacBook Air 15インチ
  • macOS Sequoia 15.1.1
  • WezTerm 20240203-110809-5046fc22
  • Parallels Desktop 20 for Mac バージョン 20.1.2 (55742)
Parallels Desktop 20 for Macの無料トライアル もありますので、ぜひダウンロードして試してみてください。M1/M2/M3のMac上で快適にMacやUbuntu、Windowsが動作します。

はじめに

私の普段のターミナル環境は、Alacritty + tmuxで、その上でNeovimを使っています。高速でカスタマイズ度が高く、見た目もかっこよくとても気に入っています。最近、tmuxのcatppuccinテーマに大幅なアップデートがあり設定に少し苦労しましたが、とても気に入っています。

Alacritty + tmux:catppuccinテーマを使用

Alacritty + tmuxで下部にタブバーを表示
Alacritty + tmuxで下部にタブバーを表示

単にターミナル好きの好奇心からWezTermを使ってみたいというのが動機で、Alacritty + tmuxとWezTermがどちらがいいか?については、人それぞれで環境により異なる、ということだと思っています。

WezTermに惹かれるポイント
  • 設定ファイルにLuaを採用していて、Neovimと親和性が高い
  • tmuxのような機能があること
  • 画像をサポートしていること
  • Rustで開発されていること(高速)

そんな私が、Alacritty + tmuxからWezTermを使うにあたっての外せないポイントは、以下となります。

WezTermを使うにあたって外せないポイント
  1. catppuccinのtmuxテーマのように美しいテーマがあって、カスタマイズ可能か
  2. tmuxのようなprefixキーの設定ができるか
  3. tmux-fingersのような便利なコピー機能があるか
  4. vimのようなコピーモードがあるか
  5. tmuxのようにペインの操作が可能でカスタマイズ可能か
  6. tmuxのようにウィンドウ(タブ)の操作が可能でカスタマイズ可能か

上記の点がWezTermで実現できるか気になっていました。結論からお伝えすると、若干不満もありますが全て実現できました。実現方法は後述していきます。

WezTermって何?

ここまでお伝えしてきたように、そもそもWezTermは、Alacrittyやtmuxユーザーにとって魅力的な機能を備えた、モダンで高性能なターミナルエミュレータです。以下に簡単にWezTermの特徴をまとめますが、詳しくは公式サイトに掲載されていますの確認してください。

WezTermの特徴

  • Linux、macOS、Windows 10、FreeBSDに対応
  • マルチプレックス機能がある
  • リガチャ、カラフルな絵文字に対応
  • ハイパーリンクに対応
  • スクロールバックの検索が可能
  • 下線、二重下線、イタリック、太字、取り消し線などのレンダリングに対応
  • ホットリロードが可能
  • タブ機能とペインの分割が可能
  • WezTermのタブ内SSHクライアント
  • iTerm2互換の画像プロトコルに対応
  • Kittyグラフィックスのサポート

特に、マルチプレクサ対応、タブ・ペイン機能、リガチャ対応、ホットリロード対応、WezTermのタブ内SSHクライアント、画像プロトコル対応というのがAlacritty + tmuxと比較しても魅力的に感じました。

WezTermの魅力的な機能

魅力的な機能概要メリット
マルチプレクサ対応tmuxを必要とせずに1つのターミナルセッション内で複数のペインやタブを管理できる。tmuxを使わずにペイン分割や複数タブで並行作業が可能。
タブ・ペイン機能tmuxを必要とせずにタブやペインの柔軟な管理を可能。tmuxを使わずに画面を分割して作業が可能。
リガチャ対応よくある記号の組み合わせを読みやすい形に結合して表示。コードが視覚的に見やすくなる。
読み取りエラーが減る。
ホットリロード対応設定ファイルを変更すると即座に反映される。設定を変更するたびに再読み込みが不要に。(tmuxは再読み込みが必要)
タブ内SSHクライアントSSHセッションをタブやペインとして管理できる。ローカルとリモート作業を1つの画面で統一できる。
画像プロトコル対応iTerm2互換の画像プロトコルやKitty/Sixel形式の画像表示に対応。ターミナル内で画像を直接表示可能。

WezTermのインストール

macではサクッとbrewでインストールするのがおすすめです。


brew install --cask WezTerm

WezTermの設定

ではWezTermを設定していきましょう。まずは基本的な設定をしていきます。

初期設定とカラースキームの設定

WezTermの設定ファイルの場所は、~/.config/wezterm/wezterm.luaです。

公式のクイックスタートを参考にまずは初期設定します。


nvim ~/.config/wezterm/wezterm.lua

この設定ではカラースキームはcatppuccin-mochaを指定しています。config.color_schemeに指定する名前も公式のカラースキームに掲載されています。

~/.config/wezterm/wezterm.lua


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

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

return config

2行目のwezterm.config_builder()は、設定にエラーがある場合に見やすい形でエラーウィンドウを表示し、またエラーが修正されるまでデフォルトの設定を使用してくれるようです。

WezTermで使えるカラースキームは約1,000種類もあり、カラースキームを選ぶのも楽しいです。
https://wezfurlong.org/wezterm/colorschemes/index.html

ちなみに私は、WezTerm、Neovimのカラースキームにcatppuccin-mochaを設定しています。

以降の設定は、最下部のreturn configより前に書いていきます。

フォントの設定

フォントとフォントサイズの設定です。wezterm.font_with_fallbackを使うと文字がない場合には、次のフォントを探してくれます。下の例では、JetBrainsMono Nerd Fontを使いつつも、文字がない場合は、Cicaを使う設定です。

~/.config/wezterm/wezterm.lua


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

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

上記2つのフォントはbrewでインストールがおすすめです。


brew install font-jetbrains-mono-nerd-font
brew install font-cica

タブバーの設定

WezTermのタブバーの設定です。下のようなタブバーにしていきます。今使っているtmuxのバーと同じ様な構成です。tabline.wezを使います。

こんな感じにタブバーにします

Alacritty + tmuxで使っているタブバー


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

WezTremのタブバーにはファンシータブバーとレトロタブの2種類があり、デフォルトはファンシータブバーです。config.use_fancy_tab_bar = falseで、レトロタブにしています。レトロタブはターミナルと一体感がありシンプルであるので、tmuxユーザーには特にレトロタブがおすすめです。私はレトロタブ派です。

WezTermのレトロタブ

WezTermのファンシータブ

また、タブバーを下部に表示するために、config.tab_bar_at_bottom = trueとしています。

tab_max_widthはレトロタブ使用時のタブの最大幅です。デフォルトは狭いので拡げています。

設定オプションデフォルト説明
use_fancy_tab_bartrueファンシータブバーを使用するか
enable_tab_bartrueタブバーを使用するか
hide_tab_bar_if_only_one_tabfalseタブが1つしかない場合、タブバーを非表示にするか
tab_bar_at_bottomfalseタブバーをウィンドウ下部に表示するか
tab_max_width16レトロタブを使用する場合のタブの最大幅

タブバーのカスタマイズ:tabline.wez

タブバーのカスタマイズについては、tabline.wezを使っています。Luaで書かれた使いやすいタブバーで、Neovimのステータスラインのプラグインであるlualine.nvimと同じようにカスタマイズができます。

tabline.wezはWezTermのカラースキームを使えるのも嬉しいです。今回はcyberpunkをtabline.wezのテーマに設定しています。tabline.wezはレトロタブ用に設計されています。

~/.config/wezterm/wezterm.lua


-- tabline.wez
local tabline = wezterm.plugin.require("https://github.com/michaelbrusegard/tabline.wez")
tabline.setup({
    options = { theme = "cyberpunk" },
})

下のようなタブバーになります。少しカスタマイズしてみます。

tabline.wezでcyberpunkのカラースキーム

各コンポーネントのセパレーターと、見やすくするためにアクティブなタブの色、タブに表示するテキストを「プロセス名とそのディレクトリ名」にしてみます。

タブに表示するディレクトリの前には、フォルダーのNerd Fontsを使っています。

~/.config/wezterm/wezterm.lua


-- 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 = {
            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 },
        },
    },
})

カスタマイズしたtabline.wezのタブバー

各コンポーネントのセパレーターと、見やすくするためにアクティブなタブの色、タブに表示するテキストを「プロセス名とそのディレクトリ名」に設定
各コンポーネントのセパレーターと、見やすくするためにアクティブなタブの色、タブに表示するテキストを「プロセス名とそのディレクトリ名」に設定

カーソルの設定

カーソルのスタイルや色をより見やすく設定したいと思います。

~/.config/wezterm/wezterm.lua


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

カーソルのスタイルはSteadyBlock, BlinkingBlock, SteadyUnderline, BlinkingUnderline, SteadyBar, BlinkingBarから指定します。

背景透過の設定

続いて、みんな大好き背景透過の設定です。美しい作業環境を構築するための鍵となる半透明を機能を使って見た目の良さと、見やすく使いやすいことのバランスを取ってモチベが上がる設定にします!

~/.config/wezterm/wezterm.lua


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

window_background_opacityで背景透過、window_background_blurでぼかし具合を調整します。

Neovimでも半透明にする

ウィンドウサイズの設定

WezTerm起動時のウィンドウサイズを行数、列数で指定します。

~/.config/wezterm/wezterm.lua


-- window size
config.initial_rows = 40
config.initial_cols = 140

デフォルトのディレクトリの設定

WezTerm起動時のディレクトリを指定します。

~/.config/wezterm/wezterm.lua


-- default cwd
config.default_cwd = "/Users/you/path"

究極のコーディング体験:NeovimとHHKBで高める生産性

WezTermを使うにあたっての外せないポイントの設定

次に、お伝えしたAlacritty + tmuxからWezTermを使うにあたっての外せないポイントを中心に、設定する項目を1つ1つ紹介していきます。

tmuxのようなprefixキーの設定

tmuxのような外部ツールを必要とせず、WezTermは単体でタブやペインの移動などができます。画面を水平・垂直に分割したり、複数の作業スペースを効率的に切り替えることができます。これにより、tmuxを設定する手間を省き、よりシンプルな環境を構築できます。

WezTermはtmuxのようにprefixキーの設定ができます。下の設定はCtrl + Spaceをprefixキーにしています。


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

tmux-fingersのような便利なコピー機能

WezTermのQickSelectを使うと、マウスやトラックパッドを使わずに素早くテキストを選択可能です。tmuxのtmux-fingersのような機能です。


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

LEADER + FでQuickSelectモードになり、ターミナル内のテキストが解析され、選択可能な文字列が候補としてハイライトされます。文字列には対応する番号やキーが付けられ、目的の文字列を選ぶためのショートカットとして使用します。

ハイライトされた文字列の中から、その番号またはキーを押すとその文字列がコピーされます。

vimのようなコピーモード

WezTermのActivateCopyModeを使うと、マウスやトラックパッドを使わずに素早くテキストを選択できます。

config.keys = { }の中に書きます。


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

LEADER +[でコピーモードに入り、vで選択を開始して、j,k,h,lなどでカーソルを移動して選択しyでコピーします。

tmuxのようにペインの操作

LEADER + -で水平分割、LEADER + |で垂直分割のキー設定です。

config.keys = { }の中に書きます。


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

続いて、ペインの移動です。

LEADER + lで右側のペインへ、LEADER + kで上側のペイン、LEDAER + jで下側のペイン、LEADER + hで左側のペインに移動するキー設定です。

config.keys = { }の中に書きます。


-- config.keys = {
    -- 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"),
    },
-- }

複数のペインがあるときに、LEADER + zでそのペインをzoomする設定です。もう一度押すと、もとのペイン分割の表示に戻ります。

config.keys = { }の中に書きます。


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

tmuxのようにタブの操作

config.keys = { }の中に書きます。

LEADER + cで新しいタブの作成、LEADER + nで次のタブ、LEADER + pで前のタブへ移動、LEADER + 1で1番目のタブへ移動、LEADER + 2で2番目のタブへ移動、これを5番目のタブへ移動まで、を設定しています。


-- config.keys = {
    -- 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),
    },
-- }

WezTerm + Neovimのコピペ文字化け回避

WezTerm + Neovimでvim.cmd("language en_US")だと、日本語やNerdFontsのコピペが文字化けしました。vim.cmd("language ja_JP.UTF-8")にすることで、解決しました。

最後に

最後まで読んでいただきありがとうございます。今回のWezTermで快適なターミナル体験はいかがでしたでしょうか。

WezTermは、ターミナルエミュレータとして非常に高いポテンシャルを持ち、特にモダンな開発環境を求めるユーザーに適しています。シンプルさを追求したAlacrittyや柔軟性を重視したtmuxの長所を融合しつつ、それらを1つのツールで完結できる点は大きな魅力です。もし新しいターミナルツールを探しているのであれば、WezTermをぜひ試してみてください。自分の作業スタイルに合った理想的な環境が手に入るかもしれません。

定番おすすめ記事

ターミナルを活用する記事をまとめました。ターミナルの活用方法やコマンドの使い方などは、UbuntuなどのLinuxでも活用できます。Macの大元がUnix系統であるからこそです。

カテゴリー:
関連記事