Linux Fu : le navigateur Emacs Fusion

Ce n’est un secret pour personne que j’ai quelques éléments gravés en permanence dans mes neurones : le jeu d’instructions 1802, les commandes pour WordStar et les commandes pour emacs. Il fut un temps où emacs était presque mon système d’exploitation. Sans X11, emacs vous a donné un moyen d’avoir un shell dans une fenêtre, de vérifier votre courrier et de garder votre travail ouvert.

J’utilise encore beaucoup emacs (bien que je sois de plus en plus satisfait de vscode avec une extension de raccourci clavier emacs). Mais je passe aussi beaucoup de temps — comme en ce moment — à écrire dans un navigateur Web. Surtout si j’écris sur le code, il devient difficile de se rappeler quel jeu de clés vous devez utiliser et je voulais faire quelque chose à ce sujet depuis longtemps. La réponse est un programme très cool appelé Autokey. (Vous pouvez télécharger mes fichiers pour cela, mais vous voudrez probablement en lire plus d’abord.) Cela ne fonctionnera probablement pas si vous êtes passé à Wayland, mais cela peut faire beaucoup pour vous, allant de vous épargner du travail de frappe à la reprogrammation de votre favori programme pour avoir des frappes différentes. Cependant, ce n’est pas sans problèmes, et je vais vous dire ce que j’en sais.

La proposition de valeur

Autokey se trouve dans votre barre d’état système et surveille ce que vous tapez. Dans son utilisation la plus simple, vous pouvez configurer différentes phrases pour remplacer ce que vous tapez.

Par exemple, je pourrais reprogrammer HaD pour qu’il apparaisse en tant que Hackaday pour m’épargner du travail de frappe. J’utilise généralement un caractère étrange au début ou à la fin pour ne pas déclencher accidentellement des choses. Alors peut-être que je suis fatigué de taper ou de mal taper http://www.hackaday.com. je pourrais mettre en place ~had pour taper automatiquement l’URL correcte pour moi.

Scripts vs Phrases

Si c’est tout ce qu’AutoKey a fait, ce serait très pratique. Mais il fait bien plus que cela. D’un autre côté, si c’est tout ce que vous voulez, il est facile de le configurer à l’aide de phrases. Une phrase comporte deux parties : un déclencheur et du texte. Le déclencheur peut être un raccourci clavier (comme Alt + Maj + F6) ou il peut s’agir de texte que vous tapez comme ~had. Il est possible d’ajouter plusieurs abréviations, donc je pourrais avoir des déclencheurs supplémentaires de had~ et http://www.hakday.com si je voulais que le programme corrige automatiquement ma faute d’orthographe.

Autokey est facile à configurer pour un simple remplacement de texte, mais peut également prendre en charge des scripts Python complexes

Une phrase ne peut avoir qu’un seul raccourci clavier, mais vous pouvez avoir un raccourci clavier et des abréviations ; l’un ou l’autre déclenchera la phrase. Bien sûr, vous pouvez également prendre en charge plusieurs raccourcis clavier avec plusieurs entrées identiques. Enfin, vous pouvez limiter la correspondance à une classe de fenêtre particulière associée à une expression régulière. Il est donc possible d’avoir un ensemble de raccourcis pour votre traitement de texte et un autre ensemble pour votre navigateur Web.

Le vrai pouvoir, cependant, est que vous pouvez créer des scripts Au lieu de phrases. Ce sont exactement les mêmes sauf qu’au lieu de taper une phrase, un morceau de code Python s’exécute. Il existe certaines classes pour vous aider à faire des choses comme contrôler le clavier et la souris à partir d’un script. Vous pouvez même créer des boîtes de dialogue GUI en utilisant QT ou GTK. Cependant, j’ai découvert qu’il y avait un léger inconvénient à utiliser des scripts, mais pour beaucoup de choses, ils fonctionnent très bien. Vous verrez ce que je veux dire dans un instant.

