La semaine du 26 janvier au 1er février 2026

| french

lundi, le vingt-six janvier

L'école était fermée à cause de la neige. Nous sommes encore malades, donc nous étions heureux grâce au répit. Il faisait froid aujourd'hui, mais les prochains jours seront encore plus froids, donc quand nous avons pu sortir, on est sorties.

Je pense que lire mon journal en français à voix haute pendant une heure est un peu difficile parce que ma voix s'est fatiguée.

Ma fille et moi nous sommes dépêchées au PokéStop à proximité pour un raid, mais nous ne sommes pas arrivées à temps. Ce n'était pas grave. Il y aura une autre chance.

J'ai modifié mon correcteur de grammaire pour utiliser le modèle Gemini Flash 2.5 IA, et je l'ai utilisé pour corriger mon journal. Il tourne souvent en rond parce que je n'affiche pas l'historique.

J'ai préparé mon infolettre d'Emacs en streaming. Quelques spectateurs ont fait des commentaires.

Je suis très fatiguée, donc je vais laisser de côté les autres tâches.

mardi, le vingt-sept janvier

Ma fille était malade aujourd'hui, donc j'ai prévenu l'école de son absence. Elle avait aussi passé une mauvaise nuit. Elle s'était réveillée en pleine nuit à cause de palpitations et elle a eu du mal à retrouver le sommeil. Elle s'est levée tard.

J'avais réussi à obtenir un rendez-vous urgent, donc l'après-midi, j'ai amené ma fille chez le médecin pour ses palpitations et d'autres symptômes. Le médecin a examiné ma fille et lui a posé beaucoup de questions. Elle a dit que c'était normal que ça se produise parfois quand on est malade. Elle m'a donné une ordonnance pour quelques analyses si les symptômes continuaient après la fin du rhume.

J'ai essayé la reconnaissance vocale en continu via RealtimeSTT, mais elle en rate quelques phrases de temps en temps, donc je préfère la reconnaissance vocale par traitement par lots pour penser à voix haute.

Ma fille adore se blottir contre moi pendant que nous nous détendons sur le canapé, donc écrire sur mon smartphone est plus facile que d'écrire sur mon ordinateur.

Pendant que je faisais la vaisselle, j'écoutais des épisodes de podcast français qui analysent quelques images humoristiques (memes). Un épisode portait sur la situation où l'ordinateur demandait à la femme si elle voulait faire une mise à jour maintenant ou plus tard. Elle dit que bien sûr, elle fera la mise à jour demain, en faisant un clin d'œil appuyé.

À ma grande surprise, je les ai compris. Ça veut dire que je peux écouter quelques podcasts de niveau A2 même sans sous-titres.

Après avoir mangé des nouilles udon au souper, nous nous sommes installées sur le canapé et nous avons joué à Pokémon sous différentes formes : Pokémon Go, Pokémon Blanc 2 et Pokémon Jaune. Sur Pokémon Go, ma fille et moi nous sommes affrontées de nombreuses fois. Parfois j'ai gagné, parfois elle a gagné. C'est amusant que nous passions ces moments-là.

À l'heure du coucher (toujours à l'heure du coucher), ma fille a dit qu'elle ne voulait pas encore dormir. Elle voulait combler son retard au cas où il faudrait faire une présentation demain et elle a été malade toute la journée. Bon, comment refuser ça ? Elle a fait plus de devoirs ce soir que le week-end dernier. En fait, même si je dis : « Non, tu dois te reposer, » elle ne s'endormira pas de toute manière.

mercredi, le vingt-huit janvier

Ma fille se sentait mieux, mais mon mari et moi étions toujours malades.

J'ai mis à jour mon livre de comptabilité pour mon entreprise et pour moi-même. Puis j'ai rempli ma déclaration de revenus pour mes placements (formulaire T5) et je l'ai soumise.

J'ai corrigé un bogue dans mon logiciel pour copier l'édition précédente de l'infolettre de Bike Brigade vers un brouillon pour la semaine prochaine. Maintenant le logiciel peut remplacer correctement le lien du brouillon actuel.

Le kit D&D est arrivé. J'ai enlevé les livrets que ma sœur m'avait dit de cacher à ma fille pour éviter les spoilers.

J'ai participé à la réunion virtuelle Emacs Berlin où kickingvegas a montré ses propres raccourcis clavier pour gérer les tables de l'Org Mode. D'autres personnes ont discuté de la navigation par onglets, de la configuration de fenêtres, de l'expand-region et du treesitter.

Après l'école, j'ai invité ma fille à faire une promenade, mais elle a voulu rester chez nous. Je suis allée toute seule au parc voisin et j'ai essayé un raid Pokémon Go. Victoire ! C'était seulement un raid de niveau 1, donc j'ai pu le vaincre moi-même.

Ma fille et moi avons ouvert la boîte de D&D et nous avons commencé à préparer nos personnages pour notre rendez-vous avec ses cousines et ses tantes samedi. Elle a choisi de jouer une clerc naine qui s'appelle Lily. J'ai fait un roublard halfelin au passé trouble qui s'appelle Yoink. Peut-être que Lily accompagne Yoink pour essayer de l'empêcher de s'attirer des ennuis.

J'ai publié mon article sur le Carnaval d'Emacs sur mon blog. Certaines personnes ont fait des commentaires positifs en français sur Mastodon, et j'ai aussi répondu en français.

jeudi, le vingt-neuf janvier

J'ai créé un logiciel qui détecte ma voix et indique à Emacs de lancer la reconnaissance vocale pour simuler un mode continu. C'était utile. J'ai aussi pensé à l'interface vocale pour Emacs. Il existe de nombreux projets de contrôle vocal, donc je dois bricoler quelque chose pour moi-même. Si j'utilise une reconnaissance vocale rapide (soit les mots d'activation, soit le streaming avec un petit modèle) à côté d'un modèle plus grand pour plus de précision, je peux améliorer l'interface.

J'ai aussi créé quelques fonctions pour utiliser l'IA pour faire des commentaires sur mes brouillons en français, cette fois en gardant l'historique pour éviter de tourner en rond. Le problème avec l'IA, c'est qu'elle veut toujours plaire, donc elle change souvent d'avis une fois que la plupart des erreurs ont été corrigées. Si j'ajoute les modifications du brouillon précédent et les commentaires précédents, je peux réduire l'indécision. En cours de route, j'ai créé une fonction pour comparer deux textes mot à mot et afficher les différences dans le contexte des phrases. Je pense qu'elle sera aussi utile pour comparer des sous-titres.

J'ai eu un rendez-vous avec les autres bénévoles qui ont travaillé sur l'infolettre. J'ai répondu à leurs questions et nous avons discuté de la façon dont nous voulons procéder. L'infolettre de cette semaine est trop volumineuse pour l'API, donc j'ai modifié mon logiciel pour gérer le téléchargement, fichier par fichier.

Après l'école, ma fille n'a pas voulu sortir. Il faisait très froid.

Pour le souper, j'ai préparé un steak Salisbury et de la purée de pommes de terre. Ma fille a voulu essayer de couper des pommes de terre avec un éplucheur pour faire des tranches fines pour faire des frites. Elle a aussi essayé de les couper en fines tranches avec un couteau. Les tranches qui ont été coupées avec un éplucheur sont plus fines, donc elles sont plus croquantes après les avoir fait frire. C'est une bonne expérience.

Elle s'est assise sur mes genoux pendant que nous lisions un livre ensemble. Elle aime bien ça quand elle a froid. Je dis toujours qu'elle peut encore porter des vêtements tels qu'un poncho ou un peignoir, mais elle préfère un câlin.

vendredi, le trente janvier

