Na verdade, é um capricho do fontconfig que o xterm não está funcionando. Algumas outras aplicações que você pode ter em mente suplantam a família de fontes com parâmetros adicionais, portanto, pode haver alguma melhoria possível.
Se você correr
xterm -report-fonts -fa 'gomono'
você veria exatamente o que foi carregado:
Loaded XftFonts(gomono[normal])
first char: 32
last char: 64258
missing-chars: 63567
present-chars: 660
Go Mono-8
familylang=en
style=Italic
stylelang=en
fullname=Go Mono Italic
fullnamelang=en
slant=100
weight=80
width=100
pixelsize=10.6712
spacing=100
foundry=b&h
antialias=True
hintstyle=3
hinting=True
verticallayout=False
autohint=False
globaladvance=True
file=/users/tom/.fonts/gomono/Go-Mono-Italic.ttf
e o manual do usuário do fontconfig diz que o 110 é oblíquo . fontconfig vê esta lista de arquivos em gomono
:
Go-Bold-Italic.ttf
Go-Bold.ttf
Go-Italic.ttf
Go-Medium-Italic.ttf
Go-Medium.ttf
Go-Mono-Bold-Italic.ttf
Go-Mono-Bold.ttf
Go-Mono-Italic.ttf
Go-Mono.ttf
Go-Regular.ttf
e prefere a fonte em itálico com base em seu sistema interno de pontuação. Se você também definir a variável de ambiente FC_DEBUG
para 127 (cada bit significa algo), você poderá ver as pontuações. Aqui está um extrato comparando as fontes normal e itálica:
Regular:
slant: 100001 0(i)(s), 100(i)(w)
weight: 20001 100(i)(s), 80(i)(w)
width: 1 100(i)(s), 100(i)(w)
lang: 1001 "en-US"(s), aa|af|av|ay|be|bg|bi|br|bs|ca|ce|ch|co|cs|cy|da|de|el|en|eo|es|et|eu|fi|fj|fo|fr|fur|fy|gd|gl|gv|ho|hr|hu|ia|id|ie|ik|io|is|it|ki|kl|kum|la|lb|lez|lt|lv|mg|mh|mk|mo|mt|nb|nds|nl|nn|no|nr|nso|ny|oc|om|os|pl|pt|rm|ro|ru|se|sel|sk|sl|sma|smj|smn|so|sq|sr|ss|st|sv|sw|tk|tl|tn|tr|ts|uk|uz|vo|vot|wa|wen|wo|xh|yap|zu|an|crh|csb|fil|hsb|ht|jv|kj|ku-tr|kwm|lg|li|ms|na|ng|pap-an|pap-aw|rn|rw|sc|sg|sn|su|za(w)
fontversion: 2.14735e+12 2147483647(i)(s), 131269(i)(w)
decorative: 1 FcFalse(s), FcFalse(w)
Score 0 0 1 1001 1002 0 0 0 100001 20001 1 1 0 0 0 2.14735e+12
Font 21 Pattern has 20 elts (size 20)
family: "Go Mono"(w)
familylang: "en"(w)
style: "Regular"(w)
stylelang: "en"(w)
fullname: "Go Mono"(w)
fullnamelang: "en"(w)
slant: 0(i)(w)
weight: 80(i)(w)
width: 100(i)(w)
spacing: 100(i)(w)
foundry: "b&h"(w)
file: "/users/tom/.fonts/gomono/Go-Mono.ttf"(w)
Itálico:
slant: 1 0(i)(s), 0(i)(w)
weight: 80001 100(i)(s), 180(i)(w)
width: 1 100(i)(s), 100(i)(w)
spacing: 1 100(i)(s), 100(i)(w)
lang: 1001 "en-US"(s), aa|af|av|ay|be|bg|bi|br|bs|ca|ce|ch|co|cs|cy|da|de|el|en|eo|es|et|eu|fi|fj|fo|fr|fur|fy|gd|gl|gv|ho|hr|hu|ia|id|ie|ik|io|is|it|ki|kl|kum|la|lb|lez|lt|lv|mg|mh|mk|mo|mt|nb|nds|nl|nn|no|nr|nso|ny|oc|om|os|pl|pt|rm|ro|ru|se|sel|sk|sl|sma|smj|smn|so|sq|sr|ss|st|sv|sw|tk|tl|tn|tr|ts|uk|uz|vo|vot|wa|wen|wo|xh|yap|zu|an|crh|csb|fil|hsb|ht|jv|kj|ku-tr|kwm|lg|li|ms|na|ng|pap-an|pap-aw|rn|rw|sc|sg|sn|su|za(w)
fontversion: 2.14735e+12 2147483647(i)(s), 131269(i)(w)
decorative: 1 FcFalse(s), FcFalse(w)
Score 0 0 1 1001 1002 1 0 0 1 80001 1 1 0 0 0 2.14735e+12
Font 20 Pattern has 19 elts (size 19)
family: "Go Mono"(w)
familylang: "en"(w)
style: "Italic"(w)
stylelang: "en"(w)
fullname: "Go Mono Italic"(w)
fullnamelang: "en"(w)
slant: 100(i)(w)
weight: 80(i)(w)
width: 100(i)(w)
foundry: "b&h"(w)
file: "/users/tom/.fonts/gomono/Go-Mono-Italic.ttf"(w)
e finalmente
slant: 1 0(i)(s), 0(i)(w)
weight: 20001 100(i)(s), 80(i)(w)
width: 1 100(i)(s), 100(i)(w)
lang: 2001 "en-US"(s), (w)
fontversion: 2.14748e+12 2147483647(i)(s), 0(i)(w)
decorative: 1 FcFalse(s), FcFalse(w)
Score 0 0 1001 2001 1002 0 0 0 1 20001 1 1 0 0 0 2.14748e+12
Best score 0 0 1 1001 1002 0 0 0 100001 20001 1 1 0 0 0 2.14735e+12
Pattern has 19 elts (size 19)
family: "Go Mono"(w)
familylang: "en"(w)
style: "Italic"(w)
stylelang: "en"(w)
fullname: "Go Mono Italic"(w)
fullnamelang: "en"(w)
slant: 100(i)(w)
weight: 80(i)(w)
width: 100(i)(w)
foundry: "b&h"(w)
file: "/users/tom/.fonts/gomono/Go-Mono-Italic.ttf"(w)
Somente os itens 8 e 9 (contados a partir de 0) diferem; fontconfig trata esses números igualmente, e (veja fonte para fcmatch.c
) escolhe a última fonte verificada que melhorou (diminuiu) a pontuação de qualquer um desses números:
for (i = 0; i < PRI_END; i++)
{
if (best && bestscore[i] < score[i])
break;
if (!best || score[i] < bestscore[i])
{
for (i = 0; i < PRI_END; i++)
bestscore[i] = score[i];
best = s->fonts[f];
break;
}
}
No meu traço, essa é a fonte em itálico, usando espaçamento e largura como os detalhes que foram os fatores decisivos. Olhando para a fonte atual, posso ver que há recursos adicionais verificados (assim, seus detalhes podem ser diferentes), mas o algoritmo básico é o mesmo.
Uma pequena investigação mostra que o que dispara a peculiaridade no fontconfig é que o xterm solicita uma fonte monoespaçada. As opções são (consulte o manual do usuário ):
proportional spacing 0
dual spacing 90
mono spacing 100
charcell spacing 110
ou deixá-lo sem restrições. Se você escolher uma fonte proporcional, isso não parecerá bom, mas a eliminação da restrição no código-fonte do xterm é a solução mais óbvia. O fontconfig não tem como substituir as configurações no padrão.
Isso não é um bug no xterm, mas uma solução alternativa. A alteração original para usar a propriedade spacing=mono
foi adicionada ao xterm em novembro de 2000 por Keith Packard (que também é o autor original do Xft e fontconfig).
Você pode facilmente demonstrar o bug no fontconfig fazendo isso:
fc-match 'Go Mono:spacing=monospace'
que me dá
Go-Mono-Italic.ttf: "Go Mono" "Italic"