<?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 - category - emacs-chat-podcast</title>
	<subtitle>Emacs, sketches, and life</subtitle>
	<link rel="self" type="application/atom+xml" href="https://sachachua.com/blog/category/emacs-chat-podcast/feed/atom/index.xml" />
  <link rel="alternate" type="text/html" href="https://sachachua.com/blog/category/emacs-chat-podcast" />
  <id>https://sachachua.com/blog/category/emacs-chat-podcast/feed/atom/index.xml</id>
  <generator uri="https://11ty.dev">11ty</generator>
	<updated>2026-05-07T18:55:38Z</updated>
<entry>
		<title type="html">Emacs Chat 22: Shae Erisson</title>
		<link rel="alternate" type="text/html" href="https://sachachua.com/blog/2026/05/may-7-emacs-chat-with-shae-erisson/"/>
		<author><name><![CDATA[Sacha Chua]]></name></author>
		<updated>2026-05-08T19:06:24Z</updated>
    <published>2026-05-07T18:55:38Z</published>
    <category term="emacs" />
<category term="emacs-chat-podcast" />
<category term="emacs-chat" />
		<id>https://sachachua.com/blog/2026/05/may-7-emacs-chat-with-shae-erisson/</id>
		<content type="html"><![CDATA[<div class="update" id="orge514ee4">
<p>
<span class="timestamp-wrapper"><time class="timestamp" datetime="2026-05-08">[2026-05-08 Fri]</time></span>: Transcript, yay!
</p>

</div>

<p>
I chatted with Shae Erisson about Emacs, keyboards, Org Mode, and life.
<video controls="1" src="https://archive.org/download/ec22-shae-erisson/ec22-shae-erisson.mp4" type="video/mp4"><track kind="subtitles" label="Captions" src="https://sachachua.com/blog/2026/05/may-7-emacs-chat-with-shae-erisson/ec22-shae-erisson.vtt" srclang="en" default=""></video>
</p>

<p>
<a href="https://archive.org/details/ec22-shae-erisson">View it via the Internet Archive</a>, <a href="https://youtube.com/live/Ovya0O2otbU">watch/comment on YouTube</a>, <a href="https://sachachua.com/blog/feed/atom/index.xml#ID-ec22-transcript">read the transcript online</a>, <a href="https://archive.org/download/ec22-shae-erisson/ec22-shae-erisson.mp4">download the video</a> / <a href="https://archive.org/download/ec22-shae-erisson/ec22-shae-erisson.mp3">MP3</a> / <a href="https://sachachua.com/blog/2026/05/may-7-emacs-chat-with-shae-erisson/ec22-shae-erisson.vtt">transcript</a>, or <a href="mailto:sacha@sachachua.com">e-mail me</a> your thoughts!
</p>

<ul class="org-ul">
<li>Shae Erisson: Haskell, Python, Swedish, knitting, mountain unicycling, contact juggling</li>
<li><a href="http://www.scannedinavian.com">Shae Erisson's blog - 1. DO SOMETHING 2. BRAG ABOUT IT</a></li>
<li><a href="https://recurse.social/@shapr">Shae Erisson (@shapr@recurse.social) - recurse.social</a></li>
<li><a href="https://www.scannedinavian.com/programmers-want-flow-when-programming-light-turns-red.html">Shae Erisson's blog - Programmers want flow. when programming, light turns RED</a></li>
<li><a href="https://github.com/shapr/markovkeyboard">shapr/markovkeyboard: keyboard layout that changes by markov frequency · GitHub</a></li>
</ul>
<div id="outline-container-emacs-chat-22-shae-erisson-chapters" class="outline-3">
<h3 id="emacs-chat-22-shae-erisson-chapters">Chapters</h3>
<div class="outline-text-3" id="text-emacs-chat-22-shae-erisson-chapters">
<p>
</p><ul class="org-ul">
<li><span class="media-time" data-start="7.000">0:07</span> Intro</li>
<li><span class="media-time" data-start="61.000">1:01</span> 1999, IRC, community building in Haskell</li>
<li><span class="media-time" data-start="122.000">2:02</span> Emacs as a light-weight build-your-own-editor toolkit</li>
<li><span class="media-time" data-start="175.000">2:55</span> LSP, treesitter, Magit, jujutsu, C++, Python, Haskell, rust</li>
<li><span class="media-time" data-start="218.000">3:38</span> how does a new person experience Emacs? Emacs is always fun.</li>
<li><span class="media-time" data-start="247.000">4:07</span> Markov keyboard project, moving to Finland, right-handed Dvorak, split keyboard; Jeff Raskin; I am not a koala</li>
<li><span class="media-time" data-start="405.000">6:45</span> Purpose-specific function keys</li>
<li><span class="media-time" data-start="454.000">7:34</span> Trackballs, scroll</li>

<li><span class="media-time" data-start="497.000">8:17</span> 1" trackpad rings</li>
<li><span class="media-time" data-start="538.000">8:58</span> Pair programming: ttyshare, shwim</li>
<li><span class="media-time" data-start="800.000">13:20</span> Recurse Center, "What is that keyboard? What is that editor?!", Emacs bankruptcy and starter kits</li>
<li><span class="media-time" data-start="969.000">16:09</span> hippie-expand</li>
<li><span class="media-time" data-start="1038.000">17:18</span> yasnippet</li>
<li><span class="media-time" data-start="1141.000">19:01</span> Function keys</li>
<li><span class="media-time" data-start="1205.000">20:05</span> Org Mode</li>

<li><span class="media-time" data-start="1277.000">21:17</span> Show Org agenda when idle</li>

<li><span class="media-time" data-start="1323.000">22:03</span> Programmers want flow. When programming, light turns red</li>

<li><span class="media-time" data-start="1467.000">24:27</span> ef-themes and modus-themes, season</li>
<li><span class="media-time" data-start="1558.000">25:58</span> htmlize (does this still work on Wayland?)</li>
<li><span class="media-time" data-start="1600.000">26:40</span> lsp-ui-imenu, jumping through rust code</li>

<li><span class="media-time" data-start="1710.000">28:30</span> laptop with 126GB of RAM</li>
<li><span class="media-time" data-start="1788.000">29:48</span> LSP coolness, Haskell, treesitter</li>
<li><span class="media-time" data-start="1922.000">32:02</span> Combobulate</li>
<li><span class="media-time" data-start="1972.000">32:52</span> What else are you using your 126 gigabytes of RAM for?</li>
<li><span class="media-time" data-start="2007.000">33:27</span> TalonVoice</li>
<li><span class="media-time" data-start="2086.000">34:46</span> NixOS, following Steve Purcell about 5 years behind</li>
<li><span class="media-time" data-start="2106.000">35:06</span> envrc</li>
<li><span class="media-time" data-start="2154.000">35:54</span> time-tracking</li>
<li><span class="media-time" data-start="2225.000">37:05</span> taxes with Org Mode, remote lookup</li>

<li><span class="media-time" data-start="2462.000">41:02</span> finding notes with C-s</li>
<li><span class="media-time" data-start="2558.000">42:38</span> Org Mode, managing inbox</li>
<li><span class="media-time" data-start="2790.000">46:30</span> Timestamps</li>
<li><span class="media-time" data-start="2954.000">49:14</span> Org timers</li>

<li><span class="media-time" data-start="3236.000">53:56</span> Org Mode snippets</li>
<li><span class="media-time" data-start="3436.000">57:16</span> Compilation finish function: handle success</li>
</ul>

<p></p>
</div>
</div>
<div id="outline-container-org56d9065" class="outline-3">
<h3 id="org56d9065">Transcript</h3>
<div class="outline-text-3" id="text-org56d9065">
<details class="code-details"><a name="ID-ec22-transcript"></a><div>
                  <summary>Transcript</summary>
<p>
</p><div class="full-transcript"><p></p><div class="transcript-heading"><span class="audio-time" data-start="0.000000">0:00</span> <strong>Intro</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="0.000000" data-stop="7.759000"><strong class="speaker-name">Sacha:</strong> Okay, so I'm going to actually remember to hit go live.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="7.760000" data-stop="17.479000">I've got a 10 second delay, so if we need to panic, we can panic.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="17.480000" data-stop="20.199000">Okay, so let's see.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="20.200000" data-stop="22.159000">I think we are live.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="22.160000" data-stop="24.199000">Hi, everyone.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="24.200000" data-stop="28.359000">This is Emacs Chat number 22 after a long hiatus.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="28.360000" data-stop="33.679000">And today, I'm here with Shae Erisson, who is also like</span> <span class="audio-time caption" data-speaker="Sacha" data-start="33.680000" data-stop="35.359000">an Emacs friend from a long time back.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="35.360000" data-stop="36.439000">So this is it.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="36.440000" data-stop="40.999000">As you were just saying, this is the first time we're actually</span> <span class="audio-time caption" data-speaker="Sacha" data-start="41.000000" data-stop="42.919000">talking live.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="42.920000" data-stop="46.479000">And I'm looking forward to hearing about your configuration, how you</span> <span class="audio-time caption" data-speaker="Sacha" data-start="46.480000" data-stop="47.919000">use Emacs, Shae.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="47.920000" data-stop="50.999000">But before we dive into that, can you give us a little bit of context?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="51.000000" data-stop="54.108000">Who you are, what sorts of things you do,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="54.109000" data-stop="57.199000">and how you use Emacs for that?</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="57.000000">0:57</span> <strong>1999, IRC, community building in Haskell</strong></div><p></p><span class="audio-time caption" data-speaker="Shae" data-start="57.200000" data-stop="61.159000"><strong class="speaker-name">Shae:</strong> I would say that...</span> <span class="audio-time caption" data-speaker="Shae" data-start="61.160000" data-stop="69.679000">I guess I started using Emacs in 1999 when I moved to Finland.</span> <span class="audio-time caption" data-speaker="Shae" data-start="69.680000" data-stop="74.399000">And I remember about the same time I was on IRC and I was really</span> <span class="audio-time caption" data-speaker="Shae" data-start="74.400000" data-stop="74.879000">frustrated.</span> <span class="audio-time caption" data-speaker="Shae" data-start="74.880000" data-stop="77.159000">I remember I got on the Perl IRC channel and I was like, hey, I want</span> <span class="audio-time caption" data-speaker="Shae" data-start="77.160000" data-stop="79.039000">an editor that has syntax highlighting.</span> <span class="audio-time caption" data-speaker="Shae" data-start="79.040000" data-stop="81.359000">I want to see colors to these words when I'm typing them.</span> <span class="audio-time caption" data-speaker="Shae" data-start="81.360000" data-stop="83.879000">And they were like, noob, and they kick-banned me.</span> <span class="audio-time caption" data-speaker="Shae" data-start="83.880000" data-stop="88.279000">And I was like, well, maybe I don't want to learn Perl, which I never</span> <span class="audio-time caption" data-speaker="Shae" data-start="88.280000" data-stop="88.399000">did.</span> <span class="audio-time caption" data-speaker="Shae" data-start="88.400000" data-stop="91.519000">And I guess that was an early introduction into I wanted to be part</span> <span class="audio-time caption" data-speaker="Shae" data-start="91.520000" data-stop="96.239000">of communities where people were sharing positive things and building</span> <span class="audio-time caption" data-speaker="Shae" data-start="96.240000" data-stop="97.679000">up each other.</span> <span class="audio-time caption" data-speaker="Shae" data-start="97.680000" data-stop="101.119000">Actually, I ended up starting the Haskell IRC channel a couple of</span> <span class="audio-time caption" data-speaker="Shae" data-start="101.120000" data-stop="104.239000">years later, and that became a very big thing.</span> <span class="audio-time caption" data-speaker="Shae" data-start="104.240000" data-stop="107.919000">I would say that I'm mostly known for my work in community building</span> <span class="audio-time caption" data-speaker="Shae" data-start="107.920000" data-stop="111.519000">in the Haskell programming language community, because I did that</span> <span class="audio-time caption" data-speaker="Shae" data-start="111.520000" data-stop="116.399000">for, I don't know, 15 or 20 years.</span> <span class="audio-time caption" data-speaker="Shae" data-start="116.400000" data-stop="118.959000">But I really like Emacs.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="118.000000">1:58</span> <strong>Emacs as a light-weight build-your-own-editor toolkit</strong></div><p></p><span class="audio-time caption" data-speaker="Shae" data-start="118.960000" data-stop="122.959000"><strong class="speaker-name">Shae:</strong> So like last week at the same time I had the standing chat with a</span> <span class="audio-time caption" data-speaker="Shae" data-start="122.960000" data-stop="127.199000">friend of mine who is also a programmer and he said oh so you're</span> <span class="audio-time caption" data-speaker="Shae" data-start="127.200000" data-stop="129.079000">going to do this thing in a week do you want to give me like a</span> <span class="audio-time caption" data-speaker="Shae" data-start="129.080000" data-stop="132.959000">preview of the talk and I was like yeah I guess so and some of the</span> <span class="audio-time caption" data-speaker="Shae" data-start="132.960000" data-stop="135.479000">things that were really interesting was he was like I've never really</span> <span class="audio-time caption" data-speaker="Shae" data-start="135.480000" data-stop="139.319000">tried Emacs I don't know much about it I kind of have this impression</span> <span class="audio-time caption" data-speaker="Shae" data-start="139.320000" data-stop="145.439000">that it is a very lightweight build your own editor toolkit and I</span> <span class="audio-time caption" data-speaker="Shae" data-start="145.440000" data-stop="151.239000">I was kind of taken aback because, you know, I guess I still have</span> <span class="audio-time caption" data-speaker="Shae" data-start="151.240000" data-stop="153.359000">this long ago and far away.</span> <span class="audio-time caption" data-speaker="Shae" data-start="153.360000" data-stop="156.159000">I don't know if you remember 8 Megs and Constantly Swapping is what</span> <span class="audio-time caption" data-speaker="Shae" data-start="156.160000" data-stop="159.439000">people used to call Emacs and things like that.</span> <span class="audio-time caption" data-speaker="Shae" data-start="159.440000" data-stop="163.399000">And I was, it was just kind of, I realized I'm still in my little</span> <span class="audio-time caption" data-speaker="Shae" data-start="163.400000" data-stop="164.039000">echo chamber.</span> <span class="audio-time caption" data-speaker="Shae" data-start="164.040000" data-stop="166.919000">And this is why I like to talk to other people all the time is</span> <span class="audio-time caption" data-speaker="Shae" data-start="166.920000" data-stop="171.479000">because I want to have some exposure to what other people are doing.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="171.000000">2:51</span> <strong>LSP, treesitter, Magit, jujutsu, C++, Python, Haskell, rust</strong></div><p></p><span class="audio-time caption" data-speaker="Shae" data-start="171.480000" data-stop="175.679000"><strong class="speaker-name">Shae:</strong> I guess things about Emacs that really changed stuff for me is</span> <span class="audio-time caption" data-speaker="Shae" data-start="175.680000" data-stop="180.919000">language server protocol, TreeSitter.</span> <span class="audio-time caption" data-speaker="Shae" data-start="180.920000" data-stop="183.999000">Those, I think, are two very powerful tools that are much more</span> <span class="audio-time caption" data-speaker="Shae" data-start="184.000000" data-stop="187.799000">generic than, I mean, Magit, of course, is like magic.</span> <span class="audio-time caption" data-speaker="Shae" data-start="187.800000" data-stop="191.119000">Although I've mostly switched to jujitsu lately instead for the last</span> <span class="audio-time caption" data-speaker="Shae" data-start="191.120000" data-stop="192.319000">year.</span> <span class="audio-time caption" data-speaker="Shae" data-start="192.320000" data-stop="197.799000">Let's see, I had, I guess, let's see, I did C++, I did Python, I did</span> <span class="audio-time caption" data-speaker="Shae" data-start="197.800000" data-stop="201.319000">a whole lot of Python.</span> <span class="audio-time caption" data-speaker="Shae" data-start="201.320000" data-stop="205.719000">And then I had Haskell jobs for five or six years.</span> <span class="audio-time caption" data-speaker="Shae" data-start="205.720000" data-stop="208.959000">And then I switched to Rust about a year and a half ago.</span> <span class="audio-time caption" data-speaker="Shae" data-start="208.960000" data-stop="211.079000">I now have a Rust job.</span> <span class="audio-time caption" data-speaker="Shae" data-start="211.080000" data-stop="214.759000">And one of the things that Prot had asked, I think, or you had asked,</span> <span class="audio-time caption" data-speaker="Shae" data-start="214.760000" data-stop="215.779000">and I forget exactly how this went.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="215.000000">3:35</span> <strong>how does a new person experience Emacs? Emacs is always fun.</strong></div><p></p><span class="audio-time caption" data-speaker="Shae" data-start="215.780000" data-stop="218.319000"><strong class="speaker-name">Shae:</strong> It was great fun watching your livestream.</span> <span class="audio-time caption" data-speaker="Shae" data-start="218.320000" data-stop="220.319000">And it was, how does a new person</span> <span class="audio-time caption" data-speaker="Shae" data-start="220.320000" data-stop="224.839000">kind of get comfortable with using Emacs for a particular purpose.</span> <span class="audio-time caption" data-speaker="Shae" data-start="224.840000" data-stop="229.559000">And I look for things, in fact, like how do I use Emacs for Rust,</span> <span class="audio-time caption" data-speaker="Shae" data-start="229.560000" data-stop="230.199000">Rust development?</span> <span class="audio-time caption" data-speaker="Shae" data-start="230.200000" data-stop="233.999000">And I found a couple of good guides on, and I was able to follow most</span> <span class="audio-time caption" data-speaker="Shae" data-start="234.000000" data-stop="236.679000">of them, although my Yesnitit stuff is broken and I don't exactly</span> <span class="audio-time caption" data-speaker="Shae" data-start="236.680000" data-stop="238.439000">know why tab doesn't work, right?</span> <span class="audio-time caption" data-speaker="Shae" data-start="238.440000" data-stop="242.679000">But, you know, like there's always, Emacs is always fun, right?</span> <span class="audio-time caption" data-speaker="Shae" data-start="242.680000" data-stop="243.799000">There's so many cool things you could do with it.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="243.000000">4:03</span> <strong>Markov keyboard project, moving to Finland, right-handed Dvorak, split keyboard; Jeff Raskin; I am not a koala</strong></div><p></p><span class="audio-time caption" data-speaker="Shae" data-start="243.800000" data-stop="247.199000"><strong class="speaker-name">Shae:</strong> I noticed, I actually hadn't seen your preview page and I noticed</span> <span class="audio-time caption" data-speaker="Shae" data-start="247.200000" data-stop="251.619000">that you found my Markov keyboard.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="251.620000" data-stop="254.679000"><strong class="speaker-name">Sacha:</strong> When you say Emacs is fun, I'm reminded of all of your fun,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="254.680000" data-stop="258.439000">crazy keyboard experiments.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="258.440000" data-stop="260.639000">It's like, what?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="260.640000" data-stop="265.499000">I have a feeling you like to tinker with things.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="265.500000" data-stop="271.599000"><strong class="speaker-name">Shae:</strong> Yeah, so I think actually the influences as to how I got to</span> <span class="audio-time caption" data-speaker="Shae" data-start="271.600000" data-stop="275.099000">where I am are pretty interesting.</span> <span class="audio-time caption" data-speaker="Shae" data-start="275.100000" data-stop="280.479000">So the person that I ended up moving to Finland to for dating her, we</span> <span class="audio-time caption" data-speaker="Shae" data-start="280.480000" data-stop="285.839000">started a company, we did projects, and I was the programmer. We had</span> <span class="audio-time caption" data-speaker="Shae" data-start="285.840000" data-stop="289.359000">this pretty big project. I guess it was like 350,000 euros.</span> <span class="audio-time caption" data-speaker="Shae" data-start="289.360000" data-stop="292.000000">And I mean, that was going to be over four years</span> <span class="audio-time caption" data-speaker="Shae" data-start="292.001000" data-stop="293.033000">and we had to kind of complete the whole thing,</span> <span class="audio-time caption" data-speaker="Shae" data-start="293.034000" data-stop="297.239000">and I was the programmer and we'd had the lowest bid...</span> <span class="audio-time caption" data-speaker="Shae" data-start="297.240000" data-stop="300.879000">I had an IBM model M, you know, the super clicky with like all the...</span> <span class="audio-time caption" data-speaker="Shae" data-start="300.880000" data-stop="305.319000">And about three years into it, my arm started really hurting a lot.</span> <span class="audio-time caption" data-speaker="Shae" data-start="305.320000" data-stop="307.719000">But I was the only programmer.</span> <span class="audio-time caption" data-speaker="Shae" data-start="307.720000" data-stop="308.959000">And nobody else knew all the code.</span> <span class="audio-time caption" data-speaker="Shae" data-start="308.960000" data-stop="310.519000">And we had to ship it, because that's how we got paid.</span> <span class="audio-time caption" data-speaker="Shae" data-start="310.520000" data-stop="312.399000">And so I ended up pushing through.</span> <span class="audio-time caption" data-speaker="Shae" data-start="312.400000" data-stop="316.119000">And at the end of it, my arm just didn't work anymore.</span> <span class="audio-time caption" data-speaker="Shae" data-start="316.120000" data-stop="321.479000">So for about a year and three months, what I did was I actually</span> <span class="audio-time caption" data-speaker="Shae" data-start="321.480000" data-stop="323.159000">taught myself to type right hand.</span> <span class="audio-time caption" data-speaker="Shae" data-start="323.160000" data-stop="325.367000">...Dvorak, because I was already using two-hand Dvorak,</span> <span class="audio-time caption" data-speaker="Shae" data-start="325.368000" data-stop="327.933000">and so I kept programming, but I just...</span> <span class="audio-time caption" data-speaker="Shae" data-start="327.934000" data-stop="330.500000">One of the things was... like, I like programming,</span> <span class="audio-time caption" data-speaker="Shae" data-start="330.501000" data-stop="332.900000">I like using computers, I don't want to wear out my arms again,</span> <span class="audio-time caption" data-speaker="Shae" data-start="332.901000" data-stop="333.933000">I don't want to blow them out,</span> <span class="audio-time caption" data-speaker="Shae" data-start="333.934000" data-stop="337.000000">so I ended up switching to split keyboards,</span> <span class="audio-time caption" data-speaker="Shae" data-start="337.001000" data-stop="338.533000">and I will show you.</span> <span class="audio-time caption" data-speaker="Shae" data-start="338.534000" data-stop="342.033000">This is very much the kind of thing that I like to use,</span> <span class="audio-time caption" data-speaker="Shae" data-start="342.034000" data-stop="344.467000">and that is like this.</span> <p></p><a href="https://sachachua.com/blog/2026/05/may-7-emacs-chat-with-shae-erisson/mpv-shot0060.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/may-7-emacs-chat-with-shae-erisson/mpv-shot0060.jpg" alt="image from video 00:05:44.800" data-time="00:05:44.800"></a><span class="audio-time caption" data-speaker="Shae" data-start="344.780000" data-stop="347.133000"><strong class="speaker-name">Shae:</strong> This is an Ergodox Infinity,</span> <span class="audio-time caption" data-speaker="Shae" data-start="347.134000" data-stop="349.367000">but there's a lot of other keyboard flavors like this.</span> <span class="audio-time caption" data-speaker="Shae" data-start="349.368000" data-stop="352.867000">And one of the things that I particularly like about this...</span> <span class="audio-time caption" data-speaker="Shae" data-start="352.868000" data-stop="354.900000">So around the same time I met Jeff Raskin,</span> <span class="audio-time caption" data-speaker="Shae" data-start="354.901000" data-stop="375.239000">who wrote the Inhumane Interface.</span> <span class="audio-time caption" data-speaker="Shae" data-start="375.240000" data-stop="380.679000">And so for this particular thing, this is like Control and Alt and</span> <span class="audio-time caption" data-speaker="Shae" data-start="363.500000" data-stop="363.500000">Hyper and Super and Shift.</span> <span class="audio-time caption" data-speaker="Shae" data-start="363.501000" data-stop="369.433000">And this means that under one thumb, I have a lot more modifier keys</span> <span class="audio-time caption" data-speaker="Shae" data-start="369.434000" data-stop="371.933000">than you get off of a standard.</span> <span class="audio-time caption" data-speaker="Shae" data-start="371.934000" data-stop="372.700000">And it also means...</span> <span class="audio-time caption" data-speaker="Shae" data-start="372.701000" data-stop="374.733000">A lot of my problems started with Emacs pinky,</span> <span class="audio-time caption" data-speaker="Shae" data-start="374.734000" data-stop="378.519000">the dreaded, the infamous...</span> <span class="audio-time caption" data-speaker="Shae" data-start="378.520000" data-stop="382.567000">I think that one of my... I made a keyboard layout</span> <span class="audio-time caption" data-speaker="Shae" data-start="382.568000" data-stop="384.867000">called "I am not koala." You may not know this,</span> <span class="audio-time caption" data-speaker="Shae" data-start="384.868000" data-stop="387.033000">but koalas have two thumbs. They have one on each side.</span> <span class="audio-time caption" data-speaker="Shae" data-start="387.034000" data-stop="389.600000">And that's cool, but I don't have two thumbs,</span> <span class="audio-time caption" data-speaker="Shae" data-start="389.601000" data-stop="392.367000">and I realized that when I was trying to grab something,</span> <span class="audio-time caption" data-speaker="Shae" data-start="392.368000" data-stop="394.067000">I didn't put my pinky on it. That would be silly, right?</span> <span class="audio-time caption" data-speaker="Shae" data-start="394.068000" data-stop="395.719000">I want to put my thumb around it.</span> <span class="audio-time caption" data-speaker="Shae" data-start="395.720000" data-stop="396.993000">And so I decided I would move</span> <span class="audio-time caption" data-speaker="Shae" data-start="396.994000" data-stop="400.299000">all of my chording keys under my thumbs.</span> <span class="audio-time caption" data-speaker="Shae" data-start="400.300000" data-stop="403.367000">And that's kind of how I...</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="403.000000">6:43</span> <strong>Purpose-specific function keys</strong></div><p></p><span class="audio-time caption" data-speaker="Shae" data-start="403.368000" data-stop="405.159000"><strong class="speaker-name">Shae:</strong> And another thing I did was when I was</span> <span class="audio-time caption" data-speaker="Shae" data-start="405.160000" data-stop="407.479000">really only able to use one hand,</span> <span class="audio-time caption" data-speaker="Shae" data-start="407.480000" data-stop="411.719000">was I made my function keys mostly purpose-specific.</span> <span class="audio-time caption" data-speaker="Shae" data-start="411.720000" data-stop="414.519000">And that was from Jeff Raskin's writings in The Humane Interface.</span> <span class="audio-time caption" data-speaker="Shae" data-start="414.520000" data-stop="421.559000">So I guess I'm a programmer who really likes writing code, doesn't</span> <span class="audio-time caption" data-speaker="Shae" data-start="421.560000" data-stop="426.199000">want to wear out my arms, and likes to do fun keyboard things, yeah.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="426.200000" data-stop="428.340000"><strong class="speaker-name">Sacha:</strong> Definitely. You're in it for the long term.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="428.341000" data-stop="434.367000">You don't want to use up all of your arm capacity now</span> <span class="audio-time caption" data-speaker="Sacha" data-start="434.368000" data-stop="436.719000">and not be able to keep programming in the future.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="436.720000" data-stop="439.079000">And now there's hardware to make that easier.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="439.080000" data-stop="440.039000">So I'm glad.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="440.040000" data-stop="444.559000">Split keyboards with extra thumb keys seem to be very popular in</span> <span class="audio-time caption" data-speaker="Sacha" data-start="444.560000" data-stop="445.599000">the Emacs community.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="445.600000" data-stop="450.919000">I'm now tempted to find space in my desk in order to make that happen.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="450.000000">7:30</span> <strong>Trackballs, scroll
</strong></div><p></p><a href="https://sachachua.com/blog/feed/atom/ec22-shae-erisson-00-07-37-067.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/feed/atom/ec22-shae-erisson-00-07-37-067.jpg" alt="image from video 00:07:37.067" data-time="00:07:37.067"></a><span class="audio-time caption" data-speaker="Shae" data-start="450.920000" data-stop="454.039000"><strong class="speaker-name">Shae:</strong> Another thing I ended up switching to was I started using</span> <span class="audio-time caption" data-speaker="Shae" data-start="454.040000" data-stop="455.239000">trackballs.</span> <span class="audio-time caption" data-speaker="Shae" data-start="455.240000" data-stop="455.799000">Oh yeah, yeah.</span> <span class="audio-time caption" data-speaker="Shae" data-start="455.800000" data-stop="461.479000">I tend to go completely overboard when trying out new things, so I</span> <span class="audio-time caption" data-speaker="Shae" data-start="461.480000" data-stop="466.439000">bought 20 different models of trackballs and ended up settling on</span> <span class="audio-time caption" data-speaker="Shae" data-start="466.440000" data-stop="467.599000">this one.</span> <span class="audio-time caption" data-speaker="Shae" data-start="467.600000" data-stop="475.799000">The nice thing about this one is that this is how you scroll, and it</span> <span class="audio-time caption" data-speaker="Shae" data-start="475.800000" data-stop="475.379000">has four buttons.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="475.380000" data-stop="479.767000"><strong class="speaker-name">Sacha:</strong> That is really cool. I like using ThinkPads,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="479.768000" data-stop="481.679000">so I've been just living off the tiny little</span> <span class="audio-time caption" data-speaker="Sacha" data-start="481.680000" data-stop="483.319000">mouse in the middle of the keyboard.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="483.320000" data-stop="486.959000">But back in the day, I also used a trackball.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="486.960000" data-stop="490.199000">If I can get to the point where I want to take my hands off the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="490.200000" data-stop="492.479000">keyboard again in order to do mouse things, that would probably be</span> <span class="audio-time caption" data-speaker="Sacha" data-start="492.480000" data-stop="494.159000">the direction I would go.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="494.000000">8:14</span> <strong>1" trackpad rings</strong></div><p></p><span class="audio-time caption" data-speaker="Shae" data-start="494.160000" data-stop="497.119000"><strong class="speaker-name">Shae:</strong> I had an experiment in that area, which is where I purchased</span> <span class="audio-time caption" data-speaker="Shae" data-start="497.120000" data-stop="500.239000">a one-inch touchpad, and I strapped it to my finger.</span> <span class="audio-time caption" data-speaker="Shae" data-start="500.240000" data-stop="504.759000">And it was a PS2, and it had a USB converter plugged into it.</span> <span class="audio-time caption" data-speaker="Shae" data-start="504.760000" data-stop="508.719000">And the idea was I could keep typing, and then I could move the mouse</span> <span class="audio-time caption" data-speaker="Shae" data-start="508.720000" data-stop="511.839000">around without taking my hands off the keyboard.</span> <span class="audio-time caption" data-speaker="Shae" data-start="511.840000" data-stop="514.719000">And now they actually have touchpad rings.</span> <span class="audio-time caption" data-speaker="Shae" data-start="514.720000" data-stop="518.039000">They came out six months or a year ago.</span> <span class="audio-time caption" data-speaker="Shae" data-start="518.040000" data-stop="519.839000">It's relatively recent.</span> <span class="audio-time caption" data-speaker="Shae" data-start="519.840000" data-stop="522.019000">But the idea is no change in context.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="522.020000" data-stop="523.933000"><strong class="speaker-name">Sacha:</strong> I've only seen the scroll rings,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="523.934000" data-stop="526.199000">but now there's a touchpad version.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="526.200000" data-stop="527.479000">That is interesting.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="527.480000" data-stop="530.639000"><strong class="speaker-name">Shae:</strong> Yeah, I think that's pretty cool stuff.</span> <span class="audio-time caption" data-speaker="Shae" data-start="530.640000" data-stop="534.139000">Hardware is actually improving things.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="534.000000">8:54</span> <strong>Pair programming: ttyshare, shwim</strong></div><p></p><span class="audio-time caption" data-speaker="Shae" data-start="534.140000" data-stop="538.559000"><strong class="speaker-name">Shae:</strong> Oh, another thing, one of the things you talked about with Prot was</span> <span class="audio-time caption" data-speaker="Shae" data-start="538.560000" data-stop="540.559000">how do you learn other people's stuff?</span> <span class="audio-time caption" data-speaker="Shae" data-start="540.560000" data-stop="545.119000">And one of the things that I use for pairing, so I have one coworker,</span> <span class="audio-time caption" data-speaker="Shae" data-start="545.120000" data-stop="546.799000">and it's a strange, interesting job.</span> <span class="audio-time caption" data-speaker="Shae" data-start="546.800000" data-stop="549.919000">I like it a lot.</span> <span class="audio-time caption" data-speaker="Shae" data-start="549.920000" data-stop="555.679000">And I met this coworker at a previous job, and one of the things,</span> <span class="audio-time caption" data-speaker="Shae" data-start="555.680000" data-stop="558.479000">let's see if I can find it.</span> <span class="audio-time caption" data-speaker="Shae" data-start="558.480000" data-stop="560.406000">So we used to, at the previous job,</span> <span class="audio-time caption" data-speaker="Shae" data-start="560.407000" data-stop="562.439000">we used this thing called ttyshare.</span> <span class="audio-time caption" data-speaker="Shae" data-start="562.440000" data-stop="563.079000">Have you heard of it?</span> <span class="audio-time caption" data-speaker="Shae" data-start="563.080000" data-stop="565.959000">ttyshare.</span> <span class="audio-time caption" data-speaker="Shae" data-start="565.960000" data-stop="566.879000">It's great.</span> <span class="audio-time caption" data-speaker="Shae" data-start="566.880000" data-stop="569.599000">You can run it in a terminal and then you can effectively share your</span> <span class="audio-time caption" data-speaker="Shae" data-start="569.600000" data-stop="571.399000">terminal with someone else.</span> <span class="audio-time caption" data-speaker="Shae" data-start="571.400000" data-stop="574.879000">And so you have multiplayer terminals and that's neat.</span> <span class="audio-time caption" data-speaker="Shae" data-start="574.880000" data-stop="577.639000">It was kind of a pain to set up.</span> <span class="audio-time caption" data-speaker="Shae" data-start="577.640000" data-stop="579.116000">You had to make sure that you weren't NATed,</span> <span class="audio-time caption" data-speaker="Shae" data-start="579.117000" data-stop="580.675000">you know, like you had to have effectively...</span> <span class="audio-time caption" data-speaker="Shae" data-start="580.676000" data-stop="581.759000">someone had to have a public IP.</span> <span class="audio-time caption" data-speaker="Shae" data-start="581.760000" data-stop="582.839000">You had to do a couple of other things.</span> <span class="audio-time caption" data-speaker="Shae" data-start="582.840000" data-stop="587.639000">And as part of my job, I'm now, I guess, part maintainer for Magic</span> <span class="audio-time caption" data-speaker="Shae" data-start="587.640000" data-stop="588.839000">Wormhole, the software.</span> <p></p><a href="https://sachachua.com/blog/2026/05/may-7-emacs-chat-with-shae-erisson/mpv-shot0059.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/may-7-emacs-chat-with-shae-erisson/mpv-shot0059.jpg" alt="image from video 00:09:58.467" data-time="00:09:58.467"></a><span class="audio-time caption" data-speaker="Shae" data-start="588.840000" data-stop="596.159000"><strong class="speaker-name">Shae:</strong> And so one of the things that my coworker wrote was this nifty thing</span> <span class="audio-time caption" data-speaker="Shae" data-start="596.160000" data-stop="598.439000">called ShWiM.</span> <span class="audio-time caption" data-speaker="Shae" data-start="598.440000" data-stop="599.719000">And it's basically "shell with me."</span> <span class="audio-time caption" data-speaker="Shae" data-start="599.720000" data-stop="604.199000">And it's a wrapper around TTY share so that with one single command,</span> <span class="audio-time caption" data-speaker="Shae" data-start="604.200000" data-stop="606.239000">you can share a terminal.</span> <span class="audio-time caption" data-speaker="Shae" data-start="606.240000" data-stop="609.559000">And the way that we use this is...</span> <span class="audio-time caption" data-speaker="Shae" data-start="609.560000" data-stop="617.359000">We both run Emacs as a server, and then we use emacsclient in the</span> <span class="audio-time caption" data-speaker="Shae" data-start="617.360000" data-stop="618.639000">terminal to connect.</span> <p></p><a href="https://sachachua.com/blog/2026/05/may-7-emacs-chat-with-shae-erisson/mpv-shot0058.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/may-7-emacs-chat-with-shae-erisson/mpv-shot0058.jpg" alt="image from video 00:10:41.967" data-time="00:10:41.967"></a><span class="audio-time caption" data-speaker="Shae" data-start="618.640000" data-stop="621.919000"><strong class="speaker-name">Shae:</strong> I don't know if you've ever done this, but I can have a terminal</span> <span class="audio-time caption" data-speaker="Shae" data-start="621.920000" data-stop="628.119000">right next to this, and if I run emacsclient in a window, then I'm</span> <span class="audio-time caption" data-speaker="Shae" data-start="628.120000" data-stop="629.399000">sharing the same thing.</span> <span class="audio-time caption" data-speaker="Shae" data-start="629.400000" data-stop="634.800000">This is a graphical chat with Sacha,</span> <span class="audio-time caption" data-speaker="Shae" data-start="634.801000" data-stop="642.699000">in the terminal or in the UI, and both of them are updated.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="642.680000" data-stop="644.200000"><strong class="speaker-name">Sacha:</strong> That's fantastic.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="644.200000" data-stop="647.360000">I remember people were using tmate for something similar before</span> <span class="audio-time caption" data-speaker="Sacha" data-start="647.360000" data-stop="648.920000">where you could share that.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="648.920000" data-stop="653.320000">But yeah, it's just making it seamless, making it frictionless.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="653.320000" data-stop="656.800000">And on the other side, I have also just been</span> <span class="audio-time caption" data-speaker="Sacha" data-start="656.800000" data-stop="659.600000">using wormhole to send large files</span> <span class="audio-time caption" data-speaker="Sacha" data-start="659.600000" data-stop="664.240000">back and forth between Karthik and John Wiegley because we have this</span> <span class="audio-time caption" data-speaker="Sacha" data-start="664.240000" data-stop="667.360000">other Emacs chat thing where we're going to post it eventually,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="667.360000" data-stop="668.760000">once I finish figuring out how to</span> <span class="audio-time caption" data-speaker="Sacha" data-start="668.760000" data-stop="671.440000">redact all the personal information and Org files.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="671.440000" data-stop="674.600000">But yeah, it's great for being able to send things without having to</span> <span class="audio-time caption" data-speaker="Sacha" data-start="674.600000" data-stop="677.120000">worry about, oh, you know, what's my public IP?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="677.120000" data-stop="680.960000">Can I tunnel all the different things to get past whatever firewalls</span> <span class="audio-time caption" data-speaker="Sacha" data-start="680.960000" data-stop="681.800000">there are?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="681.800000" data-stop="686.200000">So if this also works for terminal things plus Emacs client, that</span> <span class="audio-time caption" data-speaker="Sacha" data-start="686.200000" data-stop="691.640000">sounds really, really exciting.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="691.640000" data-stop="692.000000"><strong class="speaker-name">Shae:</strong> We've tried some other experiments.</span> <span class="audio-time caption" data-speaker="Shae" data-start="692.040000" data-stop="696.919000">One of the things we tried to do was, and the only downside is like,</span> <span class="audio-time caption" data-speaker="Shae" data-start="696.920000" data-stop="699.839000">what if my terminal has a different size, then you have to kind of</span> <span class="audio-time caption" data-speaker="Shae" data-start="699.840000" data-stop="701.559000">shrink and match.</span> <span class="audio-time caption" data-speaker="Shae" data-start="701.560000" data-stop="705.599000">And so we tried to honestly directly bridge to Emacs clients.</span> <span class="audio-time caption" data-speaker="Shae" data-start="705.600000" data-stop="709.039000">And because I don't know if you're aware that there's effectively a</span> <span class="audio-time caption" data-speaker="Shae" data-start="709.040000" data-stop="712.479000">local socket for the Emacs client that you can have multiple things</span> <span class="audio-time caption" data-speaker="Shae" data-start="712.480000" data-stop="713.039000">connect to.</span> <span class="audio-time caption" data-speaker="Shae" data-start="713.040000" data-stop="716.799000">But it turns out there's some sort of like system so I couldn't like</span> <span class="audio-time caption" data-speaker="Shae" data-start="716.800000" data-stop="721.119000">reach across the network and directly use my co-workers Emacs session</span> <span class="audio-time caption" data-speaker="Shae" data-start="721.120000" data-stop="722.279000">and he couldn't use mine.</span> <span class="audio-time caption" data-speaker="Shae" data-start="722.280000" data-stop="725.559000">Weird things happened when we tried to do this cross host.</span> <span class="audio-time caption" data-speaker="Shae" data-start="725.560000" data-stop="729.499000">As far as I can tell the Emacs client only works in the same host.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="729.500000" data-stop="730.679000"><strong class="speaker-name">Sacha:</strong> That's interesting.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="730.680000" data-stop="735.199000">Lately, I've also been experimenting with CRDT, which has that</span> <span class="audio-time caption" data-speaker="Sacha" data-start="735.200000" data-stop="736.439000">Emacs-less plant as well.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="736.440000" data-stop="737.719000">So that's been nice.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="737.720000" data-stop="742.559000">But yeah, of course, a lot of people will be kind of stuck with the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="742.560000" data-stop="749.979000">first challenge of finding someone that they can pair in Emacs with.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="749.980000" data-stop="751.039000"><strong class="speaker-name">Shae:</strong> I understand.</span> <span class="audio-time caption" data-speaker="Shae" data-start="751.040000" data-stop="755.359000">And I think I'm honestly very happy that my one single coworker at</span> <span class="audio-time caption" data-speaker="Shae" data-start="755.360000" data-stop="757.679000">this job is also a big Emacs user.</span> <span class="audio-time caption" data-speaker="Shae" data-start="757.680000" data-stop="761.359000">And so we exchanged cool ideas and worked on stuff.</span> <span class="audio-time caption" data-speaker="Shae" data-start="761.360000" data-stop="764.579000">And I'm very happy about that.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="764.580000" data-stop="768.399000"><strong class="speaker-name">Sacha:</strong> Were they already an Emacs person before they joined?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="768.400000" data-stop="773.539000">Or did you pick the coworker because they were an Emacs person?</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="773.540000" data-stop="774.333000"><strong class="speaker-name">Shae:</strong> They picked me.</span> <span class="audio-time caption" data-speaker="Shae" data-start="774.334000" data-stop="778.199000">They were pretty much the person who started this thing.</span> <span class="audio-time caption" data-speaker="Shae" data-start="778.200000" data-stop="782.199000">And they picked me because they'd worked with me at the previous job.</span> <span class="audio-time caption" data-speaker="Shae" data-start="782.200000" data-stop="784.639000">Although I did have an experience like that.</span> <span class="audio-time caption" data-speaker="Shae" data-start="784.640000" data-stop="789.199000">I had this massive Emacs config file, like 20,000 lines, and half of</span> <span class="audio-time caption" data-speaker="Shae" data-start="789.200000" data-stop="793.039000">it was comments because it had accrued over 20 years.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="793.000000">13:13</span> <strong>Recurse Center, "What is that keyboard? What is that editor?!", Emacs bankruptcy and starter kits</strong></div><p></p><span class="audio-time caption" data-speaker="Shae" data-start="793.040000" data-stop="800.479000"><strong class="speaker-name">Shae:</strong> And in 2019, when I first went to the Recurse Center, well, my first</span> <span class="audio-time caption" data-speaker="Shae" data-start="800.480000" data-stop="802.879000">batch, I just was extremely extroverted and social.</span> <span class="audio-time caption" data-speaker="Shae" data-start="802.880000" data-stop="805.639000">But my second immediate following batch, which is not the common</span> <span class="audio-time caption" data-speaker="Shae" data-start="805.640000" data-stop="808.399000">pattern, I was like, okay, my goal is to write a bunch of Haskell,</span> <span class="audio-time caption" data-speaker="Shae" data-start="808.400000" data-stop="809.959000">get some Haskell jobs,</span> <span class="audio-time caption" data-speaker="Shae" data-start="809.960000" data-stop="813.159000">And so I went to the quiet room on the quiet floor.</span> <span class="audio-time caption" data-speaker="Shae" data-start="813.160000" data-stop="816.639000">But then someone else came in, Marianne, my favorite programming</span> <span class="audio-time caption" data-speaker="Shae" data-start="816.640000" data-stop="817.159000">friend.</span> <span class="audio-time caption" data-speaker="Shae" data-start="817.160000" data-stop="819.559000">And she was like, what is that keyboard you're using?</span> <span class="audio-time caption" data-speaker="Shae" data-start="819.560000" data-stop="822.199000">And I was like, ah, this is an Ergodox thing.</span> <span class="audio-time caption" data-speaker="Shae" data-start="822.200000" data-stop="824.159000">And then she's like, what is this editor you're using?</span> <span class="audio-time caption" data-speaker="Shae" data-start="824.160000" data-stop="825.879000">And I was like, oh, that's Emacs.</span> <span class="audio-time caption" data-speaker="Shae" data-start="825.880000" data-stop="828.919000">And I was kind of a grumpy, like, I'm trying to get stuff done.</span> <span class="audio-time caption" data-speaker="Shae" data-start="828.920000" data-stop="830.159000">But she was persistent.</span> <span class="audio-time caption" data-speaker="Shae" data-start="830.160000" data-stop="832.879000">She was like, show me this thing.</span> <span class="audio-time caption" data-speaker="Shae" data-start="832.880000" data-stop="834.919000">And so I was like, I'll show you Emacs.</span> <span class="audio-time caption" data-speaker="Shae" data-start="834.920000" data-stop="836.439000">And she was like, this is great.</span> <span class="audio-time caption" data-speaker="Shae" data-start="836.440000" data-stop="837.799000">And I was like.</span> <span class="audio-time caption" data-speaker="Shae" data-start="837.800000" data-stop="838.399000">This thing?</span> <span class="audio-time caption" data-speaker="Shae" data-start="838.400000" data-stop="840.959000">OK, cool.</span> <span class="audio-time caption" data-speaker="Shae" data-start="840.960000" data-stop="844.159000">And I was like, I don't think you want my config.</span> <span class="audio-time caption" data-speaker="Shae" data-start="844.160000" data-stop="845.919000">You'll probably want a starter kit.</span> <span class="audio-time caption" data-speaker="Shae" data-start="845.920000" data-stop="848.239000">And she was like, well, what are starter kits?</span> <span class="audio-time caption" data-speaker="Shae" data-start="848.240000" data-stop="850.159000">And I was like, well, I've heard about Spacemacs.</span> <span class="audio-time caption" data-speaker="Shae" data-start="850.160000" data-stop="851.119000">I've heard about Doom.</span> <span class="audio-time caption" data-speaker="Shae" data-start="851.120000" data-stop="852.679000">And I would try one of those.</span> <span class="audio-time caption" data-speaker="Shae" data-start="852.680000" data-stop="854.119000">So she tried Spacemacs.</span> <span class="audio-time caption" data-speaker="Shae" data-start="854.120000" data-stop="857.159000">And I guess this next part happened over several months.</span> <span class="audio-time caption" data-speaker="Shae" data-start="857.160000" data-stop="858.199000">She tried Spacemacs.</span> <span class="audio-time caption" data-speaker="Shae" data-start="858.200000" data-stop="860.199000">And then she was like, I like it, but it's slow.</span> <span class="audio-time caption" data-speaker="Shae" data-start="860.200000" data-stop="861.399000">So I'm switching to Doom Emacs.</span> <span class="audio-time caption" data-speaker="Shae" data-start="861.400000" data-stop="862.279000">And I would pair with her.</span> <span class="audio-time caption" data-speaker="Shae" data-start="862.280000" data-stop="866.479000">And I was like, wow, look at all these cool things that the starter</span> <span class="audio-time caption" data-speaker="Shae" data-start="866.480000" data-stop="867.519000">kits can do.</span> <span class="audio-time caption" data-speaker="Shae" data-start="867.520000" data-stop="873.119000">I ended up flushing my entire 20-year-old config and kind of starting</span> <span class="audio-time caption" data-speaker="Shae" data-start="873.120000" data-stop="876.519000">over and stealing a lot of great ideas from the starter kits.</span> <span class="audio-time caption" data-speaker="Shae" data-start="876.520000" data-stop="883.839000">And Marianne is very ambitious, independent, hardworking, very</span> <span class="audio-time caption" data-speaker="Shae" data-start="883.840000" data-stop="884.279000">focused.</span> <span class="audio-time caption" data-speaker="Shae" data-start="884.280000" data-stop="885.239000">I'm not very focused.</span> <span class="audio-time caption" data-speaker="Shae" data-start="885.240000" data-stop="889.039000">But I've learned a lot of things from her and watching her kind of...</span> <span class="audio-time caption" data-speaker="Shae" data-start="889.040000" data-stop="894.159000">I haven't done C in Emacs in a long time so it's great fun to watch</span> <span class="audio-time caption" data-speaker="Shae" data-start="894.160000" data-stop="898.079000">her learn these new things and then I learned stuff too and yeah it's</span> <span class="audio-time caption" data-speaker="Shae" data-start="898.080000" data-stop="902.319000">good to have collaborative people to work with.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="902.320000" data-stop="905.039000"><strong class="speaker-name">Sacha:</strong> So it sounds like if people would like to encourage more</span> <span class="audio-time caption" data-speaker="Sacha" data-start="905.040000" data-stop="908.199000">people to talk to them about Emacs, feel free to use your strange</span> <span class="audio-time caption" data-speaker="Sacha" data-start="908.200000" data-stop="911.079000">keyboards out in public.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="911.080000" data-stop="911.839000"><strong class="speaker-name">Shae:</strong> I like that.</span> <span class="audio-time caption" data-speaker="Shae" data-start="911.840000" data-stop="914.039000">That's good.</span> <span class="audio-time caption" data-speaker="Shae" data-start="914.040000" data-stop="915.719000">That is good.</span> <span class="audio-time caption" data-speaker="Shae" data-start="915.720000" data-stop="918.759000">Yeah I think that's reasonable.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="918.760000" data-stop="921.719000"><strong class="speaker-name">Sacha:</strong> Yeah, and I've just recently started digging into the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="921.720000" data-stop="924.519000">starter kits too, because I realized I don't know much about them.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="924.520000" data-stop="927.999000">It is really interesting going through them and discovering all these</span> <span class="audio-time caption" data-speaker="Sacha" data-start="928.000000" data-stop="932.679000">Emacs 31 options that you can enable to simplify your config or</span> <span class="audio-time caption" data-speaker="Sacha" data-start="932.680000" data-stop="934.759000">improve your workflow and all that stuff.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="934.760000" data-stop="937.639000">So there's a lot of good stuff in starter kits, even for people who</span> <span class="audio-time caption" data-speaker="Sacha" data-start="937.640000" data-stop="939.939000">are not newcomers.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="939.940000" data-stop="940.879000"><strong class="speaker-name">Shae:</strong> I agree.</span> <span class="audio-time caption" data-speaker="Shae" data-start="940.880000" data-stop="946.319000">And I think there's nothing wrong with just learning a bunch of new</span> <span class="audio-time caption" data-speaker="Shae" data-start="946.320000" data-stop="949.639000">things, trying them out, and also throwing them away if you don't</span> <span class="audio-time caption" data-speaker="Shae" data-start="949.640000" data-stop="950.199000">like them.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="950.200000" data-stop="954.679000"><strong class="speaker-name">Sacha:</strong> Now that you've declared Emacs bankruptcy and rebuilt your</span> <span class="audio-time caption" data-speaker="Sacha" data-start="954.680000" data-stop="958.999000">Emacs on top of other people's starter kits, what has made it into</span> <span class="audio-time caption" data-speaker="Sacha" data-start="959.000000" data-stop="959.999000">your config?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="960.000000" data-stop="963.519000">What have you kept from those 20 years of tinkering with Emacs that</span> <span class="audio-time caption" data-speaker="Sacha" data-start="963.520000" data-stop="965.999000">you really wanted to stick around?</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="966.000000">16:06</span> <strong>hippie-expand</strong></div><p></p><span class="audio-time caption" data-speaker="Shae" data-start="966.000000" data-stop="969.359000"><strong class="speaker-name">Shae:</strong> I think the only thing that has absolutely stuck around is my</span> <span class="audio-time caption" data-speaker="Shae" data-start="969.360000" data-stop="972.519000">use of hippie-expand, which is, I believe, a very old...</span> <span class="audio-time caption" data-speaker="Shae" data-start="972.520000" data-stop="976.159000">an ancient tool from a different time.</span> <span class="audio-time caption" data-speaker="Shae" data-start="976.160000" data-stop="980.519000">Most of the other stuff is kind of gone.</span> <span class="audio-time caption" data-speaker="Shae" data-start="980.520000" data-stop="981.759000">Gone to the wayside.</span> <span class="audio-time caption" data-speaker="Shae" data-start="981.760000" data-stop="985.519000">But I really like, I honestly really like hippie-expand.</span> <span class="audio-time caption" data-speaker="Shae" data-start="985.520000" data-stop="989.159000">And I know that like, I have rarely heard of other people who use</span> <span class="audio-time caption" data-speaker="Shae" data-start="989.160000" data-stop="990.159000">hippie-expand.</span> <span class="audio-time caption" data-speaker="Shae" data-start="990.160000" data-stop="991.039000">But you use it?</span> <span class="audio-time caption" data-speaker="Shae" data-start="991.040000" data-stop="995.679000">I think you just muted yourself.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="995.680000" data-stop="997.959000"><strong class="speaker-name">Sacha:</strong> I also vote for hippie-expand.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="997.960000" data-stop="1002.519000">It's a nice way to try different functions and just say, I just want</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1002.520000" data-stop="1006.659000">all these different possible completions to go in there.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="1006.660000" data-stop="1007.239000"><strong class="speaker-name">Shae:</strong> Yeah.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1007.240000" data-stop="1013.439000">The thing for me that really sold me on hippie-expand is that most of</span> <span class="audio-time caption" data-speaker="Shae" data-start="1013.440000" data-stop="1014.919000">the time when I am...</span> <span class="audio-time caption" data-speaker="Shae" data-start="1014.920000" data-stop="1018.159000">When I'm doing something, I want to say, like, I can already see that</span> <span class="audio-time caption" data-speaker="Shae" data-start="1018.160000" data-stop="1019.759000">word, just pick that one.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1019.760000" data-stop="1022.919000">And so I'll type the first characters and hit, like, meta forward</span> <span class="audio-time caption" data-speaker="Shae" data-start="1022.920000" data-stop="1024.919000">slash, and ta-da, it's usually there.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1024.920000" data-stop="1027.879000">But then sometimes I do really want, like, some Elisp or some other</span> <span class="audio-time caption" data-speaker="Shae" data-start="1027.880000" data-stop="1028.279000">stuff.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1028.280000" data-stop="1034.319000">And so I actually spent a lot of time tuning this the first time.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1034.000000">17:14</span> <strong>yasnippet</strong></div><p></p><span class="audio-time caption" data-speaker="Shae" data-start="1034.320000" data-stop="1038.999000"><strong class="speaker-name">Shae:</strong> I actually only changed it for the first time recently because I was</span> <span class="audio-time caption" data-speaker="Shae" data-start="1039.000000" data-stop="1044.599000">reading a how to write Rust well inside Emacs and they said oh well</span> <span class="audio-time caption" data-speaker="Shae" data-start="1044.600000" data-stop="1049.719000">you want to use yasnippet and so I you know the funny thing is that</span> <span class="audio-time caption" data-speaker="Shae" data-start="1049.720000" data-stop="1053.759000">yasnippet I believe is the thing that got me into Emacs like in 1999</span> <span class="audio-time caption" data-speaker="Shae" data-start="1053.760000" data-stop="1059.079000">I met this Finnish person Erno Kuusela in Oulu, Finland.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1059.080000" data-stop="1060.199000">Really cool guy.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1060.200000" data-stop="1062.959000">I was like, wow, how do you do this?</span> <span class="audio-time caption" data-speaker="Shae" data-start="1062.960000" data-stop="1067.839000">As soon as you open a file, it's got a substructure and a skeleton.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1067.840000" data-stop="1069.849000">And when you type part of a function or something,</span> <span class="audio-time caption" data-speaker="Shae" data-start="1069.850000" data-stop="1071.467000">it just populates it.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1071.468000" data-stop="1073.759000">And he was like, I'm using this snippet command in Emacs.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1073.760000" data-stop="1075.559000">That's why I was like, what's Emacs?</span> <span class="audio-time caption" data-speaker="Shae" data-start="1075.560000" data-stop="1077.879000">It was very exciting.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1077.880000" data-stop="1081.199000">And at the time, I was using Vim.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1081.200000" data-stop="1088.539000">And Vim was not as, I don't want to say, automatable.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1088.540000" data-stop="1092.959000"><strong class="speaker-name">Sacha:</strong> Yeah, now with Neovim and Lua, people are writing more</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1092.960000" data-stop="1094.039000">extensions for it.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1094.040000" data-stop="1099.619000">But before, you had to know a lot of magic in order to customize Vim.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="1099.620000" data-stop="1100.639000"><strong class="speaker-name">Shae:</strong> Right, right.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1100.640000" data-stop="1101.279000">I agree.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1101.280000" data-stop="1103.839000">Let's see, what else do I do?</span> <span class="audio-time caption" data-speaker="Shae" data-start="1103.840000" data-stop="1108.559000">I run my own email server, and I, of course, read my email in Emacs.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1108.560000" data-stop="1110.159000">In GNU, no less.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1110.160000" data-stop="1119.119000">Which is, I know, an NNTP reader, but it's still also a great...</span> <span class="audio-time caption" data-speaker="Shae" data-start="1119.120000" data-stop="1123.199000">I used to use twiddle compile and I think that stopped working like</span> <span class="audio-time caption" data-speaker="Shae" data-start="1123.200000" data-stop="1130.999000">six years ago, so I need to get rid of this comment, but there's</span> <span class="audio-time caption" data-speaker="Shae" data-start="1131.000000" data-stop="1132.839000">still a lot of kind of cruft from earlier times.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1132.000000">18:52</span> <strong>Function keys</strong></div><p></p><span class="audio-time caption" data-speaker="Shae" data-start="1132.840000" data-stop="1141.199000"><strong class="speaker-name">Shae:</strong> Remember how I said that I use function keys to have like purpose</span> <span class="audio-time caption" data-speaker="Shae" data-start="1141.200000" data-stop="1143.039000">specific stuff?</span> <span class="audio-time caption" data-speaker="Shae" data-start="1143.040000" data-stop="1150.879000">This was especially true because, I mean, I had my left arm strapped</span> <span class="audio-time caption" data-speaker="Shae" data-start="1150.880000" data-stop="1158.559000">to my chest for like a year and three months before I even started</span> <span class="audio-time caption" data-speaker="Shae" data-start="1158.560000" data-stop="1164.959000">regaining any flexibility, and that meant that...</span> <span class="audio-time caption" data-speaker="Shae" data-start="1164.960000" data-stop="1171.279000">I'm amazed that you could just map them directly to single commands</span> <span class="audio-time caption" data-speaker="Shae" data-start="1171.280000" data-stop="1174.999000">instead of giving in to the temptation to make them prefixes for</span> <span class="audio-time caption" data-speaker="Shae" data-start="1175.000000" data-stop="1176.319000">longer keystrokes.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1176.320000" data-stop="1181.079000">I didn't really have the choice because I had only one arm that</span> <span class="audio-time caption" data-speaker="Shae" data-start="1181.080000" data-stop="1185.200000">worked. It was just a lot harder to do any chording at the time.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1185.201000" data-stop="1188.267000">I still have a lot of these.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1188.268000" data-stop="1192.133000">F3 I use a lot, which is like, oh, what am I working on right now?</span> <span class="audio-time caption" data-speaker="Shae" data-start="1192.134000" data-stop="1195.300000">That is org-clock-goto.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1195.301000" data-stop="1198.133000">A lot of times, I want to have a terminal</span> <span class="audio-time caption" data-speaker="Shae" data-start="1198.134000" data-stop="1202.140000">that's in Emacs, so that's vterm,</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1202.000000">20:02</span> <strong>Org Mode
</strong></div><p></p><a href="https://sachachua.com/blog/feed/atom/ec22-shae-erisson-00-20-17-133.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/feed/atom/ec22-shae-erisson-00-20-17-133.jpg" alt="image from video 00:20:17.133" data-time="00:20:17.133"></a><span class="audio-time caption" data-speaker="Shae" data-start="1202.141000" data-stop="1205.159000"><strong class="speaker-name">Shae:</strong> And I actually really do use the calendar all the time. This is like</span> <span class="audio-time caption" data-speaker="Shae" data-start="1205.160000" data-stop="1211.119000">just switch to whatever it is. Of course, my email is here. You know</span> <span class="audio-time caption" data-speaker="Shae" data-start="1211.120000" data-stop="1217.119000">what, let's see... So this... I don't know, have you seen this</span> <span class="audio-time caption" data-speaker="Shae" data-start="1217.120000" data-stop="1223.939000">before? Have you seen this thing called STARTED in an Org mode file?</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1223.940000" data-stop="1227.339000"><strong class="speaker-name">Sacha:</strong> I use a STARTED state, yes.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="1227.340000" data-stop="1232.579000"><strong class="speaker-name">Shae:</strong> Well, I got it from you!</span> <span class="audio-time caption" data-speaker="Shae" data-start="1232.580000" data-stop="1235.067000">So if I look at like, my Org Mode configuration,</span> <span class="audio-time caption" data-speaker="Shae" data-start="1235.068000" data-stop="1238.333000">a lot of this STARTED stuff I have from you,</span> <span class="audio-time caption" data-speaker="Shae" data-start="1238.334000" data-stop="1239.467000">I don't know when,</span> <span class="audio-time caption" data-speaker="Shae" data-start="1239.468000" data-stop="1241.839000">but you were the person who introduced me to it.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1241.840000" data-stop="1246.367000"><strong class="speaker-name">Sacha:</strong> It's the reminder that I did start working on this.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1246.368000" data-stop="1249.933000">I tend to get distracted by intermediate tasks, so it's nice to be</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1249.934000" data-stop="1253.067000">able to say, try to finish these ones first before you move on to the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1253.068000" data-stop="1254.700000">next thing, maybe?</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="1254.680000" data-stop="1257.967000"><strong class="speaker-name">Shae:</strong> I agree. I have the same thing, yeah.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1257.968000" data-stop="1261.233000">And I keep meaning, because this is...</span> <span class="audio-time caption" data-speaker="Shae" data-start="1261.234000" data-stop="1264.300000">I know that you can put Org Mode configuration into the first</span> <span class="audio-time caption" data-speaker="Shae" data-start="1264.301000" data-stop="1267.267000">TODO item. I would really like to move it into the elisp</span> <span class="audio-time caption" data-speaker="Shae" data-start="1267.268000" data-stop="1269.133000">and I just haven't gotten around to it.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1269.134000" data-stop="1270.600000">And it's been 10 years. I mean,</span> <span class="audio-time caption" data-speaker="Shae" data-start="1270.601000" data-stop="1274.499000">maybe I should just do it.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1274.000000">21:14</span> <strong>Show Org agenda when idle
</strong></div><p></p><a href="https://sachachua.com/blog/feed/atom/ec22-shae-erisson-00-21-23-933.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/feed/atom/ec22-shae-erisson-00-21-23-933.jpg" alt="image from video 00:21:23.933" data-time="00:21:23.933"></a><span class="audio-time caption" data-speaker="Shae" data-start="1274.500000" data-stop="1277.800000"><strong class="speaker-name">Shae:</strong> One of the things I did that I found fun...</span> <span class="audio-time caption" data-speaker="Shae" data-start="1277.801000" data-stop="1280.767000">I really have written almost zero Elisp,</span> <span class="audio-time caption" data-speaker="Shae" data-start="1280.760000" data-stop="1286.280000">but I did actually puzzle my way through this a year ago.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1286.280000" data-stop="1291.320000">Since so much of my life is in Org Mode, I learned how to make timers.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1291.320000" data-stop="1295.320000">This is very close to what you get directly out of how to do timers</span> <span class="audio-time caption" data-speaker="Shae" data-start="1295.320000" data-stop="1296.560000">in Emacs.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1296.560000" data-stop="1303.400000">After some amount of time, I want my Org agenda to pop up because I</span> <span class="audio-time caption" data-speaker="Shae" data-start="1303.400000" data-stop="1305.600000">want to say like, oh, what is the stuff I'm supposed to be doing?</span> <span class="audio-time caption" data-speaker="Shae" data-start="1305.600000" data-stop="1306.720000">And what am I forgetting?</span> <span class="audio-time caption" data-speaker="Shae" data-start="1306.720000" data-stop="1307.800000">What has been scheduled?</span> <span class="audio-time caption" data-speaker="Shae" data-start="1307.800000" data-stop="1308.760000">And what is on my to-do list?</span> <span class="audio-time caption" data-speaker="Shae" data-start="1308.760000" data-stop="1310.120000">And I also like to look at</span> <span class="audio-time caption" data-speaker="Shae" data-start="1310.120000" data-stop="1312.680000">what is the stuff I've been working on lately?</span> <span class="audio-time caption" data-speaker="Shae" data-start="1312.680000" data-stop="1318.040000">And I really like that a lot.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1318.000000">21:58</span> <strong>Programmers want flow. When programming, light turns red
</strong></div><p></p><a href="https://sachachua.com/blog/feed/atom/ec22-shae-erisson-00-22-16-067.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/feed/atom/ec22-shae-erisson-00-22-16-067.jpg" alt="image from video 00:22:16.067" data-time="00:22:16.067"></a><span class="audio-time caption" data-speaker="Shae" data-start="1318.120000" data-stop="1323.760000"><strong class="speaker-name">Shae:</strong> Another thing that I realized is that I had a blog post</span> <span class="audio-time caption" data-speaker="Shae" data-start="1323.760000" data-stop="1325.960000">that was wildly popular.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1325.960000" data-stop="1327.120000">Where did I put it?</span> <span class="audio-time caption" data-speaker="Shae" data-start="1327.120000" data-stop="1328.720000">And it was all about Emacs.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1328.720000" data-stop="1332.720000">I don't know if you saw the... Here we go.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1332.720000" data-stop="1335.200000">It was... Ah, here it is.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1335.200000" data-stop="1338.567000">So here it is in... This is very much an Emacs...</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1338.568000" data-stop="1340.400000"><strong class="speaker-name">Sacha:</strong> Oh, yeah, I remember that one.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1340.920000" data-stop="1341.960000">I put it in Emacs News.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1341.960000" data-stop="1343.520000">I thought it was great.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="1343.520000" data-stop="1344.800000"><strong class="speaker-name">Shae:</strong> All right, cool.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1344.800000" data-stop="1348.221000"><strong class="speaker-name">Sacha:</strong> I would like the kiddo to sometimes be able to acknowledge this,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1348.222000" data-stop="1349.840000">but this is not happening.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1349.840000" data-stop="1351.979000">Still, yes.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="1351.980000" data-stop="1352.840000"><strong class="speaker-name">Shae:</strong> Right, right.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1352.868000" data-stop="1355.839000">Yeah, and so this was really fun because, like...</span> <span class="audio-time caption" data-speaker="Shae" data-start="1355.840000" data-stop="1361.639000">I had a friend who was in development and there was like millions of</span> <span class="audio-time caption" data-speaker="Shae" data-start="1361.640000" data-stop="1364.719000">dollars spent on how do you detect whether a programmer is in flow</span> <span class="audio-time caption" data-speaker="Shae" data-start="1364.720000" data-stop="1369.159000">and it came down to if they're typing they're probably in flow so and</span> <span class="audio-time caption" data-speaker="Shae" data-start="1369.160000" data-stop="1373.679000">that was it because they tried to look at EGs and doing all kinds of</span> <span class="audio-time caption" data-speaker="Shae" data-start="1373.680000" data-stop="1377.599000">other stuff but it was like if they're typing don't interrupt them.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1377.600000" data-stop="1379.900000">And I don't know, because I do so much in Emacs, I'm not sure how</span> <span class="audio-time caption" data-speaker="Shae" data-start="1379.901000" data-stop="1381.433000">accurate this was. But basically,</span> <span class="audio-time caption" data-speaker="Shae" data-start="1381.434000" data-stop="1383.000000">that's where I learned to do timers the first time.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1383.001000" data-stop="1385.133000">Or maybe... I don't remember which one I did first.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1385.134000" data-stop="1390.767000">And the idea then was as soon as basically my average typing into</span> <span class="audio-time caption" data-speaker="Shae" data-start="1390.768000" data-stop="1392.900000">Emacs has gone up a certain amount,</span> <span class="audio-time caption" data-speaker="Shae" data-start="1392.901000" data-stop="1394.833000">then it will actually switch to busy.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1394.834000" data-stop="1401.179000">And it works just fine. It was a lot of fun to write.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1401.180000" data-stop="1405.679000"><strong class="speaker-name">Sacha:</strong> So yeah, interesting use of getting the activity.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1405.680000" data-stop="1408.519000">I've seen other fun implementations of this.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1408.520000" data-stop="1412.279000">I think there's a c-c-c-combo package that makes some fun</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1412.280000" data-stop="1415.479000">animation appear if you're typing really quickly.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="1415.480000" data-stop="1417.279000"><strong class="speaker-name">Shae:</strong> Oh, oh, yeah.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1417.280000" data-stop="1421.239000">I'm guessing because I think Atom, the Atom editor had that for a</span> <span class="audio-time caption" data-speaker="Shae" data-start="1421.240000" data-stop="1421.759000">while.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1421.760000" data-stop="1424.859000">I guess that's where it came from.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1424.860000" data-stop="1428.133000"><strong class="speaker-name">Sacha:</strong> So yeah, because you can instrument Emacs and play around</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1428.134000" data-stop="1430.767000">with it, you can certainly do all sorts of things based on that</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1430.768000" data-stop="1433.040000">information.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1433.040000" data-stop="1435.720000">Okay, so you've got it, you've got it set up so that when you come</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1435.720000" data-stop="1438.040000">back to your computer, it'll show you the stuff that you've been</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1438.040000" data-stop="1438.560000">working on.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1438.560000" data-stop="1441.700000">And when you're working on the things, you can tell it to tell the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1441.701000" data-stop="1443.167000">rest of the world not to bug you.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1443.168000" data-stop="1444.279000">Gotcha.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="1444.280000" data-stop="1446.779000"><strong class="speaker-name">Shae:</strong> That's right.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1446.780000" data-stop="1449.400000">[Sacha: What other fun stuff do you have in there?</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1465.000000">24:25</span> <strong>ef-themes and modus-themes, season</strong></div><p></p><span class="audio-time caption" data-speaker="Shae" data-start="1465.840000" data-stop="1467.000000"><strong class="speaker-name">Shae:</strong> I discovered that I love the EF themes.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1467.000000" data-stop="1468.960000">I love the Modus themes.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1468.960000" data-stop="1470.400000">They make me very happy.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1470.400000" data-stop="1472.100000">They're just unreasonably pleasant.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1472.101000" data-stop="1476.167000">As someone who has tried every single Emacs theme ever, they're just</span> <span class="audio-time caption" data-speaker="Shae" data-start="1476.168000" data-stop="1477.033000">my favorite themes.</span> <p></p><a href="https://sachachua.com/blog/feed/atom/ec22-shae-erisson-00-24-41-000.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/feed/atom/ec22-shae-erisson-00-24-41-000.jpg" alt="image from video 00:24:41.000" data-time="00:24:41.000"></a><span class="audio-time caption" data-speaker="Shae" data-start="1477.034000" data-stop="1481.000000"><strong class="speaker-name">Shae:</strong> And so, at the moment, it's</span> <span class="audio-time caption" data-speaker="Shae" data-start="1481.001000" data-stop="1489.999000">summer... Where did my summer go? How can this be? There we go.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1490.000000" data-stop="1493.600000">How come I'm in spring? Wait, isn't spring over?</span> <span class="audio-time caption" data-speaker="Shae" data-start="1493.601000" data-stop="1494.767000">Hasn't summer just started?</span> <span class="audio-time caption" data-speaker="Shae" data-start="1494.768000" data-stop="1498.033000">You know what I was thinking would be fun would be take the time of</span> <span class="audio-time caption" data-speaker="Shae" data-start="1498.034000" data-stop="1502.480000">day, and you know that the EF themes has spring, summer, autumn,</span> <span class="audio-time caption" data-speaker="Shae" data-start="1502.480000" data-stop="1506.267000">and winter, and I'm not sure if there are dark versions of each of</span> <span class="audio-time caption" data-speaker="Shae" data-start="1506.268000" data-stop="1509.360000">those, but I thought, like I know that Modus themes will do this like</span> <span class="audio-time caption" data-speaker="Shae" data-start="1509.360000" data-stop="1513.333000">check for the local time of when it turns dark, and then it</span> <span class="audio-time caption" data-speaker="Shae" data-start="1513.334000" data-stop="1516.067000">will go from the light theme to the dark theme as soon as the sun</span> <span class="audio-time caption" data-speaker="Shae" data-start="1516.068000" data-stop="1518.100000">hits, and I was like, well, what if I do that for seasons, you know,</span> <span class="audio-time caption" data-speaker="Shae" data-start="1518.101000" data-stop="1519.867000">wouldn't that be cool?</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1519.868000" data-stop="1529.399000"><strong class="speaker-name">Sacha:</strong> There's this subtle sense of change as you go through the year.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1529.400000" data-stop="1531.033000">But of course you also have this thing there</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1531.034000" data-stop="1533.099000">where you just randomize it.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="1533.100000" data-stop="1534.100000"><strong class="speaker-name">Shae:</strong> Well, I like that.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1534.101000" data-stop="1537.467000">Sometimes it's like I'm just kind of like, ah, I'm bored.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1537.468000" data-stop="1538.640000">I'm just bored of what I'm looking at.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1538.640000" data-stop="1541.880000">And so I will just change my thing.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1541.880000" data-stop="1544.200000">And it's just time for something.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1544.200000" data-stop="1544.720000">I don't know.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1544.720000" data-stop="1545.600000">It seems to work.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1545.600000" data-stop="1548.640000">It's like it gives me a little brain break from what I was staring at.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1548.640000" data-stop="1554.200000">And I did not know I was going to reset the effects scale, but that's</span> <span class="audio-time caption" data-speaker="Shae" data-start="1554.200000" data-stop="1554.800000">fine.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1554.800000" data-stop="1555.480000">Interesting.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1555.480000" data-stop="1556.960000">What else do I have in here?</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1556.000000">25:56</span> <strong>htmlize (does this still work on Wayland?)</strong></div><p></p><span class="audio-time caption" data-speaker="Shae" data-start="1556.960000" data-stop="1558.840000"><strong class="speaker-name">Shae:</strong> Oh, Emacs HTMLize.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1558.840000" data-stop="1560.080000">I'm a little sad.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1560.080000" data-stop="1561.520000">I switched to Wayland.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1561.520000" data-stop="1565.520000">And if I remember correctly, HTMLize only works with, or maybe</span> <span class="audio-time caption" data-speaker="Shae" data-start="1565.520000" data-stop="1569.400000">HTMLize still works, and it's the SVG one that doesn't work.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1569.400000" data-stop="1574.560000">Emacs SVG is a thing that if you're running with an X11 backend, you</span> <span class="audio-time caption" data-speaker="Shae" data-start="1574.560000" data-stop="1578.280000">can turn your current screen directly into an SVG, which is really</span> <span class="audio-time caption" data-speaker="Shae" data-start="1578.280000" data-stop="1578.720000">cute.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1578.720000" data-stop="1579.640000">It does not work in Wayland.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1579.640000" data-stop="1581.920000">I think HTMLize does still work.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1581.920000" data-stop="1584.680000">What other things do I have in here?</span> <span class="audio-time caption" data-speaker="Shae" data-start="1584.680000" data-stop="1585.880000">I don't know.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1585.880000" data-stop="1589.160000">I guess a lot of it lately has been trying to make Rust things work</span> <span class="audio-time caption" data-speaker="Shae" data-start="1589.160000" data-stop="1590.280000">smoothly.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1590.280000" data-stop="1596.400000">I've been trying to do some... I wonder does... Oh, cool.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1596.400000" data-stop="1597.633000">That was not what I expected.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1597.000000">26:37</span> <strong>lsp-ui-imenu, jumping through rust code
</strong></div><p></p><a href="https://sachachua.com/blog/feed/atom/ec22-shae-erisson-00-26-41-100.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/feed/atom/ec22-shae-erisson-00-26-41-100.jpg" alt="image from video 00:26:41.100" data-time="00:26:41.100"></a><span class="audio-time caption" data-speaker="Shae" data-start="1597.634000" data-stop="1600.300000"><strong class="speaker-name">Shae:</strong> I just started doing this thing with imenu.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1600.301000" data-stop="1603.133000">imenu integrates nicely with LSP.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1603.134000" data-stop="1606.833000"><strong class="speaker-name">Sacha:</strong> That is a very pretty sidebar thing, and I need to learn how</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1606.834000" data-stop="1611.359000">to do that.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="1611.360000" data-stop="1615.639000"><strong class="speaker-name">Shae:</strong> So because I have all these extra modifiers, my s-i is</span> <span class="audio-time caption" data-speaker="Shae" data-start="1615.640000" data-stop="1617.039000">lsp-ui-imenu.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1617.040000" data-stop="1622.119000">And the reason that what I mostly use that for is when I have like a</span> <span class="audio-time caption" data-speaker="Shae" data-start="1622.120000" data-stop="1625.859000">bunch of Rust code and I want to quickly jump through the structure</span> <span class="audio-time caption" data-speaker="Shae" data-start="1625.860000" data-stop="1630.579000">of it.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1630.580000" data-stop="1633.719000">Basically that integrates with LSP, finds all the definitions, and I</span> <span class="audio-time caption" data-speaker="Shae" data-start="1633.720000" data-stop="1635.079000">can quickly jump through it.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1635.080000" data-stop="1638.879000">I used to use lsp-treemacs for that, but lsp-treemacs puts things in</span> <span class="audio-time caption" data-speaker="Shae" data-start="1638.880000" data-stop="1645.079000">its own order, not quite the same order I want, although treemacs is</span> <span class="audio-time caption" data-speaker="Shae" data-start="1645.080000" data-stop="1647.679000">quite nice.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1647.680000" data-stop="1651.319000">I think that the thing to do is that you and I at some time maybe the</span> <span class="audio-time caption" data-speaker="Shae" data-start="1651.320000" data-stop="1653.759000">next time if we do this again we should set up with a Shwim</span> <span class="audio-time caption" data-speaker="Shae" data-start="1653.760000" data-stop="1657.279000">connection and you and I can both share our Emacs and then you can</span> <span class="audio-time caption" data-speaker="Shae" data-start="1657.280000" data-stop="1660.039000">show me cool things that you do and I can show you cool things that I</span> <span class="audio-time caption" data-speaker="Shae" data-start="1660.040000" data-stop="1662.359000">do and then we can start filing over some of the things.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1662.360000" data-stop="1663.899000">How about that?</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1663.900000" data-stop="1664.919000"><strong class="speaker-name">Sacha:</strong> That sounds fantastic.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1664.920000" data-stop="1668.439000">I know we'd wanted to experiment with pair programming a long time</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1668.440000" data-stop="1672.959000">ago so that sounds like a seamless way to do it.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1672.960000" data-stop="1675.839000">And therefore I will go and figure out how to install shim and get it</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1675.840000" data-stop="1676.399000">working.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1676.400000" data-stop="1678.679000">I will probably need your help to actually test it.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1678.680000" data-stop="1680.839000">I don't know, I think I can rustle up.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1680.840000" data-stop="1682.359000">Maybe it'll work off my phone.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1682.360000" data-stop="1685.679000">You haven't tried that.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1685.680000" data-stop="1691.679000">But lspui, okay, so I've just been using straight up imenu, like on</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1691.680000" data-stop="1696.159000">Neanderthal, but lsp-ui has this fancy grouping of things and colors</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1696.160000" data-stop="1700.159000">and stuff, so I definitely want to check that out.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="1700.160000" data-stop="1701.439000"><strong class="speaker-name">Shae:</strong> I'm a fan, yeah.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1701.440000" data-stop="1703.599000">I don't know.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1703.600000" data-stop="1705.479000">Do I have anything else exciting that goes with this in here?</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1705.000000">28:25</span> <strong>laptop with 126GB of RAM</strong></div><p></p><span class="audio-time caption" data-speaker="Shae" data-start="1705.480000" data-stop="1710.719000"><strong class="speaker-name">Shae:</strong> I will say that at the moment, the system I'm working on, I like</span> <span class="audio-time caption" data-speaker="Shae" data-start="1710.720000" data-stop="1715.839000">buying unreasonably powerful laptops.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1715.840000" data-stop="1726.599000">And so, like, this system has 128 gigs of RAM and 24 cores.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1726.600000" data-stop="1730.479000">My previous laptop has 192 gigs of RAM.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1730.480000" data-stop="1737.279000">Long story short, I end up in a lot of cases where I want to use more</span> <span class="audio-time caption" data-speaker="Shae" data-start="1737.280000" data-stop="1738.279000">memory.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1738.280000" data-stop="1739.559000">I've got all these cores.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1739.560000" data-stop="1741.319000">Can you do something with them?</span> <span class="audio-time caption" data-speaker="Shae" data-start="1741.320000" data-stop="1748.319000">Perhaps you've already seen things like LSP doctor, which will say,</span> <span class="audio-time caption" data-speaker="Shae" data-start="1748.320000" data-stop="1750.079000">have you tried this thing?</span> <span class="audio-time caption" data-speaker="Shae" data-start="1750.080000" data-stop="1751.119000">Have you done this other thing?</span> <span class="audio-time caption" data-speaker="Shae" data-start="1751.120000" data-stop="1754.679000">LSP has really changed</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1754.680000" data-stop="1755.999000"><strong class="speaker-name">Sacha:</strong> I have not.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1756.000000" data-stop="1758.719000">Sorry, would you like to show me this LSP doctor thing?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1758.720000" data-stop="1760.859000">Because I have not ever seen it.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="1760.860000" data-stop="1761.319000"><strong class="speaker-name">Shae:</strong> Yeah.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1761.320000" data-stop="1765.559000">Do you use language servers much for your development?</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1765.560000" data-stop="1769.079000"><strong class="speaker-name">Sacha:</strong> I am only just getting used to having a relatively modern</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1769.080000" data-stop="1773.119000">2018 instead of 2010 laptop.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1773.120000" data-stop="1776.279000">And so I have the red squigglies and various things, but I don't know</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1776.280000" data-stop="1778.519000">what to do with them yet.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="1778.520000" data-stop="1782.639000"><strong class="speaker-name">Shae:</strong> Well, I mean, I'm doing a lot of this.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1782.640000" data-stop="1786.039000">So I have...</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1786.000000">29:46</span> <strong>LSP coolness, Haskell, treesitter</strong></div><p></p><span class="audio-time caption" data-speaker="Shae" data-start="1786.040000" data-stop="1788.479000"><strong class="speaker-name">Shae:</strong> Originally for me it was like I spent a lot of time with the Haskell</span> <span class="audio-time caption" data-speaker="Shae" data-start="1788.480000" data-stop="1791.319000">language server because I was doing so much Haskell and it was a</span> <span class="audio-time caption" data-speaker="Shae" data-start="1791.320000" data-stop="1792.359000">super powerful thing.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1792.360000" data-stop="1796.039000">In fact, somebody decided to hammer in half of a proof assistant into</span> <span class="audio-time caption" data-speaker="Shae" data-start="1796.040000" data-stop="1798.199000">the Haskell language server and that was magic.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1798.200000" data-stop="1800.999000">You could do incredible stuff with that because you could just grab</span> <span class="audio-time caption" data-speaker="Shae" data-start="1801.000000" data-stop="1803.399000">all of your local variables and transform the whole shape of your</span> <span class="audio-time caption" data-speaker="Shae" data-start="1803.400000" data-stop="1806.119000">function and you could just write little snippets and just have it</span> <span class="audio-time caption" data-speaker="Shae" data-start="1806.120000" data-stop="1806.519000">work.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1806.520000" data-stop="1808.519000">And that was amazing.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1808.520000" data-stop="1812.039000">It wasn't quite... One of the goals that I believe is...</span> <span class="audio-time caption" data-speaker="Shae" data-start="1812.040000" data-stop="1817.159000">For future development of all programming editors, I believe that</span> <span class="audio-time caption" data-speaker="Shae" data-start="1817.160000" data-stop="1821.479000">something like Emacs macros, but instead for abstract syntax trees, I</span> <span class="audio-time caption" data-speaker="Shae" data-start="1821.480000" data-stop="1824.439000">believe this is an essential ingredient that we do not yet have.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1824.440000" data-stop="1827.719000">And I think that TreeSitter is the first step towards there.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1827.720000" data-stop="1829.159000">We now have one of the hats, right?</span> <span class="audio-time caption" data-speaker="Shae" data-start="1829.160000" data-stop="1833.239000">Which is where we can take... TreeSitter is, you know, if you've used</span> <span class="audio-time caption" data-speaker="Shae" data-start="1833.240000" data-stop="1835.799000">it...</span> <span class="audio-time caption" data-speaker="Shae" data-start="1835.800000" data-stop="1839.839000">It is like you write some effectively C code to produce a really fast</span> <span class="audio-time caption" data-speaker="Shae" data-start="1839.840000" data-stop="1840.279000">parser.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1840.280000" data-stop="1843.359000">Or is it like JavaScript that then compiles to C code?</span> <span class="audio-time caption" data-speaker="Shae" data-start="1843.360000" data-stop="1844.959000">I forget exactly how it works.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1844.960000" data-stop="1848.119000">But the nice thing about TreeSitter is, I don't know if you remember,</span> <span class="audio-time caption" data-speaker="Shae" data-start="1848.120000" data-stop="1851.159000">I'm sure you do remember, that if you were writing Python code and</span> <span class="audio-time caption" data-speaker="Shae" data-start="1851.160000" data-stop="1853.639000">you used a triple-quoted string, you had to then add a comment with</span> <span class="audio-time caption" data-speaker="Shae" data-start="1853.640000" data-stop="1857.279000">another quote because regular expressions is how Emacs was doing all</span> <span class="audio-time caption" data-speaker="Shae" data-start="1857.280000" data-stop="1858.859000">the syntax highlighting.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1858.860000" data-stop="1860.399000">And honestly, that was kind of crap.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1860.400000" data-stop="1865.239000">And then there were projects like the Semantic Bovinator that made a</span> <span class="audio-time caption" data-speaker="Shae" data-start="1865.240000" data-stop="1871.519000">full parsing suite in Elisp, which to me is half brilliant and half</span> <span class="audio-time caption" data-speaker="Shae" data-start="1871.520000" data-stop="1872.599000">insane.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1872.600000" data-stop="1876.799000">And then there was TreeSitter, which kind of took over the world</span> <span class="audio-time caption" data-speaker="Shae" data-start="1876.800000" data-stop="1880.239000">because it was... I think that the language server and TreeSitter are</span> <span class="audio-time caption" data-speaker="Shae" data-start="1880.240000" data-stop="1884.959000">the first two of these editor generic pieces, and I suspect there</span> <span class="audio-time caption" data-speaker="Shae" data-start="1884.960000" data-stop="1885.519000">will be more.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1885.520000" data-stop="1889.159000">I think that something where you can modify the abstract syntax tree</span> <span class="audio-time caption" data-speaker="Shae" data-start="1889.160000" data-stop="1890.559000">and then put back to the source</span> <span class="audio-time caption" data-speaker="Shae" data-start="1890.560000" data-stop="1892.759000">is one of those potential paths forward.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1892.760000" data-stop="1894.539000">I hope so.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1894.540000" data-stop="1896.239000"><strong class="speaker-name">Sacha:</strong> Yeah, that would be great if you could just do the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1896.240000" data-stop="1899.039000">manipulations and then roundtrip it back into source code.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1899.040000" data-stop="1903.199000">Just regenerate the changed part of your code.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1903.200000" data-stop="1904.359000">That sounds fantastic.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1904.360000" data-stop="1908.599000">So it sounds like you were able to do some kind of manipulation with</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1908.600000" data-stop="1911.199000">the Haskell use case that you were describing.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1911.200000" data-stop="1914.739000">Any chance you can show us like the awesomeness?</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="1914.740000" data-stop="1915.279000"><strong class="speaker-name">Shae:</strong> Sadly,</span> <span class="audio-time caption" data-speaker="Shae" data-start="1915.280000" data-stop="1918.919000">that sadly does not work anymore.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1918.000000">31:58</span> <strong>Combobulate</strong></div><p></p><span class="audio-time caption" data-speaker="Shae" data-start="1918.920000" data-stop="1922.279000"><strong class="speaker-name">Shae:</strong> But you know, if you're looking for something in that area, have you</span> <span class="audio-time caption" data-speaker="Shae" data-start="1922.280000" data-stop="1926.179000">heard of a Emacs library called Combobulate?</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1926.180000" data-stop="1927.159000"><strong class="speaker-name">Sacha:</strong> I have heard of it.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1927.160000" data-stop="1928.819000">I haven't dug into it.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="1928.820000" data-stop="1934.719000"><strong class="speaker-name">Shae:</strong> So it uses TreeSitter for source code manipulation by, and</span> <span class="audio-time caption" data-speaker="Shae" data-start="1934.720000" data-stop="1937.479000">it's a lot closer to the way that like, you know, in Org Mode, you</span> <span class="audio-time caption" data-speaker="Shae" data-start="1937.480000" data-stop="1941.519000">can like hold meta and arrow to kind of move things around.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1941.520000" data-stop="1946.719000">It uses TreeSitter to let you both move around in the context as well</span> <span class="audio-time caption" data-speaker="Shae" data-start="1946.720000" data-stop="1949.119000">as actually alter the shape.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1949.120000" data-stop="1954.119000">And to me, this is the first step towards this tool that I want,</span> <span class="audio-time caption" data-speaker="Shae" data-start="1954.120000" data-stop="1957.999000">which is where I can write a keyboard macro and have it edit an</span> <span class="audio-time caption" data-speaker="Shae" data-start="1958.000000" data-stop="1961.959000">abstract syntax tree and then spit the results back into the buffer.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1961.960000" data-stop="1965.299000">Yeah.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1965.300000" data-stop="1966.199000"><strong class="speaker-name">Sacha:</strong> All right.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1966.000000">32:46</span> <strong>What else are you using your 126 gigabytes of RAM for?</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1966.200000" data-stop="1972.259000"><strong class="speaker-name">Sacha:</strong> What else are you using your 126 gigabytes of RAM for?</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="1972.260000" data-stop="1974.499000"><strong class="speaker-name">Shae:</strong> Let's see.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1974.500000" data-stop="1977.239000">Honestly, I'm going to tell you that Rust Analyzer can take a lot of</span> <span class="audio-time caption" data-speaker="Shae" data-start="1977.240000" data-stop="1977.839000">memory.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1977.840000" data-stop="1980.479000">And a Rust compilation can take a lot of cores.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1980.480000" data-stop="1986.479000">And I'm okay with that because I actually, I do like, and I will say</span> <span class="audio-time caption" data-speaker="Shae" data-start="1986.480000" data-stop="1988.719000">that this laptop is actually from this year.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1988.720000" data-stop="1992.079000">So it's a brand new, like, top of the line.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1992.080000" data-stop="1996.399000">But then like, how would I, because I've got like, which I think is a</span> <span class="audio-time caption" data-speaker="Shae" data-start="1996.400000" data-stop="1998.199000">bunch of matrix multiplication hardware.</span> <span class="audio-time caption" data-speaker="Shae" data-start="1998.200000" data-stop="2000.159000">How do I use that from Emacs?</span> <span class="audio-time caption" data-speaker="Shae" data-start="2000.160000" data-stop="2005.520000">I don't know. I'm sure I can find something, you know.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2005.000000">33:25</span> <strong>TalonVoice</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2005.521000" data-stop="2007.859000"><strong class="speaker-name">Sacha:</strong> Maybe voice computing?</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="2007.860000" data-stop="2012.333000"><strong class="speaker-name">Shae:</strong> Oh, that's an idea. Yeah, one of my friends, she's using Talon.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2012.334000" data-stop="2012.334000">Have you heard of Talon?</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2010.280000" data-stop="2014.499000"><strong class="speaker-name">Sacha:</strong> Yeah, I've heard of Talon.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2014.500000" data-stop="2017.399000">There are a couple of videos about people using Talon to code by</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2017.400000" data-stop="2022.159000">voice, usually involving memorizing kind of a different alphabet for</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2022.160000" data-stop="2025.199000">very quickly accessing different shortcuts.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2025.200000" data-stop="2027.799000">But it sounds really cool, and you sound like you've got the hardware</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2027.800000" data-stop="2029.159000">to do something amazing with it.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="2029.160000" data-stop="2030.799000"><strong class="speaker-name">Shae:</strong> That's true.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2030.800000" data-stop="2034.399000">Well, you know, Talon actually lets you do something very similar to</span> <span class="audio-time caption" data-speaker="Shae" data-start="2034.400000" data-stop="2037.999000">Combobulate, where you can navigate the AST of your source code.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2038.000000" data-stop="2040.479000">You can kind of move around very quickly.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2040.480000" data-stop="2043.919000">I don't know, like, are we like at the end of our?</span> <span class="audio-time caption" data-speaker="Shae" data-start="2043.920000" data-stop="2046.519000">No, no, we're halfway through, right?</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2046.520000" data-stop="2047.599000"><strong class="speaker-name">Sacha:</strong> We're halfway through.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2047.600000" data-stop="2051.279000">I have about 28 minutes before the kiddo runs out and starts</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2051.280000" data-stop="2053.599000">demanding lunch.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="2053.600000" data-stop="2057.119000"><strong class="speaker-name">Shae:</strong> Okay, well, I feel like I've been driving the structure of</span> <span class="audio-time caption" data-speaker="Shae" data-start="2057.120000" data-stop="2059.119000">our just kind of like dumping random things.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2059.120000" data-stop="2062.079000">Did you have any questions or anything you wanted to cover?</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2062.080000" data-stop="2063.919000"><strong class="speaker-name">Sacha:</strong> This is all amazing.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2063.920000" data-stop="2066.239000">I come in with no preconceived notions.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2066.240000" data-stop="2069.279000">I'm just like, okay, shapr does cool things with Emacs.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2069.280000" data-stop="2071.239000">Let's hear about it.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2071.240000" data-stop="2072.719000">Let's go, let's go.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="2072.720000" data-stop="2074.939000"><strong class="speaker-name">Shae:</strong> That works for me.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2074.940000" data-stop="2077.199000">Yeah.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2077.200000" data-stop="2079.879000">I mean, a lot of it's been focused on Rust development lately.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2083.500000" data-stop="2085.019000">Rust and Jujutsu.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2085.000000">34:45</span> <strong>NixOS, following Steve Purcell about 5 years behind</strong></div><p></p><span class="audio-time caption" data-speaker="Shae" data-start="2085.020000" data-stop="2086.119000"><strong class="speaker-name">Shae:</strong> I've been doing a lot of Nix.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2086.120000" data-stop="2087.199000">I'm running NixOS.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2087.200000" data-stop="2093.279000">I don't know if you're familiar, but that's been great fun.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2093.280000" data-stop="2097.079000">It's funny, I feel like I've been following Steve Purcell around from</span> <span class="audio-time caption" data-speaker="Shae" data-start="2097.080000" data-stop="2098.879000">a technical perspective.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2098.880000" data-stop="2103.439000">I'm always about five years behind Steve.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2103.000000">35:03</span> <strong>envrc</strong></div><p></p><span class="audio-time caption" data-speaker="Shae" data-start="2103.440000" data-stop="2106.639000"><strong class="speaker-name">Shae:</strong> I was like, oh, you know, NixOS is kind of a pain with Emacs.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2106.640000" data-stop="2111.039000">And just like this, what was it, NixOS?</span> <span class="audio-time caption" data-speaker="Shae" data-start="2111.040000" data-stop="2111.679000">I forget.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2111.680000" data-stop="2115.679000">Anyway, Steve was like, oh, well, have you tried my library, envrc?</span> <span class="audio-time caption" data-speaker="Shae" data-start="2115.680000" data-stop="2116.719000">And I was like, what's that?</span> <span class="audio-time caption" data-speaker="Shae" data-start="2116.720000" data-stop="2119.079000">And he was like, well, now each buffer can have its own envrc.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2119.080000" data-stop="2121.119000">And I was like, it's perfect.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2121.120000" data-stop="2122.199000">That's exactly what I need.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2122.200000" data-stop="2126.559000">Because previously, every time I switched buffers, it would then go</span> <span class="audio-time caption" data-speaker="Shae" data-start="2126.560000" data-stop="2127.639000">load all of the local</span> <span class="audio-time caption" data-speaker="Shae" data-start="2127.640000" data-stop="2129.879000">everything in Nix.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2129.880000" data-stop="2133.399000">And sometimes that could take a long time, especially if I'm doing</span> <span class="audio-time caption" data-speaker="Shae" data-start="2133.400000" data-stop="2137.519000">Haskell, that could take 10 seconds, and I really don't want that</span> <span class="audio-time caption" data-speaker="Shae" data-start="2137.520000" data-stop="2138.039000">sort of lag.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2138.040000" data-stop="2142.679000">And so Steve Purcell's brilliant library, envrc, says, you know what?</span> <span class="audio-time caption" data-speaker="Shae" data-start="2142.680000" data-stop="2146.279000">Every single buffer can just keep such a thing, and then you can only</span> <span class="audio-time caption" data-speaker="Shae" data-start="2146.280000" data-stop="2146.959000">relit it when you need to.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2146.960000" data-stop="2149.259000">And that's pretty awesome.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2149.260000" data-stop="2152.619000"><strong class="speaker-name">Sacha:</strong> That sounds cool, and I should check that out too.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2152.000000">35:52</span> <strong>time-tracking</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2152.620000" data-stop="2154.279000"><strong class="speaker-name">Sacha:</strong> @JacksonScholberg has a question.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2154.280000" data-stop="2157.399000">He says, "I was curious about what you were tracking your time working</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2157.400000" data-stop="2158.839000">on, how you track it."</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2158.840000" data-stop="2160.999000">Is it just Org Clock?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2161.000000" data-stop="2165.839000">So this is how you keep track of the things you're working on and</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2165.840000" data-stop="2171.119000">what got interrupted by the new thing that you just added to the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2171.120000" data-stop="2172.639000">stack and so forth?</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="2172.640000" data-stop="2172.759000"><strong class="speaker-name">Shae:</strong> Right.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2172.760000" data-stop="2174.399000">In fact, I have this thing.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2174.400000" data-stop="2175.639000">Honestly, when I sit down on my computer,</span> <span class="audio-time caption" data-speaker="Shae" data-start="2175.640000" data-stop="2177.079000">Just clock in.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2177.080000" data-stop="2182.359000">You'll notice in the bottom right here, we have chat with Sacha,</span> <span class="audio-time caption" data-speaker="Shae" data-start="2182.360000" data-stop="2183.039000">right?</span> <span class="audio-time caption" data-speaker="Shae" data-start="2183.040000" data-stop="2184.999000">And so like, I just kind of clock in stuff.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2185.000000" data-stop="2191.279000">And like, I'm not always, I really kind of need to reorganize my Org</span> <span class="audio-time caption" data-speaker="Shae" data-start="2191.280000" data-stop="2194.559000">mode files because I've been naming them per host because I</span> <span class="audio-time caption" data-speaker="Shae" data-start="2194.560000" data-stop="2197.719000">previously had like a work Org mode and I had a home Org mode.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2197.720000" data-stop="2202.559000">now that my home hardware is also my work hardware I guess and so</span> <span class="audio-time caption" data-speaker="Shae" data-start="2202.560000" data-stop="2206.319000">like I still have my previous laptops things where I'm keeping my</span> <span class="audio-time caption" data-speaker="Shae" data-start="2206.320000" data-stop="2210.439000">events I really need to reorganize things but I mean yeah I schedule</span> <span class="audio-time caption" data-speaker="Shae" data-start="2210.440000" data-stop="2221.059000">things I oh you know I've got a weird thing to show you</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2221.000000">37:01</span> <strong>taxes with Org Mode, remote lookup
</strong></div><p></p><a href="https://sachachua.com/blog/feed/atom/ec22-shae-erisson-00-37-09-900.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/feed/atom/ec22-shae-erisson-00-37-09-900.jpg" alt="image from video 00:37:09.900" data-time="00:37:09.900"></a><span class="audio-time caption" data-speaker="Shae" data-start="2221.060000" data-stop="2225.232000"><strong class="speaker-name">Shae:</strong> I decided that it would be great fun to do my taxes.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2225.233000" data-stop="2227.839000"><strong class="speaker-name">Sacha:</strong> You are showing me your taxes, do I need to like black out</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2227.840000" data-stop="2229.899000">this whole thing?</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="2229.900000" data-stop="2233.279000"><strong class="speaker-name">Shae:</strong> Well, this is actually just an example from the docs.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2233.280000" data-stop="2238.799000">So I could actually share my taxes on it because I mostly don't care.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2238.800000" data-stop="2243.959000">But I think in fact you can figure out exactly how much money I'm</span> <span class="audio-time caption" data-speaker="Shae" data-start="2243.960000" data-stop="2246.559000">making by looking at the open whatever.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2246.560000" data-stop="2251.799000">So the thing about this is that I decided to file all of my tax forms</span> <span class="audio-time caption" data-speaker="Shae" data-start="2251.800000" data-stop="2256.559000">directly into Org Mode spreadsheets and then do remote lookups.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2256.560000" data-stop="2260.279000">So basically each spreadsheet was one particular form.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2260.280000" data-stop="2263.439000">And then once I'd gotten to the bottom, like I need this result, like</span> <span class="audio-time caption" data-speaker="Shae" data-start="2263.440000" data-stop="2265.519000">what's my estimated income?</span> <span class="audio-time caption" data-speaker="Shae" data-start="2265.520000" data-stop="2270.199000">And then I would use the lookup, kind of this cross spreadsheet</span> <span class="audio-time caption" data-speaker="Shae" data-start="2270.200000" data-stop="2270.879000">lookup.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2270.880000" data-stop="2272.839000">And that's how I did my taxes for last year.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2272.840000" data-stop="2279.959000">And then my de facto mother-in-law, she's an accountant, and she</span> <span class="audio-time caption" data-speaker="Shae" data-start="2279.960000" data-stop="2282.439000">didn't exactly do this thing, but it was pretty close.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2282.440000" data-stop="2285.279000">She was like, you've got all your taxes in the spreadsheet.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2285.280000" data-stop="2286.439000">I was like, yeah.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2286.440000" data-stop="2288.639000">And then she looked at it and she was like, what is that?</span> <span class="audio-time caption" data-speaker="Shae" data-start="2288.640000" data-stop="2290.239000">And I was like, anyway.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2290.240000" data-stop="2295.879000">So I got to kind of file everything back out into TurboTax, but that</span> <span class="audio-time caption" data-speaker="Shae" data-start="2295.880000" data-stop="2296.919000">was a fun thing to build.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2296.920000" data-stop="2301.079000"><strong class="speaker-name">Sacha:</strong> Yeah, I have something like that too.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2301.080000" data-stop="2305.959000">So for example, whenever I do my tax paperwork, I just have to have</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2305.960000" data-stop="2308.239000">like, you know, the step by step checklist.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2308.240000" data-stop="2310.199000">Okay, this is where I need to go to get this number.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2310.200000" data-stop="2312.079000">This is where I can put it in.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2312.080000" data-stop="2315.279000">And then eventually it spits out a table that says, okay, put this in</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2315.280000" data-stop="2319.839000">box 11, put this in box 13, so that I don't have to do the steps by</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2319.840000" data-stop="2321.079000">hand.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2321.080000" data-stop="2325.719000">Because even before the, you know, for me, I use like simple stacks</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2325.720000" data-stop="2327.659000">or whatever, it's web based.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2327.660000" data-stop="2330.239000">But before you get to the point where you can put the numbers in the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2330.240000" data-stop="2334.119000">form, you gotta go to this website, calculate this thing, and Org</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2334.120000" data-stop="2338.079000">just makes all of that so much easier.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="2338.080000" data-stop="2338.759000"><strong class="speaker-name">Shae:</strong> I agree.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2338.760000" data-stop="2341.139000">Yeah.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2341.140000" data-stop="2345.359000"><strong class="speaker-name">Sacha:</strong> And this remote lookup thing is something I'm always looking</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2345.360000" data-stop="2349.199000">up because Org tables are so powerful, but also I need more examples</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2349.200000" data-stop="2351.959000">in my life to remember how to use them.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="2351.960000" data-stop="2355.479000"><strong class="speaker-name">Shae:</strong> Well, I think it took me four hours the first time to get it</span> <span class="audio-time caption" data-speaker="Shae" data-start="2355.480000" data-stop="2356.399000">all figured out.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2356.400000" data-stop="2359.199000">But I can send you an example without showing it here.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2359.200000" data-stop="2363.719000">I can send you an example because I figured out, I think I've</span> <span class="audio-time caption" data-speaker="Shae" data-start="2363.720000" data-stop="2366.619000">hammered the remote lookup down very thoroughly.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2366.620000" data-stop="2370.919000"><strong class="speaker-name">Sacha:</strong> And once you've got it right, you can just keep filling that</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2370.920000" data-stop="2372.439000">in or copy and paste it.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2372.440000" data-stop="2377.979000">You have an example of the syntax and that's already all you need.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="2377.980000" data-stop="2378.399000"><strong class="speaker-name">Shae:</strong> Right.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2378.400000" data-stop="2382.039000">I did run across some limitations of the</span> <span class="audio-time caption" data-speaker="Shae" data-start="2382.040000" data-stop="2386.833000">evaluation method of Org mode spreadsheets.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2386.834000" data-stop="2389.667000">But maybe I've been using them a little too hard,</span> <span class="audio-time caption" data-speaker="Shae" data-start="2389.668000" data-stop="2391.100000">if that makes any sense.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2391.101000" data-stop="2393.000000"><strong class="speaker-name">Sacha:</strong> Oh, what kind of limitation?</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="2393.001000" data-stop="2400.267000"><strong class="speaker-name">Shae:</strong> Honestly, I think I finally found a way to say every</span> <span class="audio-time caption" data-speaker="Shae" data-start="2400.268000" data-stop="2402.439000">single... Because it was...</span> <span class="audio-time caption" data-speaker="Shae" data-start="2402.440000" data-stop="2408.439000">So really the way that spreadsheets work is they're much more like</span> <span class="audio-time caption" data-speaker="Shae" data-start="2408.440000" data-stop="2408.959000">Dataflow.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2408.960000" data-stop="2411.999000">And that is just that you end up with, like, either you work from the</span> <span class="audio-time caption" data-speaker="Shae" data-start="2412.000000" data-stop="2415.599000">endpoint, which is like much more Haskell style evaluation, which is</span> <span class="audio-time caption" data-speaker="Shae" data-start="2415.600000" data-stop="2416.959000">where you're like, I need to start here.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2416.960000" data-stop="2418.279000">What depends on this?</span> <span class="audio-time caption" data-speaker="Shae" data-start="2418.280000" data-stop="2421.599000">But in the case where you have a whole bunch of different Org Mode</span> <span class="audio-time caption" data-speaker="Shae" data-start="2421.600000" data-stop="2426.919000">spreadsheets, I think I ended up with this little text style hack</span> <span class="audio-time caption" data-speaker="Shae" data-start="2426.920000" data-stop="2428.159000">where I just ran it a bunch of times.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2428.160000" data-stop="2429.759000">So it's like evaluate, evaluate, evaluate.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2429.760000" data-stop="2431.439000">Because remote lookups</span> <span class="audio-time caption" data-speaker="Shae" data-start="2431.440000" data-stop="2434.719000">I ran, you know, I don't remember.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2434.720000" data-stop="2436.559000">And I think I took notes, but I don't remember.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2436.560000" data-stop="2439.439000">That's one of the great things about Org Mode is that I swear it's</span> <span class="audio-time caption" data-speaker="Shae" data-start="2439.440000" data-stop="2442.319000">my, like, half of my brain is in my Org Mode notes.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2442.320000" data-stop="2446.679000">And whenever I had, I'm like, oh, what was that thing?</span> <span class="audio-time caption" data-speaker="Shae" data-start="2446.680000" data-stop="2449.639000">I'm like, well, fortunately, with my terrible short-term memory, I</span> <span class="audio-time caption" data-speaker="Shae" data-start="2449.640000" data-stop="2452.519000">took copious notes because otherwise I would never be able to get</span> <span class="audio-time caption" data-speaker="Shae" data-start="2452.520000" data-stop="2455.499000">back to it.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2455.000000">40:55</span> <strong>finding notes with C-s</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2455.500000" data-stop="2462.599000"><strong class="speaker-name">Sacha:</strong> What is your favorite way of finding those notes?</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="2462.600000" data-stop="2466.279000"><strong class="speaker-name">Shae:</strong> I actually use a lot of C-s just because I kind of have</span> <span class="audio-time caption" data-speaker="Shae" data-start="2466.280000" data-stop="2470.919000">some idea of where they are in my tree structure and I'll also say I</span> <span class="audio-time caption" data-speaker="Shae" data-start="2470.920000" data-stop="2474.879000">use a lot of my Org capture templates and they're not super</span> <span class="audio-time caption" data-speaker="Shae" data-start="2474.880000" data-stop="2475.559000">complicated.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2475.560000" data-stop="2479.359000">I have like a to-do, I have a journal, I have ideas and like random</span> <span class="audio-time caption" data-speaker="Shae" data-start="2479.360000" data-stop="2483.279000">ideas will float into my head like you saw Markov keyboard right it</span> <span class="audio-time caption" data-speaker="Shae" data-start="2483.280000" data-stop="2486.119000">is like the weirdest art piece you've seen all day right and</span> <span class="audio-time caption" data-speaker="Shae" data-start="2486.120000" data-stop="2492.279000">Markup keyboard shows up on the front page of Hacker News once a year</span> <span class="audio-time caption" data-speaker="Shae" data-start="2492.280000" data-stop="2492.719000">or so.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2492.720000" data-stop="2496.159000">And people are like, programmers have gone too far.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2496.160000" data-stop="2499.999000">This cannot possibly be usable by humans or something.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2500.000000" data-stop="2502.719000">And I'm like, well, I don't know.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2502.720000" data-stop="2503.999000">I think it was art.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2504.000000" data-stop="2506.719000">And so a lot of times those things will drop into my head, something</span> <span class="audio-time caption" data-speaker="Shae" data-start="2506.720000" data-stop="2508.679000">like that, where I'm trying to do something else.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2508.680000" data-stop="2511.359000">And so I will quickly write down the idea and then just gotten it out</span> <span class="audio-time caption" data-speaker="Shae" data-start="2511.360000" data-stop="2513.999000">of my head enough that I can continue with what I was doing.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2514.000000" data-stop="2516.599000">And so I have a long list of strange ideas.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2516.600000" data-stop="2520.959000">A recent one was like, you've probably had your teeth worked on once</span> <span class="audio-time caption" data-speaker="Shae" data-start="2520.960000" data-stop="2521.479000">or twice.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2521.480000" data-stop="2524.239000">And you know that the dentist always had to move the light around.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2524.240000" data-stop="2526.479000">And I'm like, but we have really good eye tracking.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2526.480000" data-stop="2530.639000">Wouldn't it make sense to figure out where the dentist or the car</span> <span class="audio-time caption" data-speaker="Shae" data-start="2530.640000" data-stop="2532.319000">mechanic is what they're looking at?</span> <span class="audio-time caption" data-speaker="Shae" data-start="2532.320000" data-stop="2536.719000">And then have the light move around behind them to figure out how to</span> <span class="audio-time caption" data-speaker="Shae" data-start="2536.720000" data-stop="2538.999000">actually light up the place they're looking at, right?</span> <span class="audio-time caption" data-speaker="Shae" data-start="2539.000000" data-stop="2539.519000">We've got vision tracking.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2539.520000" data-stop="2540.679000">Why don't we do this?</span> <span class="audio-time caption" data-speaker="Shae" data-start="2540.680000" data-stop="2542.599000">But I don't really, yeah.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2542.600000" data-stop="2545.759000">I decided maybe I don't want to work on that one right now.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2545.760000" data-stop="2548.399000"><strong class="speaker-name">Sacha:</strong> It sounds like an involved project.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2548.400000" data-stop="2549.119000">Yeah.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2549.120000" data-stop="2550.719000">Yeah, yeah, yeah.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2550.720000" data-stop="2554.599000">Okay, so you're capturing, you're stuffing a lot of these ideas into</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2554.600000" data-stop="2555.199000">an inbox.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2555.000000">42:35</span> <strong>Org Mode, managing inbox</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2555.200000" data-stop="2558.679000"><strong class="speaker-name">Sacha:</strong> A lot of people are probably in the same boat where they've got these</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2558.680000" data-stop="2560.399000">inboxes full of ideas.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2560.400000" data-stop="2564.279000">How do you deal?</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="2564.280000" data-stop="2565.599000"><strong class="speaker-name">Shae:</strong> I archive stuff when I'm done with it.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2566.140000" data-stop="2567.520000"><strong class="speaker-name">Sacha:</strong> Oh yeah?</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="2567.521000" data-stop="2572.199000"><strong class="speaker-name">Shae:</strong> Yeah, so a lot of times, and I find this very valuable, is</span> <span class="audio-time caption" data-speaker="Shae" data-start="2572.200000" data-stop="2575.199000">like if I look at... Do I have it?</span> <span class="audio-time caption" data-speaker="Shae" data-start="2575.200000" data-stop="2578.119000">Oops, that was not what I meant to do.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2578.120000" data-stop="2581.879000"><strong class="speaker-name">Sacha:</strong> Alright, so you basically just do aggressive speed commands,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2581.880000" data-stop="2584.839000">archive, archive, archive, or look at the agenda and just mark a</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2584.840000" data-stop="2586.759000">whole bunch of things and say, that's it, that's gone.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2586.760000" data-stop="2590.519000">It was written down and then it can go.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="2590.520000" data-stop="2593.319000"><strong class="speaker-name">Shae:</strong> Yeah, well, when I'm really done with something, when the</span> <span class="audio-time caption" data-speaker="Shae" data-start="2593.320000" data-stop="2595.759000">thing is finished, then I will just archive it.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2595.760000" data-stop="2597.859000">I mean, do you use Archive much?</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2597.860000" data-stop="2598.839000"><strong class="speaker-name">Sacha:</strong> I do.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2598.840000" data-stop="2602.559000">I have a function that goes through my inbox file and just archives</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2602.560000" data-stop="2603.879000">anything that was marked as done.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="2603.880000" data-stop="2606.119000"><strong class="speaker-name">Shae:</strong> Oh, nice!</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2606.120000" data-stop="2608.319000"><strong class="speaker-name">Sacha:</strong> Because that way it clears it up, right?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2608.320000" data-stop="2613.239000">So I'll refile things where I'm like, okay, it's done, but it has</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2613.240000" data-stop="2614.359000">important information.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2614.360000" data-stop="2615.919000">I want to put it somewhere else.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2615.920000" data-stop="2619.639000">But if it's just a transitory task that I'm using to remind myself,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2619.640000" data-stop="2623.439000">tomorrow I have to do this, go find the water bottle when it's done,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2623.440000" data-stop="2626.279000">I don't need to know about it in the future.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2626.280000" data-stop="2629.999000">So it's left in my inbox because I checked it off, and then</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2630.000000" data-stop="2632.119000">periodically I'll say, clean up inbox.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2632.120000" data-stop="2635.999000">Not only will it remove all of the done things, but if I leave a tag</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2636.000000" data-stop="2641.919000">In the title of the task or if the task matches certain regular</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2641.920000" data-stop="2646.799000">expressions, it will refile it to the appropriate place in my kind of</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2646.800000" data-stop="2648.439000">more permanent thing.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2648.440000" data-stop="2651.519000">So I can say, okay, all of my Emacs related tasks will get</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2651.520000" data-stop="2656.267000">automatically refiled to my Emacs category without my having to do</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2656.268000" data-stop="2657.639000">that manually.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="2657.640000" data-stop="2660.599000"><strong class="speaker-name">Shae:</strong> So you're using tagging because I kept trying to do tagging</span> <span class="audio-time caption" data-speaker="Shae" data-start="2660.600000" data-stop="2661.519000">and never quite did it.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2661.520000" data-stop="2664.479000"><strong class="speaker-name">Sacha:</strong> I use tagging sometimes when I remember it, but this is also</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2664.480000" data-stop="2665.279000">why I use the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2665.280000" data-stop="2669.519000">The regular expression match against the title.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2669.520000" data-stop="2674.599000">I'm using Orgzly on Android to capture the thing on my phone.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2674.600000" data-stop="2677.599000">I might want to say this is a consulting task.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2677.600000" data-stop="2682.299000">File it in the right place so it doesn't get lost in my inbox.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="2682.300000" data-stop="2683.967000"><strong class="speaker-name">Shae:</strong> Wow.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2683.968000" data-stop="2688.259000">When is your interview so I can learn from your tricks?</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2688.260000" data-stop="2693.500000"><strong class="speaker-name">Sacha:</strong> This is now. Here we go! You can ask questions.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2693.501000" data-stop="2699.767000">The nice thing about conversations is that we jostle different ideas,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2699.868000" data-stop="2702.600000">and we are like, oh yeah, maybe I should write a blog post about that,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2702.601000" data-stop="2703.459000">because I take it for granted.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2703.460000" data-stop="2707.179000">So now apparently I have to write a blog post about my</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2707.180000" data-stop="2709.339000">cleaning up process.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2709.340000" data-stop="2710.979000">My inbox is very long.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2710.980000" data-stop="2714.459000">The other thing, speaking of dealing with really long lists that I</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2714.460000" data-stop="2718.219000">picked up from John Wiegley was I also sometimes remember to check</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2718.220000" data-stop="2719.979000">this list of random items.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2719.980000" data-stop="2726.379000">So in my agenda, there's also like this, you know, random selection</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2726.380000" data-stop="2730.939000">of things that I have not gotten around to thinking about further,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2730.940000" data-stop="2734.939000">but it's there just in case serendipity or boredom make me do</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2734.940000" data-stop="2736.799000">something.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="2736.800000" data-stop="2741.299000"><strong class="speaker-name">Shae:</strong> you know that's... I've thought about having...</span> <span class="audio-time caption" data-speaker="Shae" data-start="2741.300000" data-stop="2744.819000">because you know, I've got the pop-up this little timer that pops up</span> <span class="audio-time caption" data-speaker="Shae" data-start="2744.820000" data-stop="2747.579000">my agenda, but I've thought about maybe adding a section I don't know</span> <span class="audio-time caption" data-speaker="Shae" data-start="2747.580000" data-stop="2751.019000">if I could add a section here but it would be something that says</span> <span class="audio-time caption" data-speaker="Shae" data-start="2751.020000" data-stop="2754.819000">like at the bottom here's two or three random to-do's that have been</span> <span class="audio-time caption" data-speaker="Shae" data-start="2754.820000" data-stop="2755.579000">open for a while just like</span> <span class="audio-time caption" data-speaker="Shae" data-start="2755.580000" data-stop="2757.899000">for garbage collection.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2757.900000" data-stop="2760.979000">Because I know that in Jujutsu, I've got a cool little query that</span> <span class="audio-time caption" data-speaker="Shae" data-start="2760.980000" data-stop="2764.459000">says, if you have any change sets that are more than two weeks old</span> <span class="audio-time caption" data-speaker="Shae" data-start="2764.460000" data-stop="2767.659000">and are not in a permanent branch state, maybe you should do</span> <span class="audio-time caption" data-speaker="Shae" data-start="2767.660000" data-stop="2768.539000">something about them.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2768.540000" data-stop="2769.619000">It's just called to do.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2769.620000" data-stop="2773.379000">It'd be kind of nice to have that for Org Mode as well.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2773.380000" data-stop="2777.099000"><strong class="speaker-name">Sacha:</strong> Yeah, it's just, you know, and our brains do these strange</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2777.100000" data-stop="2778.539000">things with randomness, right?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2778.540000" data-stop="2781.359000">They're like, oh, I want to see what's new now.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="2781.360000" data-stop="2782.979000"><strong class="speaker-name">Shae:</strong> Right, right, yeah.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2782.980000" data-stop="2784.379000">Oh, I have a question.</span> <span class="audio-time caption" data-speaker="Shae" data-start="2784.380000" data-stop="2788.179000">You have this thing where you had...</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2788.000000">46:28</span> <strong>Timestamps</strong></div><p></p><span class="audio-time caption" data-speaker="Shae" data-start="2788.180000" data-stop="2790.099000"><strong class="speaker-name">Shae:</strong> I saw you taking notes with Prot,</span> <span class="audio-time caption" data-speaker="Shae" data-start="2790.100000" data-stop="2791.739000">and you had this timestamp.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2791.740000" data-stop="2792.579000"><strong class="speaker-name">Sacha:</strong> Oh, yeah, yeah, yeah.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2792.580000" data-stop="2793.979000">I'm using it now.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2793.980000" data-stop="2794.939000">Okay, okay.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2794.940000" data-stop="2796.619000">So I have it bound two ways now.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2796.620000" data-stop="2799.939000">I have it as a dabbrev, so dynamic abbreviation, and I also have it</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2799.940000" data-stop="2806.499000">as a yasnippet because sometimes I'm using it with either SPC or</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2806.500000" data-stop="2807.979000">tab to complete it.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2807.980000" data-stop="2812.339000">And I don't really want to think, I just want to get the timestamp in</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2812.340000" data-stop="2813.019000">and then move on.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2813.020000" data-stop="2818.979000">And so abbrevs can run functions to evaluate it.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2818.980000" data-stop="2821.939000">You can insert the timestamp that way.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2821.940000" data-stop="2825.419000">Or yesnippet, of course, can evaluate the thing.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2825.420000" data-stop="2826.379000">And now I have those.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2826.380000" data-stop="2829.659000">It's basically just a wall-clock time so that I can go back and plop</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2829.660000" data-stop="2834.299000">in the chapters as time offsets, which are automatically calculated</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2834.300000" data-stop="2836.299000">from the YouTube data on when the stream started.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2836.300000" data-stop="2840.019000">So I don't have to manually calculate my chapters.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2840.020000" data-stop="2843.819000">But it's super useful to have these times everywhere.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2843.820000" data-stop="2846.979000">And in this case, during a conversation, I want to be able to say,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2846.980000" data-stop="2850.139000">hey, we talked about something interesting.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2850.140000" data-stop="2854.739000">And then be able to go back to that point in the video later on.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="2854.740000" data-stop="2855.859000"><strong class="speaker-name">Shae:</strong> So you're matching?</span> <span class="audio-time caption" data-speaker="Shae" data-start="2855.860000" data-stop="2858.339000">Oh, oh, wow.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2858.340000" data-stop="2859.099000"><strong class="speaker-name">Sacha:</strong> So my shortcut for yasnippet is "ot" because</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2859.100000" data-stop="2865.739000">I never type "ot" elsewhere, and it's close enough.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2865.740000" data-stop="2870.833000">I use Dvorak, so my O is on home row, and T is close by.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2870.834000" data-stop="2874.267000">Also, on the other hand... There you go.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="2874.268000" data-stop="2875.867000"><strong class="speaker-name">Shae:</strong> Did I already show you that this is actually Dvorak?</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2875.868000" data-stop="2877.067000"><strong class="speaker-name">Sacha:</strong> Oh, there you go.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2877.068000" data-stop="2878.779000">Now I can see the keycaps.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2878.780000" data-stop="2882.499000">Yeah, earlier it was kind of blurry, but now, yes, yes.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2882.500000" data-stop="2886.139000">So yes, that is my shortcut for inserting the timestamp.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2886.140000" data-stop="2891.059000">I previously added seconds as well, but then I realized that my kind</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2891.060000" data-stop="2892.459000">might be false precision.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2892.460000" data-stop="2895.699000">So I just, you know, just use a minute at the moment and then I go</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2895.700000" data-stop="2898.699000">back and adjust the timestamps a little bit later.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2898.700000" data-stop="2902.899000">But yeah, you can use abbreviations for all sorts of things,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2902.900000" data-stop="2907.140000">including times and dates and stuff.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="2907.141000" data-stop="2910.200000"><strong class="speaker-name">Shae:</strong> Have you ever tried Org timestamp?</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2910.201000" data-stop="2911.659000"><strong class="speaker-name">Sacha:</strong> Yeah, Org timer.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2911.660000" data-stop="2914.619000">So Org timer gives you a relative timestamp, right?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2914.620000" data-stop="2915.579000">You can say Org timer.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2915.580000" data-stop="2916.019000">Oh, okay.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2916.020000" data-stop="2919.999000">So, sorry.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2920.000000" data-stop="2924.219000">Are you talking about the C-u C-c ! or something</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2924.220000" data-stop="2926.219000">of that sort?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2926.220000" data-stop="2930.259000">So that's actually what I initially was doing, but then it was too</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2930.260000" data-stop="2934.819000">many keystroke word modifiers to remember.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2934.820000" data-stop="2937.979000">And then I had to press RET to select the, you know, thing.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2937.980000" data-stop="2941.739000">So now I just have an abbreviation insert the Org mode formatted</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2941.740000" data-stop="2944.779000">timestamp for me.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2944.780000" data-stop="2949.659000">And then I have this code that searches for Org timestamp regular</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2949.660000" data-stop="2952.859000">expression and then does the calculation and conversion and stuff.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2952.000000">49:12</span> <strong>Org timers
</strong></div><p></p><a href="https://sachachua.com/blog/feed/atom/ec22-shae-erisson-00-53-52-300.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/feed/atom/ec22-shae-erisson-00-53-52-300.jpg" alt="image from video 00:53:52.300" data-time="00:53:52.300"></a><span class="audio-time caption" data-speaker="Sacha" data-start="2952.860000" data-stop="2954.579000"><strong class="speaker-name">Sacha:</strong> So Org timer is a separate thing.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2954.580000" data-stop="2959.419000">It's useful for meetings and things like that.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2959.420000" data-stop="2961.619000">You would say, okay, your Org timer starts at the beginning of the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2961.620000" data-stop="2965.059000">meeting and then you can have a list and it automatically, like if</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2965.060000" data-stop="2968.019000">you alt shift enter or something like that in the list, it'll</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2968.020000" data-stop="2973.539000">automatically like insert the right timer, relative timer to it.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2973.540000" data-stop="2974.059000">There you go.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2974.060000" data-stop="2975.819000">So there's an org-timer-start.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2975.820000" data-stop="2980.899000">But the reason I didn't go that approach was because then you A. have</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2980.900000" data-stop="2984.819000">to remember to actually start the timer and B. then you have to</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2984.820000" data-stop="2987.219000">synchronize your time with video time.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2987.220000" data-stop="2990.939000">Which might not have started at the same time.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2990.940000" data-stop="2995.619000">So now I'm just like, okay, wall clock for everything.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2995.620000" data-stop="2996.420000">And then I can do the transformation with whatever I like.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2996.421000" data-stop="3001.167000">And since I'm editing my subtitles in Emacs, I can say, hey, this</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3001.168000" data-stop="3003.767000">file started at this time, according to YouTube.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3003.768000" data-stop="3008.733000">And then just, you know, map all of the wall clocks to the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3008.734000" data-stop="3012.233000">appropriate subtitle times.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="3012.234000" data-stop="3015.659000"><strong class="speaker-name">Shae:</strong> Wow. That's really cool.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3015.660000" data-stop="3022.419000"><strong class="speaker-name">Sacha:</strong> Anyway, so timers, relative, absolute, and using</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3022.420000" data-stop="3024.499000">abbreviations is great.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3024.500000" data-stop="3027.339000">Which I think actually is a thing that I picked up from Karl.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3027.340000" data-stop="3032.939000">Karl Voit because he also likes to use... He has an abbreviation,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3032.940000" data-stop="3037.539000">not at the Emacs level, but he has an abbreviation on his system level,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3037.540000" data-stop="3040.939000">like with his window manager, so he can use this timestamp trick</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3040.940000" data-stop="3044.967000">anywhere, including in Etherpad or wherever else where you</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3044.968000" data-stop="3051.467000">want to insert the date and time. That's V-o-i-t, by the way.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3051.468000" data-stop="3057.200000">But yeah, so times are a great way to just</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3057.201000" data-stop="3059.980000">leave yourself a pointer to that moment</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3059.981000" data-stop="3062.419000">so you can go back to it later.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="3062.420000" data-stop="3067.779000"><strong class="speaker-name">Shae:</strong> Now I'm curious, how well does that integrate with this sort</span> <span class="audio-time caption" data-speaker="Shae" data-start="3067.780000" data-stop="3068.379000">of thing?</span> <span class="audio-time caption" data-speaker="Shae" data-start="3068.380000" data-stop="3072.539000">Because I really like looking back at my history agenda.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3072.540000" data-stop="3077.767000"><strong class="speaker-name">Sacha:</strong> If you have it insert an inactive timestamp, I think it</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3077.768000" data-stop="3083.119000">should still show up there.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3083.120000" data-stop="3087.380000">I think it will be a little like those.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="3087.381000" data-stop="3089.967000"><strong class="speaker-name">Shae:</strong> Yeah, it looks like the...</span> <span class="audio-time caption" data-speaker="Shae" data-start="3089.968000" data-stop="3092.100000">Well, it looks like these two are showing up.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3092.101000" data-stop="3093.433000"><strong class="speaker-name">Sacha:</strong> Yeah, yeah, yeah.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3093.434000" data-stop="3099.600000">Yeah, so that's a basic thing that I would have inserted by my either</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3099.601000" data-stop="3104.267000">abbrev or... So it's not even dabbrev.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3104.268000" data-stop="3106.759000">It's just regular abbrev in Emacs.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="3106.760000" data-stop="3108.259000"><strong class="speaker-name">Shae:</strong> What's the difference?</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3108.260000" data-stop="3112.939000"><strong class="speaker-name">Sacha:</strong> dabbrev is like hippie...</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3112.940000" data-stop="3116.259000">Okay, let me just double check here.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3116.260000" data-stop="3122.579000">I feel like dabbrev is sort of hippie expand-ish.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3122.580000" data-stop="3127.800000">It looks in your buffer or possibly other buffers.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3127.801000" data-stop="3133.900000">And I think hippie-expand and dabbrev, they kind of work together.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3133.901000" data-stop="3137.633000">It's an option to have them work together.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3137.634000" data-stop="3142.619000">Okay, so hippie-expand is...</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3142.620000" data-stop="3141.099000">Oh, so I see.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3141.100000" data-stop="3145.767000">Hippie-expand is the more advanced version of dabbrev.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3145.768000" data-stop="3150.160000">dabbrev was Dynamic Expand, and Hippie Expand says, yes, that, but</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3150.161000" data-stop="3152.367000">try a whole bunch of other things first.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3152.368000" data-stop="3156.100000">But my timestamp thing is actually just done by a regular abbrev,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3156.101000" data-stop="3165.500000">and I will find the thing in my config for "ot".</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3165.501000" data-stop="3174.219000">Oh, yeah. I will put it in my chat.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="3174.220000" data-stop="3177.733000"><strong class="speaker-name">Shae:</strong> My spelling, most people say my emails are spelled really well,</span> <span class="audio-time caption" data-speaker="Shae" data-start="3177.734000" data-stop="3182.167000">but it's only because I have ispell set up.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3182.168000" data-stop="3187.767000"><strong class="speaker-name">Sacha:</strong> Yeah, ispell is great. I am learning French and therefore...</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="3187.768000" data-stop="3191.099000"><strong class="speaker-name">Shae:</strong> Oh, c'est très bien.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3191.100000" data-stop="3191.779000">Je parle un peu de français aussi.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3191.780000" data-stop="3192.459000"><strong class="speaker-name">Sacha:</strong> Oh, oui.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3192.460000" data-stop="3195.667000">I'm keeping a journal in French on my blog</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3195.668000" data-stop="3200.933000">and I have the Tatoeba Project with all the example sentences</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3200.934000" data-stop="3204.000000">and I have a consult interface to look up stuff in them</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3204.001000" data-stop="3207.000000">so I can just borrow other people's words</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3207.001000" data-stop="3209.619000">and try to make it sound more natural.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3209.620000" data-stop="3211.333000">Plus of course the usual</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3211.334000" data-stop="3212.899000">searching for words in dictionaries and stuff.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3212.900000" data-stop="3216.659000">Anyway, in the chat, I put in my global abbrev table definition for</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3216.660000" data-stop="3218.259000">insert format time string.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3218.260000" data-stop="3221.260000">In case you want to steal that, it's right there.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="3221.301000" data-stop="3225.140000"><strong class="speaker-name">Shae:</strong> I will definitely save that into my notes here.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3233.000000">53:53</span> <strong>Org Mode snippets</strong></div><p></p><span class="audio-time caption" data-speaker="Shae" data-start="3233.640000" data-stop="3236.779000"><strong class="speaker-name">Shae:</strong> Another thing I use a lot is I use</span> <span class="audio-time caption" data-speaker="Shae" data-start="3236.780000" data-stop="3240.779000">Org Mode snippets.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3240.780000" data-stop="3246.859000">I will tell you that the first time, I guess if I look back at...</span> <span class="audio-time caption" data-speaker="Shae" data-start="3246.860000" data-stop="3254.219000">This is another thing that I have done a lot of in the past, which is</span> <span class="audio-time caption" data-speaker="Shae" data-start="3254.220000" data-stop="3254.579000">where...</span> <span class="audio-time caption" data-speaker="Shae" data-start="3254.580000" data-stop="3258.433000">I love the fact that Org Mode snippets are just executable.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3258.434000" data-stop="3260.667000">I can just run them.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3260.668000" data-stop="3264.733000">I guess two jobs, three jobs ago, there was a case where, because I</span> <span class="audio-time caption" data-speaker="Shae" data-start="3264.734000" data-stop="3267.367000">would keep the results around and look at them, there was a case</span> <span class="audio-time caption" data-speaker="Shae" data-start="3267.368000" data-stop="3271.100000">where, I guess a couple of months before, something got shipped to a</span> <span class="audio-time caption" data-speaker="Shae" data-start="3271.101000" data-stop="3275.133000">customer, and I noticed our database schema had changed and I</span> <span class="audio-time caption" data-speaker="Shae" data-start="3275.134000" data-stop="3280.100000">prevented a tremendous amount of upset and emergency by being like</span> <span class="audio-time caption" data-speaker="Shae" data-start="3280.080000" data-stop="3283.240000">this doesn't look great. I got one from two weeks ago, and it does</span> <span class="audio-time caption" data-speaker="Shae" data-start="3283.240000" data-stop="3287.120000">not match. Something's wrong here. Everybody's like, I don't think</span> <span class="audio-time caption" data-speaker="Shae" data-start="3287.120000" data-stop="3288.720000">so, Shae. And I'm, like, no no no, we do have a problem, we've got to</span> <span class="audio-time caption" data-speaker="Shae" data-start="3288.720000" data-stop="3293.720000">fix this. And they were, like, oh crap! And then I was like, yeah,</span> <span class="audio-time caption" data-speaker="Shae" data-start="3293.720000" data-stop="3296.559000">solved a problem!</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3296.560000" data-stop="3300.539000"><strong class="speaker-name">Sacha:</strong> Yeah, I basically try to do as much in a snippet instead of</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3300.540000" data-stop="3304.139000">in, you know, in a scratch buffer or whatever, just because having</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3304.140000" data-stop="3308.059000">that record, the fact that I did it, and also any notes that I had</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3308.060000" data-stop="3313.739000">leading up to it and the output of it, it's just so helpful.</span> <p></p><a href="https://sachachua.com/blog/feed/atom/ec22-shae-erisson-00-55-39-300.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/feed/atom/ec22-shae-erisson-00-55-39-300.jpg" alt="image from video 00:55:39.300" data-time="00:55:39.300"></a><span class="audio-time caption" data-speaker="Shae" data-start="3313.740000" data-stop="3317.059000"><strong class="speaker-name">Shae:</strong> Oh, I've got a cool thing that I'm doing for work.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3317.060000" data-stop="3324.539000">And that is that our readme file is not only a word file, but we also</span> <span class="audio-time caption" data-speaker="Shae" data-start="3324.540000" data-stop="3329.899000">have the demonstration of our actual thing is done by using like</span> <span class="audio-time caption" data-speaker="Shae" data-start="3329.900000" data-stop="3333.939000">dependent snippets.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3333.940000" data-stop="3337.539000">And so that means that like if you want that, perhaps this is</span> <span class="audio-time caption" data-speaker="Shae" data-start="3337.540000" data-stop="3342.339000">something everyone already knows, I don't know, but we basically are</span> <span class="audio-time caption" data-speaker="Shae" data-start="3342.340000" data-stop="3346.819000">using the results of earlier commands in later places.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3346.820000" data-stop="3350.259000">And the other nice thing about that is that then when we want to</span> <span class="audio-time caption" data-speaker="Shae" data-start="3350.260000" data-stop="3352.659000">check, we have to effectively dock tests, right?</span> <span class="audio-time caption" data-speaker="Shae" data-start="3352.660000" data-stop="3355.339000">When we want to check and see if our software works the way it does</span> <span class="audio-time caption" data-speaker="Shae" data-start="3355.340000" data-stop="3359.419000">in the readme, we evaluate the final Org Mode snippet, which then</span> <span class="audio-time caption" data-speaker="Shae" data-start="3359.420000" data-stop="3361.134000">calls it forward, calls it forward,</span> <span class="audio-time caption" data-speaker="Shae" data-start="3361.135000" data-stop="3363.099000">and then if something goes up or not.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3363.100000" data-stop="3366.139000">Well, I guess I need to fix something.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3366.140000" data-stop="3369.219000">And so it was pretty exciting to put Org Mode niftyness into our,</span> <span class="audio-time caption" data-speaker="Shae" data-start="3369.220000" data-stop="3371.639000">into my Word reading file, you know?</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3371.640000" data-stop="3372.833000"><strong class="speaker-name">Sacha:</strong> Nice, nice.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3372.834000" data-stop="3375.619000">And you did mention your other coworker is on board with the whole</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3375.620000" data-stop="3376.339000">Emacs thing.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3376.340000" data-stop="3379.459000">So that's one of the things that people are often like, I want to use</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3379.460000" data-stop="3382.459000">Org Mode and I want to use it for like the documentation or the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3382.460000" data-stop="3385.019000">testing or whatever, but they got to get everyone else on board with</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3385.020000" data-stop="3385.419000">the thing.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3385.420000" data-stop="3390.239000">Otherwise it's Jupyter Notebooks or whatever else, right?</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="3390.240000" data-stop="3390.733000"><strong class="speaker-name">Shae:</strong> Right.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3390.734000" data-stop="3393.099000">Okay, so I have a joke for you that I came up with a long time ago,</span> <span class="audio-time caption" data-speaker="Shae" data-start="3393.100000" data-stop="3396.859000">and that is, do you know the only way, there's only one way that</span> <span class="audio-time caption" data-speaker="Shae" data-start="3396.860000" data-stop="3400.139000">Sauron could have organized the invasion of Middle-earth, and do you</span> <span class="audio-time caption" data-speaker="Shae" data-start="3400.140000" data-stop="3400.939000">know what he used?</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3400.940000" data-stop="3402.200000"><strong class="speaker-name">Sacha:</strong> What?</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="3402.201000" data-stop="3408.699000"><strong class="speaker-name">Shae:</strong> Orc Mode.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3408.700000" data-stop="3415.379000">It's a terrible joke, isn't it?</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3415.380000" data-stop="3416.200000"><strong class="speaker-name">Sacha:</strong> That's okay.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3416.201000" data-stop="3420.199000">I'm sure someone in the comments will come up with an even worse pun.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="3420.200000" data-stop="3421.133000"><strong class="speaker-name">Shae:</strong> I'm excited!</span> <span class="audio-time caption" data-speaker="Shae" data-start="3421.134000" data-stop="3424.179000">It's going to be great!</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3424.180000" data-stop="3427.139000"><strong class="speaker-name">Sacha:</strong> Never underestimate the punniness of the Emacs</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3427.140000" data-stop="3430.059000">community.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="3430.060000" data-stop="3431.300000"><strong class="speaker-name">Shae:</strong> I completely agree.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3431.301000" data-stop="3434.259000">I don't know.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3434.260000" data-stop="3435.459000">Do I have anything else exciting in here?</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3435.000000">57:15</span> <strong>Compilation finish function: handle success
</strong></div><p></p><a href="https://sachachua.com/blog/feed/atom/ec22-shae-erisson-00-57-48-300.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/feed/atom/ec22-shae-erisson-00-57-48-300.jpg" alt="image from video 00:57:48.300" data-time="00:57:48.300"></a><span class="audio-time caption" data-speaker="Shae" data-start="3435.460000" data-stop="3436.733000"><strong class="speaker-name">Shae:</strong> I actually really like this one.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3436.734000" data-stop="3443.459000">I used to run all of my tests in compile.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3443.460000" data-stop="3446.019000">F12, I have F12 bound to compile.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3446.020000" data-stop="3449.219000">And one of the things I wanted was, I wanted something where it was,</span> <span class="audio-time caption" data-speaker="Shae" data-start="3449.220000" data-stop="3452.539000">if the compile is successful, don't show me the results, because</span> <span class="audio-time caption" data-speaker="Shae" data-start="3452.540000" data-stop="3453.299000">everything's good.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3453.300000" data-stop="3459.499000">And so since I'm doing stuff in Rust, when I run all the tests, it</span> <span class="audio-time caption" data-speaker="Shae" data-start="3459.500000" data-stop="3462.659000">leaves the buffer up, and I need to get around to actually doing</span> <span class="audio-time caption" data-speaker="Shae" data-start="3462.660000" data-stop="3465.659000">stuff like this for Rustic mode as well, where when the tests pass,</span> <span class="audio-time caption" data-speaker="Shae" data-start="3465.660000" data-stop="3467.459000">just go away, because it's all good.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3467.460000" data-stop="3469.499000">And when the tests don't pass, show me where to...</span> <span class="audio-time caption" data-speaker="Shae" data-start="3469.500000" data-stop="3472.699000">I need to look at the problem.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3472.700000" data-stop="3478.099000">And I got this from Enberg and Emacs, I don't know, 20 years ago.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3478.100000" data-stop="3483.579000">Maybe it was less than 20 years ago, but it probably wasn't.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3483.580000" data-stop="3487.059000">So yeah, there's so much good stuff.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3487.060000" data-stop="3491.779000">Yeah, there's just so much good stuff.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3491.780000" data-stop="3494.939000">And I also like to, oh, look, here we go.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3494.940000" data-stop="3497.899000">You can see that this is long gone, by the way.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3497.900000" data-stop="3501.539000">It's not there anymore.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3501.540000" data-stop="3506.099000"><strong class="speaker-name">Sacha:</strong> I have a proper, you know, it's sachachua.com/dotemacs.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3506.100000" data-stop="3507.979000">A lot easier to remember.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3507.980000" data-stop="3516.699000">But yeah, and I think that's, yeah, yeah, I remember that now.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3516.700000" data-stop="3518.859000">defadvice is also obsolete.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3518.860000" data-stop="3523.366000">The new hotness is advice-add or something like that.</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="3523.367000" data-stop="3531.219000"><strong class="speaker-name">Shae:</strong> Oh, really? I'm going to make another TODO item for there.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3531.220000" data-stop="3533.567000"><strong class="speaker-name">Sacha:</strong> I was digging through my notes trying to find, do you share</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3533.568000" data-stop="3536.119000">your config anywhere?</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="3536.120000" data-stop="3537.619000"><strong class="speaker-name">Shae:</strong> No, but you know, at this point if I share it on YouTube, I</span> <span class="audio-time caption" data-speaker="Shae" data-start="3537.620000" data-stop="3541.259000">might as well just throw it up somewhere.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3541.260000" data-stop="3541.699000">Why not?</span> <span class="audio-time caption" data-speaker="Shae" data-start="3541.700000" data-stop="3543.179000">It's not very exciting.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3543.180000" data-stop="3546.459000">Like if you look at someone like Ross Baker who has magic, like wow,</span> <span class="audio-time caption" data-speaker="Shae" data-start="3546.460000" data-stop="3548.659000">is there some magic coming in from Ross Baker?</span> <span class="audio-time caption" data-speaker="Shae" data-start="3548.660000" data-stop="3551.179000">I'm so excited to see more stuff from him.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3551.180000" data-stop="3557.019000">There's just like, I guess I feel like compared to almost everybody</span> <span class="audio-time caption" data-speaker="Shae" data-start="3557.020000" data-stop="3558.579000">else I know, I feel like a power user.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3558.580000" data-stop="3561.099000">Because I'm like, you know, I wish I could do this thing.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3561.100000" data-stop="3563.339000">A lot of times someone I know is like, well, I did that thing and</span> <span class="audio-time caption" data-speaker="Shae" data-start="3563.340000" data-stop="3564.179000">here's a library.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3564.180000" data-stop="3566.379000">And I'm like, yeah, I'll have to do it.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3566.380000" data-stop="3569.779000">And I just, I guess I feel like I'm a power user.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3569.780000" data-stop="3573.459000">And on the good side, I guess I kind of,</span> <span class="audio-time caption" data-speaker="Shae" data-start="3573.460000" data-stop="3577.099000">I really haven't written that much Elisp ever, like I was saying in</span> <span class="audio-time caption" data-speaker="Shae" data-start="3577.100000" data-stop="3578.779000">the comments during your interview with Prot.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3578.780000" data-stop="3582.499000">And I kind of like to, it's just I guess it's never quite gotten to</span> <span class="audio-time caption" data-speaker="Shae" data-start="3582.500000" data-stop="3583.499000">the top of my stack.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3583.500000" data-stop="3587.339000">And I did decide it was time for me to send money to Parade for at</span> <span class="audio-time caption" data-speaker="Shae" data-start="3587.340000" data-stop="3591.179000">least for themes, if not for like, please teach me some Elisp so I</span> <span class="audio-time caption" data-speaker="Shae" data-start="3591.180000" data-stop="3594.299000">can actually, because you know, it's not that Elisp is hard.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3594.300000" data-stop="3599.019000">It's more like, how do I kind of, what are the things I interact with?</span> <span class="audio-time caption" data-speaker="Shae" data-start="3599.020000" data-stop="3601.379000">What are the words?</span> <span class="audio-time caption" data-speaker="Shae" data-start="3601.380000" data-stop="3605.059000">What's the vocabulary of working with Emacs?</span> <span class="audio-time caption" data-speaker="Shae" data-start="3605.060000" data-stop="3606.499000">I don't actually really know.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3606.500000" data-stop="3608.779000">As a user, sure, I can do cool stuff.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3608.780000" data-stop="3609.939000">I can do Lisp macros.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3609.940000" data-stop="3614.319000">I've done Scheme and Lisp some of the past, but not inside Emacs.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3614.320000" data-stop="3615.979000"><strong class="speaker-name">Sacha:</strong> Alright, so let me clarify.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3615.980000" data-stop="3620.139000">After more than 20 years of using Emacs, did you say you feel like a</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3620.140000" data-stop="3622.799000">power user or do not feel like a power user?</span> <p></p><span class="audio-time caption" data-speaker="Shae" data-start="3622.800000" data-stop="3625.699000"><strong class="speaker-name">Shae:</strong> I definitely feel like a power user, but I don't feel like</span> <span class="audio-time caption" data-speaker="Shae" data-start="3625.700000" data-stop="3627.859000">someone who does much of anything with Elisp.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3627.860000" data-stop="3630.179000">I don't really feel like someone who has much of a clue in the</span> <span class="audio-time caption" data-speaker="Shae" data-start="3630.180000" data-stop="3630.539000">internals.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3630.540000" data-stop="3632.779000">And that's not entirely true.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3632.780000" data-stop="3634.339000">I have some of the ideas.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3634.340000" data-stop="3639.059000">But for the most part, I haven't actually needed to know that much</span> <span class="audio-time caption" data-speaker="Shae" data-start="3639.060000" data-stop="3640.339000">about the internals.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3640.340000" data-stop="3644.299000">And sure, I've dug into things like how do you efficiently work with</span> <span class="audio-time caption" data-speaker="Shae" data-start="3644.300000" data-stop="3648.499000">large buffers in your ??, like the ropes data structure and</span> <span class="audio-time caption" data-speaker="Shae" data-start="3648.500000" data-stop="3649.139000">stuff like that.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3649.140000" data-stop="3650.919000">That was more for fun.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3650.920000" data-stop="3654.099000">Although it is something that Emacs does and does extremely well.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3654.100000" data-stop="3657.099000">But I'd kind of like to...</span> <span class="audio-time caption" data-speaker="Shae" data-start="3657.100000" data-stop="3660.200000">There's a lot of things I'd kind of like to change and I don't really</span> <span class="audio-time caption" data-speaker="Shae" data-start="3660.201000" data-stop="3663.359000">have enough of the understanding of the kind of how I would write the</span> <span class="audio-time caption" data-speaker="Shae" data-start="3663.360000" data-stop="3665.067000">Elisp to do it.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3665.068000" data-stop="3666.000000">Here's a good example.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3666.001000" data-stop="3669.200000">When I hit F3, it takes me to the one I'm currently clocked into.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3669.201000" data-stop="3675.833000">Unless I haven't clocked in to something since I started Emacs.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3675.834000" data-stop="3678.100000">And honestly, I would like to use something like org-ql,</span> <span class="audio-time caption" data-speaker="Shae" data-start="3678.101000" data-stop="3680.700000">the Org query language, to go find</span> <span class="audio-time caption" data-speaker="Shae" data-start="3680.701000" data-stop="3682.400000">if I've just started Emacs,</span> <span class="audio-time caption" data-speaker="Shae" data-start="3682.401000" data-stop="3685.833000">and Org does not know about something, you know,</span> <span class="audio-time caption" data-speaker="Shae" data-start="3685.834000" data-stop="3687.000000">I just want you to go search for it.</span> <span class="audio-time caption" data-speaker="Shae" data-start="3687.001000" data-stop="3689.200000">I have so many cores and so much memory,</span> <span class="audio-time caption" data-speaker="Shae" data-start="3689.201000" data-stop="3690.567000">just go find it.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3690.568000" data-stop="3694.400000"><strong class="speaker-name">Sacha:</strong> That sounds like an excellent reason to go learn Emacs</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3694.401000" data-stop="3692.339000">so that you can have it...</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3692.340000" data-stop="3699.079000">If you're not currently clocked in, go find the most recent</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3699.080000" data-stop="3702.579000">clocked in task and go there, or maybe present you with a list of</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3702.580000" data-stop="3707.039000">things and then go from there.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3707.040000" data-stop="3710.659000">I would love to hear about your Emacs Lisp learning journey because</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3710.660000" data-stop="3714.459000">that's one of the big things that moves people from, you know, power</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3714.460000" data-stop="3722.119000">users, yes, but users, to using Emacs as a lightweight editor toolkit</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3722.120000" data-stop="3725.500000">for something that's custom fit to exactly what their workflow is.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3725.501000" data-stop="3728.400000">And on that note, I'm going to try to wrap up gracefully before the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3728.401000" data-stop="3731.700000">kiddo, you know, just like drags me out here.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3731.701000" data-stop="3735.633000">Thank you so much for doing this.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3735.634000" data-stop="3737.100000">I look forward to more conversations.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3737.101000" data-stop="3742.559000">I'm going to post the transcript and other things like that pretty</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3742.560000" data-stop="3745.619000">quickly, I think, because I have this nice workflow now that lets me</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3745.620000" data-stop="3749.410000">take screenshots and everything, but there's so much here that I want</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3749.411000" data-stop="3751.733000">to unpack. But I hear the kiddo, bye!</span></div>
<p></p>

<p>
#+begin_export 11ty
</p>

<p>
               &lt;a name="end-ec22-transcript"&gt;&lt;/a&gt;&lt;/details&gt;
#+end_exportbvt
</p>
</div>
</details></div>
<div id="outline-container-emacs-chat-22-shae-erisson-chat" class="outline-3">
<h3 id="emacs-chat-22-shae-erisson-chat">Chat</h3>
<div class="outline-text-3" id="text-emacs-chat-22-shae-erisson-chat">
<ul class="org-ul">
<li>JacksonScholberg: ​​Emacs is fun</li>
<li>JacksonScholberg: ​Apple's touchpad is another option</li>
<li>JacksonScholberg: ​Trackpad</li>
<li>JacksonScholberg: ​Lol</li>
<li>JacksonScholberg: ​I was curious about what you are tracking your time working on</li>
<li>JacksonScholberg: ​How you track it.</li>
<li>JacksonScholberg: ​You clock in and out to what you are working on. I like that idea.</li>
<li>Bezaar.musicc: ​​That's great!</li>
<li>PuercoPop: ​​the buffer api (properties) is the hardest part for me</li>
<li>charliemcmackin4859: ​​I think you still have a timer going, btw</li>
</ul>

<p>
Find more Emacs Chats or join the fun: <a href="https://sachachua.com/emacs-chat">https://sachachua.com/emacs-chat</a></p>
</div>
</div>
<div><a href="https://sachachua.com/blog/2026/05/may-7-emacs-chat-with-shae-erisson/index.org">View Org source for this post</a></div></div><p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2026%2F05%2Fmay-7-emacs-chat-with-shae-erisson%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">Emacs Chat 21: Amin Bandali</title>
		<link rel="alternate" type="text/html" href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/"/>
		<author><name><![CDATA[Sacha Chua]]></name></author>
		<updated>2026-05-09T03:02:00Z</updated>
    <published>2026-05-04T18:28:11Z</published>
    <category term="emacs" />
<category term="emacs-chat-podcast" />
<category term="emacs-chat" />
		<id>https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/</id>
		<content type="html"><![CDATA[<div class="sticky-toc" id="org001b227">
<div id="text-table-of-contents" role="doc-toc">
<ul>
<li><a href="https://sachachua.com/blog/feed/atom/index.xml#current-notes-for-next-time-emacs-chat-21-amin-bandali-rough-notes-during-our-chat">Chapters</a></li>
<li><a href="https://sachachua.com/blog/feed/atom/index.xml#current-notes-for-next-time-emacs-chat-21-amin-bandali-transcript">Transcript</a></li>
<li><a href="https://sachachua.com/blog/feed/atom/index.xml#current-notes-for-next-time-emacs-chat-21-amin-bandali-chat">Chat</a></li>
</ul>
</div>

</div>

<div class="update" id="org6c333c2">
<ul class="org-ul">
<li><span class="timestamp-wrapper"><time class="timestamp" datetime="2026-05-08">[2026-05-08 Fri]</time></span>: Updated with Amin's changes.</li>
<li><span class="timestamp-wrapper"><time class="timestamp" datetime="2026-05-07">[2026-05-07 Thu]</time></span>: Added file enclosure so that it can load as a proper podcast.</li>
</ul>

</div>

<p>
I chatted with Amin Bandali about Emacs, configuration, EXWM, keybindings, audio, and life.
<video controls="1" src="https://archive.org/download/ec21-amin-bandali/ec21-amin-bandali.mp4" type="video/mp4"><track kind="subtitles" label="Captions" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/ec21-amin-bandali.vtt" srclang="en" default=""></video>
</p>

<p>
<a href="https://archive.org/details/ec21-amin-bandali">View it via the Internet Archive</a>, <a href="https://youtube.com/live/ZiTQt8q1Ybc">watch/comment on YouTube</a>, <a href="https://sachachua.com/blog/feed/atom/index.xml#ID-ec21-transcript">read the transcript online</a>, <a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/ec21-amin-bandali.vtt">download the transcript</a>, or <a href="mailto:sacha@sachachua.com">e-mail me</a> your thoughts!
</p>

<p>
Links:
</p>

<ul class="org-ul">
<li><a href="https://kelar.org/~bandali/gnu/emacs/emacs-chat-202605.html">Emacs Chat with Sacha Chua - bandali</a> - Amin's blog post about this talk</li>
<li><a href="https://kelar.org/~bandali/">Amin Bandali</a>: a computing scientist, archivist, and activist for user freedom</li>
<li><a href="https://kelar.org/~bandali/gnu/emacs/dotemacs.html">bandali's GNU Emacs configuration</a></li>
<li><a href="https://git.kelar.org/~bandali/configs/tree/.emacs.d">.emacs.d - configs - My configuration for GNU Emacs and other programs</a></li>
<li><a href="https://kelar.org/~bandali/gnu/emacs/people.html">The People of Emacs - bandali</a></li>
<li><a href="https://github.com/emacs-exwm/exwm">emacs-exwm/exwm: Emacs X Window Manager · GitHub</a></li>
</ul>
<div id="outline-container-current-notes-for-next-time-emacs-chat-21-amin-bandali-rough-notes-during-our-chat" class="outline-3">
<h3 id="current-notes-for-next-time-emacs-chat-21-amin-bandali-rough-notes-during-our-chat">Chapters</h3>
<div class="outline-text-3" id="text-current-notes-for-next-time-emacs-chat-21-amin-bandali-rough-notes-during-our-chat">
<p>
</p><ul class="org-ul">
<li><span class="media-time" data-start="11.000">0:11</span> Introduction: Amin Bandali, software developer and free software activist</li>
<li><span class="media-time" data-start="66.000">1:06</span> Aspects of life: notetaking, editing, multiple</li>
<li><span class="media-time" data-start="183.000">3:03</span> Configuration: keeping things simple</li>
<li><span class="media-time" data-start="303.000">5:03</span> user-lisp-directory, site-lisp if you're using an older Emacs</li>
<li><span class="media-time" data-start="395.000">6:35</span> Organizing configuration into modules</li>
<li><span class="media-time" data-start="469.000">7:49</span> early-init</li>

<li><span class="media-time" data-start="549.000">9:09</span> ring-bell-function</li>
<li><span class="media-time" data-start="581.000">9:41</span> performance optimizations</li>

<li><span class="media-time" data-start="627.000">10:27</span> user-lisp</li>

<li><span class="media-time" data-start="676.000">11:16</span> ignoring byte compilation warnings</li>
<li><span class="media-time" data-start="718.000">11:58</span> init-file-debug = &ndash;debug-init</li>

<li><span class="media-time" data-start="776.000">12:56</span> Core</li>

<li><span class="media-time" data-start="837.000">13:57</span> no longer using bandali-configure; scoping errors, timing execution</li>

<li><span class="media-time" data-start="1026.000">17:06</span> Why not use use-package</li>
<li><span class="media-time" data-start="1119.000">18:39</span> Defining multiple keybindings</li>

<li><span class="media-time" data-start="1188.000">19:48</span> doric-oak uses emphasis instead of colours</li>

<li><span class="media-time" data-start="1252.000">20:52</span> global font scaling instead of the local ones</li>

<li><span class="media-time" data-start="1299.000">21:39</span> display-fill-column-indicator</li>
<li><span class="media-time" data-start="1377.000">22:57</span> emacsclient for EDITOR and VISUAL</li>

<li><span class="media-time" data-start="1418.000">23:38</span> fundamental-mode-hook</li>

<li><span class="media-time" data-start="1465.000">24:25</span> indicate-buffer-boundaries</li>

<li><span class="media-time" data-start="1598.000">26:38</span> enabling and disabling commands</li>

<li><span class="media-time" data-start="1662.000">27:42</span> package-review-policy</li>

<li><span class="media-time" data-start="1738.000">28:58</span> getting the Info files from the Emacs source directory</li>

<li><span class="media-time" data-start="1786.000">29:46</span> recentf, adding directories</li>

<li><span class="media-time" data-start="1901.000">31:41</span> Scrolling</li>

<li><span class="media-time" data-start="1956.000">32:36</span> auto revert</li>

<li><span class="media-time" data-start="1996.000">33:16</span> Repeat mode</li>

<li><span class="media-time" data-start="2093.000">34:53</span> EXWM</li>

<li><span class="media-time" data-start="2285.000">38:05</span> Audio setup</li>
<li><span class="media-time" data-start="2355.000">39:15</span> keymaps for launching different applications</li>
<li><span class="media-time" data-start="2395.000">39:55</span> bandali-call-interactively-insert</li>

<li><span class="media-time" data-start="2549.000">42:29</span> workspaces</li>

<li><span class="media-time" data-start="2630.000">43:50</span> ZSA Voyager split keyboard, super x as a single key</li>

<li><span class="media-time" data-start="2788.000">46:28</span> Keybindings</li>

<li><span class="media-time" data-start="2888.000">48:08</span> Media buttons</li>

<li><span class="media-time" data-start="2985.000">49:45</span> exwm-input-simulation-keys!</li>

<li><span class="media-time" data-start="3103.000">51:43</span> exwm: managing floating windows</li>

<li><span class="media-time" data-start="3193.000">53:13</span> exwm: application-specific local simulation keys</li>

<li><span class="media-time" data-start="3249.000">54:09</span> binding C-q to exwm-input-send-next-key</li>
<li><span class="media-time" data-start="3271.000">54:31</span> Renaming buffers</li>

<li><span class="media-time" data-start="3338.000">55:38</span> dunst for notifications</li>

<li><span class="media-time" data-start="3415.000">56:55</span> exwm xsettings and responding to screen configuration changes</li>

<li><span class="media-time" data-start="3543.000">59:03</span> Slowly getting back into Org mode</li>
<li><span class="media-time" data-start="3601.000">1:00:01</span> chat notes</li>

<li><span class="media-time" data-start="3654.000">1:00:54</span> Mode line</li>
<li><span class="media-time" data-start="3710.000">1:01:50</span> display-buffer-alist</li>
<li><span class="media-time" data-start="3744.000">1:02:24</span> TRAMP slowness, maybe disabling VC detection?</li>
<li><span class="media-time" data-start="3822.000">1:03:42</span> eat</li>
<li><span class="media-time" data-start="3909.000">1:05:09</span> TRAMP completion</li>
<li><span class="media-time" data-start="4015.000">1:06:55</span> ffs: form feed slides, ^L</li>

<li><span class="media-time" data-start="4176.000">1:09:36</span> Speaker notes</li>
</ul>

<p></p>
</div>
</div>
<div id="outline-container-current-notes-for-next-time-emacs-chat-21-amin-bandali-transcript" class="outline-3">
<h3 id="current-notes-for-next-time-emacs-chat-21-amin-bandali-transcript">Transcript</h3>
<div class="outline-text-3" id="text-current-notes-for-next-time-emacs-chat-21-amin-bandali-transcript">
<details class="code-details"><a name="ID-ec21-transcript"></a><div><a href="https://sachachua.com/blog/feed/atom/index.xml#end-ec21-transcript">Skip to end</a></div>
                  <summary>Transcript</summary>
<p>
</p><div class="full-transcript"><p></p><div class="transcript-heading"><span class="audio-time" data-start="0.000000">0:00</span> <strong>Introduction: Amin Bandali, software developer and free software activist</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="0.000000" data-stop="11.559000"><strong class="speaker-name">Sacha:</strong> Let me do the thing. Go live.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="11.560000" data-stop="14.399000">Let's check in.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="14.400000" data-stop="16.559000">Alright, hello.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="16.560000" data-stop="20.719000">This is Emacs Chat 21 coming back after a decade of not</span> <span class="audio-time caption" data-speaker="Sacha" data-start="20.720000" data-stop="22.279000">doing it, so…</span> <span class="audio-time caption" data-speaker="Sacha" data-start="22.280000" data-stop="26.759000">And today I've got Amin Bandali who's a…</span> <span class="audio-time caption" data-speaker="Sacha" data-start="26.760000" data-stop="29.279000">Is it seven years now that we've been doing</span> <span class="audio-time caption" data-speaker="Sacha" data-start="29.280000" data-stop="31.579000">EmacsConf together?</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="31.580000" data-stop="32.267000"><strong class="speaker-name">Amin:</strong> I think so.</span> <span class="audio-time caption" data-speaker="Amin" data-start="31.760000" data-stop="33.719000">Since fall 2019.</span> <span class="audio-time caption" data-speaker="Amin" data-start="32.268000" data-stop="32.268000">Yeah.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="33.720000" data-stop="35.679000"><strong class="speaker-name">Sacha:</strong> Yeah, yeah, yeah, yeah.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="35.680000" data-stop="38.799000">But of course you also do a whole lot of other things.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="38.800000" data-stop="40.519000">I was looking through your Emacs configuration and</span> <span class="audio-time caption" data-speaker="Sacha" data-start="40.520000" data-stop="43.119000">there's like translation and other stuff in there.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="43.120000" data-stop="45.239000">So would you like to start off with a brief</span> <span class="audio-time caption" data-speaker="Sacha" data-start="45.240000" data-stop="47.559000">introduction of who you are</span> <span class="audio-time caption" data-speaker="Sacha" data-start="47.560000" data-stop="50.259000">and how and why you use Emacs?</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="50.260000" data-stop="51.799000"><strong class="speaker-name">Amin:</strong> Yeah, sure.</span> <span class="audio-time caption" data-speaker="Amin" data-start="51.800000" data-stop="53.439000">Yeah, first of all, hello, everyone.</span> <span class="audio-time caption" data-speaker="Amin" data-start="53.440000" data-stop="54.639000">Sorry if I'm looking to the side.</span> <span class="audio-time caption" data-speaker="Amin" data-start="54.640000" data-stop="55.879000">This is a new setup.</span> <span class="audio-time caption" data-speaker="Amin" data-start="55.880000" data-stop="58.879000">My laptop, which has my webcam, is there, but my main</span> <span class="audio-time caption" data-speaker="Amin" data-start="58.880000" data-stop="60.119000">display is here.</span> <span class="audio-time caption" data-speaker="Amin" data-start="60.120000" data-stop="63.039000">So I might be looking to the side from time to time.</span> <span class="audio-time caption" data-speaker="Amin" data-start="63.040000" data-stop="65.279000">But yeah, that aside, hello.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="65.000000">1:05</span> <strong>Aspects of life: notetaking, editing, multiple</strong></div><p></p><span class="audio-time caption" data-speaker="Amin" data-start="65.280000" data-stop="66.399000"><strong class="speaker-name">Amin:</strong> Yeah, I'm Amin Bandali.</span> <span class="audio-time caption" data-speaker="Amin" data-start="66.400000" data-stop="72.359000">I've been, I think, using Emacs since 2014 or 15, so I</span> <span class="audio-time caption" data-speaker="Amin" data-start="72.360000" data-stop="74.679000">guess more than a decade now.</span> <span class="audio-time caption" data-speaker="Amin" data-start="74.680000" data-stop="78.879000">I'm a software engineer by day, or software developer,</span> <span class="audio-time caption" data-speaker="Amin" data-start="78.880000" data-stop="82.159000">slash programmer, slash computing scientist.</span> <span class="audio-time caption" data-speaker="Amin" data-start="82.160000" data-stop="85.839000">I'm also a free software activist.</span> <span class="audio-time caption" data-speaker="Amin" data-start="85.840000" data-stop="89.279000">I volunteer on a lot of free software projects as</span> <span class="audio-time caption" data-speaker="Amin" data-start="89.280000" data-stop="90.639000">well, which Sacha mentioned.</span> <span class="audio-time caption" data-speaker="Amin" data-start="90.640000" data-stop="91.799000">I do things around GNU.</span> <span class="audio-time caption" data-speaker="Amin" data-start="91.800000" data-stop="93.319000">I volunteer with FSF.</span> <span class="audio-time caption" data-speaker="Amin" data-start="93.320000" data-stop="95.719000">I'm a Debian Developer, so I try to maintain some</span> <span class="audio-time caption" data-speaker="Amin" data-start="95.720000" data-stop="97.399000">packages in Debian.</span> <span class="audio-time caption" data-speaker="Amin" data-start="97.400000" data-stop="101.959000">I try to help run EmacsConf from time to time.</span> <span class="audio-time caption" data-speaker="Amin" data-start="101.960000" data-stop="105.239000">Hopefully this year I will be much more present.</span> <span class="audio-time caption" data-speaker="Amin" data-start="105.240000" data-stop="107.039000">But yeah, that's that.</span> <span class="audio-time caption" data-speaker="Amin" data-start="107.040000" data-stop="110.439000">So I first got into using Emacs, I guess, as a</span> <span class="audio-time caption" data-speaker="Amin" data-start="110.440000" data-stop="113.039000">programmer tool, like as a text editor.</span> <span class="audio-time caption" data-speaker="Amin" data-start="113.040000" data-stop="116.439000">But I've since then kind of integrated it into a lot</span> <span class="audio-time caption" data-speaker="Amin" data-start="116.440000" data-stop="117.839000">of other aspects of my life.</span> <span class="audio-time caption" data-speaker="Amin" data-start="117.840000" data-stop="119.959000">And I do much more with it, as I'm sure a lot of us do.</span> <span class="audio-time caption" data-speaker="Amin" data-start="119.960000" data-stop="124.239000">Yeah, so I use it for kind of note-taking, just any</span> <span class="audio-time caption" data-speaker="Amin" data-start="124.240000" data-stop="126.279000">writing, editing purposes</span> <span class="audio-time caption" data-speaker="Amin" data-start="126.280000" data-stop="129.679000">in multiple natural and programming languages.</span> <span class="audio-time caption" data-speaker="Amin" data-start="129.680000" data-stop="134.559000">Reading and sending email for chatting via IRC.</span> <span class="audio-time caption" data-speaker="Amin" data-start="134.560000" data-stop="136.779000">All of that good stuff.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="136.780000" data-stop="138.599000"><strong class="speaker-name">Sacha:</strong> This is the sort of thing that isn't</span> <span class="audio-time caption" data-speaker="Sacha" data-start="138.600000" data-stop="140.399000">immediately obvious from your configuration.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="140.400000" data-stop="143.239000">I know you've got your Gnus setup in there and you've</span> <span class="audio-time caption" data-speaker="Sacha" data-start="143.240000" data-stop="146.519000">got your ERC setup in there, but sometimes when</span> <span class="audio-time caption" data-speaker="Sacha" data-start="146.520000" data-stop="148.959000">newcomers are trying to figure out, okay, there are</span> <span class="audio-time caption" data-speaker="Sacha" data-start="148.960000" data-stop="151.199000">all these packages, but how do I use them</span> <span class="audio-time caption" data-speaker="Sacha" data-start="151.200000" data-stop="152.359000">to get stuff done?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="152.360000" data-stop="155.679000">That's one of the reasons why we want to do this Emacs</span> <span class="audio-time caption" data-speaker="Sacha" data-start="155.680000" data-stop="158.479000">chat, so that maybe you can show us</span> <span class="audio-time caption" data-speaker="Sacha" data-start="158.480000" data-stop="160.239000">some of the cool stuff.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="160.240000" data-stop="162.879000">We are live, but if you accidentally show something</span> <span class="audio-time caption" data-speaker="Sacha" data-start="162.880000" data-stop="165.279000">personal, let me know and I can kill the stream within</span> <span class="audio-time caption" data-speaker="Sacha" data-start="165.280000" data-stop="168.279000">10 seconds and I think then we can be like, okay,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="168.280000" data-stop="170.799000">we'll just flush that out and then come back once</span> <span class="audio-time caption" data-speaker="Sacha" data-start="170.800000" data-stop="173.239000">we've hidden the top secret plans for taking over the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="173.240000" data-stop="175.399000">world, that sort of thing.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="175.400000" data-stop="177.719000">Sounds good.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="177.720000" data-stop="180.639000">Where do we want to start?</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="180.000000">3:00</span> <strong>Configuration: keeping things simple</strong></div><p></p><span class="audio-time caption" data-speaker="Amin" data-start="180.640000" data-stop="183.919000"><strong class="speaker-name">Amin:</strong> I'm happy to do it however you like.</span> <span class="audio-time caption" data-speaker="Amin" data-start="183.920000" data-stop="186.679000">I can either share my screen, pull up my configuration.</span> <span class="audio-time caption" data-speaker="Amin" data-start="186.680000" data-stop="189.479000">Yeah, okay, so let's do that.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="189.480000" data-stop="190.279000"><strong class="speaker-name">Sacha:</strong> Yeah.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="190.280000" data-stop="193.479000">If you share your screen sometimes, I think what we</span> <span class="audio-time caption" data-speaker="Sacha" data-start="193.480000" data-stop="195.479000">did ages ago was we just started walking through the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="195.480000" data-stop="198.279000">configuration and then sometimes people say, oh yeah,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="198.280000" data-stop="199.159000">that's really interesting.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="199.160000" data-stop="201.919000">Let's go and demonstrate that so that people can get a</span> <span class="audio-time caption" data-speaker="Sacha" data-start="201.920000" data-stop="203.559000">sense of how this actually works.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="203.560000" data-stop="207.319000">And there were some things in your configuration that</span> <span class="audio-time caption" data-speaker="Sacha" data-start="207.320000" data-stop="210.159000">I had no idea, like what is FFS?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="210.160000" data-stop="211.919000">There's like no package.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="211.920000" data-stop="214.559000">I couldn't find any information about it.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="214.560000" data-stop="218.079000">But yeah, so your config, if you want to go ahead and</span> <span class="audio-time caption" data-speaker="Sacha" data-start="218.080000" data-stop="219.639000">share your screen while I</span> <span class="audio-time caption" data-speaker="Sacha" data-start="219.640000" data-stop="222.319000">Fill the air with hand-waving.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="222.320000" data-stop="227.719000">Amin's config tends to be more on the minimalist side.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="227.720000" data-stop="232.999000">I think you mostly rely on built-in things with a</span> <span class="audio-time caption" data-speaker="Sacha" data-start="233.000000" data-stop="235.239000">couple of external packages.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="235.240000" data-stop="238.919000">You don't even use use-package at all.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="238.920000" data-stop="241.639000">It's all run-at-idle-time to delay the startup of</span> <span class="audio-time caption" data-speaker="Sacha" data-start="241.640000" data-stop="245.867000">various things, and then it's all vanilla Emacs as you</span> <span class="audio-time caption" data-speaker="Sacha" data-start="245.868000" data-stop="249.800000">can get for loading and configuring things.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="249.840000" data-stop="251.033000"><strong class="speaker-name">Amin:</strong> Yeah, pretty much, yeah.</span> <span class="audio-time caption" data-speaker="Amin" data-start="251.034000" data-stop="253.433000">Yeah, so before I continue, quick note, Sacha, if you</span> <span class="audio-time caption" data-speaker="Amin" data-start="253.434000" data-stop="255.159000">can make me presenter because I don't have access to</span> <span class="audio-time caption" data-speaker="Amin" data-start="255.160000" data-stop="256.033000">share my screen.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="256.034000" data-stop="258.599000"><strong class="speaker-name">Sacha:</strong> Oh, that would be important, yes.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="258.600000" data-stop="260.399000">Hang on a second.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="260.400000" data-stop="261.359000">Let me see.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="261.360000" data-stop="262.359000">Okay, here we go.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="262.360000" data-stop="263.399000">Make presenter.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="263.400000" data-stop="265.559000">I might as well promote you to moderator while we're</span> <span class="audio-time caption" data-speaker="Sacha" data-start="265.560000" data-stop="266.319000">at it.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="266.320000" data-stop="267.439000">There you go.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="267.440000" data-stop="271.239000">You should now have magic powers.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="271.240000" data-stop="272.399000"><strong class="speaker-name">Amin:</strong> Thanks.</span> <span class="audio-time caption" data-speaker="Amin" data-start="272.400000" data-stop="273.999000">Let's see.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="274.000000" data-stop="275.559000"><strong class="speaker-name">Sacha:</strong> It's a good thing we're practicing this</span> <span class="audio-time caption" data-speaker="Sacha" data-start="275.560000" data-stop="280.799000">before EmacsConf so I remember how all this stuff works.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="280.800000" data-stop="283.079000"><strong class="speaker-name">Amin:</strong> Yep, for sure.</span> <span class="audio-time caption" data-speaker="Amin" data-start="283.080000" data-stop="284.079000">Okay, let's see.</span> <span class="audio-time caption" data-speaker="Amin" data-start="284.080000" data-stop="285.319000">I think I got it now.</span> <span class="audio-time caption" data-speaker="Amin" data-start="285.320000" data-stop="286.899000">Can you see my screen?</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="286.900000" data-stop="290.059000"><strong class="speaker-name">Sacha:</strong> Yes, I can see your screen.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="290.060000" data-stop="291.559000"><strong class="speaker-name">Amin:</strong> Okay, excellent.</span> <span class="audio-time caption" data-speaker="Amin" data-start="291.560000" data-stop="293.799000">Let's see.</span> <span class="audio-time caption" data-speaker="Amin" data-start="293.800000" data-stop="298.639000">Okay.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="298.000000">4:58</span> <strong>user-lisp-directory, site-lisp if you're using an older Emacs</strong></div><p></p><span class="audio-time caption" data-speaker="Amin" data-start="298.640000" data-stop="303.159000"><strong class="speaker-name">Amin:</strong> Yeah, so as Sacha mentioned at the moment, my config</span> <span class="audio-time caption" data-speaker="Amin" data-start="303.160000" data-stop="307.919000">is kind of very minimalist and kind of conservative by</span> <span class="audio-time caption" data-speaker="Amin" data-start="307.920000" data-stop="311.439000">design, in part because I tend to work on a lot of</span> <span class="audio-time caption" data-speaker="Amin" data-start="311.440000" data-stop="314.439000">different machines, whether it's for work or</span> <span class="audio-time caption" data-speaker="Amin" data-start="314.440000" data-stop="318.119000">volunteering or whatever, and I prefer to use Emacs</span> <span class="audio-time caption" data-speaker="Amin" data-start="318.120000" data-stop="318.879000">if I can.</span> <span class="audio-time caption" data-speaker="Amin" data-start="318.880000" data-stop="322.159000">So I want my config to be fairly self-contained so I</span> <span class="audio-time caption" data-speaker="Amin" data-start="322.160000" data-stop="325.599000">can easily either git clone or rsync it over.</span> <span class="audio-time caption" data-speaker="Amin" data-start="325.600000" data-stop="327.399000">Yeah.</span> <span class="audio-time caption" data-speaker="Amin" data-start="327.400000" data-stop="332.279000">To keep it simple, I was using package.el for a while</span> <span class="audio-time caption" data-speaker="Amin" data-start="332.280000" data-stop="336.479000">for installing and managing my packages, which I don't</span> <span class="audio-time caption" data-speaker="Amin" data-start="336.480000" data-stop="338.879000">keep in my configs repository.</span> <span class="audio-time caption" data-speaker="Amin" data-start="338.880000" data-stop="343.239000">But then I decided to switch over to very manual</span> <span class="audio-time caption" data-speaker="Amin" data-start="343.240000" data-stop="346.759000">package management with the awesome new feature</span> <span class="audio-time caption" data-speaker="Amin" data-start="346.760000" data-stop="350.399000">user-lisp-directory of the next upcoming Emacs release,</span> <span class="audio-time caption" data-speaker="Amin" data-start="350.400000" data-stop="352.999000">which basically you can give it a subdirectory in your</span> <span class="audio-time caption" data-speaker="Amin" data-start="353.000000" data-stop="356.919000">~/.emacs.d or ~/.config/emacs.</span> <span class="audio-time caption" data-speaker="Amin" data-start="356.920000" data-stop="359.599000">And then it'll go through all the Emacs Lisp files</span> <span class="audio-time caption" data-speaker="Amin" data-start="359.600000" data-stop="361.519000">recursively, byte compile them, native compile them,</span> <span class="audio-time caption" data-speaker="Amin" data-start="361.520000" data-stop="363.719000">all that good stuff, and add them to the load-path.</span> <span class="audio-time caption" data-speaker="Amin" data-start="363.720000" data-stop="366.559000">And for people who are using existing or older</span> <span class="audio-time caption" data-speaker="Amin" data-start="366.560000" data-stop="371.039000">releases of Emacs, there's also site-lisp by Philip</span> <span class="audio-time caption" data-speaker="Amin" data-start="371.040000" data-stop="373.959000">Kaludercic, which is kind of the…</span> <span class="audio-time caption" data-speaker="Amin" data-start="373.960000" data-stop="377.199000">I guess first implementation of what later became</span> <span class="audio-time caption" data-speaker="Amin" data-start="377.200000" data-stop="379.079000">User Lisp and built into Emacs.</span> <span class="audio-time caption" data-speaker="Amin" data-start="379.080000" data-stop="382.559000">So you can make it conditional and fall back to</span> <span class="audio-time caption" data-speaker="Amin" data-start="382.560000" data-stop="387.159000">site-lisp if you want to be able to use User Lisp on</span> <span class="audio-time caption" data-speaker="Amin" data-start="387.160000" data-stop="389.959000">older Emacs but still have your configuration be</span> <span class="audio-time caption" data-speaker="Amin" data-start="389.960000" data-stop="390.919000">usable.</span> <span class="audio-time caption" data-speaker="Amin" data-start="390.920000" data-stop="392.439000">Yeah, anyway.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="392.000000">6:32</span> <strong>Organizing configuration into modules</strong></div><p></p><span class="audio-time caption" data-speaker="Amin" data-start="392.440000" data-stop="395.239000"><strong class="speaker-name">Amin:</strong> So I've experimented with like a couple different ways</span> <span class="audio-time caption" data-speaker="Amin" data-start="395.240000" data-stop="397.319000">of managing my configurations like single giant init</span> <span class="audio-time caption" data-speaker="Amin" data-start="397.320000" data-stop="400.199000">file of like four or five thousand lines which I know</span> <span class="audio-time caption" data-speaker="Amin" data-start="400.200000" data-stop="403.199000">is actually not very large by comparison to I think</span> <span class="audio-time caption" data-speaker="Amin" data-start="403.200000" data-stop="407.239000">like someone like Sacha's configuration and also like</span> <span class="audio-time caption" data-speaker="Amin" data-start="407.240000" data-stop="410.319000">You know, split into multiple different files, which</span> <span class="audio-time caption" data-speaker="Amin" data-start="410.320000" data-stop="411.239000">has its own benefits.</span> <span class="audio-time caption" data-speaker="Amin" data-start="411.240000" data-stop="413.879000">And I've kind of actually converged to the approach</span> <span class="audio-time caption" data-speaker="Amin" data-start="413.880000" data-stop="415.159000">that Prot uses.</span> <span class="audio-time caption" data-speaker="Amin" data-start="415.160000" data-stop="419.359000">If you actually take a look at my configuration file,</span> <span class="audio-time caption" data-speaker="Amin" data-start="419.360000" data-stop="422.239000">you see I've drawn a lot of inspiration from Prot</span> <span class="audio-time caption" data-speaker="Amin" data-start="422.240000" data-stop="422.839000">switches.</span> <span class="audio-time caption" data-speaker="Amin" data-start="422.840000" data-stop="426.839000">Having a literate single file configuration, which</span> <span class="audio-time caption" data-speaker="Amin" data-start="426.840000" data-stop="430.319000">then all of the Emacs Lisp source blocks get tangled</span> <span class="audio-time caption" data-speaker="Amin" data-start="430.320000" data-stop="431.599000">to individual files.</span> <span class="audio-time caption" data-speaker="Amin" data-start="431.600000" data-stop="435.719000">So I can maintain a single source of truth and edit it</span> <span class="audio-time caption" data-speaker="Amin" data-start="435.720000" data-stop="438.799000">all in one place, but then also easily be able to</span> <span class="audio-time caption" data-speaker="Amin" data-start="438.800000" data-stop="441.559000">share individual pieces to people if they want.</span> <span class="audio-time caption" data-speaker="Amin" data-start="441.560000" data-stop="443.879000">So yeah, that's kind of the general approach.</span> <span class="audio-time caption" data-speaker="Amin" data-start="443.880000" data-stop="446.779000">And I can dive right in.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="446.780000" data-stop="448.759000"><strong class="speaker-name">Sacha:</strong> Yeah, that's definitely the structure that</span> <span class="audio-time caption" data-speaker="Sacha" data-start="448.760000" data-stop="450.999000">I've also stolen from Prot.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="451.000000" data-stop="452.159000">And I like the way that you're</span> <span class="audio-time caption" data-speaker="Sacha" data-start="452.160000" data-stop="456.759000">Your heading names are all long and descriptive, and</span> <span class="audio-time caption" data-speaker="Sacha" data-start="456.760000" data-stop="459.159000">you've got everything broken down in detail.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="459.160000" data-stop="462.839000">So yeah, go ahead and walk us through it, please.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="462.840000" data-stop="464.679000"><strong class="speaker-name">Amin:</strong> Yeah, sure.</span> <span class="audio-time caption" data-speaker="Amin" data-start="464.680000" data-stop="465.039000">Let's see.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="465.000000">7:45</span> <strong>early-init
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0014.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0014.jpg" alt="image from video 00:08:00.067" data-time="00:08:00.067"></a><span class="audio-time caption" data-speaker="Amin" data-start="465.040000" data-stop="469.159000"><strong class="speaker-name">Amin:</strong> So that's a brief introduction, and then I have an</span> <span class="audio-time caption" data-speaker="Amin" data-start="469.160000" data-stop="471.879000">early init section for doing the early init file.</span> <span class="audio-time caption" data-speaker="Amin" data-start="471.880000" data-stop="474.319000">There's a couple of subheadings here.</span> <span class="audio-time caption" data-speaker="Amin" data-start="474.320000" data-stop="476.559000">Actually, let me enlarge the font size a little bit to</span> <span class="audio-time caption" data-speaker="Amin" data-start="476.560000" data-stop="477.919000">make it more legible.</span> <span class="audio-time caption" data-speaker="Amin" data-start="477.920000" data-stop="479.199000">OK, great.</span> <span class="audio-time caption" data-speaker="Amin" data-start="479.200000" data-stop="483.279000">I do a couple of things here like disabling package at</span> <span class="audio-time caption" data-speaker="Amin" data-start="483.280000" data-stop="485.999000">startup because I don't use package as I mentioned.</span> <span class="audio-time caption" data-speaker="Amin" data-start="486.000000" data-stop="490.559000">I manually install and update my packages as git</span> <span class="audio-time caption" data-speaker="Amin" data-start="490.560000" data-stop="494.559000">submodules in my configurations repository.</span> <p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0015.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0015.jpg" alt="image from video 00:08:15.567" data-time="00:08:15.567"></a><span class="audio-time caption" data-speaker="Amin" data-start="494.560000" data-stop="498.039000"><strong class="speaker-name">Amin:</strong> I set load-prefer-newer to t to make sure that I</span> <span class="audio-time caption" data-speaker="Amin" data-start="498.040000" data-stop="500.199000">never load any stale code.</span> <span class="audio-time caption" data-speaker="Amin" data-start="500.200000" data-stop="503.759000">For example, I might edit some Emacs Lisp file by hand</span> <span class="audio-time caption" data-speaker="Amin" data-start="503.760000" data-stop="506.039000">and forget to byte compile or native compile it.</span> <span class="audio-time caption" data-speaker="Amin" data-start="506.040000" data-stop="509.159000">And this tells Emacs to basically just use the version</span> <span class="audio-time caption" data-speaker="Amin" data-start="509.160000" data-stop="511.679000">of these three variants that's the most recent.</span> <span class="audio-time caption" data-speaker="Amin" data-start="511.680000" data-stop="514.639000">Yeah.</span> <span class="audio-time caption" data-speaker="Amin" data-start="514.640000" data-stop="515.679000">Nothing super fancy here.</span> <p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0016.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0016.jpg" alt="image from video 00:08:35.700" data-time="00:08:35.700"></a><span class="audio-time caption" data-speaker="Amin" data-start="515.680000" data-stop="518.039000"><strong class="speaker-name">Amin:</strong> I turn off a couple of things that I find a little bit</span> <span class="audio-time caption" data-speaker="Amin" data-start="518.040000" data-stop="520.359000">distracting, like the menu bar or toolbar.</span> <span class="audio-time caption" data-speaker="Amin" data-start="520.360000" data-stop="523.359000">Although I do say here that for people who are new to</span> <span class="audio-time caption" data-speaker="Amin" data-start="523.360000" data-stop="525.479000">Emacs, they're actually super helpful.</span> <span class="audio-time caption" data-speaker="Amin" data-start="525.480000" data-stop="528.399000">Sure, it's a little bit of visual clutter, but in the</span> <span class="audio-time caption" data-speaker="Amin" data-start="528.400000" data-stop="531.599000">beginning, it's really, really helpful to help you</span> <span class="audio-time caption" data-speaker="Amin" data-start="531.600000" data-stop="534.639000">orient yourself of what mode you're in, what tools do</span> <span class="audio-time caption" data-speaker="Amin" data-start="534.640000" data-stop="537.359000">you have available in your disposal.</span> <span class="audio-time caption" data-speaker="Amin" data-start="537.360000" data-stop="539.599000">And even someone who's been using Emacs for more than</span> <span class="audio-time caption" data-speaker="Amin" data-start="539.600000" data-stop="542.119000">10 years, I also use it sometimes when I'm like…</span> <span class="audio-time caption" data-speaker="Amin" data-start="542.120000" data-stop="544.119000">just starting to use a new mode.</span> <span class="audio-time caption" data-speaker="Amin" data-start="544.120000" data-stop="546.179000">So yeah, good stuff.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="546.000000">9:06</span> <strong>ring-bell-function</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="546.180000" data-stop="549.479000"><strong class="speaker-name">Sacha:</strong> I was very amused by the comment on the…</span> <span class="audio-time caption" data-speaker="Sacha" data-start="549.480000" data-stop="551.600000">"I don't like getting jumpscared out of my chair."</span> <span class="audio-time caption" data-speaker="Sacha" data-start="551.601000" data-stop="555.239000">You turned off the bell.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="555.240000" data-stop="557.080000"><strong class="speaker-name">Amin:</strong> Yeah, because that actually used to happen</span> <span class="audio-time caption" data-speaker="Amin" data-start="557.120000" data-stop="559.039000">when I first started using Emacs.</span> <span class="audio-time caption" data-speaker="Amin" data-start="559.040000" data-stop="561.679000">Like when I would, I don't know, I don't even remember</span> <span class="audio-time caption" data-speaker="Amin" data-start="561.680000" data-stop="563.639000">when it bells or rings, but</span> <span class="audio-time caption" data-speaker="Amin" data-start="563.640000" data-stop="568.359000">Maybe if you like quit like with C-g or like try to</span> <span class="audio-time caption" data-speaker="Amin" data-start="568.360000" data-stop="571.999000">backspace into like delete where there's no more</span> <span class="audio-time caption" data-speaker="Amin" data-start="572.000000" data-stop="574.959000">characters to delete so it rings a bell and it's very</span> <span class="audio-time caption" data-speaker="Amin" data-start="574.960000" data-stop="579.999000">like can be jarring so yeah I turn that off.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="580.000000">9:40</span> <strong>performance optimizations
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0017.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0017.jpg" alt="image from video 00:09:56.367" data-time="00:09:56.367"></a><span class="audio-time caption" data-speaker="Sacha" data-start="580.000000" data-stop="581.759000"><strong class="speaker-name">Sacha:</strong> Yeah, and then you've got a whole bunch of</span> <span class="audio-time caption" data-speaker="Sacha" data-start="581.760000" data-stop="584.719000">things where you set some variables to nil temporarily</span> <span class="audio-time caption" data-speaker="Sacha" data-start="584.720000" data-stop="587.199000">to make it faster, so that's in your startup in garbage</span> <span class="audio-time caption" data-speaker="Sacha" data-start="587.200000" data-stop="588.839000">collection.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="588.840000" data-stop="590.159000"><strong class="speaker-name">Amin:</strong> Exactly.</span> <span class="audio-time caption" data-speaker="Amin" data-start="590.160000" data-stop="593.359000">Empirically, there is no hard and fast science</span> <span class="audio-time caption" data-speaker="Amin" data-start="593.360000" data-stop="594.639000">behind this.</span> <span class="audio-time caption" data-speaker="Amin" data-start="594.640000" data-stop="596.359000">I experimented over the years.</span> <span class="audio-time caption" data-speaker="Amin" data-start="596.360000" data-stop="600.399000">I'm pretty sure I believe the default, for example,</span> <span class="audio-time caption" data-speaker="Amin" data-start="600.400000" data-stop="602.839000">the garbage collection cons threshold is about eight</span> <span class="audio-time caption" data-speaker="Amin" data-start="602.840000" data-stop="603.839000">megabytes.</span> <span class="audio-time caption" data-speaker="Amin" data-start="603.840000" data-stop="606.559000">I tried increasing that a little bit to see how much</span> <span class="audio-time caption" data-speaker="Amin" data-start="606.560000" data-stop="610.159000">If I increase it to what point</span> <span class="audio-time caption" data-speaker="Amin" data-start="610.160000" data-stop="612.599000">will it make my startup faster?</span> <span class="audio-time caption" data-speaker="Amin" data-start="612.600000" data-stop="616.519000">And I found this 30 megabytes or mibibytes to be</span> <span class="audio-time caption" data-speaker="Amin" data-start="616.520000" data-stop="617.119000">kind of a sweet spot.</span> <span class="audio-time caption" data-speaker="Amin" data-start="617.120000" data-stop="618.719000">So I bump that up.</span> <span class="audio-time caption" data-speaker="Amin" data-start="618.720000" data-stop="621.839000">And then after Emacs has finished initializing, in the</span> <span class="audio-time caption" data-speaker="Amin" data-start="621.840000" data-stop="625.299000">after-init-hook, I just restore the defaults.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="625.000000">10:25</span> <strong>user-lisp
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0018.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0018.jpg" alt="image from video 00:10:51.900" data-time="00:10:51.900"></a><span class="audio-time caption" data-speaker="Amin" data-start="625.300000" data-stop="627.500000"><strong class="speaker-name">Amin:</strong> And then, yeah, this is the bit with</span> <span class="audio-time caption" data-speaker="Amin" data-start="627.501000" data-stop="629.599000">the user-lisp-directory that I was talking about.</span> <span class="audio-time caption" data-speaker="Amin" data-start="629.600000" data-stop="631.519000">Awesome stuff.</span> <span class="audio-time caption" data-speaker="Amin" data-start="631.520000" data-stop="634.639000">So you can basically designate a directory.</span> <span class="audio-time caption" data-speaker="Amin" data-start="634.640000" data-stop="636.461000">For example, in my configuration,</span> <span class="audio-time caption" data-speaker="Amin" data-start="636.462000" data-stop="637.799000">it's just a lisp directory.</span> <span class="audio-time caption" data-speaker="Amin" data-start="637.800000" data-stop="641.485000">And then on startup, Emacs will go through and</span> <span class="audio-time caption" data-speaker="Amin" data-start="641.486000" data-stop="644.919000">byte-compile, native-compile if necessary, and then add all</span> <span class="audio-time caption" data-speaker="Amin" data-start="644.920000" data-stop="647.159000">of that stuff to the load-path automatically.</span> <span class="audio-time caption" data-speaker="Amin" data-start="647.160000" data-stop="647.999000">So you get that.</span> <span class="audio-time caption" data-speaker="Amin" data-start="648.000000" data-stop="651.119000">Yeah, and then this is the bit about site-lisp that I</span> <span class="audio-time caption" data-speaker="Amin" data-start="651.120000" data-stop="651.879000">was talking about.</span> <span class="audio-time caption" data-speaker="Amin" data-start="651.880000" data-stop="653.879000">So if you want to use user-lisp, but you're still</span> <span class="audio-time caption" data-speaker="Amin" data-start="653.880000" data-stop="657.999000">using older Emacs versions that you maintain, you need</span> <span class="audio-time caption" data-speaker="Amin" data-start="658.000000" data-stop="660.719000">to maintain backward compatibility in your config.</span> <span class="audio-time caption" data-speaker="Amin" data-start="660.720000" data-stop="662.359000">This is how you do it, for example.</span> <span class="audio-time caption" data-speaker="Amin" data-start="662.360000" data-stop="666.239000">So you just yeah, add it to load-path, require it and</span> <span class="audio-time caption" data-speaker="Amin" data-start="666.240000" data-stop="668.079000">then call prepare-user-lisp.</span> <span class="audio-time caption" data-speaker="Amin" data-start="668.080000" data-stop="674.219000">That's about it.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="674.000000">11:14</span> <strong>ignoring byte compilation warnings</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="674.220000" data-stop="676.279000"><strong class="speaker-name">Sacha:</strong> I'm picking up that tip about using the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="676.280000" data-stop="676.999000">ignore directories.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="677.000000" data-stop="679.679000">I'm getting by with just ignoring all of the byte</span> <span class="audio-time caption" data-speaker="Sacha" data-start="679.680000" data-stop="682.519000">compilation output, but it would be nice to just say,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="682.520000" data-stop="683.799000">you know, that stuff is test.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="683.800000" data-stop="686.639000">I don't need to worry about it.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="686.640000" data-stop="689.879000"><strong class="speaker-name">Amin:</strong> Right, right. Thanks. Yeah, I was also doing</span> <span class="audio-time caption" data-speaker="Amin" data-start="689.880000" data-stop="690.519000">that.</span> <span class="audio-time caption" data-speaker="Amin" data-start="690.520000" data-stop="693.559000">I actually have it as a comment to suppress</span> <span class="audio-time caption" data-speaker="Amin" data-start="693.560000" data-stop="696.999000">warning types, like byte compilation, but I was…</span> <span class="audio-time caption" data-speaker="Amin" data-start="697.000000" data-stop="699.159000">I plan on working on some packages,</span> <span class="audio-time caption" data-speaker="Amin" data-start="699.160000" data-stop="700.199000">whether my own or others,</span> <span class="audio-time caption" data-speaker="Amin" data-start="700.200000" data-stop="702.079000">and it would still be helpful to get those warnings,</span> <span class="audio-time caption" data-speaker="Amin" data-start="702.080000" data-stop="704.399000">so I keep them enabled. It's still a bit annoying.</span> <span class="audio-time caption" data-speaker="Amin" data-start="704.400000" data-stop="706.279000">I still get some of them when I launch emacs</span> <span class="audio-time caption" data-speaker="Amin" data-start="706.280000" data-stop="710.479000">but I don't restart or launch emacs as frequently</span> <span class="audio-time caption" data-speaker="Amin" data-start="710.480000" data-stop="715.239000">so it's pretty bearable.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="715.000000">11:55</span> <strong>init-file-debug = &#45;&#45;debug-init
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0019.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0019.jpg" alt="image from video 00:12:00.400" data-time="00:12:00.400"></a><span class="audio-time caption" data-speaker="Amin" data-start="715.240000" data-stop="718.319000"><strong class="speaker-name">Amin:</strong> Yeah, and then I have the main init file.</span> <span class="audio-time caption" data-speaker="Amin" data-start="718.320000" data-stop="720.399000">And there's not much in it.</span> <span class="audio-time caption" data-speaker="Amin" data-start="720.400000" data-stop="725.039000">It's just the debug-on-error and debug-on-quit.</span> <span class="audio-time caption" data-speaker="Amin" data-start="725.040000" data-stop="728.879000">So the debug-on-error thing, I set it to the value of</span> <span class="audio-time caption" data-speaker="Amin" data-start="728.880000" data-stop="729.999000">init-file-debug.</span> <span class="audio-time caption" data-speaker="Amin" data-start="730.000000" data-stop="733.519000">And if you look at that, the help for this variable,</span> <span class="audio-time caption" data-speaker="Amin" data-start="733.520000" data-stop="738.919000">basically if you pass or launch Emacs with</span> <span class="audio-time caption" data-speaker="Amin" data-start="738.920000" data-stop="743.039000">&#45;&#45;debug-init, this variable will be true.</span> <span class="audio-time caption" data-speaker="Amin" data-start="743.040000" data-stop="746.279000">So yeah.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="746.280000" data-stop="746.879000"><strong class="speaker-name">Sacha:</strong> I did not know that.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="746.880000" data-stop="748.933000">Cool.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="748.934000" data-stop="750.079000"><strong class="speaker-name">Amin:</strong> Yeah, it's pretty helpful.</span> <span class="audio-time caption" data-speaker="Amin" data-start="750.080000" data-stop="752.879000">I think, if I'm not mistaken, I took this from</span> <span class="audio-time caption" data-speaker="Amin" data-start="752.880000" data-stop="755.559000">John Wiegley's dotemacs, but I can't remember for sure.</span> <span class="audio-time caption" data-speaker="Amin" data-start="755.560000" data-stop="756.239000">It's been years.</span> <span class="audio-time caption" data-speaker="Amin" data-start="756.240000" data-stop="759.359000">Yeah, it's pretty nice.</span> <span class="audio-time caption" data-speaker="Amin" data-start="759.360000" data-stop="764.319000">And then here, I just set my name and email address.</span> <span class="audio-time caption" data-speaker="Amin" data-start="764.320000" data-stop="769.679000">And very early I set a custom-file to keep all of that</span> <span class="audio-time caption" data-speaker="Amin" data-start="769.680000" data-stop="771.959000">stuff separate from my .emacs.</span> <span class="audio-time caption" data-speaker="Amin" data-start="771.960000" data-stop="773.199000">I don't want it mixing in.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="773.000000">12:53</span> <strong>Core
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0020.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0020.jpg" alt="image from video 00:13:03.467" data-time="00:13:03.467"></a><span class="audio-time caption" data-speaker="Amin" data-start="773.200000" data-stop="776.359000"><strong class="speaker-name">Amin:</strong> And then pretty much the only other thing that's in my</span> <span class="audio-time caption" data-speaker="Amin" data-start="776.360000" data-stop="779.159000">main init file is just to require and load these</span> <span class="audio-time caption" data-speaker="Amin" data-start="779.160000" data-stop="783.439000">different modules or packages of my configuration.</span> <span class="audio-time caption" data-speaker="Amin" data-start="783.440000" data-stop="786.959000">I have these as actual packages or as actual features.</span> <span class="audio-time caption" data-speaker="Amin" data-start="786.960000" data-stop="788.599000">They provide themselves.</span> <span class="audio-time caption" data-speaker="Amin" data-start="788.600000" data-stop="790.999000">And that's just something that I've found</span> <span class="audio-time caption" data-speaker="Amin" data-start="791.000000" data-stop="792.519000">straightforward enough to do.</span> <span class="audio-time caption" data-speaker="Amin" data-start="792.520000" data-stop="796.879000">I know, for example, Prot uses a dual approach.</span> <span class="audio-time caption" data-speaker="Amin" data-start="796.880000" data-stop="800.519000">He has some of his configuration that's more readily</span> <span class="audio-time caption" data-speaker="Amin" data-start="800.520000" data-stop="802.879000">usable, available as actual packages.</span> <span class="audio-time caption" data-speaker="Amin" data-start="802.880000" data-stop="806.719000">And then the other ones, it's just Emacs Lisp code.</span> <span class="audio-time caption" data-speaker="Amin" data-start="806.720000" data-stop="808.119000">It's not actual packages.</span> <span class="audio-time caption" data-speaker="Amin" data-start="808.120000" data-stop="811.599000">But for me, I just keep it simple.</span> <span class="audio-time caption" data-speaker="Amin" data-start="811.600000" data-stop="816.779000">Everything as packages and that's about that.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="816.780000" data-stop="817.479000"><strong class="speaker-name">Sacha:</strong> Fantastic.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="817.480000" data-stop="822.479000">Let's dive into some of those configuration modules.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="822.480000" data-stop="824.359000"><strong class="speaker-name">Amin:</strong> Sure, let's see.</span> <span class="audio-time caption" data-speaker="Amin" data-start="824.360000" data-stop="828.119000">Yeah, so this there's this like core thing which is</span> <span class="audio-time caption" data-speaker="Amin" data-start="828.120000" data-stop="831.679000">kind of included gets included in all of my other</span> <span class="audio-time caption" data-speaker="Amin" data-start="831.680000" data-stop="833.579000">files.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="833.000000">13:53</span> <strong>no longer using bandali-configure; scoping errors, timing execution
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0021.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0021.jpg" alt="image from video 00:14:27.533" data-time="00:14:27.533"></a><span class="audio-time caption" data-speaker="Amin" data-start="833.580000" data-stop="837.199000"><strong class="speaker-name">Amin:</strong> I wrote a bandali-configure macro</span> <span class="audio-time caption" data-speaker="Amin" data-start="837.200000" data-stop="840.359000">shamelessly based on prot-emacs-configure which</span> <span class="audio-time caption" data-speaker="Amin" data-start="840.360000" data-stop="845.079000">is what Prot uses and it basically is a way of kind of</span> <span class="audio-time caption" data-speaker="Amin" data-start="845.080000" data-stop="847.919000">similar to use-package for like wrapping a bunch of</span> <span class="audio-time caption" data-speaker="Amin" data-start="847.920000" data-stop="851.399000">relevant like Emacs Lisp code all together.</span> <span class="audio-time caption" data-speaker="Amin" data-start="851.400000" data-stop="857.359000">It has the benefit, if you use it, if there is an</span> <span class="audio-time caption" data-speaker="Amin" data-start="857.360000" data-stop="862.279000">error in that block or in the body basically, then it</span> <span class="audio-time caption" data-speaker="Amin" data-start="862.280000" data-stop="863.559000">won't crash everything.</span> <span class="audio-time caption" data-speaker="Amin" data-start="863.560000" data-stop="866.959000">That body will just get ignored and we display an</span> <span class="audio-time caption" data-speaker="Amin" data-start="866.960000" data-stop="867.519000">error.</span> <span class="audio-time caption" data-speaker="Amin" data-start="867.520000" data-stop="870.799000">And that's also the main reason that Prot uses it.</span> <span class="audio-time caption" data-speaker="Amin" data-start="870.800000" data-stop="875.439000">The one thing that I added extra to mine, which I took</span> <span class="audio-time caption" data-speaker="Amin" data-start="875.440000" data-stop="880.439000">with inspiration from Eshel Yaron's esy/init-step,</span> <span class="audio-time caption" data-speaker="Amin" data-start="880.440000" data-stop="887.879000">is to wrap it up in basically time the execution</span> <span class="audio-time caption" data-speaker="Amin" data-start="887.880000" data-stop="891.119000">of each of these blocks, which can be pretty helpful</span> <span class="audio-time caption" data-speaker="Amin" data-start="891.120000" data-stop="894.919000">to help you see, okay, which part of my configuration</span> <span class="audio-time caption" data-speaker="Amin" data-start="894.920000" data-stop="896.559000">is particularly slow.</span> <span class="audio-time caption" data-speaker="Amin" data-start="896.560000" data-stop="899.519000">Usage examples.</span> <span class="audio-time caption" data-speaker="Amin" data-start="899.520000" data-stop="900.799000">I just have it here.</span> <span class="audio-time caption" data-speaker="Amin" data-start="900.800000" data-stop="904.799000">You can either basically pass it like a symbol like</span> <span class="audio-time caption" data-speaker="Amin" data-start="904.800000" data-stop="908.319000">thing or you can also pass in a string as the first</span> <span class="audio-time caption" data-speaker="Amin" data-start="908.320000" data-stop="909.239000">argument.</span> <span class="audio-time caption" data-speaker="Amin" data-start="909.240000" data-stop="912.479000">And this is what will be displayed when you display a</span> <span class="audio-time caption" data-speaker="Amin" data-start="912.480000" data-stop="916.919000">list of the evaluation times for all of these</span> <span class="audio-time caption" data-speaker="Amin" data-start="916.920000" data-stop="918.979000">blocks in your configuration.</span> <p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0022.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0022.jpg" alt="image from video 00:15:22.133" data-time="00:15:22.133"></a><span class="audio-time caption" data-speaker="Amin" data-start="918.980000" data-stop="922.119000"><strong class="speaker-name">Amin:</strong> Yeah, and then I have a neat little function</span> <span class="audio-time caption" data-speaker="Amin" data-start="922.120000" data-stop="924.719000">here like bandali-configure-report-times</span> <span class="audio-time caption" data-speaker="Amin" data-start="924.720000" data-stop="928.200000">that will report these times,</span> <span class="audio-time caption" data-speaker="Amin" data-start="928.201000" data-stop="929.600000">whether in the order that it's</span> <span class="audio-time caption" data-speaker="Amin" data-start="929.601000" data-stop="931.367000">encountered them, or you can have it</span> <span class="audio-time caption" data-speaker="Amin" data-start="931.368000" data-stop="933.600000">sort by fastest to slowest,</span> <span class="audio-time caption" data-speaker="Amin" data-start="933.601000" data-stop="936.399000">slowest to fastest, blah blah blah.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="936.400000" data-stop="937.559000"><strong class="speaker-name">Sacha:</strong> You mentioned you're no longer using this.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="937.560000" data-stop="941.439000">Is it because you wanted it to be easier to</span> <span class="audio-time caption" data-speaker="Sacha" data-start="941.440000" data-stop="943.119000">copy and paste your code?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="943.120000" data-stop="945.639000">What got you to shift back to the regular vanilla type</span> <span class="audio-time caption" data-speaker="Sacha" data-start="945.640000" data-stop="947.640000">of configuration?</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="947.680000" data-stop="953.279000"><strong class="speaker-name">Amin:</strong> Right, as neat as it is, I didn't find it</span> <span class="audio-time caption" data-speaker="Amin" data-start="953.280000" data-stop="956.959000">super useful. For one thing, because I don't add or</span> <span class="audio-time caption" data-speaker="Amin" data-start="956.960000" data-stop="960.999000">remove a ton of stuff to my Emacs configuration</span> <span class="audio-time caption" data-speaker="Amin" data-start="961.000000" data-stop="964.759000">regularly, so if there is an error, it wouldn't cause</span> <span class="audio-time caption" data-speaker="Amin" data-start="964.760000" data-stop="966.799000">an issue for the rest of my configuration. I didn't</span> <span class="audio-time caption" data-speaker="Amin" data-start="966.800000" data-stop="971.199000">really find that very useful.</span> <span class="audio-time caption" data-speaker="Amin" data-start="971.200000" data-stop="974.279000">And then my other potential concern is that the way I</span> <span class="audio-time caption" data-speaker="Amin" data-start="974.280000" data-stop="978.159000">was structuring things, I would put all of the</span> <span class="audio-time caption" data-speaker="Amin" data-start="978.160000" data-stop="981.079000">configuration, let's say for Gnus, in one of these</span> <span class="audio-time caption" data-speaker="Amin" data-start="981.080000" data-stop="981.799000">blocks.</span> <span class="audio-time caption" data-speaker="Amin" data-start="981.800000" data-stop="985.759000">But I wanted to be able to break that down into, for</span> <span class="audio-time caption" data-speaker="Amin" data-start="985.760000" data-stop="988.279000">example, Org Mode sections more easily.</span> <span class="audio-time caption" data-speaker="Amin" data-start="988.280000" data-stop="992.759000">So far, I just decided to not use it.</span> <span class="audio-time caption" data-speaker="Amin" data-start="992.760000" data-stop="995.119000">I know I could technically break those down into</span> <span class="audio-time caption" data-speaker="Amin" data-start="995.120000" data-stop="998.559000">smaller blocks, but I haven't done that yet.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="998.560000" data-stop="1001.319000"><strong class="speaker-name">Sacha:</strong> Ihor says, this configure macro looks a lot</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1001.320000" data-stop="1003.599000">like good old use-package, which you're not even using</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1003.600000" data-stop="1004.919000">in the rest of your config.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1004.920000" data-stop="1007.519000">And I hear you about wanting to be able to split</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1007.520000" data-stop="1010.639000">things into smaller blocks with more explanations in</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1010.640000" data-stop="1011.279000">between them.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1011.280000" data-stop="1013.719000">So in my config, yeah, sure, I've got the use-package</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1013.720000" data-stop="1015.799000">there to do the ensure and all that stuff.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1015.800000" data-stop="1019.279000">But I also have with-eval-after-load because I still</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1019.280000" data-stop="1021.719000">want, you know, the links and the screenshots in</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1021.720000" data-stop="1022.759000">between.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1022.000000">17:02</span> <strong>Why not use use-package</strong></div><p></p><span class="audio-time caption" data-speaker="Amin" data-start="1022.760000" data-stop="1026.728000"><strong class="speaker-name">Amin:</strong> Right. Yeah, exactly. use-package is awesome.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1026.729000" data-stop="1028.791000">I have used that in the past,</span> <span class="audio-time caption" data-speaker="Amin" data-start="1028.792000" data-stop="1031.479000">especially when I was using the straight.el</span> <span class="audio-time caption" data-speaker="Amin" data-start="1031.480000" data-stop="1035.999000">package manager. It pairs nicely with it. But yeah,</span> <span class="audio-time caption" data-speaker="Amin" data-start="1036.000000" data-stop="1037.999000">since then, I found it a little bit like too magical</span> <span class="audio-time caption" data-speaker="Amin" data-start="1038.000000" data-stop="1041.279000">for my tastes, kind of along the lines of</span> <span class="audio-time caption" data-speaker="Amin" data-start="1041.280000" data-stop="1043.159000">declaring an init file bankruptcy at some point I</span> <span class="audio-time caption" data-speaker="Amin" data-start="1043.160000" data-stop="1044.279000">really wanted to</span> <span class="audio-time caption" data-speaker="Amin" data-start="1044.280000" data-stop="1047.039000">understand every single line that I have in my Emacs</span> <span class="audio-time caption" data-speaker="Amin" data-start="1047.040000" data-stop="1047.839000">configuration.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1047.840000" data-stop="1051.359000">And at the time, I didn't know a whole lot about</span> <span class="audio-time caption" data-speaker="Amin" data-start="1051.360000" data-stop="1053.999000">macros or wasn't very well-versed with them.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1054.000000" data-stop="1056.879000">So I just ditched it in favor of simply using, as you</span> <span class="audio-time caption" data-speaker="Amin" data-start="1056.880000" data-stop="1058.479000">mentioned, with-eval-after-load.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1058.480000" data-stop="1062.359000">And then that causes all that code to be basically</span> <span class="audio-time caption" data-speaker="Amin" data-start="1062.360000" data-stop="1065.279000">delayed, not evaluated immediately, but when that</span> <span class="audio-time caption" data-speaker="Amin" data-start="1065.280000" data-stop="1066.679000">package is loaded.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1066.680000" data-stop="1070.439000">And then as to when to pull that package in, depending</span> <span class="audio-time caption" data-speaker="Amin" data-start="1070.440000" data-stop="1072.879000">on if I want it right from the get-go of my Emacs</span> <span class="audio-time caption" data-speaker="Amin" data-start="1072.880000" data-stop="1074.319000">start, then I would require it.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1074.320000" data-stop="1076.959000">Otherwise, I add this, as you also mentioned earlier,</span> <span class="audio-time caption" data-speaker="Amin" data-start="1076.960000" data-stop="1080.119000">this kind of timer thing where if Emacs is idle for, I</span> <span class="audio-time caption" data-speaker="Amin" data-start="1080.120000" data-stop="1083.559000">don't know, 0.2 seconds or 0.4 seconds, then go ahead</span> <span class="audio-time caption" data-speaker="Amin" data-start="1083.560000" data-stop="1086.279000">and require this package.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1086.280000" data-stop="1087.479000"><strong class="speaker-name">Sacha:</strong> Ihor has a tip in the chat.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1087.480000" data-stop="1091.479000">Of course, Ihor has an Org way to do this.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1091.480000" data-stop="1094.919000">He uses use-package whatever config and then he has a</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1094.920000" data-stop="1097.439000">noweb reference to the Babel blocks.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1097.440000" data-stop="1103.279000">Then he just says :tangle no on the source blocks so</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1103.280000" data-stop="1104.799000">that they don't actually get repeated.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1104.800000" data-stop="1107.479000">Anyway, you can look at it later when you go through.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1107.480000" data-stop="1109.039000">I'll send you the comments or whatever.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1109.040000" data-stop="1111.119000">But show us how you're actually configuring things</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1111.120000" data-stop="1117.819000">since you're not using this.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1117.000000">18:37</span> <strong>Defining multiple keybindings
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0023.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0023.jpg" alt="image from video 00:18:55.133" data-time="00:18:55.133"></a><span class="audio-time caption" data-speaker="Amin" data-start="1117.820000" data-stop="1119.067000"><strong class="speaker-name">Amin:</strong> Then I just have another</span> <span class="audio-time caption" data-speaker="Amin" data-start="1119.068000" data-stop="1122.479000">quick macro thingy here, bandali-define-keys, which</span> <span class="audio-time caption" data-speaker="Amin" data-start="1122.480000" data-stop="1127.759000">wraps around Emacs's define-key. It affords me the</span> <span class="audio-time caption" data-speaker="Amin" data-start="1127.760000" data-stop="1132.799000">convenience of defining multiple key bindings, and</span> <span class="audio-time caption" data-speaker="Amin" data-start="1132.800000" data-stop="1135.119000">Prot's version of this (I think it's</span> <span class="audio-time caption" data-speaker="Amin" data-start="1135.120000" data-stop="1140.239000">prot-emacs-keybind, or something like that) he</span> <span class="audio-time caption" data-speaker="Amin" data-start="1140.240000" data-stop="1145.399000">imposes the limitation that the keys should be valid</span> <span class="audio-time caption" data-speaker="Amin" data-start="1145.400000" data-stop="1148.199000">strings that can be passed to the kbd function,</span> <span class="audio-time caption" data-speaker="Amin" data-start="1148.200000" data-stop="1152.639000">which is very fair and valid, but I wanted to not</span> <span class="audio-time caption" data-speaker="Amin" data-start="1152.640000" data-stop="1155.559000">impose that, to keep the flexibility of using</span> <span class="audio-time caption" data-speaker="Amin" data-start="1155.560000" data-stop="1158.079000">define-key directly.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1158.080000" data-stop="1163.119000">The consequences of that, as we can see, is we can</span> <span class="audio-time caption" data-speaker="Amin" data-start="1163.120000" data-stop="1165.599000">pass in the old representation of key bindings, like</span> <span class="audio-time caption" data-speaker="Amin" data-start="1165.600000" data-stop="1169.839000">the vector or whatever syntax, which Prot's doesn't</span> <span class="audio-time caption" data-speaker="Amin" data-start="1169.840000" data-stop="1172.479000">support by choice, whereas mine does.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1172.480000" data-stop="1175.799000">Let's see.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1175.800000" data-stop="1182.279000">For example, let's look at the bandali-theme.el, which is</span> <span class="audio-time caption" data-speaker="Amin" data-start="1182.280000" data-stop="1182.719000">all about…</span> <span class="audio-time caption" data-speaker="Amin" data-start="1182.720000" data-stop="1185.899000">The appearance, I guess, of Emacs.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1185.000000">19:45</span> <strong>doric-oak uses emphasis instead of colours
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0024.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0024.jpg" alt="image from video 00:19:45.900" data-time="00:19:45.900"></a><span class="audio-time caption" data-speaker="Amin" data-start="1185.900000" data-stop="1188.119000"><strong class="speaker-name">Amin:</strong> Yeah, so I just have a conditional block where, you</span> <span class="audio-time caption" data-speaker="Amin" data-start="1188.120000" data-stop="1190.039000">know, if you're in a graphical environment, I'll just</span> <span class="audio-time caption" data-speaker="Amin" data-start="1190.040000" data-stop="1193.399000">go ahead and load Prot's doric-themes, specifically</span> <span class="audio-time caption" data-speaker="Amin" data-start="1193.400000" data-stop="1195.719000">doric-oak, which is what we're seeing right now.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1195.720000" data-stop="1199.079000">I'm using, it's very beautiful, it's very subtle, and</span> <span class="audio-time caption" data-speaker="Amin" data-start="1199.080000" data-stop="1202.159000">it uses emphasis, bolding and stuff to draw</span> <span class="audio-time caption" data-speaker="Amin" data-start="1202.160000" data-stop="1205.239000">your eye to something instead of using a million</span> <span class="audio-time caption" data-speaker="Amin" data-start="1205.240000" data-stop="1207.439000">different colours, which I find pretty nice.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1207.440000" data-stop="1214.039000">Yeah, and then for example here I set up some fonts.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1214.040000" data-stop="1217.319000">I use this Sahel font for Persian and Arabic</span> <span class="audio-time caption" data-speaker="Amin" data-start="1217.320000" data-stop="1217.759000">text.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1217.760000" data-stop="1223.359000">I set a colour emoji font here and this is like we get</span> <span class="audio-time caption" data-speaker="Amin" data-start="1223.360000" data-stop="1225.479000">a kind of preview of what I do.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1225.480000" data-stop="1228.279000">It's like with-eval-after-load 'faces and then blah</span> <span class="audio-time caption" data-speaker="Amin" data-start="1228.280000" data-stop="1230.139000">blah blah.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1230.140000" data-stop="1231.536000"><strong class="speaker-name">Sacha:</strong> Ihor would like to point out that</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1231.537000" data-stop="1233.841000">with-eval-after-load is also a macro</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1233.842000" data-stop="1235.399000">that calls another macro.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1235.400000" data-stop="1239.519000">So I'm just going to mention it because it's there.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1239.520000" data-stop="1241.679000">These are your fonts.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1241.680000" data-stop="1243.879000">This is your theme.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1243.880000" data-stop="1246.799000">This is great because everyone always asks, what theme</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1246.800000" data-stop="1247.279000">is this?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1247.280000" data-stop="1248.159000">What font is this?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1248.160000" data-stop="1249.159000">All right.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1249.000000">20:49</span> <strong>global font scaling instead of the local ones
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0025.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0025.jpg" alt="image from video 00:20:59.967" data-time="00:20:59.967"></a><span class="audio-time caption" data-speaker="Sacha" data-start="1249.160000" data-stop="1252.159000"><strong class="speaker-name">Sacha:</strong> I like your text scaling tweaks that you're just about</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1252.160000" data-stop="1256.459000">to go into. You've changed the global mappings.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="1256.460000" data-stop="1256.919000"><strong class="speaker-name">Amin:</strong> Yeah, yeah, yeah.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1256.920000" data-stop="1258.439000">And I actually took this from Prot as well.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1258.440000" data-stop="1259.959000">And it makes a lot more sense.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1259.960000" data-stop="1263.239000">So by default, this, C-x C-+, -,</span> <span class="audio-time caption" data-speaker="Amin" data-start="1263.240000" data-stop="1265.759000">blah, blah, blah, it only scales the text</span> <span class="audio-time caption" data-speaker="Amin" data-start="1265.760000" data-stop="1267.679000">for the current buffer only.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1267.680000" data-stop="1272.839000">But in newer versions of Emacs, in Emacs 29, they also</span> <span class="audio-time caption" data-speaker="Amin" data-start="1272.840000" data-stop="1276.115000">added commands to adjust this globally, including</span> <span class="audio-time caption" data-speaker="Amin" data-start="1276.116000" data-stop="1277.866000">the mode line and all that stuff,</span> <span class="audio-time caption" data-speaker="Amin" data-start="1277.867000" data-stop="1279.359000">which is usually what I want,</span> <span class="audio-time caption" data-speaker="Amin" data-start="1279.360000" data-stop="1281.719000">for example, in this presentation or when I'm sharing</span> <span class="audio-time caption" data-speaker="Amin" data-start="1281.720000" data-stop="1282.559000">my screen right now.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1282.560000" data-stop="1284.479000">It scales everything up globally.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1284.480000" data-stop="1288.959000">So yeah, I just swapped these to be the default, and</span> <span class="audio-time caption" data-speaker="Amin" data-start="1288.960000" data-stop="1292.119000">then I add keybinds for the just local variants in</span> <span class="audio-time caption" data-speaker="Amin" data-start="1292.120000" data-stop="1296.359000">case I need to use that.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1296.360000" data-stop="1297.119000">Yep.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1297.000000">21:37</span> <strong>display-fill-column-indicator</strong></div><p></p><span class="audio-time caption" data-speaker="Amin" data-start="1297.120000" data-stop="1299.239000"><strong class="speaker-name">Amin:</strong> And then here I have display-fill-column-indicator.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1299.240000" data-stop="1302.559000">I don't know, maybe this is just me, but sometimes I'm</span> <span class="audio-time caption" data-speaker="Amin" data-start="1302.560000" data-stop="1305.519000">kind of OCD about keeping my text lined up at exactly,</span> <span class="audio-time caption" data-speaker="Amin" data-start="1305.520000" data-stop="1309.079000">for example, the 70 characters column.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1309.080000" data-stop="1312.479000">I care a lot about that, especially if I'm writing</span> <span class="audio-time caption" data-speaker="Amin" data-start="1312.480000" data-stop="1316.479000">code or text that I want to also visually look nice.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1316.480000" data-stop="1317.999000">And I enable this.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1318.000000" data-stop="1322.399000">And let's see, I enable it for prog-mode.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1322.400000" data-stop="1328.439000">So yeah, I guess if I, for example, do this…</span> <span class="audio-time caption" data-speaker="Amin" data-start="1328.440000" data-stop="1331.159000">This little thin line that we see here, that's the</span> <span class="audio-time caption" data-speaker="Amin" data-start="1331.160000" data-stop="1333.559000">display filler column indicator.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1333.560000" data-stop="1337.159000">I used to have it globally enabled, but then I found</span> <span class="audio-time caption" data-speaker="Amin" data-start="1337.160000" data-stop="1340.239000">that a bit too much, so I just enable it with a hook</span> <span class="audio-time caption" data-speaker="Amin" data-start="1340.240000" data-stop="1342.759000">in the modes that I want.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1342.760000" data-stop="1345.033000"><strong class="speaker-name">Sacha:</strong> Yeah, and the theme makes it very subtle.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1345.034000" data-stop="1346.967000">It's just there as a reminder,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1346.968000" data-stop="1347.900000">don't go beyond this line.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1347.901000" data-stop="1351.367000">You can if you really want to, but just try not to.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="1351.368000" data-stop="1359.579000"><strong class="speaker-name">Amin:</strong> Yeah, exactly. And then my essentials…</span> <span class="audio-time caption" data-speaker="Amin" data-start="1359.580000" data-stop="1362.999000">This is where I configure a lot of key</span> <span class="audio-time caption" data-speaker="Amin" data-start="1363.000000" data-stop="1366.439000">behaviours of Emacs, all built-in stuff for the most</span> <span class="audio-time caption" data-speaker="Amin" data-start="1366.440000" data-stop="1369.119000">part, or things that are key to my workflows.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1369.120000" data-stop="1372.119000">For example, I always want to start with a *scratch​*</span> <span class="audio-time caption" data-speaker="Amin" data-start="1372.120000" data-stop="1373.759000">buffer.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1373.000000">22:53</span> <strong>emacsclient for EDITOR and VISUAL
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0026.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0026.jpg" alt="image from video 00:22:53.767" data-time="00:22:53.767"></a><span class="audio-time caption" data-speaker="Amin" data-start="1373.760000" data-stop="1377.439000"><strong class="speaker-name">Amin:</strong> Start the Emacs server if it's not running.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1377.440000" data-stop="1381.599000">And this is very useful, very helpful so that then you</span> <span class="audio-time caption" data-speaker="Amin" data-start="1381.600000" data-stop="1384.959000">can call into an existing Emacs process with</span> <span class="audio-time caption" data-speaker="Amin" data-start="1384.960000" data-stop="1387.439000">emacsclient and have it edit a file.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1387.440000" data-stop="1390.079000">I don't use it for anything fancy just yet.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1390.080000" data-stop="1392.919000">I believe Prot also mentioned in his video with you,</span> <span class="audio-time caption" data-speaker="Amin" data-start="1392.920000" data-stop="1396.239000">Sacha, that he uses it for things like org-capture to</span> <span class="audio-time caption" data-speaker="Amin" data-start="1396.240000" data-stop="1400.519000">spawn a new buffer in his existing Emacs session</span> <span class="audio-time caption" data-speaker="Amin" data-start="1400.520000" data-stop="1402.039000">and things like that.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1402.040000" data-stop="1403.879000">You can do pretty cool things with it.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1403.880000" data-stop="1408.519000">But yeah, I just use it for being able to easily use</span> <span class="audio-time caption" data-speaker="Amin" data-start="1408.520000" data-stop="1411.799000">my Emacs as EDITOR and VISUAL text editors.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1411.800000" data-stop="1417.759000">So yeah, this sets that up.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1417.000000">23:37</span> <strong>fundamental-mode-hook
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0027.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0027.jpg" alt="image from video 00:23:42.200" data-time="00:23:42.200"></a><span class="audio-time caption" data-speaker="Amin" data-start="1417.760000" data-stop="1418.719000"><strong class="speaker-name">Amin:</strong> Adding a fundamental mode hook.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1418.720000" data-stop="1420.619000">Again, I took this from Prot.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1420.620000" data-stop="1422.199000"><strong class="speaker-name">Sacha:</strong> I was surprised by that because I was like,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1422.200000" data-stop="1424.519000">oh, there isn't a fundamental-mode-hook?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1424.520000" data-stop="1427.519000">Okay, that makes sense now.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="1427.520000" data-stop="1429.067000"><strong class="speaker-name">Amin:</strong> Right, right.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1429.068000" data-stop="1432.319000">Yeah, there isn't a fundamental-mode-hook by design.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1432.320000" data-stop="1435.119000">But I still, in the past, have found that I wanted</span> <span class="audio-time caption" data-speaker="Amin" data-start="1435.120000" data-stop="1435.319000">that.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1435.320000" data-stop="1437.959000">For example, for this display-fill-column-indicator,</span> <span class="audio-time caption" data-speaker="Amin" data-start="1437.960000" data-stop="1440.319000">when I had it enabled everywhere, I was like, it would</span> <span class="audio-time caption" data-speaker="Amin" data-start="1440.320000" data-stop="1442.639000">be nice if I could at least disable it for Fundamental</span> <span class="audio-time caption" data-speaker="Amin" data-start="1442.640000" data-stop="1442.959000">mode.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1442.960000" data-stop="1444.399000">And at the time, I didn't have this.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1444.400000" data-stop="1445.999000">I added this just recently.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1446.000000" data-stop="1448.599000">So if I decide to go back to using something globally,</span> <span class="audio-time caption" data-speaker="Amin" data-start="1448.600000" data-stop="1451.239000">but I don't want it in fundamental-mode, then I can</span> <span class="audio-time caption" data-speaker="Amin" data-start="1451.240000" data-stop="1453.919000">disable it using this.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1453.920000" data-stop="1458.359000">Yeah, and then some standard stuff like I prefer</span> <span class="audio-time caption" data-speaker="Amin" data-start="1458.360000" data-stop="1463.579000">spaces and a tab width of four characters.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1463.000000">24:23</span> <strong>indicate-buffer-boundaries
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0008.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0008.jpg" alt="image from video 00:22:02.433" data-time="00:22:02.433"></a><span class="audio-time caption" data-speaker="Amin" data-start="1463.580000" data-stop="1465.319000"><strong class="speaker-name">Amin:</strong> Visually indicate buffer boundaries.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1465.320000" data-stop="1468.801000">This is a little bit hard to see right now,</span> <span class="audio-time caption" data-speaker="Amin" data-start="1468.802000" data-stop="1471.020000">but here at the bottom left</span> <p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0009.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0009.jpg" alt="image from video 00:22:02.433" data-time="00:22:02.433"></a><span class="audio-time caption" data-speaker="Amin" data-start="1471.021000" data-stop="1473.159000"><strong class="speaker-name">Amin:</strong> you see a little down arrow</span> <p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0012.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0012.jpg" alt="image from video 00:24:33.800" data-time="00:24:33.800"></a><span class="audio-time caption" data-speaker="Amin" data-start="1473.160000" data-stop="1474.799000"><strong class="speaker-name">Amin:</strong> and then the little top arrow.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1474.800000" data-stop="1481.619000">And… Let's see if I can.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1481.620000" data-stop="1484.319000"><strong class="speaker-name">Sacha:</strong> Oh!</span> <p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0010.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0010.jpg" alt="image from video 00:24:43.167" data-time="00:24:43.167"></a><span class="audio-time caption" data-speaker="Amin" data-start="1484.320000" data-stop="1486.559000"><strong class="speaker-name">Amin:</strong> And also here, for example, when it all fits</span> <span class="audio-time caption" data-speaker="Amin" data-start="1486.560000" data-stop="1487.239000">in the view.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1487.240000" data-stop="1489.759000"><strong class="speaker-name">Sacha:</strong> Huh, that is cool.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1489.760000" data-stop="1490.919000">I was looking at that.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1490.920000" data-stop="1491.919000">What does it do?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1491.920000" data-stop="1494.799000">And so that tells you, you can still scroll up or you</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1494.800000" data-stop="1497.039000">can still scroll down, and you don't have to look at</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1497.040000" data-stop="1498.799000">the scroll bar to see where you are.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1498.800000" data-stop="1501.679000">It just says there's more there.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="1501.680000" data-stop="1503.399000"><strong class="speaker-name">Amin:</strong> Yeah, exactly.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1503.400000" data-stop="1503.839000">Yeah.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1503.840000" data-stop="1506.359000">And it also helps distinguish when there's a newline</span> <span class="audio-time caption" data-speaker="Amin" data-start="1506.360000" data-stop="1508.119000">character at the end of the file or not.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1508.120000" data-stop="1509.799000">So here in this buffer, there is.</span> <p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0013.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0013.jpg" alt="image from video 00:25:10.533" data-time="00:25:10.533"></a><span class="audio-time caption" data-speaker="Amin" data-start="1509.800000" data-stop="1514.199000"><strong class="speaker-name">Amin:</strong> But if I delete that, you see this indicator here</span> <span class="audio-time caption" data-speaker="Amin" data-start="1514.200000" data-stop="1515.639000">changed shape.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1515.640000" data-stop="1518.479000">But if I go back and add the new line again.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1518.480000" data-stop="1521.639000">So yeah, that's also been very helpful for me because</span> <span class="audio-time caption" data-speaker="Amin" data-start="1521.640000" data-stop="1523.959000">I added configuration files and some of these pieces</span> <span class="audio-time caption" data-speaker="Amin" data-start="1523.960000" data-stop="1526.199000">of software are sensitive to having a new line at the</span> <span class="audio-time caption" data-speaker="Amin" data-start="1526.200000" data-stop="1526.959000">end of the file.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1526.960000" data-stop="1531.099000">So yeah, it's very helpful and useful for that.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1531.100000" data-stop="1534.119000"><strong class="speaker-name">Sacha:</strong> I would not have guessed that from the very</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1534.120000" data-stop="1536.959000">short line in your config that turns that on.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1536.960000" data-stop="1538.678000">It's one line, (setq-default</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1538.679000" data-stop="1543.079000">indicate-buffer-boundaries 'left), and yet it adds this nice little</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1543.080000" data-stop="1546.219000">nuance to the way that fringe looks.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="1546.220000" data-stop="1546.719000"><strong class="speaker-name">Amin:</strong> Right.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1546.720000" data-stop="1547.839000">Yeah, absolutely.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1547.840000" data-stop="1550.799000">Perhaps I should expand more on it at some point later</span> <span class="audio-time caption" data-speaker="Amin" data-start="1550.800000" data-stop="1552.399000">to explain these things.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1552.400000" data-stop="1554.859000">But yeah, just this one line.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1554.860000" data-stop="1559.059000"><strong class="speaker-name">Sacha:</strong> May I recommend screenshots?</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="1559.060000" data-stop="1560.519000"><strong class="speaker-name">Amin:</strong> Yes, you may, for sure. Yeah, I will</span> <span class="audio-time caption" data-speaker="Amin" data-start="1560.520000" data-stop="1564.959000">definitely do that as well,</span> <span class="audio-time caption" data-speaker="Amin" data-start="1564.960000" data-stop="1567.067000">because I'm also a bit of a visual person.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1567.068000" data-stop="1568.733000">I like seeing screenshots and videos,</span> <span class="audio-time caption" data-speaker="Amin" data-start="1568.734000" data-stop="1570.159000">so yeah I'll take that to heart</span> <span class="audio-time caption" data-speaker="Amin" data-start="1570.160000" data-stop="1572.299000">and do that for my own configuration as well.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1572.300000" data-stop="1575.500000"><strong class="speaker-name">Sacha:</strong> When I post this, I'll probably… I figured</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1575.501000" data-stop="1578.033000">out how to have the transcripts and then screenshots</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1578.034000" data-stop="1579.433000">embedded into my transcript.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1579.434000" data-stop="1582.033000">I'll generate it automatically from the subtitle file.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1582.034000" data-stop="1584.633000">Our EmacsConf transcripts are going to get so fancy</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1584.634000" data-stop="1588.300000">next year. But you can pull those screenshots</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1588.301000" data-stop="1591.719000">and drop them into your config. It'll be great.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="1591.720000" data-stop="1596.419000"><strong class="speaker-name">Amin:</strong> Nice. Yeah, for sure. Sounds good.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1596.000000">26:36</span> <strong>enabling and disabling commands
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0028.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0028.jpg" alt="image from video 00:26:36.433" data-time="00:26:36.433"></a><span class="audio-time caption" data-speaker="Amin" data-start="1596.420000" data-stop="1598.600000"><strong class="speaker-name">Amin:</strong> And then here, I just enable some of these</span> <span class="audio-time caption" data-speaker="Amin" data-start="1598.601000" data-stop="1600.733000">commands that are disabled by default.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1600.734000" data-stop="1605.800000">So yeah, it's useful, especially narrow-to-page,</span> <span class="audio-time caption" data-speaker="Amin" data-start="1605.801000" data-stop="1607.267000">for example, or narrow-to-region.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1607.268000" data-stop="1609.433000">These are commands where Emacs disables them</span> <span class="audio-time caption" data-speaker="Amin" data-start="1609.434000" data-stop="1612.833000">by default so that newcomers</span> <span class="audio-time caption" data-speaker="Amin" data-start="1612.834000" data-stop="1615.100000">don't accidentally hit them and get very</span> <span class="audio-time caption" data-speaker="Amin" data-start="1615.101000" data-stop="1617.133000">confused by what just happened.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1617.134000" data-stop="1619.500000">It doesn't disable them for good.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1619.501000" data-stop="1621.733000">It just basically prompts you for confirmation.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1621.734000" data-stop="1624.267000">Are you sure you want to run this command?</span> <span class="audio-time caption" data-speaker="Amin" data-start="1624.268000" data-stop="1626.900000">I'm sure, at least about these commands.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1626.901000" data-stop="1628.167000">So I just enable them.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1628.168000" data-stop="1631.233000">And then something like, for example, overwrite-mode,</span> <span class="audio-time caption" data-speaker="Amin" data-start="1631.234000" data-stop="1632.800000">which I never use</span> <span class="audio-time caption" data-speaker="Amin" data-start="1632.801000" data-stop="1634.267000">and I don't want to accidentally enable.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1634.268000" data-stop="1636.667000">I just put it disabled so that if I do accidentally</span> <span class="audio-time caption" data-speaker="Amin" data-start="1636.668000" data-stop="1639.300000">hit the keys, which might be, I don't know, something</span> <span class="audio-time caption" data-speaker="Amin" data-start="1639.301000" data-stop="1643.000000">insert or whatever, then it will prompt me</span> <span class="audio-time caption" data-speaker="Amin" data-start="1643.001000" data-stop="1645.899000">to make sure that I meant to do that.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1645.900000" data-stop="1648.233000"><strong class="speaker-name">Sacha:</strong> That reminds me, I should probably turn that</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1648.234000" data-stop="1650.833000">off for myself and then you get a whole new keyboard</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1650.834000" data-stop="1653.979000">shortcut you can use too.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="1653.980000" data-stop="1656.933000"><strong class="speaker-name">Amin:</strong> Right, yeah.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1656.934000" data-stop="1657.879000">Let's see.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1657.000000">27:37</span> <strong>package-review-policy
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0029.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0029.jpg" alt="image from video 00:27:37.900" data-time="00:27:37.900"></a><span class="audio-time caption" data-speaker="Amin" data-start="1657.880000" data-stop="1662.999000"><strong class="speaker-name">Amin:</strong> Yeah, I have just one line setting for package.el.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1663.000000" data-stop="1666.279000">In Emacs 31, we will be getting a package-review-policy</span> <span class="audio-time caption" data-speaker="Amin" data-start="1666.280000" data-stop="1667.439000">which is very helpful.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1667.440000" data-stop="1670.479000">So if you do use package.el for installing packages</span> <span class="audio-time caption" data-speaker="Amin" data-start="1670.480000" data-stop="1674.159000">from GNU ELPA, NonGNU ELPA, MELPA or whatever else,</span> <span class="audio-time caption" data-speaker="Amin" data-start="1674.160000" data-stop="1676.359000">you can enable this, and then whenever you update your</span> <span class="audio-time caption" data-speaker="Amin" data-start="1676.360000" data-stop="1680.679000">packages, you'll get a diff of what changed in this</span> <span class="audio-time caption" data-speaker="Amin" data-start="1680.680000" data-stop="1683.719000">new revision of the package that you're downloading</span> <span class="audio-time caption" data-speaker="Amin" data-start="1683.720000" data-stop="1685.519000">and you're about to enable.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1685.520000" data-stop="1688.039000">And you can presumably say yes or</span> <span class="audio-time caption" data-speaker="Amin" data-start="1688.040000" data-stop="1691.579000">at least see what's going on, which I'd find helpful.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1691.580000" data-stop="1693.759000"><strong class="speaker-name">Sacha:</strong> But you're not using packages, you mentioned,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1693.760000" data-stop="1700.919000">so you're just checking everything out and then you're</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1700.920000" data-stop="1701.979000">just git pulling whenever you feel like it.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="1701.980000" data-stop="1704.239000"><strong class="speaker-name">Amin:</strong> Yeah, so right now I'm using git pulls and git</span> <span class="audio-time caption" data-speaker="Amin" data-start="1704.240000" data-stop="1706.079000">submodules, very manual.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1706.080000" data-stop="1709.999000">I put this here because I think it's generally a very</span> <span class="audio-time caption" data-speaker="Amin" data-start="1710.000000" data-stop="1713.679000">welcome change and awesome new feature that I want to</span> <span class="audio-time caption" data-speaker="Amin" data-start="1713.680000" data-stop="1714.959000">spread the word about.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1714.960000" data-stop="1718.239000">So maybe someone who's looking at my config, they use</span> <span class="audio-time caption" data-speaker="Amin" data-start="1718.240000" data-stop="1720.159000">package and that's perfectly fine.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1720.160000" data-stop="1722.199000">So this is just here to spread the word about it</span> <span class="audio-time caption" data-speaker="Amin" data-start="1722.200000" data-stop="1723.159000">mainly, I guess.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1723.160000" data-stop="1725.439000">And if I start using package at some point myself in</span> <span class="audio-time caption" data-speaker="Amin" data-start="1725.440000" data-stop="1730.839000">the future, then I will have this enabled.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1730.840000" data-stop="1732.760000">Let's see.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1732.000000">28:52</span> <strong>getting the Info files from the Emacs source directory
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0030.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0030.jpg" alt="image from video 00:28:52.800" data-time="00:28:52.800"></a><span class="audio-time caption" data-speaker="Amin" data-start="1732.800000" data-stop="1738.239000"><strong class="speaker-name">Amin:</strong> Very quickly, here I extend Info-directory-list.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1738.240000" data-stop="1741.919000">I like to, at least on some of my machines,</span> <span class="audio-time caption" data-speaker="Amin" data-start="1741.920000" data-stop="1745.399000">use Emacs that I built from source directly in the</span> <span class="audio-time caption" data-speaker="Amin" data-start="1745.400000" data-stop="1748.599000">source repository of Emacs.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1748.600000" data-stop="1752.639000">Just after doing make, I don't run make install,</span> <span class="audio-time caption" data-speaker="Amin" data-start="1752.640000" data-stop="1754.919000">even though it's very easy to do that.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1754.920000" data-stop="1757.919000">You can install to a custom location by providing</span> <span class="audio-time caption" data-speaker="Amin" data-start="1757.920000" data-stop="1760.399000">&#45;&#45;prefix when you're ./configure-ing Emacs.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1760.400000" data-stop="1762.999000">Sometimes I just find it more convenient for me to not</span> <span class="audio-time caption" data-speaker="Amin" data-start="1763.000000" data-stop="1766.039000">do that and just run make and then exit and reopen</span> <span class="audio-time caption" data-speaker="Amin" data-start="1766.040000" data-stop="1766.959000">Emacs.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1766.960000" data-stop="1770.245000">And for that kind of a setup, I just extend the</span> <span class="audio-time caption" data-speaker="Amin" data-start="1770.246000" data-stop="1773.879000">Info-directory-list to include the info subdirectory of the</span> <span class="audio-time caption" data-speaker="Amin" data-start="1773.880000" data-stop="1777.359000">Emacs source repository so that the built-in Emacs</span> <span class="audio-time caption" data-speaker="Amin" data-start="1777.360000" data-stop="1785.119000">info manuals will be available to me.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1785.000000">29:45</span> <strong>recentf, adding directories
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0031.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0031.jpg" alt="image from video 00:29:46.600" data-time="00:29:46.600"></a><span class="audio-time caption" data-speaker="Amin" data-start="1785.120000" data-stop="1786.600000"><strong class="speaker-name">Amin:</strong> And then I use recentf</span> <span class="audio-time caption" data-speaker="Amin" data-start="1786.601000" data-stop="1792.039000">for tracking recent revisited files.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1792.040000" data-stop="1794.560000">I bind it to C-c f r e</span> <span class="audio-time caption" data-speaker="Amin" data-start="1794.600000" data-stop="1800.239000">for me to get a pop-up completion for visiting a</span> <span class="audio-time caption" data-speaker="Amin" data-start="1800.240000" data-stop="1803.759000">recent file, it has completion.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1803.760000" data-stop="1808.079000">So if I hit TAB here, for example, we can see some of</span> <span class="audio-time caption" data-speaker="Amin" data-start="1808.080000" data-stop="1811.499000">these files or directories that I visited recently.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1811.500000" data-stop="1813.200000"><strong class="speaker-name">Sacha:</strong> I see.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1813.201000" data-stop="1816.399000">And then you're adding the directory to it.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1816.400000" data-stop="1819.519000">So what does that let you do?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1819.520000" data-stop="1821.999000">Because I'm assuming you're already in there in the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1822.000000" data-stop="1822.759000">directory.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1822.760000" data-stop="1826.819000">But how does that change your recentf?</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="1826.820000" data-stop="1830.279000"><strong class="speaker-name">Amin:</strong> Right. So I need to think to remember this,</span> <span class="audio-time caption" data-speaker="Amin" data-start="1830.280000" data-stop="1834.239000">but I think the point of this was that if I</span> <span class="audio-time caption" data-speaker="Amin" data-start="1834.240000" data-stop="1839.759000">open a project in VC or in Dired, then I</span> <span class="audio-time caption" data-speaker="Amin" data-start="1839.760000" data-stop="1843.039000">would like that directory to also get added to my</span> <span class="audio-time caption" data-speaker="Amin" data-start="1843.040000" data-stop="1846.719000">recentf files list, because I think by default,</span> <span class="audio-time caption" data-speaker="Amin" data-start="1846.720000" data-stop="1854.399000">recentf only includes files, not directories.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1854.400000" data-stop="1857.319000"><strong class="speaker-name">Sacha:</strong> You're in it, you start up Magit or whatever,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1857.320000" data-stop="1860.079000">and then you move on to something else, but you want</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1860.080000" data-stop="1863.339000">to be able to easily go back to it.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="1863.340000" data-stop="1866.239000"><strong class="speaker-name">Amin:</strong> Yeah, for example, I like to keep my recently</span> <span class="audio-time caption" data-speaker="Amin" data-start="1866.240000" data-stop="1869.159000">visited directories in recentf as well.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1869.160000" data-stop="1871.759000">Because that's one of the main ways I jump between</span> <span class="audio-time caption" data-speaker="Amin" data-start="1871.760000" data-stop="1874.159000">projects and stuff, even though there is literally a</span> <span class="audio-time caption" data-speaker="Amin" data-start="1874.160000" data-stop="1876.319000">built-in Emacs project mode, which I still use.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1876.320000" data-stop="1879.919000">The only thing that I have here is…</span> <span class="audio-time caption" data-speaker="Amin" data-start="1879.920000" data-stop="1885.879000">I don't want to add my home directory to the recently</span> <span class="audio-time caption" data-speaker="Amin" data-start="1885.880000" data-stop="1889.599000">visited list, so the only thing that this function</span> <span class="audio-time caption" data-speaker="Amin" data-start="1889.600000" data-stop="1894.319000">does is to skip that if I'm opening the home directory.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1894.320000" data-stop="1898.439000">That's about it.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1898.000000">31:38</span> <strong>Scrolling
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0033.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0033.jpg" alt="image from video 00:32:10.933" data-time="00:32:10.933"></a><span class="audio-time caption" data-speaker="Amin" data-start="1898.440000" data-stop="1901.759000"><strong class="speaker-name">Amin:</strong> And then here I configure mouse and scrolling behaviour.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1901.760000" data-stop="1907.159000">So I want Emacs to scroll very gently, one line at a</span> <span class="audio-time caption" data-speaker="Amin" data-start="1907.160000" data-stop="1907.679000">time.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1907.680000" data-stop="1910.679000">I think the default is that when you reach the end of</span> <span class="audio-time caption" data-speaker="Amin" data-start="1910.680000" data-stop="1913.799000">the page, it'll jump half a page down and then</span> <span class="audio-time caption" data-speaker="Amin" data-start="1913.800000" data-stop="1914.439000">recenter.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1914.440000" data-stop="1917.999000">I don't remember default behaviour because I don't use</span> <span class="audio-time caption" data-speaker="Amin" data-start="1918.000000" data-stop="1921.599000">it very much, but yeah, this basically makes it</span> <span class="audio-time caption" data-speaker="Amin" data-start="1921.600000" data-stop="1923.919000">very predictable. For example, when I reach</span> <span class="audio-time caption" data-speaker="Amin" data-start="1923.920000" data-stop="1927.039000">the edge of the page here and I press C-n,</span> <span class="audio-time caption" data-speaker="Amin" data-start="1927.040000" data-stop="1930.919000">it'll only scroll one line at a time, instead of</span> <span class="audio-time caption" data-speaker="Amin" data-start="1930.920000" data-stop="1933.399000">jumping and then doing something like</span> <span class="audio-time caption" data-speaker="Amin" data-start="1933.400000" data-stop="1934.800000">this.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1934.801000" data-stop="1937.359000"><strong class="speaker-name">Sacha:</strong> Oh yeah, mine does! Mine doesn't do that, so</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1937.360000" data-stop="1939.879000">it does that jumping thing. I see what you mean</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1939.880000" data-stop="1942.200000">here. Interesting.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="1942.201000" data-stop="1945.599000"><strong class="speaker-name">Amin:</strong> Yeah, so you can tweak that with scroll-conservatively</span> <span class="audio-time caption" data-speaker="Amin" data-start="1945.600000" data-stop="1948.599000">and then scroll-preserve-screen-position, I believe.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1948.000000">32:28</span> <strong>auto revert
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0034.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0034.jpg" alt="image from video 00:32:37.733" data-time="00:32:37.733"></a><span class="audio-time caption" data-speaker="Amin" data-start="1948.600000" data-stop="1956.239000"><strong class="speaker-name">Amin:</strong> Yeah, and then I use autorevert, which is pretty</span> <span class="audio-time caption" data-speaker="Amin" data-start="1956.240000" data-stop="1957.719000">helpful.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1957.720000" data-stop="1961.239000">So this will have Emacs watch, for example, files that</span> <span class="audio-time caption" data-speaker="Amin" data-start="1961.240000" data-stop="1963.679000">are open in your buffers.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1963.680000" data-stop="1966.799000">And if they change on disk, Emacs will automatically</span> <span class="audio-time caption" data-speaker="Amin" data-start="1966.800000" data-stop="1969.959000">refresh the buffer so that you get the latest version.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1969.960000" data-stop="1973.199000">The cool thing is you can press undo in one of these</span> <span class="audio-time caption" data-speaker="Amin" data-start="1973.200000" data-stop="1976.119000">files that's been autoreverted so that you get the</span> <span class="audio-time caption" data-speaker="Amin" data-start="1976.120000" data-stop="1978.959000">revision that was there right before the change.</span> <span class="audio-time caption" data-speaker="Amin" data-start="1978.960000" data-stop="1983.139000">So I've used that sometimes as well.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="1983.140000" data-stop="1985.919000"><strong class="speaker-name">Sacha:</strong> Yeah, and sometimes autofollow also is nice</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1985.920000" data-stop="1988.119000">for log files and things like that.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="1988.120000" data-stop="1992.519000">But yeah, autoreverting is great.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="1992.520000" data-stop="1994.059000"><strong class="speaker-name">Amin:</strong> Yeah, for sure.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="1994.000000">33:14</span> <strong>Repeat mode
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0035.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0035.jpg" alt="image from video 00:33:14.067" data-time="00:33:14.067"></a><span class="audio-time caption" data-speaker="Amin" data-start="1994.060000" data-stop="1996.959000"><strong class="speaker-name">Amin:</strong> repeat-mode is something that I've only recently</span> <span class="audio-time caption" data-speaker="Amin" data-start="1996.960000" data-stop="2000.639000">started using, especially with my Emacs EXWM setup,</span> <span class="audio-time caption" data-speaker="Amin" data-start="2000.640000" data-stop="2002.959000">using Emacs as my window manager.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2002.960000" data-stop="2006.599000">For example, if I hit C-x o, we see here in the</span> <span class="audio-time caption" data-speaker="Amin" data-start="2006.600000" data-stop="2011.319000">echo area where it says repeat with o or capital O. So</span> <span class="audio-time caption" data-speaker="Amin" data-start="2011.320000" data-stop="2015.159000">I can now only press o instead of saying C-x o,</span> <span class="audio-time caption" data-speaker="Amin" data-start="2015.160000" data-stop="2019.319000">C-x o to do that multiple times.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2019.320000" data-stop="2023.559000">Keymaps that have support for this basically indicate</span> <span class="audio-time caption" data-speaker="Amin" data-start="2023.560000" data-stop="2027.919000">that they want to be repeatable can declare that.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2027.920000" data-stop="2031.439000">And then once you invoke one of the keys in those</span> <span class="audio-time caption" data-speaker="Amin" data-start="2031.440000" data-stop="2034.279000">keymaps, then you can repeat it with just that single</span> <span class="audio-time caption" data-speaker="Amin" data-start="2034.280000" data-stop="2035.039000">character.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2035.040000" data-stop="2037.879000">And for example, for my setup, I have that with my</span> <span class="audio-time caption" data-speaker="Amin" data-start="2037.880000" data-stop="2041.359000">EXWM workspace switching keys.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2041.360000" data-stop="2045.599000">So I can easily go to the next and previous</span> <span class="audio-time caption" data-speaker="Amin" data-start="2045.600000" data-stop="2048.519000">workspaces, many of them at a time by just pressing p</span> <span class="audio-time caption" data-speaker="Amin" data-start="2048.520000" data-stop="2053.399000">and n instead of doing the shortcut multiple times.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2053.400000" data-stop="2056.479000"><strong class="speaker-name">Sacha:</strong> And actually, if you don't mind jumping</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2056.480000" data-stop="2060.679000">ahead, the EXWM part of your config is fairly complex,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2060.680000" data-stop="2065.439000">and I think not a lot of people have a lot of</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2065.440000" data-stop="2067.599000">experience seeing EXWM in action.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2067.600000" data-stop="2071.039000">And I don't know whether you're comfortable sharing</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2071.040000" data-stop="2073.439000">you switching around to different workspaces, but if</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2073.440000" data-stop="2075.839000">that is something that you can do, how are you doing</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2075.840000" data-stop="2078.719000">all this awesomeness?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2078.720000" data-stop="2083.479000">I'm still too scared to use EXWM myself.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2083.480000" data-stop="2084.359000">Stability.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2084.360000" data-stop="2091.319000">But that's a me problem, not an EXWM problem.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2091.000000">34:51</span> <strong>EXWM
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0036.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0036.jpg" alt="image from video 00:35:26.600" data-time="00:35:26.600"></a><span class="audio-time caption" data-speaker="Amin" data-start="2091.320000" data-stop="2093.799000"><strong class="speaker-name">Amin:</strong> Yeah, EXWM was pretty awesome.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2093.800000" data-stop="2097.519000">I used it back in 2018, '19 for a while, and then I</span> <span class="audio-time caption" data-speaker="Amin" data-start="2097.520000" data-stop="2100.079000">kind of moved on to Sway and Wayland.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2100.080000" data-stop="2102.159000">But I don't know.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2102.160000" data-stop="2104.759000">It's something that I feel like once you try it, you</span> <span class="audio-time caption" data-speaker="Amin" data-start="2104.760000" data-stop="2106.479000">want to keep going back to it.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2106.480000" data-stop="2110.639000">So recently, this past month or so, I decided to give</span> <span class="audio-time caption" data-speaker="Amin" data-start="2110.640000" data-stop="2114.679000">it an earnest try and try to actually address any pain</span> <span class="audio-time caption" data-speaker="Amin" data-start="2114.680000" data-stop="2116.039000">points that I've noticed.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2116.040000" data-stop="2118.919000">So it's much more usable for me now, and I'm sticking</span> <span class="audio-time caption" data-speaker="Amin" data-start="2118.920000" data-stop="2119.479000">with it for now.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2119.480000" data-stop="2122.359000">I'm not a Wayland hater, but I'm just saying, at least</span> <span class="audio-time caption" data-speaker="Amin" data-start="2122.360000" data-stop="2124.039000">for now, I'm using EXWM.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2124.040000" data-stop="2126.599000">And I'm happy to talk about it.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2126.600000" data-stop="2128.599000"><strong class="speaker-name">Sacha:</strong> OK, what do you love about your setup for</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2128.600000" data-stop="2130.939000">that one?</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="2130.940000" data-stop="2132.319000"><strong class="speaker-name">Amin:</strong> EXWM?</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2132.320000" data-stop="2135.199000"><strong class="speaker-name">Sacha:</strong> Yeah, yeah.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2135.200000" data-stop="2136.599000">Like, you're doing a lot of rename buffers.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2136.600000" data-stop="2139.199000">Yeah, yeah, yeah.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="2139.200000" data-stop="2140.399000"><strong class="speaker-name">Amin:</strong> Right.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2140.400000" data-stop="2141.159000">Yeah, let me think.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2141.160000" data-stop="2142.199000">There's a couple of things.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2142.200000" data-stop="2145.559000">So, for the longest time, my Emacs EXWM configuration</span> <span class="audio-time caption" data-speaker="Amin" data-start="2145.560000" data-stop="2148.959000">used super key as a prefix,</span> <span class="audio-time caption" data-speaker="Amin" data-start="2148.960000" data-stop="2151.719000">which is the Windows [key] or the one with the</span> <span class="audio-time caption" data-speaker="Amin" data-start="2151.720000" data-stop="2155.159000">logo, basically, to switch workspaces, launch</span> <span class="audio-time caption" data-speaker="Amin" data-start="2155.160000" data-stop="2156.239000">applications and such.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2156.240000" data-stop="2162.719000">And at least the way that EXWM is right now, it</span> <span class="audio-time caption" data-speaker="Amin" data-start="2162.720000" data-stop="2163.319000">doesn't…</span> <span class="audio-time caption" data-speaker="Amin" data-start="2163.320000" data-stop="2167.559000">Like the way you have to add those global key bindings</span> <span class="audio-time caption" data-speaker="Amin" data-start="2167.560000" data-stop="2171.839000">kind of slows down the EXWM startup.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2171.840000" data-stop="2173.599000">And I had many such key bindings.</span> <p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0037.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0037.jpg" alt="image from video 00:36:16.467" data-time="00:36:16.467"></a><span class="audio-time caption" data-speaker="Amin" data-start="2173.600000" data-stop="2176.439000"><strong class="speaker-name">Amin:</strong> So one thing that I did kind of recently is to</span> <span class="audio-time caption" data-speaker="Amin" data-start="2176.440000" data-stop="2184.799000">define a prefix map here, like bandali-prefix-exwm-map.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2184.800000" data-stop="2189.039000">So I bind all of the keys and commands that I want</span> <span class="audio-time caption" data-speaker="Amin" data-start="2189.040000" data-stop="2193.399000">here, and then this helps me really minimize what I'm</span> <span class="audio-time caption" data-speaker="Amin" data-start="2193.400000" data-stop="2195.439000">telling EXWM, which is here.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2195.440000" data-stop="2199.319000">For example, this is how you set global keys with</span> <span class="audio-time caption" data-speaker="Amin" data-start="2199.320000" data-stop="2204.639000">EXWM, and I just point it to my prefix map.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2204.640000" data-stop="2207.759000">C-c x and then any of those letters and</span> <span class="audio-time caption" data-speaker="Amin" data-start="2207.760000" data-stop="2208.679000">functions that we saw.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2208.680000" data-stop="2211.679000">That's kind of annoying.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2211.680000" data-stop="2217.439000">I still use the super key here, but I have it s-x</span> <span class="audio-time caption" data-speaker="Amin" data-start="2217.440000" data-stop="2218.639000">and s-,.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2218.640000" data-stop="2222.319000">On the left-hand side of my keyboard, x is right next</span> <span class="audio-time caption" data-speaker="Amin" data-start="2222.320000" data-stop="2226.279000">to super, so I can hit it in one go with one motion</span> <span class="audio-time caption" data-speaker="Amin" data-start="2226.280000" data-stop="2228.639000">almost as a single key with these two fingers.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2228.640000" data-stop="2231.460000">On the right side of my keyboard,</span> <span class="audio-time caption" data-speaker="Amin" data-start="2231.461000" data-stop="2233.109000">I don't have a super key,</span> <span class="audio-time caption" data-speaker="Amin" data-start="2233.110000" data-stop="2236.279000">but I have a control key that I remapped to super.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2236.280000" data-stop="2241.079000">On the right side, I do s-, with these two</span> <span class="audio-time caption" data-speaker="Amin" data-start="2241.080000" data-stop="2242.719000">fingers.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2242.720000" data-stop="2248.359000">It's still very convenient for me to invoke those</span> <span class="audio-time caption" data-speaker="Amin" data-start="2248.360000" data-stop="2249.079000">commands.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2249.080000" data-stop="2253.399000">And pairing this up with repeat-mode, as we can see</span> <span class="audio-time caption" data-speaker="Amin" data-start="2253.400000" data-stop="2257.879000">just here, actually, then I can hit s-, and</span> <span class="audio-time caption" data-speaker="Amin" data-start="2257.880000" data-stop="2262.319000">then p, n, or h, j, k, l many times to switch</span> <span class="audio-time caption" data-speaker="Amin" data-start="2262.320000" data-stop="2266.559000">workspaces or shift focus to different windows and</span> <span class="audio-time caption" data-speaker="Amin" data-start="2266.560000" data-stop="2269.919000">stuff without having to hit that kind of annoying</span> <span class="audio-time caption" data-speaker="Amin" data-start="2269.920000" data-stop="2273.599000">s-x or s-, repeatedly.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2273.600000" data-stop="2278.319000">Yeah.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2278.320000" data-stop="2279.199000"><strong class="speaker-name">Sacha:</strong> That sounds really cool.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2279.200000" data-stop="2280.279000">I should look into that.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2280.280000" data-stop="2282.999000">Sorry, quick aside.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2283.000000">38:03</span> <strong>Audio setup</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2283.000000" data-stop="2285.559000"><strong class="speaker-name">Sacha:</strong> @blaiseutube would like to compliment you on your awesome</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2285.560000" data-stop="2286.359000">audio setup.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2286.360000" data-stop="2287.479000">It sounds like you're in the room with him.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2287.480000" data-stop="2290.039000">Apparently, I sound like I'm on speakerphone, but your</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2290.040000" data-stop="2292.879000">audio setup is top-notch, apparently.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2292.880000" data-stop="2296.759000">But that looks like a Blue Yeti, so I have to find out</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2296.760000" data-stop="2298.159000">what's going on.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2298.160000" data-stop="2300.919000">What microphone are you using?</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="2300.920000" data-stop="2302.159000"><strong class="speaker-name">Amin:</strong> It is indeed a Blue Yeti.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2302.160000" data-stop="2303.079000"><strong class="speaker-name">Sacha:</strong> Yeah, yeah.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2303.080000" data-stop="2305.399000">So I just have to ask him for</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2305.400000" data-stop="2307.079000">okay, what kind of boom mic?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2307.080000" data-stop="2309.159000">Anyway, we'll do that all offline because it's not</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2309.160000" data-stop="2312.399000">Emacs related.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="2312.400000" data-stop="2313.919000"><strong class="speaker-name">Amin:</strong> Yeah, it's just the Blue Yeti.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2313.920000" data-stop="2316.279000">Yeah, I turned down the gain.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2316.280000" data-stop="2319.599000">I used to have gain higher, but then it picks up</span> <span class="audio-time caption" data-speaker="Amin" data-start="2319.600000" data-stop="2321.599000">more noise from around the room or around</span> <span class="audio-time caption" data-speaker="Amin" data-start="2321.600000" data-stop="2322.439000">the house.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2322.440000" data-stop="2325.759000">So I turned down the gain a lot and then I get</span> <span class="audio-time caption" data-speaker="Amin" data-start="2325.760000" data-stop="2328.639000">close to the mic so that it only captures my voice.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2328.640000" data-stop="2330.759000">Okay.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2330.760000" data-stop="2332.239000"><strong class="speaker-name">Sacha:</strong> I'm gonna need the boom.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2332.240000" data-stop="2334.119000">Otherwise, I'm squished into that corner.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2334.120000" data-stop="2334.679000">All right.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2334.680000" data-stop="2337.599000">So you were doing repeat-map before I said oh,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2337.600000" data-stop="2340.879000">let's talk about EXWM because you've got cool stuff</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2340.880000" data-stop="2343.079000">there.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="2343.080000" data-stop="2346.599000"><strong class="speaker-name">Amin:</strong> Yeah, and I can continue talking about the EXWM.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2346.600000" data-stop="2350.279000">There's a lot here.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2350.000000">39:10</span> <strong>keymaps for launching different applications</strong></div><p></p><span class="audio-time caption" data-speaker="Amin" data-start="2350.280000" data-stop="2355.399000"><strong class="speaker-name">Amin:</strong> I have, let's see, s-, SPC.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2355.400000" data-stop="2357.719000">I bind it to async-shell-command to use as my</span> <span class="audio-time caption" data-speaker="Amin" data-start="2357.720000" data-stop="2360.399000">simple, little, dmenu-thing for</span> <span class="audio-time caption" data-speaker="Amin" data-start="2360.400000" data-stop="2361.639000">launching applications.</span> <p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0039.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0039.jpg" alt="image from video 00:39:11.767" data-time="00:39:11.767"></a><span class="audio-time caption" data-speaker="Amin" data-start="2361.640000" data-stop="2364.959000"><strong class="speaker-name">Amin:</strong> Some of these things, like browsers, I still</span> <span class="audio-time caption" data-speaker="Amin" data-start="2364.960000" data-stop="2367.119000">do them frequently enough, and I use different</span> <span class="audio-time caption" data-speaker="Amin" data-start="2367.120000" data-stop="2368.119000">browser profiles.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2368.120000" data-stop="2374.999000">So I just define a new keymap so I can basically one-shot</span> <span class="audio-time caption" data-speaker="Amin" data-start="2375.000000" data-stop="2378.439000">launch Chromium or Firefox in a specific browser [profile] or an</span> <span class="audio-time caption" data-speaker="Amin" data-start="2378.440000" data-stop="2379.999000">incognito window and such.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2380.000000" data-stop="2384.359000">So yeah, I just do s-x b and then, for example, c</span> <span class="audio-time caption" data-speaker="Amin" data-start="2384.360000" data-stop="2386.039000">to launch Chromium and all that stuff.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2386.040000" data-stop="2389.299000">So I found this pretty convenient.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2389.000000">39:49</span> <strong>bandali-call-interactively-insert
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0040.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0040.jpg" alt="image from video 00:40:57.567" data-time="00:40:57.567"></a><span class="audio-time caption" data-speaker="Amin" data-start="2389.300000" data-stop="2395.639000"><strong class="speaker-name">Amin:</strong> Speaking of key bindings, before I get down this,</span> <span class="audio-time caption" data-speaker="Amin" data-start="2395.640000" data-stop="2401.999000">let's see if I can find… C-c h.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2402.000000" data-stop="2405.239000">I think this is just before my EXWM setup.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2405.240000" data-stop="2407.839000">I'm pretty proud of this.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2407.840000" data-stop="2409.079000">I love this.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2409.080000" data-stop="2412.759000">It really goes to show how awesome Emacs is and</span> <span class="audio-time caption" data-speaker="Amin" data-start="2412.760000" data-stop="2414.199000">extensible it is.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2414.200000" data-stop="2416.039000">Let's see.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2416.040000" data-stop="2419.799000">So as we know, these various help commands and</span> <span class="audio-time caption" data-speaker="Amin" data-start="2419.800000" data-stop="2422.319000">describe commands are under C-h prefix.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2422.320000" data-stop="2423.879000">But some of them are not bound,</span> <span class="audio-time caption" data-speaker="Amin" data-start="2423.880000" data-stop="2426.679000">for example, find-library or describe-face.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2426.680000" data-stop="2429.519000">Some of these I use pretty frequently.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2429.520000" data-stop="2433.309000">I was really having trouble coming up with</span> <span class="audio-time caption" data-speaker="Amin" data-start="2433.310000" data-stop="2435.174000">descriptive-enough keybindings</span> <span class="audio-time caption" data-speaker="Amin" data-start="2435.175000" data-stop="2438.439000">or short-enough keybindings for all of them.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2438.440000" data-stop="2441.839000">I put some of them here, for example, like</span> <span class="audio-time caption" data-speaker="Amin" data-start="2441.840000" data-stop="2443.559000">C-c f l for find-library.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2443.560000" data-stop="2447.319000">But I can't do that for all of them.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2447.320000" data-stop="2451.239000">What I did was just do C-c h a or C-c h d.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2451.240000" data-stop="2456.839000">What this will do is basically, if I show that,</span> <span class="audio-time caption" data-speaker="Amin" data-start="2456.840000" data-stop="2461.279000">It basically opens up M-x, fills in describe-,</span> <span class="audio-time caption" data-speaker="Amin" data-start="2461.280000" data-stop="2465.366000">and then I can just type, for example, face,</span> <span class="audio-time caption" data-speaker="Amin" data-start="2465.367000" data-stop="2466.079000">and that's it.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2466.080000" data-stop="2468.839000">So it basically opens up the minibuffer for me,</span> <span class="audio-time caption" data-speaker="Amin" data-start="2468.840000" data-stop="2471.759000">pre-fills it with the string that I want, and I can</span> <span class="audio-time caption" data-speaker="Amin" data-start="2471.760000" data-stop="2473.959000">type what is it that I'm looking for.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2473.960000" data-stop="2475.319000">And I found this to be</span> <span class="audio-time caption" data-speaker="Amin" data-start="2475.320000" data-stop="2478.999000">better than trying to bind a million different</span> <span class="audio-time caption" data-speaker="Amin" data-start="2479.000000" data-stop="2480.719000">keyboard things for describe this and that,</span> <span class="audio-time caption" data-speaker="Amin" data-start="2480.720000" data-stop="2483.359000">apropos this and that, find this and that.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2483.360000" data-stop="2487.439000">So yeah and the way that we do that is to just use</span> <span class="audio-time caption" data-speaker="Amin" data-start="2487.440000" data-stop="2490.679000">a minibuffer-with-setup-hook, and you just have a</span> <span class="audio-time caption" data-speaker="Amin" data-start="2490.680000" data-stop="2492.319000">little lambda to insert the string that you give</span> <span class="audio-time caption" data-speaker="Amin" data-start="2492.320000" data-stop="2496.279000">it, and then you invoke it.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2496.280000" data-stop="2497.479000"><strong class="speaker-name">Sacha:</strong> Yeah, this is pretty cool.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2497.480000" data-stop="2499.599000">When I saw that in your config, I was like,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2499.600000" data-stop="2501.132000">I'm going to steal that.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2501.133000" data-stop="2502.380000">Pre-filling the minibuffer</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2502.381000" data-stop="2504.119000">but still letting you do stuff with it,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2504.120000" data-stop="2506.879000">it's such a powerful thing, not just for</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2506.880000" data-stop="2509.359000">completing the command itself, but even for when</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2509.360000" data-stop="2510.934000">you're using the command,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2510.935000" data-stop="2513.741000">but you want to do something with the input before.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2513.742000" data-stop="2515.871000">You don't want to do it all the way,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2515.872000" data-stop="2517.679000">send it in and submit right away.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2517.680000" data-stop="2520.199000">You want to actually do something with it after you</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2520.200000" data-stop="2521.239000">insert it.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2521.240000" data-stop="2522.779000">So great tip.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="2522.780000" data-stop="2524.119000"><strong class="speaker-name">Amin:</strong> Yeah.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2524.120000" data-stop="2524.719000">Thanks.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2524.720000" data-stop="2525.879000">Yeah, it's pretty useful.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2525.880000" data-stop="2527.479000">It's pretty nice.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2527.480000" data-stop="2527.959000">Yeah.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2527.960000" data-stop="2531.359000">And then back to the Emacs or EXWM stuff.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2531.360000" data-stop="2538.039000">So before I had, I used to yeah, sorry, go ahead.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2538.040000" data-stop="2540.279000"><strong class="speaker-name">Sacha:</strong> Sorry.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2540.280000" data-stop="2541.933000">I forgot whether I was muted or unmuted.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="2541.934000" data-stop="2546.719000"><strong class="speaker-name">Amin:</strong> Okay, no worries.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2546.000000">42:26</span> <strong>workspaces
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0041.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0041.jpg" alt="image from video 00:42:56.600" data-time="00:42:56.600"></a><span class="audio-time caption" data-speaker="Amin" data-start="2546.720000" data-stop="2549.639000"><strong class="speaker-name">Amin:</strong> For the longest time, I had 10 default</span> <span class="audio-time caption" data-speaker="Amin" data-start="2549.640000" data-stop="2553.199000">EXWM workspaces on startup, and that can slow</span> <span class="audio-time caption" data-speaker="Amin" data-start="2553.200000" data-stop="2555.399000">things down a little bit.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2555.400000" data-stop="2559.679000">So I found that okay, I don't really use</span> <span class="audio-time caption" data-speaker="Amin" data-start="2559.680000" data-stop="2561.079000">all 10 workspaces always.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2561.080000" data-stop="2562.999000">So I set it to 5.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2563.000000" data-stop="2564.879000">So I get five workspaces initially.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2564.880000" data-stop="2568.439000">But I still bind keys here.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2568.440000" data-stop="2569.879000">Like if we go down.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2569.880000" data-stop="2573.839000">Let's see.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2573.840000" data-stop="2574.639000">Here.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2574.640000" data-stop="2579.999000">So here, I define those keys for all the way from,</span> <span class="audio-time caption" data-speaker="Amin" data-start="2580.000000" data-stop="2583.599000">let's say, from 0 to 9 for all 10.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2583.600000" data-stop="2586.479000">And then if I try to switch to a workspace that</span> <span class="audio-time caption" data-speaker="Amin" data-start="2586.480000" data-stop="2589.479000">doesn't exist, then EXWM will just go ahead and</span> <span class="audio-time caption" data-speaker="Amin" data-start="2589.480000" data-stop="2590.759000">create it for me.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2590.760000" data-stop="2594.279000">Yeah, so I found that pretty cool.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2594.280000" data-stop="2595.839000">You can create workspaces on the fly.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2595.840000" data-stop="2599.219000">Yeah.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2599.220000" data-stop="2601.239000"><strong class="speaker-name">Sacha:</strong> Yeah, and I saw that it moves your current</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2601.240000" data-stop="2602.159000">window there, too.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2602.160000" data-stop="2603.719000">So that's just like, OK.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2603.720000" data-stop="2606.359000">Let's move it to workspace number two or whatever.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2606.360000" data-stop="2608.699000">Very cool.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="2608.700000" data-stop="2609.119000"><strong class="speaker-name">Amin:</strong> Yeah, yeah, yeah.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2609.120000" data-stop="2611.879000">I have keys or convenience keys for moving</span> <span class="audio-time caption" data-speaker="Amin" data-start="2611.880000" data-stop="2613.079000">some window to some workspace.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2613.080000" data-stop="2614.399000">Yeah, it's nice.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2614.400000" data-stop="2616.199000">Let's see.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2616.200000" data-stop="2616.559000">Let's see.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2616.560000" data-stop="2617.519000">Yeah.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2617.520000" data-stop="2619.839000">So these are just made key bindings.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2619.840000" data-stop="2626.379000">I use hjkl here for switching windows.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2626.000000">43:46</span> <strong>ZSA Voyager split keyboard, super x as a single key
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0042.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0042.jpg" alt="image from video 00:45:46.167" data-time="00:45:46.167"></a><span class="audio-time caption" data-speaker="Amin" data-start="2626.380000" data-stop="2630.439000"><strong class="speaker-name">Amin:</strong> I also have a ZSA Voyager split</span> <span class="audio-time caption" data-speaker="Amin" data-start="2630.440000" data-stop="2633.079000">ergonomic keyboard.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2633.080000" data-stop="2639.239000">I can basically customize it infinitely.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2639.240000" data-stop="2642.839000">For example, I don't really have a super key on the</span> <span class="audio-time caption" data-speaker="Amin" data-start="2642.840000" data-stop="2643.479000">first layer.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2643.480000" data-stop="2646.559000">What I have is a key that will do the s-x thingy,</span> <span class="audio-time caption" data-speaker="Amin" data-start="2646.560000" data-stop="2649.119000">basically, my prefix.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2649.120000" data-stop="2652.279000">So that's the last missing piece is that if I'm</span> <span class="audio-time caption" data-speaker="Amin" data-start="2652.280000" data-stop="2654.959000">at home and if I have this keyboard with me, then I</span> <span class="audio-time caption" data-speaker="Amin" data-start="2654.960000" data-stop="2657.079000">just hit one key and then that's it.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2657.080000" data-stop="2658.679000">I'm in my prefix.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2658.680000" data-stop="2661.479000">But even if not, on the laptop, the s-x or the</span> <span class="audio-time caption" data-speaker="Amin" data-start="2661.480000" data-stop="2664.279000">super comma are still easy enough for me to hit</span> <span class="audio-time caption" data-speaker="Amin" data-start="2664.280000" data-stop="2666.619000">it with one hand.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2666.620000" data-stop="2668.799000"><strong class="speaker-name">Sacha:</strong> Now I'm jealous and I definitely want</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2668.800000" data-stop="2671.759000">to assign my prefixes to their own keys.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2671.760000" data-stop="2672.319000">Very tempting.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2672.320000" data-stop="2674.999000">I've started using the numpad because my laptop has</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2675.000000" data-stop="2675.879000">one.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2675.880000" data-stop="2679.679000">I only use the numpad rarely, but we all need more</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2679.680000" data-stop="2682.679000">keys.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="2682.680000" data-stop="2685.039000"><strong class="speaker-name">Amin:</strong> Yeah, ergonomic keyboards are pretty nice,</span> <span class="audio-time caption" data-speaker="Amin" data-start="2685.040000" data-stop="2688.479000">especially these ones. For example, the ZSA ones where</span> <span class="audio-time caption" data-speaker="Amin" data-start="2688.480000" data-stop="2692.879000">you can put QMK on it, the QMK firmware. You can</span> <span class="audio-time caption" data-speaker="Amin" data-start="2692.880000" data-stop="2699.239000">define keys in a C file. I can actually show that.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2699.240000" data-stop="2716.239000">Let's see… QMK Firmware, Keyboards, ZSA,</span> <span class="audio-time caption" data-speaker="Amin" data-start="2716.240000" data-stop="2726.519000">Voyager, Bandali, and then keymap.c.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2726.520000" data-stop="2732.619000"><strong class="speaker-name">Sacha:</strong> Is this in your repository somewhere?</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="2732.620000" data-stop="2734.959000"><strong class="speaker-name">Amin:</strong> Right. It's in a different repository, but it's</span> <span class="audio-time caption" data-speaker="Amin" data-start="2734.960000" data-stop="2738.319000">still on https://git.kelar.org next to my configs</span> <span class="audio-time caption" data-speaker="Amin" data-start="2738.320000" data-stop="2744.399000">repository. You can find this as well, but if I go</span> <span class="audio-time caption" data-speaker="Amin" data-start="2744.400000" data-stop="2746.159000">smaller…</span> <span class="audio-time caption" data-speaker="Amin" data-start="2746.160000" data-stop="2750.279000">Yeah, you can define keys here and have different</span> <span class="audio-time caption" data-speaker="Amin" data-start="2750.280000" data-stop="2751.639000">layers, like the base layer.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2751.640000" data-stop="2754.959000">And then you can define a key to switch between</span> <span class="audio-time caption" data-speaker="Amin" data-start="2754.960000" data-stop="2758.039000">different layers and put some of the keys there anyway.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2758.040000" data-stop="2762.479000">So yeah, it's a whole rabbit hole in and of itself.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2762.480000" data-stop="2765.639000">Prot also uses a split ergonomic keyboard.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2765.640000" data-stop="2768.759000">It really does help if you're typing for long</span> <span class="audio-time caption" data-speaker="Amin" data-start="2768.760000" data-stop="2770.639000">periods of time.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2770.640000" data-stop="2775.159000">I actually had these for a while, and I wasn't using</span> <span class="audio-time caption" data-speaker="Amin" data-start="2775.160000" data-stop="2778.039000">them too much, but I started slowly getting some pain</span> <span class="audio-time caption" data-speaker="Amin" data-start="2778.040000" data-stop="2779.679000">in my wrists and here.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2779.680000" data-stop="2782.639000">So I was like, okay, I have the keyboard,</span> <span class="audio-time caption" data-speaker="Amin" data-start="2782.640000" data-stop="2784.959000">might as well put it to good use, and I've started</span> <span class="audio-time caption" data-speaker="Amin" data-start="2784.960000" data-stop="2786.839000">using it.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2786.000000">46:26</span> <strong>Keybindings
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0043.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0043.jpg" alt="image from video 00:46:53.767" data-time="00:46:53.767"></a><span class="audio-time caption" data-speaker="Sacha" data-start="2786.840000" data-stop="2788.839000"><strong class="speaker-name">Sacha:</strong> Okay, so most of your keyboard shortcuts come</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2788.840000" data-stop="2793.319000">off that kind of s-x or C-c something, and</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2793.320000" data-stop="2796.759000">then you have a long prefix sequence, and you just</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2796.760000" data-stop="2799.759000">remember everything or you use your…</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2799.760000" data-stop="2804.959000">pre-fill some of it and then fill in the rest of the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2804.960000" data-stop="2810.859000">command.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="2810.860000" data-stop="2813.759000"><strong class="speaker-name">Amin:</strong> Pretty much all my window management related</span> <span class="audio-time caption" data-speaker="Amin" data-start="2813.760000" data-stop="2818.079000">keys are on this s-x prefix that I'm showing here.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2818.080000" data-stop="2822.119000">And then I have a few other ones which I think I</span> <span class="audio-time caption" data-speaker="Amin" data-start="2822.120000" data-stop="2822.679000">showed earlier.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2822.680000" data-stop="2824.879000">Is it this one?</span> <span class="audio-time caption" data-speaker="Amin" data-start="2824.880000" data-stop="2828.679000">Anyway, I bind a few general keys outside of the</span> <span class="audio-time caption" data-speaker="Amin" data-start="2828.680000" data-stop="2832.600000">s-x thing, like C-c e i.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2832.601000" data-stop="2837.033000">For example, I have C-c e e for eval-last-sexp.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2837.034000" data-stop="2839.367000">I do that a lot, so it's easy to hit that.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2839.368000" data-stop="2843.379000">Making frames or deleting frames.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2843.380000" data-stop="2846.633000"><strong class="speaker-name">Sacha:</strong> I love how Emacs uptime is something you use</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2846.634000" data-stop="2851.379000">frequently enough that you have a keyboard shortcut for it.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="2851.380000" data-stop="2852.233000"><strong class="speaker-name">Amin:</strong> Yeah, of course.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2852.234000" data-stop="2854.100000">I mean, I'm sometimes curious to see how long has my</span> <span class="audio-time caption" data-speaker="Amin" data-start="2854.101000" data-stop="2862.019000">Emacs session been running.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2862.020000" data-stop="2864.559000">To continue with the EXWM stuff, let's see.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2864.560000" data-stop="2869.559000">This is just some keybindings I define here.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2869.560000" data-stop="2871.399000">It's all Emacs Lisp, right?</span> <span class="audio-time caption" data-speaker="Amin" data-start="2871.400000" data-stop="2872.119000">It's amazing.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2872.120000" data-stop="2875.119000">You can mapc over whatever sequence and create</span> <span class="audio-time caption" data-speaker="Amin" data-start="2875.120000" data-stop="2877.519000">keybindings like that.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2877.520000" data-stop="2879.999000">Only with Emacs we can do things like that.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2880.000000" data-stop="2882.359000">I just love it.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2882.360000" data-stop="2885.040000">Let's see.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2885.000000">48:05</span> <strong>Media buttons
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0044.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0044.jpg" alt="image from video 00:48:36.200" data-time="00:48:36.200"></a><span class="audio-time caption" data-speaker="Amin" data-start="2885.080000" data-stop="2888.079000"><strong class="speaker-name">Amin:</strong> I still keep these three other keys for raising and</span> <span class="audio-time caption" data-speaker="Amin" data-start="2888.080000" data-stop="2892.799000">lowering the volume and toggling mute off of that</span> <span class="audio-time caption" data-speaker="Amin" data-start="2892.800000" data-stop="2896.879000">prefix and just directly on my keyboard, hitting it</span> <span class="audio-time caption" data-speaker="Amin" data-start="2896.880000" data-stop="2901.359000">directly in the exwm-input-global-keys because I do</span> <span class="audio-time caption" data-speaker="Amin" data-start="2901.360000" data-stop="2904.279000">that very, very frequently.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2904.280000" data-stop="2906.599000">But I also have scripts that I can invoke.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2906.600000" data-stop="2910.239000">I should do keycast.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2910.240000" data-stop="2916.179000">So yeah, I can</span> <span class="audio-time caption" data-speaker="Amin" data-start="2916.180000" data-stop="2917.639000">invoke the prefix with semicolon.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2917.640000" data-stop="2921.919000">I can set my volume here, adjust it here, type in what</span> <span class="audio-time caption" data-speaker="Amin" data-start="2921.920000" data-stop="2927.039000">volume I want, or with the single quote, I can enter a</span> <span class="audio-time caption" data-speaker="Amin" data-start="2927.040000" data-stop="2929.079000">value for the screen brightness.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2929.080000" data-stop="2931.359000">I like these things to be exact depending on the</span> <span class="audio-time caption" data-speaker="Amin" data-start="2931.360000" data-stop="2932.039000">lighting in the room.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2932.040000" data-stop="2938.039000">I have preferred brightness values of 50 or 12 or 10</span> <span class="audio-time caption" data-speaker="Amin" data-start="2938.040000" data-stop="2940.039000">that I manually adjust.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2940.040000" data-stop="2944.999000">I guess it's a poor man's version of having something</span> <span class="audio-time caption" data-speaker="Amin" data-start="2945.000000" data-stop="2948.959000">with a light sensor that can pick up and adjust</span> <span class="audio-time caption" data-speaker="Amin" data-start="2948.960000" data-stop="2951.599000">automatically.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2951.600000" data-stop="2952.279000">I do it manually.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2952.280000" data-stop="2952.959000">Yeah.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2952.960000" data-stop="2957.179000">Sorry, you just muted yourself again.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="2957.180000" data-stop="2959.799000"><strong class="speaker-name">Sacha:</strong> You're just probably this close to writing</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2959.800000" data-stop="2962.119000">the Emacs Lisp that takes your webcam image and then</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2962.120000" data-stop="2962.879000">adjusts your light.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2962.880000" data-stop="2965.639000">But I think Prot was also saying he likes to do the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2965.640000" data-stop="2967.999000">lighting changes manually as well because warmer</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2968.000000" data-stop="2970.439000">colors versus cooler colors and all of that stuff.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2970.440000" data-stop="2972.839000">Anyway, so you have all these buttons that EXWM</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2972.840000" data-stop="2976.639000">listens to and it can launch various things for.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="2976.640000" data-stop="2981.899000">That's a lot of things.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="2981.900000" data-stop="2983.279000"><strong class="speaker-name">Amin:</strong> Yeah, those are pretty cool.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="2983.000000">49:43</span> <strong>exwm-input-simulation-keys!
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0045.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0045.jpg" alt="image from video 00:50:08.267" data-time="00:50:08.267"></a><span class="audio-time caption" data-speaker="Amin" data-start="2983.280000" data-stop="2985.959000"><strong class="speaker-name">Amin:</strong> EXWM has this lovely feature called input</span> <span class="audio-time caption" data-speaker="Amin" data-start="2985.960000" data-stop="2987.239000">simulation keys where</span> <span class="audio-time caption" data-speaker="Amin" data-start="2987.240000" data-stop="2990.439000">You can basically use it to bring Emacs key bindings</span> <span class="audio-time caption" data-speaker="Amin" data-start="2990.440000" data-stop="2993.799000">to other applications like Firefox or whatever.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2993.800000" data-stop="2995.959000">And yeah, it's mind blowing when you try it for the</span> <span class="audio-time caption" data-speaker="Amin" data-start="2995.960000" data-stop="2996.639000">first time.</span> <span class="audio-time caption" data-speaker="Amin" data-start="2996.640000" data-stop="3000.719000">for example, I bind C-b to just hit</span> <span class="audio-time caption" data-speaker="Amin" data-start="3000.720000" data-stop="3002.879000">the left arrow on the keyboard.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3002.880000" data-stop="3004.999000">And it does that.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3005.000000" data-stop="3008.239000">So I can define all of these commands that I'm using</span> <span class="audio-time caption" data-speaker="Amin" data-start="3008.240000" data-stop="3010.279000">or used to using in Emacs.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3010.280000" data-stop="3014.279000">So I can get them in Firefox or other applications as</span> <span class="audio-time caption" data-speaker="Amin" data-start="3014.280000" data-stop="3014.519000">well.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3014.520000" data-stop="3016.959000">Realistically, it's mostly Firefox.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3016.960000" data-stop="3019.319000">It's the only other program that I spend any</span> <span class="audio-time caption" data-speaker="Amin" data-start="3019.320000" data-stop="3021.159000">reasonable amount of time outside of Emacs.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3021.197000" data-stop="3024.199000"><strong class="speaker-name">Sacha:</strong> Let me point out this very important one that</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3024.200000" data-stop="3025.039000">you have there.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3025.040000" data-stop="3028.239000">Under selection/cut/copy/paste, I see a C-w</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3028.240000" data-stop="3030.519000">input simulation key.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3030.520000" data-stop="3033.079000">So this is for all the people who have accidentally</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3033.080000" data-stop="3036.079000">closed their browser tab while trying to copy text.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3036.080000" data-stop="3038.239000">This is how you solve that problem.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3038.240000" data-stop="3041.879000">Use EXWM and use EXWM input simulation keys and you</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3041.880000" data-stop="3045.599000">don't have to accidentally close your browser tabs</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3045.600000" data-stop="3046.439000">again.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3046.440000" data-stop="3049.039000">@blaiseutube asks, hey, what about time since last save?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3049.040000" data-stop="3051.319000">Or do you have some kind of autosave magic?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3051.320000" data-stop="3055.399000">you know, in reference to the uptime thing,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3055.400000" data-stop="3056.119000">right?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3056.120000" data-stop="3064.679000">You have this thing that shows you…</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="3064.680000" data-stop="3065.359000"><strong class="speaker-name">Amin:</strong> I don't think I have anything for autosave,</span> <span class="audio-time caption" data-speaker="Amin" data-start="3065.360000" data-stop="3072.079000">but I have this habit of… I save everything pretty</span> <span class="audio-time caption" data-speaker="Amin" data-start="3072.080000" data-stop="3073.239000">regularly.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3073.240000" data-stop="3075.359000">Yeah, so I've never really needed that feature, but</span> <span class="audio-time caption" data-speaker="Amin" data-start="3075.360000" data-stop="3078.199000">I'm sure Emacs has something where you can, at the</span> <span class="audio-time caption" data-speaker="Amin" data-start="3078.200000" data-stop="3081.239000">very least, just very dumb, simple implementation of</span> <span class="audio-time caption" data-speaker="Amin" data-start="3081.240000" data-stop="3084.519000">has it been idle for one minute, then just do a save</span> <span class="audio-time caption" data-speaker="Amin" data-start="3084.520000" data-stop="3085.599000">buffer.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3085.600000" data-stop="3087.759000">You can roll your own.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3087.760000" data-stop="3089.999000">But I don't have anything.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3090.000000" data-stop="3090.360000"><strong class="speaker-name">Sacha:</strong> All right.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3090.401000" data-stop="3094.359000">I'm getting really tempted now to try out EXWM, even</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3094.360000" data-stop="3097.919000">if it's just for those global keyboard remapping</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3097.920000" data-stop="3099.339000">things.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3099.000000">51:39</span> <strong>exwm: managing floating windows
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0046.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0046.jpg" alt="image from video 00:51:43.100" data-time="00:51:43.100"></a><span class="audio-time caption" data-speaker="Sacha" data-start="3099.340000" data-stop="3103.079000"><strong class="speaker-name">Sacha:</strong> How is it for windows that you've got to have floating?</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3103.080000" data-stop="3106.559000">I feel like it's very good at handling tiling things,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3106.560000" data-stop="3109.599000">but how is it for sometimes the apps kind of really</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3109.600000" data-stop="3112.439000">want the floating window?</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="3112.440000" data-stop="3114.879000"><strong class="speaker-name">Amin:</strong> Right, yeah, so you can toggle any window to</span> <span class="audio-time caption" data-speaker="Amin" data-start="3114.880000" data-stop="3118.279000">be floating or not, and you can also - actually, we're</span> <span class="audio-time caption" data-speaker="Amin" data-start="3118.280000" data-stop="3121.359000">just looking at it here. EXWM manage configurations,</span> <span class="audio-time caption" data-speaker="Amin" data-start="3121.360000" data-stop="3126.039000">to match on the instance name or the class name of a</span> <span class="audio-time caption" data-speaker="Amin" data-start="3126.040000" data-stop="3130.199000">window that you can get from xprop, to automatically</span> <span class="audio-time caption" data-speaker="Amin" data-start="3130.200000" data-stop="3134.959000">make that tiling. For example, if I do my prefix and</span> <span class="audio-time caption" data-speaker="Amin" data-start="3134.960000" data-stop="3138.159000">then capital T, it launches a floating terminal for me</span> <span class="audio-time caption" data-speaker="Amin" data-start="3138.160000" data-stop="3141.039000">here.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3141.040000" data-stop="3145.839000">And if I go back to where I set it up, I just launch</span> <span class="audio-time caption" data-speaker="Amin" data-start="3145.840000" data-stop="3147.719000">Xterm with the -name argument.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3147.720000" data-stop="3150.159000">This is where it can set the instance.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3150.160000" data-stop="3152.759000">And I just put any string you can want, like floating,</span> <span class="audio-time caption" data-speaker="Amin" data-start="3152.760000" data-stop="3153.359000">for example.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3153.360000" data-stop="3157.399000">And then here in my configuration, I just check that</span> <span class="audio-time caption" data-speaker="Amin" data-start="3157.400000" data-stop="3160.079000">if the instance name is floating, then I'll go ahead</span> <span class="audio-time caption" data-speaker="Amin" data-start="3160.080000" data-stop="3161.519000">and float the window.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3161.520000" data-stop="3163.919000">Simple as that.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3163.920000" data-stop="3165.639000"><strong class="speaker-name">Sacha:</strong> All right.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3165.640000" data-stop="3169.879000">This is starting to look exceedingly tempting.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3169.880000" data-stop="3173.839000">Lol, I save everything regularly, so he's one of those</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3173.840000" data-stop="3180.639000">people who compulsively hit C-x C-s.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="3180.640000" data-stop="3181.639000"><strong class="speaker-name">Amin:</strong> Yeah, I do that a lot.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3181.640000" data-stop="3182.239000">I don't know.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3182.240000" data-stop="3182.999000">It's just me.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3183.000000" data-stop="3184.759000">But, yeah.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3184.760000" data-stop="3185.239000">Yeah.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3185.240000" data-stop="3189.399000">And then, I don't know.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3189.400000" data-stop="3190.999000">EXWM is awesome.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3191.000000">53:11</span> <strong>exwm: application-specific local simulation keys
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0047.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0047.jpg" alt="image from video 00:53:11.000" data-time="00:53:11.000"></a><span class="audio-time caption" data-speaker="Amin" data-start="3191.000000" data-stop="3193.879000"><strong class="speaker-name">Amin:</strong> You can also put local simulation keys,</span> <span class="audio-time caption" data-speaker="Amin" data-start="3193.880000" data-stop="3196.999000">application-specific simulation keys, depending</span> <span class="audio-time caption" data-speaker="Amin" data-start="3197.000000" data-stop="3199.999000">on, the application, terminals, for</span> <span class="audio-time caption" data-speaker="Amin" data-start="3200.000000" data-stop="3201.559000">example, or, Zathura.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3201.560000" data-stop="3203.079000">This is a PDF viewer.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3203.080000" data-stop="3208.759000">To have application-specific custom key bindings,</span> <span class="audio-time caption" data-speaker="Amin" data-start="3208.760000" data-stop="3209.999000">how cool is that?</span> <span class="audio-time caption" data-speaker="Amin" data-start="3210.000000" data-stop="3213.199000">For example, if I'm in Xterm or something like the</span> <span class="audio-time caption" data-speaker="Amin" data-start="3213.200000" data-stop="3217.879000">Mate terminal, hitting C-c C-c twice basically,</span> <span class="audio-time caption" data-speaker="Amin" data-start="3217.880000" data-stop="3220.919000">it'll just send the C-c key to the terminal.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3220.920000" data-stop="3223.879000">Because one thing with EXWM is that you can set it to</span> <span class="audio-time caption" data-speaker="Amin" data-start="3223.880000" data-stop="3227.639000">capture a couple of Emacs prefixes, like C-x or</span> <span class="audio-time caption" data-speaker="Amin" data-start="3227.640000" data-stop="3228.079000">C-c.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3228.080000" data-stop="3232.399000">So the application by default doesn't see it because</span> <span class="audio-time caption" data-speaker="Amin" data-start="3232.400000" data-stop="3233.279000">Emacs captures it.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3233.280000" data-stop="3234.959000">But this is one of those</span> <span class="audio-time caption" data-speaker="Amin" data-start="3234.960000" data-stop="3239.599000">mechanisms by which you can send a key through.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3239.600000" data-stop="3244.219000">Let's see.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3244.000000">54:04</span> <strong>binding C-q to exwm-input-send-next-key</strong></div><p></p><span class="audio-time caption" data-speaker="Amin" data-start="3244.220000" data-stop="3249.639000"><strong class="speaker-name">Amin:</strong> The other thing is, you can set it like EXWM inputs</span> <span class="audio-time caption" data-speaker="Amin" data-start="3249.640000" data-stop="3250.999000">send next key.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3251.000000" data-stop="3253.999000">So the default is C-c C-q, but I just</span> <span class="audio-time caption" data-speaker="Amin" data-start="3254.000000" data-stop="3259.319000">bind it to C-q, and I, for example, can do</span> <span class="audio-time caption" data-speaker="Amin" data-start="3259.320000" data-stop="3261.639000">C-q C-t to send C-t to the</span> <span class="audio-time caption" data-speaker="Amin" data-start="3261.640000" data-stop="3262.679000">underlying application.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3262.680000" data-stop="3264.159000">So that's the other thing.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3264.160000" data-stop="3268.579000">Yeah, and then let's see.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3268.000000">54:28</span> <strong>Renaming buffers
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0049.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0049.jpg" alt="image from video 00:55:05.333" data-time="00:55:05.333"></a><span class="audio-time caption" data-speaker="Amin" data-start="3268.580000" data-stop="3271.239000"><strong class="speaker-name">Amin:</strong> So this thingy here, I enable EXWM and I add this</span> <span class="audio-time caption" data-speaker="Amin" data-start="3271.240000" data-stop="3275.199000">rename hook and all it does is basically to add the</span> <span class="audio-time caption" data-speaker="Amin" data-start="3275.200000" data-stop="3281.559000">window titles to the buffer that I can see on the</span> <span class="audio-time caption" data-speaker="Amin" data-start="3281.560000" data-stop="3283.479000">mode line.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3283.480000" data-stop="3285.599000">But as long as it's within a certain</span> <span class="audio-time caption" data-speaker="Amin" data-start="3285.600000" data-stop="3287.759000">reasonable length, like for example, I have 25</span> <span class="audio-time caption" data-speaker="Amin" data-start="3287.760000" data-stop="3288.239000">characters.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3288.240000" data-stop="3291.479000">If it's longer than that, it will just put dot dot dot (...).</span> <span class="audio-time caption" data-speaker="Amin" data-start="3291.480000" data-stop="3293.879000">So yeah, that's all the purpose of that.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3293.880000" data-stop="3300.599000">Let's see, for example, if I launch Xterm, it appears</span> <span class="audio-time caption" data-speaker="Amin" data-start="3300.600000" data-stop="3301.439000">there.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3301.440000" data-stop="3305.319000">The perfect example is actually here on the right-hand</span> <span class="audio-time caption" data-speaker="Amin" data-start="3305.320000" data-stop="3305.519000">side.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3305.520000" data-stop="3308.159000">On the mode line, we see Firefox ESR Emacs Chat.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3308.160000" data-stop="3311.079000">It's a bit long, so it just puts the dot dot dot there.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3311.080000" data-stop="3316.919000">So that's all that does.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3316.920000" data-stop="3319.759000"><strong class="speaker-name">Sacha:</strong> Yeah, now being able to use Emacs to manage</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3319.760000" data-stop="3321.919000">the tiling of these things instead of my having to</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3321.920000" data-stop="3326.079000">fiddle with alt-dragging things to snap nicely into</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3326.080000" data-stop="3326.639000">buffers.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3326.640000" data-stop="3328.759000">Yes, very cool stuff.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3328.760000" data-stop="3329.559000">EXWM.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3329.560000" data-stop="3332.739000">Gotta try it.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="3332.740000" data-stop="3334.399000"><strong class="speaker-name">Amin:</strong> Yeah, for sure.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3334.400000" data-stop="3336.279000">Yeah, let's see.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3336.000000">55:36</span> <strong>dunst for notifications
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0050.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0050.jpg" alt="image from video 00:55:36.300" data-time="00:55:36.300"></a><span class="audio-time caption" data-speaker="Amin" data-start="3336.280000" data-stop="3338.359000"><strong class="speaker-name">Amin:</strong> Here I launch Dunst if the executable is</span> <span class="audio-time caption" data-speaker="Amin" data-start="3338.360000" data-stop="3340.959000">installed for getting notifications in EXWM.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3340.960000" data-stop="3344.839000">I think there's at least one or two Emacs specific</span> <span class="audio-time caption" data-speaker="Amin" data-start="3344.840000" data-stop="3348.039000">packages that implement a simple notification</span> <span class="audio-time caption" data-speaker="Amin" data-start="3348.040000" data-stop="3351.599000">daemon or backend so that Emacs itself can handle</span> <span class="audio-time caption" data-speaker="Amin" data-start="3351.600000" data-stop="3352.039000">that.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3352.040000" data-stop="3354.679000">But I found Dunst good enough for my use cases coming</span> <span class="audio-time caption" data-speaker="Amin" data-start="3354.680000" data-stop="3357.399000">from i3, Sway, like tiling window manager</span> <span class="audio-time caption" data-speaker="Amin" data-start="3357.400000" data-stop="3358.639000">background.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3358.640000" data-stop="3360.559000">I just reuse that.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3360.560000" data-stop="3365.719000">So yeah, I just start a process, keep a handle of it</span> <span class="audio-time caption" data-speaker="Amin" data-start="3365.720000" data-stop="3367.759000">in this bandali&#45;&#45;dunst-process variable here.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3367.760000" data-stop="3371.919000">And this thing I discovered recently, it's cool.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3371.920000" data-stop="3375.279000">using set-process-query-on-exit-flag, you</span> <span class="audio-time caption" data-speaker="Amin" data-start="3375.280000" data-stop="3378.159000">can basically have Emacs not ask you if you want to</span> <span class="audio-time caption" data-speaker="Amin" data-start="3378.160000" data-stop="3381.159000">exit Emacs if that process is still running.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3381.160000" data-stop="3383.359000">It'll just kill it without confirming with you.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3383.360000" data-stop="3387.199000">So just a little convenience.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3387.200000" data-stop="3389.279000"><strong class="speaker-name">Sacha:</strong> That is also cool.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3389.280000" data-stop="3391.479000">Just a heads up, I have about 15 minutes before the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3391.480000" data-stop="3394.919000">kiddo runs out because she'll be done with school then.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3394.920000" data-stop="3397.879000">Even just the EXWM part and other things that you've</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3397.880000" data-stop="3401.599000">shown us in the config have been super awesome.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3401.600000" data-stop="3404.599000">But are there other things in the next 15 minutes that</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3404.600000" data-stop="3407.519000">you would love to show people so that they can see how</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3407.520000" data-stop="3414.539000">it works in practice?</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3414.000000">56:54</span> <strong>exwm xsettings and responding to screen configuration changes
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0051.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0051.jpg" alt="image from video 00:57:13.733" data-time="00:57:13.733"></a><span class="audio-time caption" data-speaker="Amin" data-start="3414.540000" data-stop="3415.999000"><strong class="speaker-name">Amin:</strong> One thing I'll just mention, EXWM,</span> <span class="audio-time caption" data-speaker="Amin" data-start="3416.000000" data-stop="3419.319000">one more thing, and then I'll go check.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3419.320000" data-stop="3424.679000">I think this is kind of recent: EXWM xsettings, and</span> <span class="audio-time caption" data-speaker="Amin" data-start="3424.680000" data-stop="3430.439000">this allows you to dynamically at runtime change some</span> <span class="audio-time caption" data-speaker="Amin" data-start="3430.440000" data-stop="3433.719000">of these things that you would normally set in an X</span> <span class="audio-time caption" data-speaker="Amin" data-start="3433.720000" data-stop="3440.839000">resources file, like fonts. These kinds of settings</span> <span class="audio-time caption" data-speaker="Amin" data-start="3440.840000" data-stop="3444.759000">were especially commonplace back when Wayland wasn't a</span> <span class="audio-time caption" data-speaker="Amin" data-start="3444.760000" data-stop="3447.279000">thing or wasn't very popular. You would set some of</span> <span class="audio-time caption" data-speaker="Amin" data-start="3447.280000" data-stop="3448.399000">these font settings there.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3448.400000" data-stop="3451.999000">With EXWM xsettings, you can do this dynamically,</span> <span class="audio-time caption" data-speaker="Amin" data-start="3452.000000" data-stop="3459.119000">and what's awesome about that is it also lets you hook</span> <span class="audio-time caption" data-speaker="Amin" data-start="3459.120000" data-stop="3463.119000">into, for example, if your screen configuration</span> <span class="audio-time caption" data-speaker="Amin" data-start="3463.120000" data-stop="3467.839000">changes, if you plug in a monitor or unplug it, then</span> <span class="audio-time caption" data-speaker="Amin" data-start="3467.840000" data-stop="3473.399000">you can run whatever xrandr command to set it up and</span> <span class="audio-time caption" data-speaker="Amin" data-start="3473.400000" data-stop="3475.199000">also adjust those settings.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3475.200000" data-stop="3479.399000">The main thing I use it for is to change the DPI</span> <span class="audio-time caption" data-speaker="Amin" data-start="3479.400000" data-stop="3483.639000">setting. The thing with X11 or Xorg is, unfortunately,</span> <span class="audio-time caption" data-speaker="Amin" data-start="3483.640000" data-stop="3487.439000">there's no per-monitor DPI. There's one global DPI.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3487.440000" data-stop="3491.799000">But I found that on my high-DPI laptop screen, if I</span> <span class="audio-time caption" data-speaker="Amin" data-start="3491.800000" data-stop="3496.159000">set the resolution to 1920x1080 instead of the full</span> <span class="audio-time caption" data-speaker="Amin" data-start="3496.160000" data-stop="3500.079000">resolution, then the default DPI of 96 works just fine</span> <span class="audio-time caption" data-speaker="Amin" data-start="3500.080000" data-stop="3504.479000">with my external monitor as well. All this little hook</span> <span class="audio-time caption" data-speaker="Amin" data-start="3504.480000" data-stop="3508.079000">does, by calling into this function, is: if I'm</span> <span class="audio-time caption" data-speaker="Amin" data-start="3508.080000" data-stop="3510.879000">plugging in my external monitor, lower the resolution</span> <span class="audio-time caption" data-speaker="Amin" data-start="3510.880000" data-stop="3515.119000">and lower the DPI, and if I unplug it, go back to the</span> <span class="audio-time caption" data-speaker="Amin" data-start="3515.120000" data-stop="3519.359000">high thing. I just love this.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3519.360000" data-stop="3520.533000"><strong class="speaker-name">Sacha:</strong> That's great.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3520.534000" data-stop="3522.199000">We're definitely not going to demonstrate that because</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3522.200000" data-stop="3524.079000">plugging in and unplugging monitors is not a good</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3524.080000" data-stop="3527.279000">thing for screen sharing, but that sounds really cool.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3527.280000" data-stop="3530.559000">When things change, you can actually get your system</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3530.560000" data-stop="3533.399000">to adapt to the changes for you.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="3533.400000" data-stop="3534.359000"><strong class="speaker-name">Amin:</strong> Yeah, it's lovely.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3534.360000" data-stop="3535.559000">Let's see.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3535.560000" data-stop="3539.879000">There's so much more to talk about.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3539.000000">58:59</span> <strong>Slowly getting back into Org mode</strong></div><p></p><span class="audio-time caption" data-speaker="Amin" data-start="3539.880000" data-stop="3543.359000"><strong class="speaker-name">Amin:</strong> I'm slowly getting back into Org Mode again.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3543.360000" data-stop="3548.479000">For the longest time, I didn't use it and I just used</span> <span class="audio-time caption" data-speaker="Amin" data-start="3548.480000" data-stop="3550.119000">Markdown for my website as well.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3550.120000" data-stop="3553.119000">But I found that it's kind of limited.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3553.120000" data-stop="3555.919000">For example, I was using a Markdown implementation</span> <span class="audio-time caption" data-speaker="Amin" data-start="3555.920000" data-stop="3559.199000">that was written in C and I can't easily customize it.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3559.200000" data-stop="3563.919000">Whereas with Org, I can hook into or create</span> <span class="audio-time caption" data-speaker="Amin" data-start="3563.920000" data-stop="3566.519000">my custom HTML backend that's a</span> <span class="audio-time caption" data-speaker="Amin" data-start="3566.520000" data-stop="3570.479000">derivative of ox-html, even if I don't necessarily like</span> <span class="audio-time caption" data-speaker="Amin" data-start="3570.480000" data-stop="3573.759000">the defaults or the settings for ox-html.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3573.760000" data-stop="3578.359000">I just recently started writing a new backend called</span> <span class="audio-time caption" data-speaker="Amin" data-start="3578.360000" data-stop="3581.079000">bhtml for Bandali HTML.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3581.080000" data-stop="3583.439000">It's just a boilerplate.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3583.440000" data-stop="3586.459000">I don't have much there yet, but that's the idea.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3586.460000" data-stop="3589.199000"><strong class="speaker-name">Sacha:</strong> I love how you can hook into all of these different</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3589.200000" data-stop="3592.119000">aspects of Emacs and get it to do exactly what you</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3592.120000" data-stop="3593.979000">want.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="3593.980000" data-stop="3594.679000"><strong class="speaker-name">Amin:</strong> Yeah, so that's cool.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3594.680000" data-stop="3598.159000">Let's see.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3598.000000">59:58</span> <strong>chat notes
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0052.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0052.jpg" alt="image from video 01:00:16.067" data-time="01:00:16.067"></a><span class="audio-time caption" data-speaker="Amin" data-start="3598.160000" data-stop="3601.319000"><strong class="speaker-name">Amin:</strong> I have written some things about the prompt for this</span> <span class="audio-time caption" data-speaker="Amin" data-start="3601.320000" data-stop="3601.679000">meeting.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3601.680000" data-stop="3608.999000">Yeah, so I talked about that stuff briefly.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3609.000000" data-stop="3611.639000">Minibuffer setup.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3611.640000" data-stop="3614.559000">Things that I love about my setup is that it's kind of</span> <span class="audio-time caption" data-speaker="Amin" data-start="3614.560000" data-stop="3616.039000">portable, simple.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3616.040000" data-stop="3618.839000">People can easily copy things from it if they want.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3618.840000" data-stop="3620.159000">It's kind of self-contained.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3620.160000" data-stop="3623.319000">And that was kind of a big thing a while back when I</span> <span class="audio-time caption" data-speaker="Amin" data-start="3623.320000" data-stop="3627.159000">wanted to use my configurations on a couple of work</span> <span class="audio-time caption" data-speaker="Amin" data-start="3627.160000" data-stop="3628.199000">machines.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3628.200000" data-stop="3632.799000">And these don't have direct outbound internet access.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3632.800000" data-stop="3636.599000">So I couldn't do things like installing packages with</span> <span class="audio-time caption" data-speaker="Amin" data-start="3636.600000" data-stop="3639.759000">ELPA because that's done over HTTP.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3639.760000" data-stop="3642.879000">So yeah, I use submodules now.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3642.880000" data-stop="3647.439000">I recently began documenting my setup, very much</span> <span class="audio-time caption" data-speaker="Amin" data-start="3647.440000" data-stop="3652.139000">inspired by Prot and Sacha and others.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3652.000000">1:00:52</span> <strong>Mode line</strong></div><p></p><span class="audio-time caption" data-speaker="Amin" data-start="3652.140000" data-stop="3654.759000"><strong class="speaker-name">Amin:</strong> The things that I'm looking forward to tweaking next</span> <span class="audio-time caption" data-speaker="Amin" data-start="3654.760000" data-stop="3655.759000">is the mode line.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3655.760000" data-stop="3658.933000">This is basically the default mode line of Emacs.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3658.934000" data-stop="3661.879000">A couple versions ago, they added a setting for</span> <span class="audio-time caption" data-speaker="Amin" data-start="3661.880000" data-stop="3663.479000">compacting the mode line, which</span> <span class="audio-time caption" data-speaker="Amin" data-start="3663.480000" data-stop="3666.733000">improves a lot of the extraneous whitespace in it,</span> <span class="audio-time caption" data-speaker="Amin" data-start="3666.734000" data-stop="3667.700000">which is great.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3667.701000" data-stop="3670.100000">It's still… There's too much information.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3670.101000" data-stop="3672.733000">If you use multiple windows</span> <span class="audio-time caption" data-speaker="Amin" data-start="3672.734000" data-stop="3674.067000">or even especially if you use EXWM</span> <span class="audio-time caption" data-speaker="Amin" data-start="3674.068000" data-stop="3676.900000">all of those things like the date</span> <span class="audio-time caption" data-speaker="Amin" data-start="3676.901000" data-stop="3678.467000">or like the battery get repeated</span> <span class="audio-time caption" data-speaker="Amin" data-start="3678.468000" data-stop="3680.000000">in all of the windows,</span> <span class="audio-time caption" data-speaker="Amin" data-start="3680.001000" data-stop="3682.000000">so I'm looking forward to</span> <span class="audio-time caption" data-speaker="Amin" data-start="3682.001000" data-stop="3684.700000">doing my mode line in such a way that</span> <span class="audio-time caption" data-speaker="Amin" data-start="3684.701000" data-stop="3689.619000">for example, it shows most of those things.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3689.620000" data-stop="3691.500000">And Prot actually has</span> <span class="audio-time caption" data-speaker="Amin" data-start="3691.501000" data-stop="3692.900000">an excellent video about that</span> <span class="audio-time caption" data-speaker="Amin" data-start="3692.901000" data-stop="3695.667000">where he shows how you can create</span> <span class="audio-time caption" data-speaker="Amin" data-start="3695.668000" data-stop="3698.739000">your own custom mode line.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3698.740000" data-stop="3699.700000"><strong class="speaker-name">Sacha:</strong> I've also been tempted</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3699.701000" data-stop="3701.833000">to start using the header line too</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3701.834000" data-stop="3702.833000">because that's another thing</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3702.834000" data-stop="3705.799000">that you can put information in.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="3705.800000" data-stop="3709.319000"><strong class="speaker-name">Amin:</strong> Right, yep, header-line is awesome.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3709.000000">1:01:49</span> <strong>display-buffer-alist</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3709.320000" data-stop="3710.319000"><strong class="speaker-name">Sacha:</strong> Yeah, the display-buffer-alist</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3710.320000" data-stop="3711.799000">is particularly powerful</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3711.800000" data-stop="3714.799000">because you're combining it with EXWM, so it'd be</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3714.800000" data-stop="3718.959000">interesting to see how you can manage windows and</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3718.960000" data-stop="3721.479000">applications and stuff.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="3721.480000" data-stop="3722.833000"><strong class="speaker-name">Amin:</strong> Especially, just like how we saw</span> <span class="audio-time caption" data-speaker="Amin" data-start="3722.834000" data-stop="3723.599000">in today's video call</span> <span class="audio-time caption" data-speaker="Amin" data-start="3723.600000" data-stop="3725.959000">and also a call that I had with Prot recently.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3725.960000" data-stop="3728.119000">For example, if I open a describe-variable or</span> <span class="audio-time caption" data-speaker="Amin" data-start="3728.120000" data-stop="3731.999000">something, it'll by default use the right area of the</span> <span class="audio-time caption" data-speaker="Amin" data-start="3732.000000" data-stop="3734.999000">screen right now where our video is.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3735.000000" data-stop="3735.639000">So it reuses that.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3735.640000" data-stop="3741.439000">So I'm also looking forward to reading more about and</span> <span class="audio-time caption" data-speaker="Amin" data-start="3741.440000" data-stop="3743.480000">configuring display-buffer-alist.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3743.000000">1:02:23</span> <strong>TRAMP slowness, maybe disabling VC detection?</strong></div><p></p><span class="audio-time caption" data-speaker="Amin" data-start="3743.481000" data-stop="3744.619000"><strong class="speaker-name">Amin:</strong> I'd like to figure out some TRAMP slowness.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3744.620000" data-stop="3745.679000">I recently tried using it again.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3745.680000" data-stop="3746.199000">It's awesome.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3746.200000" data-stop="3750.039000">You can seamlessly open files, SSH into other</span> <span class="audio-time caption" data-speaker="Amin" data-start="3750.040000" data-stop="3751.399000">machines and edit files there.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3751.400000" data-stop="3753.039000">But I don't know.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3753.040000" data-stop="3753.959000">It's kind of slow.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3753.960000" data-stop="3756.919000">So I want to see aside from the latency, you know, the</span> <span class="audio-time caption" data-speaker="Amin" data-start="3756.920000" data-stop="3760.759000">physical limit of the latency because of the distance.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3760.760000" data-stop="3763.479000">Is there anything slowing it down?</span> <span class="audio-time caption" data-speaker="Amin" data-start="3763.480000" data-stop="3767.439000">I think I read in the Tramp FAQ that maybe trying to</span> <span class="audio-time caption" data-speaker="Amin" data-start="3767.440000" data-stop="3773.479000">disable VC mode or VC detection for remote connections</span> <span class="audio-time caption" data-speaker="Amin" data-start="3773.480000" data-stop="3776.119000">might help speed it up, or at least having it do only</span> <span class="audio-time caption" data-speaker="Amin" data-start="3776.120000" data-stop="3780.479000">Git, for example, because by default, Emacs's VC has</span> <span class="audio-time caption" data-speaker="Amin" data-start="3780.480000" data-stop="3787.399000">support for Mercurial, CVS, SVN, Git, RCS even.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3787.400000" data-stop="3789.639000"><strong class="speaker-name">Sacha:</strong> Anything anyone has ever wanted to use in the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3789.640000" data-stop="3790.879000">last 40 years.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3790.880000" data-stop="3793.519000">Here we go.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3793.520000" data-stop="3798.879000">I saw in your chat config actually that you were doing</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3798.880000" data-stop="3803.079000">something with the SSH configs and I'd never come</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3803.080000" data-stop="3803.799000">across that.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3803.800000" data-stop="3809.879000">So I was like, oh, that's something I should look into</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3809.880000" data-stop="3812.639000">later.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="3812.640000" data-stop="3814.159000"><strong class="speaker-name">Amin:</strong> I don't remember the specifics, but it's all</span> <span class="audio-time caption" data-speaker="Amin" data-start="3814.160000" data-stop="3814.839000">out there.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3814.840000" data-stop="3819.239000">Feel free to look into it.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3819.000000">1:03:39</span> <strong>eat</strong></div><p></p><span class="audio-time caption" data-speaker="Amin" data-start="3819.240000" data-stop="3822.959000"><strong class="speaker-name">Amin:</strong> Especially with this EXWM setup, I still use Xterm</span> <span class="audio-time caption" data-speaker="Amin" data-start="3822.960000" data-stop="3825.919000">sometimes and I have the Emacs EAT terminal, which is</span> <span class="audio-time caption" data-speaker="Amin" data-start="3825.920000" data-stop="3829.799000">a terminal emulator written in Emacs Lisp.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3829.800000" data-stop="3833.159000">If I launch it right now, it's awesome.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3833.160000" data-stop="3837.119000">It actually is very powerful and it's a properly</span> <span class="audio-time caption" data-speaker="Amin" data-start="3837.120000" data-stop="3838.479000">capable terminal emulator.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3838.480000" data-stop="3840.719000">It just can be a little bit slow.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3840.720000" data-stop="3844.319000">It is slower than xterm, but it's still a lot faster</span> <span class="audio-time caption" data-speaker="Amin" data-start="3844.320000" data-stop="3846.119000">than whatever Emacs has built in.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3846.120000" data-stop="3847.519000">So this is pretty cool.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3847.520000" data-stop="3850.159000">But yeah, I don't want to use it a lot.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3850.160000" data-stop="3853.919000">And I kind of started testing, delegating more</span> <span class="audio-time caption" data-speaker="Amin" data-start="3853.920000" data-stop="3858.119000">things or using more async-shell-command to just</span> <span class="audio-time caption" data-speaker="Amin" data-start="3858.120000" data-stop="3860.679000">basically open this prompt and then do whatever I</span> <span class="audio-time caption" data-speaker="Amin" data-start="3860.680000" data-stop="3861.159000">want.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3861.160000" data-stop="3862.879000">anyway.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3862.880000" data-stop="3866.839000"><strong class="speaker-name">Sacha:</strong> I've also heard things about Ghost TTY.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3866.840000" data-stop="3870.599000">Anyway, so that's another thing to look into.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3870.600000" data-stop="3876.959000">Yes, so @Paniash47 says, "With Emacs 31, there's a new</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3876.960000" data-stop="3878.759000">variable where you can hide the minor modes in the</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3878.760000" data-stop="3879.079000">mode line."</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3879.080000" data-stop="3881.559000">@pkal says it's mode-line-collapse-minor-modes.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3881.560000" data-stop="3884.599000">And @Paniash47 also says, "I personally use the Minions</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3884.600000" data-stop="3887.679000">package by Tarsius, and it has some nice features in</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3887.680000" data-stop="3888.959000">addition to the built-in features."</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3888.960000" data-stop="3891.008000">So other people are tinkering around</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3891.009000" data-stop="3892.919000">with their mode lines as well.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="3898.320000" data-stop="3898.919000"><strong class="speaker-name">Amin:</strong> Yeah, it's pretty cool.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3898.920000" data-stop="3902.479000">And then I don't know, I think maybe you touched on</span> <span class="audio-time caption" data-speaker="Amin" data-start="3902.480000" data-stop="3904.399000">something a couple of minutes ago that I was going to</span> <span class="audio-time caption" data-speaker="Amin" data-start="3904.400000" data-stop="3907.179000">go back to, but I forget.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="3907.000000">1:05:07</span> <strong>TRAMP completion</strong></div><p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3907.180000" data-stop="3909.999000"><strong class="speaker-name">Sacha:</strong> Tramp SSH completion out of your configs.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3910.000000" data-stop="3912.919000">I was like, there's a Tramp sconfig in here that I've</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3912.920000" data-stop="3913.639000">never used.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3913.640000" data-stop="3915.119000">And that sounded interesting.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3915.120000" data-stop="3920.839000">Yeah, tramp-parse-sconfig.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="3920.840000" data-stop="3924.699000"><strong class="speaker-name">Amin:</strong> Ah, right, right, right. Yeah.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3924.700000" data-stop="3926.599000"><strong class="speaker-name">Sacha:</strong> Which, of course, we're not going to let go</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3926.600000" data-stop="3929.359000">because it's private stuff, but yeah.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="3929.360000" data-stop="3929.999000"><strong class="speaker-name">Amin:</strong> Right.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3930.000000" data-stop="3931.199000">Yeah, you're welcome to try this.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3931.200000" data-stop="3933.319000">I'm pretty sure, actually, I took this from the Tramp</span> <span class="audio-time caption" data-speaker="Amin" data-start="3933.320000" data-stop="3934.159000">manual itself.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3934.160000" data-stop="3937.679000">And it's one of those things where it's set and</span> <span class="audio-time caption" data-speaker="Amin" data-start="3937.680000" data-stop="3940.719000">forget, I don't remember.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3940.720000" data-stop="3941.639000">But yeah, it's here.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3941.640000" data-stop="3945.519000">There was something else that I also wanted to show,</span> <span class="audio-time caption" data-speaker="Amin" data-start="3945.520000" data-stop="3946.159000">but I forget.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3946.160000" data-stop="3949.759000">Let me see if looking at the outlines will remind me</span> <span class="audio-time caption" data-speaker="Amin" data-start="3949.760000" data-stop="3952.539000">or if I will see it.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3952.540000" data-stop="3953.799000"><strong class="speaker-name">Sacha:</strong> And that's one of the things I love about</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3953.800000" data-stop="3956.199000">literate configuration is, you know, just kind of look</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3956.200000" data-stop="3959.479000">at the structure and skim it and try to find something</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3959.480000" data-stop="3963.839000">with keywords and ordered lists and all that stuff.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="3963.840000" data-stop="3967.799000"><strong class="speaker-name">Amin:</strong> Right. Yup. Exactly.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="3967.800000" data-stop="3970.039000"><strong class="speaker-name">Sacha:</strong> Oh, and you know, people will have access to</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3970.040000" data-stop="3972.119000">your full configuration because it is in your</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3972.120000" data-stop="3974.999000">repository and you have that lovely HTML export for it</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3975.000000" data-stop="3975.559000">as well.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3975.560000" data-stop="3980.159000">So if you, uh, if, if people want to follow up, they</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3980.160000" data-stop="3980.799000">can go through that</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3980.800000" data-stop="3984.319000">at length. At some point, you're going to add some more</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3984.320000" data-stop="3987.919000">screenshots and possibly even video clips to it.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="3987.920000" data-stop="3994.539000">so that's there you at https://git.kelar.org</span> <p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0053.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0053.jpg" alt="image from video 01:06:34.567" data-time="01:06:34.567"></a><span class="audio-time caption" data-speaker="Amin" data-start="3994.540000" data-stop="3996.159000"><strong class="speaker-name">Amin:</strong> This is my configurations repository.</span> <span class="audio-time caption" data-speaker="Amin" data-start="3996.160000" data-stop="4001.159000">If you go here to treeview .emacs.d, this is the org</span> <span class="audio-time caption" data-speaker="Amin" data-start="4001.160000" data-stop="4001.919000">file.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4001.920000" data-stop="4005.639000">I also export all of those individual components into</span> <span class="audio-time caption" data-speaker="Amin" data-start="4005.640000" data-stop="4007.279000">this lisp subdirectory.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4007.280000" data-stop="4009.319000">All that stuff is here.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4009.320000" data-stop="4014.299000">The QMK thingy that was mentioned.</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="4014.000000">1:06:54</span> <strong>ffs: form feed slides, ^L
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0054.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0054.jpg" alt="image from video 01:08:15.933" data-time="01:08:15.933"></a><span class="audio-time caption" data-speaker="Amin" data-start="4014.300000" data-stop="4015.359000"><strong class="speaker-name">Amin:</strong> Oh, I wanted to mention FFS.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4015.360000" data-stop="4016.399000">Okay, I'll do that as well.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4016.400000" data-stop="4017.959000">Yeah, what's up with that?</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="4017.960000" data-stop="4019.199000"><strong class="speaker-name">Sacha:</strong> I was trying to find information.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4019.200000" data-stop="4020.559000">It was like, there's no package.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4020.560000" data-stop="4025.539000">It's not what is this thing?</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="4025.540000" data-stop="4027.959000"><strong class="speaker-name">Amin:</strong> It's FormFeed Slides and it's going to soon be</span> <span class="audio-time caption" data-speaker="Amin" data-start="4027.960000" data-stop="4028.359000">a package.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4028.360000" data-stop="4030.519000">I was actually talking to Prot about it and I'm hoping</span> <span class="audio-time caption" data-speaker="Amin" data-start="4030.520000" data-stop="4033.399000">to submit it for inclusion in GNU ELPA within, I don't</span> <span class="audio-time caption" data-speaker="Amin" data-start="4033.400000" data-stop="4035.279000">know, the next couple of weeks.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4035.280000" data-stop="4038.759000">It's basically very similar to Prot's Logos package.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4038.760000" data-stop="4042.999000">Turns out we both had the same kind of idea at the</span> <span class="audio-time caption" data-speaker="Amin" data-start="4043.000000" data-stop="4046.599000">exact same time in 2022, and we both used it for our</span> <span class="audio-time caption" data-speaker="Amin" data-start="4046.600000" data-stop="4050.319000">LibrePlanet 2022 presentations.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4050.320000" data-stop="4053.119000">Of course, Prot being the diligent person that he is,</span> <span class="audio-time caption" data-speaker="Amin" data-start="4053.120000" data-stop="4055.428000">he polished his work, documented it,</span> <span class="audio-time caption" data-speaker="Amin" data-start="4055.429000" data-stop="4056.479000">put it on GNU ELPA.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4056.480000" data-stop="4058.622000">I still haven't gotten around to doing it yet,</span> <span class="audio-time caption" data-speaker="Amin" data-start="4058.623000" data-stop="4060.719000">but better late than never.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4060.720000" data-stop="4062.359000">Yeah, let's see.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4062.360000" data-stop="4064.559000">I can maybe show a quick demonstration of that.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4064.560000" data-stop="4067.719000">So let's see.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4067.720000" data-stop="4069.399000">Let's see.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4069.400000" data-stop="4077.439000">Anyway, so if I go to my website sources and</span> <span class="audio-time caption" data-speaker="Amin" data-start="4077.440000" data-stop="4080.159000">net-beyond-web.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4080.160000" data-stop="4083.759000">So I had the LibrePlanet talk a couple years ago.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4083.760000" data-stop="4087.959000">So what FFS is basically, it looks for a</span> <span class="audio-time caption" data-speaker="Amin" data-start="4087.960000" data-stop="4088.867000">particular character in this case,</span> <span class="audio-time caption" data-speaker="Amin" data-start="4088.868000" data-stop="4092.919000">or the default case,</span> <span class="audio-time caption" data-speaker="Amin" data-start="4092.920000" data-stop="4095.929000">it's the page-delimiter, ^L,</span> <span class="audio-time caption" data-speaker="Amin" data-start="4095.930000" data-stop="4099.079000">which you can insert by hitting C-q C-l.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4099.080000" data-stop="4103.759000">It basically then designates each of these areas</span> <span class="audio-time caption" data-speaker="Amin" data-start="4103.760000" data-stop="4108.959000">as one slide. So, very, very simple slideshow</span> <span class="audio-time caption" data-speaker="Amin" data-start="4108.960000" data-stop="4111.439000">that you don't even have to use Org or outline or any</span> <span class="audio-time caption" data-speaker="Amin" data-start="4111.440000" data-stop="4115.599000">other major or minor mode. If I launch ffs,</span> <span class="audio-time caption" data-speaker="Amin" data-start="4115.600000" data-stop="4122.239000">by default, it's in a mode where it binds a couple of</span> <span class="audio-time caption" data-speaker="Amin" data-start="4122.240000" data-stop="4124.919000">convenience keys, like p and n, to go into the next</span> <span class="audio-time caption" data-speaker="Amin" data-start="4124.920000" data-stop="4125.639000">and previous slide.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4125.640000" data-stop="4129.999000">You can hit e to edit a slide, similar to Org source, and</span> <span class="audio-time caption" data-speaker="Amin" data-start="4130.000000" data-stop="4132.639000">then make your changes and all of that.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4132.640000" data-stop="4137.899000">And then you can start a presentation by hitting s.</span> <p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0055.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0055.jpg" alt="image from video 01:08:58.767" data-time="01:08:58.767"></a><span class="audio-time caption" data-speaker="Amin" data-start="4137.900000" data-stop="4141.439000"><strong class="speaker-name">Amin:</strong> It has hooks for, for example, bumping up the font size</span> <span class="audio-time caption" data-speaker="Amin" data-start="4141.440000" data-stop="4144.599000">or whatever, hiding the mode line.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4144.600000" data-stop="4147.599000">I can toggle the mode line by hitting m here.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4147.600000" data-stop="4150.959000">Let's see.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4150.960000" data-stop="4156.399000">I can also toggle the cursor with c, to make the cursor</span> <span class="audio-time caption" data-speaker="Amin" data-start="4156.400000" data-stop="4157.199000">visible or not.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4157.200000" data-stop="4158.439000">So, yeah.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4158.440000" data-stop="4163.479000">And then I'm just hitting p and n.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="4163.480000" data-stop="4165.119000"><strong class="speaker-name">Sacha:</strong> Very simple, very minimalist.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4165.120000" data-stop="4168.399000">You have a file, you've got page markers, and that's</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4168.400000" data-stop="4171.859000">all you got.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="4171.860000" data-stop="4172.919000"><strong class="speaker-name">Amin:</strong> Yeah, pretty much.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4172.920000" data-stop="4174.819000">And then…</span> <p></p><div class="transcript-heading"><span class="audio-time" data-start="4174.000000">1:09:34</span> <strong>Speaker notes</strong></div><p></p><span class="audio-time caption" data-speaker="Amin" data-start="4174.820000" data-stop="4176.799000"><strong class="speaker-name">Amin:</strong> The neat thing that it has that I also liked</span> <span class="audio-time caption" data-speaker="Amin" data-start="4176.800000" data-stop="4179.799000">implementing at the time is it has a speaker notes</span> <span class="audio-time caption" data-speaker="Amin" data-start="4179.800000" data-stop="4180.639000">feature.</span> <p></p><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0056.jpg"><img loading="lazy" target="_blank" src="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/mpv-shot0056.jpg" alt="image from video 01:09:47.767" data-time="01:09:47.767"></a><span class="audio-time caption" data-speaker="Amin" data-start="4180.640000" data-stop="4184.999000"><strong class="speaker-name">Amin:</strong> So you can designate a file as being the speaker</span> <span class="audio-time caption" data-speaker="Amin" data-start="4185.000000" data-stop="4187.759000">notes where it has the same structure separators with</span> <span class="audio-time caption" data-speaker="Amin" data-start="4187.760000" data-stop="4190.679000">^L. But you can type your notes over here,</span> <span class="audio-time caption" data-speaker="Amin" data-start="4190.680000" data-stop="4190.959000">whatever.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4190.960000" data-stop="4194.639000">And you can basically open these in two different</span> <span class="audio-time caption" data-speaker="Amin" data-start="4194.640000" data-stop="4197.879000">windows or two different frames on separate displays.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4197.880000" data-stop="4201.159000">And then in whichever one of those you advance the</span> <span class="audio-time caption" data-speaker="Amin" data-start="4201.160000" data-stop="4205.779000">slides, like p n n, it also does the other one.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="4205.780000" data-stop="4206.967000"><strong class="speaker-name">Sacha:</strong> That's brilliant.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4206.968000" data-stop="4209.319000">I was looking for a way to do that so I can pretend to</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4209.320000" data-stop="4211.279000">know what I'm talking about when I have something on</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4211.280000" data-stop="4215.159000">screen, but I can just read my notes or even just</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4215.160000" data-stop="4216.839000">remember what points I wanted to make.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4216.840000" data-stop="4218.039000">So this is great.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4218.040000" data-stop="4219.119000">You have speaker notes.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4219.120000" data-stop="4220.639000">You've got the main screen.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4220.640000" data-stop="4221.999000">They can be in two different frames.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4222.000000" data-stop="4224.679000">You can have your frame that you're sharing and your</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4224.680000" data-stop="4227.199000">frame that you're not sharing that has all of your</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4227.200000" data-stop="4227.799000">cheat sheets.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4227.800000" data-stop="4229.079000">Excellent.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4229.080000" data-stop="4231.119000">And on that note, in about one minute, the kid is</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4231.120000" data-stop="4234.039000">going to come running out and want to have snack and</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4234.040000" data-stop="4234.599000">all that stuff.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4234.600000" data-stop="4237.959000">Thank you so much for walking through parts of your</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4237.960000" data-stop="4238.279000">config.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4238.280000" data-stop="4239.559000">There is more.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4239.560000" data-stop="4242.559000">And so everyone who wants to find out more can go</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4242.560000" data-stop="4243.759000">check out your setup.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4243.760000" data-stop="4247.359000">I have a great many things that I want to try out,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4247.360000" data-stop="4253.039000">starting from EXWM to little things like figuring out</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4253.040000" data-stop="4255.799000">a boom mic setup because apparently your audio setup</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4255.800000" data-stop="4257.159000">is making me very jealous.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4257.160000" data-stop="4260.279000">Yes, thank you for doing this.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4260.280000" data-stop="4262.839000">I'm going to post the transcript and the chapters.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4262.840000" data-stop="4264.479000">I have a chapter every minute.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4264.480000" data-stop="4268.319000">It's going to be a long time.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4268.320000" data-stop="4269.399000">But it was good.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4269.400000" data-stop="4270.359000">Lots of cool stuff.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4270.360000" data-stop="4273.199000">Thank you again.</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="4273.200000" data-stop="4274.233000"><strong class="speaker-name">Amin:</strong> Sounds great.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4274.234000" data-stop="4275.159000">And yeah, you're very welcome.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4275.160000" data-stop="4276.959000">And thank you so much for having me as well, Sacha.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4276.960000" data-stop="4279.159000">I'm very delighted to be here, especially, I think,</span> <span class="audio-time caption" data-speaker="Amin" data-start="4279.160000" data-stop="4280.359000">just by chance.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4280.360000" data-stop="4283.079000">I think I'm the first person who you're doing this</span> <span class="audio-time caption" data-speaker="Amin" data-start="4283.080000" data-stop="4284.759000">with after the long hiatus.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4284.760000" data-stop="4286.679000">So that's an extra honor for me.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4286.680000" data-stop="4288.759000">But yeah, it's been fun.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4288.760000" data-stop="4292.479000">I could go on for hours.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4292.480000" data-stop="4293.719000">I'm sure we both could.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4293.720000" data-stop="4297.219000">This has been fun.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="4297.220000" data-stop="4299.233000"><strong class="speaker-name">Sacha:</strong> If we wanted to go on for hours,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4299.234000" data-stop="4300.933000">Prot has more flexible scheduling,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4300.934000" data-stop="4303.033000">so he can chat with people for</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4303.034000" data-stop="4304.667000">two hours and stuff, and you already have</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4304.668000" data-stop="4306.159000">conversations going on with him.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4306.160000" data-stop="4308.959000">But I unfortunately have a small mammal who's 10</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4308.960000" data-stop="4312.119000">years old and loves me very much, and likes to not let</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4312.120000" data-stop="4313.799000">me concentrate for very long.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4313.800000" data-stop="4316.319000">But thank you everyone for joining.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4316.320000" data-stop="4317.799000">Thank you for the chat.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4317.800000" data-stop="4318.959000">And thank you also, stream,</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4318.960000" data-stop="4320.319000">for all the interesting questions.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4320.320000" data-stop="4322.519000">I will send you all the information</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4322.520000" data-stop="4323.479000">and update the post.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4323.480000" data-stop="4326.599000">And we'll see you all on Thursday.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4326.600000" data-stop="4328.279000">I've got another chat.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4328.280000" data-stop="4330.719000">All of a sudden, all these Emacs chats</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4330.720000" data-stop="4331.719000">are going to happen.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4331.720000" data-stop="4332.119000">Thanks.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4332.120000" data-stop="4336.119000">Oh, and you said you're happy to be on the hook for</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4336.120000" data-stop="4340.259000">doing another EmacsConf this year, right?</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="4340.260000" data-stop="4341.868000"><strong class="speaker-name">Amin:</strong> Yes. You can hold me to that.</span> <span class="audio-time caption" data-speaker="Amin" data-start="4341.480000" data-stop="4343.200000">There will be another EmacsConf this year</span> <span class="audio-time caption" data-speaker="Amin" data-start="4343.201000" data-stop="4344.933000">and I will be active in it.</span> <p></p><span class="audio-time caption" data-speaker="Sacha" data-start="4344.934000" data-stop="4346.567000"><strong class="speaker-name">Sacha:</strong> Alright then, I'm going to end that broadcast.</span> <span class="audio-time caption" data-speaker="Sacha" data-start="4346.568000" data-stop="4349.159000">Thanks everyone, bye!</span> <p></p><span class="audio-time caption" data-speaker="Amin" data-start="4349.160000" data-stop="4350.000000"><strong class="speaker-name">Amin:</strong> Thank you, bye bye!</span></div>
<p></p>


<a name="end-ec21-transcript"></a></details>
</div>
</div>
<div id="outline-container-current-notes-for-next-time-emacs-chat-21-amin-bandali-chat" class="outline-3">
<h3 id="current-notes-for-next-time-emacs-chat-21-amin-bandali-chat">Chat</h3>
<div class="outline-text-3" id="text-current-notes-for-next-time-emacs-chat-21-amin-bandali-chat">
<ul class="org-ul">
<li>sachactube: This is a test message</li>
<li>sachactube: Getting ready for Emacs Chat 21 with Amin Bandali, <a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/">https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/</a></li>
<li>JacksonScholberg: Yo</li>
<li>sachactube: Yo yo yo, we are live!</li>
<li>IhorRadchenkoyantar92: &hellip; and the list can continue until the end of the stream? :)</li>
<li>IhorRadchenkoyantar92: do you compile those packages?</li>
<li>sachactube: Automatically compiled by prepare-user-lisp because of user-lisp-directory, I think</li>
<li>IhorRadchenkoyantar92: makes sense</li>
<li>IhorRadchenkoyantar92: this configure macro looks a lot like good old use-package</li>
<li>IhorRadchenkoyantar92: I just do (use-package foo :config <a id="orga0df547"></a>) and then :tangle no in actual src block</li>
<li>IhorRadchenkoyantar92: what is funny, with-eval-after-load is itself a macro</li>
<li>sachactube: hahaha, it's much smaller though</li>
<li>IhorRadchenkoyantar92: not smaller at all! Because there is recursion with-eval-after-load (macro) -&gt; eval-after-load (also macro!)</li>
<li>IhorRadchenkoyantar92: hmm. wrong</li>
<li>IhorRadchenkoyantar92: ok. let me not do two things at the same time</li>
<li>blaiseutube: yay, I made it!</li>
<li>blaiseutube: screenshots and also asciicinema</li>
<li>blaiseutube: asciinema ?</li>
<li>blaiseutube: whatever</li>
<li>sachactube: and gif-screencast</li>
<li>blaiseutube: nice</li>
<li>blaiseutube: Sacha, your mic volume is just a bit lower than his so it's a bit harder (for me) to hear you.</li>
<li>sachactube: Hmm, let me try turning my dial, let's see if this next one is better</li>
<li>blaiseutube: better, I think</li>
<li>blaiseutube: it's also that Amin has an awesome microphone. The result sounds like Amin is in the room with me and we are both listening to you on speakerphone. it's not terrible</li>
<li>blaiseutube: we're all friends her</li>
<li>blaiseutube: here</li>
<li>sachactube: I think we have the same mic, but he has an awesome setup, so I'm going to bug him for tips =D</li>
<li>paniash47: Hello there! Nice to see this chat. :)</li>
<li>blaiseutube: yes, low gain and close mic is good. Sacha if prefer to avoid a boom, you can use a microphone with a tight pattern and increase gain. LMK if you want to unleash my inner audio engineer.</li>
<li>sachactube: oooh. my mic is right next to my laptop though, so I'm not sure I can get away from the typing noises</li>
<li>sachactube: I'll just have to get cozy with y'all</li>
<li>blaiseutube: mini buffet is an underrated superpower. I think Kakoune adopted that also</li>
<li>blaiseutube: helpful for a11y and users with sequential processing/ ADHD issues</li>
<li>blaiseutube: (I noticed that the comments are recorded so I'm trying to add value 🥴)</li>
<li>paniash47: Split keyboards make sense with vanilla keybindings. I'd like to switch but moving from evil is difficult :(</li>
<li>sachactube: much appreciated!</li>
<li>blaiseutube: what about "time since last save" or do you have some auto save magic?</li>
<li>blaiseutube: 🤯</li>
<li>blaiseutube: emacs all the things</li>
<li>blaiseutube: LOL, "I save everything regularly" &hellip;so he's one of <mark>those</mark> people.</li>
<li>paniash47: I think with emacs 31, there's a new variable where you can hide the minor modes in the modeline</li>
<li>pkal_: mode-line-collapse-minor-modes</li>
<li>paniash47: I personally use the minions package by tarsius (Magit author) and it has some nice features in addition to the built-in feature.</li>
<li>paniash47: ghostel is the package :)</li>
<li>blaiseutube: BRB</li>
</ul>

<p>
Find more Emacs Chats or join the fun: <a href="https://sachachua.com/emacs-chat">https://sachachua.com/emacs-chat</a>
</p>
</div>
</div>
<div><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/index.org">View Org source for this post</a></div><p>You can <a href="https://social.sachachua.com/@sacha/statuses/01KQSRZ5PF37X0VDHJMMFZPNWT" 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%2F05%2Femacs-chat-with-amin-bandali%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">May 21: Emacs Chat with Raymond Zeitler</title>
		<link rel="alternate" type="text/html" href="https://sachachua.com/blog/2026/05/emacs-chat-with-raymond-zeitler/"/>
		<author><name><![CDATA[Sacha Chua]]></name></author>
		<updated>2026-04-22T18:32:32Z</updated>
    <published>2026-04-22T18:32:32Z</published>
    <category term="emacs" />
<category term="emacs-chat-podcast" />
<category term="emacs-chat" />
		<id>https://sachachua.com/blog/2026/05/emacs-chat-with-raymond-zeitler/</id>
		<content type="html"><![CDATA[<p>
On May 21, I'll chat with Raymond Zeitler about Emacs and life.
</p><div class="yt-video"><iframe width="456" height="315" title="YouTube video player" src="https://www.youtube-nocookie.com/embed/ro6BZI0Z64I?enablejsapi=1" frameborder="0" allowfullscreen=""></iframe><a href="https://youtube.com/live/ro6BZI0Z64I">Watch on YouTube</a></div>
<p></p>

<p>
<span class="timestamp-wrapper"><time class="timestamp" datetime="2026-05-21T10:30:00-0400">&lt;2026-05-21 Thu 10:30&gt;&ndash;&lt;2026-05-21 Thu 11:30&gt;</time></span> America/Toronto = Thu May 21 1030H EDT / 0930H CDT / 0830H MDT / 0730H PDT / 1430H UTC / 1630H CEST / 1730H EEST / 2000H IST / 2230H +08 / 2330H JST
</p>

<p>
This session will be recorded, and I'll update this blog post with notes.
<a href="https://sachachua.com/blog/2026/05/emacs-chat-with-raymond-zeitler/">https://sachachua.com/blog/2026/05/emacs-chat-with-raymond-zeitler/</a>
</p>

<p>
Find more Emacs Chats or join the fun: <a href="https://sachachua.com/emacs-chat">https://sachachua.com/emacs-chat</a>
</p>
<div><a href="https://sachachua.com/blog/2026/05/emacs-chat-with-raymond-zeitler/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%2F05%2Femacs-chat-with-raymond-zeitler%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">June 18: Emacs Chat with Ross A. Baker</title>
		<link rel="alternate" type="text/html" href="https://sachachua.com/blog/2026/04/june-18-emacs-chat-with-ross-a-baker/"/>
		<author><name><![CDATA[Sacha Chua]]></name></author>
		<updated>2026-04-22T18:28:45Z</updated>
    <published>2026-04-22T18:28:45Z</published>
    <category term="emacs" />
<category term="emacs-chat-podcast" />
<category term="emacs-chat" />
		<id>https://sachachua.com/blog/2026/04/june-18-emacs-chat-with-ross-a-baker/</id>
		<content type="html"><![CDATA[<p>
</p><div class="yt-video"><iframe width="456" height="315" title="YouTube video player" src="https://www.youtube-nocookie.com/embed/_tEcqbi_2o8?enablejsapi=1" frameborder="0" allowfullscreen="">nil</iframe><a href="https://youtube.com/live/_tEcqbi_2o8">Watch on YouTube</a></div>
<p></p>

<p>
<span class="timestamp-wrapper"><time class="timestamp" datetime="2026-06-18T10:30:00-0400">&lt;2026-06-18 Thu 10:30&gt;&ndash;&lt;2026-06-18 Thu 11:30&gt;</time></span> America/Toronto = Thu Jun 18 1030H EDT / 0930H CDT / 0830H MDT / 0730H PDT / 1430H UTC / 1630H CEST / 1730H EEST / 2000H IST / 2230H +08 / 2330H JST
</p>

<p>
On June 18, I'll chat with <a href="https://rossabaker.com/">Ross Baker</a> about Emacs and life.
</p>

<ul class="org-ul">
<li><a href="https://rossabaker.com/blog/">Blog</a>
<ul class="org-ul">
<li><a href="https://rossabaker.com/tags/emacs/">Posts tagged #emacs</a></li>
</ul></li>
<li><a href="https://rossabaker.com/configs/emacs/">Emacs config</a>
<ul class="org-ul">
<li><a href="https://rossabaker.com/configs/emacs/early-init/">Emacs Early Init</a></li>
<li><a href="https://rossabaker.com/configs/emacs/khlav-kalash/">Khlav Kalash Emacs</a></li>
<li><a href="https://rossabaker.com/configs/emacs/crab-juice/">Crab Juice Emacs</a></li>
<li><a href="https://rossabaker.com/configs/emacs/rab-starter/">Starter Emacs configuration</a></li>
</ul></li>
</ul>

<p>
This session will be recorded, and I'll update this blog post with notes.
<a href="https://sachachua.com/blog/2026/04/june-18-emacs-chat-with-ross-a-baker/">https://sachachua.com/blog/2026/04/june-18-emacs-chat-with-ross-a-baker/</a>
</p>

<p>
Find more Emacs Chats or join the fun: <a href="https://sachachua.com/emacs-chat">https://sachachua.com/emacs-chat</a>
</p>
<div><a href="https://sachachua.com/blog/2026/04/june-18-emacs-chat-with-ross-a-baker/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%2Fjune-18-emacs-chat-with-ross-a-baker%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">Transcript: Emacs chat with John Wiegley</title>
		<link rel="alternate" type="text/html" href="https://sachachua.com/blog/2012/07/transcript-emacs-chat-john-wiegley/"/>
		<author><name><![CDATA[Sacha Chua]]></name></author>
		<updated>2014-12-11T01:16:18Z</updated>
    <published>2012-07-02T12:00:06Z</published>
    <category term="emacs" />
<category term="Emacs Chat" />
<category term="org" />
<category term="podcast" />
		<id>https://sachachua.com/blog/?p=23536</id>
		<content type="html"><![CDATA[<p>This post is long, so if you&#8217;re reading this on the main page, go to <a href="https://sachachua.com/blog/2012/07/transcript-emacs-chat-john-wiegley/">https://sachachua.com/blog/2012/07/transcript-emacs-chat-john-wiegley/</a> to view the full transcript!</p>
<p>Here&#8217;s the video.</p>
<p><iframe loading="lazy" width="480" height="360" src="https://www.youtube.com/embed/ytNsHmRLZGM" frameborder="0" allowfullscreen=""></iframe></p>
<p><a href="https://archive.org/download/20120612EmacsChatJohnWiegley/2012-06-12-Emacs-Chat-John-Wiegley.mp3">You can also download the MP3.</a><br>
</p>
<p><a href="http://vimeo.com/44778543">John Wiegley &#8211; June 26, 2012</a> from <a href="http://vimeo.com/user1851927">Sacha Chua</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<h3>A day in the life of John Wiegley</h3>
<p>Sacha: One of the things I’ve always been curious about is all the different things that you use Emacs for. You’ve been one of our role models for ages now, and clearly you do a lot of Emacs Lisp programming with it, but what’s a day in the life of John Wiegley like?</p>
<p>J: I spend the most of my time in Org and Gnus. All of my task management… I think I’ve processed over 5,000 tasks in Org mode now, since I started using it. I’m a very very heavy Org mode user. I’m always in Gnus, always checking my e-mail through that. I use ERC. I actually run a second Emacs. For my Mac, I built another Emacs under another name, and I use that Emacs just for running ERC. I use that in conjunction with bitlbee so that I’m always on IM, always on IRC, and also that’s my Twitter client as well. So that’s always running on the side as well. I spend a lot of time then in Eshell, all the programming modes… Most of my day work is in C and C++ when I’m not hacking elisp.</p>
<p>S: Why do you keep your ERC in a separate Emacs? To minimize distraction, or…</p>
<p>J: When I’m hacking on Emacs, I end up needing to restart it quite often. Many many times a day, sometimes. That’s because I never know which definitions… Sometimes you change a definition from a function to a macro or vice versa, and you don’t know which other definitions you have to reevaluate in order for them to inline the new definition. Rather than have to figure that out all the time, I just restart Emacs.</p>
<p>S: Hence your trick of making sure that everything’s compiled and that you’re requiring all the files you need so that it loads up cleanly.</p>
<p>J: I just recently fixed a problem in my .emacs and I discovered that compiling it was not giving me any speed benefit. I thought compilation was what was making my .emacs run so fast, and it wasn’t. It was that I was loading—when I was running a non-byte-compiled Emacs,I was loading things that I didn’t need to load. When I fixed that problem, which is now fixed in my .emacs repository, Emacs loads in just over a second, but without doing any byte-compilation in my Emacs.</p>
<p>S: I must definitely be doing something long, because my Emacs takes a while to load.</p>
<p>J: How long?</p>
<p>S: I don’t know. I tried using the profiling thing, and because I use the Emacs Starter Kit, it didn’t get very deep. It feels like ten seconds or so. It takes a while. I can’t be bouncing it up and down like you do.</p>
<p>S: So you do a lot of Emacs Lisp programming, naturally. You’re on ERC, and you’re doing C and C++ development. Are there other really weird things you do that people wouldn’t expect Emacs to handle?</p>
<p>J: Let me think… I use it to play chess online.</p>
<p>S: Yeah, there are so many games in there! I play Nethack in there, so… pot, kettle, black, here.</p>
<p>J: I use it to look at databases. I use it… Let’s see… I of course use TRAMP to edit not only files remotely, but also local files through sudo so that I can edit them. Weird things I do in Emacs… A mode I forgot to mention is that I use git for all the version control that I do, and so magit is a mode that I just basically live in. For any project that I’m working on, the magit buffer becomes the home buffer for that project, and I’m constantly looking at that buffer to see what work I’ve done, what work should be committed now.</p>
<p>S: I haven’t made that a big part of my workflow yet, but I’ve heard such good things about it.</p>
<p>J: It’s a very nice mode. I use it in conjunction with the built-in vc mode of Emacs. If I’m editing a file and I really quickly want to know what I’ve done to this file, I’ll do C-x v = to get the diff of the current file. If I want an overview of what have I been doing and what I have been touching, I’ll go to the magit buffer and look at the stats.</p>
<p>S: I guess you version-control your Org files too. How many Org files do you typically work with, and how do you manage that?</p>
<p>J: I have eight. All of my active tasks exist in a single Org file. The other seven Org files are all archives. I have an archive file for every project, even though the live project lives in the main TODO file. That way, when I do an Org search, it’s only at that time that it loads in all of the Org files to do the search. I need Org to be as quick as it can, since I’m basically modifying tasks and adding tasks to it as the days go on.</p>
<p>S: That could be it. I’ve got a humongous Org file and org-refile takes a while trying to parse it.</p>
<p>J: Yes, it does, it does. I use Dropbox to synchronize my Org-mode files to my iPhone because I use org-mobile. Another interesting tool I have found is that there’s an app for the iPhone called dropVox, which lets you take a voice note and it puts it into Dropbox. I have an Org-mode hook so that whenever I open my Org-mode buffer, if there’s an audio file in my Dropvox box, it will pop up Dired and show it to me, meaning “You should listen to this and add it as a note to your Org mode now.”</p>
<p>S: That’s awesome. That’s like If This Then That on steroids.</p>
<p>J: All during the day, new tasks are coming in. They’re either coming in by ideas, by e-mail, by webpages… I have a keybinding I use in Emacs. Since I don’t use M-m for anything else, M-m is my make-a-note keybinding. So, wherever I’m at, if I hit M-m, it will make an org-capture and it will link it to whatever I was on when I did the capture, and it will link it to whatever I was on when I did the capture. If I was on an e-mail, it links it to the e-mail. Well, there’s a tool for the Mac called Quick Keys, and Quick Keys lets you rebind things globally on your system. I’ve made it so that M-n works anywhere on the system and tries to be as intelligent as it can. If I’m looking at Chrome and I hit M-n, it will take me to Emacs, pop up the org-capture buffer, and then put a link over to the webpage that I was looking at.</p>
<p>S: Is that using org-protocol or just QuickKeys?</p>
<p>J: It’s not using org-protocol. It’s just using QuickKeys. The only thing QuickKeys is really doing is it’s switching over, and then I use AppleScript from Emacs to talk to Chrome and get the information. I actually use AppleScript quite a lot for many different things. Using AppleScript from Emacs is something I do often.</p>
<p>S: What are some of the other AppleScripty things you do with Emacs?</p>
<p>J: I don’t like to keep Dropbox running all the time because it takes lots of background CPU. At the end of a few days, when I look at my process list and I look at total time in the kernel spent by all the process, Dropbox is usually #2 behind the kernel itself. That’s a little egregious to me when I’m only using it once in a while. I have Applescript so that in Org Mode, when I say go get my mobile tasks, it starts up Dropbox, waits half a minute, and then stops Dropbox. So it’s just running enough time to do this synchronization. And of course, I use that async module that I told you about last week to do that work.</p>
<p>S: It sounds like you’ve got it quite integrated into the other things you use on your Mac. That’s fantastic.</p>
<p>J: Emacs is the center of my entire environment.</p>
<p>S: Being able to glue all these bits together and make things work… That’s incredible.</p>
<h3>On wishlists and Emacs Lisp</h3>
<p>S: What are some of things you wish you could glue together? What’s the John Wiegley to-code-some-point-in-the-future list?</p>
<p>J: I’d like it if Emacs had a foreign function interface so that I could talk directly to databases and other things. There’s a fork of XEmacs that can communicate directly with PostgreSQL, and something like that would be nice because there are some systems that I work with where it would just be faster and more efficient if Emacs could talk to those systems directly instead of me having to communicate with them over a process. Embedding a Python interpreter, or embedding a Ruby interpreter…</p>
<p>S: Vim is extensible in a couple of different languages now, isn’t it?</p>
<p>J: I do prefer Emacs Lisp. I have to tell you that probably of all the languages I’ve used, definitely, Emacs Lisp has been the most fun. I won’t call it the best language out there because it does have its downsides and it’s a little bit slow. I can’t use it for most general tasks. But it’s fun, because you see results immediately, the debugger’s easy to use, the documentation is great and completely available at the tip of your fingers. It may be true that I have written more new code in Emacs Lisp than in any other language by this time.</p>
<p>S: I wouldn’t be surprised.</p>
<p>J: I’ve worked on much bigger projects in C and C++, but those didn’t always involve spitting out reams and reams of new code. Whereas as the day goes by, I’m writing new Emacs Lisp functions usually left and right to get particular jobs done.</p>
<p>S: I’m always running into your name. Oh, Planner! Oh, remember! Oh, eshell!</p>
<p>J: Too bad not all of those projects succeeded as well as I’d hoped.</p>
<p>S: Going back to talking about org-capture and picking up an annotation really quickly… I remember when we were playing around with that. Finding ways to hook parts of Emacs into all the different parts of Emacs… It’s great to see so many people playing around with these ideas.</p>
<h3>The Emacs community</h3>
<p>J: It’s a great community. It’s a good culture around Emacs.</p>
<p>S: How did we end up with something as cool as this? Emacs is pretty unique among the software packages or open source tools I’ve seen. Vim users are pretty happy and they share a lot of tips, and on the other end of the spectrum there’s Eclipse, and there’s a ton of development work around Eclipse, but Emacs… it’s old, but lots of stuff is going on. Why?</p>
<p>J: My opinion on that would be is that the real success was the Lisp machine. The Lisp machine was an entire machine that was what Emacs is to editing. You sit down at your operating system and it doesn’t matter what you’re using – your editor, your shell, your document viewer, whatever – they’re all written in Lisp. You can modify them as you go. The documentation for anything is available as you’re looking at it. You can pop the system into a debugger at any time. Lisp machines may not have succeeded, but Emacs Lisp… Emacs took that environment and that idea, and brought it down to the domain of a single application, the editor. It gives us all the cool things about the Lisp machine: the fact that the debugger’s available all the time and the documentation is completely cross-linked with everything. I think that’s probably what we’re experiencing, and that’s why it’s so much fun.</p>
<p>S: … And the fact that you can get in, you can tweak just that little thing just a little bit, and eventually end up with this massive Emacs configuration because you’ve been tweaking it to fit you.</p>
<p>J: I have to say that the original designers and Dr. Stallman – they had a very good idea when they put in a lot of hooks throughout Emacs. There are other extensible systems out there in the world that are not as extensible because they lack sufficient degree of hookage inside, places where you can latch on a piece of code to execute when something happens. Emacs has got those everywhere. That plus its advising system lets you basically change the behaviour of anything or augment the behaviour of anything.</p>
<p>S: I have to confess it’s one of the things I like the way that Ruby on Rails will let you open up classes, redefine functions, and then continue on with your work. The extensibility built into the very language is very very helpful. It also can be very intimidating.</p>
<h3>Learning Emacs</h3>
<p>S: We’ve talked about this before. You’re maybe one of a few Emacs users over there. I’ll on occasion run into someone who’s curious about Emacs but hasn’t taken the plunge. How do we get more people interested in this stuff?</p>
<p>J: Well, getting them interested is not that hard. It&#8217;s getting them to climb the learning curve that&#8217;s difficult. My wife&#8217;s a physician, and she sees what I do with Org-mode. She&#8217;s been tempted to learn Emacs just to use Org-mode.</p>
<p>S: I hear a lot of stories like that.</p>
<p>J: But the learning curve is so enormous that she just doesn&#8217;t have the time to learn it.</p>
<p>S: At some point you were very much into Vi, and then you said, okay, we’re going to learn things the Emacs way. You just sat down and you did it. Is that something we expect people to sit down and do at some point? Have you come across any things that make it easier for people?</p>
<p>J: Not necessarily that make it easier for people, unfortunately. I think it’s a philosophy thing. I use Emacs. I’m in Emacs and I use Emacs probably 70% of my every working day. It pays dividends to master it. Every efficiency gain I get in Emacs, I get to make use of right away, and it pays off as the days go by. There are people who type for their living who don’t know how to touch-type. That, to me, is the exact same scenario. How can you make your living as an engineer, typing day in, day out, and yet lose the productivity that you would gain by learning to touch-type. Even learning to touch-type – yeah, it will take you a few weeks. You either use a piece of software or go to class, whatever. So there is a hump that you have to get over, and you may not have the time to get over that hump right now, but it’s an investment, and that investment will pay off.</p>
<p>S: Get to know your tools and get to know them really well, because you’re using them all the time. In terms of Emacs, Emacs being very very big and Emacs being something that moves very quickly, what are some of the things that you want to dig into and learn more about?</p>
<p>J: I would like to learn the C side of Emacs more. I’ve never known the C side of Emacs. I’ve just recently been looking at the bytecode interpreter and trying to learn how it does what it does to see if there are ways to get better performance into Emacs. That, for me, is the undiscovered country. That’s where I want to go next.</p>
<p>S: It does sound like a lot of deep magic. That’s the very core of it.</p>
<p>J: It’s not as crazy as it seems. It’s pretty well done on the inside. Emacs without all of its Lisp modes and packages on top of it, if you boil it down to just its essence… the kernel is not really that huge. It’s a very small, very tidy, simple thing. Of course, there are places where it has some rough edges that can be smoothed, but it’s not what people think of as Emacs. They think of this kitchen sink application that does absolutely everything. That’s a lot of Lisp stuff that goes around the little kernel, whereas the kernel is very tight and small. I want to know more about that because anything done in the kernel affects everything else.</p>
<p>S: If you ever get around to doing annotated source code, I’d definitely read that.</p>
<h3>Making money with Emacs</h3>
<p>S: I hear you’re kinda on the hook for eshell documentation or whatever else people would like you to write.</p>
<p>J: That’s true. There’s a reason why the eshell documentation was never written. This would be a whole different discussion. I have some misgivings about what kind of world the GPL would create if it was everywhere. I do a lot of my programming as a hobbyist, but I have to make money programming as well.</p>
<p>The way to make money through software is usually to sell it. Otherwise, if you make money only through services, that never takes off. If you make a piece of software and you license it, it can take off. It can start making money for you and you don’t have to work to earn every day. Then you can use that time that you now have to make more software.</p>
<p>If the only income that you ever made was based on services, then you basically have to be working all day long, and when would you ever get your hobby coding done? When you only have six to eight hours a day to do any coding at all (because there are things that we have to do), you want to have a setup where you can do as much creative coding as possible.</p>
<p>Since the GPL’s view of the world is that you get paid through the services and you get paid through the documentation, when I released eshell, my thought was, “Okay, I’ve written the code, the code is in the GPL, so it’s freely distributable and I can’t charge anyone for it, but if they want services around eshell, then they can pay me for that.” I have always told the community that if someone wants to step up and pay for it, I’ll write the eshell documentation. But that’s never happened. So if the community doesn’t value the eshell documentation enough to pay me to do it, then why would I spend the time that I could be spending coding to write it?</p>
<p>S: Do you know what kind of bounty system we have or something like that for lots of people to say, “I want to pitch in so and so much to e-shell documentation?” Do we have that?</p>
<p>J: Yeah, or a Kickstarter project, for example.</p>
<p>S: That would be cool.</p>
<h3>New users and Emacs happiness</h3>
<p>S: You’ve been an awesomely prolific Emacs Lisp programmer, so it would be interesting…</p>
<p>J: Well, it’s just that I’ve been doing it for so long. It’s been eighteen years now since the first package that I wrote and submitted to Emacs. I know! You were just a kid back then when I was writing align.el.</p>
<p>S: I was ten! I’ve used align.el.</p>
<p>J: Yup. It was made when you were ten.</p>
<p>S: Are you seeing a lot of other young people get interested in this stuff?</p>
<p>J: Sure! It’s basically if you’re not going to be using an IDE like Visual Studio or Eclipse or something, Emacs is still one of the two great editors out there. It’s either going to be you go with Emacs or you go with Vim. It still pulls in new people all the time.</p>
<p>S: There’s just so much. Once people start customizing it, they get sucked in. As you said earlier, there’s a lot of interest in Emacs from the nontechnical side of the world. Writing, scientific papers…</p>
<p>J: We’re getting a lot of new users just because of Org mode.</p>
<p>S: How many years ago was that? Now, it’s just grown into this massive thing where people are writing their research papers and they’re doing their data analyses in org-babel, and having something come out… Literate programming writ large.</p>
<p>J: I started using it in 2007 and I think it was a couple of years old by then already. I tried to drop Org-mode a couple of times. I was thinking, there are sexier-looking apps for the Mac. There are apps that have better and tighter integration for the iPhone. On two different occasions, I left, converted all of my tasks over to a different program, used that program for a few months, came back to Org… and I always felt happy to be back in Org. I don’t know what it is about it. It looks right. It feels right. It’s got the right balance between how finely you can enter and manipulate the information, and how coarsely you can look at it at a glance. Other applications that I used… I don’t know.</p>
<p>There was just something about them, but I wasn’t getting the tasks done. I would put all the tasks into the application and I’d be excited about it for a few weeks, and then after a couple of months, I just wouldn’t look at it any more. I would know that the tasks were in it, but I would never do anything about them. The way I use Org Mode, I use it like a day planner, so that every task I intend to do is scheduled for a particular day. I’m rescheduling tasks and moving them to new days every single day for years now, and it just never has felt like a burden. So there’s something that Org does right.</p>
<p>S: There’s the hack that you told me about the other time where you change your window size, so you watch it shrink as you finish your tasks.</p>
<p>J: I fit it to the window.</p>
<p>S: Little motivational hacks that you can do because you can play around with the tool itself. I remember when I was trying to learn through flashcards using flashcard.el, I rigged it up so that it would tell me a joke using fortune.el and everything I got something right. It was either that or show me a cute cat picture from the files I’d saved off icanhascheezburger. The fact that you can hack it to do all sorts of crazy things… that’s incredible.</p>
<p>J: I just started playing around with its ability to view PDF files. You can use C-x C-f to open a PDF file and you’ll see it in your Emacs. It renders them page by page as PNG files, and then uses the Imagemagick extension built into Emacs 24 to show you those pages. Which is useful to me because I’m often looking at a language specification as I’m writing code, and it’s nice to have it in another buffer the way that I would have Emacs documentation. I can look at the C++ standard now and have it just be in another buffer.</p>
<p>S: How did you come across this new capability, because I didn’t know about this?</p>
<p>J: I think I ran into it accidentally. I think I was in Dired mode and I hit return on a PDF instead of hitting ! to open it, and all of a sudden, there it was, and I was, like, “Wow, I didn’t know Emacs could do that…”</p>
<p>S: Basically, for people who want to learn things… Just do random things in Emacs!</p>
<p>J: Although if you’re going to do random things in Emacs, take notes. Otherwise, you’ll never know how to get back to what you found.</p>
<p>S: That’s what the lossage buffer is for, isn’t it?</p>
<p>J: The lossage buffer can be a bit hard to read, though.</p>
<p>S: Execute-extended-command?</p>
<p>J: I did find on Emacswiki a mode called Command Log. It keeps in a very readable form every command you use.</p>
<p>S: I definitely have to pick up this habit of yours of just reading Emacswiki.</p>
<p>J: That’s how I started learning. You asked about how people get over the learning hump. I’ll tell you what I did. Back in 1994, when I started really wanting to know Emacs, what I did was I printed out the Emacs manual, which at the time was I think seven or eight hundred pages. It was just single-sided paper. I probably killed a small tree doing it. But I brought that stack of papers over to my desk and I put it to the side. At the time, my machine was slow enough that I was often waiting for builds to finish. What I would do is while whatever was building on my machine, I would pick up the top page of the Emacs manual, I’d read it, and then I would throw it away. I just did that over several weeks’ time. I ended up reading the Emacs manual in all of this dead time that I had, waiting for compilations to finish. I made that a yearly habit for the first four years, just to constantly refresh my knowledge of what’s in there, because it’s such a massively huge environment. It helped.</p>
<p>S: My story is that I’ve used Emacspeak to synthesize the Emacs manual so that I can listen to it while walking around. I was reading my mail off Gnus at the time. You could use Emacspeak to read your mail and all of that stuff. You find all these ways to cram information into your brain. I would be up for more podcasts. I see people are coming out with books as well. There’s the Org mode book. That might be another way for you to do it, right? You write your documentation and you say, here’s a book that you can buy. But then it’s very speculative work, I suppose.</p>
<h3>Back to earning</h3>
<p>S: Speaking of other things that integrate into Emacs… Thank you for writing Ledger, by the way, because I still run all my finances with it. I have no idea where I’m going to find an accountant who understands Ledger…</p>
<p>J: Our biggest problem right now.</p>
<p>S: Either we put together a Kickstarter so that you end up writing a manual and accountants all over the world will be like, “This is awesome!”. Or I just learn how to use Quickbooks.</p>
<p>J: Ledger does have a manual. That was one I wrote the manual for. It’s also not GPLed.</p>
<p>S: There you go. There are ways to work around that… So your ideal is figure out how people can pay you for documentation because all the code is GPLed anyway. Are there other models that seem to be working for other people, other ways to make the awesome hackers that work on this stuff happy so that people can keep working on this cool stuff?</p>
<p>J: Not with Emacs hacking. I’ve been paid one time now to do a course on Emacs because my company does training, and Emacs training is one of things that we do offer.</p>
<p>S: You should definitely explore that remote training aspect.</p>
<p>J: We’re looking into that. I believe that is the only time in my life that I have earned money just because of Emacs. So it hasn’t paid for itself monetarily, but it’s paid for itself in other ways.</p>
<p>S: In terms of efficiency, being able to do all these things and fly through that. Anyway, that might be an interesting challenge for us also, figuring out how we can get more Emacs geeks to be rich and famous.</p>
<p>J: That’ll be the day.</p>
<p>S: Imagine if we had an Emacs app marketplace?</p>
<p>J: Yeah, seriously… Wow. Just propose that idea on the mailing list and see what a flamewar that would begin.</p>
<h3>The developer community</h3>
<p>S: But it is very nice to be able to play around with all these packages, and there are thousands… A lot of them will go and look for ways to integrate with each other, like the way BBDB integrates with Gnus.</p>
<p>J: That’s another one that I use. And there’s always new stuff coming out, and authors are very good about interacting with each other. The author of helm just recently incorporated using my async module that I wrote. He did that just in a matter of a few days. Since helm is something I rely upon on all the time, I’m very happy to see that.</p>
<p>S: That’s actually one of the challenges I came across when it came to writing documentation or writing a book about Emacs, especially the modules that people are working on. The packages, right? You share an idea, and the maintainers would be, like, “That’s an excellent idea!” and they would fold it in. So I kept running out of book topics! That’s a good thing about the community. It moves so fast.</p>
<p>J: If people are looking to know Emacs better, they should also stop by the IRC channel. I’m there every day, and a lot of people there can give good help if you have questions.</p>
<p>S: Yeah. It only looks off-topic from time to time, but if people show up with Emacs questions…</p>
<p>J: It also depends on the time of day, too.</p>
<p>S: Do evenings tend to work for you? When do people usually hang out there?</p>
<p>J: I’m a night coder, so that’s when I’m there, but people are there all around the clock.</p>
<p>S: I tend to drop by in the evenings too, when I remember to do that. ERC makes it so easy because it’s just there.</p>
<p>J: Yeah, I haven’t seen you there that often. You should come by more.</p>
<p>S: I know.</p>
<p>J: I always see you at the very end of my night, what would be dawn for most people. That’s when you usually come in.</p>
<p>S: That’s funny. I’ve got to work on my timing. One of the things I want to do is figure out if we can have a regular Google Hangout or whatever, right… It’s easy to do screen-sharing through that and you can have multiple people, so, if we just get people together and say, “What have you learned about Emacs lately?” then it’s slightly more visual than IRC.</p>
<p>J: There’s also Twitter. A lot of people use that to talk about new stuff they’ve found in Emacs.</p>
<p>S: Yeah, I’ve seen a couple of people tweeting really short Emacs tips, and it’s great to see that kind of stuff going on. I remember people used to have Emacs tips in their e-mail signatures as well. All these little ways to increase randomness. Emacs is so huge that if you just find little ways to say, “Oh, hey, there’s this new feature” or “There’s this interesting command over here,” who knows what it’ll spark?</p>
<p>J: There’s too much good stuff.</p>
<h3>More tips for new people</h3>
<p>S: So you recommend that if people are new, they should check out the IRC channel, EmacsWiki…</p>
<p>J: Go through the Emacs tutorial first. Then stop by the channel, read the Emacs manual, pick something you want to accomplish with Emacs and focus your learning around making that happen, rather than taking on the task of trying to swallow the whole thing right up front.</p>
<p>S: People will easily divide into… You want to do programming, check out the EmacsWiki pages on the respective languages. If you want to do text editing or the subspecies of research paper editing or whatever else, then there are pages for that too.</p>
<p>J: There’s always more stuff out there than you’re aware of. I’ve been trying to make myself aware of everything that’s out there, and I keep running into new stuff on a daily basis. Just yesterday I found swank-js, which lets you interact with the Javascript interpreter inside your browser as a REPL. You can connect to Firefox and be manipulating the webpage through an Emacs REPL using Javascript. Isn’t that crazy? If I were doing web development, I could see that that would just be invaluable.</p>
<p>S: I will go have to check that out. You’ve also mentioned a couple of other Emacs blogs, like Mastering Emacs… Is that one syndicated on Planet Emacsen yet?</p>
<p>J: I don’t know. I’m not sure if I have… I aggregate all of my feeds in Gnus into a virtual group, so I’m never aware of the actual source of any feed, I just get presented with one group that has all the current happenings in Emacs.</p>
<h3>Emacs blogs and reading with Gnus + Gwene</h3>
<p>S: Someday we should totally get your OPML and cross-reference it with everything that’s syndicated there.</p>
<p>J: That’s true. That wouldn’t be a bad project, maintain an OPML file of all the Emacs feeds out there on the Net, because I would love to keep my list updated. I went through and did a search through Gwene to see all the feeds that it had syndicated, which is of course not all the feeds that are out there. I did that two years ago, so there have been new feeds since.</p>
<p>S: I’ll take that away as a TODO and see if Planet Emacsen will have all these things… Who was that in charge of it? Edward, Edward O’Connor.</p>
<p>J: Yeah, that’s right. So any time you find a new feed, add it to Gwene. That way, anyone who goes to the Gwene server with Gnus can just do a search for all groups matching to Emacs and subscribe to them all.</p>
<p>S: With Gwene, when you reply, does it get posted as a comment too?</p>
<p>J: I’ve never replied to anything on a Gwene server, so I have no idea what it does.</p>
<p>S: Yeah, it would be tricky to make it that smart. It would be cool, but it would be tricky.</p>
<p>J: There are so many blogging platforms and some require authorization and some have CAPTCHAs… It would be tough. I really thank Lars for setting that server up, because it allows me to digest a lot of news about Emacs in a very short period of time each day.</p>
<h3>Dealing with data overload</h3>
<p>S: What are some of your other massive-amounts-of-information-how-do-I-deal-with-this tips?</p>
<p>J: You mean just coping with data overload?</p>
<p>S: Whether it’s programming, news, mail… How do you filter?</p>
<p>J: I use virtual groups a lot to aggregate so that I’m not overwhelmed by a huge number of groups that have lots of unread messages. I’d rather have fewer groups with more messages in them. Then I use Gnus’ very handy adaptive scoring with Gwene. In my .emacs repository, there’s a file called my-gnus-score. I’ve codified everything related to my scoring configuration in that file, so if you want to use the system that I use, that’s the file to get. Adaptive scoring basically allows me to go into a group and then if I see a thread there that’s not interesting to me and I don’t read it, I will never see that thread again. All of my groups only ever show me threads I’m currently reading, or new threads. I don’t have to wait through stuff I’m not interested in any more. It’s not that it just downscores it, it doesn’t appear at all. That’s a good way for me to cope with the thousands of articles per day that get downloaded to my machine, because I’m only reading maybe forty of them at best. That’s one good way to cope with the data over load.</p>
<p>S: I’ve never found anything that had the kind of scoring that Gnus has. I want it with everything. I want it with Gmail, I want it with all that stuff… C’mon, get with the times!</p>
<p>J: Even though I receive my e-mail at Gmail, I suck it down to my machine with fetchmail and I put it into a local dovecot server so that Gnus will hold sway over it. The other thing that’s valuable in coping with data overload is just structure.</p>
<p>Structure is really the key to everything. And when structure gets too big, then you just need metastructure. As long as you have some way to get to the thing that you need to know when you need to know it, but your top-level view – the thing that you’re thinking about in your mind – is always small, then it doesn’t matter how much information you have.</p>
<p>I stopped deleting things that I downloaded a few years ago. I started having enough disk space that I just keep everything. You never know when you’re going to want it again. You never know when that version you had isn’t going to be on the Internet any more, etc. I have a giant file server that I built that just accumulates lots of information. There’s a directory in my home directory called archives, and archives now has about 400GB of files in it across millions of files. There are files within files. It’s just an enormous amount of information.</p>
<p>But the way that I manage that data overload is just by structure. I developed a taxonomy to put things into places by category and by topic. Whenever I have a file or whenever I’m looking for a file, I can know within seconds what the path name leading to that file or group of files is going to be, because I adhere to the taxonomy rigidly. I have an inbox where new stuff comes in, and then I sort the stuff out from the inbox using Dired into the parts of the taxonomy that it needs to go in.</p>
<p>The key there is that even though I have all this data – which is way more data than Spotlight or systems like that are ever going to help me search through – by having the right structure, the data is easy to find.</p>
<p>I use Org mode as a sort of meta-structure so that if there are parts of that structure that I often refer to, I’ll put a link to them in Org mode. In Org mode, I’ll have a hot list, and the hot list are the things I care most about right now. The hot list will just branch to other lists or to other areas on the machine or other parts of the Web. You want to keep the hot list down to a reasonable small amount, so like ten to twenty items. That should branch out into everything else. Everything should ultimately go down to the leaves of everything that you have. If you have anything unowned by your hierarchy, it will get lost or it will just become forgotten. I believe that hierarchy is the solution to any problem in terms of data overload.</p>
<p>S: I was just thinking about how I can organize my ever-growing Org files and I’ve been trying to create categorical indexes, going through all these things, creating links to my blog (external information and all of that)… but it’s fascinating to see how people have been organizing, especially since you’ve been using it for a while, and you have tons of information in it. Lists of lists.</p>
<p>J: And also information I keep needing to refer to, even years later. I’ll remember… I knew at one point how to disable the Spotlight index, for example, but I can’t remember the command. That command is no longer in my Zsh history file. How am I going to know that information? If I search for it, I might find it, but there are some things you just can’t search Google for because it’s too abstract. I’ll write it down in my Org mode file and even though it’s in the archive file, it’s still searchable, it’s still indexable. I can ask my whole system, what do you know about Spotlight? I’ll get a list back of all the things I ever thought were valuable to know about Spotlight, and in that list will be indexing, disabling, etc.</p>
<p>S: That is an excellent use of Org mode. I remember you showed me a glimpse of your Emacs org file where you were listing all these things you were learning about Emacs, and that file looked really long.</p>
<h3>Maintaining your information</h3>
<p>J: It does require some investment, though. Maintaining structure like this requires always weeding and pruning, combing and going through the data. My wife and I have a word for it. She’s Persian, and the Persian word for putting things in order is monazem(?). She’ll ask me—I’l l be at my computer, playing around with it—and she’ll say, “Are you monazeming?” All that I’m doing is just moving stuff around, I’m renaming things, I’m building index links… That might not be a fun task for everyone. Maybe part of me always wanted to be a librarian when I grew up. I actually get a lot of pleasure out of that. I find it relaxing. I find that imposing order on the chaos of my machine gives me a greater feeling of order in my own life, and that makes me better able to handle the new information that’s going to come in the next day.</p>
<p>S: It also helps you remember what’s in your file, so you know what you can search for.</p>
<p>J: That’s very important. Our memory, it’s not ever going to be good enough to just keep our eyes on the thousand things we might have in our configuration or the million things we might have in our machines these days. That doesn’t even include all the things we’ve seen on the Internet, thought were cool, but haven’t noted down anywhere. We just remember that it’s there, but we’re losing those all the time and we’re not aware that we’re losing them.</p>
<p>S: At least until you plug your browser history into an Org thingy that automatically captures all of that stuff. People used to have browser plugins that did that…</p>
<p>J: That’s a neat idea, actually. Hmm…. I like that idea. I used to not have any cap on my history in the browser, but ultimately it makes the browser too slow. But it would be nice to queue it out to a log file or a database where it just gives the link, a title, and a synopsis of the contents. That would be kinda nice. You’re giving me ideas, Sacha.</p>
<h3>Wrapping up</h3>
<p>S: So, we’ll see it next week, then? Okay. Lots of tips on all these different things you can do with Emacs, where to get started, how to organize a huge archive of information (lists of lists and breaking things down)… Any parting words before I line up other people to bring on to this “Let’s Talk about Emacs” thing?</p>
<p>J: Just that Emacs is fun. All of this technical stuff, all of these features… the reason I use it is because it’s fun.</p>
<p>S: It is. It’s a lot of fun. It’s even more fun because… Well, I get to bump into people like you, and the Emacs community is so awesome!</p>
<p>J: I got to know you through it as well! That’s been a great thing.</p>
<p>S: When you made me the maintainer of Planner, I was, like, “Oh my gosh, I’ve never maintained anything before.” I was a university student, and it was an excellent experience.</p>
<p>J: I always appreciated the little cards that you sent me from time to time through the years, mentioning your uses of Planner…</p>
<p>S: I should send cards to Carsten too. Bastien is the new maintainer, isn’t he? Emacs appreciation cards.</p>
<p>J: That’s right. I think that’s a great thing you did. Thanks, Sacha!</p>
<p>S: Thank you so much. Nice talking to you, and I’ll catch you again sometime.</p>
<p>J: Have a good night!</p>
<p>(Transcription took me 2:35 for 0:44 of audio.)</p>
<div class="powerpress_player" id="powerpress_player_5956"><script>document.createElement('audio');</script>
<audio class="wp-audio-shortcode" id="audio-23536-1" preload="none" style="width: 100%;" controls="controls"><source type="audio/mpeg" src="http://archive.org/download/20120612EmacsChatJohnWiegley/2012-06-12-Emacs-Chat-John-Wiegley.mp3?_=1"><a href="http://archive.org/download/20120612EmacsChatJohnWiegley/2012-06-12-Emacs-Chat-John-Wiegley.mp3">http://archive.org/download/20120612EmacsChatJohnWiegley/2012-06-12-Emacs-Chat-John-Wiegley.mp3</a></audio></div><p class="powerpress_links powerpress_links_mp3">Podcast: <a href="http://archive.org/download/20120612EmacsChatJohnWiegley/2012-06-12-Emacs-Chat-John-Wiegley.mp3" class="powerpress_link_pinw" target="_blank" title="Play in new window" onclick="return powerpress_pinw('https://sachachua.com/blog/?powerpress_pinw=23536-podcast');" rel="nofollow">Play in new window</a> | <a href="http://archive.org/download/20120612EmacsChatJohnWiegley/2012-06-12-Emacs-Chat-John-Wiegley.mp3" class="powerpress_link_d" title="Download" rel="nofollow" download="2012-06-12-Emacs-Chat-John-Wiegley.mp3">Download</a></p><p class="powerpress_links powerpress_subscribe_links">Subscribe: <a href="https://sachachua.com/blog/feed/podcast/" class="powerpress_link_subscribe powerpress_link_subscribe_rss" title="Subscribe via RSS" rel="nofollow">RSS</a></p><p>You can <a href="https://sachachua.com/blog/2012/07/transcript-emacs-chat-john-wiegley/#comment">view 12 comments</a> or <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2012%2F07%2Ftranscript-emacs-chat-john-wiegley%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>