快轉到主要內容

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. 雖說如此,不過我測試了好像沒用😛

參考資料
#

相關文章

解決Ubuntu無法顯示標楷體,安裝額外的Windows中文字型
分類   Linux系統 Linux使用技巧
標籤   Ubuntu LibreOffice Freedesktop Specifications Fontconfig
fontconfig調整Linux中文預設字型的優先順序,修正字型模糊、Emoji亂碼的問題
分類   Linux系統 Linux使用技巧
標籤   Fontconfig LibreOffice Freedesktop Specifications
蝦密?Linux系統竟然有開關機音效
分類   Linux系統 Linux使用技巧
標籤   GNOME KDE Plasma Freedesktop Specifications

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

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