<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/assets/atom.xsl" type="text/xsl"?><feed
	xmlns="http://www.w3.org/2005/Atom"
	xmlns:thr="http://purl.org/syndication/thread/1.0"
	xml:lang="en-US"
	><title>Sacha Chua</title>
	<subtitle>Emacs, sketches, and life</subtitle>
	<link rel="self" type="application/atom+xml" href="https://sachachua.com/blog/feed/atom/index.xml" />
  <link rel="alternate" type="text/html" href="https://sachachua.comundefined" />
  <id>https://sachachua.com/blog/feed/atom/index.xml</id>
  <generator uri="https://11ty.dev">11ty</generator>
	<updated>2026-04-18T00:31:19Z</updated>
<entry>
		<title type="html">La semaine du 6 au 12 avril</title>
		<link rel="alternate" type="text/html" href="https://sachachua.com/blog/2026/04/la-semaine-du-6-au-12-avril/"/>
		<author><name><![CDATA[Sacha Chua]]></name></author>
		<updated>2026-04-18T00:31:19Z</updated>
    <published>2026-04-18T00:31:19Z</published>
    <category term="french" />
		<id>https://sachachua.com/blog/2026/04/la-semaine-du-6-au-12-avril/</id>
		<content type="html"><![CDATA[<div id="outline-container-org3c5be32" class="outline-3">
<h3 id="org3c5be32"><a href="https://sachachua.com/blog/feed/atom/index.xml#org3c5be32">lundi 6 avril</a></h3>
<div class="outline-text-3" id="text-org3c5be32">
<div class="media-post" id="org65723b9">
<p>
</p><div class="audio"><audio controls="1" preload="metadata" src="https://sachachua.com/blog/2026/04/la-semaine-du-6-au-12-avril/2026-04-06.opus?2026-04-17" type="audio/ogg"><a href="https://sachachua.com/blog/2026/04/la-semaine-du-6-au-12-avril/2026-04-06.opus">Download the audio</a></audio></div>
<p></p>

<p>
<span class="media-time" data-start="0.000">00:00:00</span> J'ai fait une diffusion en direct pendant que je catégorisais les liens dans mon bulletin d'information sur Emacs. Il y avait un problème parce que mes logiciels se sont battus pour l'appareil audio. Je suis passée de la catégorisation par commande vocale à celle par raccourci clavier, mais mon logiciel de détection d'activité vocale écoute toujours mon microphone. Quand un commentateur m'a informée du problème, j'ai quitté le programme, ce qui l'a résolu. J'ai aussi utilisé mon outil <a href="https://github.com/sachac/epwgraph">epwgraph</a> pour montrer les connexions audio, ce qui a intéressé quelques personnes.
</p>

<p>
<span class="media-time" data-start="57.000">00:00:57</span> Un commentateur m'a interrogée sur mon processus d'apprentissage du français sur Emacs. J'ai montré mon flux de travail pour écouter mes essais de prononciation.
</p>

<p>
<span class="media-time" data-start="76.000">00:01:16</span> J'ai essayé de configurer <code>which-key-display-prefix</code> sur <code>top</code> pour afficher le type de cible près du curseur. Je pense qu'il faut un petit correctif.
</p>

<p>
<span class="media-time" data-start="94.000">00:01:34</span> Ma fille et moi avons commencé une nouvelle instance de Cobblemon sur Minecraft. Maintenant nous en savons davantage sur Pokémon, donc c'était plus facile à comprendre qu'il y a quelques années. Le premier modpack que nous avons essayé, <a href="https://www.curseforge.com/minecraft/modpacks/bcg">BigChadPlus</a>, était trop compliqué pour nous. Nous sommes passées à <a href="https://modrinth.com/modpack/cobblemon-fabric">Cobblemon Official</a>. Nous nous sommes amusées en travaillant ensemble.
</p>

<p>
<span class="media-time" data-start="130.000">00:02:10</span> Pour la première fois, nous avons préparé des raviolis chinois à la soupe comme ceux que ma fille avait goûtés à la pâtisserie chinoise la semaine dernière. Nous avons utilisé les feuilles de gyoza pour gagner du temps, je les ai juste étalées pour les rendre plus plates. C'était vraiment délicieux.
</p>

</div>
</div>
</div>
<div id="outline-container-orgf890390" class="outline-3">
<h3 id="orgf890390"><a href="https://sachachua.com/blog/feed/atom/index.xml#orgf890390">mardi 7 avril</a></h3>
<div class="outline-text-3" id="text-orgf890390">
<div class="media-post" id="org1f26c33">
<p>
</p><div class="audio"><audio controls="1" preload="metadata" src="https://sachachua.com/blog/2026/04/la-semaine-du-6-au-12-avril/2026-04-07.opus?2026-04-17" type="audio/ogg"><a href="https://sachachua.com/blog/2026/04/la-semaine-du-6-au-12-avril/2026-04-07.opus">Download the audio</a></audio></div>
<p></p>

<p>
J'ai découvert que les fichiers journaux de gotosocial consomment beaucoup d'espace, donc je les ai effacés.
</p>

<p>
J'ai appelé ma mère pour l'informer de l'état de santé de ma sœur.
</p>

<p>
Ma fille et moi avons préparé des tartes aux œufs. Les fonds de tarte achetés en magasin n'étaient pas aussi bons que ceux que nous faisions avant, mais le supermarché proche ne proposait plus les moules à tarte en aluminium. Ils font l'affaire.
</p>

<p>
Ma fille m'a demandé de lire ensemble à voix haute un livre en tagalog.
</p>

<p>
Nous avons essayé le modpack <a href="https://modrinth.com/modpack/cobbleverse">Cobbleverse</a>, mais nous avons décidé de repasser au modpack <a href="https://modrinth.com/modpack/cobblemon-fabric">Cobblemon Official</a> parce que ma fille préfère la sensation plus vanilla de Cobblemon Official.
</p>

<p>
À l'heure du coucher, ma fille et moi avons discuté de l'IA. Il semble que son enseignant ait rappelé à la classe de ne pas utiliser l'IA pour faire leurs devoirs. Elle fait ses devoirs elle-même (quand elle les fait) car elle sait que la raison d'être de leurs devoirs ne concernent pas l'enseignant. Elle aime bien utiliser l'IA pour générer des histoires interactives à l'extérieur de l'école.
</p>

</div>
</div>
</div>
<div id="outline-container-orgce5d0c8" class="outline-3">
<h3 id="orgce5d0c8"><a href="https://sachachua.com/blog/feed/atom/index.xml#orgce5d0c8">mercredi 8 avril</a></h3>
<div class="outline-text-3" id="text-orgce5d0c8">
<p>
J'ai travaillé comme consultante. L'équipe va mettre à jour le système ce week-end, donc nous devons vérifier les snippets qui utilisent probablement les composants qui ont changé.
</p>

<p>
J'ai participé à l'OrgMeetup. Je n'ai pas progressé sur mon correctif pour l'opération « sentence-at-point » parce que mon attention est détournée.
</p>

<p>
J'ai emmené ma fille et son amie au parc pour jouer ensemble pendant une heure, ce qui permet à son père de préparer le dîner et de planifier des activités pour sa réunion scoute.
</p>

<p>
Ma fille a dit que l'école aurait un remplaçant, donc elle a négocié une alternative. Elle a trouvé que le cours était trop lent et ses camarades ont fait des bêtises, donc pour l'instant, c'est probablement une perte de temps.
</p>

<p>
J'ai déplacé le monde Cobblemon de mon ordinateur à notre serveur Minecraft pour permettre à ma fille de jouer là-bas indépendamment. J'ai aussi configuré des sauvegardes. Dans ce monde, nous sommes allées à un village et nous nous sommes établies là-bas, ce qui a énormément simplifié notre aventure grâce à la machine de soin Pokémon qui restaure toute la santé à chaque utilisation. Ma prochaine étape est de faire progresser mes Pokémon.
</p>
</div>
</div>
<div id="outline-container-org1bbd38b" class="outline-3">
<h3 id="org1bbd38b"><a href="https://sachachua.com/blog/feed/atom/index.xml#org1bbd38b">jeudi 9</a></h3>
<div class="outline-text-3" id="text-org1bbd38b">
<p>
J'ai fait une diffusion en direct pendant que je modifiais ma configuration d'Emacs. Je travaillais à externaliser mes fonctions pour aider d'autres gens à les copier, et j'ai redécouvert beaucoup de fonctions oubliées en cours de route.
</p>

<p>
L'école avait un remplaçant comme prévu. Heureusement, ma fille a eu un rendez-vous chez la médecin, donc elle a eu une excuse tout à fait légitime pour sécher les cours, au moins le matin. J'ai informé la médecin des symptômes récents et l'observation par Holter que ma fille vient de terminer. La médecin a recommandé de boire plus d'eau et de manger des kiwis pour la constipation.
</p>

<p>
Pour avoir enduré des examens comme la tension artérielle avec patience, j'ai acheté des nouilles instantanées pour ma fille et moi. Nous avons ajouté des gâteaux de poisson, des algues, et du bok choy pour enrichir la soupe.
</p>

<p>
Il faisait trop beau pour rester à l'intérieur, donc l'après-midi, mon mari, ma fille et moi sommes allés au KidSpark et au parc à vélo. Le système de présence de l'école permet de justifier l'absence pour cause de météo, mais je ne crois pas que ce soit ce que l'administration voulait vraiment dire&hellip; Mais il devait pleuvoir le lendemain et nous savions de toute façon qu'elle aurait beaucoup de mal à se concentrer. J'étais ravie que nous soyons sortis.
</p>

<p>
Au faux supermarché au KidSpark, ma fille et moi avons joué à notre jeu habituel où la cliente déclare avec confiance « Je voudrais acheter une pomme » pendant qu'elle présente un autre produit, comme une poire. La vendeuse dit « Non, ce n'est pas une pomme, c'est une poire. La pomme est rouge. » Puis la cliente cherche un autre produit qui satisfait la condition d'être rouge sans être une pomme, comme une fraise. Elle la présente avec la  déclaration triomphante « c'est une pomme ! », puis la vendeuse dit d'autres corrections, la cliente cherche d'autres produits, et ainsi de suite. À ma grande surprise, nous avons pu jouer à ce jeu avec beaucoup de mots en français, au moins de mon côté. C'est un bon exercice pour utiliser les adjectifs.
</p>

<p>
Elle était aussi curieuse du modèle de corps humain qu'elle a assemblé. Elle a mis l'estomac, les intestins, un rein, le foie, le cœur, et les poumons. Elle a aussi joué à la vétérinaire Pokémon.
</p>

<p>
Après avoir joué au KidSpark, ma fille a voulu aller au parc avec les grandes asperges - St. James Park. C'était à dix minutes à vélo du KidSpark. Elle a aimé glisser sur le très grand toboggan, ce qu'elle a fait de nombreuses fois.
</p>

<p>
Une fois rentrés, nous avons préparé des burgers et des frites pour faire encore un pique-nique sur la terrasse en bois.
</p>
</div>
</div>
<div id="outline-container-orgf78f4c2" class="outline-3">
<h3 id="orgf78f4c2"><a href="https://sachachua.com/blog/feed/atom/index.xml#orgf78f4c2">vendredi 10 avril</a></h3>
<div class="outline-text-3" id="text-orgf78f4c2">
<p>
L'école a encore une remplaçante aujourd'hui.  Je ne sais pas pourquoi l'école a des remplaçants si souvent. Peut-être que c'est normal ? Il y a deux ans, son enseignant était malade et était même à l'hôpital. L'année précédente, sa première enseignante a démissionné pour prendre soin de ses parents, et ses enseignantes étaient souvent malades. Quoi qu'il en soit, ma fille préfère travailler seule ou avec moi que de subir les problèmes technologiques et le bruit de ses camarades. Elle a terminé toutes les tâches de mathématiques, ce qui était très ennuyeux parce que les tâches étaient trop simples. Si elle travaille aussi sur ses devoirs de lecture à un moment donné, je pense que c'est totalement acceptable. Je voudrais qu'elle prenne la responsabilité de son éducation, ce qui signifie aussi que je dois la laisser décider du niveau d'effort qu'elle veut y consacrer.
</p>

<p>
Je lui ai dit que j'ai un rendez-vous avec mon tuteur l'après-midi, et en dehors de cela, je suis généralement disponible. La météo dit qu'il va pleuvoir, mais peut-être que l'après-midi sera juste nuageux. Je me demande si ses amies seront disponibles pour jouer.
</p>

<p>
Lors de mon dernier cours de français, mon tuteur a dit que ma prononciation des virelangues était presque acceptable. Je me demande quelle serait la meilleure façon de progresser. Mon attention était détournée par Emacs récemment, mais je reconsacre du temps à l'écriture de mon journal en français. Néanmoins, je n'ai pas consacré de temps à regarder des émissions ou à lire des articles ou des histoires en français, ce qui est nécessaire pour enrichir mon vocabulaire. Mon premier but consiste à aider ma fille à apprendre la langue, ce qui avance bien. Elle s'amuse en utilisant des mots français et nous chantons des chansons de K-Pop Demon Hunters et de Pokémon en français. Je continue à aimer écrire mon journal. Peut-être que je peux repasser à l'enregistrement de mon journal à voix haute pour pratiquer la prononciation indépendamment, avec une vérification par mon tuteur pour la prononciation et l'utilisation de mots. On verra bien !
</p>

<p>
Ma fille était fâchée contre moi parce qu'elle sentait que je l'avais oubliée.
</p>
</div>
</div>
<div id="outline-container-orgdac2a97" class="outline-3">
<h3 id="orgdac2a97"><a href="https://sachachua.com/blog/feed/atom/index.xml#orgdac2a97">samedi 11</a></h3>
<div class="outline-text-3" id="text-orgdac2a97">
<p>
Ma fille a séché son cours de bijoux parce qu'elle avait l'impression que je la pressais. Elle s'est assise dans sa chambre. Je suis allée prendre de ses nouvelles, puis j'ai jardiné. Finalement, ma fille est revenue et m'a rejointe. Nous avons amendé la terre avec du fumier et nous avons planté des radis, de la laitue, et des épinards. Ce printemps, je n'ai pas commencé de semis de tomates. Au lieu de cela, je vais acheter des semis au magasin quand il fera plus chaud.
</p>

<p>
J'ai emmené ma fille au Biidaasige Park pour jouer avec les tyroliennes. Elle s'est amusée, mais elle n'aimait pas quand d'autres enfants fixaient son œil du regard. Elle a trouvé que ses lunettes de soleil étaient pratiques.
</p>
</div>
</div>
<div id="outline-container-orgca37914" class="outline-3">
<h3 id="orgca37914"><a href="https://sachachua.com/blog/feed/atom/index.xml#orgca37914">dimanche 12</a></h3>
<div class="outline-text-3" id="text-orgca37914">
<p>
Nous avons fait du vélo jusqu'au Big Carrot, mais la soupe miso que nous cherchions n'était pas là-bas.
</p>

<p>
Ma fille et moi avons fait un menu d'activités comme jouer avec de la mousse à raser. Elle aime bien les jeux sensoriels.
</p>

<p>
Ma fille et moi avons joué à Stardew Valley. Nous avons commencé une nouvelle ferme car notre ancienne ferme était trop compliquée. Ça fait longtemps que nous n'y avons pas joué. Nous devons réapprendre toutes les choses.
</p>
</div>
</div>
<div><a href="https://sachachua.com/blog/2026/04/la-semaine-du-6-au-12-avril/index.org">View Org source for this post</a></div><p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2026%2F04%2Fla-semaine-du-6-au-12-avril%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></content>
		</entry><entry>
		<title type="html">Create a Google Calendar event from an Org Mode timestamp</title>
		<link rel="alternate" type="text/html" href="https://sachachua.com/blog/2026/04/create-a-google-calendar-event-from-an-org-mode-timestamp/"/>
		<author><name><![CDATA[Sacha Chua]]></name></author>
		<updated>2026-04-17T13:26:41Z</updated>
    <published>2026-04-17T13:26:41Z</published>
    <category term="org" />
<category term="emacs" />
		<id>https://sachachua.com/blog/2026/04/create-a-google-calendar-event-from-an-org-mode-timestamp/</id>
		<content type="html"><![CDATA[<p>
Time zones are hard, so I let calendaring systems take care of the conversion and confirmation. I've been using Google Calendar because it synchronizes with my phone and people know what to do with the event invite.
<a href="https://orgmode.org/manual/iCalendar-Export.html">Org Mode has iCalendar export</a>, but I sometimes have a hard time getting .ics files into Google Calendar on my laptop, so I might as well just create the calendar entry in Google Calendar directly. Well. Emacs is a lot more fun than Google Calendar, so I'd rather create the calendar entry from Emacs and put it into Google Calendar.
</p>

<p>
This function lets me start from a timestamp like <code>[2026-04-24 Fri 10:30]</code> (inserted with <code>C-u C-c C-!</code>, or <code>org-timestamp-inactive</code>) and create an event based on a template.
</p>


<div class="org-src-container">
<pre class="src src-emacs-lisp"><code>(<span class="org-keyword">defvar</span> <span class="org-variable-name">sacha-time-zone</span> <span class="org-string">"America/Toronto"</span> <span class="org-doc">"Full name of time zone."</span>)

<span class="org-comment-delimiter">;;;</span><span class="org-comment">###</span><span class="org-comment"><span class="org-warning">autoload</span></span>
(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-emacs-chat-schedule</span> (<span class="org-type">&amp;optional</span> time)
  <span class="org-doc">"Create a Google Calendar invite based on TIME or the Org timestamp at point."</span>
  (<span class="org-keyword">interactive</span> (list (sacha-org-time-at-point)))
  (browse-url
   (format
    <span class="org-string">"https://calendar.google.com/calendar/render?action=TEMPLATE&amp;text=%s&amp;details=%s&amp;dates=%s&amp;ctz=%s"</span>
    (url-hexify-string sacha-emacs-chat-title)
    (url-hexify-string sacha-emacs-chat-description)
    (format-time-string
     <span class="org-string">"%Y%m%dT%H%M%S"</span> time)
    sacha-time-zone)))

(<span class="org-keyword">defvar</span> <span class="org-variable-name">sacha-emacs-chat-title</span> <span class="org-string">"Emacs Chat"</span> <span class="org-doc">"Title of calendar entry."</span>)
(<span class="org-keyword">defvar</span> <span class="org-variable-name">sacha-emacs-chat-description</span>
  <span class="org-string">"All right, let's try this! =) See the calendar invite for the Google Meet link.</span>

<span class="org-string">Objective: Share cool stuff about Emacs workflows that's not obvious from reading configs, and have fun chatting about Emacs</span>

<span class="org-string">Some ideas for things to talk about:</span>
<span class="org-string">- Which keyboard shortcuts or combinations of functions work really well for you?</span>
<span class="org-string">- What's something you love about your setup?</span>
<span class="org-string">- What are you looking forward to tweaking next?</span>

<span class="org-string">Let me know if you want to do it on stream (more people can ask questions) or off stream (we can clean up the video in case there are hiccups). Also, please feel free to send me links to things you'd like me to read ahead of time, like your config!"</span>
  <span class="org-doc">"Description."</span>)
</code></pre>
</div>


<p>
It uses this function to convert the timestamp at point:
</p>

<p>
</p><details open=""><summary>sacha-org-time-at-point: Return Emacs time object for timestamp at point.</summary><div class="org-src-container"><pre class="src src-emacs-lisp">(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-org-time-at-point</span> ()
  <span class="org-doc">"Return Emacs time object for timestamp at point."</span>
  (org-timestamp-to-time (org-timestamp-from-string (org-element-property <span class="org-builtin">:raw-value</span> (org-element-context)))))

</pre></div></details>
<p></p>

<div class="note">This is part of my <a href="https://sachachua.com/dotemacs#streaming">Emacs configuration.</a></div><div><a href="https://sachachua.com/blog/2026/04/create-a-google-calendar-event-from-an-org-mode-timestamp/index.org">View Org source for this post</a></div><p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2026%2F04%2Fcreate-a-google-calendar-event-from-an-org-mode-timestamp%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></content>
		</entry><entry>
		<title type="html">Make chapter markers and video time hyperlinks easier to note while I livestream</title>
		<link rel="alternate" type="text/html" href="https://sachachua.com/blog/2026/04/make-chapter-markers-and-video-time-hyperlinks-easier-to-note-while-i-livestream/"/>
		<author><name><![CDATA[Sacha Chua]]></name></author>
		<updated>2026-04-17T04:27:43Z</updated>
    <published>2026-04-17T04:27:43Z</published>
    <category term="org" />
<category term="emacs" />
		<id>https://sachachua.com/blog/2026/04/make-chapter-markers-and-video-time-hyperlinks-easier-to-note-while-i-livestream/</id>
		<content type="html"><![CDATA[<p>
I want to make it easier to add chapter markers to my YouTube video descriptions and hyperlinks to specific times in videos in my blog posts.
</p>
<div id="outline-container-streaming-make-chapter-markers-and-video-time-hyperlinks-easier-to-note-while-i-livestream-capture-timestamps" class="outline-3">
<h3 id="streaming-make-chapter-markers-and-video-time-hyperlinks-easier-to-note-while-i-livestream-capture-timestamps"><a href="https://sachachua.com/blog/feed/atom/index.xml#streaming-make-chapter-markers-and-video-time-hyperlinks-easier-to-note-while-i-livestream-capture-timestamps">Capture timestamps</a></h3>
<div class="outline-text-3" id="text-streaming-make-chapter-markers-and-video-time-hyperlinks-easier-to-note-while-i-livestream-capture-timestamps">
<p>
Using wall-clock time via Org Mode timestamps like <span class="timestamp-wrapper"><time class="timestamp" datetime="2026-04-16T10:40:00-0400">[2026-04-16 Thu 10:40]</time></span> makes more sense to me than using video offsets because they're independent of any editing I might do.
</p>

<p>
<code>C-u C-c C-!</code> (<code>org-timestamp-inactive</code>) creates a timestamp with a time. I probably do often enough that I should create a Yasnippet for it:
</p>


<div class="org-src-container">
<pre class="src src-yasnippet"><code># -*- mode: snippet -*-
# name: insert time
# key: zt
# &#45;&#45;
`(format-time-string "[%Y-%m-%d %a %H:%M]")`
</code></pre>
</div>


<p>
I also have <a href="https://orgmode.org/manual/Capture.html">Org capture</a> templates, like this:
</p>


<div class="org-src-container">
<pre class="src src-emacs-lisp"><code>(<span class="org-keyword">with-eval-after-load</span> <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">org-capture</span>
  (add-to-list
   <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">org-capture-templates</span>
   <span class="org-highlight-quoted-quote">`</span>(<span class="org-string">"l"</span> <span class="org-string">"Timestamp"</span> item
     (file+headline ,sacha-stream-inbox-file <span class="org-string">"Timestamps"</span>)
     <span class="org-string">"- %U %i%?"</span>)))
</code></pre>
</div>


<p>
I've been experimenting with a <a href="https://sachachua.com/dotemacs#streaming-display-large-text-and-maybe-qr-code">custom Org Mode link type "stream:"</a> which:
</p>

<ul class="org-ul">
<li>displays the text in a larger font with a QR code for easier copying</li>
<li>sends the text to the YouTube chat via <a href="https://socialstream.ninja">socialstream.ninja</a></li>
<li>adds a timestamped note using the org-capture template above</li>
</ul>

<p>
Here is an example of that link in action. It's the <code>(Log)</code> link that I clicked on.
</p>

<details><summary>Let's extract that clip</summary>
<div class="org-src-container">
<pre class="src src-emacs-lisp"><code>(compile-media-sync
 <span class="org-highlight-quoted-quote">'</span>((combined (<span class="org-builtin">:source</span>
              <span class="org-string">"/home/sacha/proj/yay-emacs/ye16-sacha-and-prot-talk-emacs.mp4"</span>
              <span class="org-builtin">:original-start-ms</span> <span class="org-string">"51:09"</span>
              <span class="org-builtin">:original-stop-ms</span> <span class="org-string">"51:16"</span>))
   (combined (<span class="org-builtin">:source</span>
              <span class="org-string">"/home/sacha/proj/yay-emacs/ye16-sacha-and-prot-talk-emacs-link-overlay.png"</span>
              <span class="org-builtin">:output-start-ms</span> <span class="org-string">"0:03"</span>
              <span class="org-builtin">:output-stop-ms</span> <span class="org-string">"0:04"</span>))
   (combined (<span class="org-builtin">:source</span>
              <span class="org-string">"/home/sacha/proj/yay-emacs/ye16-sacha-and-prot-talk-emacs-qr-chat-overlay.png"</span>
              <span class="org-builtin">:output-start-ms</span> <span class="org-string">"0:05"</span>
              <span class="org-builtin">:output-stop-ms</span> <span class="org-string">"0:06"</span>)))
 <span class="org-string">"/home/sacha/proj/yay-emacs/ye16.1-stream-show-string-and-calculate-offset.mp4"</span>)
</code></pre>
</div>

</details>

<div class="media-post" id="orgc803fb4">
<p>
<video controls="1" src="https://sachachua.com/blog/2026/04/make-chapter-markers-and-video-time-hyperlinks-easier-to-note-while-i-livestream/ye16.1-stream-show-string-and-calculate-offset.mp4" type="video/mp4"> <a href="https://sachachua.com/blog/2026/04/make-chapter-markers-and-video-time-hyperlinks-easier-to-note-while-i-livestream/ye16.1-stream-show-string-and-calculate-offset.mp4">Download the video</a></video>
</p>

</div>

<p>
I used it in <a href="https://sachachua.com/blog/2026/04/ye16-sacha-and-prot-talk-emacs/">YE16: Sacha and Prot talk Emacs</a>. It was handy to have a link that I could click on instead of trying to remember a keyboard shortcut and type text.
For example, these are the timestamps that were filed under org-capture:
</p>

<ul class="org-ul">
<li><span class="timestamp-wrapper"><time class="timestamp" datetime="2026-04-16T10:39:00-0400">[2026-04-16 Thu 10:39]</time></span> Getting more out of livestreams</li>
<li><span class="timestamp-wrapper"><time class="timestamp" datetime="2026-04-16T10:57:00-0400">[2026-04-16 Thu 10:57]</time></span> Announcing livestreams</li>
<li><span class="timestamp-wrapper"><time class="timestamp" datetime="2026-04-16T11:05:00-0400">[2026-04-16 Thu 11:05]</time></span> Processing the recordings</li>
<li><span class="timestamp-wrapper"><time class="timestamp" datetime="2026-04-16T11:11:00-0400">[2026-04-16 Thu 11:11]</time></span> Non-packaged code</li>
</ul>

<p>
Here's a short function for getting those times:
</p>


<div class="org-src-container">
<pre class="src src-emacs-lisp" id="org361bf8b"><code>(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-org-time-at-point</span> ()
  <span class="org-doc">"Return Emacs time object for timestamp at point."</span>
  (org-timestamp-to-time (org-timestamp-from-string (org-element-property <span class="org-builtin">:raw-value</span> (org-element-context)))))
</code></pre>
</div>


<p>
Next, I wanted to turn those timestamps into a hh:mm:ss offset into the streamed video.
</p>
</div>
</div>
<div id="outline-container-streaming-make-chapter-markers-and-video-time-hyperlinks-easier-to-note-while-i-livestream-calculate-an-org-timestamp-s-offset-into-a-youtube-stream" class="outline-3">
<h3 id="streaming-make-chapter-markers-and-video-time-hyperlinks-easier-to-note-while-i-livestream-calculate-an-org-timestamp-s-offset-into-a-youtube-stream"><a href="https://sachachua.com/blog/feed/atom/index.xml#streaming-make-chapter-markers-and-video-time-hyperlinks-easier-to-note-while-i-livestream-calculate-an-org-timestamp-s-offset-into-a-youtube-stream">Calculate an Org timestamp's offset into a YouTube stream</a></h3>
<div class="outline-text-3" id="text-streaming-make-chapter-markers-and-video-time-hyperlinks-easier-to-note-while-i-livestream-calculate-an-org-timestamp-s-offset-into-a-youtube-stream">
<p>
I post my YouTube videos under a brand account so that just in case I lose access to my main sacha@sachachua.com Google account, I still have access via my @gmail.com account. To enable YouTube API access to my channel, I needed to get my brand account's email address and set it up as a test user.
</p>

<ol class="org-ol">
<li>Go to <a href="https://myaccount.google.com/brandaccounts">https://myaccount.google.com/brandaccounts</a>.</li>
<li>Select the account.</li>
<li>Click on <b>View general account info</b></li>
<li>Copy the <code>...@pages.plusgoogle.com</code> email address there.</li>
<li>Go to <a href="https://console.cloud.google.com/">https://console.cloud.google.com/</a></li>
<li>Enable the YouTube data API for my project.</li>
<li>Download the credentials.json.</li>
<li>Go to <b>Data Access - Audience</b></li>
<li>Set the <b>User type</b> to <b>External</b></li>
<li>Add my brand account as one of the <b>Test users</b>.</li>
<li><p>
Log in at the command line:
</p>

<div class="org-src-container">
<pre class="src src-sh"><code> gcloud auth application-default login <span class="org-sh-escaped-newline">\</span>
     &#45;&#45;client-id-file=credentials.json <span class="org-sh-escaped-newline">\</span>
     &#45;&#45;scopes=<span class="org-string">"https://www.googleapis.com/auth/youtube"</span>
</code></pre>
</div>
</li>
</ol>

<p>
Then the following code calculates the offset of the timestamp at point based on the livestream that contains it.
</p>


<div class="org-src-container">
<pre class="src src-emacs-lisp"><code><span class="org-comment-delimiter">;;;</span><span class="org-comment">###</span><span class="org-comment"><span class="org-warning">autoload</span></span>
(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-google-youtube-stream-offset</span> (time)
  <span class="org-doc">"Return the offset from the start of the stream.</span>
<span class="org-doc">When called interactively, copy it."</span>
  (<span class="org-keyword">interactive</span> (list (sacha-org-time-at-point)))
  (<span class="org-keyword">when</span> (<span class="org-keyword">and</span> (stringp time)
             (string-match org-element&#45;&#45;timestamp-regexp time))
    (<span class="org-keyword">setq</span> time (org-timestamp-to-time (org-timestamp-from-string (match-string 0 time)))))
  (<span class="org-keyword">let</span> ((result
         (emacstv-format-seconds (sacha-google-youtube-live-seconds-offset-from-start-of-stream
                                  time))))
    (<span class="org-keyword">when</span> (called-interactively-p <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">any</span>)
      (kill-new result)
      (message <span class="org-string">"%s"</span> result))
    result))

(<span class="org-keyword">defvar</span> <span class="org-variable-name">sacha-google-access-token</span> nil <span class="org-doc">"Cached access token."</span>)

<span class="org-comment-delimiter">;;;</span><span class="org-comment">###</span><span class="org-comment"><span class="org-warning">autoload</span></span>
(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-google-access-token</span> ()
  <span class="org-doc">"Return Google access token."</span>
  (<span class="org-keyword">or</span> sacha-google-access-token
      (<span class="org-keyword">setq</span> sacha-google-access-token
            (string-trim (shell-command-to-string <span class="org-string">"gcloud auth application-default print-access-token"</span>)))))

(<span class="org-keyword">defvar</span> <span class="org-variable-name">sacha-google-youtube-live-broadcasts</span> nil <span class="org-doc">"Cache."</span>)
(<span class="org-keyword">defvar</span> <span class="org-variable-name">sacha-google-youtube-stream-offset-seconds</span> 10 <span class="org-doc">"Number of seconds to offset."</span>)

<span class="org-comment-delimiter">;;;</span><span class="org-comment">###</span><span class="org-comment"><span class="org-warning">autoload</span></span>
(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-google-youtube-live-broadcasts</span> ()
  <span class="org-doc">"Return the list of broadcasts."</span>
  (<span class="org-keyword">or</span> sacha-google-youtube-live-broadcasts
      (<span class="org-keyword">setq</span> sacha-google-youtube-live-broadcasts
            (request-response-data
             (request <span class="org-string">"https://www.googleapis.com/youtube/v3/liveBroadcasts?part=snippet&amp;mine=true&amp;maxResults=10"</span>
               <span class="org-builtin">:headers</span> <span class="org-highlight-quoted-quote">`</span>((<span class="org-string">"Authorization"</span> . ,(format <span class="org-string">"Bearer %s"</span> (sacha-google-access-token))))
               <span class="org-builtin">:sync</span> t
               <span class="org-builtin">:parser</span> <span class="org-highlight-quoted-quote">#'</span><span class="org-highlight-quoted-symbol">json-read</span>)))))

(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-google-youtube-live-get-broadcast-at-time</span> (time)
  <span class="org-doc">"Return the broadcast encompassing TIME."</span>
  (seq-find
   (<span class="org-keyword">lambda</span> (o)
     (<span class="org-keyword">or</span>
      <span class="org-comment-delimiter">;; </span><span class="org-comment">actual</span>
      (<span class="org-keyword">and</span>
       (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">actualStartTime</span> (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">snippet</span> o))
       (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">actualEndTime</span> (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">snippet</span> o))
       (not (time-less-p time (date-to-time (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">actualStartTime</span> (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">snippet</span> o)))))
       (time-less-p time (date-to-time (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">actualEndTime</span> (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">snippet</span> o)))))
      <span class="org-comment-delimiter">;; </span><span class="org-comment">actual, not done yet</span>
      (<span class="org-keyword">and</span>
       (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">actualStartTime</span> (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">snippet</span> o))
       (null (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">actualEndTime</span> (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">snippet</span> o)))
       (not (time-less-p time (date-to-time (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">actualStartTime</span> (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">snippet</span> o))))))
      <span class="org-comment-delimiter">;; </span><span class="org-comment">scheduled</span>
      (<span class="org-keyword">and</span>
       (null (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">actualStartTime</span> (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">snippet</span> o)))
       (null (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">actualEndTime</span> (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">snippet</span> o)))
       (not (time-less-p time (date-to-time (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">scheduledStartTime</span> (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">snippet</span> o))))))))
   (sort
    (seq-filter
     (<span class="org-keyword">lambda</span> (o)
       (<span class="org-keyword">or</span>
        (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">actualStartTime</span> (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">snippet</span> o))
        (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">scheduledStartTime</span> (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">snippet</span> o))))
     (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">items</span>

                (sacha-google-youtube-live-broadcasts)))
    <span class="org-builtin">:key</span> (<span class="org-keyword">lambda</span> (o)
           (<span class="org-keyword">or</span>
            (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">actualStartTime</span> (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">snippet</span> o))
            (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">scheduledStartTime</span> (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">snippet</span> o))))
    <span class="org-builtin">:lessp</span> <span class="org-highlight-quoted-quote">#'</span><span class="org-highlight-quoted-symbol">string&lt;</span>)))