Cette journée était un peu insatisfaisante. Il faisait très froid (moins vingt-deux degrés), donc même mon mari a annulé son rendez-vous chez le médecin.

Il y avait une remplaçante à l'école aujourd'hui, donc ma fille n'a pas voulu participer à la classe parce que le rythme était encore plus lent qu'en classe normale. Bon, c'était son expérience. Heureusement, je n'avais pas de tâches urgentes qui demandaient de la concentration à l'exception d'une diffusion en direct à 10h30, et je m'en suis souvenue à temps. Elle a dit qu'elle voulait transformer ses devoirs en jeu. Si elle le fait vraiment, je suis heureuse de l'aider, mais elle ne m'a pas demandé d'aide. Pendant qu'elle s'amusait, j'ai écrit un article pour annoncer le Carnaval d'Emacs en février. Je pense que pour le Carnaval, la complétion est un bon sujet pour apprendre ensemble. Certains débutants ne savent peut-être pas ce qui est possible ou comment commencer. J'avais accumulé plusieurs liens au cours de la préparation d'Emacs News que je peux organiser.

J'ai travaillé sur la reconnaissance vocale. J'ai finalement forké le dépôt de natrys/whisper.el parce que je veux implémenter une fonctionnalité qui est trop difficile avec la bibliothèque actuelle, comme le faire scroller. Pour que cela soit possible, il a fallu ajouter une liste de fonctions de traitement de texte qui sont implémentées en dehors du code qui préserve la position. Je dois le tester pendant quelques jours avant de l'envoyer au créateur de whisper.el pour la relecture.

Ma fille et moi avons écrit nos profils de personnage pour notre partie de D&D demain. Nous avons fait les préparatifs : les feuilles de personnage, les jetons, les dés… Je ne sais pas comment jouer avec sa cousine et ses tantes en ligne, mais nous essaierons demain. Les tables virtuelles existent, donc peut-être que nous pourrons en utiliser une la prochaine fois, mais d'abord, ma sœur (la meneuse de jeu) veut essayer à l'ancienne (bien qu'en ligne).

Le bulletin scolaire arrive le dix février. Bon, on va voir. Je pense que ma fille recevra de mauvaises notes, mais ce n'est pas la fin du monde. Si elle choisit de travailler plus dur, elle peut rattraper le temps perdu. Si elle ne fait pas d'efforts, ce sera la même chose pour elle que pour les autres étudiants qui s'ennuient beaucoup à l'école. Je dois me rappeler mes objectifs principaux. Si elle est en sécurité, heureuse et curieuse, elle peut trouver sa propre voie.

samedi, le trente-y-un janvier

Ma fille et moi avons joué à Donjons et Dragons.

  • Ma fille était une clerc,
  • ma sœur était une ensorceleuse,
  • ma nièce était une guerrière
  • j'étais un roublard (un homme, parce que le restant de l'équipe est féminine; cela rendra peut-être l'accord de nom plus complexe quand je raconte, mais c'est une bonne occasion pour pratiquer ça),
  • et mon autre sœur était la meneuse de jeu.

Nous sommes envoyés par un ensorceleur au donjon avec un message pour le scribe qui habite là-bas. Nous avons vaincu une vase grise dans un wagon et quelques bandits dans la forêt. Je pense que la guerrière aime bien combattre parce qu'elle se demande toujours si elle peut frapper le personnage que la meneuse présente.

