Wed 27 December 2023

Ligatures dans le terminal

Le support des ligatures de la police Iosevka dans l’émulateur de terminal Kitty a nécessité la collaboration des auteurs de ces deux projets, et n’est pas nativement présent dans Debian Bullseye (11). Voyons ensemble comment concilier ces deux-là pour avoir de jolies ligatures dans notre terminal.

Iosevka

Cette police n’est pas incluse dans les dépôts Debian, mais doit être compilée ou récupérée depuis son dépôt Git. Iosevka offrant une grande liberté de personnalisation, c’est pourquoi nous opterons ici pour la compilation.

Compilation

Tout d’abord, clonons le dépôt Git.

git clone https://github.com/be5invis/Iosevka.git

Ensuite, copions le fichier de configuration d’exemple.

cd Iosevka
cp private-build-plans.sample.toml private-build-plans.toml

Nous pouvons à présent adapter private-build-plans.toml à nos besoins. Vous pouvez vous inspirer du mien, ou si vous préférez, il est aussi possible d’utiliser l’outil de personnalisation.

À présent, passons à la compilation.

npm install && npm run build -- --jCmd=9 ttf::IosevkaCustom

Notez l’option --jCmd=9 qui offre la possibilité de n’utiliser qu’un nombre donné de processus en parallèle, ici neuf, ce qui permet de ne pas monopoliser les 12 cœurs de mon processeur et ainsi de ne pas mettre l’ordinateur au tapis lors de la compilation !

Installation

Pour installer notre police fraichement compilée, il nous faut tout d’abord la déposer dans le dossier idoine ; dans notre cas, ce sera ~/.local/share/fonts.

cp -R ./dist/IosevkaCustom/TTF ~/.local/share/fonts/IosevkaCustom/

Ensuite, il nous faut régénérer le cache des polices.

fc-cache -fv

Nous pouvons constater que notre police est bien prise en charge par le système grace à la commande fc-list :

fc-list | grep IosevkaCustom

Et nos ligatures ?

Faisons un peu d’introspection, voyons comment sont prises en compte nos ligatures. Pour cela, nous aurons besoin d’un petit utilitaire, hb-shape, fourni par la bibliothèque harfbuzz.

sudo apt install libharfbuzz-bin

Et demandons-lui de nous décomposer la ligature >= :

hb-shape --show-extents --cluster-level=1 --shapers=ot --features "calt=0,dlig=1" ~/.local/share/fonts/IosevkaCustom/TTF/IosevkaCustom-Regular.ttf '>='
[.g13271.join-r=0+500<138,685,712,-524>|.g13277.join-l=1+500<-362,294,712,-299>]

Tout semble se passer pour le mieux ! On constate en effet que les caractères composant cette ligature utilisent les suffixes .join-r et .join-l définis par Renzhi Li aka. Belleve Invis, l’auteur de Iosevka, dans un échange avec Kovid Goyal, l’auteur de Kitty.

Il est temps à présent d’installer Kitty !

Kitty

Installation

Sous Debian Bullseye (11), l’installation se fait tout naturellement via le gestionnaire de paquet apt :

sudo apt install kitty
kitty --version
kitty 0.19.3 created by Kovid Goyal

Nous voilà avec un Kitty prêt à l’emploi ! Sauf que… le support des ligatures de la police Iosevka n’a été implémenté qu’au moyen du commit e01bb09 du 4 juin 2021 présent dans la version 0.21.0.

Montée de version

Fort heureusement, la dernière version stable de Debian, Bookworm (12), inclus la version 0.26.5 de Kitty !

Paquet kitty

    bullseye (oldstable) (x11): émulateur de terminal, rapide, multifonction, basé sur le GPU
    0.19.3-1: amd64 arm64 armel armhf i386 mips64el mipsel ppc64el s390x
    bookworm (stable) (x11): émulateur de terminal, rapide, multifonction, basé sur le GPU
    0.26.5-5: amd64 arm64 armel armhf i386 mips64el mipsel ppc64el s390x