(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-google-youtube-live-seconds-offset-from-start-of-stream</span> (wall-time)
  <span class="org-doc">"Return number of seconds for WALL-TIME from the start of the stream that contains it.</span>
<span class="org-doc">Offset by `</span><span class="org-doc"><span class="org-constant">sacha-google-youtube-stream-offset-seconds</span></span><span class="org-doc">'."</span>
  (+ sacha-google-youtube-stream-offset-seconds
     (time-to-seconds
      (time-subtract
       wall-time
       (date-to-time
        (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">actualStartTime</span>
                   (alist-get <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">snippet</span>
                              (sacha-google-youtube-live-get-broadcast-at-time wall-time))))))))

<span class="org-comment-delimiter">;;;</span><span class="org-comment">###</span><span class="org-comment"><span class="org-warning">autoload</span></span>
(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-google-clear-cache</span> ()
  <span class="org-doc">"Clear cached Google access tokens and data."</span>
  (<span class="org-keyword">interactive</span>)
  (<span class="org-keyword">setq</span> sacha-google-access-token nil)
  (<span class="org-keyword">setq</span> sacha-google-youtube-live-broadcasts nil))
</code></pre>
</div>


<p>
For example:
</p>


<div class="org-src-container">
<pre class="src src-emacs-lisp"><code>(mapcar
 (<span class="org-keyword">lambda</span> (o)
   (list (concat
           <span class="org-string">"vtime:"</span>
           (sacha-google-youtube-stream-offset
            o))
         o))
 timestamps)
</code></pre>
</div>


<table>


<colgroup>
<col class="org-left">

<col class="org-left">
</colgroup>
<tbody>
<tr>
<td class="org-left"><span class="media-time" data-start="1149.000">19:09</span></td>
<td class="org-left"><span class="timestamp-wrapper"><time class="timestamp" datetime="2026-04-16T10:39:00-0400">[2026-04-16 Thu 10:39]</time></span>  Getting more out of livestreams</td>
</tr>

<tr>
<td class="org-left"><span class="media-time" data-start="2229.000">37:09</span></td>
<td class="org-left"><span class="timestamp-wrapper"><time class="timestamp" datetime="2026-04-16T10:57:00-0400">[2026-04-16 Thu 10:57]</time></span>  Announcing livestreams</td>
</tr>

<tr>
<td class="org-left"><span class="media-time" data-start="2709.000">45:09</span></td>
<td class="org-left"><span class="timestamp-wrapper"><time class="timestamp" datetime="2026-04-16T11:05:00-0400">[2026-04-16 Thu 11:05]</time></span>  Processing the recordings</td>
</tr>

<tr>
<td class="org-left"><span class="media-time" data-start="3069.000">51:09</span></td>
<td class="org-left"><span class="timestamp-wrapper"><time class="timestamp" datetime="2026-04-16T11:11:00-0400">[2026-04-16 Thu 11:11]</time></span>  Non-packaged code</td>
</tr>
</tbody>
</table>

<p>
It's not exact, but it gets me in the right neighbourhood. Then I can use the MPV player to figure out a better timestamp if I want, and I can use my custom vtime Org link time to make those clickable when people have Javascript enabled. See <a href="https://sachachua.com/blog/2026/04/ye16-sacha-and-prot-talk-emacs/">YE16: Sacha and Prot talk Emacs</a> for examples.
</p>

<p>
It could be nice to log seconds someday for even finer timestamps. Still, this is handy already!
</p>
</div>
</div>

<div class="note">This is part of my <a href="https://sachachua.com/dotemacs#streaming-make-chapter-markers-and-video-time-hyperlinks-easier-to-note-while-i-livestream">Emacs configuration.</a></div><div><a href="https://sachachua.com/blog/2026/04/make-chapter-markers-and-video-time-hyperlinks-easier-to-note-while-i-livestream/index.org">View Org source for this post</a></div><p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2026%2F04%2Fmake-chapter-markers-and-video-time-hyperlinks-easier-to-note-while-i-livestream%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></content>
		</entry><entry>
		<title type="html">YE16: Sacha and Prot talk Emacs</title>
		<link rel="alternate" type="text/html" href="https://sachachua.com/blog/2026/04/ye16-sacha-and-prot-talk-emacs/"/>
		<author><name><![CDATA[Sacha Chua]]></name></author>
		<updated>2026-04-17T18:10:09Z</updated>
    <published>2026-04-16T16:44:19Z</published>
    <category term="emacs" />
<category term="yay-emacs" />
		<id>https://sachachua.com/blog/2026/04/ye16-sacha-and-prot-talk-emacs/</id>
		<content type="html"><![CDATA[<div class="update" id="orgfd12aac">
<p>
<span class="timestamp-wrapper"><time class="timestamp" datetime="2026-04-17">[2026-04-17 Fri]</time></span>: Updated chapter markers and transcript
</p>

</div>

<p>
In this livestream, I showed <a href="https://protesilaos.com">Prot</a> what I've been doing since <a href="https://sachachua.com/blog/2026/04/yayemacs-10-emacs-coaching-with-prot-packaging-emacs-lisp/">our last conversation about Emacs configuration and livestreaming</a>.
</p>

<p>
</p><div class="yt-video"><iframe width="456" height="315" title="YouTube video player" src="https://www.youtube-nocookie.com/embed/djE_pVlgDHg?enablejsapi=1" frameborder="0" allowfullscreen="">nil</iframe><a href="https://youtube.com/live/djE_pVlgDHg">Watch on YouTube</a></div>
<p></p>

<ul class="org-ul">
<li><span class="media-time" data-start="0.000">00:00</span> Opening</li>
<li><span class="media-time" data-start="264.000">04:24</span> Workflow checklist</li>
<li><span class="media-time" data-start="287.000">04:47</span> Demonstrating <code>sacha-stream-show-message</code> and <a target="_blank" href="https://melpa.org/#/qrencode">qrencode</a></li>
<li><span class="media-time" data-start="354.000">05:54</span> qrencode</li>
<li><span class="media-time" data-start="475.000">07:55</span> Embark</li>
<li><span class="media-time" data-start="1034.000">17:14</span> My objectives</li>
<li><span class="media-time" data-start="1140.000">19:00</span> keycast-header-mode</li>
<li><span class="media-time" data-start="1185.000">19:45</span> Trade-offs when livestreaming while coding</li>
<li><span class="media-time" data-start="1284.000">21:24</span> Trade-offs: seeing less text on the screen</li>
<li><span class="media-time" data-start="1432.000">23:52</span> Lowering the effort needed to announce a stream: Prot just announces it and the blog post embeds it</li>
<li><span class="media-time" data-start="1483.000">24:43</span> Timestamps</li>
<li><span class="media-time" data-start="1649.000">27:29</span> Different types of livestreams</li>
<li><span class="media-time" data-start="1694.000">28:14</span> Reading other people's configs</li>
<li><span class="media-time" data-start="1812.000">30:12</span> Hanging out</li>
<li><span class="media-time" data-start="1900.000">31:40</span> Livestreams for explaining specific things</li>
<li><span class="media-time" data-start="1920.000">32:00</span> Prot on didactic livestreams</li>
<li><span class="media-time" data-start="2047.000">34:07</span> Prot suggests breadcrumbs</li>
<li><span class="media-time" data-start="2279.000">37:59</span> Announcing livestreams</li>
<li><span class="media-time" data-start="2338.000">38:58</span> Embeds: Prot embeds specific YouTube videos instead of the general channel one</li>
<li><span class="media-time" data-start="2372.000">39:32</span> Demo of my new shortcut for converting time zones</li>
<li><span class="media-time" data-start="2508.000">41:48</span> Ozzloy's questions about time zones and QR codes</li>
<li><span class="media-time" data-start="2626.000">43:46</span> Prot on announcing livestreams on blogs</li>
<li><span class="media-time" data-start="2725.000">45:25</span> Processing the recordings</li>
<li><span class="media-time" data-start="2835.000">47:15</span> Commitment devices</li>
<li><span class="media-time" data-start="2909.000">48:29</span> Automating more of the process</li>
<li><span class="media-time" data-start="3074.000">51:14</span> Copying non-packaged code</li>
<li><span class="media-time" data-start="3145.000">52:25</span> Prot on defcustom</li>
<li><span class="media-time" data-start="3312.000">55:12</span> helpful and elisp-demos</li>
<li><span class="media-time" data-start="3383.000">56:23</span> Prot on code libraries</li>
<li><span class="media-time" data-start="3410.000">56:50</span> Prot rewrites functions to fit his style and naming conventions</li>
<li><span class="media-time" data-start="3558.000">59:18</span> Prot's preference for small functions</li>
<li><span class="media-time" data-start="3623.000">01:00:23</span> avy-goto-char-timer</li>
<li><span class="media-time" data-start="3760.000">01:02:40</span> One-shot keyboard modifiers</li>
<li><span class="media-time" data-start="3809.000">01:03:29</span> Toggling</li>
<li><span class="media-time" data-start="3908.000">01:05:08</span> System-wide toggle shortcuts using emacsclient</li>
<li><span class="media-time" data-start="4045.000">01:07:25</span> My next steps</li>
<li><span class="media-time" data-start="4098.000">01:08:18</span> Tips from Prot: small functions used frequently</li>
<li><span class="media-time" data-start="4146.000">01:09:06</span> Maybe using the header line for tips?</li>
<li><span class="media-time" data-start="4223.000">01:10:23</span> Reorganizing keys</li>
</ul>

<p>
<a class="photoswipe sketch-link" href="https://sketches.sachachua.com/filename/2026-04-16-01%20Preparing%20for%20chat%20with%20Prot.jpeg" data-src="https://sketches.sachachua.com/static/2026-04-16-01%20Preparing%20for%20chat%20with%20Prot.jpeg" data-title="2026-04-16-01 Preparing for chat with Prot.jpeg" data-w="2900" data-h="2050">2026-04-16-01 Preparing for chat with Prot.jpeg</a>
</p>

<ul class="org-ul">
<li>Recap of my objectives:
<ul class="org-ul">
<li>Overall: capture and share more, create opportunities for conversation</li>
<li>Timeline:
<ul class="org-ul">
<li>April, May, June: take advantage of predictable-ish schedule and set up streams, chats</li>
<li>July, Aug: Focus on posts, videos, spontaneous streams</li>
<li>Sept-: prepare for EmacsConf, see what I can squeeze in at the same time</li>
</ul></li>
<li>This session:
<ul class="org-ul">
<li>Share my updates, see if you have other ideas, hear what you've been learning about</li>
</ul></li>
</ul></li>
<li><a href="https://sachachua.com/blog/2026/04/yayemacs-10-emacs-coaching-with-prot-packaging-emacs-lisp/#projects-experiment-with-learning-from-prot-yayemacs-10-emacs-coaching-with-prot-packaging-emacs-lisp-ideas-for-next-steps">#YayEmacs 10: Emacs coaching with Prot: Emacs workflows and streaming</a>
<ul class="org-ul">
<li><a href="https://sachachua.com/dotemacs">Emacs config modularization</a>
<ul class="org-ul">
<li>Moved the functions of my config into .el files and renamed to <code>sacha-</code> prefix</li>
<li>Experimenting with using <a href="https://github.com/rvaiya/keyd">keyd</a> for one-shot ctrl/alt/super modifiers on Linux</li>
<li><a href="https://sachachua.com/dotemacs#toggle">Used C-z to toggle live.org and C-Z to toggle now.org</a></li>
<li>Reading people's configs</li>
</ul></li>
<li>Streaming
<ul class="org-ul">
<li><a href="https://sachachua.com/dotemacs#streaming-mode-for-streaming">Set up mode for livestreaming</a> and <a href="https://github.com/obs-websocket-el/obs-websocket-el/">obs-websocket-el</a>
<ul class="org-ul">
<li>Saves variables, changes agenda / refile targets / capture templates, changes theme, etc.</li>
</ul></li>
<li>Planning upcoming videos / livestreams:
<ul class="org-ul">
<li>Looks like there's lots of interest in <a href="https://sachachua.com/blog/category/emacs-chat-podcast/all/">Emacs Chat</a> (config demos)
<ul class="org-ul">
<li><a href="https://social.sachachua.com/@sacha/statuses/01KP12W9CBT581YR7V3GMWFVN8">Mastodon thread with interested people</a></li>
<li><a href="https://sachachua.com/topic/emacs-chat/">Emacs Chat</a></li>
</ul></li>
<li>I have a video call with jwiegley and Karthik which we will post afterwards</li>
</ul></li>
<li>Watching lots of other people's videos, reading people's configs</li>
<li>Could have fun with a Thursday show-and-tell</li>
</ul></li>
<li>Contributing upstream
<ul class="org-ul">
<li>Sent revised patch for org and sentence-at-point</li>
<li>Bumped into something in which-key which I want to tweak</li>
</ul></li>
</ul></li>
<li><a href="https://protesilaos.com/emacs/dotemacs">GNU Emacs configuration | Protesilaos Stavrou</a></li>
<li><a href="https://sachachua.com/dotemacs/">Sacha Chua's Emacs configuration</a></li>
<li><a target="_blank" href="https://melpa.org/#/qrencode">qrencode</a></li>
<li><a href="https://sachachua.com/dotemacs#org-mode-time-zones">Time zones</a></li>
</ul>

<p>
Questions I'm thinking about / areas I'm working on improving:
</p>

<ul class="org-ul">
<li>(Log) <b>Getting more out of livestreams</b> (for yourself or others)
<ul class="org-ul">
<li>You've mentioned that you don't really go back to your videos to listen to them. I was wondering what could make the livestreamed recordings more useful to either the person who made them, people who watched it live, or people who come across it later.</li>
<li>Tradeoffs for livestreaming:
<ul class="org-ul">
<li>Plus: debugging help, capturing your thinking out loud, conversation, sharing more practices/tips</li>
<li>Minus: Fitting less stuff on screen, distractability</li>
</ul></li>
<li>A few types of livestreams:
<ul class="org-ul">
<li>"I'm going to spend the time doing this anyway, I might as well open it up in case other people are interested."
<ul class="org-ul">
<li>Your package maintenance videos <a href="https://www.youtube.com/watch?v=xFQDYTCS1os&amp;t=1502s">Emacs: live stream about maintaining the modus-themes - YouTube</a></li>
<li>My Emacs News categorization</li>
<li>People coding other things</li>
<li>Other types of tinkering with code, debugging, etc.</li>
</ul></li>
<li>"I have something that I specifically want to teach/show."
<ul class="org-ul">
<li>After writing a post</li>
<li>Before writing a post
<ul class="org-ul">
<li><span class="timestamp-wrapper"><time class="timestamp" datetime="2026-04-16T10:54:00-0400">[2026-04-16 Thu 10:54]</time></span> Leaving yourself breadcrumbs ZZZ consider also colour (font-lock-keywords), maybe occur</li>
</ul></li>
</ul></li>
<li>Reacting to other things
<ul class="org-ul">
<li>Config: <a href="https://www.youtube.com/live/qLjFYMQG71E">YE15: Fiddling with my Emacs config and streaming setup - YouTube</a></li>
</ul></li>
<li>Chatting with a guest
<ul class="org-ul">
<li>I had fun fiddling with my two-speaker workflow for whisperx and subed; hooray for the visual distinction between your subtitles and mine on <a href="https://www.youtube.com/watch?v=kvBS8wz8ZRw">Yay Emacs 10: Talking to Prot about Emacs workflows - YouTube</a> =)</li>
</ul></li>
<li>Chatting with the community, hanging out</li>
<li>Playing</li>
</ul></li>
<li>(Log) <b>Announcing livestreams</b>
<ul class="org-ul">
<li>You add a post for scheduled/spontaneous livestreams and then you update it with the description; probably fine considering RSS readers - people can visit the page if it's finished</li>
<li><p>
Debating whether to embed the channel livestream (picks next public scheduled stream, I think) or embed the specific livestream
</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/live_stream?channel=UClT2UAbC6j7TqOWurVhkuHQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe></li>
<li>Now on <a href="https://yayemacs.com">https://yayemacs.com</a> (also <a href="https://sach.ac/live">https://sach.ac/live</a>, <a href="https://sachachua.com/live">https://sachachua.com/live</a>)</li>
<li>Added timestamp translation to Embark keymap for timestamps, <code>sacha-org-timestamp-in-time-zones</code></li>
<li class="off"><span class="task-todo">&#x2610;</span> TODO: Post template</li>
<li class="off"><span class="task-todo">&#x2610;</span> TODO: ical file</li>
<li class="off"><span class="task-todo">&#x2610;</span> TODO: Easier workflow for embedding streams</li>
<li class="off"><span class="task-todo">&#x2610;</span> TODO: Google API for scheduling a livestream</li>
</ul></li>
<li>(Log) <b>Processing the recordings</b>
<ul class="org-ul">
<li>I like editing transcripts because that also helps me quickly split up chapters</li>
<li>Tracking chapters on the fly</li>
<li>Extracting screenshots and clips</li>
<li>Turning videos into blog posts (or vice versa)</li>
<li class="off"><span class="task-todo">&#x2610;</span> TODO: Automate more of the downloading/transcription, common edits, Internet Archive uploads</li>
</ul></li>
</ul></li>
<li>(Log) Do you sometimes find yourself copying non-packaged code from other people? How do you like to integrate it into your config, keep references to the source, check for updates?
<ul class="org-ul">
<li>convert defvar to defcustom</li>
<li><p>
Current approach: autoload if possible; if not, add a note to the docstring
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp"><code>   (<span class="org-keyword">use-package</span> prot-comment                <span class="org-comment-delimiter">; </span><span class="org-comment">TODO 2026-04-16:</span>
    <span class="org-builtin">:load-path</span> <span class="org-string">"~/vendor/prot-dotfiles/emacs/.emacs.d/prot-lisp"</span>
          <span class="org-builtin">:commands</span> (prot-comment-timestamp-keyword)
          <span class="org-builtin">:bind</span>
          (<span class="org-builtin">:map</span> prog-mode-map
                                  (<span class="org-string">"C-x M-;"</span> . prot-comment-timestamp-keyword)))
</code></pre>
</div>


<div class="org-src-container">
<pre class="src src-emacs-lisp"><code>   <span class="org-comment-delimiter">;;;</span><span class="org-comment">###autoload</span>
(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-org-capture-region-contents-with-metadata</span> (start end parg)
  <span class="org-doc">"Write selected text between START and END to currently clocked `</span><span class="org-doc"><span class="org-constant">org-mode</span></span><span class="org-doc">' entry.</span>

<span class="org-doc">   With PARG, kill the content instead.</span>
<span class="org-doc">   If there is no clocked task, create it as a new note in my inbox instead.</span>

<span class="org-doc">   From https://takeonrules.com/2022/10/16/adding-another-function-to-sacha-workflow/, modified slightly so that it creates a new entry if we are not currently clocked in."</span>
  (<span class="org-keyword">interactive</span> <span class="org-string">"r\nP"</span>)
  (<span class="org-keyword">let</span> ((text (sacha-org-region-contents-get-with-metadata start end)))
    (<span class="org-keyword">if</span> (car parg)
        (kill-new text)
      (org-capture-string (concat <span class="org-string">"&#45;&#45;&#45;&#45;-\n"</span> text)
                          (<span class="org-keyword">if</span> (org-clocking-p) <span class="org-string">"c"</span>
                            <span class="org-string">"r"</span>)))))
</code></pre>
</div>
</li>
<li>prot-window: run a command in a new frame</li>
<li class="off"><span class="task-todo">&#x2610;</span> Look into using keyd for tap and hold space?</li>
<li class="off"><span class="task-todo">&#x2610;</span> header line format with common tips</li>
</ul></li>
</ul>

<details class="code-details" style="padding: 1em;
                 border-radius: 15px;
                 font-size: 0.9em;
                 box-shadow: 0.05em 0.1em 5px 0.01em  #00000057;">
                  <summary><strong>Transcript</strong></summary>