Malgré la distance et la petite taille de notre table (c'est difficile de trouver une place pour tous les éléments), nous nous sommes amusées en vrai.

L'après-midi, j'ai traduit mes fonctions pour formater l'infolettre de Bike Brigade d'Emacs Lisp en NodeJS avec l'aide de l'IA pour que ce soit plus facile à exécuter ailleurs un jour. J'ai essayé l'interface gptel sous Emacs. C'était plus pratique que l'interface web parce que j'ai pu envoyer la région actuelle vers l'IA aisément.

Il faisait encore très froid, donc ma fille n'a pas voulu participer au club nature au parc. Elle n'avait pas participé à un club nature cette saison, mais ce n'était pas grave. Je peux penser au droit d'enregistrement comme une donation au parc. Si elle veut y aller, elle peut y aller. Si non, ce n'est pas grave. Particulièrement cet hiver, il fait souvent trop froid, donc les enfants passent souvent leur temps à l'intérieur de toute façon, ce que nous préférons éviter ou minimiser à cause du COVID et d'autres maladies.

J'ai reçu un message sur mon français de la part d'un lecteur de mon blog. (Merci !) Je partagerai ses commentaires avec ma tutrice lundi. C'est possible que même si ma tutrice est vivement recommandée par un autre parent dans un groupe sur Facebook, parce qu'elle n'est pas immergée maintenant dans un environnement francophone à Toronto (ou peut-être est-ce parce que nous sommes au Canada), il y a quelques points qu'elle trouve difficiles à résoudre. Peut-être que je peux inclure mes questions dans ces entrées et vous pouvez faire des commentaires si vous voulez. Je pourrai envoyer vos commentaires à ma tutrice et nous pourrons nous améliorer ensemble.

Les points pour possiblement mentionner lundi :

  • outil : la prononciation dans le dictionnaire dit que [uti] (le «l» est silencieux), mais dans la phrase « J'ai aussi travaillé sur l'outil (loo teel) de visualisation et la gestion du routage audio. », ma tutrice a écrit que l'outil se prononce «loo teel» (avec le son dernier «l»). Il n'y a pas de voyelle après le mot, donc il ne peut pas y avoir de liaison. Si je me souviens bien, elle a expliqué que je dois le prononcer avec un très léger «l» à la fin, donc peut-être cette transcription sert à former le son de la voyelle. C'est le problème d'une débutante : je n'en sais pas assez pour corriger ma tutrice si elle se trompe peut-être…

    Un jour je serai assez courageuse pour publier des enregistrements en français de ces entrées. Si cela ne vous dérange pas trop, j'aimerais recevoir vos commentaires. Je pense qu'il faudra me contenter d'un accent anglophone (même Justin Trudeau en a un), mais si je peux apprendre à séparer les voyelles et omettre les lettres silencieuses pour que je sois compréhensible, je prends un bon départ.

    • Ma tutrice a dit qu'un très léger «l», ce n'est pas un son «l» complet, on finit juste avec sa langue touchant le palais au lieu d'une voyelle «i» plus ouverte.
  • les dates sur mes entrées de journal :

Maintenant que j'en ai appris un peu plus sur Flycheck, j'ai modifié mon correcteur de grammaire avec l'IA pour qu'il s'exécute plus aisément. Mais je ne veux pas l'exécuter trop souvent parce que soit j'atteins les limites sur le plan gratuit soit j'accumule trop de frais si j'utilise l'autre clé d'API. Mon approche précédente était d'envoyer ce buffer manuellement à l'IA, ce qui est peut-être plus contrôlable que l'approche automatique.

dimanche, le premier février

J'ai amené ma fille à la patinoire pour son cours de patinage. Elle s'est entraînée à patiner en arrière. J'ai aussi pratiqué le patinage en arrière et tourner en patinant. Son amie n'y était pas, donc elle n'a pas pu lui donner une invitation pour sa fête d'anniversaire ce mois-ci. Bon, la prochaine fois. Nous avons joué un peu Pokémon Go sur le chemin du retour, et nous avons laissé nos Pokémon à quelques arènes.

Nous avons emprunté beaucoup de livres de la bibliothèque. Puis, nous avons fait les courses ensemble. Pour le souper, j'ai préparé des tacos. Elle les a bien mangés.

J'ai posé à ma fille des questions sur ses devoirs. Elle m'a demandé de transformer ses devoirs en un jeu, mais quand j'ai essayé d'établir lesquels et quand, elle évitait le travail. Je pense que je dois attendre jusqu'à ce qu'elle veuille vraiment faire ces tâches. C'est important qu'elle découvre ce qu'elle veut. Plus je pousse, plus elle résiste. Le bulletin de notes arrivera dans deux semaines, puis nos conversations seront plus concrètes avec les données. Au lieu de ses devoirs, elle jouait à Minecraft. Si de mauvaises notes montrent qu'il faut plus d'efforts, nous pouvons renégocier Minecraft et d'autres choses, parce que Minecraft ne doit pas remplacer ses devoirs.

Il vaut mieux que je reste occupée pour que je ne m'inquiète pas. J'ai modifié mon correcteur de grammaire avec l'IA pour accumuler tout l'historique. J'ai essayé le modèle Mistral-large-2411 pour corriger mon français. Parfois ce modèle génère du JSON invalide. Même avec mes connaissances limitées, je peux attraper certains mauvais conseils. Mais il offre des limites généreuses pour usage gratuit et Mistral IA est une entreprise française, donc pour l'objectif de corriger mes brouillons, il valait peut-être la peine. Mon mari étudie aussi l'IA pour automatisation, donc j'ai hâte de partager des notes ensemble.

Ha… Elle est venue et m'a demandé de l'aide avec ses devoirs de mathématiques. Mais après que j'ai posé des questions sur ses réponses confuses, elle est devenue très grincheuse. Je dois apprendre que je ne dois pas la corriger. Je peux laisser ça à l'enseignant.

Points de prononciation

  • Pour pratiquer attentivement : peux, veux, veuille, feuilles, nouilles. Selon l'IA:
    • Le son ø (peux, veux) demande une bouche très fermée, tandis que le début de 'veuille' vœj est plus ouvert (comme 'beurre')
    • C'est un excellent exercice pour la distinction entre le son œj (feuilles) et le son uj (nouilles).
  • Ça veut dire que je peux (peuh /​pø/​) écouter quelques podcasts de niveau (nee voh /​ni.vo/​) A2 même sans sous-titres.
  • Après avoir mangé des nouilles (nwee /​nuj/​) udon au souper,
  • C'est amusant que nous passions ces moments-là. (moh mehn lah /​mo.mɑ̃.la/​)
  • D'autres personnes ont discuté de la navigation par onglets (hard g /​ɔ̃.ɡlɛ/​)
  • J'ai eu (oo /​y/​) un rendez-vous avec les autres bénévoles qui ont travaillé sur l'infolettre.
  • … elle peut encore porter des vêtements tels qu'un poncho ou un peignoir (peing nwahr /​pɛ.ɲwaʁ/​)
  • Il y avait une remplaçante (rem plah sent /​ʁɑ̃.pla.sɑ̃t/​) à l'école aujourd'hui,
  • J'avais accumulé plusieurs liens (le ens /​ljɛ̃/​) au cours de la préparation d'Emacs News que je peux organiser.
  • … je veux implémenter (eim play mehn tay /​ɛ̃.ple.mɑ̃.te/​) une fonctionnalité qui est trop difficile avec la bibliothèque actuelle,
  • … texte qui sont implémentées en dehors (deuh hors /​də.ɔʁ/​) du code qui préserve la position.
  • Nous avons fait les préparatifs : les feuilles (feuyll /​fœj/​) de personnage, les jetons, les dés…
  • Je ne sais pas comment jouer avec sa cousine (koo zeen /​ku.zin/​) et ses tantes en ligne, mais nous essaierons (s ay yeuhron /​ɛ.sɛ.ʁɔ̃/​) demain.
  • Si elle ne fait pas d'efforts, ce sera la même chose pour elle que pour les autres (silent s /​otʁ/​) étudiants qui s'ennuient beaucoup à l'école.
  • Malgré la distance et la petite taille (tie /​taj/​) de notre table…
  • … ce soit plus facile à exécuter ailleurs (aie euhrs /​a.jœʁ/​) un jour.
  • J'ai posé à ma fille des questions (kes teons /​kɛs.tjɔ̃/​) sur ses devoirs.
  • Je pense que je dois attendre jusqu'à ce qu'elle veuille (veuyy /​vœj/​) vraiment faire ces tâches.
  • Même avec mes connaissances limitées, je peux (peuh /​pø/​) attraper certains mauvais conseils.
View org source for this post

Emacs and French: Focus flycheck-grammalecte on the narrowed part of the buffer

Posted: - Modified: | emacs, french

: Fix flycheck-checkers.

After learning about French spellcheck and grammar checking from Emacs expliqué à mes enfants, I added flycheck-grammalecte to my config. Nudged by @lann@mastodon.zaclys.com, I finally got around to figuring out why my setup sometimes worked and sometimes didn't. When I checked flycheck-verify-setup, I noticed that grammalecte kept getting disabled. A little digging around showed me that it was getting disabled because of too many errors. That was because it was trying to work on my whole file instead of just the portion that I narrowed to with org-narrow-to-subtree (ooh, just noticed an org-toggle-narrow-to-subtree command). I like having all of my French journal entries in one file because I can use consult-line (which I've bound to M-g l) to quickly look up examples of where else I've used a word. So I needed to define a checker that runs only on the narrowed part of the buffer.

(defun my-flycheck-grammalecte-buffer (checker callback)
  (let* ((temp-file-name (make-temp-file "grammalecte"))
         (output-buffer (get-buffer-create temp-file-name))
         (buffer (current-buffer))
         (cmdline (delq nil `("python3"
                              ,(expand-file-name "flycheck_grammalecte.py"
                                                 grammalecte--site-directory)
                              ,(unless flycheck-grammalecte-report-spellcheck "-S")
                              ,(unless flycheck-grammalecte-report-grammar "-G")
                              ,(unless flycheck-grammalecte-report-apos "-A")
                              ,(unless flycheck-grammalecte-report-nbsp "-N")
                              ,(unless flycheck-grammalecte-report-esp "-W")
                              ,(unless flycheck-grammalecte-report-typo "-T")
                              (option-list "-f" flycheck-grammalecte-filters)
                              (eval (flycheck-grammalecte--prepare-arg-list
                                     "-f" flycheck-grammalecte-filters-by-mode))
                              (eval (flycheck-grammalecte--prepare-arg-list
                                     "-b" flycheck-grammalecte-borders-by-mode))
                              ,temp-file-name)))
         (args (mapcan (lambda (arg) (flycheck-substitute-argument arg checker)) cmdline))
         (command (flycheck--wrap-command (car args) (cdr args))))
    (write-region (buffer-string) nil temp-file-name)
    (make-process :name "grammalecte"
                  :buffer output-buffer
                  :command command
                  :sentinel
                  (lambda (process status)
                    (let ((errors (with-current-buffer (process-buffer process)
                                    (message "%s" (buffer-string))
                                    (flycheck-parse-with-patterns
                                     (buffer-string)
                                     checker
                                     (current-buffer)))))
                      (delete-file temp-file-name)
                      (kill-buffer output-buffer)
                      ;; offset
                      (funcall
                       callback
                       'finished
                       (let ((offset (save-excursion (goto-char (point-min))
                                                     (line-number-at-pos nil t))))
                         (mapcar
                          (lambda (err)
                            (let ((new-err (copy-flycheck-error err)))
                              (setf (cl-struct-slot-value 'flycheck-error 'buffer new-err)
                                    buffer)
                              (setf (cl-struct-slot-value 'flycheck-error 'line new-err)
                                    (+ (flycheck-error-line new-err)
                                       offset -1))
                              (setf (cl-struct-slot-value 'flycheck-error '-end-line new-err)
                                    (+ (flycheck-error-end-line new-err)
                                       offset -1))
                              new-err))
                          errors))))))))

(defun my-flycheck-grammalecte-setup ()
  "Build the flycheck checker, matching your taste."
  (interactive)
  (unless (grammalecte--version)
    (advice-add 'grammalecte-download-grammalecte :after-while
                #'flycheck-grammalecte--retry-setup))
  (grammalecte--augment-pythonpath-if-needed)
  (flycheck-define-generic-checker 'my-grammalecte-narrowed
    "Report Grammalecte errors, but only for the narrowed section."
    :start #'my-flycheck-grammalecte-buffer
    :modes flycheck-grammalecte-enabled-modes
    :predicate (lambda ()
                 (if (functionp flycheck-grammalecte-predicate)
                     (funcall flycheck-grammalecte-predicate)
                   t))
    :enabled #'grammalecte--version
    :verify #'flycheck-grammalecte--verify-setup)
  (setf (flycheck-checker-get 'my-grammalecte-narrowed 'error-patterns)
        (seq-map (lambda (p)
                   (cons (flycheck-rx-to-string `(and ,@(cdr p))
                                                'no-group)
                         (car p)))
                 flycheck-grammalecte--error-patterns))
  (add-to-list 'flycheck-checkers 'my-grammalecte-narrowed)
  (flycheck-grammalecte--patch-flycheck-mode-map))

