事象
WezTermでNeovimを使っていたところ、以下のようなエラー通知が発生していた。
Neovimで開いているプロジェクトをよく見ると、ファイル名を示すアイコンが一部豆腐になってしまっていた。
-
.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などでインストールしている必要がある。
参考
前提知識
文字表示は3段階で成り立っている。
- 文字(character):人間が認識する抽象的な概念
- 例:A、あ、漢
- コードポイント(code point):文字を一意に識別する番号(Unicode)
- 例:A→U+0041
- 例:あ→U+3042
- 今回の場合:U+E6B4
- グリフ(glyph):フォントが持っている描画用の図形データ→実際に画面に描かれる形
「文字」があって、それを「コードポイント」としてデータを保持していて、「グリフ」を探し出して画面に描画するという流れ。
原因
エラーそのものとしては
「これらのコードポイント(\u{e6b4})に対応するグリフを含むフォントが見つかりません。そのため、代替(プレースホルダー)のグリフが表示されています。」
と言われている。
Neovimプラグイン(nvim-tree)で使っているNerd Fontsが、WezTermで使えるようになっていなかったことが原因だった。
デバッグの流れ
①Neovimで使っているフォントを確認
筆者はファイラとしてプラグインを使っている。
依存関係は以下の通り。
nvim-treeはNerd Fontsというフォントを使って描画をしている。
②WezTermでデフォルトでバンドルされているフォントを確認する
Fonts - 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が含まれていない←これが問題