How to alias one of the weights of a font family with fontconfig

fontconfigfonts

I have the font Fira Code installed on my computer but I can't target its bold variant using fontconfig in the same way I do with its other variants. Here's what fc-match gives me:

$ fc-match "Fira Code"
FiraCode_Regular.otf: "Fira Code" "Regular"
$ fc-match "Fira Code Light"
FiraCode_Light.otf: "Fira Code" "Light"
$ fc-match "Fira Code Medium"
FiraCode_Medium.otf: "Fira Code" "Medium"
$ fc-match "Fira Code Bold"
NotoSans-Regular.ttc: "Noto Sans" "Regular"

Noto Sans is my fallback font which I think means that Fira Code Bold doesn't have any matches with any of my fonts.
However, it does match the right one if I run fc-match with Fira Code:Bold.

$ fc-match "Fira Code:Bold"
FiraCode_Bold.otf: "Fira Code" "Bold"

Following this question, I created a file called 30-fira-code-bold.conf within ~/.config/fontconfig/conf.d/ with the following content:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
    <match target="pattern">
        <test name="family"><string>Fira Code</string></test>
        <test name="weight" compare="more_eq"><const>bold</const></test>
        <edit name="family" mode="assign" binding="strong"><string>Fira Code Bold</string></edit>
    </match>
</fontconfig>

and then I ran fc-cache -rv and logged out but it still gives me Noto Sans if I run $ fc-match "Fira Code Bold". The only difference I have noticed is that it gives me Noto Sans even if I run $ fc-match "Fira Code:Bold"; so basically I can't target the bold variant of Fira Code in any way now.

I'm running Archlinux, if it can help, and this is the output of fc-list:

$ fc-list "Fira Code" | egrep -o 'FiraCode.*'
FiraCode_Medium.otf: Fira Code,Fira Code Medium:style=Medium,Regular
FiraCode_Light.otf: Fira Code,Fira Code Light:style=Light,Regular
FiraCode_Regular.otf: Fira Code:style=Regular
FiraCode_Bold.otf: Fira Code:style=Bold

Can anyone tell me how I can target Fira Code Bold using "Fira Code Bold"?

Best Answer

By testing around from other fontconfig files, the right configuration file which seems to be working is the one below:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
    <match target="pattern">
        <test qual="any" name="family">
            <string>Fira Code Bold</string>
        </test>
        <edit name="family" binding="same" mode="prepend">
            <string>Fira Code</string>
        </edit>
        <edit name="weight" binding="same" mode="prepend">
            <const>bold</const>
        </edit>
    </match>
</fontconfig>
Related Question