エンジニアを目指す初学者に向けて、わかりやすく解説したブログです。

【WezTerm】No fonts contain glyphs for these codepoints: \u{e6b4}. Placeholder glyphs are being displayed instead…

事象

WezTermでNeovimを使っていたところ、以下のようなエラー通知が発生していた。

Image in a image block

Neovimで開いているプロジェクトをよく見ると、ファイル名を示すアイコンが一部豆腐になってしまっていた。

Image in a image block
  • .prettierignore
  • .prettierrc
  • *.astro
  • pnpm-lock.yaml

結論

WezTermのフォントのフォールバック設定に、対象のアイコンのグリフ情報を持っているフォントを追記すれば良い。

筆者は wezterm.luaに以下の設定を追加した。

config.font = wezterm.font_with_fallback({
  --3つはWezTermのデフォルト
  "JetBrains Mono",
  "Noto Color Emoji",
  "Symbols Nerd Font Mono",
  "Hack Nerd Font" -- これを追加
})

※hack nerd fontをHomebrewなどでインストールしている必要がある。

Image in a image block

参考

前提知識

文字表示は3段階で成り立っている。

  1. 文字(character):人間が認識する抽象的な概念
    1. 例:A、あ、漢
  2. コードポイント(code point):文字を一意に識別する番号(Unicode)
    1. 例:A→U+0041
    2. 例:あ→U+3042
    3. 今回の場合:U+E6B4
  3. グリフ(glyph):フォントが持っている描画用の図形データ→実際に画面に描かれる形

「文字」があって、それを「コードポイント」としてデータを保持していて、「グリフ」を探し出して画面に描画するという流れ。

原因

エラーそのものとしては
「これらのコードポイント(\u{e6b4})に対応するグリフを含むフォントが見つかりません。そのため、代替(プレースホルダー)のグリフが表示されています。」
と言われている。

Neovimプラグイン(nvim-tree)で使っているNerd Fontsが、WezTermで使えるようになっていなかったことが原因だった。

デバッグの流れ

①Neovimで使っているフォントを確認

筆者はファイラとしてプラグインを使っている。

依存関係は以下の通り。

nvim-treeはNerd Fontsというフォントを使って描画をしている。

②WezTermでデフォルトでバンドルされているフォントを確認する

Icon in a page linkFonts - Wez's Terminal Emulator

公式ドキュメントには、デフォルトでバンドルされているフォントと、その確認方法が記載されている。

実際、 wezterm ls-fontsで確認すると

  • JetBrains Mono
  • Noto Color Emoji
  • Symbols Nerd Font Mono

という順序でフォントが使われていると分かる。

$ wezterm ls-fonts
Primary font:
wezterm.font_with_fallback({
  -- <built-in>, BuiltIn
  "JetBrains Mono",

  -- <built-in>, BuiltIn
  -- Assumed to have Emoji Presentation
  "Noto Color Emoji",

  -- <built-in>, BuiltIn
  "Symbols Nerd Font Mono",

})
# 以下略

これで原因がはっきりした。

  • Neovimのnvim-treeプラグインでは、Nerd Fontsを使う
  • NeovimはWezTerm上で動く
  • ただしWezTerm上で使えるフォントにNerd Fontsが含まれていない←これが問題