🖥️

WezTerm のフォントのデフォルト設定が変わった?

2023/07/13に公開

普段 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-f4abf8fd20230408-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.

https://wezfurlong.org/wezterm/config/lua/wezterm/font.html?h=assume_emoji_presentation

とあり,have の意味が微妙に取りにくいのですが,どうやら「emoji only XOR text only」という基準のようです.
該当のソースコードは

https://github.com/wez/wezterm/blob/20230712-072601-f4abf8fd/wezterm-font/src/shaper/harfbuzz.rs#L183-L187
https://github.com/wez/wezterm/blob/20230712-072601-f4abf8fd/wezterm-font/src/shaper/harfbuzz.rs#L242-L249

の二箇所で,簡単に言えば「フォント自体の presentation (Text or Emoji) と入力文字の presentation が一致する」という場合にのみ,そのフォントが選択されます.

私的には assume_emoji_presentation = trueassume_emoji_presentation = false に包含されるのかと思うのですが,そうではないみたいです.
そのあたりは上で紹介した記事でも触れられていますね.

ここの挙動は以前から変わらないのですが,assume_emoji_presentation のデフォルト値が変わった影響で,大変な目にあったというお話でした.

Discussion