En plus des scripts, les phrases peuvent avoir un certain contenu dynamique comme la date, un fichier ou même la sortie d’un programme. Il existe également des dispositions pour positionner le curseur à un certain endroit après la saisie de texte, ce qui est utile pour créer des extraits de code.

Abréviations de puissance

Il existe de nombreuses options pour traiter les déclencheurs d’abréviations

Il existe quelques options utiles que vous pouvez appliquer aux abréviations. D’une part, vous pouvez contrôler la façon dont ils envoient du texte au programme cible. J’utilise généralement la méthode du clavier pour simuler la frappe car j’utiliserai des caractères spéciaux, mais vous pouvez également coller le texte en utilisant l’un des nombreux raccourcis courants. Autrement dit, le programme peut charger le presse-papiers avec votre phrase, puis le coller avec un contrôle + V.

Le vrai pouvoir vient lorsque vous configurez les abréviations. Une boîte de dialogue vous permet de sélectionner une liste de mots déclencheurs et vous pouvez définir des options. Par défaut, l’abréviation ne se développera pas tant que vous n’aurez pas tapé un caractère non verbal. Vous pouvez également exiger un espace ou une tabulation. Cependant, il existe d’autres options. Par exemple, vous pouvez faire déclencher Autokey immédiatement ou même si le texte fait partie d’un autre mot. Il existe des options pour ignorer ou respecter la casse, entre autres.

Classes de fenêtre

La dernière chose que vous pouvez utiliser pour contrôler la logique de déclenchement est de restreindre un script ou une phrase à une classe de fenêtre qui correspond à une expression régulière. C’est très bien parce que vous ne voulez probablement pas mapper des choses étranges sur toutes les fenêtres. Bien sûr, c’est pratique d’avoir !address entrez votre adresse postale dans chaque programme, mais si vous voulez faire main développer une fonction principale passe-partout, vous n’aimerez peut-être pas que cela se produise dans LibreOffice.

Dans mon cas, la fonctionnalité de classe de fenêtre était assez importante car je ne voulais pas remapper des choses comme control+s dans chaque programme, juste le navigateur.

Tous ensemble

Alors, comment assemblez-vous tout cela pour émuler emacs ? La plupart des commandes sont très simples. Par exemple, dans emacs, control+s lance une recherche, il suffit donc de créer une phase avec ce raccourci qui tape : +f que le navigateur sait être une recherche. De toute évidence, vous ne pouvez pas facilement faire des choses que le navigateur ne sait pas déjà faire. Control+r pour la recherche inversée, par exemple, n’est pas possible. J’ai fini par cartographier un peu plus d’une douzaine de commandes emacs de base de cette façon. J’ai désactivé le raccourci clavier control + w pour faire une copie du presse-papiers car le navigateur l’utilise pour fermer un onglet, et je ne voulais pas le bloquer.

J’ai utilisé l’outil intégré pour trouver la classe du navigateur Vivaldi que j’utilise. Je découvrirais plus tard que j’avais besoin de faire un changement dans ce domaine, comme vous le verrez.

Pour l’instant, cela s’est occupé des commandes à une touche. Cependant, il existe également des commandes à deux caractères. J’avais un plan, mais ce plan n’a pas très bien fonctionné. Pour l’instant, je vis juste sans eux, mais j’ai laissé un exemple désactivé dans le code pour votre avis.

Comme vous pouvez exécuter un script et qu’il existe un mécanisme global de stockage de variables pour les scripts, mon plan était simple. Considérez control+xu qui est emacsese pour annuler. Vous ne pouvez pas utiliser un caractère non imprimable dans une abréviation, vous devez donc gérer la situation avec un seul raccourci clavier. Mon plan était de définir control + x pour activer un indicateur de préfixe dans le stockage global du script. Ensuite, je pourrais utiliser Autokey pour vous traiter comme un raccourci clavier – juste la lettre u – et envoyer au ou un contrôle + z, selon l’état du drapeau. Par coïncidence, le code réinitialiserait également le drapeau.