After I use my-flycheck-grammalecte-setup, I can use flycheck-select-checker to select my-grammalecte-narrowed and then use flycheck-buffer to run it. Then it will underline all the number/gender agreement issues I usually have. It's nice that I can practise editing my text with this script before I run the text through an LLM (also via flycheck) for feedback on wording.

2026-01-30_22-20-20.png
Figure 1: Screenshot of grammalecte providing grammar feedback
This is part of my Emacs configuration.
View org source for this post

Emacs Carnival February 2026: Completion

| stream, emacs

For the Emacs Carnival theme for February, let's learn more about completion together. There are all sorts of cheesy puns one can make about completion and Emacs and Valentine's Day, like "You complete me," but beyond the jokes, it's actually a really good topic to help us work with Emacs more efficiently.

First, what's the Emacs Carnival?

From Christian Tietze:

A blog carnival is a fun way to tie together a community with shared writing prompts, and marvel at all the creative interpretations of the topic of the month.

You can get a sense of previous Emacs Carnivals by checking out the previous ones:

Month Host Topic
June 2025 ctietze "Take Two"
July gnewman "Writing Experience"
August takeonrules "Your Elevator Pitch for Emacs"
September rodiongoritskov "Obscure packages"
October AndyDrop "Maintenance, server or home or garden"
November donaldh "An ode to org-babel"
December GeorgeJones "The People of Emacs"
January 2026 ctietze "This year, I'll…"

You don't have to be an expert in order to post. In fact, this is a great way for all of us (beginners and otherwise) to focus on a topic together. Let's treat it like a kind of book club where we can share our notes as we learn.

What do we mean by completion in Emacs?

Completion can make it faster to enter text and to reduce errors. You can use it to find Emacs commands even if you don't know their full names or keyboard shortcuts. You can use it to expand abbreviations or even fix the typos you usually make. You can use it when you code and when you write. I've heard some people define common abbreviations across different programming languages so they don't have to remember the differences between syntaxes, and minibuffer-completion-based interfaces like consult-ripgrep let you flip through search results astoundingly quickly.

Let's start by talking about two types of completion:

  • minibuffer completion, which happens in the small window at the bottom of the screen whenever you use M-x, find a file, etc. This is where you can type a little and then find matching options so that you don't have to remember the full names of commands or files. For lots of tips, check out Understanding Minibuffer Completion - Mastering Emacs.

    For example, here's my minibuffer for M-x using vertico for the display and marginalia for annotations on the side:

    2026-01-30_12-44-23.png
    Figure 1: Screenshot of minibuffer completion
  • in-buffer completion, like when you expand an abbreviation, insert a snippet, or fill in the rest of a variable name.

    2026-01-30_14-17-45.png
    Figure 2: Screenshot of in-buffer completion

Here are some ideas for things to explore. Pick an idea or come up with your own and write a post sharing what you're figuring out!

  • Minibuffer completion
    • Do you know about S-M-x (execute-extended-command-for-buffer - available with Emacs 28.1 or higher), which suggests commands relevant to the current mode?
    • Have you gotten the hang of using M-p to go back through your history? (Did you know you can interactively search through that history with C-s and C-r?)
    • Do you know about using M-n to go into the future history?
    • Have you tried saving your minibuffer history with savehist?
    • Do you want to experiment with recursive minibuffers so that you can do something else in the middle of a completion?
    • Do you have nicer completion set up, like icomplete-vertical-mode, fido-mode or fido-vertical-mode, ido-mode or ido-vertical-mode, ivy, or vertico? This makes things like M-x (execute-extended-command) and M-y (yank-pop) soo much nicer!
    • Have you experimented with other completion styles like orderless so that you can type parts of the completion name in any order?
    • Have you checked out the convenient search and navigation commands in more complex completion frameworks like consult, counsel, or helm?
    • Have you experimented with other sort orders like the built-in historical option or more complex sorts with prescient.el?
    • Do you want to see additional information when you're choosing completions? Try out marginalia.
    • Have you checked out embark for doing other things with your completion like inserting a file name instead of opening it, or changing the command that you wanted to do, or acting on multiple items?
    • If you use Org Mode, do you want to make your own custom Org link type with completion? (I really like being able to quickly link to blog posts, parts of my config, or project files with completion)
    • Do you want to define your own completion commands, maybe even with previews, dynamic collections or asynchronous data?
  • In-buffer completion
  • Meta: What else can you bring into Emacs so that you can take advantage of all the completions that you've set up, like note-taking or e-mail? (Ex: mastodon.el + org-contacts + a little code to insert a Mastodon handle with completion = I can think of people by name instead of by handle!)

Things I want to learn about

For example, this month, I want to…

  • Minibuffer:
    • Figure out some kind of approximate speech-based minibuffer completion for commands
    • Create a custom Org Mode link type for emacswiki and other things I refer to frequently
    • Write about the completion functions I'm using to help me learn French
  • In-buffer completion:
    • Notice where I keep typing the same kinds of things and define more snippets for them
    • Borrow ideas from other people's snippets: yasnippet-snippets (css, elisp, js, python); friendly-snippets (VS Code)
    • Share my snippets in a repository
    • Figure out some kind of speech interface for expanding snippets
    • Sort out completion in programming buffers so that I can finally take advantage of LSP
    • Complete French words in-buffer ignoring accented characters
  • Organize tons of completion-related links from Emacs News onto EmacsWiki: Category Completion and other pages
  • Revisit the completion-related code in my config to dust off things that I can update, remember to use, or document with gif-screencast

I'll publish my notes on my blog and I'll add them to this post as well. I'd love to check out your notes too!

How to submit your entry/entries

Please e-mail me at sacha@sachachua.com or DM me via Mastodon with a link to your post(s) by February 28 so that I can add them to this post. I'm happy to link to multiple posts. For example, here are some things you might like to write about:

  • what you're thinking of figuring out (in case other people have suggestions)
  • your notes along the way
  • your current setup
  • things you're particularly proud of

Looking forward to hearing from you!

View org source for this post

La semaine du 19 janvier au 25 javier 2026

| french

Lundi, le dix-neuf janvier

