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設定檔#
Linux的字型多半會安裝到
/usr/share/fonts/
。Noto Fonts字型應位於/usr/share/fonts/truetype/noto/
,Noto CJK Fonts位於/usr/share/fonts/opentype/noto/
使用
fc-list
指令列出可用的字型。新增fontconfig設定檔,只對目前使用者有效。
mkdir -p ~/.config/fontconfig/
vim ~/.config/fontconfig/fonts.conf
<selectfont>
裡面的<rejectfont></rejectfont>
用於定義要停用(黑名單)的字型,<acceptfont></acceptfont>
則是啟用(白名單)的字型,不過後者通常不用寫,因為你在rejectfont排除掉之後,剩下的字型就是還啟用的字型。如果要停用單一字型,就這樣寫,一行一個
<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>
- 如果要停用的字型家族太多,不妨使用這個篩選邏輯:先將所有該字型家族加入黑名單,然後再白名單要用的字型。譬如,針對字型超多的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>
- 停用字型後,執行以下指令更新快取
fc-cache -fv
- 使用fc-list指令查看Noto Fonts字型是否有停用成功,列表項目應該會減少許多:
fc-list | grep noto
重新啟動軟體,那個字型應該就會從列表消失了。軟體也不能再用那個字型顯示文字了。
Flatpak軟體需開放讀取fontconfig權限,但不知為何無效。可能要把停用的字型改成寫到
/etc/fonts/disabledfonts.xml
才有作用。
flatpak --user override --filesystem=xdg-config/fontconfig:ro
3. 針對單一軟體停用字型#
理論上是可以這樣做,不過嘛寫規則太複雜了,不如全域停用要好!
這有兩種作法,一種是在fonts.conf裡面定義具體的二進位檔名稱,另一種是用環境變數FONTCONFIG_FILE
,我覺得後者比較靈活!
- 新增一個專門用於停用字型的fontconfig設定檔
mkdir -p ~/.config/fontconfig/conf.d/
vim ~/.config/fontconfig/conf.d/libreoffice.conf
- 填入停用規則
<?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>
- 在啟動程式的時候,加上環境變數,指定fontconfig的路徑
FONTCONFIG_FILE=~/.config/fontconfig/conf.d/libreoffice.conf libreoffice
- 雖說如此,不過我測試了好像沒用😛