WezTerm のフォントのデフォルト設定が変わった?
普段 WezTerm というターミナルを愛用しているのですが,本日リリースされたばかりの 20230712-072601-f4abf8fd でフォントの設定が変わったのか,小一時間格闘していました.
具体的には,assume_emoji_presentation
のデフォルト値が(特定の場合に?)変わったようです.
その影響で今までのフォントが選択されず,built-in のフォントが描画されてしまいました.
公式の Change Log にはそれらしい記述がないので,意図された挙動なのかどうか分かりませんが,今までの設定ファイルだとフォントが上手く選択されない可能性があります.
環境
- Ubuntu Desktop 22.04 LTS
- Linux kernel:
5.19.0-46-generic
- WezTerm は apt によるインストール or
cargo build --release
でのインストール - X11
設定ファイル
以前の .wezterm.lua
:
local wezterm = require 'wezterm';
local config = {
font = wezterm.font("Source Han Code JP L"),
font_size = 12,
}
return config
変更後の .wezterm.lua
:
local wezterm = require 'wezterm';
local config = {
font = wezterm.font_with_fallback {
{ family = "Source Han Code JP L", assume_emoji_presentation = false },
{ family = "Source Han Code JP L", assume_emoji_presentation = true },
},
font_size = 12,
}
return config
症状
起きていることとしては,こちらの記事の真逆ですが,解決策は同じです.
つまり,以前は assume_emoji_presentation
を省略したときのデフォルトが false
だったのに対して,新しいバージョンでは true
がデフォルトになっています.
もちろんこの挙動はフォント等にも依存すると思われるので,あくまで「源ノ角ゴシック Code JP L」の場合にはなります.
具体的な再現手順は以下の通りです:
- 「源ノ角ゴシック Code JP L」を
~/.fonts
へ入れる(他のフォントは未確認) - バージョン間で比較するために,
20230712-072601-f4abf8fd
と20230408-112425-69ae8472
をインストールする,もしくは適宜切り替える - 以下の
.wezterm.lua
を用意する -
wezterm ls-fonts
の出力のPrimary font
を確認する
.wezterm.lua
の中身は,
local wezterm = require 'wezterm';
local config = {
font = wezterm.font_with_fallback {
{ family = "Source Han Code JP L" },
},
font_size = 12,
}
return config
になります.
新しいバージョンだと,
Primary font:
wezterm.font_with_fallback({
-- /.../SourceHanCodeJP-Light.otf, FontConfig
-- Assumed to have Emoji Presentation
-- AKA: "源ノ角ゴシック Code JP"
-- AKA: "源ノ角ゴシック Code JP L"
{family="Source Han Code JP", weight="Light"},
-- <built-in>, BuiltIn
"JetBrains Mono",
-- /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf, FontConfig
-- Assumed to have Emoji Presentation
-- Pixel sizes: [128]
"Noto Color Emoji",
-- <built-in>, BuiltIn
"Symbols Nerd Font Mono",
})
のように出力されます.
0 番目のフォントが Assumed to have Emoji Presentation
,すなわち assume_emoji_presentation = true
であることが分かります.
古いバージョンであれば,Assumed to have Emoji Presentation
が表示されません(assume_emoji_presentation = false
).
このパラメータは,公式ドキュメントによると
to control whether a font is considered to have emoji (rather than text) presentation glyphs for emoji.
とあり,have
の意味が微妙に取りにくいのですが,どうやら「emoji only XOR text only」という基準のようです.
該当のソースコードは
の二箇所で,簡単に言えば「フォント自体の presentation (Text or Emoji) と入力文字の presentation が一致する」という場合にのみ,そのフォントが選択されます.
私的には assume_emoji_presentation = true
は assume_emoji_presentation = false
に包含されるのかと思うのですが,そうではないみたいです.
そのあたりは上で紹介した記事でも触れられていますね.
ここの挙動は以前から変わらないのですが,assume_emoji_presentation
のデフォルト値が変わった影響で,大変な目にあったというお話でした.
Discussion