//strahinja.org

🔧 Подешавање модерних терминалских фонтова

[верзија 0.2, 3. мај 2021.]

Страхиња Радић

📜 Увод

Модерна употреба терминалских програма као што је suckless terminal поставља извесне услове у погледу фонта који користе. Осим подршке за чешће коришћене делове Уникода, терминалски фонт треба да подржи и приказ сличан овоме:

Програм nvim у терминалу
Програм nvim у терминалу

На овој слици видимо низ знакова који стандардно не постоје у Уникоду. Рецимо, симбол који представља датотеку са изворним кодом програма у језику C, или симбол датотеке у језику Vimscript.

Џемини читач amfora у терминалу
Џемини читач amfora у терминалу

На овој слици видимо емоџије у боји, као део текста у текстуалном терминалу.

🎨 Инсталирање фонта са емоџијима у боји

Процес инсталирања подршке за овакав приказ се састоји из два главна дела. Први део је инсталирање фонта са емоџијима у боји, рецимо у дистрибуцијама заснованим на дистрибуцији Arch Linux инсталирањем пакета noto-fonts-emoji:

# pacman -S noto-fonts-emoji

Доста тога зависи и од терминалског програма и системских библиотека које се користе. Један од предуслова за приказ емоџија у боји је закрпа за библиотеку Xft, libxft-bgra. У дистрибуцијама заснованим на дистрибуцији Arch Linux, то се постиже инсталацијом пакета libxft-bgra (овај пакет је у Arch User Repository-ју — AUR, па је за њега потребан AUR helper, рецимо pikaur):

$ pikaur -S libxft-bgra

Осим овога, за коришћење suckless програма као што су dwm, dmenu, st, tabbed, итд., мора се, у зависности од програма, додати овај фонт у одговарајући део config.h, а у случају st-а и применити закрпа font2, у случају да већ није примењена. Програм dwm има уграђено онемогућавање употребе фонтова у боји (јер они без поменуте закрпе libxft-bgra чине да dwm крахира), па је после примене закрпе потребно и ставити под коментар линије:

	/*FcBool iscol;
	if(FcPatternGetBool(xfont->pattern, FC_COLOR, 0, &iscol) == FcResultMatch && iscol) {
		XftFontClose(drw->dpy, xfont);
		return NULL;
	}*/

💨 Додавање Nerd Font симбола

Други део подршке за поменути приказ је крпљење скриптом font-patcher из главног Nerd Fonts репозиторијума. Уколико вам преузимање неколико гигабајта разних конвертованих фонтова не делује примамљиво (као што не делује ни мени), постоји fork главног репозиторијума који садржи само неопходне елементе за крпљење постојећих фонтова.

Рецимо, уколико желимо да додамо симболе фонту MxPlus_IBM_VGA_8x16.ttf са сајта int10h.org, употребићемо наредбу:

$ ./font-patcher -l -c --careful MxPlus_IBM_VGA_8x16.ttf

Подразумева се да се фајл са тим фонтом налази у главном директоријуму Nerd Fonts репозиторијума.

Опција -l овде служи да се покуша вертикално центрирање Powerline симбола, опција -c да се додају сви доступни симболи, а опција --careful да се не преписују постојећи симболи.

💾 Инсталирање измењеног фонта

Овим се добија фајл MxPlus IBM VGA 8x16 Nerd Font Complete.ttf, који се може додати у директоријум у fontpathXorg сервера, рецимо /usr/local/share/fonts/mxplus. Након тога је у том директоријуму потребно покренути:

# mkfontdir && mkfontscale

чиме се креирају (ажурирају) датотеке fonts.dir и fonts.scale. Уколико тај директоријум није у fontpath-у, треба га додати, рецимо додавањем реда:

xset fp+ /usr/local/share/fonts/mxplus

у датотеку ~/.xinitrc.

Уколико је све прошло како треба, наредба fc-match би требало да врати:

$ fc-match "MxPlus_IBM_VGA_8x16 Nerd Font"
MxPlus IBM VGA 8x16 Nerd Font Complete.ttf: "MxPlus_IBM_VGA_8x16 Nerd Font" "Book"

Сада се може, рецимо, у датотеку config.h програма st додати:

static char *font = "MxPlus_IBM_VGA_8x16 Nerd Font:size=12";

и након компајлирања и инсталације требало би да видимо емоџије у боји и Nerd Font симболе у терминалу. Уколико користите мој fork dwm, притиском на Win+E се покреће мени за унос емоџија. Да би се емоџији видели и у том менију, потребно је да се у програму dmenu постави фонт за емоџије:

static const char *fonts[] = {
        "MxPlus_IBM_VGA_8x16 Nerd Font:size=12:style=Book:antialias=false:autohint=false",
        "Noto Color Emoji:style=Regular:size=10"
};

🧹 Бонус: искључивање антиалијасинга

Терминалски фонтови као што је наведени MxPlus IBM VGA боље изгледају уколико се искључи антиалијасинг. Ово се постиже постављањем датотеке у /etc/fonts/conf.d, рецимо /etc/fonts/conf.d/25-noaa-vga.conf:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
	<match target="font">
                <test qual="any" name="family">
                        <string>MxPlus_IBM_VGA_8x16 Nerd Font</string>
                </test>
		<edit name="antialias" mode="assign">
			<bool>false</bool>
		</edit>
	</match>
</fontconfig>