Ma fille s'est levée juste à temps pour l'école. Elle a dit qu'elle était fatiguée et n'a pas voulu y aller. Je l'ai câlinée et j'ai fait la lessive. Cette fois, j'ai mis un minuteur pour penser à suivre notre routine pendant la pause déjeuner. J'ai revu mon journal avec l'aide de quelques nouvelles fonctions qui utilisent Spookfox pour communiquer avec Mozilla Firefox, envoyer mes brouillons à Google Gemini et afficher les résultats au format Org Mode dans Emacs. J'ai aussi étudié les points de prononciation du rendez-vous précédent avec l'aide de la synthèse vocale et de la reconnaissance vocale en continu. Petit à petit, je m'améliore.

Ma fille a manqué les cours de l'après-midi. D'une part, je me suis inquiétée parce qu'elle pourrait développer de mauvaises habitudes. D'autre part, au moins, elle est dans un endroit sûr au lieu de faire l'école buissonnière, de réprimer ses pensées pendant qu'elle est assise en classe, ou de faire des bêtises. Certaines familles préfèrent l'école à temps partiel pour adapter le système à leurs besoins plutôt que l'inverse, ou même ne rien faire de formel du tout. Je comprends qu'elle ait voulu quelque chose de différent. C'est difficile de rester assise et d'écouter un cours qui se déroule si lentement. Je ne sais pas si j'en serais capable, alors je ne peux pas la contraindre. Je lui ai déjà demandé des choses difficiles, par exemple de porter un masque dans les espaces publics fermés.

Je pense que mon premier objectif est de l'élever pour qu'elle puisse explorer le monde par elle-même, y compris choisir ses propres objectifs, planifier et concrétiser ses idées, et évaluer les résultats. En revanche, je veux la soutenir jusqu'à ce qu'elle y parvienne. Si ce n'est pas une question de santé ou de sécurité, je veux la laisser décider autant que possible, particulièrement quand elle le veut vraiment. C'est normal qu'elle ait envie de plus d'indépendance à l'adolescence. La quête d'indépendance pourrait impliquer de rejeter les décisions ou les conseils des parents. Nous n'en sommes pas encore là, donc je dois m'y préparer en resserrant les liens entre nous. Quand elle se retrouve dans une situation qui serait peut-être trop difficile à gérer toute seule, elle saura au plus profond d'elle-même que nous sommes toujours là pour elle. Elle est généralement raisonnable. Mon but n'est pas de lui faire la leçon. Ce n'est même pas de lui poser des questions pour qu'elle réfléchisse, ce qui pourrait être perçu comme un interrogatoire. Mes sous-objectifs consistent peut-être à lui assurer une base solide (la nourriture, les câlins et ainsi de suite). Je peux aussi partager ce que j'apprends dans ma propre vie en discutant avec elle si elle est curieuse. Si elle n'est ni curieuse ni prête, je peux lui laisser des notes.

Bon, je l'ai emmenée à son cours de gymnastique, et nous avons joué à Pokémon Go dans un nouveau quartier. Il faisait très froid. Mon vélo cargo n'a pas bien fonctionné sur le chemin du retour. Au début, mon écran refusait de se connecter. Puis il s'est connecté, mais je n'ai pas pu changer de vitesse. Heureusement, j'étais bloquée sur une vitesse moyenne et les pistes étaient gérables. Débrancher et rebrancher l'écran a finalement résolu le problème.

Mon mari a trouvé une boîte de rouleaux de printemps faits maison au congélateur. Il les a préparés avec notre fille.

Je commence un brouillon en français :

Mardi, le vingt janvier

J'ai évalué quelques modèles et serveurs pour la reconnaissance vocale. J'ai trouvé que le serveur Speaches avec le modèle faster-whisper-base est plus rapide que ma configuration précédente. J'ai aussi essayé le mode continu de Speaches, mais les résultats sont mauvais. Peut-être que mon ordinateur n'a pas assez de puissance pour ça, ou peut-être que j'ai juste besoin de le configurer correctement.

Pendant la pause déjeuner, ma fille a joué à Minecraft Education. Elle a appris un peu de Python. Pendant qu'elle jouait, j'ai continué mon jeu de Pokémon. J'ai terminé la Forêt de Jade et j'ai vaincu le champion d'arène d'Argenta, qui était facile à battre avec mon Carapuce.

J'ai discuté des distorsions cognitives et des perspectives différentes avec ma thérapeute. J'ai aussi discuté des limites, que je trouve un peu difficiles à gérer avec ma fille. Mes limites avec d'autres personnes sont peut-être trop rigides, et il faut que j'apprenne à demander de l'aide. Mes limites avec ma fille sont peut-être trop perméables, et il faut que j'apprenne à négocier ou parfois faire de moi une priorité.

Pour le souper, ma fille a préparé du Kraft Dinner aux saucisses. Elle a trouvé qu'elle préférait la marque Annie plutôt que la marque KD.

La météo a annoncé de la neige demain. Nous avons décidé qu'il valait mieux faire les courses aujourd'hui avant les intempéries de demain parce que la neige rendra la marche difficile.

J'ai réessayé les exercices d'écoute et de parole sur Google Translate. Étonnamment, j'ai réussi. Peut-être que je peux m'entraîner avec ça chaque jour. C'est gratuit.

À l'heure du coucher, ma fille et moi avons lu à tour de rôle. J'ai été impressionnée par sa lecture. Elle peut lire de manière expressive et sans problème.

Mercredi, le vingt-et-un janvier

L'école virtuelle avait une remplaçante aujourd'hui, donc ma fille n'a pas voulu participer à cause des problèmes techniques et à cause des bêtises de ses camarades. Cette fois, elle nous a vraiment demandé si elle pouvait sécher, ce qui est… un progrès, je suppose? Je me souviens quand il y a un remplaçant, le rythme est souvent trop lent et ma fille pense que c'est une perte de temps. Bon, j'ai essayé de considérer l'école comme un des outils pour l'apprentissage et en ce moment comme une expérience de l'autodétermination. Elle s'est assise sur mes genoux pendant qu'elle travaillait sur ses devoirs, ce qui est probablement plus qu'elle aurait accompli si elle était assise en classe de mauvaise humeur.

J'ai mis à jour mon logiciel pour renouveler les livres que nous avons empruntés à la bibliothèque. Je n'ai pas pu réécrire certaines fonctions parce que je n'ai pas de livres qui attendaient à la bibliothèque. Cette fonction est en attente. Pour le moment, mon logiciel peut encore afficher un rapport des livres qui doivent être rendus.

Malgré la neige, j'ai emmené ma fille à la patinoire pour patiner avec ses amies. Sa nouvelle nourrice est venue au Canada depuis peu et n'a pas ses propres patins, donc j'aidais les enfants avec leurs patins et leurs casques, même si personne ne savait comment attacher la grille du casque. Cette amie a 5 ans et c'était sa première fois à la patinoire, donc je voulais être très très prudente. J'ai même demandé à l'homme qui jouait au hockey de l'autre côté, mais il ne savait pas non plus. Après une brève consultation avec la mère de son amie, j'ai attaché son casque mais j'ai laissé la grille pendre. Je l'ai aidée à tenir un support et je la guidais pendant que ma fille et son autre amie jouaient ensemble. Heureusement, j'ai apporté du chocolat chaud et beaucoup de chauffe-mains, parce que ses amies et leur nourrice avaient froid. Nous les avons accompagnées près de chez elles parce que ma poussette était très utile pour apporter leurs patins, casques, et sacs. Ma fille et son amie discutaient en route, mais après s'être quittées, elle a dit qu'elle était surstimulée. C'est possible que les intérêts de ma fille et de cette amie aient divergé. Ma fille espère trouver une amie qui aime parler de Pokemon, Star Wars, Minecraft, ou KPop Demon Hunters au lieu de se vanter de ses affaires ou de leurs autres amies, et qui préfère aussi une conversation calme au lieu de bavarder sans cesse. C'est la vie, on passe à autre chose.

