Thinking about Emacs coaching goals with Prot

| emacs, community

I want to get better at learning with other people's help, so I'm going to experiment with engaging Prot as an Emacs coach. Our first session is this week. Time to lay the groundwork!

If I meet with Prot twice a month for three months, that's a budget of €60 (~CAD 100), which is a reasonable size for an experiment especially since I still have the budget set aside from the Google Open Source Peer Bonus and lovely folks already donated to cover the costs for EmacsConf. When I schedule something with someone, the accountability makes it easier to get stuff done and out the door. For this, a real person is much better than AI because:

  • I get to take advantage of Prot's very large context window, and he knows stuff about the Emacs, the community, and me that I might not remember to mention
  • He can ask real questions and prod at things that are unclear or contradictory, unlike the confirmation bias of LLMs
  • He might point out things that wouldn't occur to me to ask about
  • It triggers my "I promised someone I'd do this" thing
  • I get to support an individual worth supporting rather than contributing to the concentration of wealth and information in for-profit entities

My motivations:

  • I want to make better use of my focused time during the rest of the schoolyear. For the next three months, my schedule will be fairly predictable and I'll have regular chunks of focused time. Over the past two months, I've averaged around 10 hours of Emacs-related stuff per week (including 1.5 hours or so for Emacs News). I'm currently thinking about language learning and speech input. EmacsConf is on the horizon and will probably ramp up after September, but I can also think ahead of workflow improvements or ways to collaborate with other people. I might put together an Emacs News Highlights presentation. Also, I'm always looking out for ways to build the community.

    Summer break during July and August will shake things up again, but I might be able to find some focused time early morning or evening. I'd like to be in a good position to make the most of those time fragments.

  • I want to improve my Emacs Lisp development workflow and learn more about libraries and techniques that might be useful. I'm beginning to have more time to sharpen the saw and I'm curious about all the cool stuff that I missed or skimmed over the past ten years. What are some useful setups for completion, debugging, navigation, etc.?
    • Current: I sporadically use the extra awesomeness in seq, pcase, lispy, erefactor, ert, buttercup, and undercover, but not consistently. I'd like to reduce the friction and make these habitual.
    • Areas of friction / improvement:
      • writing tests, especially for things that are more interactive
      • navigating code that might be scattered in literate config files or in Emacs Lisp files
      • forgetting to restart or to make sure all code is saved; running tests via Emacs batch mode will help, as will package-isolate and restart-emacs
  • I want to improve my workflows for writing, making videos, and streaming. If I get better at sharing what I'm working on, I might be able to connect with more people and bounce ideas around. Also, accountability might help me nudge this over the threshold. I probably still need to work in stops and starts, so I want to reduce the friction. I'm curious about other people's workflows for sharing. I like joining meetups, but I tend to share stuff only if no one else has anything planned, because I have my blog and my YouTube channel in case I want to share anything with a wider group of people. I just have to actually post things.
    • Current: ~1.5 Emacs posts a week aside from Emacs News, attending meetups, sporadically adding short video demos to posts

      Average number of Emacs-related posts that aren't Emacs News
      (let* ((start "2026-02-01")
             (end "2026-03-31")
             (posts (my-blog-posts
                     start end
                     (lambda (o)
                       (and (member "emacs" (alist-get 'categories o))
                            (not (member "emacs-news" (alist-get 'categories o)))))))
             (count (length posts)))
        (my-weekly-average count start end))
      
    • Goal: 2-3 non-News posts a week, one video a month, one stream or meetup a month; maybe also beyond looking at the numbers, it might be interesting to build more momentum around a topic, set up trails/navigation, cultivate more of a digital garden
    • Areas of friction / improvement:
      • Resisting "one more tweak"
      • Streaming: Still need to get the hang of talking to myself or having half-conversations with chat: can be worked around by scheduling a session with Prot and opening it to the public
      • Hiding private information or setting up a separate Emacs for demonstration
      • Harvesting videos/clips/notes afterwards
  • I want to move more of my configuration into files and libraries that other people can reuse, like sachac/learn-lang and sachac/speech-input. I can also separate the function definitions from the configuration in my code so that people can reuse the functions if they want.
    • Areas of friction / improvement
      • renaming things when I want to move them to a library
      • duplicating small functions (ex: simplify string)
      • figuring out how to make it possible for someone else to start using my stuff

Starting questions for Prot:

  • Meta: what are people finding useful for coaching and behaviour change, like learning new keyboard shortcuts or workflows?
  • Your literate config exports to individual .el files. I could probably do something similar to separate my functions from my personal config in order to make it easier for people to reuse parts of my config. Is it worth doing so? Do people tell you that they use those private Emacs Lisp files by loading them, or do they mostly rely on your published packages?
  • Do you have some tweaks to make it easier to jump to function definitions considering a literate configuration?
  • What's your general process for migrating things from your config to a repository or package?

Could be fun. Let's experiment!

View Org source for this post

2026-03-30 Emacs news

| emacs, emacs-news

It's not too late to write about mistakes and misconceptions as part of the Emacs Carnival for March and not too early to think about the theme of "Newbies/Starter Kits" which Cena will be hosting for April. Who knows, maybe those ideas can become part of the newcomers presets. It could be fun to explore something like notes for Emacs beginners and see where you end up.

Also, I'm looking forward to seeing if these tips for reloading Emacs Lisp code can help me avoid little bugs from leftover code.

Enjoy!

Links from reddit.com/r/emacs, r/orgmode, r/spacemacs, Mastodon #emacs, Bluesky #emacs, Hacker News, lobste.rs, programming.dev, lemmy.world, lemmy.ml, planet.emacslife.com, YouTube, the Emacs NEWS file, Emacs Calendar, and emacs-devel. Thanks to Andrés Ramírez for emacs-devel links. Do you have an Emacs-related link or announcement? Please e-mail me at sacha@sachachua.com. Thank you!

View Org source for this post

Emacs Carnival March 2026: Mistakes and learning to reach out

| community, emacs

Mostly-similar versions follow: I started with French, translated it to English, and then tweaked some details. Thanks to Philip Kaludercic for hosting this month's carnival!

In English

The theme for this month's Emacs Carnival is Mistakes and Misconceptions. It’s difficult to pinpoint one thing that is clearly a mistake, but there are certainly things I could do more effectively.

My configuration is very large because I assume my little modifications are only useful to me. They feel too specific, too idiosyncratic. I think people who create libraries or even packages used by lots of other people are awesome. I don't know if I could quite do that myself, though! Even submitting patches upstream and participating in the ensuing discussions sometimes requires more persistence than I have.

The advantage of keeping my changes in my config is that even if I'm unsure, I can try something out, develop a rough prototype, and change my mind if necessary. When I publish them in a library or a package, I feel like I have to polish my ideas. It's hard to stick to just one idea long enough to refine it.

My favorite situation is when I write about my attempt in a post, and it inspires someone else to implement their own version (or even a new library or package). On the other hand, if I learn to share my code, I can help more people, and I can also learn from more people and more conversations.

Many of my modifications are short and easy to copy from my posts, but there are a few collections that depend on other functions, making them difficult to copy. These functions are scattered across several posts on my blog. For example, my functions for learning a language (I'm learning French at the moment) and for controlling Emacs by voice are becoming quite complex. The functions are also exported to my configuration, but the Emacs Lisp file is difficult to navigate if someone wants to copy them. I can extract the code into a file now that Org Mode can tangle to multiple files, but if I spend a little time replacing the "my-" prefix with a library prefix and move them to a repository, people could clone it and download updates. Even if no one uses it, the act of polishing and documenting it will probably be useful to me one day.

So, it's possible that this is a mistake I often make in Emacs: thinking my functions are too idiosyncratic and too rough, so I leave them in my config. If I dedicate time to extracting the code into a library, I might benefit in the long run. I know lots of people are interested in using Emacs for language learning or by voice. There have been so many other libraries and workflows over the years, so I'm sure people are out there. I want to practice learning more with others. To start, I can make sure interested people can follow my progress through RSS feeds or Mastodon, I can respond when people send me messages, and I can collect contact info and send them a message when I post about the subject.

I can write more if I reread the changes in my configuration each week, or if I reread my complete configuration for sections which I haven't yet written about. If I participate in virtual meetups or even livestream, I can find out what interests other people. If I submit patches and create tasks in my Org Mode inbox to track the discussions, I can practice refining my work.

Prot has lowered his coaching prices to €10 /hour. He's quite prolific when it comes to package development, so he can probably help me figure out how to get stuff out of my config and into a form that other people might be able to use. I've been enjoying learning with my French tutor. It might be worth experimenting with spending some money and time to improve my Emacs skills as well. Sure, it's totally just for fun, but I think it's valuable to practice learning with the help of others instead of stumbling around on my own.

There's always more to learn, which is wonderful. So this is not really a mistake, just something that could be good to work on. Onward and upward!

Check out Emacs Carnival March 2026: Mistakes and Misconceptions to see other people's takes on the topic.

En français

Le thème du Carnaval d'Emacs ce mois-ci est « les erreurs et les idées reçues ». C'est difficile d'identifier une chose qui soit clairement une erreur, mais il y a certainement des choses que je ne fais pas efficacement.

Ma configuration est très volumineuse car je pense que mes petites modifications ne sont utiles que pour moi. Elles sont trop spécifiques, trop particulières. J'apprécie ceux qui créent des bibliothèques ou même des paquets que beaucoup d'autres utilisent, mais de mon côté, je ne me sens pas capable de le faire pour l'instant. Même soumettre des correctifs en amont et participer à la discussion qui s'ensuit parfois demande plus de persévérance que je n'en ai.

L'avantage de garder mes modifications dans ma configuration est que, même si je ne suis pas sûre, je peux essayer quelque chose, développer un prototype préliminaire, et changer d'avis si nécessaire. Quand je les publie dans une bibliothèque ou un paquet, j'ai l'impression que je dois peaufiner mes idées. C'est difficile de s'en tenir à une seule idée assez longtemps.

Ma situation préférée est quand je partage mes essais sur mon blog, et qu'ils inspirent une autre personne qui implémentera sa propre version, voire une nouvelle bibliothèque ou un nouveau paquet.

En revanche, si j'apprends à partager mon code, je peux aider plus de personnes, et je peux aussi apprendre de plus de personnes et de plus de conversations.

Beaucoup de mes modifications sont brèves et faciles à copier de mes articles, mais il y a quelques collections qui dépendent d'autres fonctions, ce qui les rend difficiles à copier. Les fonctions sont dispersées dans plusieurs articles sur mon blog. Par exemple, mes fonctions pour apprendre une langue (particulièrement le français) et pour contrôler Emacs par commande vocale deviennent plutôt complexes. Elles sont aussi exportées vers ma configuration, mais le fichier Emacs Lisp est difficile à parcourir si on veut les copier. Je peux extraire le code dans un fichier maintenant que Org Mode peut le tangler vers plusieurs fichiers, mais si je consacre un peu de temps à remplacer le préfixe « my- » par celui de la bibliothèque et à le pousser sur le dépôt, les gens pourraient le cloner et récupérer les mises à jour. Même si personne ne l'utilise, le fait de les peaufiner et de le documenter me sera utile un jour.

Donc il est possible que ce soit une erreur que je commets souvent dans Emacs : je pense que mes fonctions sont trop idiosyncratiques et trop brutes, je les laisse donc dans ma configuration. Mais si je consacre du temps à extraire le code vers une bibliothèque, j'en bénéficierai peut-être à long terme. Je sais que beaucoup de gens sont intéressés par l'utilisation d'Emacs pour apprendre une langue ou pour la commande vocale. Il y a eu de nombreuses autres bibliothèques et flux de travail au fil des ans, donc je suis sûre qu'il y a du monde. Je veux m'entraîner à apprendre auprès de plus de personnes. Pour commencer, je peux m'assurer que les gens intéressés peuvent suivre mon progrès via les flux RSS ou sur Mastodon, je peux répondre quand on m'envoie des messages, et je peux recueillir les coordonnées et leur envoyer un message lorsque je publie un article à ce sujet.

Je peux écrire davantage si je relis les modifications dans ma configuration chaque semaine, ou si je relis ma configuration entière pour les sections dont je n'ai pas encore parlé. Si je participe à des réunions virtuelles ou même si je diffuse en direct, je vais voir ce qui intéresse les autres. Si je soumets des correctifs et crée des tâches dans ma boîte de réception Org Mode pour suivre les discussions, je m'entraîne à affiner mon travail.

Prot a baissé ses tarifs de coaching à 10 euros de l'heure. Il est très prolifique en matière de développement de paquets. J'apprends bien avec mon tuteur en français, donc cela vaut peut-être la peine de consacrer de l'argent et du temps à améliorer mes compétences sur Emacs. Certes, c'est juste pour le plaisir, mais c'est aussi important pour moi de m'entraîner à apprendre avec l'aide des autres au lieu de trébucher toute seule.

J'ai toujours plus de choses à apprendre, ce qui est merveilleux. Ce n'est pas vraiment une erreur, mais plutôt un point à améliorer. En avant !

Consultez Emacs Carnival March 2026: Mistakes and Misconceptions pour d'autres perspectives sur le sujet.

View Org source for this post

La semaine du 23 au 29 mars

| french

lundi 23

J'ai trouvé comment catégoriser les liens pour mon bulletin d'information Emacs News par commande vocale en utilisant Silero pour détecter l'activité vocale et Speaches pour transcrire les commandes. C'était un peu lent, mais c'était prometteur. Je pense que si je traite quelques commandes par lots, ce sera plus rapide.

Il faisait beau l'après-midi. J'ai emmené ma fille à son cours de gymnastique en vélo, où elle s'est bien amusée en s'exerçant à se laisser tomber sur le ventre après avoir fait une roue. Après cela, nous sommes allées à la boutique Healthy Moms Market pour acheter une boîte à lunch1 plus grande pour ma fille.

Les collections de CD audio Michel Thomas que j'ai empruntées à la bibliothèque pour apprendre le français étaient trop rayées pour être écoutées. Tant pis. J'ai déjà écouté la majeure partie d'un cours sur YouTube, donc ce n'était pas grave.

mardi 24

J'ai décortiqué le mot « grenouille », que j'ai dit au moins 37 fois lors du cours précédent.

(subed-record-extract-words "grenouille"  "/home/sacha/sync/recordings/processed/2026-03-20-raphael.json" "/home/sacha/proj/french/analysis/grenouille/index.vtt")
(my-subed-record-group-by-notes
  (nreverse
   (subed-record-sort-by-directive
    "#+NOTE"
    (subed-record-filter-skips
     (subed-parse-file "/home/sacha/proj/french/analysis/grenouille/index.vtt"))))
  "/home/sacha/proj/french/analysis/grenouille/grenouille"
  "/home/sacha/proj/french/analysis/grenouille/index.vtt" t)

Mais l'enregistrement numéro 10 ressemblait au numéro 4… Peut-être que, lorsque mon tuteur a répété le mot, il ne voulait pas dire que c'était une erreur, il m'a simplement encouragée à le répéter. Je dois penser à la façon de profiter du bilan de mon tuteur.

J'ai remarqué le /​ə/ comme dans le mot « je », le /​u/ dans la prononciation /​gʀənuj/ et la différence avec le mot « oui » /​ˈwi/. C'est difficile pour moi.

(subed-record-compile-subtitle-list
 (mapcar (lambda (o)
           (setf (elt o 3)
                 (format "%s: %s"
                         (subed-record-get-directive "#+NOTE" (elt o 4))
                         (elt o 3)))
           o)
         (nreverse
          (subed-record-sort-by-directive
           "#+NOTE"
           (subed-record-filter-skips
            (subed-record-filter-for-directive
             "#+NOTE"
             (subed-parse-file "/home/sacha/proj/french/analysis/grenouille/index.vtt"))))))
 "/home/sacha/proj/french/analysis/grenouille/grenouille-compiled.opus"
 nil
 '(:interleaved "/home/sacha/proj/french/chime.opus"))

Mon tuteur m'a donné de nouvelles phrases :

  • Ma compagne m’accompagne à la campagne avec une autre compagne.
  • Une tortue têtue marche dessus sous une pluie continue.

Je me suis concentrée sur la différence entre « compagne » et « campagne. »

(let ((my-lang-words-for-review-context-function 'my-lang-words-for-review-phrase-context))
  (my-lang-words-for-review "La semaine du 16 au 22 mars"))

Les points pour réviser ma prononciation :

  • nous avons acheté des nouilles instantanées.
  • qui proposait la boîte à déjeuner qu'elle voulait
  • donc si elle veut être assortie, alors nous serons assorties.
  • J'ai cherché dans le groupe de précaution COVID et j'ai trouvé une recommandation
  • Ma fille a également réalisé une pancarte avec son nom et quelques Pokémon.
  • qui fournit les appareils Holter pour lancer les démarches.
  • J'ai actualisé mon script pour réserver des livres à la bibliothèque.
  • pour rechercher la cause de ses symptômes.
  • Elle aime bien le skee-ball et elle a obtenu son meilleur score jusqu'à présent.
  • donc je l'ai emmenée au magasin de tissus du centre-ville.
  • Dans un autre magasin à proximité
  • … et un gloss à lèvres.
  • Mon mari a installé deux lumières à côté du lit mezzanine de ma fille parce
  • mais après avoir gratté le dessus
  • J'ai cousu une housse de protection
  • mon mari a préparé des nouilles ramen aux wontons.
  • Je me suis assise sur le porche et j'ai réécrit mon journal et mes notes sur l'IA en français.
  • qu'elle avait mal au ventre.
  • Je leur ai donné des guimauves et elles (et le grand-père d'une amie de ma fille) les ont fait griller sur des brochettes.
  • nous avons cousu ensemble.
  • La bosse près du piercing de ma fille a commencé à saigner et suppurer.
  • elle dormait probablement sur le côté.
  • J'ai participé à la réunion virtuelle OrgMeetup.
  • grâce à la reconnaissance vocale.

Pendant la conversation, j'ai pu lui décrire la bibliothèque de Toronto que j'adore tellement. La bibliothèque de Toronto est l'une des plus grandes au monde. Chaque quartier a sa propre bibliothèque, et on peut réserver jusqu'à 50 livres pour les faire envoyer à la bibliothèque la plus proche. La bibliothèque offre aussi énormément de livres électroniques, ce qui est très pratique.

(subed-record-extract-all-approximately-matching-phrases
   (split-string (org-file-contents "/home/sacha/proj/french/analysis/virelangues-2026-03-13/phrases.txt") "\n")
   "/home/sacha/sync/recordings/processed/2026-03-24 12-29-53-sacha.json"
   "/home/sacha/proj/french/analysis/virelangues-2026-03-13/2026-03-24-raphael-script.vtt")

Ma fille était grincheuse avec moi et vis-à-vis de l'école aujourd'hui. L'école a une remplaçante, ce qu'elle n'aime jamais. Elle a aussi eu l'impression que je l'avais pressée pendant la pause déjeuner parce que je n'avais pas voulu être en retard pour mon cours.

Elle n'a pas trouvé son ordinateur qui était sur le banc devant la salle de bains. Je pense qu'elle n'a pas cherché bien loin. Elle n'a pas demandé à mon mari de l'aider à chercher. Elle a simplement séché les cours. J'ai reprogrammé mon prochain cours avec mon tuteur pour qu'il commence à 12h45 au lieu de 12h30. De toute façon, puisqu'elle a décidé de sécher les cours, j'ai proposé de faire une promenade au parc ou de coudre la couverture de pique-nique. Elle a fermement décidé d'être grincheuse. Les turbulences font partie de la vie avec un enfant.

L'appareil Holter était arrivé, mais ce n'était pas un bon moment pour le lui poser.

mercredi 25

J'ai travaillé comme consultante. J'ai eu trois tâches à accomplir et je les ai finies, donc j'étais satisfaite. J'ai terminé les cours de formation, j'ai configuré des paramètres pour permettre à un autre développeur de vérifier mon logiciel avant la mise à jour du système, et j'ai fait un prototype d'affichage vidéo qui est plus moderne que la version actuelle.

Ma fille n'a pas voulu sortir pour jouer à cause de l'appareil Holter qu'elle doit porter pendant deux semaines. Heureusement, la mère de son ami m'a envoyé une invitation à jouer ensemble à Minecraft. Ma fille a joué avec son ami sur son serveur Minecraft Java. Ils ont commencé un nouveau monde, donc je les ai rejoints pour aider à récolter des ressources. Nous avons établi notre base sur une montagne. J'ai coupé des épicéas, j'ai miné un tunnel jusqu'à la couche moins 54 et j'ai commencé une ferme de blé et de canne à sucre. Ma fille et son ami ont exploré des cavernes, combattu beaucoup de monstres, et décoré notre base. Elle a aimé jouer avec un ami qui coopérait avec elle, ce qui est différent des griefers dans son club Minecraft à l'école. ( Elle a dit que s'il se conduisait mal, elle pouvait parler avec la mère de son ami. )

J'ai participé à la réunion virtuelle Emacs Berlin, qui se tenait sur mon serveur. Malheureusement, j'ai raté le courriel de l'hôte indiquant que son code de modérateur ne fonctionnait pas parce que j'étais concentrée sur mon travail, donc j'ai corrigé le problème environ une heure après le début de la réunion virtuelle. Néanmoins, la réunion s'est bien déroulée. Après ça, j'ai mis à jour mon serveur BigBlueButton pour les réunions virtuelles, juste au cas où cela pourrait aider.

J'étais tellement fière de ma fille, qui porte l'appareil Holter quoiqu'il soit pénible. Elle peut même gérer la batterie elle-même, et elle a déjà remarqué un épisode de palpitations. Elle a dit qu'elle détestait l'appareil Holter, mais elle voulait capturer des données pour que la cardiologue puisse analyser ses symptômes.

jeudi 26

J'ai dépoussiéré mon serveur Minecraft pour inviter l'ami de ma fille après les cours. Il fallait que je configure quelques règles sur le pare-feu et le routeur. Après avoir un peu tourné en rond, j'ai vérifié que je pouvais me connecter en dehors de notre réseau. J'ai aussi installé CraftyController pour gérer le serveur via une interface web. Ma fille et moi avons joué sur une carte de parkour Minecraft jusqu'à ce que la mère de son ami m'ait envoyé un message, puis ma fille et son ami ont joué indépendamment.

J'ai appelé l'entreprise qui nous a envoyé le Holter cardiaque pour demander conseil car les patchs démangeaient tellement ma fille. Après avoir confirmé qu'ils recevaient les données de ma fille et demandé des conseils, je suis allée à la pharmacie pour acheter une crème barrière.

Une fois que je suis rentrée, ma fille jouait à Minecraft toute seule. Elle a dit qu'elle avait construit une poubelle en utilisant un cactus, un coffre, et un entonnoir ; que son ami avait placé son épée dans la poubelle ; qu'il y avait un désaccord quelconque, et qu'ensuite son ami avait fait exploser toutes les choses avec de la TNT, malgré leur accord de ne pas faire de griefing… De toute façon, j'ai envoyé un message à la mère de son ami au cas où elle aurait compris un peu plus que moi. Peut-être que leurs styles de jeu ne sont pas compatibles pour l'instant. C'est la vie.

J'ai mis la nouvelle crème barrière sur la peau de ma fille et nous avons appliqué de nouveaux patchs pour le Holter cardiaque. Nous avons reconnecté les électrodes. L'entreprise a dit qu'elle pouvait faire une pause si c'était nécessaire.

Ma fille s'est demandé comment faire des bracelets d'amitié, donc j'ai cherché du fil et lui ai montré comment les nouer.

Analyse de mon journal

J'ai mis à jour mon analyse du journal et j'ai utilisé l'IA Claude pour visualiser les données. Depuis novembre, j'ai écrit plus de 300 mots dans presque chaque entrée sur plus de 140 entrées.

02_words_per_session.png

À mon étonnement, je trouve constamment de nouveaux mots pour décrire ma vie quotidienne, même si cette sorte de petite vie peut ennuyer autrui. Je prends soin de ma fille, je l'emmène à quelques endroits, je bidouille ma configuration d'Emacs, je réfléchis… C'est simple, mais c'est la mienne.

Il y a une légère diminution du taux de nouveaux mots au fur et à mesure que je développe mon vocabulaire et que je m'habitue aux expressions figées.

01_cumulative_vocab.png

C'est plus facile de s'en rendre compte si l'on regarde le pourcentage des nouveaux lemmes en fonction des mots écrits, qui semble être d'environ 5 %.

06_vocab_efficiency.png

Je pense que je dois faire un effort pour utiliser plus d'adjectifs afin de mieux décrire mes expériences, mais même lorsque j'écris en anglais, je suis attirée par la précision du verbe ou du nom juste. Si j'écris sur des choses qui sont semblables les unes aux autres, ou si je veux peindre un tableau d'une scène, les adjectifs seront plus nécessaires.

05_pos_usage.png

Ma sœur est devenue une écrivaine merveilleuse, mais elle ne donne pas dans le langage fleuri. Elle écrit avec son cœur sur des choses douloureusement claires et tout l'humour qu'elle peut trouver en aimant passionnément la vie et sa famille. Je n'ai pas besoin d'atteindre cette qualité d'écriture pour le moment; je n'ai pas la moitié de la sagesse qu'elle a dû acquérir. Je suis contente de consigner ma journée sachant qu'un jour j'oublierai les détails.

Les logiciels sont surtout écrits par l'IA Claude :

Un brouillon pour le Carnaval d'Emacs

Le thème du Carnaval d'Emacs ce mois-ci est « les erreurs et les idées reçues ». C'est difficile d'identifier une chose qui soit clairement une erreur, mais il y a certainement des choses que je ne fais pas efficacement.

Ma configuration est très volumineuse car je pense que mes petites modifications ne sont utiles que pour moi. Elles sont trop spécifiques, trop particulières. J'apprécie ceux qui créent des bibliothèques ou même des paquets que beaucoup d'autres utilisent, mais de mon côté, je ne me sens pas capable de le faire pour l'instant. Même soumettre des correctifs en amont et participer à la discussion qui s'ensuit parfois demande plus de persévérance que je n'en ai.

L'avantage de garder mes modifications dans ma configuration est que, même si je ne suis pas sûre, je peux essayer quelque chose, développer un prototype préliminaire, et changer d'avis si nécessaire. Quand je les publie dans une bibliothèque ou un paquet, j'ai l'impression que je dois peaufiner mes idées. C'est difficile de s'en tenir à une seule idée assez longtemps.

Ma situation préférée c'est quand je partage mes essais sur mon blog, et qu'ils inspirent une autre personne qui implémentera sa propre version, voire une nouvelle bibliothèque ou un nouveau paquet.

En revanche, si j'apprends à partager mon code, je peux aider plus de personnes, et je peux aussi apprendre de plus de personnes et de plus de conversations.

Beaucoup de mes modifications sont brèves et faciles à copier de mes articles, mais il y a quelques collections qui dépendent d'autres fonctions, ce qui les rend difficiles à copier. Les fonctions sont dispersées dans plusieurs articles sur mon blog. Par exemple, mes fonctions pour apprendre une langue (particulièrement le français) et pour contrôler Emacs par commande vocale deviennent plutôt complexes. Elles sont aussi exportées vers ma configuration, mais le fichier Emacs Lisp est difficile à parcourir si on veut les copier. Je peux extraire le code dans un fichier maintenant que Org Mode peut le tangler vers plusieurs fichiers, mais si je consacre un peu de temps à remplacer le préfixe « my- » par celui de la bibliothèque et à le pousser sur le dépôt, les gens pourraient le cloner et récupérer les mises à jour. Même si personne ne l'utilise, le fait de les peaufiner et de les documenter me sera utile un jour.

Donc il est possible que ce soit une erreur que je commets souvent dans Emacs : je pense que mes fonctions sont trop idiosyncratiques et trop brutes, je les laisse donc dans ma configuration. Mais si je consacre du temps à extraire le code vers une bibliothèque, j'en bénéficierai peut-être à long terme. Je sais que beaucoup de gens sont intéressés par l'utilisation d'Emacs pour apprendre une langue ou pour la commande vocale. Il y a eu de nombreuses autres bibliothèques et flux de travail au fil des ans, donc je suis sûre qu'il y a du monde. Je veux m'entraîner à apprendre auprès de plus de personnes. Pour commencer, je peux m'assurer que les gens intéressés peuvent suivre mes progrès via les flux RSS ou sur Mastodon, je peux répondre quand on m'envoie des messages, et je peux recueillir les coordonnées et leur envoyer un message lorsque je publie un article à ce sujet.

Je peux écrire davantage si je relis les modifications dans ma configuration chaque semaine, ou si je relis ma configuration entière pour les sections dont je n'ai pas encore parlé. Si je participe à des réunions virtuelles ou même si je diffuse en direct, je vais voir ce qui intéresse les autres. Si je soumets des correctifs et crée des tâches dans ma boîte de réception Org Mode pour suivre les discussions, je m'entraîne à affiner mon travail.

Prot a baissé ses tarifs de coaching à 10 euros de l'heure. Il est très prolifique en matière de développement de paquets. J'apprends bien avec mon tuteur en français, donc cela vaut peut-être la peine de consacrer de l'argent et du temps à améliorer mes compétences sur Emacs. Certes, c'est juste pour le plaisir, mais c'est aussi important pour moi de m'entraîner à apprendre avec l'aide des autres au lieu de trébucher toute seule.

J'ai toujours plus de choses à apprendre, ce qui est merveilleux. Ce n'est pas vraiment une erreur, mais plutôt un point à améliorer. En avant !

Consultez Emacs Carnival March 2026: Mistakes and Misconceptions pour d'autres perspectives sur le sujet.

vendredi 27

J'ai recommencé à dessiner des moments quotidiens comme je l'avais fait il y a quelques années quand ma fille était plus jeune. Quand je suis tombée sur les dessins dans ma liste « En ce jour » (en fait le format RSS que j'avais ajouté à mon agrégateur), le dessin me manquait. Depuis le début de l'année scolaire, je dessinais une note pour la boîte à lunch de ma fille chaque jour de classe parce que ma fille voulait « l'expérience complète d'écolière » malgré le fait d'aller à l'école à distance. Je dessinais quelques Pokémon et d'autres centres d'intérêt de ma fille. Ça m'est enfin venu à l'idée de combiner des Pokémon et nos moments. Jusqu'à la semaine précédente, je les ai dessinés sur des fiches bristol. Je me suis remémoré que notre imprimante peut traiter les fiches bristol, donc j'ai utilisé Procreate sur mon iPad pour dessiner un moment de notre vie quotidienne et je l'ai imprimé pour l'insérer dans sa boîte à lunch.

Voilà :

Ugh, mon OBS n'a pas enregistré mon côté du rendez-vous avec mon tuteur, donc je ne peux pas ajouter les extraits à Comparing pronunciation recordings across time. Ce n'est pas grave, je dois les réenregistrer. C'est la deuxième fois que cela se produit. Redémarrer mon ordinateur résout les problèmes, mais si je ne détecte pas le problème tôt, je n'ai pas le temps de redémarrer avant mon rendez-vous. J'ai un autre profil sur OBS qui se connecte directement à mon microphone au lieu du récepteur audio virtuel, ce qui sera peut-être plus fiable. Je dois aussi faire un enregistrement de secours sur mon téléphone la prochaine fois.

J'ai envoyé un message et de l'argent à Prot pour du coaching. Voilà, je m'y engage.

samedi 28

J'ai préparé les tissus pour la couverture de pique-nique que ma fille voulait. Malheureusement, je n'ai pas de réserve suffisante de fil rouge, donc elle doit attendre notre prochaine sortie au magasin de tissus. Je veux apprendre à faire les coins en onglet plus précis.

Ma fille et moi sommes allées au parc pour participer à la réunion Pokémon. Il faisait beau. Nous avons attrapé trois Pikachu Gigamax avec l'aide de beaucoup d'autres dresseurs. Ma fille a choisi un Pikachu Gigamax comme copain.

Les composants électroniques sont là. J'ai troqué l'Arduino Uno et le Wavshield contre un module DFPlayer Mini (en fait, un clone de celui-ci) pour notre petite machine à espresso. J'ai fait quelques petites erreurs comme connecter un fil à la mauvaise broche, ce qui fait que le haut-parleur joue le son à un volume plus faible, mais je l'ai finalement fait fonctionner.

À l'heure du coucher, ma fille n'a pas voulu aller au lit, donc j'ai imprimé un de ses devoirs et elle a écrit ses réponses à la main. Elle a répondu à quelques questions, puis elle a décidé de lire à la place.

dimanche 29 mars

J'ai commencé une fournée de petits pains chinois au porc char siu. Cette fois, j'ai préparé une recette complète au lieu d'une demi-portion. Je vais mettre l'autre moitié dans le réfrigérateur pour la préparer demain ou le lendemain.

Nous avons fait du vélo au centre-ville et nous sommes arrivés dix minutes avant l'ouverture du magasin de tissus, donc nous avons attendu en jouant à Pokémon Go. Une fois qu'il a ouvert, j'ai acheté du fil rouge qui correspond aux tissus pour la couverture de pique-nique. Ensuite, nous avons fait du lèche-vitrine chez IKEA pour un tableau qui conviendra à ma fille, mais elle n'est pas très intéressée, donc nous avons continué notre chemin jusqu'à la pâtisserie chinoise pour acheter des raviolis à la soupe et des petits pains chinois. Sur le chemin du retour, mon mari a visité le magasin d'électronique. Il a dit qu'il y avait beaucoup de composants électroniques comme des résistances, des boutons et ainsi de suite. Quand nous sommes bloqués dans un projet à cause du besoin d'un composant, nous pouvons l'acheter au magasin au lieu d'attendre la livraison.

Ma fille a voulu m'aider à préparer les petits pains chinois, mais elle a eu du mal à sceller la pâte autour de la garniture à cause de la sauce. J'ai essayé de lui montrer comment s'y prendre, mais elle est devenue grincheuse et elle est partie en trombe. J'ai laissé les pains de côté car personne n'avait faim.

Je me suis occupée en écrivant un brouillon pour le Carnaval d'Emacs avec le thème « Œufs de Pâques », au cas où personne ne se porterait volontaire pour accueillir le Carnaval d'avril. J'ai ajouté beaucoup de liens issus des archives de mon bulletin d'information Emacs News sur les amusements Emacs. Heureusement, Cena s'en charge, donc je vais laisser mon brouillon de côté jusqu'à ce que ce soit nécessaire.

Après avoir écrit, j'ai commencé à cuire les petits pains à la vapeur. C'était juste à temps, car ma fille a dit qu'elle avait faim. Je les ai laissés lever trop longtemps, donc les pains sont devenus gros. Ils ont rempli les paniers vapeur, ce qui a ralenti la cuisson parce que les pains ont bloqué la circulation de la vapeur. Heureusement, ils étaient délicieux malgré la différence par rapport au plan. En plus, j'ai réservé une partie de la pâte pour ma fille afin qu'elle puisse faire des essais avec, alors ces petits pains étaient plutôt réussis.

Les patchs hypoallergéniques pour le Holter cardiaque sont arrivés. Ma fille les a essayés. On va voir s'ils fonctionnent bien.

View Org source for this post

La semaine du 16 au 22 mars

| french

lundi 16

J'ai emmené ma fille chez le dentiste pour un nettoyage. L'hygiéniste a pensé que la douleur pouvait être due au fait que de nouvelles dents poussaient. J'ai laissé ma fille décider si elle voulait du fluor. Au début, elle a décliné, mais elle a changé d'avis et elle a dit oui. Après cela, elle s'en est plainte, mais au moins, elle l'a fait. En guise de récompense, nous avons acheté des nouilles instantanées.

J'étais trop optimiste quant à la météo parce qu'il faisait beau le matin. Quand je faisais du vélo, j'avais un peu froid. J'ai emmené ma fille dans la boutique qui proposait la boîte de déjeuner qu'elle voulait, et elle a confirmé son choix. Ensuite, j'ai emmené ma fille à son cours de gymnastique. Nous sommes arrivées si tôt que le gymnase était encore fermé à clé. Heureusement, son entraîneur est arrivé et il nous a ouvert la porte. Une fois rentrées, j'ai bu un chocolat chaud pour me réchauffer.

Nous avons réussi à faire des sons pour la machine à espresso en jouet avec l'aide de l'IA Claude. Au début, nous avons essayé d'utiliser un signal analogique, mais le micro:bit ne pouvait pas envoyer un véritable signal analogique. Au lieu de cela, il utilisait la modulation de largeur d'impulsion (pulse-width modulation), qui était un peu difficile à lire du côté de l'Arduino, peut-être en raison de l'écart de tension. Ensuite, nous avons essayé de varier la durée d'impulsion, ce qui était plus facile à détecter du côté de l'Arduino. Du côté du micro:bit, j'ai dû gérer les rebonds du bouton-poussoir pour rendre la logique plus fiable.

Ma fille a adoré sa nouvelle boîte de déjeuner. Elle l'a remplie de collations.

Après le dîner, nous avons cousu ensemble. La pochette Pokémon prend vraiment forme maintenant. Je ne sais pas trop si je dois laisser les passants en l'état ou si je dois découdre les coutures et les intégrer directement aux lignes de couture. Ma fille a préféré l'option d'attacher une sangle à la pochette pour faire un sac à bandoulière, ou de la détacher pour glisser la pochette au fond de son sac à dos.

mardi 17

Il faisait froid, donc nous sommes restés à la maison et nous avons travaillé sur notre projet de machine à espresso en jouet. Ça fonctionne bien. Nous avons enregistré un son pour l'eau et un autre son pour le lait, nous les avons copiés sur l'Arduino et nous avons modifié notre logiciel pour jouer les sons. Notre fille était très heureuse. Elle m'a vendu deux tasses de café.

J'ai eu un cours avec mon tuteur où je me suis exercée aux virelangues. Les mots difficiles sont : grenouille, fouille, feuille et broussailles. Ma fille s'est jointe à moi et elle a essayé des mots.

Ma fille aime bien quand nous portons des chaussures ou des vêtements similaires. Heureusement, je peux porter des chaussures pour enfants et nous pouvons coudre nos propres vêtements, donc si elle veut être assortie, alors nous serons assorties. Cette année, elle a choisi des Crocs Pokémon. Nos sandales flamboyantes Pokémon sont arrivées aujourd'hui. Elles sont très roses. Très très roses.

Mon mari avait rendez-vous chez le dentiste pour son nettoyage. Il a dit que l'hygiéniste dentaire portait un masque procédural, mais elle a changé pour un masque N95 parce qu'elle s'est souvenue que notre famille prend des précautions contre la COVID. Je pense que je vais changer de dentiste parce qu'elle a baissé brièvement son masque en parlant, ce qui signifie que nos niveaux de précaution sont différents. La clinique dentaire est le seul endroit où nous devons retirer nos masques. J'ai cherché dans le groupe de précaution COVID et j'ai trouvé une recommandation pour une clinique dentaire à proximité où le personnel porte normalement des masques N95. Je vais y aller pour mon prochain nettoyage. Ma fille veut voir l'hygiéniste dentaire qui nettoie les dents de mon mari, parce qu'il la recommande vivement.

On m'a appelée au sujet de l'examen Holter que la cardiologue de ma fille a prescrit. Elle nous a dit qu'il fallait que ma fille porte l'appareil Holter pendant deux semaines. Ma fille a fait un blocage, donc j'ai refusé l'appareil. Après réflexion, elle a négocié certaines contreparties comme beaucoup de livres de la bibliothèque et de nouveaux jouets pour les étapes en cours de route. Je suis tellement fière d'elle parce qu'elle a décidé de privilégier la santé au confort et qu'elle a essayé son propre système de motivation. Je sais que ces choses sont difficiles, mais elle prend ses propres décisions.

OBS n'a pas enregistré mon côté de l'audio, donc je ne peux pas l'analyser.

mercredi 18

J'ai eu une réunion virtuelle avec mes clients pour discuter du nouveau prototype qu'ils veulent que je crée. Je pense que c'est possible. Cette semaine est chargée puisque ma fille est en vacances. Je vais y travailler la semaine prochaine. J'ai probablement quelques extraits de code que je peux combiner.

J'ai emmené ma fille au Musée d'art contemporain pour une activité gratuite avec ses amies. Nous avons sculpté des figurines dans du papier aluminium. Ma fille a également réalisé une pancarte avec son nom et quelques Pokémon. J'ai aussi dessiné et colorié un Pikachu et un Qulbutoké (Wobbuffet en anglais).

Mon mari a utilisé Claude pour l'aider sur un projet de chambre de pousse à levain. Il a dit que l'IA était très utile pour échanger des idées. Il a réussi à connecter un Arduino Uno à un afficheur. Nous avons appris des choses sur les effets Seebeck et Peltier, qui sont utiles pour gérer la température du levain.

J'ai appelé l'entreprise qui fournit les appareils Holter pour lancer les démarches. L'appareil arrivera la semaine prochaine ou la semaine suivante. Nous avons besoin de beaucoup de livres comme promis. J'ai actualisé mon script pour réserver des livres à la bibliothèque.

jeudi 19

Ma fille a passé une mauvaise nuit, donc elle et moi étions un peu fatiguées quand nous nous sommes réveillées. J'ai reçu un message du père de son amie pour nous inviter à aller patiner ensemble, mais je me suis dit que la patinoire serait fermée parce qu'il faisait trop chaud pour préserver la glace.

Ma fille voulait aller à l'aquarium depuis le début des vacances. Il faisait beau. C'était un jour parfait pour faire du vélo. Nous sommes tous allés à l'aquarium Ripley's pour le visiter avec une amie de ma fille et son père. Elles ont aimé les requins et les raies. Mon mari en a profité pour faire quelques photos. Je me suis amusée à découvrir les poissons qui ont des noms intéressants comme le sigan magnifique (magnificent rabbitfish), le nason élégant (elegant unicornfish), le dollar des sables excentrique (eccentric sand dollar), et le miroir à bandes (stripey).

Pour le dîner, j'ai préparé des burgers et des frites. Il faisait froid, donc les burgers ont pris plus de temps à cuire au barbecue. Mon mari a préparé de la salade de chou.

Je me suis rendu compte que l'accéléromètre de mon téléphone ne fonctionne pas, ce qui explique pourquoi mes photos ne tournent pas automatiquement et que je ne peux pas faire de la réalité augmentée. C'est ma faute. Je ne veux pas remplacer mon téléphone pour l'instant. Peut-être d'ici deux ans.

vendredi 20

Pendant mon cours avec le tuteur, je me suis exercée aux virelangues et à lire à voix haute presque toutes mes entrées de journal depuis lundi. Malheureusement, le cours précédent n'était pas enregistré, donc je ne peux pas les comparer. Du côté positif, j'ai finalement appris comment configurer OBS pour enregistrer des pistes séparées, ce qui facilitera leur analyse et leur extraction la semaine prochaine.

(subed-record-extract-all-approximately-matching-phrases
   (split-string (org-file-contents "/home/sacha/proj/french/analysis/virelangues-2026-03-13/phrases.txt") "\n")
   "/home/sacha/sync/recordings/2026-03-20-raphael.json"
   "/home/sacha/proj/french/analysis/virelangues-2026-03-13/2026-03-20-raphael-script.vtt")

La pluie s'est arrêtée, donc j'ai emmené ma fille au centre médical pour faire une radiographie que la médecin avait prescrite pour rechercher la cause de ses symptômes. Après cela, ma fille a joué dans la salle de jeux. Elle aime bien le skee-ball et elle a obtenu son meilleur score jusqu'à présent. Elle s'est aussi rendu compte que le jeu de pêche lui a donné plus de jetons que le skee-ball ou d'autres jeux qu'elle aime, et puisqu'elle aime le jeu de pêche, elle a gagné suffisamment de jetons pour obtenir beaucoup de bonbons.

Nous avions le temps, donc je l'ai emmenée au magasin de tissus du centre-ville. Nous n'avons pas trouvé de tissu pour maillot de bain de la couleur que ma fille voulait, mais elle a trouvé du tissu vichy rouge pour coudre une couverture de pique-nique qu'elle voulait depuis longtemps. Dans un autre magasin à proximité, elle a acheté de la crème solaire, des élastiques, et un gloss à lèvres.

Ma fille a encore fait quelques peintures en utilisant du ruban pour masquer des zones. J'étais ravie de voir qu'elle s'est amusée grâce à l'art.

samedi 21

Nous avons fait les courses ensemble. Ma fille voulait acheter la collation Nutella Go depuis longtemps, donc elle et moi avons continué notre chemin un peu plus loin que la maison et nous sommes allées au magasin du coin.

J'ai réfléchi à une interface pour écouter et enregistrer un mot isolé que je veux pratiquer. Je pense que la forme d'onde n'est pas très utile dans cette situation.

Mon mari a installé deux lumières à côté du lit mezzanine de ma fille parce qu'elle aime lire à l'heure du coucher.

Il a aussi encadré le dessin que ma fille avait peint hier soir. Elle a essayé de photocopier son dessin, mais comme prévu, la peinture argentée est devenue simplement grise. C'est une bonne chose que l'artiste aime bien peindre. Nous pourrons ainsi avoir chacun notre original.

Pour le dîner, mon mari et moi avons préparé des spaghettis à la sauce carbonara et au bacon. Après ça, nous avons préparé des petits pains aux haricots rouges. Ma fille s'est bien amusée à jouer avec la pâte. Les pains étaient délicieux. J'ai brûlé une fournée, mais après avoir gratté le dessus, c'était acceptable.

J'ai un peu mal à la tête, donc je me suis ménagée.

dimanche 22

Il pleuvait, donc nous sommes restés à la maison.

Ma fille a attaché ses dessins au mur avec du ruban adhésif. Elle m'a dicté leurs titres et explications, et nous les avons imprimés et affichés comme dans un musée.

J'ai cousu une housse de protection pour l'un des radiateurs en utilisant la majeure partie de ma toile restante.

J'ai essayé de préparer une autre pâte à petits pains aux haricots rouges comme hier, mais la pâte ne s'étirait pas. J'ai pensé qu'elle était trop travaillée, donc je l'ai donnée à ma fille pour qu'elle s'amuse avec et j'ai préparé une autre fournée. Cette fois, elle s'étirait un peu mieux. Je suppose que pour cette recette, le pétrissage à la main est meilleur qu'à la machine.

Ma fille et moi avons aidé mon mari à accrocher un grand dessin brodé dans l'escalier. Malheureusement, il a fait tomber le petit niveau de sa plateforme improvisée sur ma tête, mais ce n'était pas grave. Après ça, j'ai porté mon casque de vélo.

J'étais très fatiguée, donc j'ai fait une sieste. Ma fille a essayé de me réveiller pour des biscuits et du chocolat chaud, mais j'ai continué à dormir. Tant pis pour moi.

Pour le dîner, mon mari a préparé des nouilles ramen aux wontons. C'était le plat parfait pour ce genre de journée.

J'ai fini les petits pains aux haricots rouges après le dîner. À mon soulagement, ils étaient réussis.

J'ai emprunté un livre électronique en français à la bibliothèque qui correspond à la série d'émissions que j'avais vues. J'ai besoin de chercher quelques mots dans le dictionnaire, mais c'est un autre petit pas en avant. Le livre électronique que j'ai emprunté a des DRM, donc je ne peux pas télécharger l'EPUB directement. Si je cherche des livres du domaine public, je peux utiliser une bibliothèque JavaScript pour afficher les EPUB dans une page et traiter les clics pour traduire les mots et sauvegarder un historique.

View Org source for this post

Categorizing Emacs News items by voice in Org Mode

| speech, speech-recognition, emacs, org

I'm having fun exploring which things might actually be easier to do by voice than by typing. For example, after I wrote some code to expand yasnippets by voice, I realized that it was easier to:

  1. press my shortcut,
  2. say "okay, define interactive function",
  3. and then press my shortcut again,

than to:

  1. mentally say it,
  2. get the first initials,
  3. type in "dfi",
  4. and press Tab to expand.

Another area where I do this kind of mental translation for keyboard shortcuts is when I categorize dozens of Emacs-related links each week for Emacs News. I used to do this by hand. Then I wrote a function to try to guess the category based on regular expressions (my-emacs-news-guess-category in emacs-news/index.org, which is large). Then I set up a menu that lets me press numbers corresponding to the most frequent categories and use tab completion for the rest. 1 is Emacs Lisp, 2 is Emacs development, 3 is Emacs configuration, 4 is appearance, 5 is navigation, and so on. It's not very efficient, but some of it has at least gotten into muscle memory, which is also part of why it's hard to change the mapping. I don't come across that many links for Emacs development or Spacemacs, and I could probably change them to something else, but… Anyway.

2026-03-23_20-38-33.png
Figure 1: Screenshot of my menu for categorizing links

I wanted to see if I could categorize links by voice instead. I might not always be able to count on being able to type a lot, and it's always fun to experiment with other modes of input. Here's a demonstration showing how Emacs can automatically open the URLs, wait for voice input, and categorize the links using a reasonably close match. The *Messages* buffer displays the recognized output to help with debugging.

Screencast with audio: categorizing links by voice

This is how it works:

  1. It starts an ffmpeg recording process.
  2. It starts Silero voice activity detection.
  3. When it detects that speech has ended, it use curl to send the WAV to an OpenAI-compatible server (in my case, Speaches with the Systran/faster-whisper-base.en model) for transcription, along with a prompt to try to influence the recognition.
  4. It compares the result with the candidates using string-distance for an approximate match. It calls the code to move the current item to the right category, creating the category if needed.

Since this doesn't always result in the right match, I added an Undo command. I also have a Delete command for removing the current item, Scroll Up and Scroll Down, and a way to quit.

Initial thoughts

I used it to categorize lots of links in this week's Emacs News, and I think it's promising. I loved the way my hands didn't have to hover over the number keys or move between those and the characters. Using voice activity detection meant that I could just keep dictating categories instead of pressing keyboard shortcuts or using the foot pedal I recently dusted off. There's a slight delay, of course, but I think it's worth it. If this settles down and becomes a solid part of my workflow, I might even be able to knit or hand-sew while doing this step, or simply do some stretching exercises.

What about using streaming speech recognition? I've written some code to use streaming speech recognition, but the performance wasn't good enough when I tried it on my laptop (Lenovo P52 released in 2018, no configured GPU under Linux). The streaming server dropped audio segments in order to try to catch up. I'd rather have everything transcribed at the level of the model I want, even if I have to wait a little while. I also tried using the Web Speech API in Google Chrome for real-time speech transcription, but it's a little finicky. I'm happy with the performance I get from either manually queueing speech segments or using VAD and then using batch speech recognition with a model that's kept in memory (which is why I use a local server instead of a command-line tool). Come to think of it, I should try this with a higher-quality model like medium or large, just in case the latency turns out to be not that much more for this use case.

What about external voice control systems like Talon Voice or Cursorless? They seem like neat ideas and lots of people use them. I think hacking something into Emacs with full access to its internals could be lots of fun too.

A lot of people have experimented with voice input for Emacs over the years. It could be fun to pick up ideas for commands and grammars. Some examples:

What about automating myself out of this loop? I've considered training a classifier or sending the list to a large language model to categorize links in order to set more reasonable defaults, but I think I'd still want manual control, since the fun is in getting a sense of all the cool things that people are tinkering around with in the Emacs community. I found that with voice control, it was easier for me to say the category than to look for the category it suggested and then say "Okay" to accept the default. If I display the suggested category in a buffer with very large text (and possibly category-specific background colours), then I can quickly glance at it or use my peripheral vision. But yeah, it's probably easier to look at a page and say "Org Mode" than to look at the page, look at the default text, see if it matches Org Mode, and then say okay if it is.

Ideas for next steps

I wonder how to line up several categories. I could probably rattle off a few without waiting for the next one to load, and just pause when I'm not sure. Maybe while there's a reasonably good match within the first 1-3 words, I'll take candidates from the front of the queue. Or I could delimit it with another easily-recognized word, like "next".

I want to make a more synchronous version of this idea so that I can have a speech-enabled drop-in replacement that I can use as my y-or-n-p while still being able to type y or n. This probably involves using sit-for and polling to see if it's done. And then I can use that to play Twenty Questions, but also to do more serious stuff. It would also be nice to have replacements for read-string and completing-read, since those block Emacs until the user enters something.

I might take a side-trip into a conversational interface for M-x doctor and M-x dunnet, because why not. Naturally, it also makes sense to voice-enable agent-shell and gptel interactions.

I'd like to figure out a number- or word-based completion mechanism so that I can control Reddit link replacement as well, since I want to select from a list of links from the page. Maybe something similar to the way voicemacs adds numbers to helm and company or how flexi-choose.el works.

I'm also thinking about how I can shift seamlessly between typing and speaking, like when I want to edit a link title. Maybe I can check if I'm in the minibuffer and what kind of minibuffer I'm in, perhaps like the way Embark does.

It would be really cool to define speech commands by reusing the keymap structure that menus also use. This is how to define a menu in Emacs Lisp:

(easy-menu-define words-menu global-map
  "Menu for word navigation commands."
  '("Words"
     ["Forward word" forward-word]
     ["Backward word" backward-word]))

and this is how to set just one binding:

(keymap-set-after my-menu "<drink>"
  '("Drink" . drink-command) 'eat)

That makes sense to reuse for speech commands. I'd also like to be able to specify aliases while hiding them or collapsing them for a "What can I say" help view… Also, if keymaps work, then maybe minor modes or transient maps could work? This sort of feels like it should be the voice equivalent of a transient map.

The code so far

(defun my-emacs-news-categorize-with-voice (&optional skip-browse)
  (interactive (list current-prefix-arg))
  (unless skip-browse
    (my-spookfox-browse))
  (speech-input-cancel-recording)
  (let ((default (if (fboundp 'my-emacs-news-guess-category) (my-emacs-news-guess-category))))
    (speech-input-from-list
     (if default
         (format "Category (%s): " default)
       "Category: ")
     '(("Org Mode" "Org" "Org Mode")
       "Other"
       "Emacs Lisp"
       "Coding"
       ("Emacs configuration" "Config" "Configuration")
       ("Appearance" "Appearance")
       ("Default" "Okay" "Default")
       "Community"
       "AI"
       "Writing"
       ("Reddit" "Read it" "Reddit")
       "Shells"
       "Navigation"
       "Fun"
       ("Dired" "Directory" "Dir ed")
       ("Mail, news, and chat" "News" "Mail" "Chat")
       "Multimedia"
       "Scroll down"
       "Scroll up"
       "Web"
       "Delete"
       "Skip"
       "Undo"
       ("Quit" "Quit" "Cancel" "All done"))
     (lambda (result text)
       (message "Recognized %s original %s" result text)
       (pcase result
         ("Undo"
          (undo)
          (my-emacs-news-categorize-with-voice t))
         ("Skip"
          (forward-line)
          (my-emacs-news-categorize-with-voice))
         ("Quit"
          (message "All done.")
          (speech-input-cancel-recording))
         ("Reddit"
          (my-emacs-news-replace-reddit-link)
          (my-emacs-news-categorize-with-voice t))
         ("Scroll down"
          (my-spookfox-scroll-down)
          (my-emacs-news-categorize-with-voice t))
         ("Scroll up"
          (my-spookfox-scroll-up)
          (my-emacs-news-categorize-with-voice t))
         ("Delete"
          (delete-line)
          (undo-boundary)
          (my-emacs-news-categorize-with-voice))
         ("Default"
          (my-org-move-current-item-to-category
           (concat default ":"))
          (undo-boundary)
          (my-emacs-news-categorize-with-voice))
         (_
          (my-org-move-current-item-to-category
           (concat result ":"))
          (undo-boundary)
          (my-emacs-news-categorize-with-voice))))
     t)))

It uses Spookfox to control Firefox from Emacs:

(defun my-spookfox-scroll-down ()
  (interactive)
  (spookfox-js-injection-eval-in-active-tab "window.scrollBy(0, document.documentElement.clientHeight);" t))

(defun my-spookfox-scroll-up ()
  (interactive)
  (spookfox-js-injection-eval-in-active-tab "window.scrollBy(0, -document.documentElement.clientHeight);"))

(defun my-spookfox-background-tab (url &rest args)
  "Open URL as a background tab."
  (if spookfox--connected-clients
      (spookfox-tabs--request (cl-first spookfox--connected-clients) "OPEN_TAB" `(:url ,url))
    (browse-url url)))

It also uses these functions for categorizing Org Mode items:

(defun my-org-move-current-item-to-category (category)
    "Move current list item under CATEGORY earlier in the list.
  CATEGORY can be a string or a list of the form (text indent regexp).
  Point should be on the next line to process, even if a new category
  has been inserted."
    (interactive (list (completing-read "Category: " (my-org-get-list-categories))))
    (when category
      (let* ((col (current-column))
             (item (point-at-bol))
             (struct (org-list-struct))
             (category-text (if (stringp category) category (elt category 0)))
             (category-indent (if (stringp category) 2 (+ 2 (elt category 1))))
             (category-regexp (if (stringp category) category (elt category 2)))
             (end (elt (car (last struct)) 6))
             (pos (point))
             s)
        (setq s (org-remove-indentation (buffer-substring-no-properties item (org-list-get-item-end item struct))))
        (save-excursion
          (if (string= category-text "x")
              (org-list-send-item item 'delete struct)
            (goto-char (caar struct))
            (if (re-search-forward (concat "^ *- +" category-regexp) end t)
                (progn
                  ;; needs a patch to ol.el to check if stringp
                  (org-list-send-item item (point-at-bol) struct)
                  (org-move-item-down)
                  (org-indent-item))
              (goto-char end)
              (org-list-insert-item
               (point-at-bol)
               struct (org-list-prevs-alist struct))
              (let ((old-struct (copy-tree struct)))
                (org-list-set-ind (point-at-bol) struct 0)
                (org-list-struct-fix-bul struct (org-list-prevs-alist struct))
                (org-list-struct-apply-struct struct old-struct))
              (goto-char (point-at-eol))
              (insert category-text)
              (org-list-send-item item 'end struct)
              (org-indent-item)
              (org-indent-item))
            (recenter))))))

(defun my-org-guess-list-category (&optional categories)
  (interactive)
  (require 'cl-lib)
  (unless categories
    (setq categories
          (my-helm-org-list-categories-init-candidates)))
  (let* ((beg (line-beginning-position))
         (end (line-end-position))
         (string (buffer-substring-no-properties beg end))
         (found
          (cl-member string
                     categories
                     :test
                     (lambda (string cat-entry)
                       (unless (string= (car cat-entry) "x")
                         (string-match (regexp-quote (downcase (car cat-entry)))
                                       string))))))
    (when (car found)
      (my-org-move-current-item-to-category
       (cdr (car found)))
      t)))

For the speech-input functions, experimental code is at https://codeberg.org/sachac/speech-input .

View Org source for this post

2026-03-23 Emacs news

| emacs, emacs-news

: Removed elecxzy comment-dwim, whoops.

Might be a good opportunity to set up better auto-saves, with buffer-guardian.el inspiring an update to super-save 0.5. Also, there were a couple of interesting experiments embedding Chromium (Reddit) or native macOS views in Emacs (Reddit), and one about embedding Emacs in a webpage (Reddit).

Links from reddit.com/r/emacs, r/orgmode, r/spacemacs, Mastodon #emacs, Bluesky #emacs, Hacker News, lobste.rs, programming.dev, lemmy.world, lemmy.ml, planet.emacslife.com, YouTube, the Emacs NEWS file, Emacs Calendar, and emacs-devel. Thanks to Andrés Ramírez for emacs-devel links. Do you have an Emacs-related link or announcement? Please e-mail me at sacha@sachachua.com. Thank you!

View Org source for this post