Problèmes

Il y a des problèmes avec cela même si tout a bien fonctionné, ce qui n’a pas été le cas. Par exemple, si vous avez appuyé sur control + x puis sur une touche inattendue, le drapeau reste défini et la prochaine fois que Autokey verra au, vous obtiendrez une annulation. Cela vous surprendrait ! Il semble que la bonne chose à faire serait d’activer une règle fourre-tout qui se désactive ou de faire en sorte que le script lise une clé. Cependant, il ne semble pas possible de le faire, du moins pas facilement.

J’étais cependant prêt à accepter cette limitation. J’ai écrit un petit code Python pour control+x :


store.set_global_value("vmacs-prefix-x","true");


Ensuite, juste pour tester une chose à la fois, j’ai fait ce qui suit pour la lettre u :


state=store.get_global_value("vmacs-prefix-x");
if state == "true":
   keyboard.send_keys("<ctrl>+z");
   store.set_global_value("vmacs-prefix-x","false");
else:
   keyboard.send_key("U");  # note send key will respect shift, etc.


J’étais content que ça marche. Sorte de. Pendant que je tapais, j’ai remarqué que quelque chose n’allait pas. Je tape plutôt vite mais quelque chose me distrait et je ne pouvais pas comprendre ce que c’était. J’ai finalement réalisé que lorsqu’un script ou une phrase Autokey s’exécute, le navigateur perd le focus pour une simple coche. Lorsque vous appuyez sur une commande du curseur, vous ne le remarquez pas, mais lorsque vous tapez rapidement, faites attention ! J’ai laissé les scripts, mais je les ai désactivés comme je l’ai fait avec control + w. Vous n’êtes peut-être pas aussi sensible aux brèves déconnexions et, si c’est le cas, vous souhaiterez peut-être implémenter d’autres combinaisons à deux touches de la même manière.

Déception évitée

L’autre problème que j’ai eu était une grosse déception. Les macros ne fonctionnaient pas dans les éditeurs multilignes ou WordPress, où je passe beaucoup trop de temps. Une vérification rapide montre que les zones d’édition ont une classe de fenêtre différente. J’ai fini par transformer les filtres en une expression régulière: .*Vivalid-stable. Bien sûr, si vous utilisez un autre navigateur, vous devrez vous adapter.

AutoKey peut sonder les propriétés de la fenêtre pour vous.

Je suis toujours un peu déçu que si les combinaisons à deux touches soient réalisables, elles ne sont pas pratiques pour moi. Je soupçonne que cela vous mordrait si vous essayiez également de simuler vi, car vous devriez attraper presque toutes les touches normales.

Pourtant, j’ai écrit tout ce post en utilisant la sémantique emacs, et à part parfois oublier de coller en utilisant control + y, ça s’est bien passé. Je peux encore réactiver control + w car j’ai accidentellement fermé la fenêtre plusieurs fois lorsque j’essayais de coller.

Il existe des extensions de navigateur qui prétendent vous permettre de modifier des champs de texte dans l’éditeur de votre choix. Ils fonctionnent, mais ils ne font guère plus que copier du texte dans les deux sens vers l’éditeur. C’est parfait pour les petites choses, mais essayer de créer un gros article avec des fonctionnalités WordPress n’est pas vraiment pratique. Avec ce système, vous pouvez avoir la sémantique emacs lors de l’édition de texte et dans la barre d’URL. Il serait trivial d’adapter le système à presque n’importe quel programme.

Vous ne vous souciez peut-être pas d’emacs, mais vous pouvez faire beaucoup de choses pour gagner du temps avec un programme comme Autokey. Des raccourcis pour les URL, aux lignes simples bash, aux choses que vous tapez encore et encore, Autokey est à la fois simple à configurer pour des choses simples et suffisamment complexe pour gérer de gros travaux. Je souhaite juste que cela fonctionne sur Wayland.