Après avoir poussé la poussette dans tant de neige, j'étais très fatiguée. Ma fille a dit qu'elle voulait une journée tranquille demain, et j'ai totalement approuvé.

Avant de faire son pain, mon mari a préchauffé le four en faisant des biscuits au chocolat. C'était une très bonne idée.

Jeudi, le vingt-deux janvier

J'étais encore fatiguée quand je me suis levée à cause de l'effort hier. À cause de mon manque d'énergie, il faut choisir soigneusement mes tâches.

  • Je dois rendre les livres cet après-midi parce que la météo annonce qu'il fera très froid demain.
  • Ma fille est allée à l'école en ligne sans petit-déjeuner, donc je dois préparer sa collation pour qu'elle puisse manger sur le pouce pendant la récré.
  • J'entraîne une bénévole pour l'infolettre de Bike Brigade, donc je dois organiser ses éléments dans le brouillon pour qu'elle puisse voir le processus.

J'ai rendu les livres en retard et j'ai emprunté beaucoup de livres pour ma fille pour les prochains jours à la maison. J'ai aussi joué un peu à Pokémon Go en chemin. Mon mari a joué à Pokémon Émeraude sur sa Game Boy Advance à l'extérieur grâce à ses boutons physiques, qui pouvaient être utilisés malgré les gants. Il était emmitouflé dans des couvertures et profitait du soleil.

J'ai mis à jour des données pour mon client. Je ne veux pas travailler aujourd'hui, donc j'ai laissé de côté les autres tâches.

Au lieu de travailler, j'ai revu mon journal en français et créé une fonction pour sauter à la prochaine correction de l'IA. Pour le moment, j'affiche le commentaire en bas de la fenêtre. Je voudrais l'afficher près du curseur (peut-être via un popup) et souligner toutes les corrections pour revoir plus facilement.

Nous avons joué à Pokémon Go en faisant les courses. Nous avons suivi une route qui commence près de la maison, et nous avons attrapé beaucoup de nouveaux Pokémon. Nous sommes allés dans un parc plus loin. Nous avons vaincu trois arènes ! Ça signifie que nous avons pu laisser nos Pokémon là-bas jusqu'à ce que nos Pokémon soient vaincus ou qu'ils ne manquent de motivation. Ça nous fera gagner des PokéCoins, ce qui nous permettra d'augmenter nos inventaires plus tard. Ma fille avait suffisamment d'énergie pour marcher plus, donc après le retour de mon mari, ma fille et moi sommes allées au parc à proximité pour activer davantage de PokéStops et collecter plus d'objets. Comme il va faire très froid ces prochains jours, si elle veut jouer à l'extérieur aujourd'hui, je suis contente de l'accompagner.

Pour le souper, j'ai préparé une tourte au poulet avec de la pâte brisée que j'avais préparée hier soir. Ma fille m'a aidée à couper les ingrédients. Elle a aussi préparé sa collation pour l'école demain. Mon mari a préparé une salade romaine. On s'est régalés. Malheureusement, ma fille a laissé tomber son petit bol fait à la main et il s'est cassé. C'est la vie. Heureusement, elle avait fait beaucoup de petits bols grâce à son intérêt pour la poterie.

Vendredi, le vingt-trois janvier

J'ai réussi à donner envie à ma fille de se lever avec un pain au chocolat pour le petit-déjeuner, donc elle a eu du temps avant l'école.

J'ai copié la mauvaise clé de la diffusion en direct, donc j'ai été un peu en retard pour mon événement. Ce n'était pas grave. En tout cas, c'était gratuit. J'ai modifié ma fonction pour la reconnaissance vocale pour qu'elle insère le résultat au point que j'avais sélectionné. C'est même possible d'insérer à plusieurs points si je veux. J'ai aussi créé une fonction pour mettre les enregistrements en file d'attente pour la reconnaissance vocale et insérer au fur et à mesure les résultats.

Le coordinateur du cours de patinage m'a appelé pour dire que le cours de dimanche est annulé à cause du temps très froid.

Ma fille était enrhumée et malade. J'ai une petite inquiétude parce que son amie qui était venue chez nous commençait à éternuer à l'intérieur, mais c'était trop tard pour changer le plan. J'avais pensé que nos masques avaient peut-être suffi. J'étais un peu enrhumée, donc je vais faire un test rapide de COVID demain parce qu'elle déteste ça. C'est le bon moment pour hiberner. On doit persévérer.

Samedi, le vingt-quatre janvier

Ma fille a continué à se sentir malade, avec un mal de gorge et des éternuements. J'ai préparé de la bouillie de riz et elle l'a mangée. Elle a regardé Le Retour de Mary Poppins. J'ai effectué un test COVID, qui s'est avéré négatif. Il faut beaucoup de repos et de câlins. J'ai fait chauffer de l'eau au citron et au miel. Il faisait moins quinze degrés, très froid.

J'ai modifié mon logiciel pour transformer l'infolettre de Bike Brigade pour qu'il puisse traiter les émojis dans les textes. J'ai aussi mis à jour mon logiciel de recherche de livres sur le site de la bibliothèque.

Pour le souper, j'ai encore préparé de la bouillie de riz parce que j'aime ça quand je suis malade.

Une réflexion sur les limites :

Mes limites avec ma fille sont peut-être trop perméables. Voici quelques points de friction occasionnels.

  • Surstimulation à cause du chant ou du bavardage
  • Temps ou énergie, par exemple si elle veut passer du temps avec moi et que je suis préoccupée ou fatiguée
  • Mentalement, à cause des interruptions ou des demandes, ou aussi si je fais de ses problèmes les miens
  • Émotionnellement, par exemple si elle est en colère et veut me faire mal
  • Physiquement, par exemple si elle se blottit contre moi, ce qui m'empêche de taper sur l'ordinateur ou de bien dormir; ou si elle est en colère et me pousse

