<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Font on Tarragon</title><link>https://tarrragon.github.io/blog/tags/font/</link><description>Recent content in Font on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Wed, 01 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/font/index.xml" rel="self" type="application/rss+xml"/><item><title>字型的可用集合在 process 啟動時決定</title><link>https://tarrragon.github.io/blog/linux/dotfile/knowledge-cards/font-availability-at-startup/</link><pubDate>Wed, 01 Jul 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/dotfile/knowledge-cards/font-availability-at-startup/</guid><description>&lt;p>一個 process 能用哪些字型，是在它&lt;strong>啟動的當下&lt;/strong>由 fontconfig（Linux 上統一管理字型搜尋與匹配的底層服務）決定並載入記憶體的。之後往系統裝新字型，不會回頭改變已經在跑的 process——它手上那份字型清單是啟動時的快照。「裝了字型卻還是豆腐」多數時候指向的是這個時序問題，而非安裝本身失敗。&lt;/p>
&lt;p>這個機制發生在 fontconfig + process 記憶體層，跟顯示協議無關——Wayland 和 X11 下的行為相同。&lt;/p>
&lt;h2 id="同一時刻兩種查詢結果">同一時刻、兩種查詢結果&lt;/h2>
&lt;p>裝完新字型後，在終端機用 fontconfig 的查詢工具 &lt;code>fc-match&lt;/code>（每次執行都是新 process）去查：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">fc-match &lt;span class="s2">&amp;#34;:lang=zh-tw&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">&lt;span class="c1"># Noto Sans CJK → 系統快取已有這支字&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>查得到。但同時間，一直開著的狀態列或通知 daemon 仍顯示豆腐。矛盾的根源是兩者的啟動時間不同：&lt;code>fc-match&lt;/code> 剛啟動、讀到的是最新系統快取；那個豆腐的 daemon 是在裝字型&lt;strong>之前&lt;/strong>啟動的，記憶體裡的字型清單沒有這支字。&lt;/p>
&lt;p>套件管理器安裝字型時，post-install hook 通常已更新 fontconfig 的系統快取（pacman 會印 &lt;code>Updating fontconfig cache&lt;/code>）。手動把字型檔放進 &lt;code>~/.local/share/fonts/&lt;/code> 的情況下，需要自己跑 fontconfig 的快取重建工具 &lt;code>fc-cache&lt;/code>：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">fc-cache -fv
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">&lt;span class="c1"># -f 忽略時間戳、強制全部重建&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">&lt;span class="c1"># -v 印出處理了哪些目錄&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>fc-cache&lt;/code> 只更新系統快取層——磁碟上的索引檔。它不會觸及任何已啟動 process 的記憶體，跑再多次也改變不了舊 process 的字型清單。&lt;/p>
&lt;h2 id="判讀與操作">判讀與操作&lt;/h2>
&lt;p>&lt;strong>判讀訊號&lt;/strong>：&lt;code>fc-match&lt;/code> 在命令列回得出正確字型，但某個一直開著的程式仍顯示豆腐，幾乎可確定是「那個程式啟動早於裝字型」。&lt;/p>
&lt;p>&lt;strong>修法是重啟該程式，不是 reload&lt;/strong>。&lt;code>reload&lt;/code> 類指令（如 &lt;code>makoctl reload&lt;/code>、送 SIGHUP）重讀的是&lt;strong>設定檔&lt;/strong>——能換到 daemon 啟動時已可見的字型（例如從 A 字族改成 B 字族），但看不到啟動後才新裝的字型檔。根源是 reload 不重建記憶體裡的字型清單，只有重啟 process 才會從系統快取重新載入。&lt;/p>
&lt;p>&lt;strong>重啟的範圍&lt;/strong>取決於受影響的程式數量。單一 daemon（通知、狀態列）重啟那一個即可；由 compositor &lt;code>exec-once&lt;/code> 拉起的一批元件要同時吃到新字型，最乾淨的做法是重新登入，讓它們全部重新啟動。&lt;/p>
&lt;p>&lt;strong>正常開機不會踩到這個坑&lt;/strong>——字型在開機早期就裝好，&lt;code>exec-once&lt;/code> 啟動的元件從一開始就看得到完整字型集合。這個時序問題集中在「系統已經在跑、中途才補裝字型」的除錯情境。&lt;/p>
&lt;p>&lt;strong>延伸閱讀&lt;/strong>：Nerd Font 不含 CJK、需另裝 fallback 字型的具體案例見&lt;a href="https://tarrragon.github.io/blog/linux/dotfile/06-rice-design/desktop-shell-components/" data-link-title="桌面 Shell 元件：狀態列、啟動器與通知" data-link-desc="Hyprland 桌面要拼哪些元件、各元件的配置檔怎麼寫時回來讀">桌面 Shell 元件：狀態列、啟動器與通知&lt;/a>；字型安裝方式見&lt;a href="https://tarrragon.github.io/blog/linux/dotfile/03-terminal-ecosystem/terminal-emulator-config/" data-link-title="Terminal Emulator 配置" data-link-desc="選 terminal emulator 時需要比對配置格式和跨平台能力、或想把配色和字型統一管理時回來讀">終端機與編輯器配置&lt;/a>的字型管理段。&lt;/p>
&lt;h2 id="邊界與例外">邊界與例外&lt;/h2>
&lt;p>&lt;strong>fc-match 也查不到&lt;/strong>：連新 process 都找不到剛裝的字型，問題在系統快取層（fontconfig 索引未更新），跑 &lt;code>fc-cache -fv&lt;/code> 解決。兩層的修法不同，&lt;code>fc-match&lt;/code> 是分辨在哪一層的第一步。&lt;/p>
&lt;p>&lt;strong>部分應用程式支援熱載入&lt;/strong>：瀏覽器等有獨立字型服務的程式可能在開新分頁時重新掃描字型，不需要重啟整個 process。長駐 daemon（mako、waybar）與狀態列預設是啟動時載入一次。&lt;/p>
&lt;p>&lt;strong>Flatpak / Snap 的字型隔離是不同問題&lt;/strong>：沙箱化應用程式看不到 host 的字型目錄，重啟 process 也無法解決——原因不是時序，而是沙箱的檔案系統隔離。需要透過 Flatpak 的 filesystem override 或把字型放進沙箱可存取的路徑。&lt;/p></description><content:encoded><![CDATA[<p>一個 process 能用哪些字型，是在它<strong>啟動的當下</strong>由 fontconfig（Linux 上統一管理字型搜尋與匹配的底層服務）決定並載入記憶體的。之後往系統裝新字型，不會回頭改變已經在跑的 process——它手上那份字型清單是啟動時的快照。「裝了字型卻還是豆腐」多數時候指向的是這個時序問題，而非安裝本身失敗。</p>
<p>這個機制發生在 fontconfig + process 記憶體層，跟顯示協議無關——Wayland 和 X11 下的行為相同。</p>
<h2 id="同一時刻兩種查詢結果">同一時刻、兩種查詢結果</h2>
<p>裝完新字型後，在終端機用 fontconfig 的查詢工具 <code>fc-match</code>（每次執行都是新 process）去查：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">fc-match <span class="s2">&#34;:lang=zh-tw&#34;</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="c1"># Noto Sans CJK → 系統快取已有這支字</span></span></span></code></pre></div><p>查得到。但同時間，一直開著的狀態列或通知 daemon 仍顯示豆腐。矛盾的根源是兩者的啟動時間不同：<code>fc-match</code> 剛啟動、讀到的是最新系統快取；那個豆腐的 daemon 是在裝字型<strong>之前</strong>啟動的，記憶體裡的字型清單沒有這支字。</p>
<p>套件管理器安裝字型時，post-install hook 通常已更新 fontconfig 的系統快取（pacman 會印 <code>Updating fontconfig cache</code>）。手動把字型檔放進 <code>~/.local/share/fonts/</code> 的情況下，需要自己跑 fontconfig 的快取重建工具 <code>fc-cache</code>：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">fc-cache -fv
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="c1"># -f 忽略時間戳、強制全部重建</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="c1"># -v 印出處理了哪些目錄</span></span></span></code></pre></div><p><code>fc-cache</code> 只更新系統快取層——磁碟上的索引檔。它不會觸及任何已啟動 process 的記憶體，跑再多次也改變不了舊 process 的字型清單。</p>
<h2 id="判讀與操作">判讀與操作</h2>
<p><strong>判讀訊號</strong>：<code>fc-match</code> 在命令列回得出正確字型，但某個一直開著的程式仍顯示豆腐，幾乎可確定是「那個程式啟動早於裝字型」。</p>
<p><strong>修法是重啟該程式，不是 reload</strong>。<code>reload</code> 類指令（如 <code>makoctl reload</code>、送 SIGHUP）重讀的是<strong>設定檔</strong>——能換到 daemon 啟動時已可見的字型（例如從 A 字族改成 B 字族），但看不到啟動後才新裝的字型檔。根源是 reload 不重建記憶體裡的字型清單，只有重啟 process 才會從系統快取重新載入。</p>
<p><strong>重啟的範圍</strong>取決於受影響的程式數量。單一 daemon（通知、狀態列）重啟那一個即可；由 compositor <code>exec-once</code> 拉起的一批元件要同時吃到新字型，最乾淨的做法是重新登入，讓它們全部重新啟動。</p>
<p><strong>正常開機不會踩到這個坑</strong>——字型在開機早期就裝好，<code>exec-once</code> 啟動的元件從一開始就看得到完整字型集合。這個時序問題集中在「系統已經在跑、中途才補裝字型」的除錯情境。</p>
<p><strong>延伸閱讀</strong>：Nerd Font 不含 CJK、需另裝 fallback 字型的具體案例見<a href="/blog/linux/dotfile/06-rice-design/desktop-shell-components/" data-link-title="桌面 Shell 元件：狀態列、啟動器與通知" data-link-desc="Hyprland 桌面要拼哪些元件、各元件的配置檔怎麼寫時回來讀">桌面 Shell 元件：狀態列、啟動器與通知</a>；字型安裝方式見<a href="/blog/linux/dotfile/03-terminal-ecosystem/terminal-emulator-config/" data-link-title="Terminal Emulator 配置" data-link-desc="選 terminal emulator 時需要比對配置格式和跨平台能力、或想把配色和字型統一管理時回來讀">終端機與編輯器配置</a>的字型管理段。</p>
<h2 id="邊界與例外">邊界與例外</h2>
<p><strong>fc-match 也查不到</strong>：連新 process 都找不到剛裝的字型，問題在系統快取層（fontconfig 索引未更新），跑 <code>fc-cache -fv</code> 解決。兩層的修法不同，<code>fc-match</code> 是分辨在哪一層的第一步。</p>
<p><strong>部分應用程式支援熱載入</strong>：瀏覽器等有獨立字型服務的程式可能在開新分頁時重新掃描字型，不需要重啟整個 process。長駐 daemon（mako、waybar）與狀態列預設是啟動時載入一次。</p>
<p><strong>Flatpak / Snap 的字型隔離是不同問題</strong>：沙箱化應用程式看不到 host 的字型目錄，重啟 process 也無法解決——原因不是時序，而是沙箱的檔案系統隔離。需要透過 Flatpak 的 filesystem override 或把字型放進沙箱可存取的路徑。</p>
]]></content:encoded></item><item><title>fontconfig — 字型搜尋、匹配與 fallback 服務</title><link>https://tarrragon.github.io/blog/linux/dotfile/knowledge-cards/fontconfig/</link><pubDate>Wed, 01 Jul 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/dotfile/knowledge-cards/fontconfig/</guid><description>&lt;p>fontconfig 是 Linux 上統一管理字型搜尋、匹配與 fallback 的底層服務。應用程式透過 fontconfig 的 API 查詢可用字型，而非自行掃描字型目錄——無論是終端機、狀態列、通知 daemon 還是瀏覽器，底層都走同一套查詢介面。&lt;/p>
&lt;h2 id="fc--工具分工">fc-* 工具分工&lt;/h2>
&lt;p>fontconfig 附帶一組命令列工具，各自負責一件事：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>工具&lt;/th>
 &lt;th>用途&lt;/th>
 &lt;th>常用情境&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>fc-list&lt;/code>&lt;/td>
 &lt;td>列出系統已知的所有字型（字族名、檔案路徑）&lt;/td>
 &lt;td>確認某支字型有沒有裝、查實際字族名&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>fc-match&lt;/code>&lt;/td>
 &lt;td>查詢指定條件的最佳匹配結果&lt;/td>
 &lt;td>確認 config 裡寫的字族名會匹配到哪支字&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>fc-cache&lt;/code>&lt;/td>
 &lt;td>重建 fontconfig 的系統快取&lt;/td>
 &lt;td>手動放字型檔後更新快取（套件安裝通常自動跑）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>fc-pattern&lt;/code>&lt;/td>
 &lt;td>印出字型的完整屬性（除錯用）&lt;/td>
 &lt;td>查字型支援的語言、字重、字形變體&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;code>fc-list&lt;/code> 和 &lt;code>fc-match&lt;/code> 每次執行都是新 process，讀到的是當下最新的系統快取。這跟已啟動的長駐程式不同——長駐程式的字型清單是啟動時的快照，詳見 &lt;a href="https://tarrragon.github.io/blog/linux/dotfile/knowledge-cards/font-availability-at-startup/" data-link-title="字型的可用集合在 process 啟動時決定" data-link-desc="裝了字型但應用程式 / 狀態列 / 通知還是看不到、還是豆腐時回來讀">font-availability-at-startup&lt;/a>。&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">fc-list &lt;span class="p">|&lt;/span> grep -i meslo
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">&lt;span class="c1"># 確認 MesloLGS Nerd Font 有沒有裝、實際字族名是什麼&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">fc-match &lt;span class="s2">&amp;#34;MesloLGS Nerd Font&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl">&lt;span class="c1"># 查 config 裡寫的名字會匹配到哪支字型檔&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">7&lt;/span>&lt;span class="cl">fc-match &lt;span class="s2">&amp;#34;:lang=zh-tw&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">8&lt;/span>&lt;span class="cl">&lt;span class="c1"># 查系統有沒有可用的繁體中文字型&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="fallback-chain">Fallback chain&lt;/h2>
&lt;p>應用程式在 config 裡指定字族名（如 &lt;code>MesloLGS Nerd Font&lt;/code>），fontconfig 依以下順序處理：&lt;/p>
&lt;ol>
&lt;li>在已知字型中找&lt;strong>完全匹配&lt;/strong>的字族&lt;/li>
&lt;li>找不到就沿 fallback chain 往下找候選——fontconfig 的預設 fallback 規則定義在 &lt;code>/etc/fonts/conf.d/&lt;/code> 的 XML 設定檔中&lt;/li>
&lt;li>CJK fallback 依語言優先序決定——&lt;code>fc-match &amp;quot;:lang=zh-tw&amp;quot;&lt;/code> 回的是 fontconfig 認為最適合該語言的字型&lt;/li>
&lt;/ol>
&lt;p>Nerd Font（MesloLGS、JetBrainsMono 等）只含 Latin 字元與圖示 glyph，CJK 字元靠 fallback 到另一支字型（如 &lt;code>noto-fonts-cjk&lt;/code>）補齊。fontconfig 的 fallback 對應用程式透明——應用程式只指定主字型，缺字時 fontconfig 自動補。&lt;/p>
&lt;h2 id="系統快取">系統快取&lt;/h2>
&lt;p>fontconfig 把字型目錄的掃描結果存成快取檔，避免每次查詢都重新掃描整個檔案系統：&lt;/p>
&lt;ul>
&lt;li>系統層快取：&lt;code>/var/cache/fontconfig/&lt;/code>&lt;/li>
&lt;li>使用者層快取：&lt;code>~/.cache/fontconfig/&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>套件管理器安裝字型時，post-install hook 會自動執行 &lt;code>fc-cache&lt;/code> 更新系統快取（pacman 安裝完會印 &lt;code>Updating fontconfig cache&lt;/code>）。手動把字型檔放進 &lt;code>~/.local/share/fonts/&lt;/code> 時需要自己跑 &lt;code>fc-cache&lt;/code>——不跑的話 fontconfig 看不到新字型。&lt;/p>
&lt;p>&lt;code>fc-cache -f&lt;/code> 的 &lt;code>-f&lt;/code> 是 force，忽略時間戳全部重建；不加 &lt;code>-f&lt;/code> 只更新有變動的目錄。兩者都只動系統快取層——已啟動的 process 記憶體中的字型清單不受影響，那是另一個層級的問題（見 &lt;a href="https://tarrragon.github.io/blog/linux/dotfile/knowledge-cards/font-availability-at-startup/" data-link-title="字型的可用集合在 process 啟動時決定" data-link-desc="裝了字型但應用程式 / 狀態列 / 通知還是看不到、還是豆腐時回來讀">font-availability-at-startup&lt;/a>）。&lt;/p>
&lt;h2 id="下一步路由">下一步路由&lt;/h2>
&lt;ul>
&lt;li>字型安裝方式：&lt;a href="https://tarrragon.github.io/blog/linux/dotfile/03-terminal-ecosystem/" data-link-title="模組三：終端機與編輯器" data-link-desc="終端機相關工具的配置檔散落在不同位置、不確定哪些該進 dotfile repo 時回來讀">終端機與編輯器&lt;/a>的字型管理段&lt;/li>
&lt;li>裝了字型但應用程式還是看不到：&lt;a href="https://tarrragon.github.io/blog/linux/dotfile/knowledge-cards/font-availability-at-startup/" data-link-title="字型的可用集合在 process 啟動時決定" data-link-desc="裝了字型但應用程式 / 狀態列 / 通知還是看不到、還是豆腐時回來讀">font-availability-at-startup&lt;/a>（process 啟動時快照的時序問題）&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>fontconfig 是 Linux 上統一管理字型搜尋、匹配與 fallback 的底層服務。應用程式透過 fontconfig 的 API 查詢可用字型，而非自行掃描字型目錄——無論是終端機、狀態列、通知 daemon 還是瀏覽器，底層都走同一套查詢介面。</p>
<h2 id="fc--工具分工">fc-* 工具分工</h2>
<p>fontconfig 附帶一組命令列工具，各自負責一件事：</p>
<table>
  <thead>
      <tr>
          <th>工具</th>
          <th>用途</th>
          <th>常用情境</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>fc-list</code></td>
          <td>列出系統已知的所有字型（字族名、檔案路徑）</td>
          <td>確認某支字型有沒有裝、查實際字族名</td>
      </tr>
      <tr>
          <td><code>fc-match</code></td>
          <td>查詢指定條件的最佳匹配結果</td>
          <td>確認 config 裡寫的字族名會匹配到哪支字</td>
      </tr>
      <tr>
          <td><code>fc-cache</code></td>
          <td>重建 fontconfig 的系統快取</td>
          <td>手動放字型檔後更新快取（套件安裝通常自動跑）</td>
      </tr>
      <tr>
          <td><code>fc-pattern</code></td>
          <td>印出字型的完整屬性（除錯用）</td>
          <td>查字型支援的語言、字重、字形變體</td>
      </tr>
  </tbody>
