こんにちは。ナミレリです。
今回は、高性能でモダンなターミナルエミュレータであるWezTermの魅力や快適に使う設定を紹介していきます。WezTermは、Alacrittyと同じでRustで開発されています。Alacrittyと同様に高速で軽量な動作を実現しつつ、設定にLuaを採用していますので、私のようなNeovimユーザーにとって、親しみのある言語で設定を管理でき、カスタマイズの自由度が非常に高いです。Neovimユーザーにもおすすめのターミナルです。
また、tmuxの機能も一部内包しているため、私のようなAlacritty + tmuxユーザーにもおすすめのターミナルです。
WezTerm:下部にタブバーを配置
この記事はこんな人にオススメ
- Alacrittyの軽量で高速な動作が好みの方
- tmuxの設定が煩雑だと感じる人
- Luaでの設定に慣れているNeovimユーザー
- RustやGPUアクセラレーションに興味があるユーザー
- MacのデフォルトのTerminalやiTerm2からの乗り換えを考えているユーザー
- M3 MacBook Air 15インチ
- macOS Sequoia 15.1.1
- WezTerm 20240203-110809-5046fc22
- Parallels Desktop 20 for Mac バージョン 20.1.2 (55742)
目次
はじめに
私の普段のターミナル環境は、Alacritty + tmuxで、その上でNeovimを使っています。高速でカスタマイズ度が高く、見た目もかっこよくとても気に入っています。最近、tmuxのcatppuccinテーマに大幅なアップデートがあり設定に少し苦労しましたが、とても気に入っています。
Alacritty + tmux:catppuccinテーマを使用
単にターミナル好きの好奇心からWezTermを使ってみたいというのが動機で、Alacritty + tmuxとWezTermがどちらがいいか?については、人それぞれで環境により異なる、ということだと思っています。
- 設定ファイルにLuaを採用していて、Neovimと親和性が高い
- tmuxのような機能があること
- 画像をサポートしていること
- Rustで開発されていること(高速)
そんな私が、Alacritty + tmuxからWezTermを使うにあたっての外せないポイントは、以下となります。
- catppuccinのtmuxテーマのように美しいテーマがあって、カスタマイズ可能か
- tmuxのようなprefixキーの設定ができるか
- tmux-fingersのような便利なコピー機能があるか
- vimのようなコピーモードがあるか
- tmuxのようにペインの操作が可能でカスタマイズ可能か
- 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、Neovimのカラースキームにcatppuccin-mochaを設定しています。
フォントの設定
フォントとフォントサイズの設定です。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_bar | true | ファンシータブバーを使用するか |
enable_tab_bar | true | タブバーを使用するか |
hide_tab_bar_if_only_one_tab | false | タブが1つしかない場合、タブバーを非表示にするか |
tab_bar_at_bottom | false | タブバーをウィンドウ下部に表示するか |
tab_max_width | 16 | レトロタブを使用する場合のタブの最大幅 |
タブバーのカスタマイズ: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のタブバー
ターミナルのプロンプトもかっこよくいたい方や、lsやcatなどの出力をかっこよくしたい方はぜひ下の記事もご覧ください。
カーソルの設定
カーソルのスタイルや色をより見やすく設定したいと思います。
~/.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 = {
-- 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 = {
-- 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 = {
-- 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 = {
-- pane zoom
{
mods = "LEADER",
key = "z",
action = wezterm.action.TogglePaneZoomState,
},
-- }
tmuxのようにタブの操作
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をぜひ試してみてください。自分の作業スタイルに合った理想的な環境が手に入るかもしれません。