nabeo がピーしているブログ (仮)

どーも、nabeop です

WezTerm 事始め

少なくともここ10年くらいは macOS のターミナルエミュレータは iTerm2 を使っていたんだけど、私用の macbook air は未だに intel CPU を使っていて、だんだん iTerm2 の動作がもっさりしてきていてストレスを感じるようになってきた。そんな中でどうやら WezTerm が軽量ぽいみたいな話題をみたので、iTerm2 で凝った設定をしていないということもあり、ターミナルエミュレータの引越しをしてみた。

導入と設定ファイル

homebrew で cask があるので、サクッといれた。

brew install --cask wezterm

設定ファイルは ~/.config/wezterm/wezterm.lua を使うらしいので、ドキュメントを眺めながら頑張って書く。

設定が変更されたら自動で読み込む

設定の試行錯誤しているときにいちいち WezTerm を立ち上げないですむ。

config.automatically_reload_config = true

フォントやカラーテーマを配列からランダムで決定するようにしていたので、 wezterm.lua を保存するたびに外観が変わって面白かった。

フォント

Emacs では使いたいフォントのリストから起動時にランダムで選択するようにしているんだけど、これが体験として面白かったので、ターミナルエミュレータでも同じような体験がしたかった。WezTerm は Lua で設定を記述するので、こういうこともシュッとできて便利。

local fonts = {
   "HackGen Console NF",
   "Moralerspace Neon HWNF",
   "Moralerspace Argon HWNF",
   "Moralerspace Xenon HWNF",
   "Moralerspace Krypton HWNF",
   "Cica",
   "UDEV Gothic NF",
}
config.font = wezterm.font_with_fallback {
   {
      family = fonts[math.random(1, #fonts)],
      stretch = 'Normal',
      weight = 'Regular',
   },
   {
      family = 'Monaco',
   },
}

wezterm.font_with_fallback を使って、フォントがインストールされていない場合は Monaco を使うようにしている。

カラーテーマ

自分でつくれるぽいけど、標準で大量のカラーテーマが設定されている。どれがいいかよくわからないけど、基本的に Solarized 系のカラーテーマを使っているので、フォントと同様にいくつか候補を選んでランダムで選択されるようにしておく。

local color_schemes = {
   'Solarized (dark) (terminal.sexy)',
   'Solarized (light) (terminal.sexy)',
   'Solarized Dark Higher Contrast',
   'Sakura',
   'Yousai (terminal.sexy)',
}
config.color_scheme = color_schemes[math.random(1, #color_schemes)]

背景画像

iTerm2 では凝った設定はしていないと書いたけど、唯一こだわっていたのが、背景画像に好きなバンドのロゴを使っているというところだった。これとおなじことを WezTerm でもやりたかったので、色々こねくり回して最終的には以下のようになった。

config.background = {
   {
      source = {
         File = wezterm.home_dir .. '/.config/wezterm/terminal-wallpaper.jpg'
      },
      opacity = 0.8,
      attachment = 'Fixed',
      height = 'Cover',
      width = 'Cover',
      repeat_x = 'NoRepeat',
      repeat_y = 'NoRepeat',
      hsb = {
         hue = 1.0,
         saturation = 1.0,
         brightness = 0.5,
      },
   },
   {
      source = {
         Color = "black"
      }
   }
}
config.window_background_opacity = 1.0
config.macos_window_background_blur = 80

この内容でも背景画像のサイズとターミナルの画面サイズがことなると、画像下部が表示されないので、あんまり気に入ってない。画像の縦横比を保持しつつ、画像が全て表示されるような設定を目指して色々試行錯誤したけど、どうやら無理ぽかった。

設定の全部

設定ファイルの全体はこんな感じ。とりあえず、この状態でしばらく使ってみることにする。

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

-- This is where you actually apply your config choices
config.automatically_reload_config = true

-- misc
config.audible_bell = "Disabled"
config.use_ime = true
config.hide_tab_bar_if_only_one_tab = true

-- color theme
-- https://wezfurlong.org/wezterm/colorschemes/index.html
local color_schemes = {
   'Solarized (dark) (terminal.sexy)',
   'Solarized (light) (terminal.sexy)',
   'Solarized Dark Higher Contrast',
   'Sakura',
   'Yousai (terminal.sexy)',
}
config.color_scheme = color_schemes[math.random(1, #color_schemes)]

-- backgound image
config.background = {
   {
      source = {
         File = wezterm.home_dir .. '/.config/wezterm/terminal-wallpaper.jpg'
      },
      opacity = 0.8,            -- Do not modify!!
      attachment = 'Fixed',
      height = 'Cover',
      width = 'Cover',
      repeat_x = 'NoRepeat',
      repeat_y = 'NoRepeat',
      hsb = {
         hue = 1.0,
         saturation = 1.0,
         brightness = 0.5,
      },
   },
   {
      source = {
         Color = "black"
      }
   }
}
config.window_background_opacity = 1.0
config.macos_window_background_blur = 80

-- font
local fonts = {
   -- HackGen
   -- https://github.com/yuru7/HackGen
   'HackGen Console NF',
   -- Moralerspace
   -- https://github.com/yuru7/moralerspace
   'Moralerspace Neon HWNF',
   'Moralerspace Argon HWNF',
   'Moralerspace Xenon HWNF',
   'Moralerspace Krypton HWNF',
   -- Cica
   -- https://github.com/miiton/Cica
   "Cica",
   -- UDEV Gothic
   -- https://github.com/yuru7/udev-gothic
   "UDEV Gothic NF",
}
config.font = wezterm.font_with_fallback {
   {
      family = fonts[math.random(1, #fonts)],
      stretch = 'Normal',
      weight = 'Regular',
   },
   {
      family = 'Monaco',
   },
}
-- config.harfbuzz_features = { 'calt=0', 'clig=0', 'liga=0' }
config.font_size = 14
config.cell_width = 1.0
config.line_height = 1.0

-- window
config.window_padding = {
   left = '0.5cell',
   right = '0cell',
   top = '0.5cell',
   bottom = "0cell",
}

return config