Wie finde ich heraus, wie fc-match passt?

18

Wenn ich laufe fc-mach Sans, kehrt es zurück, DejaVuSans.ttf: "DejaVu Sans" "Book"aber wenn es läuft wie fc-match "Sans "oder fc-match "Sans 9"es kehrt zurück unifont.ttf: "unifont" "Medium". Ich bevorzuge es, immer DejaVu Sans zu verwenden, kann aber nicht herausfinden, warum fontconfig unifont auswählt. Weder die globale noch die lokale Konfiguration scheinen unifont zu erwähnen ( grep -ri unifont /etc/fonts/ ~/.fonts.confgibt nichts zurück). Das Spielen mit LC_DEBUG hat mir auch nicht geholfen. Gibt es eine Möglichkeit, die Informationen zu erhalten, warum sich fontconfig so verhält?

frank
quelle

Antworten:

11

Auf den ersten Blick sieht es für mich nach einem echten fontconfig-Fehler aus, da es hier richtig funktioniert und ich sowohl DejaVu als auch Unifont installiert habe:

$ fc-match Sans
DejaVuSans.ttf: "DejaVu Sans" "Book"
$ fc-match "Sans"
DejaVuSans.ttf: "DejaVu Sans" "Book"
$ fc-match "Sans "
DejaVuSans.ttf: "DejaVu Sans" "Book"
$ fc-match "Sans 9"
DejaVuSans.ttf: "DejaVu Sans" "Book"

Bei näherer Betrachtung können wir jedoch einige Details erkennen. Möglicherweise ist irgendwo immer noch ein fontconfig-Fehler aufgetreten, es wird jedoch fc-matchanscheinend ein Standardwert zurückgegeben, wenn nichts gefunden wird. Es ist nur die Standardeinstellung DejaVu auf meinem System:

$ fc-match uni
DejaVuSans.ttf: "DejaVu Sans" "Book"
$ fc-match unifont
Unifont.ttf: "unifont" "Medium"
$ fc-match 4e5zedrkbxp
DejaVuSans.ttf: "DejaVu Sans" "Book"

Auf der Manpage wird fc-match(1)bestätigt, dass der Befehl keine exakten Übereinstimmungen ausführt, sondern die nach seiner Ansicht besten Übereinstimmungen zurückgibt. Sie können sie alle mit -aoder prägnanter sehen -s:

$ fc-match -s uni # now it also finds unifont
DejaVuSans.ttf: "DejaVu Sans" "Book"
DejaVuSans-Bold.ttf: "DejaVu Sans" "Bold"
DejaVuSans-Oblique.ttf: "DejaVu Sans" "Oblique"
DejaVuSans-BoldOblique.ttf: "DejaVu Sans" "Bold Oblique"
n019003l.pfb: "Nimbus Sans L" "Regular"
helvR12-ISO8859-1.pcf.gz: "Helvetica" "Regular"
FreeSans.ttf: "FreeSans" "нормален"
KanjiStrokeOrders.ttf: "KanjiStrokeOrders" "Medium"
Eadui.ttf: "Eadui" "Medium"
Unifont.ttf: "unifont" "Medium"
FreeSerif.ttf: "FreeSerif" "нормален"
cu12.pcf.gz: "ClearlyU" "Regular"
cu-pua12.pcf.gz: "ClearlyU PUA" "Regular"
10x20.pcf.gz: "Fixed" "Regular"

Darauf können Sie einfach "Schraube Sie" sagen und eine weitere Suche hinzufügen, um eine Übereinstimmung zu erhalten, wie Sie es erwarten:

$ fc-match -s uni | grep -i uni
Unifont.ttf: "unifont" "Medium"

Ihre Frage ist jedoch, wie genau das Matching durchgeführt wird. FcFontMatch(3)und bestätigen Sie grob, dass ein Standard- / konfigurierter Wert verwendet wird, und bestätigen Sie definitiv, dass der von Ihnen übergebene Suchbegriff zuerst geändert wird. Für alles, was noch tiefer geht, müssen Sie den Code überprüfen (beginnen Sie mit der oben genannten Funktion).

lynxlynxlynx
quelle
5

FontConfig hat Attribute basierend auf dem "Abstand" von den Übereinstimmungskriterien abgeglichen. Wenn Sie sehen möchten, was sich hinter den Kulissen abspielt , setzen Sie die Umgebungsvariable FC_DEBUG = 3 und wiederholen Sie Ihre Suche. Dies zeigt Debugging-Informationen an, die hilfreich sein könnten. Sie sollten den FontConfig-Code nicht lesen müssen.

Chris Sherlock
quelle