限界開発鯖 - LinuxでDiscordのフォントが微妙におかしい問題を解決するついでにコードブロックのフォントを変える
Approvers

LinuxでDiscordのフォントが微妙におかしい問題を解決するついでにコードブロックのフォントを変える

loxygen -

フライさんです。Arch Linux + i3wmでIntelliJ + IdeaVimでコーディングするのが好きです。

💥 問題

さて、限界開発鯖の実体は Discord上のサーバー なので、僕らは普段Discord上で会話をしています。
会話をしているんですが、僕が使っているDiscordにはある問題があります。

parially-corrupted-discord-font

一部の文字列だけが明朝体になっています。他の普通のテキストはゴシックなのに。

これをどうにかしたい。

🔎 原因を探る

Ctrl+Shift+Iで開発者モードを起動して、CSSを見てみることにしました。

suspectious-css

font-family: inherit をたどってみると、ここでフォントを指定してそうなのでここをいじってみます。

いろいろごにょごにょしていたら、ここに挙げられているフォントが最後まで見つからなかったときのフォールバックのフォントが明朝体になってることがわかりました

corrupted-fallback

これをシステムフォントの名前にしてやるとそのフォントがちゃんと反映されるらしい

use-system-font

ということは、以下の2つのアプローチを取れば解決しそうです。

  • フォールバックのフォントを使いたいフォントに設定する
  • 👆で指定されているフォントのいずれかをインストールする

僕はNoto Sans CJK JPを使いたいので1つ目のアプローチで攻めることにしました。こちらならPCにインストールされているフォントなら自由に使えますからね。

👷 どうにかする

(少なくとも僕のArch)Linuxでは、フォントの優先順位は fontconfigで管理されますfont-configの設定は/etc/fonts/ に存在します。

$ tree -L 1 /etc/fonts
/etc/fonts
├── conf.avail
├── conf.d
└── fonts.conf

2 directories, 1 file

fonts.confconf.d の中身を読み込んでくれるので、ここに設定を書いていきます。

📝 設定ファイルを作る

/etc/fonts/conf.dに設定ファイルを作ります。

cd /etc/fonts/conf.d
sudo touch 99-user-configuration.conf

user-configurationの部分は何でもOKですが、99の部分はこれにしないと設定ファイルが読み込まれる順番が狂って反映されなくなりそうなので99にしておいて損はないと思います。

その後、何らかの手段で99-user-configuration.confに以下の内容を書き込んでください。

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
  <description>Change default font for Discord</description>
  <match>
    <test name="prgname"><string>discord</string></test>
    <test qual="any" name="family"><string>sans-serif</string></test>
    <edit mode="prepend" name="family">
      <string>Noto Sans CJK JP</string>
    </edit>
  </match>
</fontconfig>

Noto Sans CJK JPはお好みで。ここで設定した部分が明朝体の代わりになります。

Discordを再起動すると、明朝体だった部分がNoto Sans CJK JPに置き換わっています

nice-discord

🔬 噛み砕く

上の設定ファイルを噛み砕いて日本語訳すると以下のようになります。

discordという名前のアプリケーションで、sans-serifというフォントファミリーのフォントを使うときは、Noto Sans CJK JPを一番最初に考慮してくれよな!

  • <test name="prgname"><string>discord</string></test> で 対象のアプリケーションがDiscordかどうかを判断しています。[1]
  • <test qual="any" name="family"><string>sans-serif</string></test> で 使おうとしているフォントがsans-serif かを確認します。[2]
  • <edit mode="prepend" name="family">...</edit> で使いたいフォントを優先順位の一番最初に持ってきます。

💫 もっとカスタマイズをする

この方法を拡張すれば、コードブロックのフォントをお好みのフォントにするとかもできそうです。 というわけで、コードブロックのフォントをJetBrains Monoにしてみます。

上で作成したファイルの</fontconfig> の前に、以下を追記します。

<match>
  <test name="prgname"><string>discord</string></test>
  <test qual="any" name="family"><string>Consolas</string></test>
  <edit mode="assign" name="family" binding="same">
    <string>JetBrainsMonoMedium Nerd Font Mono</string>
  </edit>
</match>

Consolasを無理やり置き換えています。あまりクールじゃないですが。

無理やり置き換えるために<edit>タグの属性をいじっていることに注意してください。[3]

- <edit mode="prepend" name="family">
+ <edit mode="assign" name="family" binding="same">

これをすると、コードブロックが以下のようなフォントに変わります。

great-codeblock

いいですね。読みやすく、そしてなによりもエモいです。リガチャもしっかり効いています。[4]

Ligacha

すげぇ。 Discordでリガチャ使えるとはさすがに思いませんでした。

👋 おわりに

Linuxってホントに詳細までカスタマイズできてすごいなーと思いました。

📖 参考にした記事



  1. これ見つけたときすごいびっくりしました。まさかこんな都合の良いオプションがあるとは。 ↩︎

  2. なくても動きますが、コードブロックの等幅フォントも巻き込まれて辛くなります。 ↩︎

  3. おそらくbindingは優先順位に関係してそうです。英語が読めないので間違っているかもしれません (間違っていればぜひTwitterとかで教えていただけるとありがたいです🙏) ↩︎

  4. びっくりしました。 ↩︎

プライバシーポリシー- (c) 2024 Approvers