</table>
<p><code>fc-list</code> 和 <code>fc-match</code> 每次執行都是新 process，讀到的是當下最新的系統快取。這跟已啟動的長駐程式不同——長駐程式的字型清單是啟動時的快照，詳見 <a href="/blog/linux/dotfile/knowledge-cards/font-availability-at-startup/" data-link-title="字型的可用集合在 process 啟動時決定" data-link-desc="裝了字型但應用程式 / 狀態列 / 通知還是看不到、還是豆腐時回來讀">font-availability-at-startup</a>。</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">fc-list <span class="p">|</span> grep -i meslo
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="c1"># 確認 MesloLGS Nerd Font 有沒有裝、實際字族名是什麼</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">
</span></span><span class="line"><span class="ln">4</span><span class="cl">fc-match <span class="s2">&#34;MesloLGS Nerd Font&#34;</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="c1"># 查 config 裡寫的名字會匹配到哪支字型檔</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl">
</span></span><span class="line"><span class="ln">7</span><span class="cl">fc-match <span class="s2">&#34;:lang=zh-tw&#34;</span>
</span></span><span class="line"><span class="ln">8</span><span class="cl"><span class="c1"># 查系統有沒有可用的繁體中文字型</span></span></span></code></pre></div><h2 id="fallback-chain">Fallback chain</h2>
<p>應用程式在 config 裡指定字族名（如 <code>MesloLGS Nerd Font</code>），fontconfig 依以下順序處理：</p>
<ol>
<li>在已知字型中找<strong>完全匹配</strong>的字族</li>
<li>找不到就沿 fallback chain 往下找候選——fontconfig 的預設 fallback 規則定義在 <code>/etc/fonts/conf.d/</code> 的 XML 設定檔中</li>
<li>CJK fallback 依語言優先序決定——<code>fc-match &quot;:lang=zh-tw&quot;</code> 回的是 fontconfig 認為最適合該語言的字型</li>
</ol>
<p>Nerd Font（MesloLGS、JetBrainsMono 等）只含 Latin 字元與圖示 glyph，CJK 字元靠 fallback 到另一支字型（如 <code>noto-fonts-cjk</code>）補齊。fontconfig 的 fallback 對應用程式透明——應用程式只指定主字型，缺字時 fontconfig 自動補。</p>
<h2 id="系統快取">系統快取</h2>
<p>fontconfig 把字型目錄的掃描結果存成快取檔，避免每次查詢都重新掃描整個檔案系統：</p>
<ul>
<li>系統層快取：<code>/var/cache/fontconfig/</code></li>
<li>使用者層快取：<code>~/.cache/fontconfig/</code></li>
</ul>
<p>套件管理器安裝字型時，post-install hook 會自動執行 <code>fc-cache</code> 更新系統快取（pacman 安裝完會印 <code>Updating fontconfig cache</code>）。手動把字型檔放進 <code>~/.local/share/fonts/</code> 時需要自己跑 <code>fc-cache</code>——不跑的話 fontconfig 看不到新字型。</p>
<p><code>fc-cache -f</code> 的 <code>-f</code> 是 force，忽略時間戳全部重建；不加 <code>-f</code> 只更新有變動的目錄。兩者都只動系統快取層——已啟動的 process 記憶體中的字型清單不受影響，那是另一個層級的問題（見 <a href="/blog/linux/dotfile/knowledge-cards/font-availability-at-startup/" data-link-title="字型的可用集合在 process 啟動時決定" data-link-desc="裝了字型但應用程式 / 狀態列 / 通知還是看不到、還是豆腐時回來讀">font-availability-at-startup</a>）。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>字型安裝方式：<a href="/blog/linux/dotfile/03-terminal-ecosystem/" data-link-title="模組三：終端機與編輯器" data-link-desc="終端機相關工具的配置檔散落在不同位置、不確定哪些該進 dotfile repo 時回來讀">終端機與編輯器</a>的字型管理段</li>
<li>裝了字型但應用程式還是看不到：<a href="/blog/linux/dotfile/knowledge-cards/font-availability-at-startup/" data-link-title="字型的可用集合在 process 啟動時決定" data-link-desc="裝了字型但應用程式 / 狀態列 / 通知還是看不到、還是豆腐時回來讀">font-availability-at-startup</a>（process 啟動時快照的時序問題）</li>
</ul>
]]></content:encoded></item></channel></rss>