Weztermでno fonts contain glyphsが出た時の対応

· 7 min read

Weztermを使っていたら画像のような警告が出ました。これを解決したので記録です。

Font Problemの警告

警告が出た箇所は本来ならAstroのグリフ(アイコン)が表示されるはずですが、豆腐になっています(404の左)。

Astroのアイコンが豆腐になっている

先に結論

Astroのグリフは最近追加されたため、それに合わせてフォントもアップデートが必要でした。

模索

エラーの内容から、要するに対応しているNerd Fontsを入れれば終わりなのですが、いくつか疑問がありました。整理のため、備忘録として残しておきます。

そもそもの疑問として、Weztermのフォントの設定はフォールバックされているはずなのにどうしてこの警告が出るのか不思議でした。

「フォールバックがうまく設定できなかったのか」
「(警告どおり)本当に全部のフォントがAstroのグリフに対応していないのか」
どっちなんだろうかと。

フォールバックのしくみがあるはず

Weztermは公式ドキュメントに書いてあるとおり、JetBrains MonoNerd Font SymbolsNoto Color Emojiの3つがバンドルされています。グリフ(アイコン)が無かったらリストの次のフォントを使うしくみがあります。デフォルトでそうなってます。

まず、筆者は次のように白源を設定していました。

config.font = wezterm.font("HackGen Console NF")

フォント設定を確認できるコマンドwezterm ls-fontsを実行してみました。

Terminal window
/mnt/c/Program\ Files/WezTerm/wezterm.exe ls-fonts
実行結果
wezterm.font_with_fallback({
-- C:\USERS\EETANN\APPDATA\LOCAL\MICROSOFT\WINDOWS\FONTS\HACKGENCONSOLENF-REGULAR.TTF, DirectWrite
"HackGen Console NF",
-- <built-in>, BuiltIn
"JetBrains Mono",
-- C:\USERS\EETANN\APPDATA\LOCAL\MICROSOFT\WINDOWS\FONTS\NOTOCOLOREMOJI-REGULAR.TTF, DirectWrite
-- Assumed to have Emoji Presentation
"Noto Color Emoji",
-- <built-in>, BuiltIn
"Symbols Nerd Font Mono",
})

最初が自分で指定した白源、残りがバンドルされているフォントの順です。ただし、Noto Color Emojiは以前自分でインストールしたためそちらが優先されているようです。

フォールバックのリストが想定どおりであったため、
「フォールバックでもカバーしきれていない」、
つまり「どのフォントにも表示したかったグリフが含まれていなかった」
と判断しました。

最初の警告”No fonts contain glyphs for these codepoints”のとおりですね。

Font Problemの警告

手持ちのフォントは?

手持ちのフォントに指定したグリフが本当に含まれていなか調べることにしました。

How do I find out which font contains a certain special character?を参考にPythonのスクリプトを書き、実行します。

import os
fonts = []
for root, dirs, files in os.walk(
"/mnt/c/Users/egg20/AppData/Local/Microsoft/Windows/Fonts"
):
for file in files:
if file.endswith(".ttf"):
fonts.append(os.path.join(root, file))
from fontTools.ttLib import TTFont
def char_in_font(unicode_char, font):
for cmap in font["cmap"].tables:
if cmap.isUnicode():
if ord(unicode_char) in cmap.cmap:
return True
return False
def test(char):
for fontpath in fonts:
font = TTFont(fontpath) # specify the path to the font in question
if char_in_font(char, font):
print(char + " in " + fontpath)
test("\ue73c") # Pythonのロゴ
test("\ue6b3") # Astroのロゴ

※ 今回該当するフォントはTTFファイルしか無かったため上記の実装ですが、別の拡張子のフォントファイルを扱うのであればコードの変更が必要です。

結果、表示したかったAstroのグリフを含むフォントはありませんでした。あぁ、本当に含まれていなかったんだな。

原因

じゃあどうしてAstroのグリフが含まれていなかったのか、そもそもいきなりあの警告が出るようになったのはなぜか。

真の原因は次の2つです。

  1. 適当にNeovimのプラグインnvim-web-deviconsをアップデートした
  2. アップデートで追加されたグリフ対応したNerd Fontsを筆者が用意していなかった

nvim-web-deviconsのIssue #443を見ると、Astroのグリフが2024年4月15日に追加されていたようです。
しかしnvim-web-deviconsをアップデートした時点では、Weztermのフォールバックの中にこのグリフを含むフォントが無かったのです。

Nerd Fontが古かったってこと?
そうです。

Nerd FontsのReleasesを見てみます。

Nerd Fontsv3.2.0

ありました。“v3.2.0 Release”のIconsに”Add Astro icon”とあります(画像の下から2行目)。2024年4月4日にリリースされていたようです。

この記事を書いている時点(2024年5月17日)でのWeztermで使うフォントの対応を確認してみます。

どのフォントNerd Fontsのバージョン参照先
白源v3.0.0リリース
WeztermにバンドルされたNerd Font Symbolsv3.1.1ソースコード

そんなわけで、どちらのフォントのNerd Fontsも「Astroを含まないv3.2.0未満」でした。

対応

v3.2.0対応のフォントを入れ、Weztermで指定すれば完了です。

今回はリリースノートに書かれている対応済みのフォントの中から、SourceCodeProを入れました。FONTS DOWNLOADSからダウンロードできます。

Nerd Fontsv3.2.0

WezTermでは次のように設定しました。

config.font = wezterm.font_with_fallback({
{ family = "HackGen Console NF" },
{ family = "SauceCodePro Nerd Font Mono" },
})

ついにAstroのグリフを表示できました!404の左の赤いやつ!

Astroのグリフが表示された!

余談

Windowsだと「設定 > 個人用設定 > フォント」からドラッグ&ドロップでまとめてフォントをインストールできます。

Windowsでまとめてフォントをインストール

まとめ。Nerd Fontsを使うならバージョンに注意しましょう。