快轉到主要內容

Linux暫時停用部份字型,解決字型裝太多lag的問題(fontconfig rejectfont功能解說)

· 民國114年乙巳年
·
切換繁體/簡體
分類 Linux系統 Linux使用技巧
標籤 Fontconfig Freedesktop Specifications LibreOffice
目錄

Disabling some fonts temporarily on Linux desktop to solve the issue of having too many fonts installed.

一直以來我都有這個問題,要是Linux系統安裝太多字型(字體),在文書以及美工軟體的選單就會顯得落落長。

例如Ubuntu一旦用APT安裝「Noto Fonts」字型套件,就會將各國語言都拉進來,導致LibreOffice的字型列表變得超~級~長,捲動還會lag。GIMP和Krita同樣會遇到這個問題。

如果說要解決這個問題,最直觀的想法就是用APT解除安裝字型套件了吧?光fonts-noto-core這個套件就有200種字型,畢竟Noto Fonts就是設計來解決多語言文字變成方塊豆腐的問題的!但日後要使用又要重裝,很是麻煩!

所幸,Linux桌面常用的字型設定工具fontconfig有「rejectfont」的功能,可以將字型加入黑名單,「暫時」停用字型,這樣其他軟體就看不到這些字型。日後有需要再重新啟用就好了!不需要動到APT指令!

註:如果你遇到的問題是安裝特定字型,例如標楷體,導致界面字型強制跟著變成標楷體,那麼停用字型不是解決之道。你應該使用fontconfig優先級方式來糾正。

1. 圖形界面設定法
#

GNOME
#

GNOME桌面沒有管理字型的功能,請裝Font Manager(字形總管),或者手寫fontconfig設定檔。

根據Font Manager作者的介紹,Ubuntu加入套件庫安裝:

sudo add-apt-repository ppa:font-manager/staging

sudo apt update

sudo apt install font-manager

開啟後點選左上角管理,再取消勾選字型,將其暫時停用。Font Manager會將變更寫入到~/.config/fontconfig/conf.d/78-Reject.conf

停用字型後,重新啟動軟體,那個字型應該就會從列表消失了。軟體不能再用那個字型顯示文字了。

KDE Plasma
#

KDE Plasma桌面內建管理字型功能,注意它修改的是全域系統/etc/fonts/disabledfonts.xml設定,而非~/.config/fontconfig/fonts.conf

開啟KDE Plasma系統設定 → 字型管理,這裡可以暫時停用特定字型。

譬如針對Noto Fonts字型家族,按Shitft多選,全部停用

然後再留下需要的中文字型就夠了

停用字型後,重新啟動軟體,那個字型應該就會從列表消失了。軟體不能再用那個字型顯示文字了。

2. 手寫fontconfig設定檔
#

  1. Linux的字型多半會安裝到/usr/share/fonts/。Noto Fonts字型應位於/usr/share/fonts/truetype/noto/,Noto CJK Fonts位於/usr/share/fonts/opentype/noto/

  2. 使用fc-list指令列出可用的字型。

  3. 新增fontconfig設定檔,只對目前使用者有效。

mkdir -p ~/.config/fontconfig/

vim ~/.config/fontconfig/fonts.conf
  1. <selectfont>裡面的<rejectfont></rejectfont>用於定義要停用(黑名單)的字型,<acceptfont></acceptfont>則是啟用(白名單)的字型,不過後者通常不用寫,因為你在rejectfont排除掉之後,剩下的字型就是還啟用的字型。

  2. 如果要停用單一字型,就這樣寫,一行一個<glob></glob>,寫上字型的具體路徑。後面加上星號用作萬用字元。譬如NotoSansArabic*就是選取以NotoSansArabic名稱為首的所有字型。

<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>

<selectfont>
	<rejectfont>
		<glob>/usr/share/fonts/truetype/noto/NotoSansArabic*</glob>
		<glob>/usr/share/fonts/truetype/noto/NotoSansLao*</glob>
    </rejectfont>
</selectfont>

</fontconfig>

另一種寫法:使用字型家族下去篩選。先使用指令fc-list : family列出所有字型家族,然後再於<pattern></pattern>填入字型家族名稱。

<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>

<selectfont>
	<rejectfont>
		<pattern>
			<patelt name="family" >
				<string>Noto Sans Lao</string>
			</patelt>
			<patelt name="family" >
				<string>Noto Sans Arabic</string>
			</patelt>
		</pattern>
    </rejectfont>
</selectfont>

</fontconfig>
  1. 如果要停用的字型家族太多,不妨使用這個篩選邏輯:先將所有該字型家族加入黑名單,然後再白名單要用的字型。譬如,針對字型超多的Noto Fonts,就先將其全部加入<rejectfont></rejectfont>停用,然後再用<acceptfont></<acceptfont>篩選出要用的字型即可。這裡的範例是停用所有Noto Fonts字型,只啟用裡面的Emoji字型。
<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>

<selectfont>
    <rejectfont>
        <glob>/usr/share/fonts/truetype/noto/Noto*</glob>
    </rejectfont>
    <acceptfont>
		<glob>/usr/share/fonts/truetype/noto/NotoColorEmoji*</glob>
    </acceptfont>
</selectfont>

</fontconfig>
  1. 停用字型後,執行以下指令更新快取
fc-cache -fv
  1. 使用fc-list指令查看Noto Fonts字型是否有停用成功,列表項目應該會減少許多:
fc-list | grep noto
  1. 重新啟動軟體,那個字型應該就會從列表消失了。軟體也不能再用那個字型顯示文字了。

  2. Flatpak軟體需開放讀取fontconfig權限,但不知為何無效。可能要把停用的字型改成寫到/etc/fonts/disabledfonts.xml才有作用。

flatpak --user override --filesystem=xdg-config/fontconfig:ro

3. 針對單一軟體停用字型
#

理論上是可以這樣做,不過嘛寫規則太複雜了,不如全域停用要好!

這有兩種作法,一種是在fonts.conf裡面定義具體的二進位檔名稱,另一種是用環境變數FONTCONFIG_FILE,我覺得後者比較靈活!

  1. 新增一個專門用於停用字型的fontconfig設定檔
mkdir -p ~/.config/fontconfig/conf.d/

vim ~/.config/fontconfig/conf.d/libreoffice.conf
  1. 填入停用規則
<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>

<selectfont>
    <rejectfont>
        <glob>/usr/share/fonts/truetype/noto/Noto*</glob>
    </rejectfont>
    <acceptfont>
		<glob>/usr/share/fonts/truetype/noto/NotoColorEmoji*</glob>
    </acceptfont>
</selectfont>

</fontconfig>
  1. 在啟動程式的時候,加上環境變數,指定fontconfig的路徑
FONTCONFIG_FILE=~/.config/fontconfig/conf.d/libreoffice.conf libreoffice
  1. 雖說如此,不過我測試了好像沒用😛

參考資料
#

相關文章


此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。

(留言板載入中)這是Giscus留言板,需要Github帳號才能留言。支援Markdown語法,若要上傳圖片請善用外部圖床。您的留言會在Github Discussions向所有人公開。

Click here to edit your comments.

(留言板載入中)這是Disqus留言板,您可能會看到Disqus強制投放的廣告。為防止垃圾內容,有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。若要上傳圖片請善用外部圖床網站。