Il nous suffit donc d’indiquer à notre système que nous souhaitons bénéficier de la version présente sur la liste stable, plutôt que celle proposée par défaut. C’est là qu’entre en jeu apt-pinning !

Épinglage

Avez-vous déjà été agacé par le fait que Debian Stable semble toujours ne pas être à jour ?

Voici comment faire en sorte qu’apt mélange différentes sources (oldstable, stable, testing ou unstable). Cela vous permettra de faire fonctionner un système essentiellement stable, tout en ayant la possibilité d’installer les dernières versions des paquets qui vous intéressent le plus. Cette technique se nomme épinglage, aussi appelée apt pinning.

sources.list

La première étape consiste à configurer votre /etc/apt/sources.list pour y inclure les sources stables, celles de Debian Bookworm (12).

# /etc/apt/sources.list
# Debian Bullseye
deb http://deb.debian.org/debian bullseye main contrib non-free
deb http://security.debian.org/debian-security bullseye-security main contrib non-free
deb http://deb.debian.org/debian bullseye-updates main contrib non-free
deb http://deb.debian.org/debian bullseye-backports main contrib non-free

# Debian Stable
deb http://deb.debian.org/debian stable main contrib non-free

preferences

L’étape suivante consiste à créer/éditer votre fichier /etc/apt/preferences. Les préférences sont l’endroit où l’épinglage apt a lieu. Normalement, c’est la version la plus élevée d’un paquet disponible qui l’emporte, mais nous allons passer outre en indiquant que pour tout paquet, on souhaite prioriser oldstable, sauf pour Kitty, qu’on ira chercher dans stable. Pour ce faire, ce dernier aura sa propre règle avec une priorité d’épinglage plus haute que celle de la règle par défaut.

# /etc/apt/preferences
Package: *
Pin: release a=oldstable
Pin-Priority: 700

Package: kitty
Pin: release a=stable
Pin-Priority: 750

apt update

Nous sommes maintenant prêts à utiliser apt update. Cela ajoutera les nouveaux dépôts à la liste d’apt.

sudo apt update

Il n’y a plus qu’à installer notre nouvelle version de Kitty.

sudo apt -t stable install kitty

Notez qu’ici on précise -t stable pour installer les versions stables des dépendances de Kitty. Si nous n’avions pas fait cela, apt aurait râlé, car il n’aurait pas su résoudre ces dépendances.

kitty --version
kitty 0.26.5 created by Kovid Goyal

Kitty + Iosevka = ❤

Configuration de Kitty

Kitty nous permet de configurer finement le support des polices via l’instruction font_features. Cela nous permet d’activer ou de désactiver des fonctionnalités OpenType supportées par notre police. Ici, après avoir opté pour notre police Iosevka Custom, nous précisons à Kitty que nous souhaitons désactiver les alternatives contextuelles calt, activer les ligatures discrétionnaires dlig, et activer le texture healing TXTR tout récemment supporté par Iosevka à titre expérimental.

# ~/.config/kitty/kitty.conf

font_family      Iosevka Custom            
bold_font        Iosevka Custom Bold       
italic_font      Iosevka Custom Italic     
bold_italic_font Iosevka Custom Bold Italic

font_features Iosevka-Custom -calt +dlig +TXTR

Rendu final

Faisons un petit essai :

print -rlP -- '-<< --< -<- <-- <--- <<- <- -> ->> --> ---> ->- >- >>=' '=<< =< =<= <== <=== <<= <= => =>> ==> ===> =>= >= >>=' '<-> <--> <---> <----> <=> <==> <===> <====> :: ::: __' '<~~ %F{red}</ </> />%f ~~> == != %F{blue}/= ~=%f <> === !== !=== %F{blue}=/= =!=%f' '<: := *= *+ <* <*> *> <| <|> |> <. <.> .> +* =* =: :>' '(* *) %F{red}/* */%f [| |] {| |} ++ +++ %F{red}\/ /\%f \- -| <!-- <!---'

Et voici le résultat !

kitty iosevka ligatures