Coin web de Frédéric Péters

fpeters@0d.be

Accessibilité, clavier, terminal kitty

12 avril 2023, 16:37

Il y a quelques semaines mon clavier a commencé à faire des siennes, toute la première rangée de lettres soudainement ne donnait plus rien, un moment, puis ça se remettait à fonctionner. Avec le temps c’est devenu plus fréquent, jusqu’à pour ainsi dire devenir permanent, ou presque, parfois j’appuie sur une touche et je suis surpris qu’elle fonctionne, ça me réjouit, ça tient dix minutes, une heure, une matinée, puis ça retombe en panne.

Comme ça n’est pas pratique du tout, j’ai branché un clavier et pour continuer à travailler dans les pires positions, il est souvent simplement posé au-dessus du clavier du laptop, ce qui bloque l’accès au touchpad, ce qui amène une confrontation assez désagréable avec l’état de l’accessibilité du web ou des applications.

Confrontation assez désagréable et parfois aussi assez honteuse, quand c’est le lecteur du site de Radio Panik qui ne peut pas être atteint au clavier. La bonne nouvelle c’est qu’il y a tout le nécessaire en terme de documentation pour améliorer ça et donc assez rapidement pour Panik c’était résolu. (avec mes excuses à toutes les personnes que ça a pu ennuyer un jour)

Au-delà du web, ma vie dans un terminal, on se dirait que c’est prévu pour le clavier, que tout va être très bien mais ça n’est pas totalement le cas, par exemple une commande affichera une commande sur laquelle en temps normal il est tout simple de juste cliquer mais le terminal n’offre aucun moyen de faire ça, en tout cas pas le mien.

Mais chance, mon terminal c’est depuis un certain temps kitty ; adopté je ne sais plus quand, un jour de régression dans GNOME Terminal peut-être, ou simplement après avoir regardé GNOME Console (le nouveau terminal de GNOME) et conclu que la direction minimaliste ici ne m’irait absolument pas.

Un des avantages notés à Kitty est un côté « scriptable ». Je n’en avais rien fait jusqu’à présent.

Les extensions sont appelées « kittens » et ça manque un peu de documentation mais en partant de celle qui est là et de quelques exemples, j’ai pu me débrouiller et arriver à ce que maintenant je puisse taper ctrl-maj-b et que ça m’affiche la liste des URL présentes à l’écran, la possibilité d’en choisir une et qu’elle s’ouvre dans mon navigateur.

Dans  ~/.config/kitty/urlscan.py, j’ai donc posé l’import de quelques modules,

import re
import sys

from kitty.boss import Boss
from kittens.tui.handler import Handler, result_handler
from kittens.tui.loop import Loop, debug

from kitty.utils import command_for_open, open_cmd
from kitty.fast_data_types import get_options

Ensuite ça démarre dans une fonction main, qui tire de l’écran ce qu’il y a comme URL et lance de quoi en choisir une :

def main(args):
    # regex from https://urlregex.com/
    matches = re.findall(
        r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', sys.stdin.read()
    )
    if not matches:
        return ''
    handler = Chooser(matches[:10])
    loop = Loop()
    loop.loop(handler)
    return handler.selected_choice

Pour le choix de l’URL, il n’y a pas de possibilité de bloquer sur un simple input() Python, ça se passe donc en utilisant un tout petit peu de l’infrastructure de création d’interface, ça affiche à l’écran les choix et quand une touche est tapée, la méthode on_text() est appelée,

class Chooser(Handler):
    def init(self, choices):
        self.choices = choices

    def initialize(self):
        for i, choice in enumerate(self.choices):
            print(f'[{i}] {choice}\r')
            print('\r')
            print('[x] nothing\r')

    def on_text(self, text, *args, **kwargs):
        if text.strip() == 'x':
            self.selected_choice = None
        else:
            try:
                choice = int(text.strip())
            except ValueError:
                return
            self.selected_choice = self.choices[choice]
        self.quit_loop(0)

Ensuite, ce choix se trouve retourné par main (le return handler.selected_choice) et ça arrive dans une dernière fonction,

@result_handler(type_of_input='text')
def handle_result(args, data, target_window_id, boss):
    if data:
        cmd = command_for_open(get_options().open_url_with)
        open_cmd(cmd, data)

dont le truc principal est le décorateur result_handler dont le paramètre précise ce qui sera obtenu comme donnée (dans le sys.stdin) (ici 'text' pour le contenu de l’onglet actif, mais 'history' serait possible pour également avoir tout le contenu précédemment affiché dans l’onglet).

Après ça il suffit d’ajouter une ligne map ctrl+shift+b kitten urlscan.py dans le ~/.config/kitty/kitty.conf et le job est fait.

J’imagine même que ça servira encore après réparation du clavier et/ou nouveau laptop, et très certainement ça donne des idées d’autres petites extensions pour faciliter la vie.