WezTermに背景画像を設定して自分好みの見た目にカスタマイズする
WezTerm
VSCodeからNeovimに移行するにあたり、クロスプラットフォーム対応のWezTermを採用しました。
設定ファイルをNeovimと同じluaで記述できる点もいいですね。
homebrewでインストールできます。
$ brew install --cask wezterm
Mac以外の方はこちらを参照してください。
導入後のテーマのカスタマイズはこちらが参考になるかと思います。
最終的な見た目
背景を透過させたキャラクターを右寄せで配置しています。
(キャラクターはAIで出力したイラストになります)
背景の設定
事前準備
まずは設定ファイルを作成します。
$ cd ~/.config/wezterm
$ touch 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でアニメーション再生もできるようです。
これで事前準備は完了です!
画像レイヤーの設定
公式ドキュメントを参考に背景に画像を設定していきます。
画像は相対パスでは読み込まれなかったので絶対パスにしています。
-- 背景画像のパスを設定
local background_image = "/Users/[ユーザー名]/.config/wezterm/[画像ファイル名]"
return {
{
source = { File = background_image },
},
}
ファイルを上書きして画像が表示されれば成功です。
ですがオプションをなにも設定していないので、かなり見辛いです。
見やすくなるようにオプションを設定していきます。
オプションは指定する画像によって変わってくると思うので、実際にはドキュメントを参考に設定してください。
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", -- 画像の高さ (%指定も可能)
},
}
グラデーションレイヤーの設定
背景が透過していて見辛いので、画像レイヤーの下にグラデーションレイヤーを追加します。
画像テーブルの上にテーブルを追加することでレイヤーを下に追加することができます。
(グラデーションは、widthとheightを指定しないと表示されません)
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
イベントで定期的に監視します。
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
イベントの発火インターバルを短くしましょう。
config.status_update_interval = 100
もっと良い方法があれば是非教えて下さいm(_ _)m
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
参考
Discussion