Last active
May 25, 2025 18:14
-
-
Save ernstki/2ae279ad89888e4099c9852bf0ba5d11 to your computer and use it in GitHub Desktop.
Easily disable fonts that aren't in your language, for Debian and derivatives (and possibly other Linux distros)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env perl | |
| ## | |
| ## Easily disable fonts that aren't for your language, or language-specific | |
| ## variants from large font families like Noto -- WITHOUT uninstalling them | |
| ## | |
| ## Authors: Kevin Ernst <ernstki -at- mail.uc.edu>, @wdoekes | |
| ## License: MIT or CC-BY-SA-4.0, at your option | |
| ## Source: https://gist.github.com/ernstki/2ae279ad89888e4099c9852bf0ba5d11 | |
| ## | |
| ## Usage: | |
| ## ./fc-reject.pl > ~/.config/fontconfig/conf.d/88-reject.conf.new && \ | |
| ## mv ~/.config/fontconfig/conf.d/88-reject.conf{.new,} | |
| ## | |
| use v5.12; | |
| use warnings; | |
| use autodie; | |
| my $rejectlist = {}; | |
| # languages I want to keep, e.g., my native language plus 'und-zsye' for emoji | |
| # (ref: https://www.unicode.org/reports/tr35) | |
| my $mylangs = 'en|de|und-zsye'; | |
| # reject these fonts unconditionally, even if they claim to support my language | |
| # (easier than uninstalling; they may be depends/recommends for other packages) | |
| my $rejectfam = '^(Kacst|AR PL|Noto.*CJK)'; # Arabic and East Asian scripts | |
| # filter out language-specific font variants for languages I don't use from any | |
| # font family matched by the $filterfam regexp | |
| my $filterfam = '^Noto'; | |
| # always keep fonts that match the $keepfam regexp, regardless of lang. support | |
| my $keepfam = '^Noto (Music|Symbols|Sans Linear [AB])'; | |
| open my $fh, '-|', 'fc-cat'; | |
| while (<$fh>) { | |
| # a typical line of output from `fc-cat` looks like this: | |
| # "NotoSerifHebrew-Regular.ttf" 0 "Noto Serif Hebrew:…:lang=he(|…):… | |
| # …which would yield $name = 'Noto Serif Hebrew' and @langs = ('he') | |
| if (/.* "([^:,]+).*:lang=([^:]*)/) { | |
| my ($name, @langs) = ($1, split(/\|/, $2)); | |
| next if $name =~ /$keepfam/; | |
| if ($name =~ /$rejectfam/) { | |
| $rejectlist->{$name} = 1; | |
| next; | |
| } | |
| if ($name =~ /$filterfam/) { | |
| unless (@langs) { | |
| # if you want to retain any of these, add to $keepfam, above | |
| warn "Family '$name' specified no languages\n"; | |
| $rejectlist->{$name} = 1; | |
| next; | |
| } | |
| $rejectlist->{$name} = 1 unless map { /$mylangs/ } @langs; | |
| } | |
| } | |
| } | |
| close $fh; | |
| print <<EOF; | |
| <?xml version="1.0"?> | |
| <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> | |
| <fontconfig> | |
| <selectfont> | |
| <rejectfont> | |
| EOF | |
| foreach my $name (sort keys %$rejectlist) { | |
| print <<EOF; | |
| <pattern> | |
| <patelt name="family"> | |
| <string>$name</string> | |
| </patelt> | |
| </pattern> | |
| EOF | |
| } | |
| print <<EOF; | |
| </rejectfont> | |
| </selectfont> | |
| </fontconfig> | |
| EOF | |
| # vim: shiftwidth=4 tabstop=4 expandtab |
Author
Hope you're OK with the original license (MIT).
Anything is fine. Thanks for asking.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thanks, @wdoekes. I updated the script with your helpful suggestions, so it's maybe less of a dirty hack now. Hope you're OK with the original license (MIT).
@DJGoossens I'm glad it helped, and that's a great idea of re-using Font Manager's own config so you can tweak it with a GUI later.