Emacs Carnival Feb 2026 wrap-up: Completion

| emacs

Check out all the wonderful entries people sent in for the Emacs Carnival Feb 2026 theme of Completion:

Also, this one about completing the loop:

Sometimes I miss things, so if you wrote something and you don't see it here, please let me know! Please e-mail me at sacha@sachachua.com or DM me via Mastodon with a link to your post(s). If you like the idea but didn't get something together in time for February, it's never too late. Even if you come across this years later, feel free to write about the topic if it inspires you. I'd love to include a link to your notes in Emacs News.

I added a ton of links from the Emacs News archives to the Resources and Ideas section, so check those out too.

I had a lot of fun learning together with everyone. I already have a couple of ideas for March's Emacs Carnival theme of Mistakes and Misconceptions (thanks to Philip Kaludercic for hosting!), and I can't wait to see what people will come up with next!

View Org source for this post

Using speech recognition for on-the-fly translations in Emacs and faking in-buffer completion for the results

| audio, speech-recognition, emacs, speech

When I'm writing a journal entry in French, I sometimes want to translate a phrase that I can't look up word by word using a dictionary. Instead of switching to a browser, I can use an Emacs function to prompt me for text and either insert or display the translation. The plz library makes HTTP requests slightly neater.

(defun my-french-en-to-fr (text &optional display-only)
  (interactive (list (read-string "Text: ") current-prefix-arg))
  (let* ((url "https://translation.googleapis.com/language/translate/v2")
         (params `(("key" . ,(getenv "GOOGLE_API_KEY"))
                   ("q" . ,text)
                   ("source" . "en")
                   ("target" . "fr")
                   ("format" . "text")))
         (query-string (mapconcat
                        (lambda (pair)
                          (format "%s=%s"
                                  (url-hexify-string (car pair))
                                  (url-hexify-string (cdr pair))))
                        params
                        "&"))
         (full-url (concat url "?" query-string)))
    (let* ((response (plz 'get full-url :as #'json-read))
           (data (alist-get 'data response))
           (translations (alist-get 'translations data))
           (first-translation (car translations))
           (translated-text (alist-get 'translatedText first-translation)))
      (when (called-interactively-p 'any)
        (if display-only
            (message "%s" translated-text)
          (insert translated-text)))
      translated-text)))

I think it would be even nicer if I could use speech synthesis, so I can keep it a little more separate from my typing thoughts. I want to be able to say "Okay, translate …" or "Okay, … in French" to get a translation. I've been using my fork of natrys/whisper.el for speech recognition in English, and I like it a lot. By adding a function to whisper-after-transcription-hook, I can modify the intermediate results before they're inserted into the buffer.

(defun my-whisper-translate ()
  (goto-char (point-min))
  (let ((case-fold-search t))
    (when (re-search-forward "okay[,\\.]? translate[,\\.]? \\(.+\\)\\|okay[,\\.]? \\(.+?\\) in French" nil t)
      (let* ((s (or (match-string 1) (match-string 2)))
             (translation (save-match-data (my-french-en-to-fr s))))
        (replace-match
         (propertize translation
                     'type-hint translation
                     'help-echo s))))))

(with-eval-after-load 'whisper
  (add-hook 'whisper-after-transcription-hook 'my-whisper-translate 70))

But that's too easy. I want to actually type things myself so that I get more practice. Something like an autocomplete suggestion would be handy as a way of showing me a hint at the cursor. The usual completion-at-point functions are too eager to insert things if there's only one candidate, so we'll just fake it with an overlay. This code works only with my whisper.el fork because it supports using a list of functions for whisper-insert-text-at-point.

(defun my-whisper-maybe-type-with-hints (text)
  "Add this function to `whisper-insert-text-at-point'."
  (let ((hint (and text (org-find-text-property-in-string 'type-hint text))))
    (if hint
        (progn
          (my-type-with-hint hint)
          nil)
      text)))

(defvar-local my-practice-overlay nil)
(defvar-local my-practice-target nil)
(defvar-local my-practice-start nil)

(defun my-practice-cleanup ()
  "Remove the overlay and stop monitoring."
  (when (overlayp my-practice-overlay)
    (delete-overlay my-practice-overlay))
  (setq my-practice-overlay nil
        my-practice-target nil
        my-practice-start nil)
  (remove-hook 'post-command-hook #'my-practice-monitor t))

(defun my-practice-monitor ()
  "Updates hint or cancels."
  (let* ((pos (point))
         (input (buffer-substring-no-properties my-practice-start pos))
         (input-len (length input))
         (target-len (length my-practice-target)))
    (cond
     ((or (< pos my-practice-start)
          (> pos (+ my-practice-start target-len))
          (string-match "[\n\t]" input)
          (string= input my-practice-target))
      (my-practice-cleanup))
     ((string-prefix-p (downcase input) (downcase my-practice-target))
      (let ((remaining (substring my-practice-target input-len)))
        (move-overlay my-practice-overlay pos pos)
        (overlay-put my-practice-overlay 'after-string
                     (propertize remaining 'face 'shadow))))
     (t                                 ; typo
      (move-overlay my-practice-overlay pos pos)
      (overlay-put my-practice-overlay 'after-string
                   (propertize (substring my-practice-target input-len) 'face 'error))))))

(defun my-type-with-hint (string)
  "Show hints for STRING."
  (interactive "sString to practice: ")
  (my-practice-cleanup)
  (setq-local my-practice-target string)
  (setq-local my-practice-start (point))
  (setq-local my-practice-overlay (make-overlay (point) (point) nil t t))
  (overlay-put my-practice-overlay 'after-string (propertize string 'face 'shadow))
  (add-hook 'post-command-hook #'my-practice-monitor nil t))

Here's a demonstration of me saying "Okay, this is a test, in French.":

Screencast of using speech recognition to translate into French and provide a hint when typing

Since we're faking in-buffer completion here, maybe we can still get away with considering this as an entry for Emacs Carnival February 2026: Completion ? =)

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

Emacs completion and handling accented characters with orderless

| emacs

I like using the orderless completion package for Emacs because it allows me to specify different parts of a completion candidate than any order I want. Because I'm learning French, I want commands like consult-line (which uses minibuffer completion) and completion-at-point (which uses in-buffer completion) to also match candidates where the words might have accented characters. For example, instead of having to type "utilisé" with the accented é, I want to type "utilise" and have it match both "utilise" and "utilisé".

(defvar my-orderless-accent-replacements
  '(("a" . "[aàáâãäå]")
    ("e" . "[eèéêë]")
    ("i" . "[iìíîï]")
    ("o" . "[oòóôõöœ]")
    ("u" . "[uùúûü]")
    ("c" . "[cç]")
    ("n" . "[nñ]"))) ; in case anyone needs ñ for Spanish

(defun my-orderless-accent-dispatch (pattern &rest _)
  (seq-reduce
   (lambda (prev val)
     (replace-regexp-in-string (car val) (cdr val) prev))
   my-orderless-accent-replacements
   pattern))

(use-package orderless
  :custom
  (completion-styles '(orderless basic))
  (completion-category-overrides '((file (styles basic partial-completion))))
  (orderless-style-dispatchers '(my-orderless-accent-dispatch orderless-affix-dispatch)))
2026-02-26_15-06-59.png
Figure 1: Screenshot of consult-line showing matching against accented characters
2026-02-26_15-08-34.png
Figure 2: Screenshot of completion-at-point matching "fev" with "février"

This is an entry for Emacs Carnival February 2026: Completion.

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

IndieWeb Carnival February 2026: Intersecting interests

| life
In English

This month, the theme for the IndieWeb Carnival is "Converging Interests." It might actually be easier to list which of my interests don't converge. My interests often overlap. I'll start with a description of my main interests and how they're linked.

Programming is generally useful. I'm particularly interested in automation and cognitive and physical aids like voice interfaces. I love Emacs. It's ostensibly a text editor, but I've tinkered with it to such an extent that I use it for almost everything: managing my notes and tasks, of course, but even recording and editing audio files and organizing my drawings.

Writing helps me think, remember, and share. Org Mode in Emacs allows me to use the technique of literate programming, which combines explaining and coding. Some ideas are easier to think about and express through drawing, which allows me to explore them non-linearly. My drawings apply to all my interests, such as parenting, technology, learning, and planning. Sketchnoting is a great way to learn many things, share my notes, and remember specific moments. For example, my daughter is eager to finish a visual summary we developed together, which was possible because I had written many notes in the web journal I developed and in my French journal.

I've been learning French for the past 4 months, and that also touches various aspects of my daily life. I help my daughter with school, I try to use AI, I tinker with my tools, I watch shows, and I look up words related to my interests. For instance, I updated my handwriting font to include accented letters. This combined drawing, programming, and naturally, learning French. I also modified my writing environment in Emacs to look up words in the dictionary and display AI feedback. I particularly enjoy exploring learning techniques with my daughter, such as flashcards and stories following the principle of comprehensible input. Which methods are effective against which challenges, and how can we make the most of available technology? What we learn will help us across all subjects.

Similarly, learning the piano helps me appreciate the challenge and pleasure of making progress. It's also a good way to help my daughter learn it as well.

Since my life is filled with intertwining interests, it is important to manage my attention despite many distracting temptations, such as programming new tools. I might start a task and then find myself doing something completely different after a series of small, totally logical steps. You know how it goes—one thing leads to another. So I have to write my notes as I go. There is no rush and few of my tasks are urgent, so when I lose my train of thought, I can laugh and look for it again. If I write and share these notes, someone might find them even years later and remind me of them. It is very difficult to choose a moment to stop exploring and to publish my notes. The temptation is always to keep following a new idea.

Fortunately, the cumulative effect of hobbies that complement each other encourages me to grow, and when I am blocked in one direction, one or two other paths usually open up. Speaking of directions, I find it difficult to write when I want to introduce two or more simultaneous streams of ideas because writing is so linear. Still, it's better to write even if it's a bit disjointed.

I think speech recognition helps me capture more ideas, and I'm looking forward to how advances in technology can help me make them happen. I can also get better by learning and linking new curiosities to my other curiosities. I look forward to seeing what kinds of things are possible.

Although I have several hours of freedom now that my daughter can do many things herself, there's always more that I want to learn. Intertwined hobbies thrive, while isolated hobbies are forgotten. For example, I no longer play Stardew Valley since my daughter doesn't play it anymore. It’s a fun game, but if I'm choosing what to spend my time on, I prefer activities that serve multiple goals goals simultaneously. The garden of my interests is not formal and orderly, but rather natural and tangled.

My daughter also has many interests. One year she was interested in Rubik's Cubes and other puzzles; this year she's learning everything about Pokémon. The transience of her interests doesn't bother me. It all combines in unexpected ways. It will be interesting to see how she grows, and to see how I'll grow too.

Thanks to Zachary Kai for hosting the IndieWeb Carnival this month!

En français

Ce mois-ci, le thème du Carnaval IndieWeb est « Intérêts convergents. » C'est peut-être plus facile de lister lesquels de mes centres d'intérêt ne sont pas convergents. Mes centres d'intérêt se recoupent souvent. Je vais commencer par une description de mes premiers intérêts et des façons dont ils sont liés.

La programmation est généralement utile. Je suis particulièrement intéressée par l'automatisation et les aides cognitives et physiques comme l'interface vocale. J'adore Emacs, qui est un éditeur de texte, mais je le bricole à tel point que je l'utilise pour presque tout : gérer mes notes et mes tâches, bien sûr, mais même enregistrer et éditer des fichiers audio et organiser mes dessins.

L'écriture m'aide à penser, à me remémorer et à partager. Org Mode sous Emacs me permet d'utiliser la technique de « programmation lettrée », qui est la combinaison de l'explication et de la programmation. Quelques idées sont plus faciles à penser et à exprimer par le dessin, lequel me permet de les explorer non linéairement. Mes dessins s'appliquent aussi à tous mes centres d'intérêt, comme la parentalité, la technologie, l'apprentissage et la planification. Le sketchnoting est une bonne manière d'apprendre beaucoup de choses, de partager mes notes et de me souvenir de certains moments. Par exemple, ma fille a hâte de finir une synthèse visuelle que nous avons élaborée ensemble, et qui est possible parce que j'avais écrit beaucoup de notes dans le journal web que j'avais développé et dans mon journal en français.

L'apprentissage du français depuis 4 mois touche aussi divers aspects de ma vie quotidienne. J'aide ma fille à l'école, j'essaie d'utiliser l'IA, je bricole mes outils, je regarde des émissions, je cherche des mots pour mes centres d'intérêt. Par exemple, j'ai mis à jour la police de caractères de mon écriture pour inclure les lettres accentuées. Cela a associé le dessin, la programmation, et naturellement l'apprentissage du français. J'ai aussi modifié mon environnement d'écriture sous Emacs pour rechercher les mots dans le dictionnaire et pour afficher les commentaires de l'IA. J'aime particulièrement explorer des techniques d'apprentissage avec ma fille comme les cartes mémoire et les histoires qui suivent le principe de l'apport compréhensible. Quelles méthodes sont efficaces contre quels défis, et comment nous pouvons tirer le meilleur parti des technologies disponibles ? Ce que nous apprenons nous servira bien dans tous les sujets.

De la même manière, l'apprentissage du piano m'aide à apprécier le défi et le plaisir de progresser. Une autre raison de le faire est qu'il aide ma fille à l'apprendre aussi.

Comme ma vie est remplie d'intérêts qui s'entrelacent, c'est important de gérer mon attention face à plusieurs tentations de s'éparpiller, comme la programmation de nouvelles automatisations. Je commence peut-être une tâche et je me retrouve ensuite à faire une tâche complètement différente après une suite d'étapes logiques. On sait ce que c'est, de fil en aiguille. Donc je dois écrire mes notes au fur et à mesure. Rien ne me presse et peu de mes tâches sont urgentes, donc quand je perds le fil de mes pensées, je peux rire et le retrouver. Si j'écris et que je partage ces notes, quelqu'un peut les trouver même après plusieurs années et me les rappeler. C'est très difficile de choisir un moment où j'arrête d'explorer et où je publie mes notes. La tentation est toujours de continuer à suivre une nouvelle idée.

Heureusement, l'effet cumulatif de loisirs qui se complètent m'encourage à grandir, et quand je suis bloquée dans une direction, une ou deux autres pistes se sont ouvertes. En parlant de directions, je trouve que c'est difficile d'écrire quand je veux introduire deux ou plusieurs suites d'idées simultanées, à cause de la linéarité de l'écriture. De toute façon, c'est mieux d'écrire même si c'est un peu décousu.

Je pense que la reconnaissance vocale m'aide à saisir plus d'idées et les progrès technologiques m'aident à les exécuter. Je vais aussi m'améliorer en apprenant et en reliant de nouvelles curiosités à mes autres curiosités. J'ai hâte de voir quelles sortes de choses sont possibles.

Bien que j'aie plusieurs heures de liberté maintenant que ma fille est capable de faire beaucoup de choses elle-même, il y a toujours plus de choses que je veux apprendre. Les loisirs entrelacés se développent, tandis que les loisirs isolés sont oubliés. Par exemple, je ne joue plus à Stardew Valley maintenant que ma fille n'y joue plus. C'est un jeu amusant, mais si je peux choisir un passe-temps, j'en préfère un qui serve des objectifs multiples simultanés. Le jardin de mes intérêts n'est pas formel et ordonné, mais plutôt naturel et entremêlé.

Ma fille a aussi beaucoup de centres d'intérêt. Une année elle s'est intéressée au Cube de Rubik et aux autres casse-têtes, une autre année elle apprenait tout sur Pokémon. Ça ne me dérange pas, tout se combine de façons inattendues. Ce sera intéressant de voir comment elle grandira, et moi aussi.

Merci à Zachary Kai d'accueillir le Carnaval IndieWeb ce mois-ci !

View Org source for this post

Sorting completion candidates, such as sorting Org headings by level

| emacs, org

: Made the code even neater with :key, included the old code as well

At this week's Emacs Berlin meetup, someone wanted to know how to change the order of completion candidates. Specifically, they wanted to list the top level Org Mode headings before the second level headings and so on. They were using org-ql to navigate Org headings, but since org-ql sorts its candidates by the number of matches according to the code in the org-ql-completing-read function, I wasn't quite sure how to get it to do what they wanted. (And I realized my org-ql setup was broken, so I couldn't fiddle with it live. Edit: Turns out I needed to update the peg package) Instead, I showed folks consult-org-heading which is part of the Consult package, which I like to use to jump around the headings in a single Org file. It's a short function that's easy to use as a starting point for something custom.

Here's some code that allows you to use consult-org-heading to jump to an Org heading in the current file with completions sorted by level.

(with-eval-after-load 'consult-org
  (advice-add
   #'consult-org--headings
   :filter-return
   (lambda (candidates)
     (sort candidates
           :key (lambda (o) (car (get-text-property 0 'consult-org--heading o)))))))
2026-02-26_13-42-58.png
Figure 1: Screenshot showing where the candidates transition from top-level headings to second-level headings

My previous approach defined a different function based on consult-org-heading, but using the advice feels a little cleaner because it will also make it work for any other function that uses consult-org--headings. I've included the old code in case you're curious. Here, we don't modify the function's behaviour using advice, we just make a new function (my-consult-org-heading) that calls another function that processes the results a little (my-consult-org--headings).

Old code, if you're curious
(defun my-consult-org--headings (prefix match scope &rest skip)
  (let ((candidates (consult-org--headings prefix match scope)))
    (sort candidates
          :lessp
          (lambda (a b)
            (let ((level-a (car (get-text-property 0 'consult-org--heading a)))
                  (level-b (car (get-text-property 0 'consult-org--heading b))))
              (cond
               ((< level-a level-b) t)
               ((< level-b level-a) nil)
               ((string< a b) t)
               ((string< b a) nil)))))))

(defun my-consult-org-heading (&optional match scope)
  "Jump to an Org heading.

MATCH and SCOPE are as in `org-map-entries' and determine which
entries are offered.  By default, all entries of the current
buffer are offered."
  (interactive (unless (derived-mode-p #'org-mode)
                 (user-error "Must be called from an Org buffer")))
  (let ((prefix (not (memq scope '(nil tree region region-start-level file)))))
    (consult--read
     (consult--slow-operation "Collecting headings..."
       (or (my-consult-org--headings prefix match scope)
           (user-error "No headings")))
     :prompt "Go to heading: "
     :category 'org-heading
     :sort nil
     :require-match t
     :history '(:input consult-org--history)
     :narrow (consult-org--narrow)
     :state (consult--jump-state)
     :annotate #'consult-org--annotate
     :group (and prefix #'consult-org--group)
     :lookup (apply-partially #'consult--lookup-prop 'org-marker))))

I also wanted to get this to work for C-u org-refile, which uses org-refile-get-location. This is a little trickier because the table of completion candidates is a list of cons cells that don't store the level, and it doesn't pass the metadata to completing-read to tell it not to re-sort the results. We'll just fake it by counting the number of "/", which is the path separator used if org-outline-path-complete-in-steps is set to nil.

(with-eval-after-load 'org
  (advice-add
   'org-refile-get-location
   :around
   (lambda (fn &rest args)
     (let ((completion-extra-properties
            '(:display-sort-function
              (lambda (candidates)
                (sort candidates
                      :key (lambda (s) (length (split-string s "/"))))))))
       (apply fn args)))))
2026-02-26_14-01-28.png
Figure 2: Screenshot of sorted refile entries

In general, if you would like completion candidates to be in a certain order, you can specify display-sort-function either by calling completing-read with a collection that's a lambda function instead of a table of completion candidates, or by overriding it with completion-category-overrides if there's a category you can use or completion-extra-properties if not.

Here's a short example of passing a lambda to a completion function (thanks to Manuel Uberti):

(defun mu-date-at-point (date)
  "Insert current DATE at point via `completing-read'."
  (interactive
   (let* ((formats '("%Y%m%d" "%F" "%Y%m%d%H%M" "%Y-%m-%dT%T"))
          (vals (mapcar #'format-time-string formats))
          (opts
           (lambda (string pred action)
             (if (eq action 'metadata)
                 '(metadata (display-sort-function . identity))
               (complete-with-action action vals string pred)))))
     (list (completing-read "Insert date: " opts nil t))))
  (insert date))

If you use consult--read from the Consult completion framework, there is a :sort property that you can set to either nil or your own function.

This entry is part of the Emacs Carnival for Feb 2026: Completion.

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

La semaine du 16 février au 22 février

| french

lundi 16 février

C'était le Jour de la famille, donc ma fille n'a pas eu école. Nous avons préparé des petits pains chinois au porc char siu. Cette fois, j'ai encore utilisé la recette pour les petits pains à la vapeur, mais j'ai laissé la pâte reposer plus longtemps. On s'est régalés.

Nous avons fait une promenade au parc pour jouer à Pokémon Go ensemble. Ma fille et moi avons coopéré pour battre deux arènes. Nous avons aussi attrapé beaucoup de Pokémon.

Ma fille et moi avons utilisé Claude IA pour générer des cartes mémoire pour apprendre la négation, les conjugaisons du verbe « avoir », et le vocabulaire sur la Saint-Valentin en lisant des phrases humoristiques sur les Pokémon et leurs dresseurs. Nous les avons apprises ensemble. Elle était plus amusée qu'en classe. Je pense que les cartes mémoire de l'IA seront une bonne manière d'apprendre le français si elle n'a pas la possibilité de les faire elle-même.

Comme elle a obtenu de bonnes notes et qu'elle gère bien ses propres responsabilités, je vais renouveler l'abonnement à Claude IA, qu'elle préfère pour générer des histoires interactives.

mardi 17 février

J'avais un rendez-vous avec mon tuteur pendant lequel nous avons commencé à corriger ma prononciation du texte de mon brouillon sur mon apprentissage du français. Les gens conseillent de ne pas s'inquiéter du son «r» mais que je dois travailler mes voyelles et mon rythme. Ça viendra ! Les commentaires de mon tuteur étaient immédiatement utiles. Grâce à sa correction de ma prononciation du mot « psychologique » (où il faut prononcer le « p » initial, qui est muet en anglais), après le rendez-vous, j'ai pu apprendre à ma fille la prononciation du nom « Psykokwak » qui est le Pokémon qui s'appelle Psyduck en anglais. Il était sur une des cartes mémoire hier soir. Après le rendez-vous, j'ai mis à jour mon article et mes enregistrements.

Ma fille m'a dit qu'elle avait atteint un score parfait aux questions sur la négation et les conjugaisons du verbe avoir. Bravo ! L'apprentissage du français nous donne plusieurs occasions de discuter des manières d'apprendre, ce qui est plus utile que des mots spécifiques.

Il faisait beau l'après-midi, donc je me suis assise dehors et j'ai bricolé mon smartphone pour faciliter le basculement entre le dictionnaire et Orgzly Revived en utilisant Tasker pour configurer un raccourci clavier. J'ai finalement trouvé une façon de changer le correcteur automatique de l'anglais au français sur l'application Google Docs. Il fallait utiliser l'interface web pour configurer la langue, car cette option n'est pas dans l'application mobile. L'écran de l'iPad est meilleur que celui de mon smartphone, donc si je peux l'utiliser sur le porche quand il fera beau, je pense que je vais l'apprécier ce printemps.

Après l'école, il y avait de la brume. J'ai essayé de convaincre ma fille de sortir, mais elle a traîné des pieds. Ce n'était pas grave. Je suis allée me promener seule.

mercredi 18 février

J'ai mis à jour la police de caractères qui est créée à partir de mon écriture. Je l'ai créée il y a 6 ans et je l'utilise pour les titres sur mon site pour ajouter une touche personnelle. Maintenant que j'apprends le français, de temps en temps, ces titres sont en français. Jusqu'à présent, les lettres accentuées étaient affichées dans une police de secours. J'ai dépoussiéré mes notes, j'ai dessiné de nouvelles lettres sur mon iPad, je les ai séparées en glyphes que j'ai importés dans FontForge via Python, et j'ai copié des informations sur le crénage d'autres lettres. Le processus a pris un peu de temps parce que la bibliothèque libxml2 était obsolète et j'ai dû la remplacer par lxml. J'ai aussi dû mettre à jour mon logiciel pour convertir les lettres accentuées en noms de glyphes, parce que mon ancien code partait du principe que toutes les lettres étaient simples. J'étais ravie d'avoir réussi. Le résultat a toujours besoin d'être amélioré, mais c'est acceptable pour le moment.

Pour le déjeuner, j'ai préparé des toasts au fromage.

J'ai ajouté une commande vocale pour traduire rapidement du français en anglais quand je dis « okay, translate … ». Elle insère le résultat pour l'instant, mais ce serait peut-être mieux si je l'affichais comme une suggestion de saisie pour me forcer à taper moi-même.

C'est une bonne chose que ma fille ait son propre abonnement à Claude IA au lieu de le partager avec mon mari qui l'essayait aussi. Elle atteint toujours la limite car elle s'en sert pour combattre l'ennui pendant l'école virtuelle. Ce n'est pas un problème pour le moment parce qu'elle gère bien ses responsabilités.

Il faisait un temps de chien, avec la neige et la pluie verglaçante. Nos amis ont annulé leur événement, donc nous sommes volontiers restés à la maison. J'ai déneigé autour de la maison. La neige était très lourde, donc c'était un bon exercice.

Un brouillon pour le Carnaval IndieWeb

Ce mois-ci, le thème du Carnaval IndieWeb est « Intérêts convergents. » C'est peut-être plus facile de lister lesquels de mes centres d'intérêt ne sont pas convergents. Mes centres d'intérêt se recoupent souvent. Je vais commencer par une description de mes premiers intérêts et des façons dont ils sont liés.

La programmation est généralement utile. Je suis particulièrement intéressée par l'automatisation et les aides cognitives et physiques comme l'interface vocale. J'adore Emacs, qui est un éditeur de texte, mais je le bricole à tel point que je l'utilise pour presque tout : gérer mes notes et mes tâches, bien sûr, mais même enregistrer et éditer des fichiers audio et organiser mes dessins.

L'écriture m'aide à penser, à me remémorer et à partager. Org Mode sous Emacs me permet d'utiliser la technique de « programmation lettrée », qui est la combinaison de l'explication et de la programmation. Quelques idées sont plus faciles à penser et à exprimer par le dessin, lequel me permet de les explorer non linéairement. Mes dessins s'appliquent aussi à tous mes centres d'intérêt, comme la parentalité, la technologie, l'apprentissage et la planification. Le sketchnoting est une bonne manière d'apprendre beaucoup de choses, de partager mes notes et de me souvenir de certains moments. Par exemple, ma fille a hâte de finir une synthèse visuelle que nous avons élaborée ensemble, et qui est possible parce que j'avais écrit beaucoup de notes dans le journal web que j'avais développé et dans mon journal en français.

L'apprentissage du français depuis 4 mois touche aussi divers aspects de ma vie quotidienne. J'aide ma fille à l'école, j'essaie d'utiliser l'IA, je bricole mes outils, je regarde des émissions, je cherche des mots pour mes centres d'intérêt. Par exemple, j'ai mis à jour la police de caractères de mon écriture pour inclure les lettres accentuées. Cela a associé le dessin, la programmation, et naturellement l'apprentissage du français. J'ai aussi modifié mon environnement d'écriture sous Emacs pour rechercher les mots dans le dictionnaire et pour afficher les commentaires de l'IA. J'aime particulièrement explorer des techniques d'apprentissage avec ma fille comme les cartes mémoire et les histoires qui suivent le principe de l'apport compréhensible. Quelles méthodes sont efficaces contre quels défis, et comment nous pouvons tirer le meilleur parti des technologies disponibles ? Ce que nous apprenons nous servira bien dans tous les sujets.

De la même manière, l'apprentissage du piano m'aide à apprécier le défi et le plaisir de progresser. Une autre raison de le faire est qu'il aide ma fille à l'apprendre aussi.

Comme ma vie est remplie d'intérêts qui s'entrelacent, c'est important de gérer mon attention face à plusieurs tentations de s'éparpiller, comme la programmation de nouvelles automatisations. Je commence peut-être une tâche et je me retrouve ensuite à faire une tâche complètement différente après une suite d'étapes logiques. On sait ce que c'est, de fil en aiguille. Donc je dois écrire mes notes au fur et à mesure. Rien ne me presse et peu de mes tâches sont urgentes, donc quand je perds le fil de mes pensées, je peux rire et le retrouver. Si j'écris et que je partage ces notes, quelqu'un peut les trouver même après plusieurs années et me les rappeler. C'est très difficile de choisir un moment où j'arrête d'explorer et où je publie mes notes. La tentation est toujours de continuer à suivre une nouvelle idée.

Heureusement, l'effet cumulatif de loisirs qui se complètent m'encourage à grandir, et quand je suis bloquée dans une direction, une ou deux autres pistes se sont ouvertes. En parlant de directions, je trouve que c'est difficile d'écrire quand je veux introduire deux ou plusieurs suites d'idées simultanées, à cause de la linéarité de l'écriture. De toute façon, c'est mieux d'écrire même si c'est un peu décousu.

Je pense que la reconnaissance vocale m'aide à saisir plus d'idées et les progrès technologiques m'aident à les exécuter. Je vais aussi m'améliorer en apprenant et en reliant de nouvelles curiosités à mes autres curiosités. J'ai hâte de voir quelles sortes de choses sont possibles.

Bien que j'aie plusieurs heures de liberté maintenant que ma fille est capable de faire beaucoup de choses elle-même, il y a toujours plus de choses que je veux apprendre. Les loisirs entrelacés se développent, tandis que les loisirs isolés sont oubliés. Par exemple, je ne joue plus à Stardew Valley maintenant que ma fille n'y joue plus. C'est un jeu amusant, mais si je peux choisir un passe-temps, j'en préfère un qui serve des objectifs multiples simultanés. Le jardin de mes intérêts n'est pas formel et ordonné, mais plutôt naturel et entremêlé.

Ma fille a aussi beaucoup de centres d'intérêt. Une année elle s'est intéressée au Cube de Rubik et aux autres casse-têtes, une autre année elle apprenait tout sur Pokémon. Ça ne me dérange pas, tout se combine de façons inattendues. Ce sera intéressant de voir comment elle grandira, et moi aussi.

Merci à Zachary Kai d'accueillir le Carnaval IndieWeb ce mois-ci !

jeudi 19 février

J'ai rangé mes notes pour me préparer à envoyer les titres de mes tâches à l'IA avec mes entrées de journal et mes projets pour qu'elle me suggère d'autres ressources et des idées.

J'ai mis à jour les données pour mon client et j'ai envoyé ma facture.

Après la pause de l'après-midi, j'ai emmené ma fille chez LifeLabs pour un ECG et une prise de sang. Elle était si courageuse. Puis elle a acheté deux bols de nouilles instantanées : aux fruits de mer pour elle et au poulet pour moi. Mon habitude est d'acheter une petite friandise pour ma fille après les rendez-vous médicaux pour lui donner quelque chose qu'elle peut attendre avec impatience pendant un examen médical. Elle préférait le McDonalds, mais maintenant elle préfère les nouilles instantanées.

Pour le dîner, ma fille a préparé des boules de riz au saumon. C'était délicieux.

J'ai essayé la synthèse vocale Kokoro TTS avec un serveur FastAPI. Je la préfère à Google Traduction car elle paraît plus naturelle. Elle me permet de convertir le texte en phonèmes, ce qui est mieux que de convertir mot par mot en utilisant la base de données Lexique parce que Kokoro traite les liaisons. Kokoro génère des horodatages par mot pour l'anglais, mais pas encore pour le français. Ce n'est pas grave, je pense qu'après quelques mois, ce sera possible.

Je me demande quelle est la meilleure façon de tirer profit de mes rendez-vous avec mon tuteur. Je voudrais profiter de son expérience.

  • Nous pouvons continuer à corriger ma prononciation avec l'aide des enregistrements.
  • Nous pouvons commencer par des sons de base, puis des mots, puis des expressions, puis des phrases.
  • Il y a d'autres manières que je ne connais même pas. C'est un long voyage, je n'ai pas besoin de me dépêcher. Je suis heureuse d'essayer des façons variées pour découvrir celles qui sont bonnes pour moi (et peut-être pour ma fille).

vendredi 20 février

Je me suis couchée très tard hier soir. Au réveil, je ne trouvais plus mes lunettes. Heureusement, j'avais des paires de rechange dans un tiroir. Je les ai cherchées. Après une brève recherche, j'ai finalement retrouvé mes lunettes sur mon iPad sur l'étagère.

Pendant le rendez-vous avec mon tuteur, j'ai essayé des virelangues qu'il m'a donnés. Je me suis amusée. Le « r » est trop difficile pour l'instant, mais ça viendra un jour. Nous avons aussi corrigé des mots dans mon journal comme « suggérant » et « apprentissage ». J'ai découvert que mes horodatages n'étaient pas synchronisés avec les fichiers audio, donc j'ai lu mon journal à voix haute.

J'ai ajouté les transcriptions de l'API grâce à Kokoro TTS. Le «r» est toujours très difficile pour moi. Ça viendra un jour. Pour le moment, je vais travailler sur :

  • Maman peint un grand lapin blanc.
    {mamˈɑ̃ pˈɛ̃ œ̃ ɡʁˈɑ̃ lapˈɛ̃ blˈɑ̃.}
  • Un enfant intelligent mange lentement.
    {œ̃n ɑ̃fˈɑ̃ ɛ̃tɛliʒˈɑ̃ mˈɑ̃ʒ lɑ̃tmˈɑ̃.}
  • Le roi croit voir trois noix.
    {lə ʁwˈa kʁwˈa vwˈaʁ tʁwˈa nwˈa.}
  • Il est loin mais moins loin que ce coin.
    {il ɛ lwˌɛ̃ mɛ mwˈɛ̃ lwˌɛ̃ kə sə kwˈɛ̃.}
  • Le témoin voit le chemin loin.
    {lə temwˈɛ̃ vwˈa lə ʃəmˈɛ̃ lwˈɛ̃.}
  • Moins de foin au loin ce matin.
    {mwˈɛ̃ də fwˈɛ̃ o lwˌɛ̃ sə matˈɛ̃.}
  • La laine beige sèche près du collège.
    {la lˈɛn bˈɛʒ sˈɛʃ pʁɛ dy kɔlˈɛʒ.}
  • La croquette sèche dans l’assiette.
    {la kʁokˈɛt sˈɛʃ dɑ̃ lasjˈɛt.}
  • Elle mène son frère à l’hôtel.
    {ɛl mˈɛn sɔ̃ fʁˈɛʁ a lotˈɛl.}
  • Le verre vert est très clair.
    {lə vˈɛʁ vˈɛʁ ɛ tʁɛ klˈɛʁ.}
  • Elle aimait manger et rêver.
    {ɛl ɛmˈɛ mɑ̃ʒˈe e ʁɛvˈe.}
  • Le jeu bleu me plaît peu
    {lə ʒˈø blˈø mə plˈɛ pˈø}
  • Ce neveu veut un jeu.
    {sə nəvˈø vˈøt œ̃ ʒˈø. - Kokoro TTS utilise « vˈøt œ̃ » pour « veut un », mais Gemini et le tuteur dit que c'est « vˈø œ̃ » sans liaison.}
  • Le feu bleu est dangereux.
    {lə fˈø blˈø ɛ dɑ̃ʒʁˈø.}
  • Le cœur seul pleure doucement.
    {lə kˈœʁ sˈœl plˈœʁ dusmˈɑ̃.}
  • Le beurre fond dans le cœur chaud.
    {lə bˈœʁ fˈɔ̃ dɑ̃ lə kˈœʁ ʃˈo.}
  • Les fleurs de ma sœur sentent bon.
    {le flˈœʁ də ma sˈœʁ sˈɑ̃t bˈɔ̃.}
  • Tu es sûr du futur ? \\ ** {ty ɛ sˈyːʁ dy fytˈyʁ ?}
  • Un mur dur bloque la rue.
    {œ̃ mˈyʁ dˈyʁ blˈok la ʁˈy.}
  • OU / OÙ / OÛ:
    • Où sommes-nous, sous ce grand loup ?
      {u sˈɔmnˈu, su sə ɡʁˈɑ̃ lˈu ?}
  • Le hibou sait où il va.
    {lə ibˈu sˈɛ u il vˈa.} - Kokoro TTS utilise « sˈɛt u » pour « sait où », mais le tuteur a dit que « sˈɛ u » sans liaison.
  • O fermé (devant consonne):
    • L’homme fort mord la pomme.
      {lˈɔm fˈɔʁ mˈɔʁ la pˈɔm.}
    • Le sombre col tombe.
      {lə sˈɔ̃bʁ kˈɔl tˈɔ̃b.}
  • O ouvert / Ô / AU / EAU (fin de syllabe)
    • L’auto saute au trottoir chaud.
      {lotˈo sˈot o tʁɔtwˈaʁ ʃˈo.}
    • Le château d’en haut est beau.
      {lə ʃatˈo dɑ̃ ˈo ɛ bˈo.} - Raphael says no t; Kokoro included t liaison.

Il m'a conseillé de me concentrer sur :

  • IN / IM / AIN / EIN / UN vs AN / AM / EN / EM (lapin VS mange)
  • EU vs AI / EI / ÈGE / Ê / ETTE (Je VS laine)
  • U / Û vs OU / OÙ / OÛ (Tu VS Tout)

Kokoro TTS indique quelques liaisons, mais le tuteur et la synthèse vocale de Google Traduction sont en désaccord avec Kokoro. Je pense que je dois trouver une autre source pour les phonèmes.

Après le rendez-vous, je me suis concentrée sur la différence entre la durée attendue de mon fichier réassemblé et la durée réelle. J'ai modifié ma bibliothèque compile-media pour concaténer des résultats intermédiaires au lieu de traiter en une seule passe. Il y avait encore des bogues.

Il a plu aujourd'hui, donc nous sommes restés chez nous à l'exception de ma brève sortie pour rendre des livres à la bibliothèque.

Ma fille avait mal au dos. Je me demande si elle s'est trop étirée ou si elle avait une mauvaise posture en étant assise sur le canapé.

Nous avons ajouté quelques intérêts et des événements à notre bilan graphique de l'année de ma fille.

La bénévole qui est responsable de l'infolettre cette semaine a une urgence familiale, donc j'ai repris le rôle. C'est facile grâce à mes automatisations.

samedi 21 février

Ma fille a eu du mal à multiplier un nombre à deux chiffres par un nombre à un seul chiffre, peut-être parce qu'elle était occupée à découdre une couture sur sa jupe. Elle est partie en trombe.

Ma fille a reçu de belles fleurs de ses tantes pour son anniversaire. Elle a remarqué que les fleurs LEGO ressemblent beaucoup aux vraies fleurs. Maintenant, notre table a un total de trois vases de fleurs : deux LEGO et un vrai. Elle aime bien les fleurs.

Mon mari et moi avons discuté pour savoir si nous voulions l'ancien four dont son frère s'était débarrassé. D'un côté, cela nécessite de l'argent pour louer un fourgon et demande des efforts pour l'installer, et nous nous étions débrouillés avec seulement notre mini four. D'un autre côté, c'est probablement une bonne occasion pour nouer des liens.

Ma fille et moi avons fait les courses. Nous avons aussi attrapé un Abra Dynamax sur Pokémon Go. Elle a fait tomber un de mes écouteurs Bluetooth et il est tombé dans une flaque, mais heureusement, il fonctionne après avoir séché.

J'ai modifié ma bibliothèque compile-media pour remettre tous les horodatages de paquets audio. Maintenant, la durée du fichier audio final est précise, ce qui permet l'utilisation de MFA pour générer les horodatages par mot.

J'ai commencé à réfléchir à une interface d'analyse de ma prononciation des virelangues. Je veux voir les formes d'onde de l'audio dans un tableau pour faciliter le lancement et la comparaison.

Mon interface de Reddit a commencé à traduire automatiquement toutes les discussions et les commentaires en français. Bien ! Ça transforme mon scrolling en un entraînement à la compréhension.

Ma fille a voulu dessiner un arbre d'intérêts comme l'arbre de lecture que je lui avais fait quand elle apprenait à lire. Elle a fait une petite erreur. J'ai dit que tous les artistes le font, mais elle est devenue trop frustrée et elle est encore partie en trombe. La première fois que j'ai vérifié si elle allait bien, elle était toujours de mauvaise humeur. La deuxième fois, je n'ai fait que des sons du Pokémon Psykokwak. Elle s'est assez amusée à répondre par des sons de Psykokwak. Après un peu plus de détente, elle était prête à demander du ruban correcteur à mon mari. Je pense que le perfectionnisme est un défi pour ma fille.

dimanche 22 février

Ma fille a organisé une réunion virtuelle avec ses tantes et ses cousines. C'était sympa de converser avec elles.

Je me suis dépêchée d'emmener ma fille à son cours de patinage. Nous sommes arrivées un peu tard. Ils ont continué avec l'évaluation des compétences telles que le patinage en arrière. Je pense que ce n'était pas grave, mais j'aimerais vraiment que ma fille trouve un moyen de se préparer à partir plus vite.

Je me suis entraînée aux virelangues en français que mon tuteur m'a donnés. J'ai généré des modèles audio grâce à la synthèse vocale Kokoro, et j'ai ajouté des pauses avec FFmpeg. De cette façon, je peux essayer le virelangue pendant le silence. J'ai enregistré mes tentatives pour les écouter avec mon tuteur mardi, mais je n'en suis pas totalement satisfaite.

  • 00:00 Maman peint un grand lapin blanc.
  • 00:02 Un enfant intelligent mange lentement.
  • 00:05 Le roi croit voir trois noix.
  • 00:07 Il est loin mais moins loin que ce coin.
  • 00:09 Le témoin voit le chemin loin.
  • 00:11 Moins de foin au loin ce matin.
  • 00:14 La laine beige sèche près du collège.
  • 00:16 La croquette sèche dans l'assiette.
  • 00:18 Elle mène son frère à l'hôtel.
  • 00:20 Le verre vert est très clair.
  • 00:22 Elle aimait manger et rêver.
  • 00:24 Le jeu bleu me plaît peu.
  • 00:26 Ce neveu veut un jeu.
  • 00:27 Le feu bleu est dangereux.
  • 00:29 Le beurre fond dans le cœur chaud.
  • 00:31 Les fleurs de ma sœur sentent bon.
  • 00:33 Un mur dur bloque la rue.
  • 00:36 Le hibou sait où il va.
  • 00:37 L’homme fort mord la pomme.
  • 00:39 Le sombre col tombe.
  • 00:40 L’auto saute au trottoir chaud.
  • 00:43 Le château d’en haut est beau.
  • 00:45 Le cœur seul pleure doucement.

J'ai aussi emmené ma fille chez Sephora pour acheter quelque chose. Elle a choisi un étui pour son désinfectant pour les mains qu'elle peut décorer avec des breloques. Je pense que c'est un peu cher, mais elle peut choisir ce qu'elle veut acheter avec ses propres économies. Elle a voulu m'acheter quelque chose, donc j'ai suggéré des élastiques pour cheveux.

Mon mari a préparé beaucoup de petits gâteaux à l'ananas et à la betterave pour la fête d'anniversaire de ma fille mardi. Parce que notre mini four ne peut cuire que six petits gâteaux à la fois et que la recette utilise du bicarbonate de soude pour faire lever la pâte, car elle réagit une fois qu'il est mélangé, il pense que c'est mieux de diviser les ingrédients en deux lots avant de les mélanger. Il a préparé trois fournées de petits gâteaux et un gâteau.

View Org source for this post

2026-02-23 Emacs news

| emacs, emacs-news

: Added m-x.app examples, moved el-init to AI category, added retrospective link.

Org Mode is a big part of why I enjoy Emacs, so I'm delighted that there's a new release out (Org 9.8). Thanks to all who contributed! If you would like to help out, Ihor is looking for several volunteers who can try to reproduce bugs and do initial feedback on the new patches.

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