Quelles seraient les meilleures limites ?

  • Avant de me sentir surstimulée, je peux lui demander d'être un peu plus tranquille.
  • Pour le temps, je peux mettre un minuteur.
  • Mentalement, la plupart de mes tâches peuvent être mises de côté. Elle veut passer du temps avec moi, c'est génial et je sais que ce temps passe rapidement. Quant à ses problèmes… Il est difficile pour la plupart des parents de voir que leurs enfants sont en difficulté. Mais si j'essaie de résoudre ses problèmes à sa place (par exemple, son ennui à l'école), en fait ça revient à dire qu'elle ne peut pas les résoudre toute seule. Le moment idéal pour apprendre à résoudre des problèmes est celui où les problèmes sont petits.
  • Émotionnellement ou physiquement : si elle est en colère, il n'y a pas grand-chose que je puisse faire. Elle peut se calmer dans sa chambre ou bien je peux me calmer dans ma chambre. Il est important que ma fille apprenne qu'elle doit gérer ses propres émotions.

Le fait de fixer de meilleures limites nous aidera parce que j'aurai plus d'énergie et je serai plus heureuse, et elle sera plus compétente dans la vie et dans les interactions.

Mais c'est un peu difficile pour moi parce que je pense souvent pouvoir m'adapter, et le temps file. Elle grandira bientôt. Je doute aussi parfois de connaître la bonne voie.

J'ai mis en pratique le maintien de mes limites. Elle a fini par se fatiguer en regardant la télévision, donc elle a voulu jouer à un jeu de société avec moi. Mais je n'ai pas voulu jouer aux jeux qu'elle proposait parce qu'ils demandaient trop de concentration. De son côté, elle n'a pas voulu jouer aux jeux que je proposais parce qu'ils étaient trop simples. J'ai aussi voulu finir de modifier mon logiciel pour l'infolettre. J'ai mis un minuteur pour une demi-heure et je suis allée au sous-sol pour y travailler. Elle m'a demandé un câlin. J'ai dit que je n'étais pas libre mais que je pourrais lui faire un câlin après avoir fini mon travail. Elle est remontée à l'étage et s'est amusée. Comme promis, après avoir fini, je lui ai fait un câlin pendant qu'elle regardait la télévision. J'ai proposé de jouer avec elle, mais à ce moment-là, elle n'a pas voulu jouer. C'est la vie. Nous avons regardé la télévision ensemble.

Concernant mes limites avec les autres, je pense qu'en ce moment, je voudrais devenir plus prudente au lieu de faire confiance aux autres. C'est vrai que c'est facile de ressentir ça quand on est malade. Si j'avais eu une machine à remonter le temps, je n'aurais pas invité son amie. Les moments plus optimistes me manquent, mais on en est là. Peut-être qu'un jour, se voir en vrai sera plus facile, mais pour l'instant, il faudra se contenter d'être en ligne ou à l'extérieur.

Dimanche, le vingt-cinq janvier

Nous continuons d'être malades, mais je pense que ma fille va mieux. Mon mari et moi portons des masques dans les pièces communes chez nous pour réduire les risques. Nous y sommes habitués. La fois où mon mari a eu le COVID, ma fille et moi avons réussi à l'éviter.

J'ai créé des fonctions pour corriger la grammaire en français sous Emacs avec flyspell combiné à gptel (pour le modèle d'IA openai/gpt-oss-120b sur groq.com) ou à Spookfox (pour l'interface web gratuite de Google Gemini). Je pense que les résultats de Gemini sont meilleurs que ceux d'OpenAI/gpt-oss-120b, mais l'utilisation d'OpenAI/gpt-oss-120b présente aussi un avantage, car je n'ai pas besoin d'appuyer sur une touche une fois le résultat prêt. Comme j'apprends le français, je ne veux pas qu'Emacs réécrive mon texte automatiquement. Je veux souligner les erreurs, afficher les explications et les corriger moi-même.

À cause du froid extrême et de l'énorme quantité de neige, le cours de patinage de ma fille a été annulé, donc elle est restée une vraie pantouflarde toute la journée. Malgré la neige, je suis sortie pour déneiger. Il valait mieux le faire quand la neige était légère. J'ai déneigé nos allées, la terrasse, le porche, les marches et les trottoirs même jusqu'à la rue d'à côté parce que des voisins ne déneigent pas souvent bien les leurs. Chaque fois que je finissais le travail, il tombait davantage de neige, donc je recommençais. Deux heures ! La neige continuait à tomber. Je tournais toujours en rond. On dirait que rien n'a été déneigé du tout. Nous manquons d'espace pour entasser la neige dans la cour avant. Heureusement, la cour arrière a plus d'espace, donc je peux transporter la neige avec une luge jusqu'au jardin arrière si c'est nécessaire. En tout cas, c'est un bon exercice. Une fois que je suis rentrée, mon mari est sorti et a aussi déneigé.

Ma sœur qui habite aux Pays-Bas m'a appelée parce que Donjons et Dragons intéressait l'une de ses filles et elle se demande si ma fille veut y jouer avec elles et avec notre autre sœur qui était souvent la meneuse de jeu quand nous étions plus jeunes. Je pense que c'est une bonne occasion de créer des liens entre les cousines. Nous allons organiser une partie. Ma sœur a aussi apprécié le discours du Premier ministre du Canada, Mark Carney, à Davos. Elle pense que c'est un bon modèle pour sa fille qui subit du harcèlement à l'école.

Prononciation

Extrait de La semaine du 12 janvier au 18 janvier:

  • Petit à petit, je m'améliore. (mah mee lee orh /​a.me.ljɔʁ/)
  • elle est dans un endroit (ehn draw /​ɑ̃.dʁwa/​) sûr au lieu de faire l'école buissonnière
  • je veux la laisser décider autant que possible, particulièrement quand elle le veut (veu) vraiment.
  • C'est normal qu'elle ait envie de plus d'indépendance (dein day pehn dense) à l'adolescence.
  • partager mes idées et mon travail peut (peuh /​pø/​) aider d'autres personnes et lancer des conversations.
  • écrire davantage en français et améliorer mon environnement (ahn vee rohn mahn /​ɑ̃.vi.ʁɔn.mɑ̃/​) à cet effet
  • J'apprécie la stimulation mentale (mehn tahl /​mɑ̃.tal/​) d'écrire dans une autre langue. Beaucoup de gens apprennent (ah prenne) d'autres langues, donc nous pouvons nous aider.
  • j'ai vaincu (vahn ku /​vɛ̃.ky/​) le champion d'arène d'Argenta
  • donc ma fille (fee /​fij/​) n'a pas voulu participer
  • Pour le moment, mon logiciel peut encore afficher un rapport des livres qui (kee /​ki/​) doivent être rendus.
  • Ma fille a dit qu'elle voulait une journée tranquille (tran keel /​tʁɑ̃.kil/​) demain, et j'ai totalement approuvé.
  • J'entraîne (jen traine /​ɑ̃.tʁɛn/​) une bénévole pour l'infolettre de Bike Brigade,
  • j'ai emprunté beaucoup de livres pour ma fille (fee /​fij/​) pour les prochains jours à la maison.
  • J'ai mis à jour (meez a jour /​mi.za.ʒuʁ/​) des données pour mon client.
  • Ma fille a continué à se sentir malade, avec un mal de gorge (hard g /​ɡɔʁʒ/​) et des éternuements.
  • Avant de me sentir surstimulée, je peux (peuh /​pø/​) lui demander d'être un peu (peuh /​pø/​) plus tranquille.
View org source for this post

Using Silero voice activity detection to automatically queue multiple transcriptions with natrys/whisper.el

| audio, speech-recognition, emacs

I can queue multiple transcriptions with whisper.el so that they get processed sequentially with backup audio. It catches up when I pause to think. Now I want to use Silero voice activity detection to do that kind of segmentation for me automatically.

First, I need a Python server that can print out events when it notices the start or stop of a speech segment. If I print out the timestamps, I might be able to cross-reference it someday with interestingthings. For now, even just paying attention to the end of a segment is enough for what I want to do.

Python script for printing out events
import sounddevice as sd
import numpy as np
import torch
import sys
from datetime import datetime, timedelta

SILENCE_DURATION = 500
SAMPLING_RATE = 16000
CHUNK_SIZE = 512
model, utils = torch.hub.load(repo_or_dir='snakers4/silero-vad',
                              model='silero_vad',
                              force_reload=False)

(get_speech_timestamps, save_audio, read_audio, VADIterator, collect_chunks) = utils
vad_iterator = VADIterator(model, threshold=0.5, min_silence_duration_ms=SILENCE_DURATION)

stream_start_time = None

def format_iso_with_offset(offset_seconds):
    if stream_start_time is None:
        return "PENDING"
    event_time = stream_start_time + timedelta(seconds=offset_seconds)
    return event_time.astimezone().isoformat(timespec='milliseconds')

def audio_callback(indata, frames, time, status):
    global stream_start_time
    if status:
        print(status, file=sys.stderr)
    if stream_start_time is None:
        stream_start_time = datetime.now()
    tensor_input = torch.from_numpy(indata.copy()).flatten()
    speech_dict = vad_iterator(tensor_input, return_seconds=True)
    if speech_dict:
        if "start" in speech_dict:
            print(f"START {format_iso_with_offset(speech_dict['start'])}", flush=True)
        if "end" in speech_dict:
            print(f"END {format_iso_with_offset(speech_dict['end'])}", flush=True)
try:
    with sd.InputStream(samplerate=SAMPLING_RATE,
                        channels=1,
                        callback=audio_callback,
                        blocksize=CHUNK_SIZE):
        while True:
            pass
except KeyboardInterrupt:
    print("\nStopping...")

Then I can start this process from Emacs:

(defvar my-vad-events-process nil)
(defvar my-vad-events-dir "~/proj/speech/")
(defvar my-vad-events-command `(,(expand-file-name ".venv/bin/python" my-vad-events-dir)
                                "vad-events.py"))

(defun my-vad-events-filter (proc string)
  (when (and (string-match "^END" string)
             (process-live-p whisper--recording-process))
    (message "Noticed speech turn: %s" string)
    (my-whisper-continue)))

(defun my-vad-events-ensure ()
  "Start the process if it's not already running."
  (interactive)
  (unless (process-live-p my-vad-events-process)
    (let ((default-directory my-vad-events-dir)
          (process-environment
           (cons
            (format
             "PULSE_PROP=node.description='%s' media.name='%s' node.name='%s'"
             "vad" "vad" "vad")
            process-environment)))
      (setq my-vad-events-process
            (make-process
             :name "vad-events"
             :command my-vad-events-command
             :buffer (get-buffer-create "*vad-events*")
             :stderr (get-buffer-create "*vad-events-err*")
             :filter #'my-vad-events-filter)))))

Because I added Pulse properties to the process environment, I can easily use epwgraph to rewire the input so that it gets the input from my VirtualMicSink instead of the default system audio device. (Someday I'll figure out how to specify that as the input automatically.)

Now I can press my shortcut for my-whisper-continue to start the process. As I keep talking, it will continue to record. When I pause for more than a second between sentences, then it will send that chunk to the server for transcription without me having to press another button, while still listening for more speech.

How is this different from the streaming approach that many real-time speech recognition services offer? I think this gives me a bit more visibility into and control of the process. For my personal use, I don't need to have everything processed as quickly as possible, and I'm not trying to replicate live captions. I just want to be able to look back over the last five minutes to try to remember what I was talking about. I usually have a lot of quiet time as I think through my next steps, and it's fine to have it catch up then. I also like that I can save time-stamped audio files for later processing, divided according to the speech segments. Those might be a little bit easier to work with when I get around to compositing them into a video.

This is part of my Emacs configuration.
View org source for this post

Emacs: This year, I will... / Cette année, je vais...

| emacs
In English

Inspired by the Emacs Carnival theme for January, this year, I will:

  • take more notes, perhaps with the help of speech recognition
    • Now I can manage my time better since the kiddo can study more independently, but I still have to manage interruptions from my life and from my own brain. If I write or dictate notes while I think or work, I can get back into things more easily. Speech recognition allows me to capture more thoughts, even if the results need a fair bit of reviewing and revising. I'm looking forward to checking out the ideas others have shared, such as configuring more transient.el interfaces and adding more tweaks to my Org Mode publishing.
  • stream to think out loud
    • My daily routines are gradually becoming more predictable, so I might be able to schedule streams or jump onto one to share ideas. If I do a live broadcast, I can learn from the questions and comments I get. Fridays at 10:30 AM seems like a good time for that, and when possible, I can also do it spontaneously.
  • record videos to share what I learn, and package my functions to make them reusable when possible
    • Like the previous points, sharing my ideas and my work can help others and start conversations. If I improve subed-record.el to combine video and audio recordings with screenshots and subtitles, I might be able to create videos more easily.
  • write more in French and improve my environment for this purpose
    • I like the mental stimulation of writing in another language. Lots of other people are learning languages too, so we might be able to help each other. For example, my functions for highlighting new words and grammatical errors could be useful.
  • practice speaking by making audio recordings with the help of subed-record and speech synthesis to improve my pronunciation
    • The advantage of implementing this in Emacs is that I can customize my workflow. For example, I want to write my draft and then record the audio sentence by sentence after listening to an example. I also want to see if I can more easily edit a recording of my session with my tutor so that I can keep only my last pronunciation attempts.
  • improve processes for EmacsConf and Emacs News
    • I might be able to organize much of it by myself, but other volunteers might also be able to help, which would be even better. I want to create the infrastructure to manage several virtual meetings simultaneously, probably with speech recognition, audio spatialization, and lots of keyboard shortcuts. I also want to improve my subtitling process.

The more I do in Emacs, the more I think of ideas for improvement…

En français

Sur le thème du Carnaval d'Emacs pour janvier - Cette année, je vais :

  • prendre plus de notes, peut-être avec l'aide de la reconnaissance vocale
    • Même si je peux mieux gérer mon temps maintenant que ma fille peut étudier de manière plus indépendante, je dois toujours gérer les interruptions de ma vie et de mon propre cerveau. Si j'écris ou dicte des notes pendant que je pense ou que je travaille, je reprendrai le fil de mes pensées plus facilement. La reconnaissance vocale me permet de capter plus de pensées, même si les résultats nécessitent de revoir et de réviser. Je suis enthousiasmée par les idées que d'autres partagent, comme la configuration de l'interface transient.el et l'amélioration de la publication d'Org Mode.
  • streamer pour réfléchir à voix haute
    • Mes routines quotidiennes deviennent plus prévisibles petit à petit, je peux donc planifier des événements ou me lancer dans le streaming pour partager des idées. Si je fais une diffusion en direct, je peux profiter des questions et des commentaires que je reçois. Le vendredi à 10h30 semble être un bon moment pour ça, et quand c'est possible, je peux aussi le faire spontanément.
  • enregistrer des vidéos pour partager ce que j'apprends, et packager mes fonctions pour les rendre réutilisables quand c'est possible
    • Comme les éléments précédents, partager mes idées et mon travail peut aider d'autres personnes et lancer des conversations. Si j'améliore subed-record.el pour combiner des enregistrements vidéo et audio avec des captures d'écran et des sous-titres, je peux créer des vidéos plus facilement.
  • écrire davantage en français et améliorer mon environnement à cet effet
    • J'apprécie la stimulation mentale d'écrire dans une autre langue. Beaucoup de gens apprennent d'autres langues, donc nous pouvons nous aider. Par exemple, mes fonctions pour surligner les nouveaux mots et les erreurs grammaticales pourraient être utiles.
  • pratiquer l'expression orale en faisant des enregistrements audio avec l'aide de subed-record et la synthèse vocale pour améliorer ma prononciation
    • L'avantage de l'implémentation dans Emacs est que je peux personnaliser mon flux de travail. Par exemple, je veux écrire mon brouillon, puis enregistrer l'audio phrase par phrase après l'avoir écouté. Je veux aussi modifier un enregistrement de mon rendez-vous avec ma tutrice pour que je garde seulement mes dernières essaies de prononciation.
  • améliorer les processus pour EmacsConf et Emacs News
    • Il se peut que je puisse l'organiser en grande partie par moi-même, mais il se peut aussi que d'autres bénévoles m'aident, ce qui serait encore mieux. Je veux créer l'infrastructure pour gérer plusieurs réunions virtuelles simultanément, probablement grâce à la reconnaissance vocale, la spatialisation audio, et de nombreux raccourcis clavier. Je veux aussi améliorer mon processus de sous-titrage.

Plus j'en fais dans Emacs, plus je pense à des idées d'amélioration…

Thanks to Christian Tietze for hosting!

View org source for this post

2026-01-26 Emacs news

| emacs, emacs-news
View org source for this post