🎨

WezTermに背景画像を設定して自分好みの見た目にカスタマイズする

2024/10/19に公開

WezTerm

VSCodeからNeovimに移行するにあたり、クロスプラットフォーム対応のWezTermを採用しました。
設定ファイルをNeovimと同じluaで記述できる点もいいですね。

homebrewでインストールできます。

$ brew install --cask wezterm

Mac以外の方はこちらを参照してください。
https://wezfurlong.org/wezterm/installation.html

導入後のテーマのカスタマイズはこちらが参考になるかと思います。
https://coralpink.github.io/commentary/index.html

最終的な見た目

背景を透過させたキャラクターを右寄せで配置しています。
(キャラクターはAIで出力したイラストになります)

背景の設定

事前準備

まずは設定ファイルを作成します。

$ cd ~/.config/wezterm
$ touch wezterm.lua

中身はクイックスタートの内容をコピペします。
まだ作成していませんが、背景用のファイルを読み込むように追記しておきます。

wezterm.lua
local wezterm = require 'wezterm'
local background = require 'background' -- 背景用のファイルを読み込み

local config = wezterm.config_builder()

config.color_scheme = 'AdventureTime'

return config

次に背景用のファイルを作成します。

$ touch background.lua

最後に背景画像を~/.config/wezterm内に予め配置しておきましょう。
gifでアニメーション再生もできるようです。
https://wezfurlong.org/wezterm/config/lua/config/background.html#source-definition

これで事前準備は完了です!

画像レイヤーの設定

公式ドキュメントを参考に背景に画像を設定していきます。
画像は相対パスでは読み込まれなかったので絶対パスにしています。

background.lua
-- 背景画像のパスを設定
local background_image = "/Users/[ユーザー名]/.config/wezterm/[画像ファイル名]"

return {
  {
    source = { File = background_image },
  },
}

ファイルを上書きして画像が表示されれば成功です。
ですがオプションをなにも設定していないので、かなり見辛いです。

見やすくなるようにオプションを設定していきます。
オプションは指定する画像によって変わってくると思うので、実際にはドキュメントを参考に設定してください。

background.lua
return {
  {
    source = { File = background_image },
+   opacity = 0.12, -- 透明度
+   vertical_align = "Middle", -- 垂直方向の画像位置
+   horizontal_align = "Right", -- 水平方向の画像位置
+   horizontal_offset = "200px", -- 水平方向のオフセット
+   repeat_x = "NoRepeat", -- 画像をx方向に繰り返すか
+   repeat_y = "NoRepeat", -- 画像をy方向に繰り返すか
+   width = "1431px", -- 画像の幅 (%指定も可能)
+   height = "1900px", -- 画像の高さ (%指定も可能)
  },
}

グラデーションレイヤーの設定

背景が透過していて見辛いので、画像レイヤーの下にグラデーションレイヤーを追加します。

https://wezfurlong.org/wezterm/config/lua/config/window_background_gradient.html

画像テーブルの上にテーブルを追加することでレイヤーを下に追加することができます。
(グラデーションは、widthとheightを指定しないと表示されません)

background.lua
return {
  {
+   source = {
+     Gradient = {
+       colors = { "#124354", "#001522" }, -- グラデーションのカラーセット
+       orientation = {
+         Linear = { angle = -30.0 }, -- グラデーションの方向と角度
+       },
+     },
+   },
+   opacity = 1.0, -- 透明度
+   width = "100%", -- 幅
+   height = "100%", -- 高さ
+ },
  {
    source = { File = background_image },
    -- 省略
  },
}

いい感じ!

Neovim使用時は画像を非表示にする

コーディング中には画像を非表示にしたい方もいるでしょう。

WezTermには現在のペインで実行中のフォアグラウンドプロセスの名前を取得するためのpane:get_foreground_process_name関数があります。

これを使用して画像を非表示にしたいアプリケーションか判定し、該当した場合はconfig.backgroundをオーバーライドします。
プロセスはupdate-statusイベントで定期的に監視します。

background.lua
local wezterm = require("wezterm")

-- 背景画像のパスを設定
local background_image = "/Users/[ユーザー名]/.config/wezterm/[画像ファイル名]"

local gradient_layer = {
  source = {
    Gradient = {
      colors = { "#124354", "#001522" },
      orientation = {
        Linear = {
          angle = -30.0,
        },
      },
    },
  },
  opacity = 1.0,
  width = "100%",
  height = "100%",
}

local image_layer = {
  source = { File = background_image },
  opacity = 0.12,
  vertical_align = "Middle",
  horizontal_align = "Right",
  horizontal_offset = "200px",
  repeat_x = "NoRepeat",
  repeat_y = "NoRepeat",
  width = "1431px",
  height = "1900px",
}

-- デフォルトのbackground
local default_bg = {
  gradient_layer,
  image_layer,
}

-- Neovim使用時のbackground
local neovim_bg = {
  gradient_layer,
}

local prev_process_name
local prev_background

wezterm.on("update-status", function(window, pane)
  -- フォアグラウンドプロセスの名前を取得
  local process_name = pane:get_foreground_process_name()

  -- 前のプロセス名と同じであればなにもしない
  if process_name == prev_process_name then
    return
  end

  -- プロセス名にnvimが含まれているか判定
  local new_background = process_name:find("nvim") and neovim_bg or nil

  -- 現在のbackgroundと異なればconfig.backgroundをオーバーライドする
  if new_background ~= prev_background then
    window:set_config_overrides({ background = new_background })
    prev_background = new_background
  end

  prev_process_name = process_name
end)

return default_bg

 

デフォルト

Neovim使用時

画像の切り替わりの遅さが気になる場合は、config.status_update_intervalの設定を変更してupdate-statusイベントの発火インターバルを短くしましょう。

wezterm.lua
config.status_update_interval = 100

もっと良い方法があれば是非教えて下さいm(_ _)m

 

wezterm.luaの最終的な設定
wezterm.lua
local wezterm = require("wezterm")
local keybind = require("keybinds")
local background = require("background")
require("format")
require("status")

local config = wezterm.config_builder()

config.color_scheme = "Catppuccin Mocha"
config.macos_window_background_blur = 20
config.font = wezterm.font("Firge35Nerd Console")
config.font_size = 16.0
config.window_frame = {
  font = wezterm.font("Roboto"),
  font_size = 13.0,
}
config.disable_default_key_bindings = true
config.keys = keybind.keys
config.key_tables = keybind.key_tables
config.leader = { key = "a", mods = "CTRL", timeout_milliseconds = 2000 }
config.status_update_interval = 100
config.background = background

return config

参考

https://zenn.dev/monicle/articles/59ff479ae51c66
https://coralpink.github.io/commentary/index.html
https://wezfurlong.org/wezterm/

Discussion