<style>
span.caption[data-speaker="Prot"] { color: var(&#45;&#45;modus-fg-ochre); }
</style>

<p>
</p><p></p><div class="transcript-heading"><span class="audio-time" data-start="0.000000">00:00:00</span> <strong>Opening</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="0.031000" data-stop="4.677000">[Sacha]: This is Yay Emacs number 16. I'm Sacha Chua and today I will be</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4.737000" data-stop="12.728000">talking with Prot once my alarms stop going off. Yes, yes. I'm</span> <span class="audio-time caption" data-speaker="Sacha" data-start="12.768000" data-stop="15.472000">going to be talking with Prot later, assuming that all of</span> <span class="audio-time caption" data-speaker="Sacha" data-start="15.552000" data-stop="24.359000">this stuff works. Let me double check my audio is on. Audio</span> <span class="audio-time caption" data-speaker="Sacha" data-start="24.419000" data-stop="28.144000">is definitely on. I'm trying a little bit early so that I'm</span> <span class="audio-time caption" data-speaker="Sacha" data-start="28.184000" data-stop="32.891000">not doing so much last-minute panicking. Let's see what</span> <span class="audio-time caption" data-speaker="Sacha" data-start="32.931000" data-stop="39.640000">we've got here.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="46.285000" data-stop="52.055000">I am also trying the new OBS 32 interface for things, so that</span> <span class="audio-time caption" data-speaker="Sacha" data-start="52.095000" data-stop="58.866000">should be fun. Alright, thank you to phyzixlab for</span> <span class="audio-time caption" data-speaker="Sacha" data-start="58.906000" data-stop="62.592000">confirming that the audio works. I am so fairly new to this</span> <span class="audio-time caption" data-speaker="Sacha" data-start="62.673000" data-stop="65.778000">livestreaming thing, but I'm looking forward to seeing if I</span> <span class="audio-time caption" data-speaker="Sacha" data-start="65.818000" data-stop="67.961000">can do it more regularly because I have a little bit of</span> <span class="audio-time caption" data-speaker="Sacha" data-start="68.522000" data-stop="72.585000">predictable focus time between now and the end of June. In</span> <span class="audio-time caption" data-speaker="Sacha" data-start="72.645000" data-stop="75.251000">July, the kid is on summer break and so will probably want to</span> <span class="audio-time caption" data-speaker="Sacha" data-start="75.311000" data-stop="78.537000">hang out with me all the time. Or not, you know, kids are like</span> <span class="audio-time caption" data-speaker="Sacha" data-start="78.577000" data-stop="85.130000">that, right? So in the meantime, I am trying to get the hang of</span> <span class="audio-time caption" data-speaker="Sacha" data-start="85.892000" data-stop="90.721000">scheduling things and since Prot happens to have an Emacs</span> <span class="audio-time caption" data-speaker="Sacha" data-start="90.762000" data-stop="94.644000">coaching service, I figured I would engage him to coach me</span> <span class="audio-time caption" data-speaker="Sacha" data-start="95.185000" data-stop="97.848000">on live streaming and Emacs and all sorts of stuff, which is</span> <span class="audio-time caption" data-speaker="Sacha" data-start="97.888000" data-stop="101.552000">really, you know, making sure that I have somebody to talk to</span> <span class="audio-time caption" data-speaker="Sacha" data-start="102.813000" data-stop="106.937000">and bounce ideas around with and see where we end up. So the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="107.038000" data-stop="113.785000">last time, which was, Yay Emacs, when was this? Yay Emacs 10,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="114.766000" data-stop="118.309000">I had a coaching session with him to talk about Emacs</span> <span class="audio-time caption" data-speaker="Sacha" data-start="118.329000" data-stop="120.952000">workflows and streaming. So I've been working on</span> <span class="audio-time caption" data-speaker="Sacha" data-start="120.992000" data-stop="123.709000">modularizing my configuration. I'll explain all of this</span> <span class="audio-time caption" data-speaker="Sacha" data-start="123.769000" data-stop="134.970000">again when he comes on, but just to get the hang of this. I've</span> <span class="audio-time caption" data-speaker="Sacha" data-start="135.031000" data-stop="138.758000">modulized my config. I've gotten through hundreds of</span> <span class="audio-time caption" data-speaker="Sacha" data-start="139.119000" data-stop="142.866000">function definitions and exported them all into</span> <span class="audio-time caption" data-speaker="Sacha" data-start="142.926000" data-stop="149.142000">individual files. I</span> <span class="audio-time caption" data-speaker="Sacha" data-start="149.162000" data-stop="152.586000">have in fact even renamed them from my-whatever to</span> <span class="audio-time caption" data-speaker="Sacha" data-start="152.746000" data-stop="160.015000">sacha-whatever. So it's slightly</span> <span class="audio-time caption" data-speaker="Sacha" data-start="160.075000" data-stop="162.918000">easier to copy my functions because they won't trample over</span> <span class="audio-time caption" data-speaker="Sacha" data-start="163.018000" data-stop="168.165000">other people's custom functions called my-whatever. My</span> <span class="audio-time caption" data-speaker="Sacha" data-start="168.225000" data-stop="173.312000">background blurring is very background blurring. So</span> <span class="audio-time caption" data-speaker="Sacha" data-start="173.352000" data-stop="176.138000">that's all good. And then I've got a couple of other</span> <span class="audio-time caption" data-speaker="Sacha" data-start="177.341000" data-stop="180.207000">modifications that I've made. So I've made good progress on</span> <span class="audio-time caption" data-speaker="Sacha" data-start="180.247000" data-stop="186.020000">this very long to-do list that I had made for myself after his</span> <span class="audio-time caption" data-speaker="Sacha" data-start="186.762000" data-stop="191.532000">chat. But the kiddo is here. Oh my goodness!</span> <span class="audio-time caption" data-speaker="Sacha" data-start="198.970000" data-stop="201.613000">Okay, you're gonna go back to school and stuff? You just</span> <span class="audio-time caption" data-speaker="Sacha" data-start="201.633000" data-stop="204.958000">wanted to drop by and make a comment? Yes. Also, the teacher</span> <span class="audio-time caption" data-speaker="Sacha" data-start="204.978000" data-stop="208.663000">let me change my name, but not family. They just wanted to add</span> <span class="audio-time caption" data-speaker="Sacha" data-start="208.683000" data-stop="213.369000">a - in parenthesis. Oh, yeah. Oh, that's good. Now they</span> <span class="audio-time caption" data-speaker="Sacha" data-start="213.389000" data-stop="221.299000">can refer to you. Post my name and my nickname. Alright, I'm</span> <span class="audio-time caption" data-speaker="Sacha" data-start="221.339000" data-stop="222.160000">going to test this new thing.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="242.305000" data-stop="252.509000">Interesting</span> <span class="audio-time caption" data-speaker="Sacha" data-start="254.132000" data-stop="256.839000">conflict here. The kiddo likes making cameos. I am not sure</span> <span class="audio-time caption" data-speaker="Sacha" data-start="256.858000" data-stop="261.791000">how I feel about the kiddo making cameos. Anyhow! Where are</span> <span class="audio-time caption" data-speaker="Sacha" data-start="261.831000" data-stop="264.918000">we? Okay, the mic is unmuted again.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="264.000000">00:04:24</span> <strong>Workflow checklist</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="264.919000" data-stop="265.961000">[Sacha]: I am going through my</span> <span class="audio-time caption" data-speaker="Sacha" data-start="266.061000" data-stop="269.269000">checklist. I have this lovely checklist now. It includes,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="269.831000" data-stop="273.660000">naturally because it's Org Mode, it includes Emacs Lisp</span> <span class="audio-time caption" data-speaker="Sacha" data-start="273.940000" data-stop="277.449000">buttons that I can just click on to get stuff running. In this</span> <span class="audio-time caption" data-speaker="Sacha" data-start="277.509000" data-stop="282.499000">case, for example, I can use obs-websocket-el to start</span> <span class="audio-time caption" data-speaker="Sacha" data-start="282.539000" data-stop="286.487000">recording and start streaming at the same time. So that's</span> <span class="audio-time caption" data-speaker="Sacha" data-start="286.548000" data-stop="287.789000">all good.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="287.000000">00:04:47</span> <strong>Demonstrating =sacha-stream-show-message= and package:qrencode</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="287.790000" data-stop="290.135000">[Sacha]: And I want to double check that this message thing</span> <span class="audio-time caption" data-speaker="Sacha" data-start="290.155000" data-stop="295.927000">works. Let's go see if I can send a message to the chat. Show</span> <span class="audio-time caption" data-speaker="Sacha" data-start="295.947000" data-stop="296.528000">string.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="298.955000" data-stop="303.579000">This is a test message that you can ignore. And</span> <span class="audio-time caption" data-speaker="Sacha" data-start="303.759000" data-stop="309.745000">theoretically that shows up there. That shows up in the chat</span> <span class="audio-time caption" data-speaker="Sacha" data-start="309.985000" data-stop="313.709000">with a timestamp. So people using video on demand feature</span> <span class="audio-time caption" data-speaker="Sacha" data-start="313.809000" data-stop="317.052000">where you can go back and just go playback part of the thing</span> <span class="audio-time caption" data-speaker="Sacha" data-start="317.612000" data-stop="323.618000">can go see it. It would help, of course, if I had the time. And</span> <span class="audio-time caption" data-speaker="Sacha" data-start="323.678000" data-stop="328.023000">if I expand this. You have the time in the mode line here. It's</span> <span class="audio-time caption" data-speaker="Sacha" data-start="328.223000" data-stop="333.510000">currently 10:25. But then, my Firefox... Oh, maybe I should</span> <span class="audio-time caption" data-speaker="Sacha" data-start="333.530000" data-stop="340.260000">just tell you what. I will make this above others. There you</span> <span class="audio-time caption" data-speaker="Sacha" data-start="340.300000" data-stop="347.710000">go. Fancy. Super fancy. Except this is right where the...</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="354.000000">00:05:54</span> <strong>qrencode</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="354.136000" data-stop="359.003000">[Sacha]: What's the QR code? The QR code just repeats the string. So</span> <span class="audio-time caption" data-speaker="Sacha" data-start="359.103000" data-stop="363.690000">this will be a little more handy if I have... Let me just</span> <span class="audio-time caption" data-speaker="Sacha" data-start="363.730000" data-stop="366.634000">double check that it does do the string properly. Come on,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="366.774000" data-stop="371.401000">show me the thing. Yep. So this is my... In case you're</span> <span class="audio-time caption" data-speaker="Sacha" data-start="371.441000" data-stop="375.526000">watching this in a mobile device and I show URLs, like for</span> <span class="audio-time caption" data-speaker="Sacha" data-start="375.586000" data-stop="380.594000">example, let's bring up Prot's configuration here. Let's</span> <span class="audio-time caption" data-speaker="Sacha" data-start="380.634000" data-stop="387.249000">go to... Let's do, do, do, do, do... Prot. Yeah, here. And</span> <span class="audio-time caption" data-speaker="Sacha" data-start="387.289000" data-stop="393.499000">then if I say show string and I give it the URL, then it gives</span> <span class="audio-time caption" data-speaker="Sacha" data-start="393.559000" data-stop="398.628000">you the string and the URL should be in the QR code. So people</span> <span class="audio-time caption" data-speaker="Sacha" data-start="398.668000" data-stop="401.617000">who are watching mobile. You can do that. People who are in</span> <span class="audio-time caption" data-speaker="Sacha" data-start="401.637000" data-stop="404.863000">the chat can get it from the chat. It's timestamped so that if</span> <span class="audio-time caption" data-speaker="Sacha" data-start="404.923000" data-stop="409.671000">I grab the timestamps later on, I can use that sort of for</span> <span class="audio-time caption" data-speaker="Sacha" data-start="409.791000" data-stop="413.758000">chapters. And just generally all these little</span> <span class="audio-time caption" data-speaker="Sacha" data-start="413.818000" data-stop="417.705000">conveniences. This QR code is provided by the qrencode</span> <span class="audio-time caption" data-speaker="Sacha" data-start="418.386000" data-stop="422.854000">package. So it's in Emacs. It's actually characters.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="423.087000" data-stop="430.017000">There's probably a way to just insert the image. But I</span> <span class="audio-time caption" data-speaker="Sacha" data-start="430.057000" data-stop="434.203000">thought it was cool. I can't remember who had this technique</span> <span class="audio-time caption" data-speaker="Sacha" data-start="434.263000" data-stop="438.309000">in one of his videos. Maybe it was John Kitchin? That seems</span> <span class="audio-time caption" data-speaker="Sacha" data-start="438.329000" data-stop="441.353000">like the sort of thing he might do. Or it might be someone</span> <span class="audio-time caption" data-speaker="Sacha" data-start="441.393000" data-stop="446.120000">else. Anyway, just these little conveniences because</span> <span class="audio-time caption" data-speaker="Sacha" data-start="446.521000" data-stop="450.186000">copying text, especially in mobile, or trying to type</span> <span class="audio-time caption" data-speaker="Sacha" data-start="450.266000" data-stop="455.366000">things... Try to pause the video at just the right moment. It's</span> <span class="audio-time caption" data-speaker="Sacha" data-start="455.386000" data-stop="461.377000">very annoying. Eventually,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="462.099000" data-stop="466.407000">I would like to plug it into all the usual Embark stuff. For</span> <span class="audio-time caption" data-speaker="Sacha" data-start="466.467000" data-stop="470.335000">example, you'll see this later as I go through this stuff</span> <span class="audio-time caption" data-speaker="Sacha" data-start="470.495000" data-stop="475.947000">with Prot. Log buttons will show messages.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="475.000000">00:07:55</span> <strong>Embark</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="475.948000" data-stop="479.252000">[Sacha]: But theoretically, it would be nice to have my Embark here. For</span> <span class="audio-time caption" data-speaker="Sacha" data-start="479.292000" data-stop="483.337000">example, I'm on Embark on an org URL link. It makes sense</span> <span class="audio-time caption" data-speaker="Sacha" data-start="483.377000" data-stop="487.262000">that... Wait a minute, I do have it. Okay, I think I have it on Z</span> <span class="audio-time caption" data-speaker="Sacha" data-start="487.342000" data-stop="493.710000">here. Is that a capital Z or a small z? Let's find out. Z? Not a</span> <span class="audio-time caption" data-speaker="Sacha" data-start="493.770000" data-stop="497.194000">small z. Capital Z. Whoa, look at that! Okay, okay, so I</span> <span class="audio-time caption" data-speaker="Sacha" data-start="497.234000" data-stop="501.916000">already do have it. Embark is a package that lets you have</span> <span class="audio-time caption" data-speaker="Sacha" data-start="502.016000" data-stop="506.803000">context-sensitive keyboard shortcuts. And so I have this</span> <span class="audio-time caption" data-speaker="Sacha" data-start="506.924000" data-stop="511.450000">now mapped so that if I want an org link, I can press control</span> <span class="audio-time caption" data-speaker="Sacha" data-start="511.510000" data-stop="517.860000">dot and Z and it will send it to the chat and display it on the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="517.900000" data-stop="523.508000">screen with a message because who wants to type things</span> <span class="audio-time caption" data-speaker="Sacha" data-start="523.568000" data-stop="525.711000">manually? You know, this is Emacs. We don't do anything</span> <span class="audio-time caption" data-speaker="Sacha" data-start="525.751000" data-stop="530.408000">manually. And then theoretically, that also should show up</span> <span class="audio-time caption" data-speaker="Sacha" data-start="530.648000" data-stop="533.312000">in... Look at that! It's showing up over here in my timestamp</span> <span class="audio-time caption" data-speaker="Sacha" data-start="533.352000" data-stop="538.539000">section using the magic of org-capture. It includes a</span> <span class="audio-time caption" data-speaker="Sacha" data-start="538.599000" data-stop="542.804000">timestamp and then, of course, with a little bit of math, I</span> <span class="audio-time caption" data-speaker="Sacha" data-start="542.884000" data-stop="548.792000">can calculate this as an offset into the streaming video</span> <span class="audio-time caption" data-speaker="Sacha" data-start="548.812000" data-stop="552.537000">file because I started the stream probably at the same time.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="552.697000" data-stop="556.101000">Anyway, just a little bit of math to calculate that. And then</span> <span class="audio-time caption" data-speaker="Sacha" data-start="556.161000" data-stop="559.799000">I can get chapters out of it. Theoretically. Or I could use</span> <span class="audio-time caption" data-speaker="Sacha" data-start="559.839000" data-stop="563.363000">that to index into the transcript and edit things. Hello,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="563.383000" data-stop="568.349000">Prot! Hello! We are already live. I have just been on screen.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="568.369000" data-stop="569.830000">[Prot]: Already live! Great. Yes.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="569.831000" data-stop="571.332000">[Sacha]: Panicking. Not panicking.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="571.613000" data-stop="574.837000">Experimenting with all the fun stuff. I'm now going to share</span> <span class="audio-time caption" data-speaker="Sacha" data-start="574.877000" data-stop="580.463000">my screen with you so that you can see also. Select window.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="581.124000" data-stop="584.628000">Let's go to all of it. Screen one? Screen one. I think it's</span> <span class="audio-time caption" data-speaker="Sacha" data-start="584.668000" data-stop="591.186000">screen one. Okay. Allow. So, theoretically, you</span> <span class="audio-time caption" data-speaker="Sacha" data-start="594.111000" data-stop="595.653000">should see my screen.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="595.654000" data-stop="599.219000">[Prot]: Very well, very well. Looks good, looks good.</span> <span class="audio-time caption" data-speaker="Prot" data-start="599.220000" data-stop="602.444000">We have connectivity issues, it seems.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="602.445000" data-stop="607.112000">[Sacha]: Your audio sounds choppy.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="607.113000" data-stop="615.547000">[Prot]: Yeah, same here. I cannot hear you well.</span> <span class="audio-time caption" data-speaker="Prot" data-start="615.548000" data-stop="616.670000">Can you hear me now?</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="616.671000" data-stop="618.113000">[Sacha]: I dropped my performance.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="618.114000" data-stop="619.376000">[Prot]: Okay, okay, do that.</span> <span class="audio-time caption" data-speaker="Prot" data-start="619.377000" data-stop="625.151000">Well, very well. Because it seems that our... Yes, okay, I did the same.</span> <span class="audio-time caption" data-speaker="Prot" data-start="625.171000" data-stop="627.915000">Okay, so hopefully this will work. Let's see.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="627.916000" data-stop="629.377000">[Sacha]: It's an experiment.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="629.378000" data-stop="631.079000">[Prot]: It seems more stable now.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="631.080000" data-stop="633.323000">[Sacha]: Yes, this is one of the reasons why</span> <span class="audio-time caption" data-speaker="Sacha" data-start="633.324000" data-stop="635.206000">we're having these sessions, so that you can</span> <span class="audio-time caption" data-speaker="Sacha" data-start="635.246000" data-stop="638.811000">experiment to see what's possible. And I was just telling</span> <span class="audio-time caption" data-speaker="Sacha" data-start="638.911000" data-stop="643.818000">stream that I've been having a lot of fun tinkering with a lot</span> <span class="audio-time caption" data-speaker="Sacha" data-start="643.878000" data-stop="648.324000">of the ideas that I was working on after the last chat two</span> <span class="audio-time caption" data-speaker="Sacha" data-start="648.445000" data-stop="655.320000">weeks ago. So my goal for this session is to not panic.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="655.321000" data-stop="663.413000">[Prot]: I really cannot hear you clearly. I keep getting</span> <span class="audio-time caption" data-speaker="Prot" data-start="663.654000" data-stop="671.445000">interruptions, so... It seems that... Yeah, I don't know</span> <span class="audio-time caption" data-speaker="Prot" data-start="671.465000" data-stop="677.475000">what we could do. Maybe I can try to leave and rejoin, maybe.</span> <span class="audio-time caption" data-speaker="Prot" data-start="677.495000" data-stop="682.061000">Let me exit and rejoin Jitsi, maybe that will fix it. Okay,</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="682.082000" data-stop="687.175000">[Sacha]: let's try that. Okay, so let me do that very quickly.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="694.542000" data-stop="697.566000">Quite possibly, I am asking my computer to do too many</span> <span class="audio-time caption" data-speaker="Sacha" data-start="697.626000" data-stop="703.412000">things. Let's see. I am asking my computer to do too many</span> <span class="audio-time caption" data-speaker="Sacha" data-start="703.472000" data-stop="704.832000">things, audio-wise.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="704.833000" data-stop="707.395000">[Prot]: Okay, we will see. We will find out.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="707.396000" data-stop="714.652000">[Sacha]: Let me try changing my virtual mic. How about this one?</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="714.653000" data-stop="719.864000">[Prot]: No, your audio is still kind of choppy. Why is your audio choppy?</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="719.884000" data-stop="728.039000">[Sacha]: Let's see. What do you think? Yeti, monitor your audio.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="728.040000" data-stop="734.974000">Let me check. Not good. It's okay. Live debugging. Here we go.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="735.578000" data-stop="742.289000">Okay, you are, where are we? You are Firefox. Yes, yes, yes.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="743.090000" data-stop="750.341000">Okay, I can disconnect the, uh, disconnect the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="750.542000" data-stop="754.448000">connections. Let me think.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="757.988000" data-stop="765.680000">Connect the ports of Combined Sink Monitor to Firefox Input.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="769.545000" data-stop="775.714000">[Prot]: And while you do that, we will... Testing.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="775.715000" data-stop="776.816000">[Sacha]: How are we doing?</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="778.198000" data-stop="779.840000">[Prot]: There it is.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="779.841000" data-stop="780.882000">[Sacha]: Is this slightly better?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="783.586000" data-stop="785.932000">Testing. One, two, three.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="785.933000" data-stop="787.996000">[Prot]: Yeah, let's see here, so... Okay,</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="788.016000" data-stop="795.226000">[Sacha]: that seems to be good. And now I'm sharing my screen. How is</span> <span class="audio-time caption" data-speaker="Sacha" data-start="795.306000" data-stop="795.967000">our screen?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="801.013000" data-stop="805.419000">Hmm, does not like screen sharing at the same time. Let me see</span> <span class="audio-time caption" data-speaker="Sacha" data-start="805.459000" data-stop="809.264000">what's going on with my memory. My memory is fine. I have</span> <span class="audio-time caption" data-speaker="Sacha" data-start="809.304000" data-stop="814.952000">memory. Let us stop the screen sharing. How are we now? Is our</span> <span class="audio-time caption" data-speaker="Sacha" data-start="815.012000" data-stop="815.653000">audio back?</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="819.548000" data-stop="824.773000">[Prot]: Okay. I can hear you well. I can hear you well in terms of the</span> <span class="audio-time caption" data-speaker="Prot" data-start="824.833000" data-stop="828.817000">fact that there is no choppiness now in the audio. However,</span> <span class="audio-time caption" data-speaker="Prot" data-start="828.918000" data-stop="833.022000">your voice has been distorted a little bit. It's not a</span> <span class="audio-time caption" data-speaker="Prot" data-start="833.082000" data-stop="835.905000">problem. I can hear you clearly, but I just mention it for the</span> <span class="audio-time caption" data-speaker="Prot" data-start="836.185000" data-stop="838.968000">sake of your setup.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="840.469000" data-stop="845.094000">[Sacha]: This is interesting and I'm not entirely sure how I will go</span> <span class="audio-time caption" data-speaker="Sacha" data-start="845.174000" data-stop="849.848000">about fixing it at this moment. No</span> <span class="audio-time caption" data-speaker="Sacha" data-start="854.578000" data-stop="858.706000">problem. It's not really a problem because I hear you well,</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="858.726000" data-stop="863.055000">[Prot]: so that's enough. I am tempted to suggest the non-free...</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="863.576000" data-stop="866.262000">[Sacha]: Let's jump over to Google Meet and see if that's any better.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="867.237000" data-stop="874.727000">[Prot]: Let's do it. Send me the link and let's do that. No problem.</span> <span class="audio-time caption" data-speaker="Prot" data-start="874.728000" data-stop="882.658000">We are already on YouTube anyways. Let me try this.</span> <span class="audio-time caption" data-speaker="Prot" data-start="882.659000" data-stop="889.027000">[Sacha] I will send it to you in the Jitsi chat and then things will be crazy.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="889.028000" data-stop="895.017000">[Sacha]: It's in the Jitsi chat and we'll see if that works. Does that work?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="896.549000" data-stop="908.986000">I will also email it to you.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="913.212000" data-stop="916.556000">That's not the link.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="922.565000" data-stop="925.088000">Okay.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="926.705000" data-stop="935.593000">Now I need to see whether this actually works. Oh. Ah!</span> <span class="audio-time caption" data-speaker="Sacha" data-start="939.337000" data-stop="947.024000">Ah, technology! How does it work?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="947.044000" data-stop="949.666000">Camera is starting. Camera is not starting. I don't know</span> <span class="audio-time caption" data-speaker="Sacha" data-start="949.686000" data-stop="952.589000">what it's talking about. Camera is starting. Allow camera.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="954.291000" data-stop="963.893000">Join now. Okay. Testing. My audio works. Admit one guest.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="965.475000" data-stop="972.946000">Admit. Okay. Testing. Does this work now? I can hear you</span> <span class="audio-time caption" data-speaker="Sacha" data-start="972.966000" data-stop="980.436000">clearly. Okay. Now I'm going to try sharing this. Yes. Very</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="980.476000" data-stop="984.843000">[Prot]: well. And then let's see what happens. Share. Yeah. The</span> <span class="audio-time caption" data-speaker="Prot" data-start="984.923000" data-stop="990.984000">moment of truth. Let's see.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="990.985000" data-stop="992.907000">[Sacha]: Technology continues to work?</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="993.968000" data-stop="997.433000">[Prot]: Yeah, yeah, it does work. This is smooth. This works. So</span> <span class="audio-time caption" data-speaker="Prot" data-start="997.533000" data-stop="1000.877000">let's see. Okay, all right. So it probably means that in the</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1000.957000" data-stop="1004.141000">[Sacha]: future I might actually need to spin up our Big Blue Button</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1004.181000" data-stop="1007.345000">server because sometimes the free Jitsi, you know, you're</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1007.605000" data-stop="1011.783000">just dealing with whatever you get for free, right? We</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1012.924000" data-stop="1016.769000">already have comments. phyzixlab wants to know, well,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1017.390000" data-stop="1020.074000">phyzixlab says, Prot, I'm jealous of your beard. Which</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1020.194000" data-stop="1025.501000">Emacs package can I install to have a glorious beard like</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1025.521000" data-stop="1029.847000">you? Emacs Genes. Emacs Genes. Y'all can book your own</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1030.007000" data-stop="1032.830000">coaching session with Prat. Although technically, I don't</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1032.851000" data-stop="1034.535000">mind sharing mine.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1034.000000">00:17:14</span> <strong>My objectives</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1034.536000" data-stop="1038.723000">[Sacha]: Okay, so my objectives is I want to</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1038.742000" data-stop="1043.672000">capture and share more, right? And that's great because in</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1043.692000" data-stop="1045.636000">the experiments that I've been doing with live streaming so</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1045.715000" data-stop="1048.560000">far, I have found myself going on tangents based on people's</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1048.641000" data-stop="1052.568000">questions. And theoretically, I can go back and use those</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1052.648000" data-stop="1056.274000">transcripts, which I haven't yet. But that could be more</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1056.355000" data-stop="1059.926000">stuff into blog posts that are more searchable. And</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1059.946000" data-stop="1063.849000">creating opportunities for conversation, which I think</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1063.889000" data-stop="1066.011000">you've also been experiencing with your experiments with</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1066.071000" data-stop="1070.075000">live streams lately. Because it is nice to have that back and</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1070.135000" data-stop="1072.297000">forth when you're demonstrating something and you can</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1072.397000" data-stop="1076.421000">immediately show something that was unclear. Quick</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1076.481000" data-stop="1079.323000">overview of my timeline. Again, until June, I've got a</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1079.443000" data-stop="1082.386000">fairly predictable schedule, except for the times when the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1082.466000" data-stop="1085.369000">kid turns out to have a substitute teacher and is too grumpy</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1085.409000" data-stop="1089.713000">to go to school. So just some flexibility still with the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1089.733000" data-stop="1092.557000">schedule, but I am starting to experiment with scheduling</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1092.617000" data-stop="1096.702000">chats. So that's nice. And this is our first experiment with</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1096.762000" data-stop="1099.845000">it. I'm like, okay, let's try a live stream at this date at</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1099.905000" data-stop="1104.931000">this time with somebody who is going to show up also. And then</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1104.971000" data-stop="1107.214000">in July and August, since my schedule will be less</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1107.254000" data-stop="1110.397000">predictable, then we'll do more spontaneous things like we</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1110.437000" data-stop="1112.920000">also have been doing. And then September onwards is</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1112.960000" data-stop="1116.659000">probably going to be EmacsConf. So with that in mind, I want</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1116.699000" data-stop="1120.105000">to quickly share the updates from the last one. And</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1120.165000" data-stop="1123.730000">probably, you know, you will think about stuff and say, oh,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1123.891000" data-stop="1126.395000">yeah, have you thought about doing this? Or, oh, that's</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1126.455000" data-stop="1129.920000">good. Try this one next. Or in my experience, so and so and so.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1131.022000" data-stop="1134.147000">And of course, I'd love to hear what you've been learning</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1134.247000" data-stop="1136.450000">about also.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="1136.451000" data-stop="1139.190000">[Prot]: Yeah, yeah, yeah, yeah, yeah. Very good.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1139.000000">00:18:59</span> <strong>keycast-header-mode</strong></div><p></p><span class="audio-time caption" data-speaker="Prot" data-start="1139.191000" data-stop="1140.912000">[Prot]: And I will tell you my experience as well,</span> <span class="audio-time caption" data-speaker="Prot" data-start="1140.913000" data-stop="1142.535000">because based on our last exchange,</span> <span class="audio-time caption" data-speaker="Prot" data-start="1142.536000" data-stop="1145.681000">I also tried keycast at the top, for example.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1145.701000" data-stop="1149.586000">[Sacha]: Yeah, yeah. It gets out of the way of the closed captions.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="1149.587000" data-stop="1152.311000">[Prot]: It does. It does. Yeah. So it has some advantages and it's</span> <span class="audio-time caption" data-speaker="Prot" data-start="1152.391000" data-stop="1155.716000">always visible and the key and the command is always</span> <span class="audio-time caption" data-speaker="Prot" data-start="1155.776000" data-stop="1158.460000">visible. But I have to get used to it because it was</span> <span class="audio-time caption" data-speaker="Prot" data-start="1158.501000" data-stop="1161.097000">distracting me.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1161.098000" data-stop="1163.401000">[Sacha]: Yeah, I hear you, I hear you. It's kind of a</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1163.461000" data-stop="1167.346000">trade-off, right? And that actually goes to one of the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1167.406000" data-stop="1172.553000">points that I wanted to touch on later where getting the hang</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1172.733000" data-stop="1175.817000">of live streaming while coding or while working does</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1175.917000" data-stop="1181.144000">require a fair bit of trade-offs. On the plus side, I'm going</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1181.184000" data-stop="1185.870000">to see if this works. It should insert a chapter marker so</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1185.000000">00:19:45</span> <strong>Trade-offs when livestreaming while coding</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1185.910000" data-stop="1189.532000">[Sacha]: that I know, okay, this part to this part is this conversation.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1189.533000" data-stop="1192.898000">So when you're live streaming while you're</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1193.339000" data-stop="1195.883000">doing package maintenance or you're working on config or</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1195.903000" data-stop="1200.109000">whatever else, it is slightly more distracting because</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1200.329000" data-stop="1202.152000">people come up with interesting comments and</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1202.212000" data-stop="1206.959000">conversations. But on the plus side, it is also, as I've seen</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1207.019000" data-stop="1210.665000">you do, helpful at debugging. You're staring at something.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1210.685000" data-stop="1213.569000">You're like, what's wrong here? And someone is like, oh</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1213.589000" data-stop="1215.789000">yeah, you're missing a trailing slash.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="1215.790000" data-stop="1219.834000">[Prot]: Yes, yes. It really helps.</span> <span class="audio-time caption" data-speaker="Prot" data-start="1219.835000" data-stop="1222.418000">Well, I'm not sure if it helps, though, because the</span> <span class="audio-time caption" data-speaker="Prot" data-start="1222.478000" data-stop="1224.820000">fact that you are talking to the chat means that you are not</span> <span class="audio-time caption" data-speaker="Prot" data-start="1224.861000" data-stop="1230.087000">paying attention to what is in front of you. So it can cut both</span> <span class="audio-time caption" data-speaker="Prot" data-start="1230.187000" data-stop="1233.010000">ways, right? There are times, though, where it really</span> <span class="audio-time caption" data-speaker="Prot" data-start="1233.070000" data-stop="1236.394000">helps. Yes. Where you are completely lost and then the</span> <span class="audio-time caption" data-speaker="Prot" data-start="1236.454000" data-stop="1241.659000">people in the chat are like, hey, that's how you fix it.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1241.660000" data-stop="1246.089000">[Sacha]: All right. So maybe I just have to A, build up more of a</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1246.570000" data-stop="1250.798000">conversation so that we can get those benefits and B, figure</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1250.838000" data-stop="1255.467000">out how to run my narration on a separate worker thread in my</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1255.528000" data-stop="1259.975000">brain. I don't think it happens. I think I used to be more</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1260.035000" data-stop="1262.778000">multithreaded in the past, but I am slightly less</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1262.818000" data-stop="1265.422000">multithreaded now. However, it turns out that spending all</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1265.442000" data-stop="1269.207000">this time with kids means I am getting better at generating</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1269.267000" data-stop="1272.951000">verbal responses that I'm not necessarily, you know, like</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1273.332000" data-stop="1276.376000">focusing too much on or just saying like stuff to keep them</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1276.436000" data-stop="1280.241000">amused and entertained. Oh, that's quite a skill. Yes,</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="1280.381000" data-stop="1283.847000">[Prot]: that's good. That's good. I don't know. But yeah, so there</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1283.947000" data-stop="1284.868000">[Sacha]: are trade-offs here.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1284.000000">00:21:24</span> <strong>Trade-offs: seeing less text on the screen</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1284.869000" data-stop="1286.673000">[Sacha]: The other thing is now that I am using</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1286.713000" data-stop="1291.302000">mode to switch on my... I am streaming, do the Fontaine</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1291.362000" data-stop="1294.749000">preset and all of that stuff. Now there's like less space on</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1294.789000" data-stop="1299.693000">my screen for code. So I had to get used to it again. yes yes yes</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="1299.773000" data-stop="1303.220000">[Prot]: yes that that's one of the downsides of course yes like you</span> <span class="audio-time caption" data-speaker="Prot" data-start="1303.260000" data-stop="1306.546000">have to have a larger font so that people can see what you are</span> <span class="audio-time caption" data-speaker="Prot" data-start="1306.626000" data-stop="1311.014000">typing and then of course that comes at the cost of including</span> <span class="audio-time caption" data-speaker="Prot" data-start="1311.095000" data-stop="1315.838000">fewer things on screen Though maybe you could have a little</span> <span class="audio-time caption" data-speaker="Prot" data-start="1315.878000" data-stop="1319.244000">bit of a wider frame, like specifically in your case. I don't</span> <span class="audio-time caption" data-speaker="Prot" data-start="1319.264000" data-stop="1322.510000">know, it's already at the 80 characters already? Yeah, it's</span> <span class="audio-time caption" data-speaker="Prot" data-start="1322.590000" data-stop="1327.499000">already... Yeah, I think in my case, my frame fits about 100</span> <span class="audio-time caption" data-speaker="Prot" data-start="1327.599000" data-stop="1331.947000">characters. Well, I haven't measured it, but I think it's</span> <span class="audio-time caption" data-speaker="Prot" data-start="1332.027000" data-stop="1336.234000">something in that... Like, yeah, about there is my frame.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1336.254000" data-stop="1338.589000">[Sacha]: Yeah, it has about 80 characters.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1338.590000" data-stop="1340.900000">So it's about 75 characters.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="1340.901000" data-stop="1346.167000">[Prot]: So in my case...</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1346.168000" data-stop="1348.600000">[Sacha]: All right. And then the stream can tell me if this is</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1348.600000" data-stop="1348.600000">still readable, because of course more code on the screen</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1348.601000" data-stop="1357.733000">means more code getting written or done.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="1357.734000" data-stop="1361.706000">[Prot]: And just to say also more code on the screen means</span> <span class="audio-time caption" data-speaker="Prot" data-start="1361.767000" data-stop="1366.514000">that it can be easier to debug or write the code. Because you</span> <span class="audio-time caption" data-speaker="Prot" data-start="1366.574000" data-stop="1369.017000">have the context right there. You don't have to go up and down</span> <span class="audio-time caption" data-speaker="Prot" data-start="1369.117000" data-stop="1370.738000">the screen to find it.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1370.739000" data-stop="1372.341000">[Sacha]: Especially since I'm used to actually</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1372.421000" data-stop="1376.586000">dividing my frame into two windows so I can do left and right.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1377.367000" data-stop="1382.734000">And I'm doing this on a standard aspect mode. You have a</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1382.814000" data-stop="1385.237000">widescreen, so you're a little bit spoiled in this regard. I</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1385.297000" data-stop="1389.782000">only have like two monitors that I'm doing. But maybe that is</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1389.842000" data-stop="1395.048000">what I'll end up just using separate frames for. Yes, so</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1395.208000" data-stop="1398.471000">slightly smaller font size, and stream can tell me whether</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1398.491000" data-stop="1403.777000">this is too small for them. I know people who are older will</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1403.797000" data-stop="1407.180000">develop an appreciation for larger font also, so take</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1407.220000" data-stop="1410.804000">advantage of this ability to work with medium-sized fonts</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1410.864000" data-stop="1417.412000">while they can. So font sets, that's definitely a thing. And</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1417.492000" data-stop="1422.212000">then just trying to figure out how I can make it</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1422.312000" data-stop="1429.021000">more useful both to other people and for myself and during</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1429.102000" data-stop="1432.185000">the live stream as well as after the live stream.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1432.000000">00:23:52</span> <strong>Lowering the effort needed to announce a stream: Prot just announces it and the blog post embeds it</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1432.186000" data-stop="1434.108000">[Sacha]: Now you've mentioned you don't actually go back into</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1434.109000" data-stop="1436.251000">your live streams afterwards.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1436.252000" data-stop="1440.738000">You just plug the YouTube video, you update</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1440.778000" data-stop="1443.302000">your description so that it's past tense instead of future</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1443.362000" data-stop="1445.565000">tense and you republish your post. I think that's your</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1445.605000" data-stop="1452.470000">workflow, right? Even less. So I don't even retrofit the</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="1452.530000" data-stop="1455.243000">[Prot]: past tense, you know, present tense to past tense. It's like</span> <span class="audio-time caption" data-speaker="Prot" data-start="1455.364000" data-stop="1458.264000">all present tense. It's like I will do a live stream. It will</span> <span class="audio-time caption" data-speaker="Prot" data-start="1458.284000" data-stop="1461.827000">be recorded. You can find it here kind of thing. Okay.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1461.828000" data-stop="1462.388000">[Sacha]: All right.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="1462.389000" data-stop="1465.732000">[Prot]: And so just to say, though, just to say the reason I do</span> <span class="audio-time caption" data-speaker="Prot" data-start="1465.793000" data-stop="1470.178000">this is because I don't want to go through a three hour stream</span> <span class="audio-time caption" data-speaker="Prot" data-start="1470.258000" data-stop="1472.941000">again because then a three hour stream becomes like a ten</span> <span class="audio-time caption" data-speaker="Prot" data-start="1473.021000" data-stop="1476.665000">hour stream in practice. And this means that it adds</span> <span class="audio-time caption" data-speaker="Prot" data-start="1476.805000" data-stop="1479.909000">friction and it adds to the requirements, which</span> <span class="audio-time caption" data-speaker="Prot" data-start="1479.969000" data-stop="1482.992000">effectively means I will be doing fewer of them. Yeah.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1483.000000">00:24:43</span> <strong>Timestamps</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1483.630000" data-stop="1486.875000">[Sacha]: That's what I'm thinking. Maybe lightweight sort of</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1487.476000" data-stop="1491.402000">chapter markers. You've mentioned you just remember this</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1491.442000" data-stop="1494.207000">sort of stuff, but since I don't actually remember this sort</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1494.247000" data-stop="1499.235000">of stuff, having a way for Emacs to send messages to the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1499.275000" data-stop="1504.322000">stream and also show things in the timestamps. I have a</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1504.382000" data-stop="1510.790000">timestamp now. It's nice. It just says Org Capture. And all</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1510.830000" data-stop="1513.993000">that will then theoretically make it easier for me to say,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1514.173000" data-stop="1517.257000">okay, let's go find the chapter and then I'll just adjust the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1517.317000" data-stop="1520.260000">timestamps afterwards to say, okay, from this point to this</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1520.320000" data-stop="1524.325000">point. If people are interested, they can go in there and</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1524.365000" data-stop="1528.196000">they can look at the transcript for more.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="1528.197000" data-stop="1531.682000">[Prot]: I think we discussed this last time as well.</span> <span class="audio-time caption" data-speaker="Prot" data-start="1531.683000" data-stop="1532.544000">You could have a function</span> <span class="audio-time caption" data-speaker="Prot" data-start="1532.584000" data-stop="1537.372000">like start-stream and it starts a timer or it starts</span> <span class="audio-time caption" data-speaker="Prot" data-start="1537.433000" data-stop="1540.458000">recording the time and then relative to that point, any</span> <span class="audio-time caption" data-speaker="Prot" data-start="1540.558000" data-stop="1543.863000">offset and that's your timestamp right away. And whenever</span> <span class="audio-time caption" data-speaker="Prot" data-start="1543.943000" data-stop="1547.489000">there is some event happening, you can type a key and then</span> <span class="audio-time caption" data-speaker="Prot" data-start="1547.550000" data-stop="1551.336000">maybe it gives you a prompt and you write what is it, like just</span> <span class="audio-time caption" data-speaker="Prot" data-start="1551.376000" data-stop="1553.931000">a string and then that is the chapter.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1553.932000" data-stop="1557.735000">[Sacha]: An org timer will do that kind of insert a timestamp for you.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1557.736000" data-stop="1559.276000">But one of the reasons why I liked having</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1559.277000" data-stop="1563.482000">my custom show message thing is</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1563.642000" data-stop="1568.006000">that it can display the text on the screen, display a QR code</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1568.106000" data-stop="1570.989000">for the text in case people want to copy the function that I'm</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1571.029000" data-stop="1575.373000">talking about, send it to the chat so that people using video</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1575.393000" data-stop="1580.370000">on demand can say, oh yeah, at around 10:25 or whatever. I'm</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1580.410000" data-stop="1583.396000">currently using wall-clock timestamps, which means I need to</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1583.456000" data-stop="1587.745000">modify my mode line so that the time starts earlier and</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1587.785000" data-stop="1593.757000">people can use that to jump around the thing. And then, so</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1593.777000" data-stop="1597.364000">it's like in half a dozen places, which is what org-timer does</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1597.404000" data-stop="1600.883000">not get me if I'm just inserting a timestamp here. Anyway,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1601.423000" data-stop="1604.728000">minor, like, you know, little workflow improvements. But</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1604.868000" data-stop="1609.595000">it's this whole, as you said, I don't want to go back and spend</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1609.755000" data-stop="1613.059000">six hours processing the three-hour livestream. I want to</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1613.119000" data-stop="1616.844000">say, all right, this video has some potential interesting</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1616.884000" data-stop="1619.548000">things here because these people ask these questions. This</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1619.608000" data-stop="1623.874000">is roughly the time when I answer those questions. Ideally,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1623.894000" data-stop="1626.357000">this is the text of the question. Someday, there might even</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1626.417000" data-stop="1630.164000">be screenshots and clips. I'm modifying compile-media to</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1630.204000" data-stop="1632.910000">make it easier for me to do that kind of video editing from</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1632.950000" data-stop="1635.173000">within Emacs.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="1635.174000" data-stop="1636.215000">[Prot]: Oh, wonderful.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1636.216000" data-stop="1637.839000">[Sacha]: yeah, yeah. But it's all</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1637.899000" data-stop="1640.243000">still like, okay, progress. First, I've got to develop the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1640.304000" data-stop="1642.868000">habit of streaming, and then I have to develop the habit of</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1642.928000" data-stop="1647.016000">saying, now we are talking about this topic so that it can all</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1647.076000" data-stop="1649.308000">get marked everywhere.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1649.000000">00:27:29</span> <strong>Different types of livestreams</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1649.309000" data-stop="1651.712000">[Sacha]: And that got me to thinking, well,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1651.732000" data-stop="1654.216000">there are a couple of different types of live streams and you</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1654.236000" data-stop="1657.060000">might have also done something about which ones fit the way</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1657.080000" data-stop="1660.184000">that you had to present. One is the, you know, the, I'm going</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1660.204000" data-stop="1663.549000">to spend time doing this anyway, which is like your package</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1663.609000" data-stop="1666.372000">maintenance, where you will accept a little bit of</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1666.413000" data-stop="1670.498000">distractibility for the benefit of having other people</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1670.618000" data-stop="1673.683000">around to ask questions and clarify things and stop you when</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1673.703000" data-stop="1681.125000">you're getting stuck somewhere. I have</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1681.185000" data-stop="1683.470000">something I specifically want to teach and you've done this</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1683.510000" data-stop="1686.094000">before with walking through a blog post and just</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1686.154000" data-stop="1689.100000">demonstrating things interactively because there's some</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1689.120000" data-stop="1692.546000">things that are easier when you're showing it, right?</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="1693.500000" data-stop="1694.826000">[Prot]: Correct, correct. ...</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1694.000000">00:28:14</span> <strong>Reading other people's configs</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1694.827000" data-stop="1697.090000">[Sacha]: Reacting to other things. In this</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1697.170000" data-stop="1699.494000">one, I've started to have fun with because I've been going</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1699.514000" data-stop="1702.518000">through your Emacs configuration, which is several</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1702.578000" data-stop="1706.885000">hundred pages when converted to a PDF. And I forget, do you</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1706.965000" data-stop="1709.990000">actually, like, do you produce a PDF, PDF, like a nicely</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1710.410000" data-stop="1711.391000">thingy?</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="1711.392000" data-stop="1713.954000">[Prot]: I haven't done it, but that's trivial to do, actually.</span> <span class="audio-time caption" data-speaker="Prot" data-start="1713.955000" data-stop="1715.056000">I could do it.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1715.057000" data-stop="1718.341000">[Sacha]: Yeah, yeah, so I've also been reading tecosaur's PDF,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1718.342000" data-stop="1720.043000">and his PDF is gorgeous.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1720.044000" data-stop="1724.522000">Like, it starts off with, like, a cover page and and everything.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1724.523000" data-stop="1726.206000">But it's Doom Emacs. I have to translate a</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1726.247000" data-stop="1732.498000">lot of things to my specific setup. But now I have literate</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1732.538000" data-stop="1738.069000">config envy. Anyway, that's an entire category of live</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1738.089000" data-stop="1740.634000">streams here, which could just be me copying interesting</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1740.674000" data-stop="1744.760000">things out of other people's configs. Today we are</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1744.800000" data-stop="1748.103000">experimenting with a chatting with a guest variety of live</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1748.123000" data-stop="1751.687000">stream, which you also do with your Prot asks. Actually, I</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1751.707000" data-stop="1753.548000">forget. Are those live streams?</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="1753.549000" data-stop="1755.391000">[Prot]: They are not live streamed,</span> <span class="audio-time caption" data-speaker="Prot" data-start="1755.431000" data-stop="1758.755000">but the idea is that I do not edit them. However, if somebody</span> <span class="audio-time caption" data-speaker="Prot" data-start="1758.835000" data-stop="1763.039000">really wants, I can edit it. So the idea is let's go with the</span> <span class="audio-time caption" data-speaker="Prot" data-start="1763.100000" data-stop="1766.743000">flow. Don't worry about it. It's casual, all that. But if</span> <span class="audio-time caption" data-speaker="Prot" data-start="1766.804000" data-stop="1769.667000">somebody says something that doesn't sound right, doesn't</span> <span class="audio-time caption" data-speaker="Prot" data-start="1769.707000" data-stop="1771.808000">mean it or whatever, I'm happy to edit it.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1771.809000" data-stop="1775.616000">[Sacha]: Yeah. I'm starting to look into how to do that</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1775.617000" data-stop="1777.602000">if I'm doing this live and</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1777.662000" data-stop="1783.676000">apparently if I set up a sufficiently long buffer in OBS for</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1783.716000" data-stop="1788.125000">streaming, like a delay for 20 seconds or 15 seconds, then I</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1788.166000" data-stop="1792.611000">can stop streaming and the stuff that happened in the last 10</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1792.672000" data-stop="1796.897000">or 15 seconds doesn't make it out to the public, but it's</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1797.738000" data-stop="1798.278000">still kind of...</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="1798.279000" data-stop="1799.740000">[Prot]: Living dangerously, yeah.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1799.741000" data-stop="1800.402000">[Sacha]: Yeah, yeah.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1800.422000" data-stop="1803.005000">Because seeing as I'm still practicing remembering to flip</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1803.025000" data-stop="1807.832000">the webcam down when the kid runs in and wants to be on camera,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1807.852000" data-stop="1812.017000">I'm like... My reaction time, not there yet.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1812.000000">00:30:12</span> <strong>Hanging out</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1812.018000" data-stop="1813.319000">[Sacha]: And then other</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1813.359000" data-stop="1818.224000">people are like, they just hang out. They're not like, I'm</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1818.264000" data-stop="1820.527000">going to do something. They're just hanging out, which I'm</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1820.607000" data-stop="1822.849000">sort of starting to experiment with when I'm doing Emacs</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1822.909000" data-stop="1825.752000">News on Mondays, because I'm like, I'm categorizing it</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1825.812000" data-stop="1829.035000">anyway, but it doesn't require a lot of brainpower because</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1829.055000" data-stop="1831.338000">I'm not coding or debugging. I'm just saying, okay, this</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1831.378000" data-stop="1833.760000">looks like an Org Mode link. This looks like a miscellaneous</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1834.000000" data-stop="1838.565000">link. And then some people just play games, which is fun too.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="1838.866000" data-stop="1842.089000">[Prot]: Yes, that's good. And they want to have somebody on the side,</span> <span class="audio-time caption" data-speaker="Prot" data-start="1843.131000" data-stop="1845.452000">guide them through what they are doing.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1845.453000" data-stop="1848.996000">[Sacha]: Yeah, or it blends into a hanging out sort of thing.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1848.997000" data-stop="1852.180000">Yes, yes. And it's like,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1852.200000" data-stop="1854.562000">what is the kiddo doing now?</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="1854.563000" data-stop="1856.004000">[Prot]: Yeah, the camera, the camera.</span> <span class="audio-time caption" data-speaker="Prot" data-start="1856.125000" data-stop="1864.333000">That's fun, that's fun. Good reaction time. Yeah, yeah,</span> <span class="audio-time caption" data-speaker="Prot" data-start="1864.714000" data-stop="1868.738000">yeah.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1870.338000" data-stop="1872.903000">[Sacha]: Yes, thank you for your homework. I will scan this and put it</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1873.003000" data-stop="1880.035000">online later. This is it. Yes, life. Life.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="1880.036000" data-stop="1882.339000">[Prot]: Putting your reaction time to the test.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1882.340000" data-stop="1886.288000">[Sacha]: Yes. So in terms of getting more</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1886.508000" data-stop="1889.180000">out of livestreams, That's what I've been thinking about</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1889.260000" data-stop="1893.126000">lately. I think I would like to do more of these, you know,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1893.687000" data-stop="1897.032000">hey, folks, keep keeping company while I'm coding this or</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1897.072000" data-stop="1899.677000">whatever, since you've been having a lot of good experience</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1899.717000" data-stop="1900.737000">with that.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1900.000000">00:31:40</span> <strong>Livestreams for explaining specific things</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1900.738000" data-stop="1903.002000">[Sacha]: I would also like to eventually move into more of</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1903.042000" data-stop="1905.365000">these. I have something I specifically want to</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1905.406000" data-stop="1907.829000">demonstrate, which probably necessitates actually</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1907.970000" data-stop="1911.415000">organizing my thoughts. And you've done a bunch of these.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1911.850000" data-stop="1915.104000">After writing a post, it seems like more like recording a</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1915.164000" data-stop="1918.920000">video and walking through it. Do you also sometimes do them</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1918.980000" data-stop="1920.692000">before writing a post?</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1920.000000">00:32:00</span> <strong>Prot on didactic livestreams</strong></div><p></p><span class="audio-time caption" data-speaker="Prot" data-start="1920.693000" data-stop="1923.155000">[Prot]: I haven't done that but actually,</span> <span class="audio-time caption" data-speaker="Prot" data-start="1923.156000" data-stop="1925.339000">when I write posts, I write them in one go,</span> <span class="audio-time caption" data-speaker="Prot" data-start="1925.340000" data-stop="1926.620000">so maybe I should do a live stream</span> <span class="audio-time caption" data-speaker="Prot" data-start="1926.621000" data-stop="1928.884000">where I actually write a blog post</span> <span class="audio-time caption" data-speaker="Prot" data-start="1928.885000" data-stop="1933.330000">just to show that I can do it.</span> <span class="audio-time caption" data-speaker="Prot" data-start="1933.331000" data-stop="1936.616000">The thing is of course what do you want to</span> <span class="audio-time caption" data-speaker="Prot" data-start="1936.676000" data-stop="1939.840000">communicate, because if it's teaching, like if you are</span> <span class="audio-time caption" data-speaker="Prot" data-start="1939.920000" data-stop="1943.004000">writing it and trying to teach it at the same time,</span> <span class="audio-time caption" data-speaker="Prot" data-start="1943.005000" data-stop="1945.447000">there is a chance that you might leave something out.</span> <span class="audio-time caption" data-speaker="Prot" data-start="1945.448000" data-stop="1949.411000">Some of that detail, some of that nuance.</span> <span class="audio-time caption" data-speaker="Prot" data-start="1949.412000" data-stop="1951.833000">For example, if you want to explain how</span> <span class="audio-time caption" data-speaker="Prot" data-start="1951.834000" data-stop="1955.978000">a form in Emacs Lisp works, let's say if or cond,</span> <span class="audio-time caption" data-speaker="Prot" data-start="1956.478000" data-stop="1960.522000">you may not come up with a very good example live and it may not</span> <span class="audio-time caption" data-speaker="Prot" data-start="1960.582000" data-stop="1963.645000">have didactic value. So even though you know how it works,</span> <span class="audio-time caption" data-speaker="Prot" data-start="1964.926000" data-stop="1970.471000">the communication value is not there. So that it helps for</span> <span class="audio-time caption" data-speaker="Prot" data-start="1970.531000" data-stop="1974.315000">you to write it in advance. Even if it's in one go, again, you</span> <span class="audio-time caption" data-speaker="Prot" data-start="1974.335000" data-stop="1976.797000">can write it, you can read it, and then you can come up with a</span> <span class="audio-time caption" data-speaker="Prot" data-start="1976.837000" data-stop="1981.981000">good example and then stream that. So it really depends on</span> <span class="audio-time caption" data-speaker="Prot" data-start="1982.021000" data-stop="1984.824000">what you want to do. The other day I did a stream, a live</span> <span class="audio-time caption" data-speaker="Prot" data-start="1984.864000" data-stop="1988.107000">stream, where I was writing a package from scratch, a small</span> <span class="audio-time caption" data-speaker="Prot" data-start="1988.147000" data-stop="1993.551000">package. So there part of it was to teach, but also to</span> <span class="audio-time caption" data-speaker="Prot" data-start="1993.651000" data-stop="1999.636000">demonstrate. And there I don't really care if the didactic</span> <span class="audio-time caption" data-speaker="Prot" data-start="1999.696000" data-stop="2003.801000">value is very high. Because even if there are mistakes, it's</span> <span class="audio-time caption" data-speaker="Prot" data-start="2003.942000" data-stop="2007.290000">part of the process. It's not like, well, you will come here</span> <span class="audio-time caption" data-speaker="Prot" data-start="2007.731000" data-stop="2011.281000">and from zero to hero kind of thing, you will learn</span> <span class="audio-time caption" data-speaker="Prot" data-start="2011.361000" data-stop="2013.827000">everything. It's not like that. It's like you come here, you</span> <span class="audio-time caption" data-speaker="Prot" data-start="2013.947000" data-stop="2018.280000">might learn something, but the bar is relatively low.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2018.281000" data-stop="2022.125000">[Sacha]: I think especially since my mind likes to jump around a lot&#45;&#45;</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2022.145000" data-stop="2025.408000">you seem a lot more organized when you're thinking through</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2025.428000" data-stop="2027.169000">things, especially if you're saying you write your blog</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2027.189000" data-stop="2030.793000">posts straight in one go. I'm like, okay, do this part over</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2030.833000" data-stop="2033.115000">here, do that part there. I will definitely lose things,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2033.455000" data-stop="2036.538000">like you mentioned, and I will definitely go back and say,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2036.819000" data-stop="2041.944000">no, I need to do this before I can say that. So yeah, I think I</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2041.984000" data-stop="2045.227000">can save that for summer when I might be focusing more on</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2045.267000" data-stop="2047.811000">things I cannot schedule.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2047.000000">00:34:07</span> <strong>Prot suggests breadcrumbs</strong></div><p></p><span class="audio-time caption" data-speaker="Prot" data-start="2047.812000" data-stop="2050.356000">[Prot]: How about leaving breadcrumbs</span> <span class="audio-time caption" data-speaker="Prot" data-start="2050.596000" data-stop="2054.521000">for yourself? Like, I was writing this. Like, write a</span> <span class="audio-time caption" data-speaker="Prot" data-start="2054.561000" data-stop="2057.284000">comment. Basically, I was writing this, I need to remember</span> <span class="audio-time caption" data-speaker="Prot" data-start="2057.364000" data-stop="2059.527000">that, and then you jump off on the tangent.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2064.415000" data-stop="2069.583000">[Sacha]: I need to use a universal prefix to get the time, don't I? Yes.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2070.684000" data-stop="2076.187000">Leaving yourself breadcrumbs. Yeah, yeah, yeah.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="2076.188000" data-stop="2079.511000">[Prot]: And then you can retrace your thoughts, basically.</span> <span class="audio-time caption" data-speaker="Prot" data-start="2079.512000" data-stop="2082.575000">Like, okay, I was here, I was meaning to do that.</span> <span class="audio-time caption" data-speaker="Prot" data-start="2082.576000" data-stop="2085.117000">Especially when you are streaming, chances are that</span> <span class="audio-time caption" data-speaker="Prot" data-start="2085.118000" data-stop="2086.940000">there will be several comments</span> <span class="audio-time caption" data-speaker="Prot" data-start="2086.980000" data-stop="2089.882000">that are very interesting and you want to get to. And you</span> <span class="audio-time caption" data-speaker="Prot" data-start="2089.922000" data-stop="2093.507000">might be talking to them for 10 minutes or more. And then, of</span> <span class="audio-time caption" data-speaker="Prot" data-start="2093.547000" data-stop="2096.469000">course, if you don't have that or you want to jump off on a</span> <span class="audio-time caption" data-speaker="Prot" data-start="2096.510000" data-stop="2099.211000">tangent, you will eventually forget what you were doing.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2099.212000" data-stop="2100.813000">[Sacha]: Do you have anything like this already</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2100.814000" data-stop="2102.520000">that you're currently doing?</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="2102.521000" data-stop="2105.353000">[Prot]: And no, but this is the sort of thing that should be a</span> <span class="audio-time caption" data-speaker="Prot" data-start="2105.453000" data-stop="2108.667000">fun exercise to actually demonstrate as well for yourself.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2109.052000" data-stop="2115.721000">[Sacha]: I use ZZZ if I just put it in text and I have some things, for</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2115.761000" data-stop="2119.086000">example, in my message hooks so I can't send email that</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2119.126000" data-stop="2123.492000">contains this. And</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2123.632000" data-stop="2127.919000">of course, org has its whole clocking and interrupting</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2127.959000" data-stop="2132.365000">tasks that I can use. I just have to have the presence of mind</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2132.405000" data-stop="2134.948000">to actually say, oh yeah, now I'm going to go on this tangent</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2135.008000" data-stop="2138.352000">and I want to go back to this later on. Leaving myself</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2138.392000" data-stop="2140.883000">breadcrumbs is definitely something I need to formalize</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2141.044000" data-stop="2145.096000">into workflows that I actually use.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="2145.097000" data-stop="2146.018000">[Prot]: Yeah, that's the thing.</span> <span class="audio-time caption" data-speaker="Prot" data-start="2146.038000" data-stop="2148.802000">And you can also benefit. I don't know. Of course, that's</span> <span class="audio-time caption" data-speaker="Prot" data-start="2148.922000" data-stop="2152.387000">depending on if you are a visual person or not. But you could</span> <span class="audio-time caption" data-speaker="Prot" data-start="2152.667000" data-stop="2158.015000">also rely on color or, for example, include an emoji as well</span> <span class="audio-time caption" data-speaker="Prot" data-start="2158.235000" data-stop="2162.401000">or modify font-lock-keywords to have like something that</span> <span class="audio-time caption" data-speaker="Prot" data-start="2162.461000" data-stop="2167.387000">stands out. Basically, make it clear that, well, this is an</span> <span class="audio-time caption" data-speaker="Prot" data-start="2167.588000" data-stop="2171.913000">interjection. I will just go and then I will be back. Yeah.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2171.933000" data-stop="2175.439000">[Sacha]: Good idea. Okay. So that will definitely help with the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2175.519000" data-stop="2180.586000">things where maybe I want to demonstrate something and I</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2180.646000" data-stop="2184.030000">want to do the thinking out loud so that it's recorded. And</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2184.210000" data-stop="2186.754000">just in case other people have any questions, they can come</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2186.814000" data-stop="2192.722000">by and ask them. And then I can sort of massage it into a proper</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2192.782000" data-stop="2198.269000">blog post, but still leave the link to the video in case</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2198.309000" data-stop="2201.173000">people want to hear the stream of consciousness figuring</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2201.233000" data-stop="2205.795000">out of all of this stuff. That sounds like maybe a more</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2205.876000" data-stop="2210.764000">polished video or blog post with screenshots and clips</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2211.585000" data-stop="2216.193000">coming out of this livestream ramble, kind of tangled.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2216.574000" data-stop="2222.584000">Okay, we're going to jump over here. Gotta leave myself a</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2222.644000" data-stop="2224.748000">breadcrumb because I'm going to go in this detour to answer</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2224.788000" data-stop="2226.281000">someone's question.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="2226.282000" data-stop="2229.846000">[Prot]: There is value to both. There is value</span> <span class="audio-time caption" data-speaker="Prot" data-start="2229.886000" data-stop="2232.750000">to both because the live stream is a stream of</span> <span class="audio-time caption" data-speaker="Prot" data-start="2232.810000" data-stop="2235.654000">consciousness. You can think of it like a bubbling effect.</span> <span class="audio-time caption" data-speaker="Prot" data-start="2235.714000" data-stop="2239.438000">There is fermentation going on, a lot of things happening.</span> <span class="audio-time caption" data-speaker="Prot" data-start="2239.458000" data-stop="2242.162000">And then when you publish the polished, the finished</span> <span class="audio-time caption" data-speaker="Prot" data-start="2242.282000" data-stop="2244.945000">article, that's the distillation effect. So fermentation</span> <span class="audio-time caption" data-speaker="Prot" data-start="2245.005000" data-stop="2248.589000">distillation. So both are useful. Both is good to see and</span> <span class="audio-time caption" data-speaker="Prot" data-start="2249.030000" data-stop="2252.803000">have a sense of what they are up to, what they are doing. Yeah.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2252.823000" data-stop="2256.787000">[Sacha]: And Charlie in the comments says he likes Emacs' excursions</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2256.867000" data-stop="2259.970000">terminology. So if you can think of it as a save excursion,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2260.050000" data-stop="2263.573000">I'm going to go do something and then come back. I am not very</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2263.593000" data-stop="2269.279000">good at popping the stack, but I will work on it. Yes. A couple</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2269.319000" data-stop="2271.641000">of other things that I want you to pick your brain about. So</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2271.861000" data-stop="2274.944000">you mentioned that in terms of announcing live streams,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2275.184000" data-stop="2278.868000">you're like, look, I'm remembering to mark a topic change.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2279.000000">00:37:59</span> <strong>Announcing livestreams</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2279.978000" data-stop="2283.442000">[Sacha]: So you mentioned, okay, you have a post for the scheduled or</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2283.482000" data-stop="2287.226000">spontaneous live streams. Then you actually, you don't</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2287.286000" data-stop="2288.908000">even update it with the description. You write the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2288.928000" data-stop="2292.112000">description beforehand and you leave it alone. Probably</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2292.352000" data-stop="2295.776000">when people get it in their RSS reader, I guess the YouTube</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2295.856000" data-stop="2298.960000">embed always just points to, you know, it's either the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2299.020000" data-stop="2302.043000">currently playing live stream or the archived recording of</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2302.163000" data-stop="2308.911000">it. And that's that. The link is the same. The link is the</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="2308.951000" data-stop="2312.806000">[Prot]: same. Yes. Yeah, on this live page. So now I have</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2312.866000" data-stop="2316.871000">[Sacha]: yayemacs.com and SachaChua.com/live pointing to</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2316.931000" data-stop="2321.296000">this page. And there's like, there's a YouTube way to embed</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2321.336000" data-stop="2325.100000">just like upcoming live stream, but then it's like fiddly</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2325.140000" data-stop="2328.705000">when it comes to, oh, you know, you've got, if you have more</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2328.745000" data-stop="2332.309000">than one public up scheduled live stream or whatever, do you</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2332.489000" data-stop="2334.731000">use any of this stuff at all where you're like saying a page</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2335.052000" data-stop="2338.382000">that's always has your upcoming or current stuff?</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2338.000000">00:38:58</span> <strong>Embeds: Prot embeds specific YouTube videos instead of the general channel one</strong></div><p></p><span class="audio-time caption" data-speaker="Prot" data-start="2338.383000" data-stop="2342.808000">[Prot]: No, I have a generic embed which I copied many, many years ago</span> <span class="audio-time caption" data-speaker="Prot" data-start="2342.809000" data-stop="2345.712000">and I have it in my static site generator.</span> <span class="audio-time caption" data-speaker="Prot" data-start="2345.713000" data-stop="2350.699000">Then the only field that changes is the ID of the video.</span> <span class="audio-time caption" data-speaker="Prot" data-start="2350.700000" data-stop="2355.585000">And this works for live streams as well as pre-recorded videos.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2355.586000" data-stop="2359.210000">[Sacha]: Okay, so you always give it like the video IDs basically.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="2359.211000" data-stop="2363.356000">[Prot]: The video ID, yes. I can share with you the exact snippet.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2363.357000" data-stop="2367.502000">[Sacha]: Yeah, yeah. That would be, you know, and you can send...</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="2367.503000" data-stop="2369.588000">[Prot]: Yeah. Well, it's public anyway.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2369.589000" data-stop="2372.913000">[Sacha]: I can steal it off your website. It's fine.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2372.000000">00:39:32</span> <strong>Demo of my new shortcut for converting time zones</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2372.914000" data-stop="2378.583000">[Sacha]: And then I have just added timestamp translation as well.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2378.584000" data-stop="2379.265000">So I can say,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2379.305000" data-stop="2383.573000">okay, you know, let me show it to you. So this is my webpage,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2383.593000" data-stop="2387.299000">right? So here, this is your standard org timestamp. Yeah.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2388.441000" data-stop="2392.448000">And if I open up https://sachachua.com/live, it's also the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2392.468000" data-stop="2398.002000">same as Emacs. Okay, okay, okay. And I find the browser</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2398.763000" data-stop="2405.731000">window. Okay. Theoretically, if I say, okay, down here, you</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2405.791000" data-stop="2410.936000">click on this, it translates it to your language. Ah, nice,</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="2410.956000" data-stop="2411.196000">[Prot]: Nice, nice.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2411.197000" data-stop="2414.280000">[Sacha]: Because YouTube will do that for the upcoming</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2414.400000" data-stop="2417.604000">one if people link to it. But, you know, it's just people. But</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2417.624000" data-stop="2420.307000">this is JavaScript, anyhow. And the other thing that I have</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2420.407000" data-stop="2427.036000">just added today is I can go onto that in Org. If I press my</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2427.116000" data-stop="2433.524000">control dot embark thing, I can use my Sacha Org timestamp in</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2433.584000" data-stop="2436.989000">time zones, which is shift W. And it translates it into</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2437.029000" data-stop="2437.930000">a gazillion time zones.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2441.315000" data-stop="2444.677000">So then I can mastodon toot it, which I did,</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="2444.678000" data-stop="2450.304000">[Prot]: Just to say that copy to the kill ring, okay, yes, okay, good, good, good.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2450.484000" data-stop="2456.150000">[Sacha]: Because time zones suck. I mean, it's great, but I cannot</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2456.210000" data-stop="2461.035000">do the translation and so I am slightly... I'm working on</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2461.335000" data-stop="2466.100000">announcing those upcoming scheduled streams while</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2466.461000" data-stop="2469.963000">doing all the math so that... well, having emacs do all the math so</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2469.964000" data-stop="2472.606000">that I don't have to do the math.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="2472.607000" data-stop="2473.531000">[Prot]: Yes, that's the spirit.</span> <span class="audio-time caption" data-speaker="Prot" data-start="2473.692000" data-stop="2477.043000">That's good. Very good. This is very nice.</span> <span class="audio-time caption" data-speaker="Prot" data-start="2477.044000" data-stop="2479.814000">Is this timestamp always meant for Mastodon</span> <span class="audio-time caption" data-speaker="Prot" data-start="2479.815000" data-stop="2481.632000">or do you have it elsewhere?</span> <span class="audio-time caption" data-speaker="Prot" data-start="2481.633000" data-stop="2483.692000">I think I've seen it in the Emacs news as well.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2483.693000" data-stop="2487.237000">[Sacha]: Oh yeah, I'm basically stealing the code.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2487.238000" data-stop="2491.524000">I've used it in Emacs Conf and</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2491.585000" data-stop="2495.490000">for Emacs News. I used to announce the Emacs News events</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2495.590000" data-stop="2500.117000">also. I should get back to doing that. But definitely in the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2500.217000" data-stop="2504.243000">Emacs News and Emacs Calendar, I translate all of the events</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2504.443000" data-stop="2508.488000">into multiple time zones for the virtual ones.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2508.000000">00:41:48</span> <strong>Ozzloy's questions about time zones and QR codes</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2508.489000" data-stop="2512.014000">[Sacha]: Line 23 doesn't have a time offset.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2514.255000" data-stop="2525.465000">Okay, someone is commenting.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2525.466000" data-stop="2527.868000">Ozzloy will tell me about it a little bit later.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2527.968000" data-stop="2530.511000">Ozzloy also has a question. Am I creating the QR code with</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2530.631000" data-stop="2535.035000">Emacs Lisp? Is it actually text in Emacs? I'm going to go on a</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2535.175000" data-stop="2539.620000">quick detour to show the QR code. Yes, do it, do it, do it. By</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="2539.660000" data-stop="2543.323000">[Prot]: the way, I will like the stream. I didn't have the chance to do</span> <span class="audio-time caption" data-speaker="Prot" data-start="2543.363000" data-stop="2553.253000">that. A show string. Yes. So here, this is my... Look, I'm</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2553.333000" data-stop="2556.679000">[Sacha]: using line numbers, but they're really long. Yeah, these</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="2556.739000" data-stop="2561.287000">[Prot]: are massive. Of course. What can we do? But it's still better</span> <span class="audio-time caption" data-speaker="Prot" data-start="2561.347000" data-stop="2565.474000">because I can say, okay, go to 97, right? And you kind of know</span> <span class="audio-time caption" data-speaker="Prot" data-start="2565.534000" data-stop="2569.234000">where I mean. Yeah. Yeah, so this is qrencode, qrencode</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2569.254000" data-stop="2573.039000">[Sacha]: format, and all of that stuff. It is in Emacs. I think this one</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2573.059000" data-stop="2575.782000">actually inserts text. There's probably a way to get it to</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2575.802000" data-stop="2582.670000">get images as well. But yeah, so QR codes, because why not?</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="2582.690000" data-stop="2585.033000">[Prot]: Yeah, no, that's very efficient. Yeah, yeah, good, good.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2586.635000" data-stop="2594.683000">[Sacha]: Okay. Yes. So these timestamps are basically in my local</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2594.723000" data-stop="2598.467000">time, and then I can translate them to other time zones, and</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2598.527000" data-stop="2601.911000">then I can start announcing them, which will probably happen</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2601.971000" data-stop="2606.255000">more if I can get my GotoSocial Mastodon thing to be more</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2606.316000" data-stop="2609.799000">reliable. But also following your example, I should try</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2609.859000" data-stop="2612.242000">putting it in my blog. I just feel like a little weird</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2612.282000" data-stop="2616.826000">suddenly going from posting on my blog like once or twice,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2616.846000" data-stop="2619.763000">well, two or three times a week to Hey, OK, every day. All</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2619.783000" data-stop="2622.065000">right. In ten minutes, you're going to have a live stream of</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2622.085000" data-stop="2623.227000">me talking about random stuff.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2626.000000">00:43:46</span> <strong>Prot on announcing livestreams on blogs</strong></div><p></p><span class="audio-time caption" data-speaker="Prot" data-start="2626.070000" data-stop="2630.456000">[Prot]: Well, in a sense, it is weird because it's not something you</span> <span class="audio-time caption" data-speaker="Prot" data-start="2630.476000" data-stop="2633.640000">would normally do on a blog, right? Like you have been</span> <span class="audio-time caption" data-speaker="Prot" data-start="2633.680000" data-stop="2636.724000">blogging for a long time and you know how blogging is, right?</span> <span class="audio-time caption" data-speaker="Prot" data-start="2636.824000" data-stop="2642.030000">You just do it on your own. But this streaming culture is a</span> <span class="audio-time caption" data-speaker="Prot" data-start="2642.131000" data-stop="2645.818000">different experience. I think, however, it shares a lot</span> <span class="audio-time caption" data-speaker="Prot" data-start="2645.898000" data-stop="2649.387000">with the blogging way of doing things, which is like, well,</span> <span class="audio-time caption" data-speaker="Prot" data-start="2649.407000" data-stop="2652.815000">this is what I have to say. This is what I think. And I just do it</span> <span class="audio-time caption" data-speaker="Prot" data-start="2652.875000" data-stop="2656.484000">in a slightly different format. And of course, because you</span> <span class="audio-time caption" data-speaker="Prot" data-start="2656.524000" data-stop="2660.253000">are doing the stream, ultimately you control how you</span> <span class="audio-time caption" data-speaker="Prot" data-start="2660.293000" data-stop="2664.479000">participate, to the degree that you participate, what you</span> <span class="audio-time caption" data-speaker="Prot" data-start="2664.519000" data-stop="2667.324000">want to comment on. So ultimately, even though it's a live</span> <span class="audio-time caption" data-speaker="Prot" data-start="2667.344000" data-stop="2672.732000">stream, you can control it in a way that is not that much of a</span> <span class="audio-time caption" data-speaker="Prot" data-start="2672.972000" data-stop="2678.620000">live stream. In the sense that you can be very specific, very</span> <span class="audio-time caption" data-speaker="Prot" data-start="2678.641000" data-stop="2680.724000">structured and be like, you know what, this is my structure,</span> <span class="audio-time caption" data-speaker="Prot" data-start="2680.744000" data-stop="2684.089000">this is what I will do, and I will not run off on a tangent, for</span> <span class="audio-time caption" data-speaker="Prot" data-start="2684.149000" data-stop="2685.416000">example.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2685.417000" data-stop="2688.983000">[Sacha]: I don't know if it is possible for me to not run off on</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2689.003000" data-stop="2695.613000">a tangent. I appreciate people who can be very focused. It's</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2695.693000" data-stop="2700.680000">okay. I think my job, I think my goal is more of how do I at least</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2700.800000" data-stop="2704.286000">describe the tangents in text form so that I can find them</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2704.346000" data-stop="2707.691000">again and so that other people can decide whether this is</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2707.791000" data-stop="2710.956000">worth two hours of their time or whether they can just skip to</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2711.056000" data-stop="2713.840000">the five minutes that concerns the thing that they like.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="2714.867000" data-stop="2719.024000">[Prot]: Yes, in that case the timestamping would be the way to go.</span> <span class="audio-time caption" data-speaker="Prot" data-start="2719.044000" data-stop="2721.934000">Timestamp plus a brief description.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2721.935000" data-stop="2723.237000">[Sacha]: Yes, yes, and that</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2723.337000" data-stop="2725.818000">actually gets me to... ta-da!</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2725.000000">00:45:25</span> <strong>Processing the recordings</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2725.819000" data-stop="2727.621000">[Sacha]: topic: processing the recordings</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2728.923000" data-stop="2732.867000">So, yes, as I mentioned, I've been enjoying going back and</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2733.087000" data-stop="2736.811000">editing the transcripts because it becomes an excuse to</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2736.871000" data-stop="2742.637000">tinker with Emacs and subed-mode, and then because I</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2742.697000" data-stop="2747.202000">have this thing for adding a note above the start of a chapter,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2747.672000" data-stop="2751.157000">I can then easily use that to extract the chapter markers for</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2751.959000" data-stop="2755.864000">YouTube and all of that stuff. As I mentioned, I'm working on</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2755.945000" data-stop="2760.331000">some workflows for tracking chapters on the fly. You know,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2760.351000" data-stop="2762.735000">it's actually really nice having this little button. I used</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2762.755000" data-stop="2764.958000">to think, okay, I can just press a keyboard shortcut, but</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2765.018000" data-stop="2767.903000">apparently I forget all of my keyboard shortcuts when I'm</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2768.384000" data-stop="2772.430000">trying to talk at the same time. So if there's a button, I'm</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2772.450000" data-stop="2776.875000">like, I get incentivized to click on it to see whether my</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2776.915000" data-stop="2779.097000">code still works.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="2779.098000" data-stop="2781.860000">[Prot]: Plus it functions as a reminder.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2781.861000" data-stop="2786.506000">[Sacha]: Yes. So it's very helpful that way.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2786.507000" data-stop="2788.590000">And then, as I mentioned, I still</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2788.610000" data-stop="2790.872000">need to work on a good workflow for extracting the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2790.892000" data-stop="2794.257000">screenshots and clips so that I can then turn it into blog</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2794.277000" data-stop="2798.141000">posts later on and so forth. Right now, I have a pretty manual</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2798.181000" data-stop="2801.285000">process for, okay, after the video is posted, I'm going to</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2801.325000" data-stop="2804.429000">download it. I have some shell scripts now and the next step</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2804.489000" data-stop="2807.532000">of course after this one is going to write an Emacs function</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2807.973000" data-stop="2811.517000">that actually and I just finished this part. I have an Emacs</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2811.557000" data-stop="2813.519000">function that calls the shell scripts to download the thing</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2813.619000" data-stop="2818.865000">using yt-dlp and then start the transcription process but I</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2818.925000" data-stop="2822.188000">still manually do the upload to internet archive which I</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2822.248000" data-stop="2826.173000">know has a CLI tool so that's next in my list, and fix</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2826.193000" data-stop="2831.745000">subtitles and all that stuff, so that's kind of... if</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2831.865000" data-stop="2834.430000">I want to get more out of the recordings, that's a general</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2834.470000" data-stop="2835.711000">direction I'm going.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2835.000000">00:47:15</span> <strong>Commitment devices</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2835.712000" data-stop="2836.694000">[Sacha]: This is not something that you're</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2836.734000" data-stop="2840.420000">currently fiddling with.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="2840.421000" data-stop="2844.408000">[Prot]: Basically, I'm the wrong person for this.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2844.409000" data-stop="2847.214000">[Sacha]: Yeah, it's okay. And part of these conversations</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2847.294000" data-stop="2851.603000">is not so much that I'm looking to you for specific advice on</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2851.663000" data-stop="2854.790000">things that you explicitly don't do because it would be</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2854.850000" data-stop="2858.278000">against the alla prima. Just get it done and lower the barrier</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2858.979000" data-stop="2863.510000">going in. But it's also useful as a commitment device for me</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2863.530000" data-stop="2866.457000">to say, alright, I would like to get better at this. I am</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2866.517000" data-stop="2869.103000">telling Prot in order to be able to demonstrate the stuff and</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2869.384000" data-stop="2872.709000">make myself... If I'm going to see him in another two weeks...</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2872.710000" data-stop="2874.835000">Am I going to see you in another two weeks?</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="2874.836000" data-stop="2881.601000">[Prot]: Yes, yes, yes. And I will ask. I keep receipts. Yes, yes, yes.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2881.602000" data-stop="2885.485000">[Sacha]: Exactly, right? So this is also valuable for that.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2885.486000" data-stop="2890.249000">Not just hoping that in your config, which I have now read,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2890.250000" data-stop="2891.071000">that you would have a snippet</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2891.151000" data-stop="2894.174000">exactly for this purpose, but more like, okay, I'm telling</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2894.234000" data-stop="2897.903000">somebody I'm going to do it, which means I got to go do it.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="2897.904000" data-stop="2901.682000">[Prot]: Yes, yes. And of course, just verbalizing it means that you can</span> <span class="audio-time caption" data-speaker="Prot" data-start="2901.762000" data-stop="2905.750000">also understand it a little bit better. And you start</span> <span class="audio-time caption" data-speaker="Prot" data-start="2905.810000" data-stop="2909.655000">thinking about it. And then it's a matter of writing the code.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2909.000000">00:48:29</span> <strong>Automating more of the process</strong></div><p></p><span class="audio-time caption" data-speaker="Prot" data-start="2909.656000" data-stop="2913.103000">[Prot]: I'm curious, though, why do you have the shell scripts</span> <span class="audio-time caption" data-speaker="Prot" data-start="2913.183000" data-stop="2917.531000">and not bring all of that into Emacs? What's the advantage of</span> <span class="audio-time caption" data-speaker="Prot" data-start="2917.932000" data-stop="2920.617000">having Emacs called the shell scripts? Or was it just more</span> <span class="audio-time caption" data-speaker="Prot" data-start="2920.657000" data-stop="2921.734000">convenient?</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2921.735000" data-stop="2925.008000">[Sacha]: It's just out of convenience. Emacs does call</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2925.048000" data-stop="2928.099000">the shell scripts. The shell scripts are there just in case I</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2928.159000" data-stop="2933.446000">happen to be SSH-ing in from my phone. Because I'm</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2933.466000" data-stop="2937.291000">downstairs or whatever and then I can just run it from the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2937.331000" data-stop="2942.357000">shell also because I use it not just for my... So I have some</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2942.397000" data-stop="2947.423000">shell scripts for downloading the video as an MP3 or as an MP4</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2947.663000" data-stop="2951.868000">or as the subtitles. And so these are generally useful</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2951.908000" data-stop="2955.272000">things that I might not necessarily remember to be in Emacs</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2955.372000" data-stop="2960.157000">for. So that's definitely, you know... I needed to find this</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2960.438000" data-stop="2963.800000">whole process that eventually ends up in a blog post</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2963.801000" data-stop="2965.433000">that has all my lovely stuff.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2965.434000" data-stop="2972.167000">where this chat that I have with you is kind of my high-water mark</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2972.168000" data-stop="2975.167000">of this is really fun. I would like to do more</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2975.168000" data-stop="2979.067000">things like this, where it ends up with</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2979.068000" data-stop="2983.033000">transcripts, resources, kind of like the show notes</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2983.034000" data-stop="2988.067000">chapter marker indexes. These are automatically</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2988.068000" data-stop="2990.725000">extracted from the transcript.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2991.144000" data-stop="2995.100000">Rough notes that we were working on there. The session</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2995.101000" data-stop="2996.453000">... The transcript</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2996.493000" data-stop="3006.991000">has speaker diarization. In a video, I got your subtitles to</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3007.031000" data-stop="3010.958000">show up in italics and my subtitles to show up in plain text.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3011.327000" data-stop="3014.972000">So now that I have</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3018.417000" data-stop="3022.163000">this infrastructure, I feel compelled to make sure I</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3022.223000" data-stop="3026.908000">schedule conversations with people so that I use it.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="3026.909000" data-stop="3031.276000">[Prot]: Yes, of course.</span> <span class="audio-time caption" data-speaker="Prot" data-start="3031.779000" data-stop="3036.363000">And that's actually a good reason generally for writing</span> <span class="audio-time caption" data-speaker="Prot" data-start="3036.423000" data-stop="3040.067000">code, ultimately, because it's the vehicle for doing what</span> <span class="audio-time caption" data-speaker="Prot" data-start="3040.127000" data-stop="3043.490000">the code is supposed to facilitate. So the code is just a</span> <span class="audio-time caption" data-speaker="Prot" data-start="3043.570000" data-stop="3046.251000">pretext for actually doing the thing.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3046.252000" data-stop="3047.993000">[Sacha]: Or the other way around, yeah.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="3047.994000" data-stop="3050.695000">[Prot]: Or it can be the other way around.</span> <span class="audio-time caption" data-speaker="Prot" data-start="3050.696000" data-stop="3052.136000">So the code is the goal, yeah.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3052.137000" data-stop="3056.842000">[Sacha]: Yeah, yeah, I know. EmacsConf is basically</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3056.962000" data-stop="3059.204000">the way that I test emacsconf.el.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3064.466000" data-stop="3067.413000">Hi. It's fine. It's fine. Yeah, so that's my thing for</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3067.473000" data-stop="3071.160000">processing recordings. Changing topic.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3071.161000" data-stop="3074.214000">The button. The button. The button. We must press the button.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3074.000000">00:51:14</span> <strong>Copying non-packaged code</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3074.215000" data-stop="3080.464000">[Sacha]: Non-packaged code. So now that I've modularized my Emacs configuration,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3080.524000" data-stop="3083.311000">I've split all the defuns into different files. I have</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3083.371000" data-stop="3086.896000">renamed everything from my- to sacha- so that I don't step on</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3086.936000" data-stop="3089.981000">other people's function definitions. Now I'm starting to</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3090.042000" data-stop="3092.926000">copy things from other people's code to see whether this is</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3093.006000" data-stop="3098.195000">actually a viable approach. So this is the way I'm currently</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3098.255000" data-stop="3102.502000">stealing something from your prot-comment. Is this sort of</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3103.063000" data-stop="3107.236000">like... It seems to work when I go into something. If I go into</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3107.296000" data-stop="3110.842000">something, I can press C-x M-; and it does</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3110.883000" data-stop="3113.808000">the thing that you define. So this is sort of what you had in</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3113.828000" data-stop="3115.470000">mind, right?</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="3115.471000" data-stop="3117.254000">[Prot]: This is basically what I was thinking earlier</span> <span class="audio-time caption" data-speaker="Prot" data-start="3117.274000" data-stop="3120.285000">with the comment. Yeah.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3120.286000" data-stop="3123.792000">[Sacha]: And then theoretically, this sort</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3123.832000" data-stop="3125.935000">of structure will also work for other people who have</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3125.996000" data-stop="3130.483000">checked out my very large config and they can autoload</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3130.523000" data-stop="3134.109000">specific commands out of it and then they can bind key</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3134.149000" data-stop="3138.115000">bindings without necessarily importing all of my other set</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3138.155000" data-stop="3141.480000">queues and add hooks because that's in a separate file now.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3141.501000" data-stop="3145.597000">The only thing in my list is defuns.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3145.000000">00:52:25</span> <strong>Prot on defcustom</strong></div><p></p><span class="audio-time caption" data-speaker="Prot" data-start="3145.598000" data-stop="3147.461000">[Prot]: And if you also, just to</span> <span class="audio-time caption" data-speaker="Prot" data-start="3147.621000" data-stop="3152.508000">add, if you also have configurations for your packages,</span> <span class="audio-time caption" data-speaker="Prot" data-start="3152.568000" data-stop="3155.953000">right? You can also have defcustoms for there, maybe with a</span> <span class="audio-time caption" data-speaker="Prot" data-start="3155.993000" data-stop="3159.278000">default value that works for you or with a default value that</span> <span class="audio-time caption" data-speaker="Prot" data-start="3159.338000" data-stop="3162.022000">is generally useful. And then you can also separate that</span> <span class="audio-time caption" data-speaker="Prot" data-start="3162.122000" data-stop="3166.769000">out. So users don't have to pull anything from your</span> <span class="audio-time caption" data-speaker="Prot" data-start="3166.849000" data-stop="3170.493000">configuration, but just pull the package.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3170.494000" data-stop="3172.918000">[Sacha]: So right now I have...</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3172.919000" data-stop="3179.735000">Right now I have my configurations as defvars because</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3179.795000" data-stop="3184.846000">I'm lazy. Do you happen to have a function or whatever that</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3184.887000" data-stop="3189.359000">you like to use to just convert a defvar into a defcustom?</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="3189.360000" data-stop="3192.688000">[Prot]: I haven't done it because it's actually tricky with the type.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3193.089000" data-stop="3194.209000">[Sacha]: Yes.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="3194.210000" data-stop="3196.933000">[Prot]: You know, the defcustom has the type keyword. And of</span> <span class="audio-time caption" data-speaker="Prot" data-start="3196.973000" data-stop="3199.435000">course, for the most trivial cases, this is easy. Like, OK,</span> <span class="audio-time caption" data-speaker="Prot" data-start="3199.455000" data-stop="3203.299000">it's boolean or it's a string or whatever. But usually it's</span> <span class="audio-time caption" data-speaker="Prot" data-start="3203.339000" data-stop="3205.321000">not that simple. Like if you have an alist, you have to</span> <span class="audio-time caption" data-speaker="Prot" data-start="3205.381000" data-stop="3210.746000">describe what are the key and value pairs or whatever and the</span> <span class="audio-time caption" data-speaker="Prot" data-start="3210.806000" data-stop="3213.929000">elements of the alist. So I haven't done that because it's</span> <span class="audio-time caption" data-speaker="Prot" data-start="3214.069000" data-stop="3219.839000">always on a case by case basis. And many of the defcustom I</span> <span class="audio-time caption" data-speaker="Prot" data-start="3219.939000" data-stop="3224.645000">have will have like a bespoke type because the data</span> <span class="audio-time caption" data-speaker="Prot" data-start="3224.685000" data-stop="3227.729000">structure is really specific. You know, the value they</span> <span class="audio-time caption" data-speaker="Prot" data-start="3227.809000" data-stop="3231.333000">expect. For example, if you are doing something with the</span> <span class="audio-time caption" data-speaker="Prot" data-start="3232.054000" data-stop="3236.379000">action alists of display buffer, like they have a really</span> <span class="audio-time caption" data-speaker="Prot" data-start="3236.419000" data-stop="3239.338000">specific type how you write it.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3239.339000" data-stop="3241.705000">[Sacha]: Yeah, yeah, I hear you. So I</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3241.745000" data-stop="3245.453000">think because I have a lot of strings, I probably can get away</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3245.493000" data-stop="3249.242000">with something that just reads the form, smooshes it into a</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3249.322000" data-stop="3253.752000">string, adds a string, or possibly what this will end up</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3253.772000" data-stop="3258.022000">looking like is maybe a completing read on the type of the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3258.082000" data-stop="3262.317000">function. Sorry, the type of the thing. And then I can just</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3262.337000" data-stop="3264.678000">select from several types.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="3264.679000" data-stop="3268.284000">[Prot]: Well, you can make it like you can</span> <span class="audio-time caption" data-speaker="Prot" data-start="3268.584000" data-stop="3272.749000">make it a guess. Like, of course, if this thing is quoted and</span> <span class="audio-time caption" data-speaker="Prot" data-start="3272.809000" data-stop="3277.855000">it's a symbol, it's not a list. Maybe I can have like a choice</span> <span class="audio-time caption" data-speaker="Prot" data-start="3278.456000" data-stop="3282.261000">or a repeat symbol or something like you. You can, but it</span> <span class="audio-time caption" data-speaker="Prot" data-start="3282.361000" data-stop="3285.505000">won't be accurate. Like that would be like for you to fill it</span> <span class="audio-time caption" data-speaker="Prot" data-start="3285.565000" data-stop="3286.885000">in later.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3286.886000" data-stop="3288.608000">[Sacha]: Yeah. No, I was thinking just more along the lines</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3288.769000" data-stop="3294.575000">of Like a completion so that you can select from maybe some of</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3294.635000" data-stop="3297.959000">your common types. The actual guessing of what type it is</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3298.680000" data-stop="3302.905000">would be an exercise left for future me. But even just not</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3302.965000" data-stop="3308.972000">having to remember exactly what the syntax is for repeat</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3309.252000" data-stop="3310.919000">would be nice.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="3310.920000" data-stop="3312.354000">[Prot]: Actually, that's good.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3312.000000">00:55:12</span> <strong>helpful and elisp-demos</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3312.355000" data-stop="3313.698000">[Sacha]: Yes. I mean, one of the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3313.778000" data-stop="3317.524000">things that I always find helpful is, like, I think I've got</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3317.624000" data-stop="3322.852000">some examples now. I'm using helpful, right? And I'm also</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3323.052000" data-stop="3328.701000">using this elisp-demos. So it just tells me, like, I can add</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3328.781000" data-stop="3331.485000">more notes here and I can say, okay, this is what a defcustom,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3331.505000" data-stop="3334.867000">that's a repeat of a string or what a const looks like, so that...</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3334.868000" data-stop="3338.267000">'Cause the manual doesn't have a lot of examples sometimes.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3338.268000" data-stop="3341.000000">Sometimes it's annoying to dig through it looking for examples.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3341.001000" data-stop="3343.767000">Usually it has no examples. I think that that's...</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="3343.768000" data-stop="3346.359000">[Prot]: if there was one area of improvement, it's that.</span> <span class="audio-time caption" data-speaker="Prot" data-start="3346.360000" data-stop="3349.588000">Keep it as is, because it's high quality, but complement it with</span> <span class="audio-time caption" data-speaker="Prot" data-start="3349.649000" data-stop="3350.679000">examples.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3350.680000" data-stop="3353.062000">[Sacha]: I mean, technically, all of Emacs is an example,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3353.102000" data-stop="3356.244000">and you can just find something, but...</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="3356.245000" data-stop="3357.706000">[Prot]: Yeah, that's why you have the manual,</span> <span class="audio-time caption" data-speaker="Prot" data-start="3357.707000" data-stop="3359.829000">because if I have to dig through thousands</span> <span class="audio-time caption" data-speaker="Prot" data-start="3359.889000" data-stop="3364.714000">of lines of Emacs Lisp, that will take a toll on my patience.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3365.254000" data-stop="3369.357000">[Sacha]: Yeah, so for anyone who's watching,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3369.358000" data-stop="3373.200000">helpful and elisp-demos is how to add these</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3373.201000" data-stop="3375.244000">helpful little notes to your</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3375.384000" data-stop="3378.867000">describe-function, because who remembers these things?</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="3380.332000" data-stop="3383.458000">[Prot]: Yeah, yeah, yeah. That's very good. That's very good. Yes.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3383.000000">00:56:23</span> <strong>Prot on code libraries</strong></div><p></p><span class="audio-time caption" data-speaker="Prot" data-start="3383.839000" data-stop="3388.047000">[Prot]: Just to say on the point, if you have packages, this is</span> <span class="audio-time caption" data-speaker="Prot" data-start="3388.107000" data-stop="3391.233000">something I actually do. I just go and reference one of my</span> <span class="audio-time caption" data-speaker="Prot" data-start="3391.293000" data-stop="3394.720000">packages, which I know I have done the research for. So I'm</span> <span class="audio-time caption" data-speaker="Prot" data-start="3394.740000" data-stop="3398.146000">like, okay, how do you do the display buffer action alist</span> <span class="audio-time caption" data-speaker="Prot" data-start="3398.266000" data-stop="3399.227000">type? I will just go to, for example, denote and copy it.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3399.228000" data-stop="3409.008000">[Sacha]: I will eventually build up a list of examples</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3409.009000" data-stop="3410.531000">that I can refer to.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3410.000000">00:56:50</span> <strong>Prot rewrites functions to fit his style and naming conventions</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3410.532000" data-stop="3412.977000">[Sacha]: The other question I had though was do you ever find</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3413.018000" data-stop="3417.226000">yourself copying code from people who do not have their You</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3417.246000" data-stop="3419.830000">know, they're functions in nice little things that you can</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3419.870000" data-stop="3424.458000">just import and autoload. And what do you do about it? Like if</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3424.478000" data-stop="3428.924000">they're, you know, let's say they named it, then maybe they</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3428.965000" data-stop="3431.869000">named it without the prefix. So it might be possible to</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3431.909000" data-stop="3437.638000">confuse it with the standard stuff or they, you know, it's</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3437.718000" data-stop="3440.122000">mixed in with the rest of their config so you can just load the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3440.142000" data-stop="3444.208000">file. What do you like doing when you are copying that kind of</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3444.288000" data-stop="3446.107000">code?</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="3446.108000" data-stop="3449.288000">[Prot]: I will basically check if I can make edits to it.</span> <span class="audio-time caption" data-speaker="Prot" data-start="3449.289000" data-stop="3453.319000">The first thing I would make is probably change the style to be</span> <span class="audio-time caption" data-speaker="Prot" data-start="3453.379000" data-stop="3458.086000">like my style. So I would anyway change it so there is no</span> <span class="audio-time caption" data-speaker="Prot" data-start="3458.907000" data-stop="3462.452000">scenario where I would just copy it verbatim and paste it.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3463.273000" data-stop="3466.378000">[Sacha]: Okay, so you like to rewrite things and then you fit it into</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3467.059000" data-stop="3470.475000">your naming convention because it is now yours.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="3470.476000" data-stop="3474.361000">[Prot]: But also like the style. For example, this function you have over</span> <span class="audio-time caption" data-speaker="Prot" data-start="3474.421000" data-stop="3477.344000">there, like Sacha here, like the one we are seeing now on</span> <span class="audio-time caption" data-speaker="Prot" data-start="3477.364000" data-stop="3482.029000">screen. For example, I would change the name of pargs. Not</span> <span class="audio-time caption" data-speaker="Prot" data-start="3482.069000" data-stop="3484.512000">because it's wrong, but because stylistically it's not</span> <span class="audio-time caption" data-speaker="Prot" data-start="3484.592000" data-stop="3488.210000">what I would write. Then I would change the indentation.</span> <span class="audio-time caption" data-speaker="Prot" data-start="3488.211000" data-stop="3489.597000">Org Capture String, I would put the concat, the line below.</span> <span class="audio-time caption" data-speaker="Prot" data-start="3489.598000" data-stop="3494.904000">I would basically do small tweaks, not because it's wrong</span> <span class="audio-time caption" data-speaker="Prot" data-start="3494.964000" data-stop="3498.528000">what you have, but because stylistically I have a different</span> <span class="audio-time caption" data-speaker="Prot" data-start="3498.588000" data-stop="3500.209000">way of expressing it.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3500.210000" data-stop="3502.273000">[Sacha]: Yeah, yeah, yeah. Absolutely. I've</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3502.313000" data-stop="3507.541000">started to add where I got it from in the docstring instead</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3507.581000" data-stop="3510.666000">of... I used to put it in the comment. But as you mentioned,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3510.706000" data-stop="3513.509000">the doc strings are a little bit more visible.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3513.510000" data-stop="3519.519000">So then I usually don't end up looking for updates. But at least</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3519.599000" data-stop="3523.285000">theoretically, if I do want to, I could find out who was... Or</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3523.345000" data-stop="3526.129000">if I want to credit somebody or see what else they've come up</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3526.149000" data-stop="3529.622000">with lately, then at least it's there.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="3529.623000" data-stop="3530.864000">[Prot]: Yes, it's good enough.</span> <span class="audio-time caption" data-speaker="Prot" data-start="3530.865000" data-stop="3533.109000">Plus, when we are talking about these smaller</span> <span class="audio-time caption" data-speaker="Prot" data-start="3533.189000" data-stop="3538.597000">functions, having the link there, I think, is enough. Like,</span> <span class="audio-time caption" data-speaker="Prot" data-start="3538.617000" data-stop="3541.962000">you wouldn't need to go search for updates or whatever.</span> <span class="audio-time caption" data-speaker="Prot" data-start="3542.003000" data-stop="3544.506000">Like, if they have made some changes, chances are it's</span> <span class="audio-time caption" data-speaker="Prot" data-start="3544.546000" data-stop="3546.548000">there.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3546.549000" data-stop="3551.517000">[Sacha]: Yeah. Okay, so rewrite things, make it fit your</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3551.537000" data-stop="3555.543000">style, and add stuff to the docstring because you like to</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3555.604000" data-stop="3558.647000">have thorough docstrings.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3558.000000">00:59:18</span> <strong>Prot's preference for small functions</strong></div><p></p><span class="audio-time caption" data-speaker="Prot" data-start="3558.648000" data-stop="3560.130000">[Prot]: Yeah, yeah, yeah. There are many</span> <span class="audio-time caption" data-speaker="Prot" data-start="3560.330000" data-stop="3563.494000">functions I have where the docstring is longer than the</span> <span class="audio-time caption" data-speaker="Prot" data-start="3563.534000" data-stop="3568.740000">code. I would say, yeah, many of them are like that. But also,</span> <span class="audio-time caption" data-speaker="Prot" data-start="3568.800000" data-stop="3573.124000">just to say, it's because of how I will write the code, where</span> <span class="audio-time caption" data-speaker="Prot" data-start="3573.165000" data-stop="3576.628000">there are many small functions building up to a big one. And</span> <span class="audio-time caption" data-speaker="Prot" data-start="3576.749000" data-stop="3579.692000">so then the docstring explains basically what all these</span> <span class="audio-time caption" data-speaker="Prot" data-start="3579.732000" data-stop="3582.171000">small functions contribute to.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3582.172000" data-stop="3583.255000">[Sacha]: I like small functions too</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3583.315000" data-stop="3587.504000">because I got used to coding on even smaller screens, right?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3587.564000" data-stop="3590.109000">And so anything that could just actually fit in the screen</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3590.149000" data-stop="3593.276000">was much better than things that I had to page through. And it</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3593.316000" data-stop="3597.424000">gives you many more avenues to modify the behavior because</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3597.464000" data-stop="3600.030000">you have more places that you could def-advice, sorry,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3600.771000" data-stop="3603.433000">advice-add :around or whatever.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="3603.434000" data-stop="3604.256000">[Prot]: Actually, this is why I</span> <span class="audio-time caption" data-speaker="Prot" data-start="3604.296000" data-stop="3608.003000">started doing it as well, because it's easier. I had this</span> <span class="audio-time caption" data-speaker="Prot" data-start="3608.584000" data-stop="3613.012000">reason myself. I think it was an org function, which is like</span> <span class="audio-time caption" data-speaker="Prot" data-start="3613.032000" data-stop="3616.279000">200 lines, and I wanted to really change one thing and I had to</span> <span class="audio-time caption" data-speaker="Prot" data-start="3616.319000" data-stop="3619.124000">copy the whole function. And I'm like, well, if this was a</span> <span class="audio-time caption" data-speaker="Prot" data-start="3619.204000" data-stop="3622.310000">helper function, I would be done by just overriding the</span> <span class="audio-time caption" data-speaker="Prot" data-start="3622.350000" data-stop="3623.431000">helper and I would be good.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3623.000000">01:00:23</span> <strong>avy-goto-char-timer</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3623.432000" data-stop="3627.171000">[Sacha]: I am slowly getting the hang of</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3627.291000" data-stop="3634.242000">using avy-goto-char-timer so that I can copy the symbols from</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3634.263000" data-stop="3640.894000">elsewhere. Because even if I'm using nameless to insert the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3640.934000" data-stop="3645.400000">prefixes and then I'm using dabbrev-expand or hippie-expand,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3645.620000" data-stop="3648.183000">for which the config I still need to fiddle with to make it</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3648.464000" data-stop="3652.149000">absolutely perfect. It's still a lot of typing sometimes,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3652.229000" data-stop="3655.492000">since we like to use long function names.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="3655.493000" data-stop="3658.916000">[Prot]: And which timer variant do you use? Because it has,</span> <span class="audio-time caption" data-speaker="Prot" data-start="3658.917000" data-stop="3660.899000">with two characters, it has the 0 one,</span> <span class="audio-time caption" data-speaker="Prot" data-start="3660.900000" data-stop="3663.283000">which is type as much as you can within a certain</span> <span class="audio-time caption" data-speaker="Prot" data-start="3663.323000" data-stop="3666.266000">time window.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3666.267000" data-stop="3672.909000">[Sacha]: That's a good question. Where is this?</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="3672.910000" data-stop="3678.186000">[Prot]: Char timer. I think this is based on... I think this is the zero.</span> <span class="audio-time caption" data-speaker="Prot" data-start="3678.206000" data-stop="3681.142000">Yeah, I'm not sure. I remember it's called zero.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3681.143000" data-stop="3685.228000">[Sacha]: So like I can type li and then go to like lj</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3685.229000" data-stop="3686.991000">to jump to that one and now I have</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3687.072000" data-stop="3696.044000">it so that I can M-j li and then I can press the yank yeah</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3696.264000" data-stop="3702.713000">like y like insert from there which is yes when I was when I was</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3702.733000" data-stop="3707.408000">stealing stuff from your config, I could... oh let me show you...</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3707.409000" data-stop="3714.410000">where is this... So this is your config, right? Well, this is...</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3715.111000" data-stop="3718.156000">Hang on a second. Org link preview.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3720.860000" data-stop="3724.665000">There you go. So now the highlights of your config. I can</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3724.806000" data-stop="3731.435000">steal stuff from your config and say, okay, M-j, open</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3731.455000" data-stop="3733.158000">parenthesis, oops.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3736.007000" data-stop="3741.634000">M-j. Open parenthesis. I can copy the entire line of LK</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3742.595000" data-stop="3748.262000">from avy, which is very nice. Very nice. Yes, yes. So, pretty</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3748.282000" data-stop="3752.648000">fast side there into avy. I have to slow down and actually</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3752.768000" data-stop="3756.573000">focus on doing the keyboard shortcuts because it's a new</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3756.633000" data-stop="3760.176000">habit that I want to build, especially since.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3760.000000">01:02:40</span> <strong>One-shot keyboard modifiers</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3760.177000" data-stop="3762.801000">[Sacha]: Also related to one of your recent videos, I'm experimenting with</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3762.821000" data-stop="3765.501000">one-shot keyboard modifiers.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="3765.502000" data-stop="3766.382000">[Prot]: Oh, well done.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3766.383000" data-stop="3770.247000">[Sacha]: Yes. It's a little tricky. I have to get my brain to get used to it. I'm</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3770.267000" data-stop="3778.414000">using keyd to do this on Linux. And it's just getting the hang</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3778.434000" data-stop="3781.817000">of pressing control and then moving to the thing. It's</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3782.238000" data-stop="3785.139000">messing with my brain a little.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="3785.140000" data-stop="3787.382000">[Prot]: But consider that it's a good</span> <span class="audio-time caption" data-speaker="Prot" data-start="3787.422000" data-stop="3792.607000">opportunity to also use two-handed mode, basically. So,</span> <span class="audio-time caption" data-speaker="Prot" data-start="3792.687000" data-stop="3797.889000">for example, C-x, right? Not like C-x. You see</span> <span class="audio-time caption" data-speaker="Prot" data-start="3797.909000" data-stop="3800.412000">what I'm saying? So basically one hand for the modifier.</span> <span class="audio-time caption" data-speaker="Prot" data-start="3800.532000" data-stop="3805.438000">Yeah, exactly. Because that's a good practice in general,</span> <span class="audio-time caption" data-speaker="Prot" data-start="3805.578000" data-stop="3809.181000">even if you use the standard modifiers. Yeah.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3809.000000">01:03:29</span> <strong>Toggling</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3809.182000" data-stop="3810.043000">[Sacha]: And one of the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3810.063000" data-stop="3814.308000">other things that I started doing after our previous</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3814.368000" data-stop="3817.511000">conversation and having looked at some of your toggling</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3817.571000" data-stop="3821.822000">sort of things, in your config, what's this idea of using the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3821.902000" data-stop="3826.308000">C-z and C-S-z shortcuts? Since who likes to</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3826.348000" data-stop="3830.554000">suspend Emacs anyway, right? So now my C-S-z</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3830.714000" data-stop="3834.540000">toggles my now.org, which is the stuff that I'm going to be</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3834.560000" data-stop="3836.984000">working on, including the stuff that I want to get the hang of</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3837.144000" data-stop="3841.891000">using. So this is my, all right, I need to scope it down so that</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3841.931000" data-stop="3845.095000">I don't get overwhelmed. These are the things that will, you</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3845.135000" data-stop="3847.779000">know, these are the things that I'm trying to get the hang of</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3848.020000" data-stop="3863.332000">using. C-z gets me to my stream notes because then I can add things while</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3863.392000" data-stop="3868.479000">I'm live, and then C-S-z is what I have as my now, which</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3868.619000" data-stop="3873.686000">also gets posted to my web page, sort of like what I'm focusing</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3873.806000" data-stop="3878.495000">on. Which, actually, I can reorganize anyway. So I'm liking</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3878.515000" data-stop="3881.298000">this toggling because I can press, like for example, if I'm</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3881.458000" data-stop="3884.340000">in the middle of my scratch buffer, I can press C-S-z,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3884.421000" data-stop="3888.964000">pop it up, and then pop it back down. And I was watching Joshua</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3889.004000" data-stop="3892.668000">Blais's video about he gets to do this sort of like toggling</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3892.748000" data-stop="3896.491000">things in and out from anywhere in his system. So now I'm</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3896.571000" data-stop="3899.253000">jealous and I need to figure out how to get that working too.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="3899.533000" data-stop="3902.996000">[Prot]: Yeah, yeah, yeah. That's the kind of thing that is really</span> <span class="audio-time caption" data-speaker="Prot" data-start="3903.056000" data-stop="3906.740000">helpful. Like pop it out and then when you don't need it, it</span> <span class="audio-time caption" data-speaker="Prot" data-start="3906.880000" data-stop="3908.320000">disappears.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3908.000000">01:05:08</span> <strong>System-wide toggle shortcuts using emacsclient</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3908.321000" data-stop="3910.023000">[Sacha]: Do you have any of that kind of system level of</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3910.063000" data-stop="3913.447000">toggling even when you don't have Emacs as your main</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3913.967000" data-stop="3918.050000">application sort of thing?</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="3918.051000" data-stop="3920.113000">[Prot]: Via emacsclient. So you can have</span> <span class="audio-time caption" data-speaker="Prot" data-start="3920.173000" data-stop="3923.256000">a key binding to emacsclient, an emacsclient call, and it</span> <span class="audio-time caption" data-speaker="Prot" data-start="3923.296000" data-stop="3926.499000">will bring up an Emacs window from anywhere. I have that,</span> <span class="audio-time caption" data-speaker="Prot" data-start="3926.519000" data-stop="3931.824000">yes. I have it for a few things. TMR mostly, the timer</span> <span class="audio-time caption" data-speaker="Prot" data-start="3931.864000" data-stop="3936.962000">package. So if I am, for example, here, I can bring it up and</span> <span class="audio-time caption" data-speaker="Prot" data-start="3937.723000" data-stop="3940.807000">start the timer without actually switching to Emacs. Okay,</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3940.927000" data-stop="3946.934000">[Sacha]: so that sounds like something I need to look into. It's</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="3946.994000" data-stop="3950.718000">[Prot]: in the prot-window file, prot-window.el. I have a macro</span> <span class="audio-time caption" data-speaker="Prot" data-start="3950.758000" data-stop="3956.969000">there, and it's a macro that defines a command. To run in a new</span> <span class="audio-time caption" data-speaker="Prot" data-start="3957.049000" data-stop="3962.855000">frame and once you do something, such as complete or cancel,</span> <span class="audio-time caption" data-speaker="Prot" data-start="3963.396000" data-stop="3967.781000">to close that frame basically. And it's using a condition</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3967.861000" data-stop="3971.545000">[Sacha]: case. It's using a condition case. I think it's the simplest</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="3971.605000" data-stop="3973.686000">[Prot]: you can do.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3973.687000" data-stop="3976.711000">[Sacha]: And then that's a global keybinding on your</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3976.831000" data-stop="3978.011000">window manager that runs that and then brings that</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3978.012000" data-stop="3984.600000">so that you can pop it up and put it back.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="3984.601000" data-stop="3989.167000">[Prot]: Yeah. It's just emacsclient -e and then the command.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3989.168000" data-stop="3992.290000">[Sacha]: Oh, that's interesting.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3992.793000" data-stop="3998.158000">Rickard says using space as control has revolutionized</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3998.739000" data-stop="4002.343000">their Emacsing. I'm not sure I'm ready to take that step yet.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4003.043000" data-stop="4006.186000">Also, I can probably figure out how to use keyd to use it as a</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4006.286000" data-stop="4010.070000">modifier. We'll see. It's a nice big key, you know? You're</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4010.270000" data-stop="4013.512000">just tempted to do all sorts of things with it.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="4013.513000" data-stop="4016.155000">[Prot]: Of course, at the keyboard level,</span> <span class="audio-time caption" data-speaker="Prot" data-start="4016.156000" data-stop="4018.198000">you can have different behavior for tap</span> <span class="audio-time caption" data-speaker="Prot" data-start="4018.258000" data-stop="4023.352000">and hold. So when you tap the space, it's an ordinary space.</span> <span class="audio-time caption" data-speaker="Prot" data-start="4023.372000" data-stop="4026.797000">When you hold it, it's control. Maybe that's what they are.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="4026.817000" data-stop="4029.661000">[Sacha]: Yeah, I think that's what's happening there. Look into</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4029.681000" data-stop="4033.204000">using keyd for tap and hold.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="4033.205000" data-stop="4034.568000">[Prot]: Yeah, and this is the principle</span> <span class="audio-time caption" data-speaker="Prot" data-start="4034.608000" data-stop="4039.154000">behind the home row mods, the standard home row mods. It's</span> <span class="audio-time caption" data-speaker="Prot" data-start="4039.234000" data-stop="4043.260000">like when you tap, for example, H, it just does H. When you</span> <span class="audio-time caption" data-speaker="Prot" data-start="4043.320000" data-stop="4045.963000">hold it, it's some modifier key.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="4045.000000">01:07:25</span> <strong>My next steps</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="4045.964000" data-stop="4048.028000">[Sacha]: I have three minutes before</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4048.068000" data-stop="4054.999000">the kiddo runs out and goes, mom, it's lunchtime. So do you</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4055.059000" data-stop="4059.287000">have any, like, okay, my next steps, I've got stuff that I</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4059.307000" data-stop="4062.432000">need to work on in terms of improving the processing of</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4062.512000" data-stop="4066.278000">things and automating things. I found this session very</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4066.338000" data-stop="4069.624000">helpful for saying, okay, you know, like, in the weeks</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4069.684000" data-stop="4071.687000">leading up to it, two weeks leading up to it, it's like, okay,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4071.707000" data-stop="4073.629000">I got to write this code because I want to be able to say I did</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4073.710000" data-stop="4079.879000">it, which is good. And as a result, I have all sorts of fancy</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4079.939000" data-stop="4084.686000">things now in my Emacs for streaming and also for my config.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4086.108000" data-stop="4089.072000">In two weeks, I would love to have this kind of conversation</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4089.132000" data-stop="4093.519000">with you again, if that's all right with you. Do you have any</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4094.120000" data-stop="4098.174000">tips before the kiddo comes out?</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="4098.000000">01:08:18</span> <strong>Tips from Prot: small functions used frequently</strong></div><p></p><span class="audio-time caption" data-speaker="Prot" data-start="4098.175000" data-stop="4100.878000">[Prot]: Yeah, yeah, yeah. So for the</span> <span class="audio-time caption" data-speaker="Prot" data-start="4100.958000" data-stop="4105.282000">functions you want to write, you want to make the functions</span> <span class="audio-time caption" data-speaker="Prot" data-start="4105.362000" data-stop="4111.207000">be small so you can test them all and make them part of your</span> <span class="audio-time caption" data-speaker="Prot" data-start="4111.248000" data-stop="4115.110000">habit, like start using them even before the streams. So try</span> <span class="audio-time caption" data-speaker="Prot" data-start="4115.171000" data-stop="4119.233000">to use them every day so that you basically have almost</span> <span class="audio-time caption" data-speaker="Prot" data-start="4119.234000" data-stop="4122.398000">a knee-jerk reaction where it's like, oh, I'm doing this and you</span> <span class="audio-time caption" data-speaker="Prot" data-start="4122.438000" data-stop="4125.621000">call the function basically right away. And I don't know if</span> <span class="audio-time caption" data-speaker="Prot" data-start="4125.661000" data-stop="4129.445000">you use the F keys, the function keys for your shortcuts.</span> <span class="audio-time caption" data-speaker="Prot" data-start="4130.466000" data-stop="4132.787000">Maybe those would be good.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="4132.788000" data-stop="4134.770000">[Sacha]: Yeah, I have some of them. But</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4134.891000" data-stop="4138.715000">again, it's hard for me to remember sometimes which one I</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4138.735000" data-stop="4141.818000">have matched there. So again, it's trying to build it into</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4141.858000" data-stop="4145.342000">muscle memory. Probably what I just need is some kind of</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4145.362000" data-stop="4146.922000">drill thing.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="4146.000000">01:09:06</span> <strong>Maybe using the header line for tips?</strong></div><p></p><span class="audio-time caption" data-speaker="Prot" data-start="4146.923000" data-stop="4152.029000">[Prot]: How about a minor mode that sets the header line</span> <span class="audio-time caption" data-speaker="Prot" data-start="4152.109000" data-stop="4155.430000">format? You have seen in many buffers where it says type</span> <span class="audio-time caption" data-speaker="Prot" data-start="4155.650000" data-stop="4159.996000">C-c C-c to finish, right? So set the header line</span> <span class="audio-time caption" data-speaker="Prot" data-start="4160.056000" data-stop="4164.442000">format to be like, you know, type, I don't know, Ctrl-Z to</span> <span class="audio-time caption" data-speaker="Prot" data-start="4164.521000" data-stop="4166.603000">bring up the pop-up, whatever, right?</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="4166.604000" data-stop="4167.300000">[Sacha]: Yeah, I mean, quick help sort of is that idea...</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="4170.820000" data-stop="4174.032000">[Prot]: Yes, quick help would help you do that as well, yeah.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="4174.033000" data-stop="4180.229000">[Sacha]: It's a screen space thing. But if I can find something that I can</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4180.309000" data-stop="4184.238000">smoosh together with keycast so that it reminds me of my key</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4184.297000" data-stop="4186.397000">tip in this context.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4186.398000" data-stop="4192.168000">Ah, with keycast. Interesting.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="4194.792000" data-stop="4197.517000">[Prot]: That's why I was thinking of header-line-format. So it would</span> <span class="audio-time caption" data-speaker="Prot" data-start="4197.557000" data-stop="4201.844000">be something that will appear there. And of course, the</span> <span class="audio-time caption" data-speaker="Prot" data-start="4201.904000" data-stop="4205.370000">header line works exactly like the mode line, meaning that</span> <span class="audio-time caption" data-speaker="Prot" data-start="4205.430000" data-stop="4210.979000">it can update the content. It's not static. So like your mode</span> <span class="audio-time caption" data-speaker="Prot" data-start="4210.999000" data-stop="4213.160000">line will update information.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="4213.161000" data-stop="4215.465000">[Sacha]: Yeah. Okay. All right. So let</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4215.505000" data-stop="4219.570000">me think about which tips might be, you know, like my keyword</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4220.651000" data-stop="4223.854000">shortcut of the day focus could be interesting.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="4223.000000">01:10:23</span> <strong>Reorganizing keys</strong></div><p></p><span class="audio-time caption" data-speaker="Prot" data-start="4223.855000" data-stop="4228.041000">[Prot]: But it also brings the point like here, of course, like the keys you</span> <span class="audio-time caption" data-speaker="Prot" data-start="4228.121000" data-stop="4230.745000">have, maybe it's also a good opportunity to organize them</span> <span class="audio-time caption" data-speaker="Prot" data-start="4230.805000" data-stop="4235.531000">differently. Like the header here should prompt you for one</span> <span class="audio-time caption" data-speaker="Prot" data-start="4235.611000" data-stop="4240.202000">prefix key, for example. Like, you know, C-t, let's</span> <span class="audio-time caption" data-speaker="Prot" data-start="4240.242000" data-stop="4246.314000">say, and that's for transcribing or whatever. Right. And it</span> <span class="audio-time caption" data-speaker="Prot" data-start="4246.354000" data-stop="4249.499000">will just have that one there. And then with the help of</span> <span class="audio-time caption" data-speaker="Prot" data-start="4249.500000" data-stop="4253.414000">which-key, for example, you see what you have behind that prefix.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="4253.415000" data-stop="4257.033000">[Sacha]: I have a hard time figuring out keybindings, which is one of</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4257.053000" data-stop="4259.697000">the reasons why I like looking at configs like yours and</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4259.757000" data-stop="4262.120000">other people. Because I'm like, yeah, I can totally use that</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4262.301000" data-stop="4265.225000">as a starting point for keybindings. But then what else do I</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4265.265000" data-stop="4268.711000">assign to it? So for example, I've got this. I apparently</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4268.771000" data-stop="4274.499000">don't have this. I have this sacha-stream-transient</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4275.120000" data-stop="4278.566000">C-c v. That's where I put it now. Okay. Which now has</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4278.567000" data-stop="4279.835000">things like OBS and all that stuff.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="4279.836000" data-stop="4280.569000">[Prot]: What's the mnemonic for v?</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="4282.925000" data-stop="4286.273000">[Sacha]: Oh, v would have been video sort of thing.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="4286.274000" data-stop="4287.209000">[Prot]: Okay, I see.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="4287.210000" data-stop="4293.261000">[Sacha]: But I have to fiddle with it and the kiddo is going to come out any</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4293.301000" data-stop="4296.591000">moment now. So thanks just in case she comes out.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="4296.592000" data-stop="4300.010000">[Prot]: You're welcome.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="4300.011000" data-stop="4303.276000">[Sacha]: Well, it's lunchtime. Thank you for this. I will</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4303.516000" data-stop="4305.840000">schedule something else in two weeks. I'm going to try to</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4305.900000" data-stop="4310.206000">practice more scheduled live streams and keep fiddling</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4310.247000" data-stop="4312.629000">with this workflow. This has all been very helpful. And</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4312.729000" data-stop="4316.513000">thank you to the people who also have dropped by and said</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4316.553000" data-stop="4319.656000">hello. You can check the chat later. It's fine. Yes, yes.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4319.676000" data-stop="4324.180000">Thanks, everybody. All right. Okay. I'm going to say bye</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4324.261000" data-stop="4327.283000">here just in case. Take care. Take care. Take care, Sacha.</span> <p></p><span class="audio-time caption" data-speaker="Prot" data-start="4327.303000" data-stop="4337.333000">[Prot]: Take care, everybody. Bye-bye. Bye-bye. Thank you.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="4339.372000" data-stop="4344.379000">[Sacha]: Thank you everyone for hanging out. That was my chat with</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4345.020000" data-stop="4349.666000">Prot. And I will see y'all again maybe Thurs... Well,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4349.967000" data-stop="4353.531000">probably before then. But I will try to schedule something</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4353.712000" data-stop="4356.496000">on Thursday for around that time. Who knows what it's going</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4356.516000" data-stop="4360.401000">to be about. But yeah, thank you for coming and</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4360.461000" data-stop="4366.149000">experimenting with me. Let us end the stream there. Because</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4366.189000" data-stop="4367.050000">it's lunchtime.</span>
<p></p>


</details>
<div><a href="https://sachachua.com/blog/2026/04/ye16-sacha-and-prot-talk-emacs/index.org">View Org source for this post</a></div><p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2026%2F04%2Fye16-sacha-and-prot-talk-emacs%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></content>
		</entry><entry>
		<title type="html">Org Mode: JS for translating times to people's local timezones</title>
		<link rel="alternate" type="text/html" href="https://sachachua.com/blog/2026/04/org-mode-js-for-translating-times-to-people-s-local-timezones/"/>
		<author><name><![CDATA[Sacha Chua]]></name></author>
		<updated>2026-04-14T18:44:16Z</updated>
    <published>2026-04-14T18:44:16Z</published>
    <category term="org" />
<category term="emacs" />
<category term="js" />
		<id>https://sachachua.com/blog/2026/04/org-mode-js-for-translating-times-to-people-s-local-timezones/</id>
		<content type="html"><![CDATA[<p>
I want to get back into the swing of doing <a href="https://sachachua.com/topic/emacs-chat/">Emacs Chats</a> again, which means scheduling, which means timezones. Let's see first if anyone happens to match up with the Thursday timeslots (10:30 or 12:45) that I'd like to use for Emacs-y video things, but I might be able to shuffle things around if needed.
</p>

<p>
I want something that can translate times into people's local timezones.
I use Org Mode timestamps a lot because they're so easy to insert with <code>C-u C-c !</code> (<code>org-timestamp-inactive</code>), which inserts a timestamp like this:
</p>

<p>
<span class="timestamp-wrapper"><time class="timestamp" datetime="2026-04-16T10:30:00-0400">[2026-04-16 Thu 10:30]</time></span>
</p>

<p>
By default, the Org HTML export for it does not include the timezone offset. That's easily fixed by adding <code>%z</code> to the time specifier, like this:
</p>


<div class="org-src-container">
<pre class="src src-emacs-lisp"><code>(<span class="org-keyword">setq</span> org-html-datetime-formats <span class="org-highlight-quoted-quote">'</span>(<span class="org-string">"%F"</span> . <span class="org-string">"%FT%T%z"</span>))
</code></pre>
</div>


<p>
Now a little bit of Javascript code makes it clickable and lets us toggle a translated time. I put the time afterwards so that people can verify it visually. I never quite trust myself when it comes to timezone translations.
</p>


<div class="org-src-container">
<pre class="src src-js"><code><span class="org-keyword">function</span> <span class="org-function-name">translateTime</span>(<span class="org-variable-name">event</span>) {
  <span class="org-keyword">if</span> (event.target.getAttribute(<span class="org-string">'datetime'</span>)?.match(<span class="org-string">/[0-9][0-9][0-9][0-9]$/</span>)) {
    <span class="org-keyword">if</span> (event.target.querySelector(<span class="org-string">'.translated'</span>)) {
      event.target.querySelectorAll(<span class="org-string">'.translated'</span>).forEach((o) =&gt; o.remove());
    } <span class="org-keyword">else</span> {
      <span class="org-keyword">const</span> <span class="org-variable-name">span</span> = document.createElement(<span class="org-string">'span'</span>);
      span.classList.add(<span class="org-string">'translated'</span>);
      span.textContent = <span class="org-string">' &#8594; '</span> + (<span class="org-keyword">new</span> <span class="org-type">Date</span>(event.target.getAttribute(<span class="org-string">'datetime'</span>))).toLocaleString(<span class="org-constant">undefined</span>, {
        month: <span class="org-string">'short'</span>,  
        day: <span class="org-string">'numeric'</span>,  
        hour: <span class="org-string">'numeric'</span>, 
        minute: <span class="org-string">'2-digit'</span>,
        timeZoneName: <span class="org-string">'short'</span>
      });
      event.target.appendChild(span);
    }
  }
}
<span class="org-keyword">function</span> <span class="org-function-name">clickForLocalTime</span>() {
  document.querySelectorAll(<span class="org-string">'time'</span>).forEach((o) =&gt; {
    <span class="org-keyword">if</span> (o.getAttribute(<span class="org-string">'datetime'</span>)?.match(<span class="org-string">/[0-9][0-9][0-9][0-9]$/</span>)) {
      o.addEventListener(<span class="org-string">'click'</span>, translateTime);
      o.classList.add(<span class="org-string">'clickable'</span>);
    }
  });
}
</code></pre>
</div>


<p>
And some CSS to make it more obvious that it's now clickable:
</p>


<div class="org-src-container">
<pre class="src src-css"><code><span class="org-css-selector">.clickable</span> {
    <span class="org-css-property">cursor</span>: pointer;
    <span class="org-css-property">text-decoration</span>: underline dotted;
}
</code></pre>
</div>


<p>
Let's see if this is useful.
</p>

<p>
Someday, it would probably be handy to have a button that translates all the timestamps in a table, but this is a good starting point.
</p>
<div><a href="https://sachachua.com/blog/2026/04/org-mode-js-for-translating-times-to-people-s-local-timezones/index.org">View Org source for this post</a></div><p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2026%2F04%2Forg-mode-js-for-translating-times-to-people-s-local-timezones%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></content>
		</entry><entry>
		<title type="html">2026-04-13 Emacs news</title>
		<link rel="alternate" type="text/html" href="https://sachachua.com/blog/2026/04/2026-04-13-emacs-news/"/>
		<author><name><![CDATA[Sacha Chua]]></name></author>
		<updated>2026-04-13T13:43:00Z</updated>
    <published>2026-04-13T13:43:00Z</published>
    <category term="emacs" />
<category term="emacs-news" />
		<id>https://sachachua.com/blog/2026/04/2026-04-13-emacs-news/</id>
		<content type="html"><![CDATA[<p>
Lots of little improvements in this one! I'm looking forward to borrowing the <a href="https://emacsredux.com/blog/2026/04/07/stealing-from-the-best-emacs-configs/">config tweaks that bbatsov highlighted</a> and also trying out <a href="https://github.com/CsBigDataHub/popterm.el">popterm</a> for quick-access shells. Also, the Emacs Carnival for April has a temporary home at <a href="https://www.emacswiki.org/emacs/CarnivalApril2026">Newbies/starter kits</a> - feel free to write and share your thoughts!
</p>

<ul class="org-ul">
<li>Upcoming events (<a href="https://emacslife.com/calendar/emacs-calendar.ics">iCal file</a>, <a href="https://emacslife.com/calendar/">Org</a>):
<ul class="org-ul">
<li>London Emacs (in person): Emacs London meetup <a href="https://www.meetup.com/london-emacs-hacking/events/313909207/">https://www.meetup.com/london-emacs-hacking/events/313909207/</a> Tue Apr 14 1800 Europe/London</li>
<li>Emacs Berlin: In-Person-Only Emacs-Berlin Stammtisch <a href="https://emacs-berlin.org/">https://emacs-berlin.org/</a> Tue Apr 14 1900 Europe/Berlin</li>
<li>M-x Research: TBA <a href="https://m-x-research.github.io/">https://m-x-research.github.io/</a> Wed Apr 15 0800 America/Vancouver - 1000 America/Chicago - 1100 America/Toronto - 1500 Etc/GMT - 1700 Europe/Berlin - 2030 Asia/Kolkata - 2300 Asia/Singapore</li>
<li>EmacsSF (in person): coffee.el in SF <a href="https://www.meetup.com/emacs-sf/events/314166900/">https://www.meetup.com/emacs-sf/events/314166900/</a> Sat Apr 18 1100 America/Los_Angeles</li>
<li>Emacs APAC: Emacs APAC meetup (virtual) <a href="https://emacs-apac.gitlab.io/announcements/">https://emacs-apac.gitlab.io/announcements/</a> Sat Apr 25 0130 America/Vancouver - 0330 America/Chicago - 0430 America/Toronto - 0830 Etc/GMT - 1030 Europe/Berlin - 1400 Asia/Kolkata - 1630 Asia/Singapore</li>
</ul></li>
<li>Beginner:
<ul class="org-ul">
<li><a href="https://www.reddit.com/r/emacs/comments/1sjcnfz/what_is_the_abolsute_minimum_to_cover_in_first/">What is the absolute minimum to cover in first emacs session</a></li>
<li><a href="https://maxxcan.codeberg.page/2026-04-09-c%C3%B3mo-aprender-emacs-gr%C3%A1ficamente-gracias-a-sacha-chua.html">Cómo aprender Emacs gráficamente gracias a Sacha Chua</a> (<a href="https://mastodon.social/@maxxcan/116378583967369263">@maxxcan@mastodon.social</a>)</li>
</ul></li>
<li>Emacs configuration:
<ul class="org-ul">
<li><a href="https://files.mastodon.social/cache/media_attachments/files/116/361/741/648/922/216/small/057576bb4ab68aaa.png">video demo of anju 1.1.0 - enhance mouse interactions</a> (<a href="https://sfba.social/@kickingvegas/116361741574872391">@kickingvegas@sfba.social</a>)</li>
<li><a href="https://emacsredux.com/blog/2026/04/07/stealing-from-the-best-emacs-configs/">Stealing from the Best Emacs Configs</a> (<a href="https://www.reddit.com/r/emacs/comments/1sf0xmd/stealing_from_the_best_emacs_configs/">Reddit</a>, <a href="https://news.ycombinator.com/item?id=47678283">HN</a>, <a href="https://lobste.rs/s/yesukk/stealing_from_best_emacs_configs">lobste.rs</a>)</li>
<li><a href="https://www.youtube.com/watch?v=U3mMJamXtAs">YE13: Working on modularizing my config</a> (01:23:26)</li>
</ul></li>
<li>Emacs Lisp:
<ul class="org-ul">
<li><a href="https://blog.davep.org/2026/04/06/expando-el-v1-5.html">Dave Pearson: expando.el v1.5</a> - macroexpand and pretty-print</li>
<li><a href="http://yummymelon.com/devnull/computing-days-until-with-emacs.html">Charles Choi: Computing Days Until with Emacs</a> (<a href="https://www.reddit.com/r/emacs/comments/1sg8r05/computing_days_until_with_emacs/">Reddit</a>, <a href="https://irreal.org/blog/?p=13738">Irreal</a>)</li>
<li><a href="https://flandrew.srht.site/listful/counting-words-v-more-solutions-in-emacs-lisp.html">Listful Andrew: Counting Words V: More solutions in Emacs Lisp</a></li>
<li><a href="https://flandrew.srht.site/listful/phones-to-words-challenge-v-clojure-inspired-emacs-lisp.html">Listful Andrew: Phones-to-Words Challenge V: Clojure-inspired Emacs Lisp</a></li>
<li><a href="https://mathstodon.xyz/@tusharhero/116358476967092825">collect-alist-from-tree</a></li>
<li><a href="https://emacsredux.com/blog/2026/04/06/the-many-faces-of-flet/">Emacs Redux: The Many Faces of flet: cl-flet, cl-labels, and cl-letf</a></li>
</ul></li>
<li>Appearance:
<ul class="org-ul">
<li><a href="https://blog.davep.org/2026/04/08/quiz-el-v1-7.html">Dave Pearson: quiz.el v1.7</a> - how to use :extend t to make a face extend to the edge</li>
<li><a href="https://github.com/ember-theme/emacs">Ember for Emacs - A warm, nearly monochrome Doom Emacs theme.</a> (<a href="https://www.reddit.com/r/DoomEmacs/comments/1siju4p/i_made_a_color_theme_and_somehow_managed_to_stick/">Reddit</a>)</li>
<li><a href="https://github.com/Senka07/yotsuba-emacs-theme">I've now created a theme for Emacs, inspired by the Yotsuba B theme from 4chan.</a> (<a href="https://www.reddit.com/r/emacs/comments/1sgbgf9/ive_now_created_a_theme_for_emacs_inspired_by_the/">Reddit</a>)</li>
<li><a href="https://blog.davep.org/2026/04/08/fasta-el-v1-1.html">Dave Pearson: fasta.el v1.1</a> - bioinformatics: font-locking sequences</li>
<li><a href="https://protesilaos.com/codelog/2026-04-10-emacs-spontaneous-live-modus-themes/">Protesilaos Stavrou: Emacs modus-themes live stream</a> (<a href="https://www.youtube.com/watch?v=xFQDYTCS1os">YouTube</a> 02:44:36)</li>
</ul></li>
<li>Navigation:
<ul class="org-ul">
<li><a href="https://emacsredux.com/blog/2026/04/06/minibuffer-regexp-mode/">Emacs Redux: Live Regexp Feedback with minibuffer-regexp-mode</a></li>
<li><a href="https://social.coop/@cwebber/116359052253343688">ediff config tips</a></li>
<li><a href="https://cyberplace.social/@khleedril/116368251651750021">Tip about closing multiple Emacs buffers</a></li>
<li><a href="https://github.com/jamescherti/easysession.el">easysession.el 1.2.1</a> (<a href="https://www.reddit.com/r/emacs/comments/1sg34k5/easysessionel_easily_persist_and_restore_emacs/">Reddit</a>) - frame names, bugfixes, elpaca, daemon mode</li>
<li><a href="https://github.com/vincentjgoh/avy-dashboard">vincentjgoh/avy-dashboard: avy keys for emacs dashboard · GitHub</a> (<a href="https://www.reddit.com/r/emacs/comments/1seed5w/use_avy_to_jump_directly_to_files_in_emacs/">Reddit</a>)</li>
</ul></li>
<li>Dired:
<ul class="org-ul">
<li><a href="http://yummymelon.com/devnull/calming-mouse-interaction-in-dired.html">Charles Choi: Calming Mouse Interaction in Dired</a></li>
</ul></li>
<li>Writing:
<ul class="org-ul">
<li><a href="https://writeout.ink/@ljwrites/116390506294899631">Tip about using Emacs to enter Unicode</a></li>
<li><a href="https://blog.davep.org/2026/04/06/blogmore-el-v4-0.html">Dave Pearson: blogmore.el v4.0</a> more public utility functions</li>
<li><a href="https://github.com/vale981/overleaf.el/releases/tag/v1.1.5">overleaf.el 1.1.5</a> 3-way conflict resolution</li>
</ul></li>
<li>Denote:
<ul class="org-ul">
<li><a href="https://protesilaos.com/codelog/2026-04-06-emacs-spontaneous-live-tonight-denote/">Protesilaos Stavrou: Emacs live stream for writing Denote tests and more</a> (<a href="https://www.youtube.com/watch?v=Vunpn7ovEOc">YouTube</a>, 03:06:26)</li>
</ul></li>
<li>Org Mode:
<ul class="org-ul">
<li><a href="https://list.orgmode.org/87ldety46b.fsf@localhost">Org Mode requests: [RFC] Should org-forward/backward-sentense respect element boundaries?</a></li>
<li><a href="https://github.com/Lycomedes1814/org-better-agenda">Org-Better-Agenda</a> (<a href="https://www.reddit.com/r/emacs/comments/1sgl5yt/orgbetteragenda/">Reddit</a>)</li>
<li><a href="https://www.youtube.com/watch?v=k2-9DS7jZyg">[EMACS LAB] #3: Introduction to Org Mode</a> (01:57:55)</li>
<li><a href="https://sachachua.com/blog/2026/04/org-mode-tangle-emacs-config-snippets-to-different-files-and-add-boilerplate/">Sacha Chua: Org Mode: Tangle Emacs config snippets to different files and add boilerplate</a></li>
<li><a href="https://github.com/krvkir/org-mindmap">org-mindmap — simple inline mind maps for Org</a> (<a href="https://www.reddit.com/r/emacs/comments/1se77s5/orgmindmap_simple_inline_mind_maps_for_org/">r/emacs</a>, <a href="https://www.reddit.com/r/orgmode/comments/1se7nty/orgmindmap_simple_inline_mind_maps_for_org/">r/orgmode</a>)</li>
<li><a href="https://fediscience.org/@jameshowell/116377201685387350">Org ediff config tips</a></li>
<li><a href="https://bzg.fr/en/notes/the-issue-with-issue-trackers/">The issues with issue trackers — Bastien Guerry</a> (<a href="https://framapiaf.org/@ThierryStoehr/116369738844091818">@ThierryStoehr@framapiaf.org</a>) - Bark is what Org Mode uses</li>
<li><a href="https://www.yakshaving.co.uk/posts/emacs-31-orgmode-version-mismatch/">Emacs 31.x Orgmode version mismatch - Blog In Isolation</a> (<a href="https://mastodon.me.uk/@andyc/116368515045422554">@andyc@mastodon.me.uk</a>)</li>
<li><a href="https://www.youtube.com/watch?v=9ldWuYSXeQg">[EMACS LAB] #4: "literate" programming (org-babel)</a> (01:38:44)</li>
<li><a href="https://github.com/adithyabhatkajake/emacs-agenda-viewer">I built a Things 3-inspired web frontend for org-agenda (looking for feedback)</a> (<a href="https://www.reddit.com/r/emacs/comments/1sk320l/i_built_a_things_3inspired_web_frontend_for/">Reddit</a>)</li>
<li><a href="https://notxor.nueva-actitud.org/2022/11/17/tutorial-para-blogear-como-notxor.html">Tutorial para blogear como Notxor</a> (<a href="https://fosstodon.org/@hispaemacs/116365554044703229">@hispaemacs@fosstodon.org</a>)</li>
<li><a href="https://github.com/steve-downey/surround">GitHub - steve-downey/surround: Surround Source Code for org-transclusion</a> (<a href="https://www.reddit.com/r/emacs/comments/1sjekzz/github_stevedowneysurround_surround_source_code/">Reddit</a>)</li>
<li><a href="https://ottawa.place/@plantarum/116363808900997869">Tip about org-babel-remote-temporary-directory</a></li>
<li><a href="https://corteximplant.com/@Viiru/116375879687899687">Embark Org shortcut for displaying difference between timestamp and today</a></li>
<li>Org development:
<ul class="org-ul">
<li><a href="https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/etc/ORG-NEWS?id=e0bc51db6afc13048158b0cefaa734f48d5c8e35">ox-icalendar: Add export blocks and keywords</a></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/etc/ORG-NEWS?id=ff3cd56d3f8137c05b85d9cadf78f26917849c71">ox-html.el: support line numbers as a :before element in code blocks</a></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/etc/ORG-NEWS?id=77f0ff132138b27b0c68de5699c80b071bab6a60">org-support-shift-select: Allow forcing shift-select-mode on timestamps</a></li>
</ul></li>
</ul></li>
<li>Coding:
<ul class="org-ul">
<li><a href="https://github.com/djgoku/compilation-history">djgoku/compilation-history: Automatic compilation history tracking for Emacs with searchable SQLite-backed storage. · GitHub</a> (<a href="https://www.reddit.com/r/emacs/comments/1sf93yd/new_package_compilationhistory_automatically/">Reddit</a>)</li>
<li><a href="https://www.emacs.dyerdwelling.family/emacs/20260409061315-emacs&#45;&#45;wiring-flymake-diagnostics-into-a-follow-mode/">James Dyer: Wiring Flymake Diagnostics into a Follow Mode</a></li>
<li><a href="https://github.com/Jeremias-A-Queiroz/flymake-kubeconform">Jeremias-A-Queiroz/flymake-kubeconform: real-time validation of Kubernetes manifests using kubeconform</a> (<a href="https://www.reddit.com/r/emacs/comments/1sg0mq0/showcase_flymakekubeconform_a_pragmatic_flymake/">Reddit</a>)</li>
<li><a href="https://arialdomartini.github.io/git-fixup">Git fixup is magic (and Magit is too)</a> (<a href="https://lobste.rs/s/2urycz">lobste.rs</a>)</li>
<li><a href="https://www.youtube.com/watch?v=kwwQ-pQ0Rk4">Stop Jujutsu from auto-committing everything</a> (03:34)</li>
<li><a href="https://codeberg.org/trondelag/HOME/src/branch/main/.emacs.d/lisp/ml.el">Making a major mode - ocaml</a> (<a href="https://www.reddit.com/r/emacs/comments/1sg99ga/making_a_major_mode_ocaml/">Reddit</a>)</li>
</ul></li>
<li>Math:
<ul class="org-ul">
<li><a href="https://codeberg.org/teoten/esr">ESR v1.0.0: An R tree sitter mode</a> (<a href="https://www.reddit.com/r/emacs/comments/1siit8n/esr_v100_an_r_tree_sitter_mode/">Reddit</a>)</li>
</ul></li>
<li>Shells:
<ul class="org-ul">
<li><a href="https://social.anartist.org/@choan/116384835718038157">Tip about shell-command-on-region</a></li>
<li><a href="https://github.com/CsBigDataHub/popterm.el">[Ann] New package Popterm [posframe+terminal]​</a> (<a href="https://www.reddit.com/r/emacs/comments/1sjumbg/ann_new_package_popterm_posframeterminal/">Reddit</a>)</li>
<li><a href="https://i.redd.it/g1libuss8cug1.png">Show: How I added a list of other vterm buffers in the modeline</a></li>
<li><a href="https://cashmere.rs/blog/kitty-graphicsel-v040-sixel-text-sizing-and-agent-shell">kitty-graphics.el v0.4.0: Sixel support, text sizing protocol, agent-shell integration</a> (<a href="https://www.reddit.com/r/emacs/comments/1sf8llf/kittygraphicsel_v040_sixel_support_text_sizing/">Reddit</a>)</li>
</ul></li>
<li>Web:
<ul class="org-ul">
<li><a href="http://perotti.org/2026/04/09/eww-a-web-in-my-editor/">EWW! A Web in My Editor! « Here's The Beef</a> (<a href="https://dice.camp/@BeefGriller/116376374567446320">@BeefGriller@dice.camp</a>)</li>
</ul></li>
<li>Mail, news, and chat:
<ul class="org-ul">
<li><a href="https://codeberg.org/martianh/mastodon.el">mastodon.el 2.0.16 - featured tags</a> (<a href="https://todon.nl/@mousebot/116358499901049511">@mousebot@todon.nl</a>)</li>
</ul></li>
<li>Evil mode:
<ul class="org-ul">
<li><a href="https://github.com/Prgebish/evim">evim — multiple cursors for evil-mode, inspired by vim-visual-multi (now on MELPA)</a> (<a href="https://www.reddit.com/r/emacs/comments/1sdx7w0/evim_multiple_cursors_for_evilmode_inspired_by/">r/emacs</a>, <a href="https://www.reddit.com/r/DoomEmacs/comments/1sdxa8y/evim_multiple_cursors_for_evilmode_inspired_by/">r/DoomEmacs</a>)</li>
<li><a href="https://github.com/redguardtoo/evil-matchit">evil-matchit 4.1.0 is published</a> (<a href="https://www.reddit.com/r/emacs/comments/1sgky2l/evilmatchit_410_is_published/">Reddit</a>) - Julia, skip lines that match regex</li>
</ul></li>
<li>Multimedia:
<ul class="org-ul">
<li><a href="https://tv.dyne.org/w/jteKsdgPMWECZc1GKKn9Jj">[21] Working on Canvas Patch (Contd..) - 4/6/2026, 3:33:42 PM - Dyne.org TV</a> and <a href="https://tv.dyne.org/w/cL3KLBrhKQNjTCHYbnJQxF">5:51:25 PM</a></li>
<li><a href="https://www.youtube.com/watch?v=hngY14mk64c">laNotte excerpt</a> (08:18)</li>
</ul></li>
<li>EXWM:
<ul class="org-ul">
<li><a href="https://github.com/termux/termux-packages/pull/29225/">EXWM on termux!</a> (<a href="https://www.reddit.com/r/emacs/comments/1sdtgr0/exwm_on_termux/">Reddit</a>)</li>
</ul></li>
<li>Fun:
<ul class="org-ul">
<li><a href="https://github.com/tiatatida/tamagotchi-on-emacs">tamagotchi on emacs!</a> (<a href="https://www.reddit.com/r/emacs/comments/1sgsu43/tamagotchi_on_emacs/">Reddit</a>)</li>
<li><a href="https://github.com/Feyorsh/nethack-el">Server play support in nethack-el</a> (<a href="https://www.reddit.com/r/nethack/comments/1seiwro/server_play_support_in_nethackel/">Reddit</a>)</li>
</ul></li>
<li>AI:
<ul class="org-ul">
<li><a href="https://www.reddit.com/r/emacs/comments/1sgprd7/ann_new_packages_agentshelldispatch_and/">ann new packages: agent-shell-dispatch and agent-shell-ediff</a></li>
<li><a href="https://codeberg.org/bajsicki/gptel-got">bajsicki/gptel-got: Tooling for LLM interactions with org-mode</a></li>
<li><a href="https://github.com/dgillis/emacs-codex-ide">Emacs Codex IDE integration</a> (<a href="https://www.reddit.com/r/emacs/comments/1se6nyv/emacs_codex_ide_integration/">Reddit</a>)</li>
<li><a href="https://github.com/agzam/death-contraptions/tree/main/tools/elisp-eval">I forced Claude to play Tetris in Emacs.</a> (<a href="https://www.reddit.com/r/emacs/comments/1si5si7/i_forced_claude_to_play_tetris_in_emacs/">Reddit</a>, <a href="https://news.ycombinator.com/item?id=47726541">HN</a>)</li>
</ul></li>
<li>Community:
<ul class="org-ul">
<li><a href="https://www.reddit.com/r/emacs/comments/1sek30r/fortnightly_tips_tricks_and_questions_20260407/">Fortnightly Tips, Tricks, and Questions — 2026-04-07 / week 14</a></li>
<li><a href="https://github.com/magit/magit/issues/5555">Raising a few $thousand to keep version control magical</a> (<a href="https://www.reddit.com/r/emacs/comments/1shj59p/raising_a_few_thousand_to_keep_version_control/">Reddit</a>, <a href="https://irreal.org/blog/?p=13736">Irreal</a>) - support tarsius</li>
<li><a href="https://sachachua.com/blog/2026/04/ye12-categorizing-emacs-news-epwgraph-languages/">Sacha Chua: YE12: Categorizing Emacs News, epwgraph, languages</a></li>
</ul></li>
<li>Other:
<ul class="org-ul">
<li><a href="https://chrismaiorana.com/the-emacs-way-deleting-files/">Chris Maiorana: The Emacs Way: Deleting Files</a></li>
<li><a href="https://arnesonium.com/2026/04/emacs-freelance-command-center">Erik L. Arneson: Emacs as the Freelancer's Command Center</a></li>
<li><a href="https://codeberg.org/senchawizard/emacs-polydiceware">senchawizard/emacs-polydiceware: generate passwords with dice</a> (<a href="https://gotosocial.social/@senchawizard/statuses/01KNZQN27FARKWTW9Y34814KT6">@senchawizard@gotosocial.social</a>)</li>
<li><a href="https://github.com/renatgalimov/op.el">I built an Emacs auth-source backend for 1Password (tested on macOS)</a> (<a href="https://www.reddit.com/r/emacs/comments/1sfwlkd/i_built_an_emacs_authsource_backend_for_1password/">Reddit</a>)</li>
<li><a href="https://www.reddit.com/r/emacs/comments/1si7wvs/few_tips_for_faster_emacs_install_with_msys2/">Few tips for faster Emacs install with MSYS2</a></li>
</ul></li>
<li>Emacs development:
<ul class="org-ul">
<li>emacs-devel:
<ul class="org-ul">
<li><a href="https://yhetil.org/emacs-devel/87341d81e4.fsf@bernoul.li/">Re: On keybindings and the slow erosion of help's utility - Jonas Bernoulli</a> - it would be great to get where-is to work with transient suffixes</li>
<li><a href="https://yhetil.org/emacs-devel/E1w8UHv-0000fM-1D@fencepost.gnu.org/">Terminology changes from a long time ago: window, pane; frame, window</a></li>
</ul></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=b4da8610cd3091a05f458bcda52ce133e2e9494c">; New function 'ns-process-is-accessibility-trusted', no message (bug#80624)</a></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=2bca4ac0ed7f9911c5d1443615ec3e1ac3364a8d">Support 24-bit TrueColor on MS-Windows console</a></li>
</ul></li>
<li>New packages:
<ul class="org-ul">
<li><a target="_blank" href="https://melpa.org/#/agitjo">agitjo</a>: Manage Forgejo PRs with AGit-Flow (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/ben">ben</a>: Asynchronous buffer-local environments via `direnv' (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/popterm">popterm</a>: Posframe terminal toggler with smart backends (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/struct-completion">struct-completion</a>: Keyword slot completion for cl-defstruct constructors (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/taskjuggler-mode">taskjuggler-mode</a>: Major mode for TaskJuggler project files (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/tokyo-night">tokyo-night</a>: Shared infrastructure for Tokyo Night themes (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/trust-manager">trust-manager</a>: Convenient trust management (MELPA)</li>
</ul></li>
</ul>

<p>
Links from <a href="https://www.reddit.com/r/emacs">reddit.com/r/emacs</a>, <a href="https://www.reddit.com/r/orgmode">r/orgmode</a>, <a href="https://www.reddit.com/r/spacemacs">r/spacemacs</a>, <a href="https://mastodon.social/tags/emacs">Mastodon #emacs</a>, <a href="https://bsky.app/hashtag/emacs">Bluesky #emacs</a>, <a href="https://hn.algolia.com/?query=emacs&amp;sort=byDate&amp;prefix&amp;page=0&amp;dateRange=all&amp;type=story">Hacker News</a>, <a href="https://lobste.rs/search?q=emacs&amp;what=stories&amp;order=newest">lobste.rs</a>, <a href="https://programming.dev/c/emacs?dataType=Post&amp;page=1&amp;sort=New">programming.dev</a>, <a href="https://lemmy.world/c/emacs">lemmy.world</a>, <a href="https://lemmy.ml/c/emacs?dataType=Post&amp;page=1&amp;sort=New">lemmy.ml</a>, <a href="https://planet.emacslife.com">planet.emacslife.com</a>, <a href="https://www.youtube.com/playlist?list=PL4th0AZixyREOtvxDpdxC9oMuX7Ar7Sdt">YouTube</a>, <a href="http://git.savannah.gnu.org/cgit/emacs.git/log/etc/NEWS">the Emacs NEWS file</a>, <a href="https://emacslife.com/calendar/">Emacs Calendar</a>, and <a href="https://lists.gnu.org/archive/html/emacs-devel/2026-04">emacs-devel</a>. Thanks to Andrés Ramírez for emacs-devel links. Do you have an Emacs-related link or announcement? Please e-mail me at <a href="mailto:sacha@sachachua.com">sacha@sachachua.com</a>. Thank you!
</p>
<div><a href="https://sachachua.com/blog/2026/04/2026-04-13-emacs-news/index.org">View Org source for this post</a></div><p>You can <a href="https://social.sachachua.com/@sacha/statuses/01KP410BRBV8YMAEW3NBXK70G5" target="_blank" rel="noopener noreferrer">comment on Mastodon</a> or <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2026%2F04%2F2026-04-13-emacs-news%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></content>
		</entry><entry>
		<title type="html">Org Mode: Tangle Emacs config snippets to different files and add boilerplate</title>
		<link rel="alternate" type="text/html" href="https://sachachua.com/blog/2026/04/org-mode-tangle-emacs-config-snippets-to-different-files-and-add-boilerplate/"/>
		<author><name><![CDATA[Sacha Chua]]></name></author>
		<updated>2026-04-11T14:13:19Z</updated>
    <published>2026-04-11T14:13:19Z</published>
    <category term="emacs" />
<category term="org" />
		<id>https://sachachua.com/blog/2026/04/org-mode-tangle-emacs-config-snippets-to-different-files-and-add-boilerplate/</id>
		<content type="html"><![CDATA[<p>
I want to organize the functions in my Emacs configuration so that they are easier for me to test and so that other people can load them from my repository. Instead of copying multiple code blogs from my blog posts or my exported Emacs configuration, it would be great if people could just include a file from the repository. I don't think people copy that much from my config, but it might still be worth making it easier for people to borrow interesting functions. It would be great to have libraries of functions that people can evaluate without worrying about side effects, and then they can copy or write a shorter piece of code to use those functions.
</p>

<p>
<a href="https://protesilaos.com/emacs/dotemacs#h:fc1ea247-5ef6-4c4e-a807-6c7b2482af90">In Prot's configuration (The custom libraries of my configuration)</a>, he includes each library as in full, in a single code block, with the boilerplate description, keywords, and <code>(provide '...)</code> that make them more like other libraries in Emacs.
</p>

<p>
I'm not quite sure my little functions are at that point yet. For now, I like the way that the functions are embedded in the blog posts and notes that explain them, and the org-babel <code>:comments</code> argument can insert links back to the sections of my configuration that I can open with <code>org-open-at-point-global</code> or <code>org-babel-tangle-jump-to-org</code>.
</p>

<details class="code-details" style="padding: 1em;
                 border-radius: 15px;
                 font-size: 0.9em;
                 box-shadow: 0.05em 0.1em 5px 0.01em  #00000057;">
                  <summary><strong>Thinking through the options...</strong></summary>
<p>
Org tangles blocks in order, so if I want boilerplate or if I want to add require statements, I need to have a section near the beginning of my config that sets those up for each file. Noweb references might help me with common text like the license. Likewise, if I want a <code>(provide ...)</code> line at the end of each file, I need a section near the end of the file.
</p>

<p>
If I want to specify things out of sequence, I could use Noweb. By setting <code>:noweb-ref some-id :tangle no</code> on the blocks I want to collect later, I can then tangle them in the middle of the boilerplate. Here's a brief demo:
</p>


<div class="org-src-container">
<pre class="src src-org"><code><span class="org-org-block-begin-line">#+begin_src emacs-lisp :noweb yes :tangle lisp/sacha-eshell.el :comments no</span>
<span class="org-org-block"><span class="org-comment-delimiter">;; </span></span><span class="org-org-block"><span class="org-comment">-*- lexical-binding: t; -*-</span></span>
<span class="org-org-block">&lt;&lt;sacha-eshell&gt;&gt;</span>
<span class="org-org-block">(</span><span class="org-org-block"><span class="org-keyword">provide</span></span><span class="org-org-block"> </span><span class="org-org-block"><span class="org-highlight-quoted-quote">'</span></span><span class="org-org-block"><span class="org-constant">sacha-eshell</span></span><span class="org-org-block">)</span>
<span class="org-org-block-end-line">#+end_src</span>
</code></pre>
</div>


<p>
However, I'll lose the comment links that let me jump back to the part of the Org file with the original source block. This means that if I use <code>find-function</code> to jump to the definition of a function and then I want to find the outline section related to it, I have to use a function that checks if this might be my custom code and then looks in my config for "defun &hellip;". It's a little less generic.
</p>

<p>
I wonder if I can combine multiple targets with some code that knows what it's being tangled to, so it can write slightly different text. <code>org-babel-tangle-single-block</code> currently calculates the result once and then adds it to the list for each filename, so that doesn't seem likely.
</p>

<p>
Alternatively, maybe I can use noweb or my own tangling function and add the link comments from org-babel-tangle-comments.
</p>


</details>

<p>
Aha, I can fiddle with <code>org-babel-post-tangle-hook</code> to insert the boilerplate after the blocks have been written. Then I can add the <code>lexical-binding: t</code> cookie and the structure that makes it look more like the other libraries people define and use. It's always nice when I can get away with a small change that uses an existing hook. For good measure, let's even include a list of links to the sections of my config that affect that file.
</p>


<div class="org-src-container">
<pre class="src src-emacs-lisp"><code>(<span class="org-keyword">defvar</span> <span class="org-variable-name">sacha-dotemacs-url</span> <span class="org-string">"https://sachachua.com/dotemacs/"</span>)

<span class="org-comment-delimiter">;;;</span><span class="org-comment">###</span><span class="org-comment"><span class="org-warning">autoload</span></span>
(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-dotemacs-link-for-section-at-point</span> (<span class="org-type">&amp;optional</span> combined)
  <span class="org-doc">"Return the link for the current section."</span>
  (<span class="org-keyword">let*</span> ((custom-id (org-entry-get-with-inheritance <span class="org-string">"CUSTOM_ID"</span>))
         (title (org-entry-get (point) <span class="org-string">"ITEM"</span>))
         (url (<span class="org-keyword">if</span> custom-id
                  (concat <span class="org-string">"dotemacs:"</span> custom-id)
                (concat sacha-dotemacs-url <span class="org-string">":-:text="</span> (url-hexify-string title)))))
    (<span class="org-keyword">if</span> combined
        (org-link-make-string
         url
         title)
      (cons url title))))

(<span class="org-keyword">eval-and-compile</span>
  (<span class="org-keyword">require</span> <span class="org-highlight-quoted-quote">'</span><span class="org-constant">org-core</span> nil t)
  (<span class="org-keyword">require</span> <span class="org-highlight-quoted-quote">'</span><span class="org-constant">org-macs</span> nil t)
  (<span class="org-keyword">require</span> <span class="org-highlight-quoted-quote">'</span><span class="org-constant">org-src</span> nil t))
(<span class="org-keyword">declare-function</span> <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">org-babel-tangle&#45;&#45;compute-targets</span> <span class="org-string">"ob-tangle"</span>)
(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-org-collect-links-for-tangled-files</span> ()
  <span class="org-doc">"Return a list of ((filename (link link link link)) ...)."</span>
  (<span class="org-keyword">let*</span> ((file (buffer-file-name))
         results)
    (<span class="org-keyword">org-babel-map-src-blocks</span> (buffer-file-name)
      (<span class="org-keyword">let*</span> ((info (org-babel-get-src-block-info))
             (link (sacha-dotemacs-link-for-section-at-point)))
        (mapc
         (<span class="org-keyword">lambda</span> (target)
           (<span class="org-keyword">let</span> ((list (assoc target results <span class="org-highlight-quoted-quote">#'</span><span class="org-highlight-quoted-symbol">string=</span>)))
             (<span class="org-keyword">if</span> list
                 (<span class="org-keyword">cl-pushnew</span> link (cdr list) <span class="org-builtin">:test</span> <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">equal</span>)
               (<span class="org-keyword">push</span> (list target link) results))))
         (org-babel-tangle&#45;&#45;compute-targets file info))))
    <span class="org-comment-delimiter">;; </span><span class="org-comment">Put it back in source order</span>
    (nreverse
     (mapcar (<span class="org-keyword">lambda</span> (o)
               (cons (car o)
                     (nreverse (cdr o))))
             results))))
(<span class="org-keyword">defvar</span> <span class="org-variable-name">sacha-emacs-config-module-links</span> nil <span class="org-doc">"Cache for links from tangled files."</span>)

<span class="org-comment-delimiter">;;;</span><span class="org-comment">###</span><span class="org-comment"><span class="org-warning">autoload</span></span>
(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-emacs-config-update-module-info</span> ()
  <span class="org-doc">"Update the list of links."</span>
  (<span class="org-keyword">interactive</span>)
  (<span class="org-keyword">setq</span> sacha-emacs-config-module-links
        (seq-filter
         (<span class="org-keyword">lambda</span> (o)
           (string-match <span class="org-string">"sacha-"</span> (car o)))
         (sacha-org-collect-links-for-tangled-files)))
  (<span class="org-keyword">setq</span> sacha-emacs-config-modules-info
        (mapcar (<span class="org-keyword">lambda</span> (group)
                  <span class="org-highlight-quoted-quote">`</span>(,(file-name-base (car group))
                    (commentary
                     .
                     ,(replace-regexp-in-string
                       <span class="org-string">"^"</span>
                       <span class="org-string">";; "</span>
                       (concat
                        <span class="org-string">"Related Emacs config sections:\n\n"</span>
                        (org-export-string-as
                         (mapconcat
                          (<span class="org-keyword">lambda</span> (link)
                            (concat <span class="org-string">"- "</span> (cdr link) <span class="org-string">"\\\\\n  "</span> (org-link-make-string (car link)) <span class="org-string">"\n"</span>))
                          (cdr group)
                          <span class="org-string">"\n"</span>)
                         <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">ascii</span>
                         t))))))
                sacha-emacs-config-module-links)))

<span class="org-comment-delimiter">;;;</span><span class="org-comment">###</span><span class="org-comment"><span class="org-warning">autoload</span></span>
(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-emacs-config-prepare-to-tangle</span> ()
  <span class="org-doc">"Update module info if tangling my config."</span>
  (<span class="org-keyword">when</span> (string-match <span class="org-string">"Sacha.org"</span> (buffer-file-name))
    (sacha-emacs-config-update-module-info)))
</code></pre>
</div>


<p>
Let's set up the functions for tangling the boilerplate.
</p>


<div class="org-src-container">
<pre class="src src-emacs-lisp"><code>(<span class="org-keyword">defvar</span> <span class="org-variable-name">sacha-emacs-config-modules-dir</span> <span class="org-string">"~/sync/emacs/lisp/"</span>)
(<span class="org-keyword">defvar</span> <span class="org-variable-name">sacha-emacs-config-modules-info</span> nil <span class="org-doc">"Alist of module info."</span>)
(<span class="org-keyword">defvar</span> <span class="org-variable-name">sacha-emacs-config-url</span> <span class="org-string">"https://sachachua.com/dotemacs"</span>)

<span class="org-comment-delimiter">;;;</span><span class="org-comment">###</span><span class="org-comment"><span class="org-warning">autoload</span></span>
(<span class="org-keyword">defun</span> <span class="org-function-name">sacha-org-babel-post-tangle-insert-boilerplate-for-sacha-lisp</span> ()
  (<span class="org-keyword">when</span> (file-in-directory-p (buffer-file-name) sacha-emacs-config-modules-dir)
    (goto-char (point-min))
    (<span class="org-keyword">let</span> ((base (file-name-base (buffer-file-name))))
      (insert (format <span class="org-string">";;; %s.el &#45;&#45;- %s -*- lexical-binding: t -*-</span>

<span class="org-string">;; Author: %s &lt;%s&gt;</span>
<span class="org-string">;; URL: %s</span>

<span class="org-string">;;; License:</span>
<span class="org-string">;;</span>
<span class="org-string">;; This file is not part of GNU Emacs.</span>
<span class="org-string">;;</span>
<span class="org-string">;; This is free software; you can redistribute it and/or modify</span>
<span class="org-string">;; it under the terms of the GNU General Public License as published by</span>
<span class="org-string">;; the Free Software Foundation; either version 3, or (at your option)</span>
<span class="org-string">;; any later version.</span>
<span class="org-string">;;</span>
<span class="org-string">;; This is distributed in the hope that it will be useful,</span>
<span class="org-string">;; but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<span class="org-string">;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span>
<span class="org-string">;; GNU General Public License for more details.</span>
<span class="org-string">;;</span>
<span class="org-string">;; You should have received a copy of the GNU General Public License</span>
<span class="org-string">;; along with GNU Emacs; see the file COPYING.  If not, write to the</span>
<span class="org-string">;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,</span>
<span class="org-string">;; Boston, MA 02110-1301, USA.</span>

<span class="org-string">;;; Commentary:</span>
<span class="org-string">;;</span>
<span class="org-string">%s</span>
<span class="org-string">;;; Code:</span>

<span class="org-string">\n\n"</span>
                      base
                      (<span class="org-keyword">or</span>
                       (assoc-default <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">description</span>
                                      (assoc-default base sacha-emacs-config-modules-info <span class="org-highlight-quoted-quote">#'</span><span class="org-highlight-quoted-symbol">string=</span>))
                       <span class="org-string">""</span>)
                      user-full-name
                      user-mail-address
                      sacha-emacs-config-url
                      (<span class="org-keyword">or</span>
                       (assoc-default <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">commentary</span>
                                      (assoc-default base sacha-emacs-config-modules-info <span class="org-highlight-quoted-quote">#'</span><span class="org-highlight-quoted-symbol">string=</span>))
                       <span class="org-string">""</span>)))
      (goto-char (point-max))
      (insert (format <span class="org-string">"\n(provide '%s)\n;;; %s.el ends here\n"</span>
                      base
                      base))
      (save-buffer))))
</code></pre>
</div>



<div class="org-src-container">
<pre class="src src-emacs-lisp"><code>(<span class="org-keyword">setq</span> sacha-emacs-config-url <span class="org-string">"https://sachachua.com/dotemacs"</span>)
(<span class="org-keyword">with-eval-after-load</span> <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">org</span>
  (add-hook <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">org-babel-pre-tangle-hook</span> <span class="org-highlight-quoted-quote">#'</span><span class="org-highlight-quoted-symbol">sacha-emacs-config-prepare-to-tangle</span>)
  (add-hook <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">org-babel-post-tangle-hook</span> <span class="org-highlight-quoted-quote">#'</span><span class="org-highlight-quoted-symbol">sacha-org-babel-post-tangle-insert-boilerplate-for-sacha-lisp</span>))
</code></pre>
</div>


<p>
You can see the results at <a href="https://codeberg.org/sachac/.emacs.d/src/branch/gh-pages/lisp/">.emacs.d/lisp</a>. For example, the function definitions in this post are at <a href="https://codeberg.org/sachac/.emacs.d/src/branch/gh-pages/lisp/sacha-emacs.el">lisp/sacha-emacs.el</a>.
</p>

<div class="note">This is part of my <a href="https://sachachua.com/dotemacs#org-mode-org-babel-tangling-sacha-emacs-config-snippets-to-different-files-and-adding-boilerplate">Emacs configuration.</a></div><div><a href="https://sachachua.com/blog/2026/04/org-mode-tangle-emacs-config-snippets-to-different-files-and-add-boilerplate/index.org">View Org source for this post</a></div><p>You can <a href="https://sachachua.com/blog/2026/04/org-mode-tangle-emacs-config-snippets-to-different-files-and-add-boilerplate/#comment">view 2 comments</a> or <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2026%2F04%2Forg-mode-tangle-emacs-config-snippets-to-different-files-and-add-boilerplate%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></content>
		</entry><entry>
		<title type="html">La semaine du 30 mars au 5 avril</title>
		<link rel="alternate" type="text/html" href="https://sachachua.com/blog/2026/04/la-semaine-du-30-mars-au-5-avril/"/>
		<author><name><![CDATA[Sacha Chua]]></name></author>
		<updated>2026-04-07T16:37:16Z</updated>
    <published>2026-04-07T16:37:16Z</published>
    <category term="french" />
		<id>https://sachachua.com/blog/2026/04/la-semaine-du-30-mars-au-5-avril/</id>
		<content type="html"><![CDATA[<div class="sticky-toc" id="org7e2075d">
<div id="text-table-of-contents" role="doc-toc">
<ul>
<li><a href="https://sachachua.com/blog/feed/atom/index.xml#org8124cd2">lundi 30</a></li>
<li><a href="https://sachachua.com/blog/feed/atom/index.xml#orgae32560">mardi 31</a></li>
<li><a href="https://sachachua.com/blog/feed/atom/index.xml#org03833b1">mercredi 1 avril</a></li>
<li><a href="https://sachachua.com/blog/feed/atom/index.xml#org5851d5f">jeudi 2</a></li>
<li><a href="https://sachachua.com/blog/feed/atom/index.xml#org93e9148">vendredi 3</a></li>
<li><a href="https://sachachua.com/blog/feed/atom/index.xml#orge2bb507">samedi 4</a></li>
<li><a href="https://sachachua.com/blog/feed/atom/index.xml#org6a1d17b">dimanche 5</a></li>
</ul>
</div>

</div>
<div id="outline-container-org8124cd2" class="outline-3">
<h3 id="org8124cd2">lundi 30</h3>
<div class="outline-text-3" id="text-org8124cd2">
<p>
J'ai modifié mes fonctions pour tirer des liens par commande vocale. Maintenant, je peux dire plusieurs catégories de suite et mon code les traitera toutes dans l'ordre, ce qui rend la classification encore plus facile.
</p>

<p>
Ma fille s'est amusée dans son cours de gymnastique. Elle s'est entraînée à faire un demi-flip par-dessus un bloc. Elle était fière d'elle-même.
</p>

<p>
Il faisait très beau et le soleil brillait.
</p>

<p>
Pour le dîner, nous avons fait un petit pique-nique sur la terrasse en bois. Nous avons préparé des nuggets de poulet et des frites.
</p>

<p>
J'étais un peu enrhumée ce soir. J'espère que c'était juste parce que j'étais fatiguée.
</p>
</div>
</div>
<div id="outline-container-orgae32560" class="outline-3">
<h3 id="orgae32560">mardi 31</h3>
<div class="outline-text-3" id="text-orgae32560">
<p>
J'étais un peu fatiguée quand je me suis réveillée. J'éternuais beaucoup. J'ai pris un médicament contre des allergies, ce qui m'a aidée.
</p>

<p>
Ma fille s'est réveillée à temps pour compléter notre routine matinale avant l'école. Une des électrodes de l'appareil Holter s'est déconnectée au cours de la nuit.
</p>

<p>
Le site d'iTalki avait planté. Heureusement, l'application fonctionnait. Je l'ai utilisée pour demander le lien de rendez-vous avec mon tuteur et je me suis entraînée à dire les virelangues avec lui.
</p>

<p>
J'ai préparé mes notes avant mon rendez-vous avec Prot pour mieux apprendre Emacs. Je les ai envoyées à Prot, qui va écrire son propre article en réponse. J'ai hâte d'apprendre ensemble.
</p>

<p>
En préparation pour notre rendez-vous et pour utiliser une astuce sur <code>user-lisp-directory</code> que j'ai trouvée dans sa configuration, j'ai mis à jour mon installation d'Emacs. Quelque chose est cassé et mon approche habituelle d'utiliser bug-hunter pour identifier le problème n'a pas fonctionné. Je dois investiguer plus tard.
</p>

<p>
Il faisait beau et nuageux. Après l'école, j'ai emmené ma fille au parc pour jouer avec ses amies. J'ai apporté les jouets de sable et elles se sont amusées en creusant des trous et en faisant des gâteaux dans le bac à sable. Elles ont aussi joué sur les balançoires. Elles ont joué jusqu'à ce qu'il fasse froid.
</p>

<p>
Nous avons mangé des nouilles ramen et des restes pour le dîner. Après ça, j'ai modifié ma configuration d'Emacs pendant la diffusion en direct. J'ai trouvé une façon qui me permet de laisser mes fonctions dans le contexte des articles et de les emballer avec les textes standards une fois que je les tangle dans quelques fichiers. Je vais utiliser un tableau des options ou une liste pour varier les textes demain.
</p>

<p>
À l'heure du coucher, ma fille a voulu peindre avec des aquarelles. Au lieu de peindre une image spécifique, elle a essayé des manières différentes d'utiliser son pinceau. L'expérience est une merveilleuse partie de s'amuser avec l'art.
</p>
</div>
</div>
<div id="outline-container-org03833b1" class="outline-3">
<h3 id="org03833b1">mercredi 1 avril</h3>
<div class="outline-text-3" id="text-org03833b1">
<p>
<a href="https://sachachua.com/blog/2026/04/yayemacs-10-emacs-coaching-with-prot-packaging-emacs-lisp/">Je me suis amusée en discutant d'Emacs avec Protesilaos</a>. Après le rendez-vous, j'ai édité la vidéo. J'ai aussi transcrit les pistes séparément et j'ai ajouté une fonction pour combiner les transcriptions.
</p>

<p>
J'ai configuré OBS (le logiciel pour diffuser en direct) pour effacer mon fond.
</p>

<p>
Ma fille a séché son cours l'après-midi.
</p>

<p>
Ma fille s'est amusée à jouer avec la mousse à raser et de la peinture.
</p>
</div>
</div>
<div id="outline-container-org5851d5f" class="outline-3">
<h3 id="org5851d5f">jeudi 2</h3>
<div class="outline-text-3" id="text-org5851d5f">
<p>
Nous avons rendu une visite à Popo (la mère de mon mari). Ma fille lui a donné quelques peintures et une pièce de poterie.
</p>

<p>
Ma sœur qui habite aux Pays-Bas a dû aller à l'hôpital. Heureusement, mon autre sœur qui habite en Californie lui rend actuellement une visite et elle peut rester avec elle pendant que son mari reste avec ses enfants.
</p>

<p>
J'ai emmené ma fille au parc pour jouer avec ses amies. Il y avait énormément de monde car il faisait très beau et le soleil brillait.
</p>
</div>
</div>
<div id="outline-container-org93e9148" class="outline-3">
<h3 id="org93e9148">vendredi 3</h3>
<div class="outline-text-3" id="text-org93e9148">
<p>
Je suis partie en quête secondaire à modifier ma bibliothèque « compile-media » pour supprimer la partie de l'enregistrement où ma fille nous a rejoints. J'ai aussi essayé d'installer les pilotes pour le GPU de mon ordinateur portable, mais non seulement ça n'a pas fonctionné, cela a aussi cassé ma connexion wifi.
</p>

<p>
Ma fille a encore séché son cours l'après-midi.
</p>

<p>
Nous avons fait les courses.
</p>

<p>
Nous avons mangé de la pizza cuite sur une plaque à pizza en acier.
</p>
</div>
</div>
<div id="outline-container-orge2bb507" class="outline-3">
<h3 id="orge2bb507">samedi 4</h3>
<div class="outline-text-3" id="text-orge2bb507">
<p>
J'ai planifié une diffusion en direct jeudi pour m'entraîner à discuter pendant que je faisais de la programmation.
J'ai mis à jour mon script transcription pour utiliser ma carte graphique. Elle peut gérer jusqu'au modèle moyen de la reconnaissance vocale. Le grand modèle provoque une erreur de mémoire insuffisante. Néanmoins, ce sera utile pour transcrire des segments brefs plus vite.
</p>

<p>
J'ai emmené ma fille à son cours de création de bijoux. Elle a dit qu'il y a trois étudiants dans sa classe, mais néanmoins, c'était un peu trop bruyant parce qu'il y a un cours de danse dans l'autre pièce. Cependant, elle s'est amusée.
</p>

<p>
J'ai renouvelé nos cartes de bibliothèque, j'ai rentré beaucoup de livres et j'ai emprunté un livre pour ma fille.
</p>

<p>
Ma fille et mon mari ont préparé des nids de meringue, et ils les ont remplis avec de la crème fouettée et des fraises. C'était hyper délicieux.
</p>

<p>
Ma fille et moi avons fait quelques bracelets après le dîner.
</p>
</div>
</div>
<div id="outline-container-org6a1d17b" class="outline-3">
<h3 id="org6a1d17b">dimanche 5</h3>
<div class="outline-text-3" id="text-org6a1d17b">
<p>
J'ai découvert comment faire <code>find-function</code> fonctionner pour les fonctions que je définis à l'extérieur d'un fichier <code>.el</code>. Il fallait modifier <a href="https://sachachua.com/blog/2026/04/ye11-fix-find-function-for-emacs-lisp-from-org-babel-or-scratch/">find-function-search-for-symbol</a> pour traiter le cas où Emacs ne peut pas chercher la fonction dans une bibliothèque. Je l'ai modifié pour effectuer la recherche dans tous les buffers avec le mode majeur Emacs Lisp en plus d'une liste d'autres fichiers. J'ai fait une brève diffusion en direct.
</p>

<p>
Maintenant je peux utiliser ma carte graphique pour des tâches comme le codage de vidéo et la reconnaissance vocale, j'ai mis à jour ma configuration et <a href="https://sachachua.com/blog/2026/01/emacs-and-whisper-el-trying-out-different-speech-to-text-backends-and-models/">mes résultats d'analyse comparative</a>.
</p>

<p>
J'ai ajouté <a target="_blank" href="https://melpa.org/#/org-autolist">org-autolist</a> à ma configuration sur la recommandation d'un commentateur. Il va falloir s'y habituer, mais il semble utile.
</p>

<p>
J'ai aussi mis à jour ma fonction pour exporter mon article vers mon générateur de site pour qu'elle copie le résultat à mon serveur après un bref délai.
</p>

<p>
Comme prévu, les meringues que ma fille et mon mari ont remplies hier sont devenues détrempées. Je les ai mises dans des crêpes avec plus de crème fouettée et plus de fraises et elles sont parfaitement délicieuses.
</p>

<p>
Ma fille a appelé indépendamment sa tante pour jouer à Minecraft. J'étais ravie de voir que ma fille est à l'aise avec ma famille.
</p>

<p>
J'ai fait une brève promenade pour attraper des Pokémon. Je suis rentrée une fois qu'il a commencé à bruiner.
</p>

<p>
Mon mari a préparé du riz gluant chinois au poulet et aux champignons (<i>lo mai gai</i>). J'ai préparé du bok choy et du brocoli.
</p>
</div>
</div>
<div><a href="https://sachachua.com/blog/2026/04/la-semaine-du-30-mars-au-5-avril/index.org">View Org source for this post</a></div><p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2026%2F04%2Fla-semaine-du-30-mars-au-5-avril%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></content>
		</entry><entry>
		<title type="html">YE12: Categorizing Emacs News, epwgraph, languages</title>
		<link rel="alternate" type="text/html" href="https://sachachua.com/blog/2026/04/ye12-categorizing-emacs-news-epwgraph-languages/"/>
		<author><name><![CDATA[Sacha Chua]]></name></author>
		<updated>2026-04-06T14:36:57Z</updated>
    <published>2026-04-06T14:36:57Z</published>
    <category term="emacs" />
<category term="stream" />
<category term="yay-emacs" />
		<id>https://sachachua.com/blog/2026/04/ye12-categorizing-emacs-news-epwgraph-languages/</id>
		<content type="html"><![CDATA[<p>
<video controls="1" src="https://archive.org/download/2026-04-06-ye-12-emacs-news-epwgraph-languages/2026-04-06-ye12-emacs-news-epwgraph-languages.mp4" type="video/mp4"></video>
</p>

<p>
<a href="https://archive.org/details/2026-04-06-ye-12-emacs-news-epwgraph-languages">View in the Internet Archive</a>, <a href="https://youtube.com/live/zMcyTAOG0i8">watch or comment on YouTube</a>, or <a href="mailto:sacha@sachachua.com">email me</a>.
</p>

<p>
Chapters:
</p>

<ul class="org-ul">
<li><span class="media-time" data-start="2481.000">00:41:21</span> epwgraph</li>
<li><span class="media-time" data-start="3296.000">00:54:56</span> learning languages</li>
</ul>

<p>
Thanks for your patience with the audio issues! At some point, I need to work out the contention between all the different processes that I want to be listening to the audio from my mic. =)
</p>

<p>
In this livestream, I categorize <a href="https://sachachua.com/blog/2026/04/2026-04-06-emacs-news/">Emacs News for 2026-04-06</a>, show <a href="https://github.com/sachac/epwgraph">epwgraph</a> for managing Pipewire connections from Emacs, and share some of my <a href="https://codeberg.org/sachac/learn-lang/">language learning workflows</a>.
</p>
<div><a href="https://sachachua.com/blog/2026/04/ye12-categorizing-emacs-news-epwgraph-languages/index.org">View Org source for this post</a></div><p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2026%2F04%2Fye12-categorizing-emacs-news-epwgraph-languages%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></content>
		</entry><entry>
		<title type="html">2026-04-06 Emacs news</title>
		<link rel="alternate" type="text/html" href="https://sachachua.com/blog/2026/04/2026-04-06-emacs-news/"/>
		<author><name><![CDATA[Sacha Chua]]></name></author>
		<updated>2026-04-06T12:00:00Z</updated>
    <published>2026-04-06T12:00:00Z</published>
    <category term="emacs" />
<category term="emacs-news" />
		<id>https://sachachua.com/blog/2026/04/2026-04-06-emacs-news/</id>
		<content type="html"><![CDATA[<p>
There's a lot of buzz around the remote code
execution thing that involves Git, but it seems to be
more of a Git issue than an Emacs one. <a href="https://github.com/califio/publications/blob/main/MADBugs/vim-vs-emacs-vs-claude/Emacs.md">This might
be a workaround</a> if you want, and in the meantime,
don't check out git repositories you don't trust.
There's no page for the <a href="https://www.emacswiki.org/emacs/Carnival">Emacs Carnival</a> for April
yet, but you can start thinking about the theme of
"newbies/starter kits" already, and I'm sure Cena
or someone will round things up afterwards. Enjoy!
</p>

<ul class="org-ul">
<li><a href="https://github.com/califio/publications/blob/main/MADBugs/vim-vs-emacs-vs-claude/Emacs.md">Workaround for the Git-related security issue that lots of people are talking about</a> (<a href="https://social.tchncs.de/@stackeffect/116327976371248454">@stackeffect@social.tchncs.de</a>)</li>
<li>Upcoming events (<a href="https://emacslife.com/calendar/emacs-calendar.ics">iCal file</a>, <a href="https://emacslife.com/calendar/">Org</a>):
<ul class="org-ul">
<li>Emacs.si (in person): Emacs.si meetup #4 2026 (v #živo) <a href="https://dogodki.kompot.si/events/c4ee8c26-c668-491e-91b3-b466578b83e2">https://dogodki.kompot.si/events/c4ee8c26-c668-491e-91b3-b466578b83e2</a> Mon Apr 6 1900 CET</li>
<li>Emacs Paris: S: Emacs workshop in Paris (online) <a href="https://emacs-doctor.com/">https://emacs-doctor.com/</a> Tue Apr 7 0830 America/Vancouver - 1030 America/Chicago - 1130 America/Toronto - 1530 Etc/GMT - 1730 Europe/Berlin - 2100 Asia/Kolkata - 2330 Asia/Singapore</li>
<li>OrgMeetup (virtual) <a href="https://orgmode.org/worg/orgmeetup.html">https://orgmode.org/worg/orgmeetup.html</a> Wed Apr 8 0900 America/Vancouver - 1100 America/Chicago - 1200 America/Toronto - 1600 Etc/GMT - 1800 Europe/Berlin - 2130 Asia/Kolkata &ndash; Thu Apr 9 0000 Asia/Singapore</li>
<li>Atelier Emacs Montpellier (in person) <a href="https://lebib.org/date/atelier-emacs">https://lebib.org/date/atelier-emacs</a> Fri Apr 10 1800 Europe/Paris</li>
<li>London Emacs (in person): Emacs London meetup <a href="https://www.meetup.com/london-emacs-hacking/events/313909207/">https://www.meetup.com/london-emacs-hacking/events/313909207/</a> Tue Apr 14 1800 Europe/London</li>
<li>Emacs Berlin: In-Person-Only Emacs-Berlin Stammtisch <a href="https://emacs-berlin.org/">https://emacs-berlin.org/</a> Tue Apr 14 1900 Europe/Berlin</li>
<li>M-x Research: TBA <a href="https://m-x-research.github.io/">https://m-x-research.github.io/</a> Wed Apr 15 0800 America/Vancouver - 1000 America/Chicago - 1100 America/Toronto - 1500 Etc/GMT - 1700 Europe/Berlin - 2030 Asia/Kolkata - 2300 Asia/Singapore</li>
<li><a href="https://protesilaos.com/codelog/2026-04-04-emacs-live-with-sacha-chua/">Protesilaos Stavrou: Emacs live stream with Sacha Chua on 2026-04-16 17:30 Europe/Athens</a></li>
</ul></li>
<li>Emacs configuration:
<ul class="org-ul">
<li><a href="http://yummymelon.com/devnull/announcing-anju.html">Announcing Anju</a> (<a href="https://www.reddit.com/r/emacs/comments/1s7un9y/announcing_anju/">Reddit</a>) - mouse interactions for modeline, context menu, and main menu</li>
<li><a href="https://emacsredux.com/blog/2026/04/04/repeat-mode/">Emacs Redux: Repeat Mode: Stop Repeating Yourself</a> (<a href="https://irreal.org/blog/?p=13722">Irreal</a>, <a href="https://irreal.org/blog/?p=13727">Irreal</a>)</li>
<li><a href="https://github.com/shackra/backpack">backpack 0.4.0 - adds self-documenting inventory browser</a> (<a href="https://www.reddit.com/r/emacs/comments/1sab5si/backpack_emacs_version_040/">Reddit</a>)</li>
</ul></li>
<li>Emacs Lisp:
<ul class="org-ul">
<li><a href="https://almightylisp.com/">Almighty Lisp: Lisp &amp; Emacs Essentials - almightylisp.com</a> (<a href="https://news.ycombinator.com/item?id=47612277">HN</a>)</li>
<li><a href="https://blog.davep.org/2026/04/03/nukneval-el-v1-3.html">Dave Pearson: nukneval.el v1.3</a> unload and re-evaluate</li>
<li><a href="https://www.youtube.com/watch?v=FUAXrMbY9nE">Creating an Emacs Package from Concept to MELPA (Part 7)</a> (57:13)</li>
<li><a href="https://www.reddit.com/r/emacs/comments/1sduilc/how_to_run_a_function_when_my_buffer_selection/">How to run a function when my buffer selection changes?</a> - updated with window-state-change-hook</li>
<li><a href="https://www.youtube.com/watch?v=9CV5pTIM7Vk">Yay Emacs live: Reorganizing my Emacs configuration so that my defuns are tangled to separate files</a> (01:48:56)</li>
<li><a href="https://sachachua.com/blog/2026/04/ye11-fix-find-function-for-emacs-lisp-from-org-babel-or-scratch/">Sacha Chua: YE11: Fix find-function for Emacs Lisp from org-babel or scratch</a> (<a href="https://www.youtube.com/watch?v=PKkV1Tbev_Y">YouTube</a>, 08:19)</li>
</ul></li>
<li>Appearance:
<ul class="org-ul">
<li><a href="https://codeberg.org/phmcc/outline-stars">New package: outline-stars.el</a> (<a href="https://www.reddit.com/r/emacs/comments/1sayd4i/new_package_outlinestarsel/">Reddit</a>)</li>
<li><a href="https://github.com/agzam/occult.el">occult.el - collapse buffer regions into single-line summaries</a> (<a href="https://www.reddit.com/r/emacs/comments/1s7xiti/tiny_package_may_come_handy/">Reddit</a>)</li>
<li><a href="https://www.reddit.com/r/emacs/comments/1s83i2i/make_the_left_margin_shine/">Make the left margin shine!</a></li>
<li><a href="https://github.com/Senka07/yotsuba-emacs-theme">Senka07/yotsuba-emacs-theme · GitHub</a> (<a href="https://www.reddit.com/r/emacs/comments/1s8joc7/i_made_a_theme_for_emacs_based_on_the_yotsuba/">Reddit</a>)</li>
</ul></li>
<li>Navigation:
<ul class="org-ul">
<li><a href="https://snac.lab8.cz/mattof/p/1775377168.159080">Tip about using other-window-prefix C-x 4 4</a></li>
<li><a href="https://fe.disroot.org/objects/c9be1ac9-8404-4114-8787-3cc4ba6957e6">Tip about using windmove</a></li>
</ul></li>
<li>Writing:
<ul class="org-ul">
<li><a href="https://curtismchale.ca/2026/03/31/check-spelling-in-emacs">Curtis McHale: Check Spelling in Emacs</a> (<a href="https://www.youtube.com/watch?v=LML6pnwLcKE">YouTube</a> 06:38)</li>
<li><a href="https://blog.davep.org/2026/04/05/blogmore-el-v3-1.html">Dave Pearson: blogmore.el v3.1</a></li>
</ul></li>
<li>Denote:
<ul class="org-ul">
<li><a href="https://protesilaos.com/codelog/2026-04-03-emacs-denote-sequence-new-alphanumeric-delimited-scheme/">Protesilaos Stavrou: Emacs: new sequence scheme for the ‘denote-sequence’ package</a></li>
</ul></li>
<li>Org Mode:
<ul class="org-ul">
<li><a href="https://www.youtube.com/watch?v=k2-9DS7jZyg">[EMACS LAB] #3: Introduction to Org Mode</a> (01:57:55)</li>
<li><a href="https://github.com/aravindps/org-gtd">aravindps/org-gtd: Things 3 style GTD for Emacs — org-mode agenda views, ⌘ keybindings, context tags. Works with Doom and vanilla Emacs. · GitHub</a> (<a href="https://www.reddit.com/r/emacs/comments/1s86q3t/nonemacs_person_accidentally_built_a_gtd_thing_in/">r/emacs</a>, <a href="https://www.reddit.com/r/orgmode/comments/1s8cuwd/work_blocked_gtd_apps_so_i_built_my_own_plaintext/">r/orgmode</a>)</li>
<li><a href="https://list.orgmode.org/orgmode/87pl4lul8r.fsf@localhost/">[BLOG] #27 bbb:OrgMeetup on Wed, February 11, 19:00 UTC+3 - Ihor Radchenko</a> (<a href="https://fosstodon.org/@yantar92/116320012163184817">@yantar92@fosstodon.org</a>) notes</li>
<li>Import, export, and integration:
<ul class="org-ul">
<li><a href="https://github.com/lopeztel/ox-dnd-html">lopeztel/ox-dnd-html: Emacs export org files to D&amp;D themed html · GitHub</a> (<a href="https://www.reddit.com/r/emacs/comments/1scdtlw/oxdndhtml/">Reddit</a>)</li>
<li><a href="https://chatziiola.github.io/posts/20251216_adding-org-protocol-support.html">Adding org-protocol support</a> (<a href="https://www.reddit.com/r/orgmode/comments/1s9g7xt/orgprotocol_capture_my_configuration/">Reddit</a>)</li>
<li><a href="https://sachachua.com/blog/2026/04/demo-extract-pdf-highlights-into-an-org-file-with-python/">Sacha Chua: Extract PDF highlights into an Org file with Python</a> (<a href="https://www.youtube.com/watch?v=OTnYV2IZL_U">YouTube</a> 04:27)</li>
<li><a href="https://jamesendreshowell.com/2026-04-04-my-first-advice-in-emacs-lisp.html">James Endres Howell: My first advice! (in Emacs Lisp)</a> - specifying HTML boilerplace for org-static-blog</li>
<li><a href="https://thibaut.dev/blog/org-publish-rss.html">RSS feeds for your org-mode website</a> (<a href="https://toot.io/@bgtdsword/116353992060134650">@bgtdsword@toot.io</a>)</li>
<li><a href="https://www.youtube.com/watch?v=oBkzkDutLCI">Org-mode - Various font sizes LaTeX</a> (04:14)</li>
</ul></li>
<li>Org development:
<ul class="org-ul">
<li><a href="https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/etc/ORG-NEWS?id=62cad0194b2ac91b3de85caab33e40bef9eeb2a4">ol: Allow targets as search option in id: links</a></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/etc/ORG-NEWS?id=8c24e4bb5378e71141fdcc4278bc005ced00f126">org-babel: Fix and extend `org-babel-update-intermediate' variable</a></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/etc/ORG-NEWS?id=972d5c2ba44fe8afd6cdcdee8952d244a1d4078b">Query before attempting to overwrite existing attachment/DnD/yank file</a></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/etc/ORG-NEWS?id=f57de9dac30231e731a3622f0897d9a945762ae0">Merge branch 'bugfix'</a></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/etc/ORG-NEWS?id=c1b4247115c198761cd9dbb7703833bc4de6378b">etc/ORG-NEWS: Remove announcement about bugfix</a></li>
</ul></li>
</ul></li>
<li>Completion:
<ul class="org-ul">
<li><a href="https://emacsredux.com/blog/2026/04/04/read-extended-command-predicate/">Emacs Redux: Declutter M-x with read-extended-command-predicate</a> (<a href="https://irreal.org/blog/?p=13724">Irreal</a>)</li>
<li><a href="https://github.com/gggion/let-completion.el">[RELEASE] let-completion v0.2.0: full overhaul of Elisp completion - 46 binding forms, function argument candidates, expandable registry, fully customizable two-column annotations</a> (<a href="https://www.reddit.com/r/emacs/comments/1s8pde5/release_letcompletion_v020_full_overhaul_of_elisp/">Reddit</a>)</li>
<li><a href="https://github.com/rougier/nano-vertico">rougier/nano-vertico: Emacs / nano + vertico · GitHub</a> (<a href="https://www.reddit.com/r/emacs/comments/1s9deym/nano_vertico_tui/">Reddit</a>)</li>
</ul></li>
<li>Coding:
<ul class="org-ul">
<li><a href="https://mwolson.org/blog/2026-04-02-eglot-python-preset-and-eglot-typescript-preset-now-on-melpa/">Mike Olson - eglot-python-preset and eglot-typescript-preset: Now on MELPA</a> (<a href="https://www.reddit.com/r/emacs/comments/1sb1f8b/multilsp_support_for_python_and_typescript_in/">Reddit</a>)</li>
<li><a href="https://www.reddit.com/r/emacs/comments/1sano0b/function_to_make_eglot_add_iwyu_headers_without/">Function to make eglot add IWYU headers without doing an autocomplete in the buffer</a></li>
<li><a href="https://blog.davep.org/2026/04/03/make-phony-el-v1-3.html">Dave Pearson: make-phony.el v1.3</a> for Makefiles</li>
<li><a href="https://github.com/Daskeladden/shipit">Daskeladden/shipit: Code review in Emacs · GitHub</a> (<a href="https://www.reddit.com/r/emacs/comments/1s8qmj2/shipit_code_review_without_leaving_emacs/">Reddit</a>)</li>
</ul></li>
<li>Shells:
<ul class="org-ul">
<li><a href="https://github.com/dakra/ghostel">Ghostel - terminal emulator powered by libghostty</a> (<a href="https://www.reddit.com/r/emacs/comments/1sc4n6k/ghostel_terminal_emulator_powered_by_libghostty/">Reddit</a>)</li>
</ul></li>
<li>Mail, news, and chat:
<ul class="org-ul">
<li><a href="https://thanosapollo.org/posts/emacs-jabber-revival/">Thanos Apollo: Bringing jabber.el Back From the Dead</a> (<a href="https://framapiaf.org/@debacle/116346678036311813">@debacle@framapiaf.org</a>)</li>
<li><a href="https://codeberg.org/martianh/mastodon.el">mastodon.el 2.0.14 - jump to quoting toot, bugfixes, annotations</a> (<a href="https://todon.nl/@mousebot/116323493425072693">@mousebot@todon.nl</a>)</li>
</ul></li>
<li>Multimedia:
<ul class="org-ul">
<li><a href="https://mathstodon.xyz/@tusharhero/116345234415202702">Using Android TTS in Emacs</a></li>
</ul></li>
<li>Fun:
<ul class="org-ul">
<li><a href="https://www.reddit.com/r/emacs/comments/1s8kox8/anybody_interested_in_writing_sdl_games_in_emacs/">Anybody interested in writing SDL games in Emacs Lisp?</a>
<ul class="org-ul">
<li><a href="https://www.reddit.com/r/emacs/comments/1sc2dfx/emacs_sdl_unblocking_the_unblockable/">Emacs + SDL: unblocking the unblockable</a> (<a href="https://lists.gnu.org/archive/html/emacs-devel/2026-04/msg00189.html">emacs-devel</a>)</li>
</ul></li>
<li><a href="https://blog.davep.org/2026/03/31/eg-el-v1-2.html">Dave Pearson: eg.el v1.2</a> Norton Guide?, <a href="https://blog.davep.org/2026/03/31/thinks-el-v1-13.html">thinks.el v1.13</a> thought bubbles, <a href="https://blog.davep.org/2026/04/01/binclock-el-v1-12.html">binclock.el v1.12</a> binary clock, <a href="https://blog.davep.org/2026/04/01/obfusurl-el-v2-2.html">obfusurl.el v2.2</a> obfuscating URLs</li>
</ul></li>
<li>AI:
<ul class="org-ul">
<li><a href="https://www.thetypicalset.com/blog/emacs-as-ceo-operating-system">I run my company from Emacs</a> (<a href="https://news.ycombinator.com/item?id=47626006">HN</a>)</li>
<li><a href="https://www.youtube.com/watch?v=SrRweChigB0">Crafting an AI-Driven Workflow System - System Crafters Live!</a> (01:52:03)</li>
<li><a href="https://www.youtube.com/watch?v=ePH3u7lmFWU">Will using Emacs give you an edge in the AI-era?</a> (45:08, <a href="https://www.reddit.com/r/emacs/comments/1s8atnd/will_using_emacs_give_you_an_edge_in_the_aiera_45/">Reddit</a>, <a href="https://www.reddit.com/r/emacs/comments/1s8m35w/will_using_emacs_give_you_an_edge_in_the_aiera/">Reddit</a>)</li>
<li><a href="https://noquiche.fyi/emacs-for-agents">The Agent-Native Editor Was Invented in 1976</a></li>
</ul></li>
<li>Community:
<ul class="org-ul">
<li><a href="https://www.youtube.com/watch?v=465GSalM6oI">Emacs ATX Meetup. April 2026. - YouTube</a> (2:04:58)</li>
<li><a href="https://sachachua.com/blog/2026/04/yayemacs-10-emacs-coaching-with-prot-packaging-emacs-lisp/">Sacha Chua: #YayEmacs 10: Emacs coaching with Prot: Emacs workflows and streaming</a> (<a href="https://www.youtube.com/watch?v=kvBS8wz8ZRw">YouTube</a> 01:06:30)
<ul class="org-ul">
<li><a href="https://sachachua.com/blog/2026/03/thinking-about-coaching-goals-with-prot/">Sacha Chua: Thinking about Emacs coaching goals with Prot</a></li>
<li><a href="https://protesilaos.com/codelog/2026-03-31-emacs-coaching-with-sacha-chua/">Protesilaos Stavrou: Emacs coaching with Sacha Chua</a></li>
</ul></li>
<li><a href="https://sdf.org/~pkal/blog/emacs/mistakes.html">Emacs Carnival March 2026: Mistakes and Misconceptions</a>
<ul class="org-ul">
<li><a href="https://lio.novelli.si/en/blog/mistakes-and-misconceptions.html">The Comfort Trap</a> (<a href="https://toot.si/@len/116323162366294557">@len@toot.si</a>)</li>
<li><a href="https://christiantietze.de/posts/2026/03/emacs-mistakes-and-misconceptions-that-held-me-back-in-2018/">Christian Tietze: Emacs Mistakes and Misconceptions That Held Me Back in 2019</a></li>
<li><a href="https://einar.codeberg.page/emacs-mistakes-and-misconceptions.html">Einar Mostad: Emacs mistakes and misconceptions</a></li>
</ul></li>
<li><a href="https://www.youtube.com/watch?v=XlESi31czFA">Prot Asks: Hjalmar about Emacs for music, the joy of art, and Internet sociability</a> (02:04:24)</li>
<li><a href="https://xenodium.com/and-then-there-were-three">Alvaro Ramirez: …and then there were three (expect delays)</a> (<a href="https://irreal.org/blog/?p=13719">Irreal</a>)</li>
<li><a href="https://www.youtube.com/watch?v=sV7C6Ezl35A">A Cult AI Computer’s Boom and Bust - YouTube</a> (<a href="https://irreal.org/blog/?p=13707">Irreal</a>)</li>
</ul></li>
<li>Other:
<ul class="org-ul">
<li><a href="https://doc.emacsen.de/">Emacs Docs</a> (<a href="https://www.reddit.com/r/emacs/comments/1sbb72w/initiative_restyling_the_official_emacs_manuals/">Reddit</a>, <a href="https://mastodon.social/@maxxcan/116336010699503942">@maxxcan@mastodon.social</a>)</li>
<li><a href="https://thanosapollo.org/posts/gnosis-8-to-10/">Thanos Apollo: Gnosis 0.10: Import Anki, Merge Everything Into One</a></li>
<li><a href="https://www.youtube.com/watch?v=tj6iMpf18DU">doom emacs install on manjaro linux walkthrough on hyper-v vm</a> (17:29)</li>
</ul></li>
<li>Emacs development:
<ul class="org-ul">
<li><a href="https://lists.gnu.org/archive/html/emacs-devel/2026-03/msg01121.html">On keybindings and the slow erosion of help's utility</a> - long discussion</li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=d604445954d0c390e7c6c1280bf48b6858881bef">New option vc-dir-auto-hide-up-to-date</a></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=859e0622ae5e8303d288a345d9ef9181fa0aa6ae">* lisp/vc/diff-mode.el (diff-mode-read-only-map): Bind 'v'.</a></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=ae1ac739b799608cca0ec9f0e78f2b852078bd57">* etc/NEWS: Announce Org update.</a></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=0a62e6c304d880b9fcb91c9ce091200cd2436a52">; Fix documentation of last change</a></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=6a15c02a59d6caf171c7cb9b85f48ec845853445">Recursively check dependencies for package compatibility</a></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=52205e38d3ea670f2685e345591eac43d7a9b613">Inform macOS Accessibility Zoom of cursor position (bug#80624)</a></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=faf1932875754c446361106cd8035c85fcc598f3">New macro setopt-local and function set-local (bug#80709)</a></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=cda65ffa58e1280fabfdf3eb7340f429b2aedd4d">Add xref-edit-mode (bug#80616)</a></li>
</ul></li>
<li>New packages:
<ul class="org-ul">
<li><a target="_blank" href="https://melpa.org/#/compilation-history">compilation-history</a>: Track compilation history in SQLite (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/corg">corg</a>: Header completion for org-mode (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/evim">evim</a>: Evil Visual Multi - Multiple cursors for evil-mode (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/ghostel">ghostel</a>: Terminal emulator powered by libghostty (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/meshmonitor-chat">meshmonitor-chat</a>: Chat client for MeshMonitor (Meshtastic) (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/occult">occult</a>: Collapse and reveal buffer regions (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/org-dt">org-dt</a>: Dynamic templating loader (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/org-grimoire">org-grimoire</a>: Emacs-native static site generator (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/org-invox">org-invox</a>: Invoice management for contractors using Org mode (MELPA)</li>
</ul></li>
</ul>

<p>
Links from <a href="https://www.reddit.com/r/emacs">reddit.com/r/emacs</a>, <a href="https://www.reddit.com/r/orgmode">r/orgmode</a>, <a href="https://www.reddit.com/r/spacemacs">r/spacemacs</a>, <a href="https://mastodon.social/tags/emacs">Mastodon #emacs</a>, <a href="https://bsky.app/hashtag/emacs">Bluesky #emacs</a>, <a href="https://hn.algolia.com/?query=emacs&amp;sort=byDate&amp;prefix&amp;page=0&amp;dateRange=all&amp;type=story">Hacker News</a>, <a href="https://lobste.rs/search?q=emacs&amp;what=stories&amp;order=newest">lobste.rs</a>, <a href="https://programming.dev/c/emacs?dataType=Post&amp;page=1&amp;sort=New">programming.dev</a>, <a href="https://lemmy.world/c/emacs">lemmy.world</a>, <a href="https://lemmy.ml/c/emacs?dataType=Post&amp;page=1&amp;sort=New">lemmy.ml</a>, <a href="https://planet.emacslife.com">planet.emacslife.com</a>, <a href="https://www.youtube.com/playlist?list=PL4th0AZixyREOtvxDpdxC9oMuX7Ar7Sdt">YouTube</a>, <a href="http://git.savannah.gnu.org/cgit/emacs.git/log/etc/NEWS">the Emacs NEWS file</a>, <a href="https://emacslife.com/calendar/">Emacs Calendar</a>, and <a href="https://lists.gnu.org/archive/html/emacs-devel/2026-04">emacs-devel</a>. Thanks to Andrés Ramírez for emacs-devel links. Do you have an Emacs-related link or announcement? Please e-mail me at <a href="mailto:sacha@sachachua.com">sacha@sachachua.com</a>. Thank you!
</p>
<div><a href="https://sachachua.com/blog/2026/04/2026-04-06-emacs-news/index.org">View Org source for this post</a></div><p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2026%2F04%2F2026-04-06-emacs-news%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></content>
		</entry>
</feed>