-
-
Save ernstki/2ae279ad89888e4099c9852bf0ba5d11 to your computer and use it in GitHub Desktop.
| #!/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 |
Many thanks! Solved my problem. I confess I inserted the key bit of 88-reject.conf into the 78-Reject.conf that Font Manager generates when you uncheck a font in the GUI, just so that Font Manager would know about the changes and still work as a management tool. I think it must only read 78-Reject.conf. (Says not to edit it manually, but no harm does as far as I can see.)
On Ubuntu 22.04 you might want to re-enable the emoji by removing
Noto Color Emojifrom the output. Otherwise you won't even see the 👍 in GitHub.
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.
Hope you're OK with the original license (MIT).
Anything is fine. Thanks for asking.
On Ubuntu 22.04 you might want to re-enable the emoji by removing
Noto Color Emojifrom the output. Otherwise you won't even see the 👍 in GitHub.And maybe
Noto MusicandNoto Sans SymbolsandNoto Sans Symbols2-- although I'm not sure how often you run into those.As for the harmless warning, I suggest:
The atomic mv ensures that only the complete file is read.
Thanks for this gist, @ernstki !
My changes: