<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Planet Emacslife</title>
        <link>https://planet.emacslife.com/</link>
        <description>undefined</description>
        <lastBuildDate>Wed, 20 May 2026 09:31:40 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/gap-hub/feed</generator>
        <language>en</language>
        <copyright>Various authors</copyright>
        <atom:link href="https://planet.emacslife.com/rss.xml" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Bozhidar Batsov: neat: a language-agnostic nREPL client for Emacs]]></title>
            <link>https://batsov.com/articles/2026/05/20/neat-a-language-agnostic-nrepl-client-for-emacs/</link>
            <guid>https://batsov.com/articles/2026/05/20/neat-a-language-agnostic-nrepl-client-for-emacs/</guid>
            <pubDate>Wed, 20 May 2026 06:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><blockquote>
  <p>I think I’ll take my REPL neat <br>
My parens black and bed at three <br>
CIDER’s too sweet for me…</p>

  <p>– Bozier</p>
</blockquote>

<p>Last week I <a href="https://batsov.com/articles/2026/05/12/port-a-minimalist-prepl-client-for-emacs/">announced Port</a>,
a small prepl client for Emacs. Today I’m following it up with another small
Emacs package. Meet <a href="https://github.com/nrepl/neat">neat</a>, a tiny, deliberately
language-agnostic nREPL client.</p>

<h2>Why?</h2>

<p>For years I’ve been hearing some version of the same request: “could CIDER work
with my non-Clojure nREPL server?”. Babashka, Basilisp, nREPL-CLR, even some
homegrown servers people built on top of nREPL for languages I’d never heard
of.<sup><a href="https://batsov.com/#fn:1">1</a></sup> The answer was always the same kind of squishy “sort of, in theory, with
caveats”, because while bare nREPL is genuinely language-agnostic, CIDER is
not. CIDER was built for Clojure and assumes Clojure pretty much everywhere.</p>

<p>I always thought the right answer was “let’s gradually make CIDER more
language-agnostic.” That’s the kind of plan that sounds reasonable until
you actually try it.</p>

<p>The thing that pushed me over the edge was, oddly enough, building Port.  Port
is small, focused, and doesn’t try to be CIDER. Working on it for a couple of
weeks reminded me how (deceptively) productive it is to start from a clean slate
when the new requirements don’t match the assumptions baked into a mature
codebase. Trying to retrofit CIDER into a language-agnostic shape would have
meant fighting with every helper that ever assumed <code class="language-plaintext highlighter-rouge">clojure.repl</code> exists, every
middleware contract <code class="language-plaintext highlighter-rouge">cider-nrepl</code> defines, every project-type heuristic that
knows about <code class="language-plaintext highlighter-rouge">deps.edn</code> and <code class="language-plaintext highlighter-rouge">project.clj</code> and nothing else.  A whole lot of “is
the server Clojure, or is it the other thing?”  branches. The Port experience
reaffirmed that the right move for a genuinely different client is a <em>new
project</em>, not a thousand cuts to an existing one.</p>

<p>So <code class="language-plaintext highlighter-rouge">neat</code> was born. The name is short, says what it does (it’s neat, both in
the small-and-tidy sense and in the “no deps, no special assumptions, just the
protocol” sense), and conveniently leaves room for puns I haven’t fully
committed to yet. I might land on a backronym one day. For now it’s just
“neat”.</p>

<h2>What neat actually is</h2>

<p>neat is a small Emacs nREPL client. The code is  split across four files:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">neat-bencode.el</code>: bencode encode/decode.</li>
  <li><code class="language-plaintext highlighter-rouge">neat-client.el</code>: TCP connections, request dispatch, the standard
nREPL ops.</li>
  <li><code class="language-plaintext highlighter-rouge">neat-repl.el</code>: a comint-derived REPL buffer.</li>
  <li><code class="language-plaintext highlighter-rouge">neat.el</code>: the entry point, customization group, and <code class="language-plaintext highlighter-rouge">neat-mode</code>
minor mode for source buffers.</li>
</ul>

<p>It only uses Emacs builtins. There are no external runtime
dependencies, not even on <code class="language-plaintext highlighter-rouge">clojure-mode</code>, because neat doesn’t assume
Clojure on the other end. If you write <code class="language-plaintext highlighter-rouge">clojure-mode</code>, <code class="language-plaintext highlighter-rouge">fennel-mode</code>,
<code class="language-plaintext highlighter-rouge">hy-mode</code>, or anything else that talks nREPL, you turn on <code class="language-plaintext highlighter-rouge">neat-mode</code>
in that buffer and it just works.</p>

<p>The connection routing is also intentionally library-friendly. There’s a
buffer-local <code class="language-plaintext highlighter-rouge">neat-current-connection</code> override so downstream packages can
implement their own routing logic, plus a global default for the simple
“one server at a time” case that most people will want.</p>

<p>Capability discovery is done at connect time via the nREPL <code class="language-plaintext highlighter-rouge">describe</code> op.
neat doesn’t hardcode “this server has completions, this one doesn’t”
assumptions. If the server reports a <code class="language-plaintext highlighter-rouge">completions</code> op, the CAPF backend
lights up (with type annotations next to each candidate, when the server
provides them). If it reports <code class="language-plaintext highlighter-rouge">lookup</code>, eldoc starts working and <code class="language-plaintext highlighter-rouge">M-.</code>
jumps to definitions via an xref backend. If neither is there, you still
get a perfectly serviceable raw REPL.</p>

<h2>Basic usage</h2>

<p>Start an nREPL server. Anything that speaks the protocol will do. For a
Clojure server:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre><code><table><tbody><tr><td><pre>1
2
3
4
5
</pre></td><td><pre>clj -M:nrepl
# or
bb nrepl-server :port 7888
# or
lein repl :headless :port 7888
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Then in Emacs:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre><code><table><tbody><tr><td><pre>1
</pre></td><td><pre>M-x neat RET localhost RET 7888 RET
</pre></td></tr></tbody></table></code></pre></div></div>

<p>A REPL buffer pops up, the prompt follows the server’s reported
namespace, and you can type expressions at it. Multi-line input works
because <code class="language-plaintext highlighter-rouge">RET</code> only submits when the form parses as balanced under
<code class="language-plaintext highlighter-rouge">neat-repl-input-syntax-table</code> (Emacs Lisp syntax by default, which is
close enough for any Lisp). Input history is persisted across sessions.</p>

<p>If there’s a <code class="language-plaintext highlighter-rouge">.nrepl-port</code> file in the project, the prompt defaults to
its contents, so <code class="language-plaintext highlighter-rouge">M-x neat RET RET</code> is enough to connect.</p>

<p>To evaluate from a source buffer, turn on the minor mode:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre><code><table><tbody><tr><td><pre>1
</pre></td><td><pre>M-x neat-mode
</pre></td></tr></tbody></table></code></pre></div></div>

<p>The familiar bindings are there, intentionally compatible with what CIDER
users expect:</p>

<table>
  <thead>
    <tr>
      <th>Key</th>
      <th>Command</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">C-c C-e</code></td>
      <td><code class="language-plaintext highlighter-rouge">neat-eval-last-sexp</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">C-c C-c</code></td>
      <td><code class="language-plaintext highlighter-rouge">neat-eval-defun</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">C-c C-r</code></td>
      <td><code class="language-plaintext highlighter-rouge">neat-eval-region</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">C-c C-b</code></td>
      <td><code class="language-plaintext highlighter-rouge">neat-eval-buffer</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">C-c C-l</code></td>
      <td><code class="language-plaintext highlighter-rouge">neat-load-buffer-file</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">C-c C-z</code></td>
      <td><code class="language-plaintext highlighter-rouge">neat-switch-to-repl</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">C-c C-k</code></td>
      <td><code class="language-plaintext highlighter-rouge">neat-interrupt-eval</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">C-c M-n</code></td>
      <td><code class="language-plaintext highlighter-rouge">neat-set-ns</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">C-c C-d C-d</code></td>
      <td><code class="language-plaintext highlighter-rouge">neat-show-doc-at-point</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">M-.</code></td>
      <td><code class="language-plaintext highlighter-rouge">xref-find-definitions</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">M-,</code></td>
      <td><code class="language-plaintext highlighter-rouge">xref-go-back</code></td>
    </tr>
  </tbody>
</table>

<p><code class="language-plaintext highlighter-rouge">neat-eval-buffer</code> ships the buffer contents as an <code class="language-plaintext highlighter-rouge">eval</code> op;
<code class="language-plaintext highlighter-rouge">neat-load-buffer-file</code> uses the standard <code class="language-plaintext highlighter-rouge">load-file</code> op instead, so the
server can attribute file and line numbers to errors. Use the latter when
you’re actually loading a file from disk and care about good diagnostics.</p>

<p><code class="language-plaintext highlighter-rouge">neat-set-ns</code> sets the buffer-local <code class="language-plaintext highlighter-rouge">neat-ns</code>, which gets sent as the <code class="language-plaintext highlighter-rouge">ns</code>
field on every <code class="language-plaintext highlighter-rouge">eval</code> op from that buffer. For languages where the
namespace is declared in the source (Clojure’s <code class="language-plaintext highlighter-rouge">(ns foo.bar)</code>, etc.), swap
in a parser via <code class="language-plaintext highlighter-rouge">neat-buffer-ns-function</code>.</p>

<p>For juggling multiple connections, <code class="language-plaintext highlighter-rouge">M-x neat-list-connections</code> opens a
tabulated-list buffer with one row per live connection, where you can
set the default or disconnect interactively.</p>

<p>That’s roughly the whole user-facing surface today. There’s no jack-in
command, no inspector, no debugger, no test runner. Likely there will never
be, but if you need those you should probably be using CIDER anyways…</p>

<h2>Should you use it?</h2>

<p>If you write Clojure and CIDER works for you, keep using CIDER. It’s
mature, full-featured, and supported, and I’m going to keep working on it
for as long as people use it. Nothing about neat changes that.</p>

<p>But if you find yourself in one of these situations:</p>

<ul>
  <li>you write a non-Clojure language whose runtime ships an nREPL server,
and you’ve been muddling through with a half-supported CIDER setup,</li>
  <li>you write Clojure but you value minimalism and don’t need the full
CIDER feature set,</li>
  <li>you’re building an Emacs package that needs to talk nREPL and you
want a small, dependency-free library to build on,<sup><a href="https://batsov.com/#fn:2">2</a></sup></li>
</ul>

<p>then neat might be a better fit. It’s small enough that you can read the
whole thing in an afternoon, and the library/UI split (<code class="language-plaintext highlighter-rouge">neat-bencode</code> and
<code class="language-plaintext highlighter-rouge">neat-client</code> are perfectly usable from other packages) is genuinely
designed for downstream consumers.</p>

<h2>The bigger picture</h2>

<p>neat is part of a broader push I’ve been chewing on for a while now: making
nREPL a healthy multi-language ecosystem rather than a Clojure-only protocol. That push has three legs:</p>

<ol>
  <li><strong>An actual nREPL specification.</strong> The <a href="https://github.com/nrepl/spec.nrepl.org">spec.nrepl.org</a>
draft is (will be) the formal version of what today is “whatever nREPL the
project does”.</li>
  <li><strong>Reference clients.</strong> neat is one. The point of building a
deliberately Clojure-free client is that it stress-tests the spec.
Anywhere neat ends up needing to special-case the server, the spec
has a gap.</li>
  <li><strong>A compatibility test suite.</strong> The parameterised integration suite
in neat already runs the same assertions against multiple servers
and surfaces real divergences (Clojure batching <code class="language-plaintext highlighter-rouge">(println "hi")</code>
into a single <code class="language-plaintext highlighter-rouge">out</code> message where Basilisp emits two, for example).
I’d like to grow this into a portable suite that any nREPL server
can self-check against.</li>
</ol>

<p>This is also why I keep teasing a “reference CLI client” in
conversations. An editor client is one thing, but a small command-line
nREPL client written in a non-Lisp language would be a much sharper test
of how language-agnostic the protocol really is. neat is plausibly a
precursor to that. Time will tell how far I push this; for now I just
wanted to get the Emacs side moving.</p>

<h2>Thanks</h2>

<p>As always, big thanks to <a href="https://www.clojuriststogether.org/">Clojurists
Together</a> and everyone supporting my open
source work. You make it possible for me to keep tweaking and improving CIDER,
nREPL, clj-refactor, and friends, and occasionally try something “neat” on the
side. <code class="language-plaintext highlighter-rouge">neat</code> isn’t replacing any of the existing Clojure tooling for Emacs. It’s
just another tool in the box for the people who want it.</p>

<p>Feedback, ideas, and contributions are most welcome over at the
<a href="https://github.com/nrepl/neat/issues">issue tracker</a>.</p>

<p>Keep hacking!</p>

<div class="footnotes">
  <ol>
    <li>
      <p><a href="https://github.com/clojure-emacs/cider/issues/3905">https://github.com/clojure-emacs/cider/issues/3905</a>&nbsp;<a href="https://batsov.com/#fnref:1">↩︎</a></p>
    </li>
    <li>
      <p>For a long time I planned to extract CIDER’s nREPL client code into a reusable package, but now that we have <code class="language-plaintext highlighter-rouge">neat</code> I probably will finally abandon this idea.&nbsp;<a href="https://batsov.com/#fnref:2">↩︎</a></p>
    </li>
  </ol>
</div></body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Dave Pearson: next-gh-pr.el v1.0.0]]></title>
            <link>https://blog.davep.org/2026/05/19/next-gh-pr-el-v1-0-0.html</link>
            <guid>https://blog.davep.org/2026/05/19/next-gh-pr-el-v1-0-0.html</guid>
            <pubDate>Tue, 19 May 2026 15:43:33 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>Pretty much every project that I actively maintain on my <a href="https://github.com/davep" target="_blank">GitHub
account</a> has a change log of some description. For
a long time now, whenever I add a new entry to the log, I'll include a link
to the PR that implements that change. Inevitably, this results in me adding
the ChangeLog entry, creating the PR, then doing a follow-up change and
commit now that I know the PR number, which allows me to add the link.</p>
<p>So I've created <a href="https://github.com/davep/next-gh-pr.el" target="_blank"><code>next-gh-pr.el</code></a> to
save me just a little time and let me be just a little more lazy. Inside it
I've currently got a <code>next-gh-pr-insert-markdown-link</code> command which, when
run, as you might imagine, inserts a link to the next likely PR URL as
Markdown.</p>
<p>Working out the next URL is simple enough: get the latest issue and PR
number, take whichever is the highest, and add 1. There is the wrinkle that
discussions also cause this number to bump, and getting the latest
discussion number is a little extra faff that I can't be bothered with right
now, but my projects very seldom have discussions taking place anyway.</p></body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Irreal: Marking Recently Modified Files In Dired]]></title>
            <link>https://irreal.org/blog/?p=13818</link>
            <guid>https://irreal.org/blog/?p=13818</guid>
            <pubDate>Tue, 19 May 2026 15:10:36 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>
Marcin Borkowski (mbork) really likes all the ways you can mark files in Dired but noticed that an easy way to mark recently modified files was missing. He knows quite a bit about writing Elisp so it was an easy decision to decide <a href="https://mbork.pl/2026-05-18_Marking_today%e2%80%99s_files_in_Dired">to write some code to implement the missing feature</a>.
</p>
<p>
The code, which you can see at his post, is pretty simple and easy to follow. What wasn’t so easy were some annoying design decisions. For example, what constitutes the current day? Is it 24 hours ago until now or is it the previous midnight until now? And by the way, should that be UTC or local time?
</p>
<p>
The natural interface is to specify the number of previous days you want to mark as a prefix argument but that leaves open the question of how to unmark the last <i>n</i> days. The natural solution—and the one mbork chose—is to use a negative <i>n</i> to mean “unmark the last <i>n</i> days”. So positive <i>n</i>, mark files modified in the last <i>n</i> days; negative <i>n</i> unmark file modified in the last <i>n</i> days. What about 0? Mbork made the arbitrary decision to have that mean mark files modified in the last 60 minutes.
</p>
<p>
There are a couple of other nuances that you can read about in mbork’s post. The real takeaway for me is how tricky it can be to get the small details right. That seems especially true when you’re dealing with time calculations. Questions like, “What, exactly, does ‘yesterday’ mean” turn out to be a lot harder to answer than they first seem. Take a look at mbork’s post to see what I mean.</p>
</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Jakub Nowak: New Job: Jira Integration]]></title>
            <link>https://www.cyan.sh/blog/posts/new-job-jira-integration.html</link>
            <guid>https://www.cyan.sh/blog/posts/new-job-jira-integration.html</guid>
            <pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>
I haven't been very active on this blog for the last few months.
I've recently started a new job, and part of what I've been doing in my spare time is adding to my Emacs configuration to make some of the daily chores easier (or to remove them entirely).
</p>

<p>
If you know me, you know I'm not a fan of WebUIs, or just mouse-focused GUIs in general.
Jira is no exception.
Previously, I've had to deal with Jira's annoying click and drag nonsense and sort of dealt with it, but I've always wanted to be able to use it from within Emacs.
Not just because that means no mouse-based WebUI, but also because it potentially means making custom automations around tickets.
Enter the new job, where I'm able to make myself an API token, and therefore make use of <a href="https://github.com/ahungry/org-jira">org-jira</a> for the first time.
</p>

<p>
You can see the config I've written around it <a href="https://git.cyan.sh/BirDt/theurgy/src/branch/master/userland/jira.el">here</a>.
This works basically exactly as expected, although I have had to do something a bit hacky to keep the API token properly stored.
Storing the key on MacOS as recommended in the readme wasn't working for me, so instead I've stored it as a generic password.
When launching Jira, this password is fetched into the kill ring to be pasted into the prompt if needed.
This is kind of terrible, but it does work well enough.
</p>

<div class="org-src-container">
<pre>(<span class="org-keyword">when</span> (equal system-type 'darwin)
  (kill-new
   (string-trim-right (shell-command-to-string (concat <span class="org-string">"security find-generic-password -a \""</span>
                                                     jiralib-user <span class="org-string">"\" -s \"jira\" -w"</span>)))))
</pre>
</div>

<p>
You should be careful when storing the API token with <code>add-generic-password</code>, make sure you write it in the command with <code>-w "&lt;token&gt;"</code> and don't copy it into the prompt.
When I was copying it into the prompt, the token was getting cut off, which was a pain to debug because Jira cloud doesn't have 401 errors for this sort of thing on the JQL search.
You may also notice <code>string-trim-right</code> here: the output of <code>shell-command-to-string</code> includes the trailing newline, which will mess up the auth.
</p>

<p>
I'm also using my org projects space as the Jira workspace locally, which means I can use all the same organisation helpers as I do with my personal project files.
</p>

<p>
In terms of automations, <code>org-jira</code> already provides useful enough keybinds for progressing tickets, leaving comments, etc., and at the moment I don't feel like I need to improve there.
However, since this Jira instance is integrated with Bitbucket, it's convention to use the ticket number when opening a new branch for work related to that ticket.
That way Jira can show things like PR status, etc.
</p>

<p>
Because each Jira board or project only has one repository associated, I'm assuming that there will be only one directory for that project work, and that can be a customizable variable.
</p>

<div class="org-src-container">
<pre>(<span class="org-keyword">defcustom</span> <span class="org-variable-name">jira-key-directory-alist</span> '()
  <span class="org-doc">"Directories associated with a particular project --- git repositories.
For example, (\"CBM\" . \"~/build/etc\") will use ~/build/etc for ticket-specific commands in the CBM project."</span>
  <span class="org-builtin">:type</span> 'alist
  <span class="org-builtin">:group</span> 'jira
  <span class="org-builtin">:group</span> 'theurgy)
</pre>
</div>

<p>
Then this simple function fetches the Jira issue ID under the cursor, opens a <code>magit</code> status buffer in the appropriate directory, and starts branch creation.
</p>

<div class="org-src-container">
<pre>(<span class="org-keyword">defun</span> <span class="org-function-name">jira-branch-ticket</span> ()
  <span class="org-doc">"Create a branch from the current ticket, in the repository specified by `</span><span class="org-doc"><span class="org-constant">jira-key-directory-alist</span></span><span class="org-doc">'."</span>
  (<span class="org-keyword">interactive</span>)
  (<span class="org-keyword">let*</span> ((issue-key (<span class="org-keyword">progn</span>
                    (org-jira-copy-current-issue-key)
                    (substring-no-properties (car kill-ring))))
       (project-code (car (split-string
                           issue-key
                           <span class="org-string">"-"</span>)))
       (project-dir (cdr (assoc project-code jira-key-directory-alist))))
    (magit-status project-dir)
    (kill-new issue-key)
    (call-interactively #'magit-branch-create)))
</pre>
</div>

<p>
I'm not pre-selecting main/master as the origin here because it's possible that I may want to branch off something else.
Nor am I pre-populating the branch name, just killing the ticket number, in case I need multiple branches per ticket.
</p>

<p>
Ideally, I would like to pre-populate the <code>magit</code> branch prompt with some editable default values, but I'm not actually sure how to do that, so this will do for now.
</p>

<p>
The next blog will look at the AWS CLI customisations I've built up, so stay tuned.
</p>
</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Marcin Borkowski: Marking today’s files in Dired]]></title>
            <link>https://mbork.pl/2026-05-18_Marking_today%e2%80%99s_files_in_Dired</link>
            <guid>https://mbork.pl/2026-05-18_Marking_today%e2%80%99s_files_in_Dired</guid>
            <pubDate>Mon, 18 May 2026 21:01:00 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body>As anyone reading my blog knows, I’m a big fan of Dired. One of its killer features is the set of marking commands, which allow marking files based on their extensions, names (regex-based), contents (also regex-based). There is also a “universal marking command”, dired-mark-sexp, which allows the user to provide an Elisp expression serving as a predicate and marks all files satisfying that predicate. What’s even more, you can use several symbols in that predicate, like size or name (head to the docs to learn more). What I found lacking is an easy (that is, not requiring me to type a convoluted expression each time) way to mark “recently modified” files.</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Sacha Chua: 2026-05-18 Emacs news]]></title>
            <link>https://sachachua.com/blog/2026/05/2026-05-18-emacs-news/</link>
            <guid>https://sachachua.com/blog/2026/05/2026-05-18-emacs-news/</guid>
            <pubDate>Mon, 18 May 2026 17:59:27 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>
My favourite post this week was <a href="https://www.matem.unam.mx/~omar/apropos-emacs.html#may-i-recommend-eww-for-emacs-innovative-ui">oantolin's tip about using Eww</a>. It's always interesting to see what people can do when they apply Emacs's power and composability to all sorts of things, including evaluating code snippets from webpages. Outside Emacs, there was a lively conversation on HN about <a href="https://news.ycombinator.com/item?id=48118727">personal software</a>. Enjoy!
</p>

<ul>
<li>Upcoming events (<a href="https://emacslife.com/calendar/emacs-calendar.ics">iCal file</a>, <a href="https://emacslife.com/calendar/">Org</a>):
<ul>
<li>M-x Research: TBA <a href="https://m-x-research.github.io/">https://m-x-research.github.io/</a> Wed May 20 0800 America/Vancouver - 1000 America/Chicago - 1100 America/Toronto - 1500 Etc/GMT - 1700 Europe/Berlin - 2030 Asia/Kolkata - 2300 Asia/Singapore</li>
<li>Emacs APAC: Emacs APAC meetup (virtual) <a href="https://emacs-apac.gitlab.io/announcements/">https://emacs-apac.gitlab.io/announcements/</a> Sat May 23 0130 America/Vancouver - 0330 America/Chicago - 0430 America/Toronto - 0830 Etc/GMT - 1030 Europe/Berlin - 1400 Asia/Kolkata - 1630 Asia/Singapore</li>
<li>Emacs Berlin: Emacs-Berlin Hybrid Meetup <a href="https://emacs-berlin.org/">https://emacs-berlin.org/</a> Wed May 27 1000 America/Vancouver - 1200 America/Chicago - 1300 America/Toronto - 1700 Etc/GMT - 1900 Europe/Berlin - 2230 Asia/Kolkata – Thu May 28 0100 Asia/Singapore</li>
<li>Emacs.si (in person): Emacs.si meetup #6 2026 (v #živo) <a href="https://dogodki.kompot.si/events/67d716c3-6c04-4530-9c1a-f67aa44d31bc">https://dogodki.kompot.si/events/67d716c3-6c04-4530-9c1a-f67aa44d31bc</a> Mon Jun 1 1900 CET</li>
</ul></li>
<li>Upcoming events:
<ul>
<li><a href="https://sachachua.com/blog/2026/05/may-29-emacs-chat-with-omar-antolin-camarena/">Sacha Chua: May 29: Emacs Chat with Omar Antolin Camarena</a></li>
</ul></li>
<li>Emacs configuration:
<ul>
<li><a href="https://github.com/scovl/dotfiles/tree/main/emacs/windows/.emacs.d">dotfiles/emacs/windows/.emacs.d at main · scovl/dotfiles · GitHub</a> (<a href="https://hachyderm.io/@lobocode/116590308876801051">@lobocode@hachyderm.io</a>)</li>
<li><a href="https://mstempl.netlify.app/post/may-i-recommend/">May I recommend… to only add items to your init files you understand and document&nbsp;|&nbsp;Martin's Blog</a></li>
<li><a href="https://www.acdw.net/carnival-emacs-2026-05/">May I recommend declaring bankruptcy from time to time | acdw.net</a></li>
</ul></li>
<li>Emacs Lisp:
<ul>
<li><a href="http://yummymelon.com/devnull/enhancing-elisp-development-with-context-menus.html">Charles Choi: Enhancing Elisp Development with Context Menus</a> (<a href="https://www.reddit.com/r/emacs/comments/1tabrsx/enhancing_elisp_development_with_context_menus/">Reddit</a>, <a href="https://irreal.org/blog/?p=13803">Irreal</a>)</li>
<li><a href="https://kelar.org/~bandali/gnu/emacs/ffs-emacs-ext-prot.html">Amin Bandali: FFS code review and Emacs extensibility with Protesilaos</a> (<a href="https://protesilaos.com/codelog/2026-05-15-emacs-amin-bandali-ffs-display-buffer-org-capture/">Prot</a>)</li>
<li><a href="https://kickingvegas.github.io/elisp-for-python/">Elisp Cheatsheet for Python Programmers - updated</a> (<a href="https://sfba.social/@kickingvegas/116593354164532781">@kickingvegas@sfba.social</a>)</li>
</ul></li>
<li>Appearance:
<ul>
<li><a href="https://www.youtube.com/watch?v=E56_SNoe-oM">How to automatically scale emacs to a larger font on startup (on Raspberry Pi)</a> (22:22)</li>
</ul></li>
<li>Navigation:
<ul>
<li><a href="https://github.com/redguardtoo/fastctags">fastctags 0.0.1 — Blazing-fast code nav &amp; completion with Universal Ctags</a> (<a href="https://www.reddit.com/r/emacs/comments/1texyko/fastctags_001_blazingfast_code_nav_completion/">Reddit</a>)</li>
<li><a href="https://git.sr.ht/~zelda/purr.el">purr.el - a lightweight project dashboard for emacs.</a> (<a href="https://www.reddit.com/r/emacs/comments/1tens61/purrel_a_lightweight_project_dashboard_for_emacs/">Reddit</a>)</li>
</ul></li>
<li>Writing:
<ul>
<li><a href="https://github.com/hesampakdaman/typst-overlay">hesampakdaman/typst-overlay · GitHub</a></li>
</ul></li>
<li>Org Mode:
<ul>
<li><a href="https://list.orgmode.org/CAO48Bk-hzrwXe4jOZYnhv5B12AvdTJ39E8fdAkTQRgBGuq3J9A@mail.gmail.com">Org Mode requests: [RFC] LaTeX survey</a></li>
<li><a href="https://list.orgmode.org/24b44cbc-ca83-4f2b-b9cf-e23455844e43@gmail.com">Org Mode requests: [RFC] Round priorities in iCalendar export</a></li>
<li><a href="https://list.orgmode.org/87wlx3hmwl.fsf@gmail.com">Org Mode requests: [RFC] org-colview: Where should a new COLUMNS keyword be inserted?</a></li>
<li><a href="https://jan-iversen.de/posts/rezeptsammlung-mit-emacs/">Rezeptsammlung mit Emacs | Jan Iversen</a> (<a href="https://nerdculture.de/@razorback/116591073029581859">@razorback@nerdculture.de</a>)</li>
<li><a href="https://www.reddit.com/gallery/1tgckvz">Navi – Obsidian-style org-roam graph viewer – native window – reads your DB directly</a></li>
<li><a href="https://blog.amypillow.net/emacs/NEWS/org-yaap-1.1.0.html">Amy Pillow: Added notification actions in Org yaap</a> - yet another alert package</li>
<li><a href="https://apps.apple.com/app/org-social/id6764415116">Org Social for iOS: A decentralized microblog where your whole timeline lives in a plain-text Org Mode file you host yourself</a></li>
<li><a href="https://toobnix.org/w/2Z7id1MZQ6C2GTo4XjvuX1">#orgmode #emacs w/ its developer Ihor Radchenko, also screwlisp and JLamothe #lispyGopherClimate - toobnix</a> (<a href="https://toobnix.org/w/2Z7id1MZQ6C2GTo4XjvuX1">@screwtape@toobnix.org</a>)</li>
<li>Import, export, and integration:
<ul>
<li><a href="https://jan-iversen.de/posts/blogging-mit-emacs-howto/">Blogging mit Emacs - Howto | Jan Iversen</a> (<a href="https://nerdculture.de/@razorback/116571699031306970">@razorback@nerdculture.de</a>)</li>
<li><a href="https://github.com/harshadjs/orgfs">orgfs – A FUSE filesystem for org files</a> (<a href="https://www.reddit.com/r/emacs/comments/1tcx0w2/orgfs_a_fuse_filesystem_for_org_files/">r/emacs</a>, <a href="https://www.reddit.com/r/orgmode/comments/1tcuqdj/orgfs_a_fuse_filesystem_for_org_files/">r/orgmode</a>)</li>
<li><a href="https://github.com/Martinsos/blog-in-emacs-lisp">[ANN] Starter template for your own blog in Emacs Lisp</a> (<a href="https://www.reddit.com/r/emacs/comments/1tayj3x/ann_starter_template_for_your_own_blog_in_emacs/">Reddit</a>)</li>
<li><a href="https://www.reddit.com/r/orgmode/comments/1tepxoh/oxhtmlfileembedding_030_embed_scrollable_csvs/">ox-html-file-embedding 0.3.0, embed scrollable CSVs with PapaParse/Tabulator, postprocess with monolith</a></li>
</ul></li>
<li>Org development:
<ul>
<li><a href="https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/etc/ORG-NEWS?id=7c3c4cecc71536224aad8bb9099ecda1683c6567">org-agenda-clock-goto: Jump to closest entry and respect filtering</a></li>
<li>Feature requests:
<ul>
<li><a href="https://list.orgmode.org/87zf267i1c.fsf@gmail.com">Org Mode requests: [FR] ox-md: Export custom-id search strings (::#) as anchors</a></li>
<li><a href="https://list.orgmode.org/877bp92lr4.fsf@gmail.com">Org Mode requests: [FR] ox-md: Verbatim link export</a></li>
<li><a href="https://list.orgmode.org/87pl2z28bf.fsf@gmail.com">Org Mode requests: [FR] Re: [FR] Tracking numerical habits</a></li>
<li><a href="https://list.orgmode.org/87qznaw4sa.fsf@gmail.com">Org Mode requests: [FR] Tracking Habits with Alternate Calendar</a></li>
</ul></li>
</ul></li>
</ul></li>
<li>Coding:
<ul>
<li><a href="https://blog.davep.org/2026/05/13/stopping-an-accidental-push.html">Dave Pearson: Stopping an accidental push</a></li>
<li><a href="https://emacs.dyerdwelling.family/emacs/20260518114325-emacs--vc-mode-meets-magit-or-why-i-finally-gave-in/">James Dyer: VC-Mode Meets Magit - or Why I Finally Gave In!</a></li>
<li><a href="https://utcc.utoronto.ca/~cks/space/blog/programming/EmacsLspModeToEglot">Moving from lsp-mode in GNU Emacs to Eglot</a> (<a href="https://lobste.rs/s/bojb9a/moving_from_lsp_mode_gnu_emacs_eglot">lobste.rs</a>)</li>
<li><a href="https://github.com/aardsoft/lempo/">aardsoft/lempo: Emacs protocol analysis framework · GitHub</a></li>
<li><a href="https://davemq.github.io/2026/05/12/remote-linux-dev-with-emacs.html">Dave's blog: Remote Linux kernel development with Emacs</a></li>
<li><a href="https://batsov.com/articles/2026/05/12/port-a-minimalist-prepl-client-for-emacs/">Bozhidar Batsov: Port: a minimalist prepl client for Emacs</a></li>
</ul></li>
<li>Web:
<ul>
<li><a href="https://www.matem.unam.mx/~omar/apropos-emacs.html#may-i-recommend-eww-for-emacs-innovative-ui">May I recommend eww for Emacs's innovative UI?</a> (<a href="https://www.reddit.com/r/emacs/comments/1tf86ko/may_i_recommend_eww_for_emacss_innovative_ui/">Reddit</a>, <a href="https://irreal.org/blog/?p=13813">Irreal</a>, <a href="https://lobste.rs/s/96kz5p/may_i_recommend_eww_for_emacs_s_innovative">lobste.rs</a>)</li>
</ul></li>
<li>Mail, news, and chat:
<ul>
<li><a href="https://codeberg.org/jamesendreshowell/gists/src/branch/master/jeh-message-lint.el">Check for missing body, subject, or attachments before sending</a> (<a href="https://fediscience.org/@jameshowell/116574634102342131">@jameshowell@fediscience.org</a>)</li>
<li><a href="https://elpa.gnu.org/packages/minimail.html">Minimail version 0.5, with OAuth and more</a> (<a href="https://www.reddit.com/r/emacs/comments/1tcreh4/minimail_version_05_with_oauth_and_more/">Reddit</a>)</li>
<li><a href="https://github.com/emacs-elfeed/elfeed/discussions/586">Elfeed release &amp; Elfeed sqlite database · emacs-elfeed/elfeed · Discussion #586 · GitHub</a> (<a href="https://mastodon.world/@minad/116565758400216391">@minad@mastodon.world</a>)</li>
</ul></li>
<li>AI:
<ul>
<li><a href="https://github.com/jcubic/dotfiles/blob/master/emacs/config/ai.el">Agent-Shell permission system</a> (<a href="https://www.reddit.com/r/emacs/comments/1tdvd8r/agentshell_permission_system/">Reddit</a>)</li>
</ul></li>
<li>Community:
<ul>
<li><a href="https://www.youtube.com/watch?v=mJZDmO5yOxE">What's So Special About Emacs? - YouTube</a></li>
<li><a href="https://www.chiply.dev/post-emacs-carnival-may">May I recommend… understanding Emacs's patterns</a> (<a href="https://www.reddit.com/r/emacs/comments/1tc6c9h/may_i_recommend_understanding_emacss_patterns/">Reddit</a>, <a href="https://irreal.org/blog/?p=13811">Irreal</a>, <a href="https://news.ycombinator.com/item?id=48137656">HN</a>)</li>
<li><a href="https://curtismchale.ca/2026/05/05/emacs-carnival-may-i-recommend">Emacs Carnival: May I recommend… stop messing around and get work done</a> by Curtis McHale</li>
<li><a href="https://thanosapollo.org/posts/bzr-saga/">The Most Emacs Bzr Saga</a> (<a href="https://www.reddit.com/r/emacs/comments/1tbh6pg/the_most_emacs_bzr_saga/">Reddit</a>, <a href="https://lobste.rs/s/jgmrz0/most_emacs_bzr_saga">lobste.rs</a>, <a href="https://irreal.org/blog/?p=13807">Irreal</a>)</li>
<li><a href="https://sachachua.com/blog/2026/05/may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience/">Sacha Chua: YE29: Sacha, Prot, and Philip Kaludercic Talk Emacs: Newcomer Experience</a> (<a href="https://www.youtube.com/watch?v=UqfZZRl_eNw">YouTube</a> 01:24:16)</li>
<li><a href="https://sockpuppet.org/blog/2026/05/12/emacsification/">The Emacsification of Software — Quarrelsome</a> (<a href="https://news.ycombinator.com/item?id=48118727">HN</a>)</li>
</ul></li>
<li>Other:
<ul>
<li><a href="http://yummymelon.com/devnull/using-the-mouse-for-emacs-rectangle-commands.html">Charles Choi: Using the Mouse for Emacs Rectangle Commands</a></li>
<li><a href="https://www.youtube.com/watch?v=5OAOK3qoSgg">Exam minimal Emacs, 42KL, try not to buy Armageddon Psychsparrow, what am I doing.</a> (22:43, <a href="https://www.reddit.com/r/emacs/comments/1tbmz9g/minimal_emacs_for_exam_i_dont_know_what_im_doing/">Reddit</a>)</li>
<li><a href="https://fosstodon.org/@zrzz/116592767967624254">Some functions to make it easier to check for unexpected Unicode shenanigans (@zrzz@fosstodon.org)</a></li>
<li><a href="https://github.com/hexmode/mediawiki-el">hexmode/mediawiki-el: Emacs interface to edit any mediawiki site · GitHub</a> (<a href="https://genserver.social/objects/f5bf240f-7372-4b14-a9fe-9e35fe33f862">@katafrakt@genserver.social</a>) - recently updated</li>
<li><a href="https://emacs.dyerdwelling.family/emacs/20260512184707-emacs--a-tiny-nohup-keeping-media-alive-when-emacs-exits/">James Dyer: A Tiny Nohup: Keeping Media Alive When Emacs Exits</a></li>
<li><a href="https://codeberg.org/r2r0/legion.el">r2r0/legion.el: Emacs mode for the Zammad help desk software - Codeberg.org</a> (<a href="https://chaos.social/@r2r0/116573900868904042">@r2r0@chaos.social</a>) - vibecoded</li>
<li><a href="https://thecloudlet.github.io/technical/project/emacs-04/">Emacs Internal Part 04: Balancing Lisp_String Interval Trees by Text Length</a> (<a href="https://www.reddit.com/r/emacs/comments/1tcxw25/emacs_internal_part_04_balancing_lisp_string/">Reddit</a>)</li>
<li><a href="https://www.jamescherti.com/compiling-emacs/">Compiling Emacs for High Performance on Linux and Unix Systems</a> (<a href="https://www.reddit.com/r/emacs/comments/1ta1uqq/compiling_emacs_for_high_performance_on_linux_and/">Reddit</a>)</li>
<li><a href="https://mastodon.social/@jamescherti/116570649138796225">Tip for improving keyboard input latency by setting GTK_IM_MODULE=none (Linux, standard ASCII) (@jamescherti)</a></li>
</ul></li>
<li>Emacs development:
<ul>
<li>emacs-devel: <a href="https://yhetil.org/emacs-devel/865x52awb4.fsf@gnu.org/">Challenges of opaque objects</a></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=e381cf1fc97fc1c0bab1816476dd6f73a628b238">Allow child processes to continue after EPIPE</a></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=b13450973abb19b2bf0d7a96516ce23c385e7713">Copy changes from tarballs when installing VC packages</a></li>
</ul></li>
<li>New packages:
<ul>
<li><a target="_blank" href="https://melpa.org/#/rare-words">rare-words</a>: Highlight your rare words! (MELPA)</li>
</ul></li>
</ul>

<p>
Links from <a href="https://www.reddit.com/r/emacs">reddit.com/r/emacs</a>, <a href="https://www.reddit.com/r/orgmode">r/orgmode</a>, <a href="https://www.reddit.com/r/spacemacs">r/spacemacs</a>, <a href="https://mastodon.social/tags/emacs">Mastodon #emacs</a>, <a href="https://bsky.app/hashtag/emacs">Bluesky #emacs</a>, <a href="https://hn.algolia.com/?query=emacs&amp;sort=byDate&amp;prefix&amp;page=0&amp;dateRange=all&amp;type=story">Hacker News</a>, <a href="https://lobste.rs/search?q=emacs&amp;what=stories&amp;order=newest">lobste.rs</a>, <a href="https://programming.dev/c/emacs?dataType=Post&amp;page=1&amp;sort=New">programming.dev</a>, <a href="https://lemmy.world/c/emacs">lemmy.world</a>, <a href="https://lemmy.ml/c/emacs?dataType=Post&amp;page=1&amp;sort=New">lemmy.ml</a>, <a href="https://planet.emacslife.com">planet.emacslife.com</a>, <a href="https://www.youtube.com/playlist?list=PL4th0AZixyREOtvxDpdxC9oMuX7Ar7Sdt">YouTube</a>, <a href="http://git.savannah.gnu.org/cgit/emacs.git/log/etc/NEWS">the Emacs NEWS file</a>, <a href="https://emacslife.com/calendar/">Emacs Calendar</a>, and <a href="https://lists.gnu.org/archive/html/emacs-devel/2026-05">emacs-devel</a>. Thanks to Andrés Ramírez for emacs-devel links. Do you have an Emacs-related link or announcement? Please e-mail me at <a href="mailto:sacha@sachachua.com">sacha@sachachua.com</a>. Thank you!
</p>
<div><a href="https://sachachua.com/blog/2026/05/2026-05-18-emacs-news/index.org">View Org source for this post</a></div>
<p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2026%2F05%2F2026-05-18-emacs-news%2F&amp;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></body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Charles Choi: Using the Mouse for Emacs Rectangle Commands]]></title>
            <link>http://yummymelon.com/devnull/using-the-mouse-for-emacs-rectangle-commands.html</link>
            <guid>http://yummymelon.com/devnull/using-the-mouse-for-emacs-rectangle-commands.html</guid>
            <pubDate>Mon, 18 May 2026 16:45:00 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p><img alt="img" src="http://yummymelon.com/devnull/images/rectangle-mouse-commands/anju-main-menu-edit-rectangle.png"></p>
<p>Of all the built-in editing commands in Emacs, the commands that work with <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Rectangles.html">rectangles</a> delight me the most. Once understood, they can save effort in many situations.</p>
<p>That said, the biggest downside to rectangles is the amount of setup it takes to <em>use</em> them. As with many things Emacs, by default you have to memorize a bunch of keybindings to get anything done with them.</p>
<p>In Casual, I addressed the above downside by providing a <a href="https://kickingvegas.github.io/casual/Edit-commands.html#Rectangle_203a-_0028casual_002deditkit_002drectangle_002dtmenu_0029">Transient menu for rectangle commands</a>. Since building that, I've come to use rectangle commands routinely. But even then, there is ceremony to set up a rectangle selection.</p>
<p>With my recent work on mouse-driven interactions in Anju, I’ve learned that <a href="http://yummymelon.com/devnull/some-nice-to-know-keybindings-when-using-the-mouse-in-emacs.html">rectangle selection</a> is trivial via <code>C-M-&lt;mouse-1&gt;</code> dragging. Once selected, having a menu of rectangle commands makes working with them even easier. So I made one for the latest <a href="https://github.com/kickingvegas/anju/discussions/94">v1.4.0 update for Anju</a>, now on <a href="https://melpa.org/#/anju">MELPA</a>.</p>
<p>The “Rectangle” sub-menu is available via the <a href="https://kickingvegas.github.io/anju/Edit-Menu-Features.html">main menu bar “Edit” menu</a> (as shown in the screenshot above) or via <a href="https://kickingvegas.github.io/anju/Rectangle-Context-Menu.html">context menu</a>. Using rectangle commands in conjunction with the <code>align-regexp</code> (“Edit › Align Regexp…”) and <code>whitespace-cleanup</code> (“Edit › Delete › Whitespace Cleanup”) can make short work of editing text that is laid out in columns. Anju makes both of these commands available from the main menu.</p>
<p>Side note: on using <code>C-M-&lt;mouse-1&gt;</code>, sometimes Emacs will only read <code>M-&lt;mouse-1&gt;</code> and do a <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Secondary-Selection.html">secondary selection</a>, leaving an unwanted highlight. Enter <code>M-&lt;mouse-1&gt;</code> to dismiss the highlight.</p>
<p>If you find Anju to be useful, please support its development by <a href="https://buymeacoffee.com/kickingvegas">buying me a coffee</a>. I’ve got a <a href="https://github.com/kickingvegas/anju/issues">number of new features planned for it</a>.</p></body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[James Dyer: VC-Mode Meets Magit - or Why I Finally Gave In!]]></title>
            <link>https://emacs.dyerdwelling.family/emacs/20260518114325-emacs--vc-mode-meets-magit-or-why-i-finally-gave-in/</link>
            <guid>https://emacs.dyerdwelling.family/emacs/20260518114325-emacs--vc-mode-meets-magit-or-why-i-finally-gave-in/</guid>
            <pubDate>Mon, 18 May 2026 10:43:00 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>
I have been a VC-mode loyalist for years, it is built in, it is simple, it covers the basics - commit, push, pull, diff, all there with <code>C-x v</code> bindings.  I never really felt the need for Magit, honestly.  VC-mode just works, right?
</p>


<div class="figure">
<p><img loading="lazy" src="https://emacs.dyerdwelling.family/static/emacs/20260518114325-emacs--VC-Mode-Meets-Magit-or-Why-I-Finally-Gave-In.jpg" alt="20260518114325-emacs--VC-Mode-Meets-Magit-or-Why-I-Finally-Gave-In.jpg" width="100%">
</p>
</div>

<p>
Until it does not.  Or rather, until you need something that is not quite available. As <code>vc-mode</code> is source code control agnostic then there were always going to be some limitations and my git usage is now starting to become a little more advanced.
</p>

<p>
Recently I hit a divergent branch situation, remote had moved on, I had local commits, and git refused to push, I reached for <code>C-x v m</code> (vc-merge) to pull in the upstream changes, and that worked fine as a merge.  But what if I wanted a rebase instead?  Clean linear history, no merge commits?
</p>

<p>
Turns out there is no <code>vc-rebase</code> at all in Emacs!  You can use <code>vc-pull</code> and it will rebase if <code>pull.rebase</code> is set in your git config (I think, although I haven't tried it), but there is no interactive <code>vc-rebase</code> command to invoke directly.  And <code>vc-merge</code> only merges, If you want a rebase, you have to drop to shell or configure git to default to it.  I wanted something more cohesive, more discoverable, and #sigh, here enters <code>magit</code>, I used it a few years ago so I still had a residue of muscle memory, but that said, I am not abandoning VC-mode entirely.  For quick operations, a single file commit, a blame, a quick diff – <code>C-x v</code> I still like vc-mode.  Magit is great for repo-level operations; VC-mode is great for file-level ones.  They complement each other nicely, and there is no reason to pick one over the other, this is Emacs!
</p>

<p>
I added <code>use-package magit</code> to my config with a <code>C-x g</code> binding, full-frame status display, word-granular diff refining, and also released <code>C-w</code> in the magit status map so my window-management prefix still works (small things, but they matter):
</p>

<div class="org-src-container">
<pre>(<span>use-package</span> magit
  <span>:bind</span> (<span>"C-x g"</span> . magit-status)
  <span>:config</span>
  (<span>setq</span> magit-display-buffer-function
        #'magit-display-buffer-same-window-except-diff-v1)
  (<span>setq</span> magit-refresh-status-buffer t)
  (<span>setq</span> magit-section-initial-visibility-alist
        '((untracked . show)
          (stashes . hide)))
  (<span>setq</span> magit-diff-refine-hunk 'all)
  (define-key magit-status-mode-map (kbd <span>"C-w"</span>) nil))
</pre>
</div>
</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Sacha Chua: May 29: Emacs Chat with Omar Antolin Camarena]]></title>
            <link>https://sachachua.com/blog/2026/05/may-29-emacs-chat-with-omar-antolin-camarena/</link>
            <guid>https://sachachua.com/blog/2026/05/may-29-emacs-chat-with-omar-antolin-camarena/</guid>
            <pubDate>Sun, 17 May 2026 22:02:50 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>
On May 29, I'll chat with Omar Antolín Camarena about Emacs and Life.
</p>

<p>
</p><div class="yt-video"><a href="https://youtube.com/live/M7-dJb2GTN4">Watch on YouTube</a></div>
<p></p>

<p>
<span class="timestamp-wrapper"><time>&lt;2026-05-29 Fri 10:30&gt;–&lt;2026-05-29 Fri 11:30&gt;</time></span> (America/Toronto) = Fri May 29 1030H EDT / 0930H CDT / 0830H MDT / 0730H PDT / 1430H UTC / 1630H CEST / 1730H EEST / 2000H IST / 2230H +08 / 2330H JST
</p>

<p>
Related links:
</p>

<ul>
<li><a href="https://www.matem.unam.mx/~omar/">Omar Antolín Camarena</a>: a researcher at Instituto de Matemáticas, UNAM in Mexico City</li>
<li><a href="https://www.matem.unam.mx/~omar/apropos-emacs.html">M-x apropos Emacs</a></li>
<li><a href="https://github.com/oantolin/emacs-config">oantolin/emacs-config: My personal Emacs configuration · GitHub</a></li>
<li><a href="https://github.com/oantolin">oantolin (Omar Antolín Camarena) · GitHub</a></li>
<li><a href="https://mathstodon.xyz/@oantolin">Omar Antolín (@oantolin@mathstodon.xyz) - Mathstodon</a></li>
<li><a href="https://www.reddit.com/user/oantolin/">u/oantolin on Reddit</a></li>
</ul>

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

<p>
You can add the iCal for upcoming Emacs Chat episodes to your calendar. <a href="https://sachachua.com/topic/upcoming-emacs-chats.ics">https://sachachua.com/topic/upcoming-emacs-chats.ics</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/may-29-emacs-chat-with-omar-antolin-camarena/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%2Fmay-29-emacs-chat-with-omar-antolin-camarena%2F&amp;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></body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Amy Pillow: Added notification actions in Org yaap]]></title>
            <link>https://blog.amypillow.net/emacs/NEWS/org-yaap-1.1.0.html</link>
            <guid>https://blog.amypillow.net/emacs/NEWS/org-yaap-1.1.0.html</guid>
            <pubDate>Sun, 17 May 2026 17:25:27 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body>Now you can change the todo keyword of a task directly from the notification tray of your phone</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Irreal: May I Recommend: EWW]]></title>
            <link>https://irreal.org/blog/?p=13813</link>
            <guid>https://irreal.org/blog/?p=13813</guid>
            <pubDate>Sun, 17 May 2026 14:35:11 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>
I see a lot of blog posts recommending EWW. Sometimes I even write about them. The common theme is something along the lines of, “No, you can’t really replace a full-fledged browser with EWW but you <i>can</i> do a lot and a ”real“ browser is only a keystroke away.”
</p>
<p>
In another <a href="https://sachachua.com/blog/2026/05/emacs-carnival-may-2026-may-i-recommend/">May Emacs Carnival</a> entry, Omar Antolín Camarena offers <a href="https://www.matem.unam.mx/~omar/apropos-emacs.html#may-i-recommend-eww-for-emacs-innovative-ui">his reasons for using EWW</a>. He agrees with the conventional wisdom that EWW isn’t a replacement for a normal browser but that it <i>is</i> useful in many situations and even has some advantages over your default buffer.
</p>
<p>
He believes that one of the chief advantages of EWW is that it doesn’t run JavaScript. That’s ironic, of course, because EWW’s lack of support for JavaScript is one of its most oft cited shortcomings. But Camarena says that lack is often an advantage because JavaScript is often used to load ads or a paywall or to reconfigure your display preferences often choosing low contrast colors that are hard for anyone but the young to read.
</p>
<p>
His second reason for using EWW is that it brings the power of Emacs to your Web browsing. Among the advantages he lists are:
</p>
<ul>
<li>You can easily resize images without changing font and other sizes.</li>
<li>You can read the Web site content in multiple columns using <code>follow-mode</code>.</li>
<li>You can use <code>occur</code> for a search and keep a list of results and easily navigate among them.</li>
<li>You can evaluate ELISP directly in the EWW buffer and many other language as well with a bit of plumbing.</li>
<li>You can use <code>eww-readable</code> to eliminate a lot of the junk that comes with many Web pages.</li>
</ul>
<p>
And, as Camarena stresses, you can always escape to a normal buffer with <code>eww-browse-with-external-browser</code>, bound to <kbd>&amp;</kbd> by default.</p>
</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Org Mode requests: [FR] Tracking Habits with Alternate Calendar]]></title>
            <link>https://list.orgmode.org/87qznaw4sa.fsf@gmail.com</link>
            <guid>https://list.orgmode.org/87qznaw4sa.fsf@gmail.com</guid>
            <pubDate>Sun, 17 May 2026 13:21:09 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body>[request] flags:--- replies:0</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Sacha Chua: YE29: Sacha, Prot, and Philip Kaludercic Talk Emacs: Newcomer Experience]]></title>
            <link>https://sachachua.com/blog/2026/05/may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience/</link>
            <guid>https://sachachua.com/blog/2026/05/may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience/</guid>
            <pubDate>Sun, 17 May 2026 13:21:07 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><div class="update">
<p>
<span class="timestamp-wrapper"><time>[2026-05-18 Mon]</time></span>: Updated transcript
</p>

</div>

<p>
<a href="https://social.sdfeu.org/@pkal/116500474344904460">Philip Kaludercic</a> wanted to continue the conversation from <a href="https://sachachua.com/blog/2026/04/yay-emacs-sacha-and-prot-talk-emacs-newbies-starter-kits/">YE24: Sacha and Prot Talk Emacs - Newbies/Starter Kits</a>. He's spent a lot of time thinking about this as one of the main contributors to newcomers-presets.
We talked about newcomers-presets, the idea of a "reset theme" that lets experienced users pin defaults to a specific version of Emacs, upcoming changes, and working with emacs-devel.
</p>

<p>
<video src="https://archive.org/download/ye29-prot-and-pkal-emacs-newcomer-experience/ye29-prot-and-pkal-emacs-newcomer-experience.mp4"><track></video>
</p>

<p>
<a href="https://archive.org/details/ye29-prot-and-pkal-emacs-newcomer-experience">View in the Internet Archive</a>, <a href="https://youtube.com/live/UqfZZRl_eNw">watch or comment on YouTube</a>, <a href="https://sachachua.com/blog/category/emacs/feed/index.xml#ID-ye29-transcript">read the transcript online</a>, <a href="https://sachachua.com/blog/2026/05/may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience/ye29-prot-and-pkal-emacs-newcomer-experience.vtt">download the transcript</a>, or <a href="mailto:sacha@sachachua.com">e-mail me</a>.
</p>


<div class="sticky-toc">
<div>
<ul>
<li><a href="https://sachachua.com/blog/category/emacs/feed/index.xml#may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience-related-links">Related links</a></li>
<li><a href="https://sachachua.com/blog/category/emacs/feed/index.xml#ye29-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience-chapters">Chapters</a></li>
<li><a href="https://sachachua.com/blog/category/emacs/feed/index.xml#ye29-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience-transcript">Transcript</a></li>
<li><a href="https://sachachua.com/blog/category/emacs/feed/index.xml#ye29-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience-chat">Chat</a></li>
<li><a href="https://sachachua.com/blog/category/emacs/feed/index.xml#may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience-some-types-of-new-users-to-think-about">Some types of new users to think about</a></li>
<li><a href="https://sachachua.com/blog/category/emacs/feed/index.xml#may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience-part-of-a-learning-journey">Sketching out their learning journey</a></li>
<li><a href="https://sachachua.com/blog/category/emacs/feed/index.xml#may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience-other-notes">Other notes</a></li>
<li><a href="https://sachachua.com/blog/category/emacs/feed/index.xml#may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience-some-screenshots-of-a-fresh-emacs">Some screenshots of a fresh Emacs</a></li>
<li><a href="https://sachachua.com/blog/category/emacs/feed/index.xml#may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience-trying-pkal-s-emacs-configuration-generator">Trying pkal's Emacs Configuration Generator</a></li>
</ul>
</div>

</div>
<div class="outline-3">
<h3><a href="https://sachachua.com/blog/category/emacs/feed/index.xml#may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience-related-links">Related links</a></h3>
<div class="outline-text-3">
<ul>
<li><a href="https://yhetil.org/emacs-devel/87wm0f2rng.fsf@posteo.net/">A proposal for a "beginners" (user-option) theme - Philip Kaludercic</a></li>
<li><a href="https://yhetil.org/emacs-devel/87tsuucbkh.fsf@posteo.net/">Re: some file-related options to consider for newcomers-presets - Philip Kaludercic</a></li>
<li><a href="https://yhetil.org/emacs-devel/CABPi7cHxEoMKwvDkuXGZXaHDpUuqS6ry60JOcdSZbSuYB47LSg@mail.gmail.com/">A newcomer's feedback on newcomer presets - Abdulnafe Toulaimat</a></li>
<li><a href="https://codeberg.org/pkal/ecg/src/branch/master/ecg.lisp">Emacs Configuration Generator</a> - old source code</li>
</ul>
</div>
</div>
<div class="outline-3">
<h3><a href="https://sachachua.com/blog/category/emacs/feed/index.xml#ye29-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience-chapters">Chapters</a></h3>
<div class="outline-text-3">
<p>
</p><ul>
<li><span class="media-time">0:01</span> Opening</li>
<li><span class="media-time">3:01</span> newcomers-presets user option theme; would be nice to explain what the changes are</li>
<li><span class="media-time">5:03</span> finding a balance between "it's fine the way it is" and "just use Doom Emacs"</li>
<li><span class="media-time">6:39</span> people value stability, but also conventions have shifted.</li>
<li><span class="media-time">6:53</span> ways Emacs does things differently: ex: terminal vs eshell, output is editable; new users want to edit the previous prompt; sometimes goes against people's intuitions</li>
<li><span class="media-time">9:23</span> How do people develop Emacs intuition? Immersion</li>
<li><span class="media-time">9:58</span> example: dabbrev, there's no undo? Ah, it's just the regular undo.</li>
<li><span class="media-time">11:03</span> newcomers presets: smooth over the intuition-disrupting things that are not actually necessary/beneficial; ex: enable which-key</li>
<li><span class="media-time">14:35</span> newcomers-presets choice is not saved at the moment</li>
<li><span class="media-time">17:09</span> newcomers without much computing experience might even find it easier (no C-c expectations, C-v etc)</li>
<li><span class="media-time">18:32</span> Focus group?</li>
<li><span class="media-time">22:18</span> Emacs survey before</li>
<li><span class="media-time">22:50</span> people's backgrounds influence their responses</li>
<li><span class="media-time">23:49</span> Hypothetical: Reset themes, to reset things back to the defaults of a specific Emacs version</li>
<li><span class="media-time">24:22</span> package-autosuggest-mode suggests based on file extension</li>
<li><span class="media-time">27:58</span> Emacs 32: bundled versions of Emacs (Big Emacs - distributions that include more packages)</li>
<li><span class="media-time">29:58</span> Selection versus multiple completion</li>
<li><span class="media-time">34:41</span> Manuals</li>
<li><span class="media-time">35:11</span> More examples?</li>
<li><span class="media-time">36:24</span> find-user-init-file?</li>
<li><span class="media-time">38:40</span> Getting over the reverence for Emacs's history</li>
<li><span class="media-time">40:13</span> Changes are more likely to happen when someone puts in the work to make a patch</li>
<li><span class="media-time">44:06</span> Preserving Git history of packages absorbed into the core</li>
<li><span class="media-time">46:02</span> Dealing with multiple types of Emacs</li>
<li><span class="media-time">48:11</span> Fat Emacs is just about bundling more packages from ELPA, not changing the configuration for them</li>
<li><span class="media-time">51:24</span> Customize</li>
<li><span class="media-time">54:44</span> CUA - Common User Access</li>
<li><span class="media-time">55:04</span> ini file format? <a href="https://sdf.org/~pkal//blog/emacs/ini-init.html">https://sdf.org/~pkal//blog/emacs/ini-init.html</a></li>
<li><span class="media-time">55:13</span> Emacs configuration generator</li>

<li><span class="media-time">55:56</span> INI-style configuration</li>
<li><span class="media-time">1:00:25</span> Quick summary</li>
<li><span class="media-time">1:02:29</span> Continuing with INI</li>
<li><span class="media-time">1:04:45</span> Motivation</li>
<li><span class="media-time">1:06:54</span> Politics and philosophy</li>
<li><span class="media-time">1:09:26</span> Experimenting with things outside core</li>
<li><span class="media-time">1:10:45</span> Extending the core</li>
<li><span class="media-time">1:11:55</span> Guide to contributing to ELPA</li>

<li><span class="media-time">1:13:13</span> Making the newcomer experience better</li>
<li><span class="media-time">1:14:33</span> "user option themes" versus "appearance themes"</li>
<li><span class="media-time">1:15:27</span> find-library</li>
<li><span class="media-time">1:16:54</span> configuration generator in Emacs? maybe more wizards?</li>
<li><span class="media-time">1:17:04</span> Starter kits</li>
<li><span class="media-time">1:17:42</span> Configuration generator in Emacs Lisp?</li>
<li><span class="media-time">1:18:42</span> extending the archive format</li>
<li><span class="media-time">1:20:58</span> User interfaces</li>
</ul>

<p></p>
</div>
</div>
<div class="outline-3">
<h3><a href="https://sachachua.com/blog/category/emacs/feed/index.xml#ye29-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience-transcript">Transcript</a></h3>
<div class="outline-text-3">
<a name="ID-ye29-transcript"></a>Expand this to read the transcript
<p>
</p><div class="full-transcript"><p></p><div class="transcript-heading"><span class="audio-time">0:00</span> <strong>Opening</strong></div><p></p><span class="audio-time caption"><strong>Sacha:</strong> I'm going to start recording.</span> <span class="audio-time caption">I'm going to do the thing.</span> <span class="audio-time caption">I'll let you know.</span> <span class="audio-time caption">Okay.</span> <span class="audio-time caption">Let's do this.</span> <span class="audio-time caption">Yeah.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Yeah.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Yeah. Okay. Hang on a second.</span> <span class="audio-time caption">Starting, going live.</span> <span class="audio-time caption">Okay.</span> <span class="audio-time caption">So, hello, everyone.</span> <span class="audio-time caption">This is Yay Emacs 29.</span> <span class="audio-time caption">And today I am here with Prot and</span> <span class="audio-time caption">Philip Kaludercic.</span> <span class="audio-time caption">We're having this conversation about Emacs</span> <span class="audio-time caption">newcomer experience, which started off with an</span> <span class="audio-time caption">Emacs carnival last month about newbies and</span> <span class="audio-time caption">starter kits, which Cena started and you fleshed</span> <span class="audio-time caption">out with more questions.</span> <span class="audio-time caption">And now this is snowballing to, okay, let's</span> <span class="audio-time caption">figure out what we can do to make Emacs easier</span> <span class="audio-time caption">for newbies who are coming in, maybe they're</span> <span class="audio-time caption">non-developers who have heard good things about</span> <span class="audio-time caption">Org Mode, or maybe they're developers who want to</span> <span class="audio-time caption">try out what this Emacs thing is and what's all</span> <span class="audio-time caption">the fuss about having an editor that's been</span> <span class="audio-time caption">around for so long.</span> <span class="audio-time caption">Or maybe they're actually still VS Code or Vim</span> <span class="audio-time caption">fans, but they really just want to use Magit, so</span> <span class="audio-time caption">they're coming in just for that.</span> <span class="audio-time caption">A lot of different paths to coming into Emacs.</span> <span class="audio-time caption">We do have this live stream, so if people have</span> <span class="audio-time caption">questions, I will at some point figure out where</span> <span class="audio-time caption">the chat is on my screen so I can read them out</span> <span class="audio-time caption">to you.</span> <span class="audio-time caption">But my plan here is I'll just be in the</span> <span class="audio-time caption">background taking notes most of the time and</span> <span class="audio-time caption">interjecting with occasional questions.</span> <span class="audio-time caption">And maybe Philip and Prot, you can go brain dump</span> <span class="audio-time caption">all the wonderful things you've been thinking</span> <span class="audio-time caption">about the Emacs newcomer experience.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> At this point, regret not having</span> <span class="audio-time caption">written down any notes from the last video or</span> <span class="audio-time caption">from your last recording of YouTube, because I</span> <span class="audio-time caption">noticed I had a few things I wanted to add</span> <span class="audio-time caption">or intersperse.</span> <span class="audio-time caption">But I guess we can take a look at two things.</span> <span class="audio-time caption">So first one is the state of introducing people</span> <span class="audio-time caption">to Emacs now.</span> <span class="audio-time caption">And the question there is, who are we introducing</span> <span class="audio-time caption">Emacs to?</span> <span class="audio-time caption">Just like you said, you sketched out a few</span> <span class="audio-time caption">different profiles of people who presumably have</span> <span class="audio-time caption">entirely different</span> <span class="audio-time caption">interests, motivations, like if someone wants to</span> <span class="audio-time caption">just use Magit like Emacs is there.</span> <span class="audio-time caption">It's the tool, it's the GUI that implements</span> <span class="audio-time caption">Magit, then these people have an entirely</span> <span class="audio-time caption">different motivation than someone who actually</span> <span class="audio-time caption">says, well, I'm coming at it from, I heard it's</span> <span class="audio-time caption">an interesting tool for free software development.</span> <span class="audio-time caption">Build your own or understand free software</span> <span class="audio-time caption">in a different sense, where you can actually do</span> <span class="audio-time caption">find-function and open the definition of the</span> <span class="audio-time caption">function you just used.</span> <span class="audio-time caption">I think malleable is the current catch word</span> <span class="audio-time caption">that people like to use in that context.</span> <span class="audio-time caption">So there's some issue in that sense.</span> <p></p><div class="transcript-heading"><span class="audio-time">2:59</span> <strong>newcomers-presets user option theme; would be nice to explain what the changes are</strong></div><p></p><span class="audio-time caption"><strong>Philip:</strong> And then the specific comment from the last</span> <span class="audio-time caption">discussion which caught my attention was</span> <span class="audio-time caption">We were talking about Emacs 31, there's this</span> <span class="audio-time caption">preset theme, the newcomers-presets theme,</span> <span class="audio-time caption">which is implemented as a user option theme, or</span> <span class="audio-time caption">that's how I like to refer to it.</span> <span class="audio-time caption">And I probably should just briefly stop and say</span> <span class="audio-time caption">that everything I'm saying is from my</span> <span class="audio-time caption">own perspective.</span> <span class="audio-time caption">I don't feel comfortable saying that this is the</span> <span class="audio-time caption">Emacs-devel perspective or that any other of the</span> <span class="audio-time caption">Emacs developers necessarily have to agree</span> <span class="audio-time caption">with me.</span> <span class="audio-time caption">I just think that I might have a few things.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Sorry, I lost your audio.</span> <span class="audio-time caption">Just to say I lost your audio, Philip.</span> <span class="audio-time caption">Excuse me.</span> <span class="audio-time caption">Sorry, I lost your audio for a second.</span> <span class="audio-time caption">You could hear it fine.</span> <span class="audio-time caption">I will hear it in the recording.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Okay, so basically, you can repeat it,</span> <span class="audio-time caption">I guess.</span> <span class="audio-time caption">Go ahead.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> What did I say?</span> <span class="audio-time caption">So you were saying that... I'm not</span> <span class="audio-time caption">representing emacs-devel.</span> <span class="audio-time caption">These are my views which are informed by the</span> <span class="audio-time caption">discussions that we had in emacs-devel that I</span> <span class="audio-time caption">hope will be represented.</span> <span class="audio-time caption">I think I'm the maintainer of the preset theme,</span> <span class="audio-time caption">but of course other people are also contributing</span> <span class="audio-time caption">to it and adding other options.</span> <span class="audio-time caption">Specific points I had like the target audience of</span> <span class="audio-time caption">the preset theme was not people who would be</span> <span class="audio-time caption">particularly interested.</span> <span class="audio-time caption">What the options are.</span> <span class="audio-time caption">I think that was a discussion point last time.</span> <span class="audio-time caption">I admit it's a technical deficiency currently.</span> <span class="audio-time caption">There's no pretty way.</span> <span class="audio-time caption">I think it would be nice if we extended describe</span> <span class="audio-time caption">theme to actually list the options that are</span> <span class="audio-time caption">modified with hyperlinks so that you could look</span> <span class="audio-time caption">into these options.</span> <span class="audio-time caption">That's currently not there.</span> <span class="audio-time caption">We didn't add it in time for the feature cut for</span> <span class="audio-time caption">Emacs 31, but I think for Emacs 32 that's going</span> <span class="audio-time caption">to be an interesting</span> <span class="audio-time caption">Feature to have at some point.</span> <p></p><div class="transcript-heading"><span class="audio-time">5:00</span> <strong>finding a balance between "it's fine the way it is" and "just use Doom Emacs"</strong></div><p></p><span class="audio-time caption"><strong>Philip:</strong> And actually the idea had been floating around I</span> <span class="audio-time caption">think like every time there was like there's a</span> <span class="audio-time caption">periodic, periodical discussions like how should</span> <span class="audio-time caption">we make Emacs more user-friendly on Emacs level</span> <span class="audio-time caption">and people say we have to like say the extremist</span> <span class="audio-time caption">position is what do you mean not user-friendly.</span> <span class="audio-time caption">It's perfect the way it is.</span> <span class="audio-time caption">It's</span> <span class="audio-time caption">God-given configuration.</span> <span class="audio-time caption">And the other people who say, well, why don't we</span> <span class="audio-time caption">just install Doom Emacs and make that the</span> <span class="audio-time caption">default then?</span> <span class="audio-time caption">Somewhere in between, I think there is a</span> <span class="audio-time caption">reasonable position to be had.</span> <span class="audio-time caption">But in these discussions, one of the reasons this</span> <span class="audio-time caption">came... I participated maybe in</span> <span class="audio-time caption">four or five of them, and then this point came up:</span> <span class="audio-time caption">why don't we have a theme, like a collection of</span> <span class="audio-time caption">user options, which you can toggle in one switch,</span> <span class="audio-time caption">which enable all the options from which we would</span> <span class="audio-time caption">not find, which existing users would not find</span> <span class="audio-time caption">interesting, which are always the bulk of the</span> <span class="audio-time caption">users. Most people are already existing users. They</span> <span class="audio-time caption">don't come in and... One of the things is, lots of</span> <span class="audio-time caption">existing users, I'm thinking of like</span> <span class="audio-time caption">a 60-year-old professor who has been using Emacs</span> <span class="audio-time caption">for 30 years, or a software engineer who's using</span> <span class="audio-time caption">it, and maybe consciously or unconsciously</span> <span class="audio-time caption">appreciates the fact that it doesn't change every</span> <span class="audio-time caption">few years.</span> <span class="audio-time caption">You don't have a graphic designer.</span> <span class="audio-time caption">This is, of course, me against graphic designers</span> <span class="audio-time caption">and UI designers who have a need to reinvent the</span> <span class="audio-time caption">UI interface every few years and then</span> <span class="audio-time caption">things change.</span> <span class="audio-time caption">And how do I save now?</span> <span class="audio-time caption">What's the...</span> <span class="audio-time caption">What's the button to do this?</span> <span class="audio-time caption">And the UI changes.</span> <p></p><div class="transcript-heading"><span class="audio-time">6:37</span> <strong>people value stability, but also conventions have shifted.</strong></div><p></p><span class="audio-time caption"><strong>Philip:</strong> The people who value the stability.</span> <span class="audio-time caption">But of course, the common conventions have</span> <span class="audio-time caption">grown apart.</span> <span class="audio-time caption">What Emacs does and what people are used to from</span> <span class="audio-time caption">other programs.</span> <p></p><div class="transcript-heading"><span class="audio-time">6:50</span> <strong>ways Emacs does things differently: ex: terminal vs eshell, output is editable; new users want to edit the previous prompt; sometimes goes against people's intuitions</strong></div><p></p><span class="audio-time caption"><strong>Philip:</strong> Now, at this point, we also have to distinguish</span> <span class="audio-time caption">that there are things which Emacs doesn't do the</span> <span class="audio-time caption">way other programs do, which are...</span> <span class="audio-time caption">Which I would argue are actually sensible.</span> <span class="audio-time caption">For example, I think one issue I remember was</span> <span class="audio-time caption">when I first started using Emacs, I had a</span> <span class="audio-time caption">terminal emulator.</span> <span class="audio-time caption">I wanted to have a terminal emulator within Emacs.</span> <span class="audio-time caption">Nowadays I use Emacs Shell, which to me seems</span> <span class="audio-time caption">like a more truer Emacs experience.</span> <span class="audio-time caption">It's an opinion, a strong opinion maybe.</span> <span class="audio-time caption">And it's also influenced by a history of using</span> <span class="audio-time caption">Plan 9 and that kind of terminal where actually</span> <span class="audio-time caption">the output is just as editable.</span> <span class="audio-time caption">You can just search it.</span> <span class="audio-time caption">You can edit it.</span> <span class="audio-time caption">You can cut it.</span> <span class="audio-time caption">You can interact with the output any way you</span> <span class="audio-time caption">would use a normal text, which is not something</span> <span class="audio-time caption">you can do with a terminal for purely</span> <span class="audio-time caption">historical reasons.</span> <span class="audio-time caption">At my university, the university where I studied</span> <span class="audio-time caption">computer science, I frequently helped people in</span> <span class="audio-time caption">the introductory Linux course.</span> <span class="audio-time caption">One thing you notice there, these are</span> <span class="audio-time caption">real newcomers.</span> <span class="audio-time caption">These are people who have never used Linux or a</span> <span class="audio-time caption">terminal or anything like that before.</span> <span class="audio-time caption">The first thing they do when they want to, like,</span> <span class="audio-time caption">they use the arrow keys expecting or click on,</span> <span class="audio-time caption">they use the mouse and click on the</span> <span class="audio-time caption">previous prompt.</span> <span class="audio-time caption">And they want to modify the previous prompt.</span> <span class="audio-time caption">Of course, that doesn't work because that's not</span> <span class="audio-time caption">how terminal emulators work.</span> <span class="audio-time caption">All the previous output, that's fixed.</span> <span class="audio-time caption">You don't touch that anymore.</span> <span class="audio-time caption">Everyone, I guess even people who we describe</span> <span class="audio-time caption">as newcomers, talking about Emacs,</span> <span class="audio-time caption">obviously know</span> <span class="audio-time caption">of course you don't touch the previous prompt in</span> <span class="audio-time caption">the terminal.</span> <span class="audio-time caption">These are some expectations you have, if you use</span> <span class="audio-time caption">Eclipse, if you use VS Code, if you use... I'm</span> <span class="audio-time caption">not sure how the NeoVim terminal emulator works.</span> <span class="audio-time caption">I know they have a built-in one.</span> <span class="audio-time caption">I think Vim also, but I'm guessing right now.</span> <span class="audio-time caption">So there are some accumulated intuitions which</span> <span class="audio-time caption">Emacs actually intentionally doesn't want to give,</span> <span class="audio-time caption">doesn't want to give in all purpose, because I'd</span> <span class="audio-time caption">argue that one of the strengths of Emacs is</span> <span class="audio-time caption">really having this uniform text interface where I</span> <span class="audio-time caption">can use isearch, I can use occur, I can use the</span> <span class="audio-time caption">highlighting commands, I can just select a region</span> <span class="audio-time caption">and write it out to a buffer,</span> <span class="audio-time caption">and stuff like that.</span> <span class="audio-time caption">That shell buffer is no different than anything</span> <span class="audio-time caption">else in that respect.</span> <span class="audio-time caption">Please interrupt me by the way.</span> <span class="audio-time caption">This is not supposed to be a monologue.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> No, no, no.</span> <span class="audio-time caption">Go ahead.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> So it sounds like there's an interesting</span> <span class="audio-time caption">challenge here.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Breaking some of these intuitions</span> <span class="audio-time caption">is legitimate.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Yeah.</span> <p></p><div class="transcript-heading"><span class="audio-time">9:21</span> <strong>How do people develop Emacs intuition? Immersion</strong></div><p></p><span class="audio-time caption"><strong>Sacha:</strong> How do we help people develop the</span> <span class="audio-time caption">Emacs intuitions?</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> To some degree, it really feels like it</span> <span class="audio-time caption">has to be something that you immerse yourself in.</span> <span class="audio-time caption">The issue, I guess, is, well, I know, I mean, I</span> <span class="audio-time caption">knew people who actually used Emacs.</span> <span class="audio-time caption">I mean, you can help them in a face-to-face</span> <span class="audio-time caption">setting or like Prot does in his</span> <span class="audio-time caption">teaching settings.</span> <span class="audio-time caption">Then you communicate certain things, which I</span> <span class="audio-time caption">don't want to say they're ineffable.</span> <span class="audio-time caption">It's not like you couldn't write them down in a</span> <span class="audio-time caption">manual, but it's also...</span> <span class="audio-time caption">Like the mentality that people have.</span> <p></p><div class="transcript-heading"><span class="audio-time">9:55</span> <strong>example: dabbrev, there's no undo? Ah, it's just the regular undo.</strong></div><p></p><span class="audio-time caption"><strong>Philip:</strong> A different example I have, like, I remember I</span> <span class="audio-time caption">was using daabrev for the first time</span> <span class="audio-time caption">or something.</span> <span class="audio-time caption">For a while I was irritated.</span> <span class="audio-time caption">There was no undo.</span> <span class="audio-time caption">Like, how do I go back to the previous</span> <span class="audio-time caption">text expansion?</span> <span class="audio-time caption">Until at some point I realized, oh wait, it's</span> <span class="audio-time caption">just regular undo.</span> <span class="audio-time caption">That's just the way you undo it.</span> <span class="audio-time caption">But somehow writing this down in a manual is...</span> <span class="audio-time caption">It's not an easy thing to always think of</span> <span class="audio-time caption">these things.</span> <span class="audio-time caption">For me it seems obvious now, but at that point I</span> <span class="audio-time caption">specifically remember it was unintuitive.</span> <span class="audio-time caption">I had this accumulated expectation from other</span> <span class="audio-time caption">programmers if I have a text expansion in this</span> <span class="audio-time caption">case that I'm actually cycling through some</span> <span class="audio-time caption">special sort of menu, not thinking of it as just</span> <span class="audio-time caption">regular text buffer operations.</span> <span class="audio-time caption">Just text editing in some fancy way.</span> <span class="audio-time caption">But that's one</span> <span class="audio-time caption">We should keep in mind.</span> <span class="audio-time caption">This was all related to the preset theme in some</span> <span class="audio-time caption">way, right?</span> <span class="audio-time caption">You're writing this down.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Yes, I'm writing this down.</span> <span class="audio-time caption">That's why we have notes.</span> <p></p><div class="transcript-heading"><span class="audio-time">11:00</span> <strong>newcomers presets: smooth over the intuition-disrupting things that are not actually necessary/beneficial; ex: enable which-key</strong></div><p></p><span class="audio-time caption"><strong>Sacha:</strong> So what I'm thinking is you wanted the idea</span> <span class="audio-time caption">behind the newcomers presets is to kind of smooth</span> <span class="audio-time caption">over some of those intuition disrupting things</span> <span class="audio-time caption">where people are coming in with maybe</span> <span class="audio-time caption">expectations of how stuff should work in a</span> <span class="audio-time caption">modern editor.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Specifically, the intuition.</span> <span class="audio-time caption">Specifically, the intuition-disrupting things</span> <span class="audio-time caption">which are not necessary, in some sense. Like, we</span> <span class="audio-time caption">wouldn't want to be an intuition disrupt... like you</span> <span class="audio-time caption">could probably... Like Cua mode or something, that</span> <span class="audio-time caption">would be something where people if they would</span> <span class="audio-time caption">start using... If you would enable Cua-mode</span> <span class="audio-time caption">by default, that would inhibit further development,</span> <span class="audio-time caption">because then it might be confusing with using</span> <span class="audio-time caption">C-c, like if you... because suddenly</span> <span class="audio-time caption">Delay becomes a user input, which is usually not</span> <span class="audio-time caption">the case with Emacs.</span> <span class="audio-time caption">I know which-key is an exception in that case,</span> <span class="audio-time caption">because which-key pausing actually is an action</span> <span class="audio-time caption">and displays a pop-up buffer.</span> <span class="audio-time caption">And we do enable which-key due to popular requests</span> <span class="audio-time caption">and the preset theme.</span> <span class="audio-time caption">I personally was a bit hesitant about that one,</span> <span class="audio-time caption">but it seems to be something.</span> <span class="audio-time caption">where you have to really weigh it on a</span> <span class="audio-time caption">case-to-case basis.</span> <span class="audio-time caption">But, Sacha, do you have the... What version of</span> <span class="audio-time caption">Emacs do you have running there?</span> <span class="audio-time caption">I can't make it out.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Yeah, this is Emacs 31, so I do have...</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> So you can open the preset theme, right?</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Yeah, yeah. Hang on a second.</span> <span class="audio-time caption">Let me bring up a... I have now a terminal, so I</span> <span class="audio-time caption">can... Let me bring up a completely fresh Emacs.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> No, I just want you to open the file.</span> <span class="audio-time caption">Because in the file there is a prelude.</span> <span class="audio-time caption">There's a commentary section that actually</span> <span class="audio-time caption">explains the curve.</span> <span class="audio-time caption">It's not a library.</span> <span class="audio-time caption">That's exactly the joke with the...</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Yeah, that's part of the problem with those themes.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> That's the problem.</span> <span class="audio-time caption">Themes are not libraries.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> It would be easier if they were all there.</span> <span class="audio-time caption">It's a kind of an implementation detail that from</span> <span class="audio-time caption">a user, it doesn't really make a difference.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> All right, newcomers-presets.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> If I remember correctly...</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Yeah, yeah, exactly.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Yeah, and you see up there the commentary section?</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Yeah.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> If you scroll up a bit, it's above line 37.</span> <span class="audio-time caption">The theme configures which we can reasonably</span> <span class="audio-time caption">expect the average user to want to enable, but</span> <span class="audio-time caption">would otherwise be unlikely to discover on</span> <span class="audio-time caption">their own.</span> <span class="audio-time caption">That's sort of the overall guide of what options</span> <span class="audio-time caption">we want to add.</span> <span class="audio-time caption">That's why it's also an option on the</span> <span class="audio-time caption">splash screen.</span> <span class="audio-time caption">You just tick it, and then the user options</span> <span class="audio-time caption">enabled in the theme should be activated by default.</span> <span class="audio-time caption">That's sort of the idea.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> It is available on the splash screen.</span> <span class="audio-time caption">So if I say display-splash...</span> <span class="audio-time caption">Oh my goodness, how do I get to the splash screen?</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> It's C-h C-a or not?</span> <span class="audio-time caption">I forgot. C-h a maybe?</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> There are two things.</span> <span class="audio-time caption">There's a splash screen and there's the...</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Hang on a second.</span> <span class="audio-time caption">I'm just going to start a new Emacs.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Yeah, I haven't done that in, like, I don't know...</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> That's the about Emacs screen.</span> <span class="audio-time caption">But you have a display splash screen.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> C-h C-a on mine.</span> <span class="audio-time caption">About Emacs.</span> <span class="audio-time caption">M-x about-emacs.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> No, I have a better idea.</span> <span class="audio-time caption">I'm going to start this new Emacs person.</span> <span class="audio-time caption">Okay, here we go.</span> <span class="audio-time caption">New Emacs.</span> <span class="audio-time caption">Fresh person.</span> <p></p><a href="https://sachachua.com/blog/2026/05/may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience/ye29-prot-and-pkal-emacs-newcomer-experience-00-14-32-733.jpg"><img loading="lazy" src="https://sachachua.com/blog/2026/05/may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience/ye29-prot-and-pkal-emacs-newcomer-experience-00-14-32-733.jpg" alt="image from video 00:14:32.733"></a><span class="audio-time caption"><strong>Sacha:</strong> So we click on this, right?</span> <span class="audio-time caption">And it turns on a bunch of things including the tab bar.</span> <p></p><div class="transcript-heading"><span class="audio-time">14:32</span> <strong>newcomers-presets choice is not saved at the moment</strong></div><p></p><span class="audio-time caption"><strong>Sacha:</strong> I wasn't entirely sure how people would save that</span> <span class="audio-time caption">so that it happens again next time.</span> <span class="audio-time caption">Is the idea that they just keep</span> <span class="audio-time caption">checking that box?</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> That's not done currently.</span> <span class="audio-time caption">That's something we haven't simply decided on.</span> <span class="audio-time caption">The current presentation is you enable</span> <span class="audio-time caption">it in that mode and then you'd have to, which is</span> <span class="audio-time caption">of course saying it out loud makes it sound</span> <span class="audio-time caption">stupid, but you'd have to persistently save</span> <span class="audio-time caption">the themes.</span> <span class="audio-time caption">So then I think it's optional to save themes</span> <span class="audio-time caption">and then...</span> <p></p><a href="https://sachachua.com/blog/2026/05/may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience/ye29-prot-and-pkal-emacs-newcomer-experience-00-15-14-000.jpg"><img loading="lazy" src="https://sachachua.com/blog/2026/05/may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience/ye29-prot-and-pkal-emacs-newcomer-experience-00-15-14-000.jpg" alt="image from video 00:15:14.000"></a><span class="audio-time caption"><strong>Sacha:</strong> It is possible for people to get to it</span> <span class="audio-time caption">if we leave them a breadcrumb.</span> <span class="audio-time caption">But it's not going to occur to them because it</span> <span class="audio-time caption">would never occur to them to say customize Emacs,</span> <span class="audio-time caption">custom themes, and then I can pick newcomers themes from here.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> It's a point that I at least intended</span> <span class="audio-time caption">to mention at some point on</span> <span class="audio-time caption">emacs-devel, whether we want to make this, because</span> <span class="audio-time caption">currently it just loads the theme, but it doesn't</span> <span class="audio-time caption">persist the choice, but it could just as well</span> <span class="audio-time caption">persist the choice.</span> <span class="audio-time caption">There's a discussion to be had which of these two</span> <span class="audio-time caption">behaviors is more intuitive, because of course, if</span> <span class="audio-time caption">you persist the option, then you have the</span> <span class="audio-time caption">disadvantage that someone might enable it, but</span> <span class="audio-time caption">doesn't actually want it, but now somehow their</span> <span class="audio-time caption">Emacs is broken from their perspective.</span> <span class="audio-time caption">I don't want tabs or whatever they say, or I don't</span> <span class="audio-time caption">want which-key, and they don't know how to disable it.</span> <span class="audio-time caption">So this is...</span> <span class="audio-time caption">I wouldn't say it's an obvious decision in</span> <span class="audio-time caption">either direction.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Like if there is an enable button or</span> <span class="audio-time caption">save, there should be a disable and unsave,</span> <span class="audio-time caption">like remove.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Yeah, that's the checkbox idea in that case.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> That would be the tricky part.</span> <span class="audio-time caption">And especially, finding the place on the splash</span> <span class="audio-time caption">screen so that this actually works for everyone...</span> <span class="audio-time caption">Because if you open it in a TUI mode, I think then</span> <span class="audio-time caption">initially, if I remember correctly, we had this</span> <span class="audio-time caption">button or this new to Emacs line was underneath</span> <span class="audio-time caption">the copyrights.</span> <span class="audio-time caption">No, no, that was a different thing.</span> <p></p><a href="https://sachachua.com/blog/2026/05/may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience/ye29-prot-and-pkal-emacs-newcomer-experience-00-16-46-233.jpg"><img loading="lazy" src="https://sachachua.com/blog/2026/05/may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience/ye29-prot-and-pkal-emacs-newcomer-experience-00-16-46-233.jpg" alt="image from video 00:16:46.233"></a><span class="audio-time caption"><strong>Prot:</strong> If you click on newcomers preset, for example,</span> <span class="audio-time caption">then you are redirected to the manual entry.</span> <span class="audio-time caption">And I think we had some, yeah, there's this, the</span> <span class="audio-time caption">top line.</span> <span class="audio-time caption">If you got here by clicking the link on the</span> <span class="audio-time caption">splash screen, that was on the bottom.</span> <span class="audio-time caption">That was on the bottom of the manual entry.</span> <span class="audio-time caption">But if you open it up in an 80x24 terminal, you</span> <span class="audio-time caption">wouldn't see this line.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> You can't see it and you don't know how</span> <span class="audio-time caption">to... These are the complications that you have</span> <span class="audio-time caption">to keep in mind in that case.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> You might not have the intuition that</span> <span class="audio-time caption">SPC is scroll, which I think that's the case</span> <span class="audio-time caption">in less.</span> <span class="audio-time caption">But yes, again, you have this accumulated</span> <span class="audio-time caption">intuition from using Unix tools.</span> <span class="audio-time caption">Which is one of the points I wanted to bring up.</span> <p></p><div class="transcript-heading"><span class="audio-time">17:08</span> <strong>newcomers without much computing experience might even find it easier (no C-c expectations, C-v etc)</strong></div><p></p><span class="audio-time caption"><strong>Philip:</strong> Who is this mythical newcomer?</span> <span class="audio-time caption">What's their actual background?</span> <span class="audio-time caption">Because I claim, and this might be controversial,</span> <span class="audio-time caption">that if someone's actually new to using computers</span> <span class="audio-time caption">at all, which is something I have seen, like</span> <span class="audio-time caption">people who have never programmed, people who have</span> <span class="audio-time caption">never used Unix, people who have never used more</span> <span class="audio-time caption">than a web browser, to exaggerate, they appear to</span> <span class="audio-time caption">do fine with Emacs because they have no</span> <span class="audio-time caption">expectation of using C-c, C-v, C-c, and so on.</span> <span class="audio-time caption">They know that they have to use the buttons</span> <span class="audio-time caption">up there.</span> <span class="audio-time caption">So in that sense, they're fine.</span> <span class="audio-time caption">There's an optimization loop</span> <span class="audio-time caption">when you're used to these shortcuts</span> <span class="audio-time caption">and a few of these conventions how to move around,</span> <span class="audio-time caption">that Emacs defaults appear to be inconvenient.</span> <span class="audio-time caption">So that's also a distinction you have to make in</span> <span class="audio-time caption">that setting.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Exactly, exactly.</span> <span class="audio-time caption">Plus you cannot optimize for everybody.</span> <span class="audio-time caption">Eventually you just have to make some assumptions.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Exactly.</span> <span class="audio-time caption">But what these assumptions are is the controversial...</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> I think the way you approached it</span> <span class="audio-time caption">makes sense.</span> <span class="audio-time caption">This is the reasonable way, I think, to do it.</span> <span class="audio-time caption">You have to assume that they have this</span> <span class="audio-time caption">background knowledge.</span> <span class="audio-time caption">And if they don't, it's what you said.</span> <span class="audio-time caption">They don't have to relearn something because they</span> <span class="audio-time caption">didn't know it to begin with.</span> <span class="audio-time caption">So they start from a good basis.</span> <p></p><div class="transcript-heading"><span class="audio-time">18:30</span> <strong>Focus group?</strong></div><p></p><span class="audio-time caption"><strong>Sacha:</strong> Is there interest in having some kind of</span> <span class="audio-time caption">focus group or something like that so that if we</span> <span class="audio-time caption">come across newbies, we can say, hey, you know,</span> <span class="audio-time caption">the developers would like to be able to float</span> <span class="audio-time caption">some questions once in a while to see what actual</span> <span class="audio-time caption">newbies would think of this?</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> I have actually tried this once.</span> <span class="audio-time caption">I was in a hacker... what's it called?</span> <span class="audio-time caption">There's this computer club in Germany and they</span> <span class="audio-time caption">have local events on a regular basis and I was</span> <span class="audio-time caption">going to one anyway because a few friends of mine</span> <span class="audio-time caption">were going there and then I did an introduction</span> <span class="audio-time caption">to Emacs course there and printed out a survey</span> <span class="audio-time caption">basically, a questionnaire for Emacs neophytes.</span> <span class="audio-time caption">I think if you search for that string on the</span> <span class="audio-time caption">Emacs development list, you're going to find that.</span> <span class="audio-time caption">And I gave a few people these texts.</span> <span class="audio-time caption">I printed it out.</span> <span class="audio-time caption">It was actually pieces of paper, so it wouldn't be</span> <span class="audio-time caption">personally identified. There wouldn't be any</span> <span class="audio-time caption">information there.</span> <span class="audio-time caption">And one of the things I thought was interesting</span> <span class="audio-time caption">in the results was that the main thing people</span> <span class="audio-time caption">were saying was it's overwhelming.</span> <span class="audio-time caption">Like the amount of things...</span> <span class="audio-time caption">Just the default Emacs.</span> <span class="audio-time caption">No configuration, no options, no auto-completion,</span> <span class="audio-time caption">no fido, whatever.</span> <span class="audio-time caption">It was just so many new things, so many</span> <span class="audio-time caption">differences that they lost an overview, basically.</span> <span class="audio-time caption">This was a group of people who, I think there</span> <span class="audio-time caption">were questions, and they were like, how long have</span> <span class="audio-time caption">you been using computers?</span> <span class="audio-time caption">Because, of course, it was so generic.</span> <span class="audio-time caption">What previous UIs have you had experience with?</span> <span class="audio-time caption">Most people use Eclipse or Vi, NeoVim and even</span> <span class="audio-time caption">reasonably complex Vim configurations.</span> <span class="audio-time caption">Of course, this is a bias due to the setting in</span> <span class="audio-time caption">which I was asking these questions.</span> <span class="audio-time caption">I'm actually planning to repeat this experiment</span> <span class="audio-time caption">because I'm going to</span> <span class="audio-time caption">another one of these congresses or these meetups</span> <span class="audio-time caption">in a month or so.</span> <span class="audio-time caption">I wanted to offer this again to people,</span> <span class="audio-time caption">specifically seeing if these newcomer presets are</span> <span class="audio-time caption">valuable or if they help people or not.</span> <span class="audio-time caption">But of course, doing this in a properly</span> <span class="audio-time caption">scientific setting would be much more difficult.</span> <span class="audio-time caption">Yeah, of course.</span> <span class="audio-time caption">We need money.</span> <span class="audio-time caption">Difficult steps of doing this.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Maybe even like a mailing list.</span> <span class="audio-time caption">We can say, hey, you know, you're new to Emacs,</span> <span class="audio-time caption">but you kind of want to make it better.</span> <span class="audio-time caption">Email this person.</span> <span class="audio-time caption">And every so often when developers have a</span> <span class="audio-time caption">question, they can say like, does this make sense</span> <span class="audio-time caption">to you?</span> <span class="audio-time caption">Here's a screenshot.</span> <span class="audio-time caption">Or would you prefer this versus this?</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> As in, we would send an email to all</span> <span class="audio-time caption">the people, but then I think, I mean, the big</span> <span class="audio-time caption">question, difficulty in that sense is then data</span> <span class="audio-time caption">protection, I think.</span> <span class="audio-time caption">That's what I was trying to avoid with having</span> <span class="audio-time caption">this just printed out and no personal</span> <span class="audio-time caption">identification, because then we have to store</span> <span class="audio-time caption">email addresses.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Okay, all right.</span> <span class="audio-time caption">That's fine.</span> <span class="audio-time caption">That's fair.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> So, sounds like an excuse.</span> <span class="audio-time caption">Partially it is, but something like, I mean...</span> <span class="audio-time caption">I'm not saying that my approach, what I was doing</span> <span class="audio-time caption">was unbiased.</span> <span class="audio-time caption">There are people who would be more willing to</span> <span class="audio-time caption">answer these things and people who are</span> <span class="audio-time caption">less willing.</span> <span class="audio-time caption">I know the bias in this case because I actually</span> <span class="audio-time caption">saw the people and I had a feeling for what kind</span> <span class="audio-time caption">of people they were.</span> <span class="audio-time caption">So I think I'm in a better position to factor</span> <span class="audio-time caption">it out.</span> <span class="audio-time caption">But if it's actually properly, if you just have</span> <span class="audio-time caption">people who you send emails to</span> <p></p><div class="transcript-heading"><span class="audio-time">22:15</span> <strong>Emacs survey before</strong></div><p></p><span class="audio-time caption"><strong>Philip:</strong> I'm not sure if it remains represented because</span> <span class="audio-time caption">there have been these Emacs surveys in the past.</span> <span class="audio-time caption">I remember at least two generations.</span> <span class="audio-time caption">And they're of course the ones which are</span> <span class="audio-time caption">circulated on Reddit, on Hacker News, on IRC,</span> <span class="audio-time caption">which I still think is a bubble of maybe</span> <span class="audio-time caption">200 people.</span> <span class="audio-time caption">Like mainly 200 people and some people who are</span> <span class="audio-time caption">Surrounding these groups.</span> <span class="audio-time caption">So I'm always sort of dubious because these are</span> <span class="audio-time caption">the people.</span> <p></p><div class="transcript-heading"><span class="audio-time">22:48</span> <strong>people's backgrounds influence their responses</strong></div><p></p><span class="audio-time caption"><strong>Philip:</strong> I mean, these are people who are much more likely</span> <span class="audio-time caption">to have heard of, what's it called, Evil Mode or</span> <span class="audio-time caption">something like that, or had some experience with</span> <span class="audio-time caption">other editors.</span> <span class="audio-time caption">And these things all influence their responses.</span> <span class="audio-time caption">always taints the results.</span> <span class="audio-time caption">Every time these discussions are brought up on</span> <span class="audio-time caption">Emacs devel, people have some level of doubts as</span> <span class="audio-time caption">to how reliable the results are.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Correct, correct.</span> <span class="audio-time caption">It's hard to get reliable results, though some</span> <span class="audio-time caption">data is still better than nothing.</span> <span class="audio-time caption">But granted, you don't want to base decisions on</span> <span class="audio-time caption">those results, of course not.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Yeah, that shouldn't be the last</span> <span class="audio-time caption">decision-making factor.</span> <span class="audio-time caption">You should just have a function where the input</span> <span class="audio-time caption">is whatever the data is, and then the output is</span> <span class="audio-time caption">mechanically determined by that.</span> <span class="audio-time caption">Yes?</span> <p></p><div class="transcript-heading"><span class="audio-time">23:46</span> <strong>Hypothetical: Reset themes, to reset things back to the defaults of a specific Emacs version</strong></div><p></p><span class="audio-time caption"><strong>Philip:</strong> Now, related to the preset theme, there's also been</span> <span class="audio-time caption">a discussion (I don't think this has been</span> <span class="audio-time caption">mentioned much online) of so-called reset themes.</span> <span class="audio-time caption">I'm not sure if you've heard of these. So the idea</span> <span class="audio-time caption">would be, additionally to having preset themes of</span> <span class="audio-time caption">options, which we have changed, which we would</span> <span class="audio-time caption">recommend because the newcomer</span> <span class="audio-time caption">preset theme makes no real assumption that the</span> <span class="audio-time caption">options will be stable, so we might change</span> <span class="audio-time caption">them from version to version, this gives us</span> <span class="audio-time caption">some flexibility to say we have a new option. Like,</span> <span class="audio-time caption">for example, if the preset theme had existed since</span> <span class="audio-time caption">Emacs 29, and now in Emacs...</span> <p></p><div class="transcript-heading"><span class="audio-time">24:22</span> <strong>package-autosuggest-mode suggests based on file extension</strong></div><p></p><span class="audio-time caption"><strong>Philip:</strong> That was actually the</span> <span class="audio-time caption">reason this entire discussion started when Emacs</span> <span class="audio-time caption">31, that's the current release...</span> <span class="audio-time caption">to be released, there's this</span> <span class="audio-time caption">package-autosuggest-mode</span> <span class="audio-time caption">so that's a little prompt, when it's enabled,</span> <span class="audio-time caption">a little prompt in the mode line.</span> <span class="audio-time caption">You can click on it, Emacs installs the package</span> <span class="audio-time caption">which it believes to be the right one</span> <span class="audio-time caption">for the current file.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> The major mode, right?</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> No, it's a minor mode.</span> <span class="audio-time caption">It's a global minor mode.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> No, no, I mean, but it installs based on</span> <span class="audio-time caption">the major mode, right?</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Ah, yes, yes, yes.</span> <span class="audio-time caption">It installs a major mode package, which matches</span> <span class="audio-time caption">the current file format being used based on</span> <span class="audio-time caption">auto-mode-alist or the magic,</span> <span class="audio-time caption">what's it called, magic file alist</span> <span class="audio-time caption">and all these things, and it can...</span> <span class="audio-time caption">We didn't want to enable this by default, but we</span> <span class="audio-time caption">wanted to enable it for newcomers.</span> <span class="audio-time caption">That was actually the first option in the</span> <span class="audio-time caption">newcomers preset.</span> <span class="audio-time caption">If the preset had been older, we would have still</span> <span class="audio-time caption">wanted to add this to the preset theme.</span> <span class="audio-time caption">It's not supposed to be set in stone.</span> <span class="audio-time caption">Now the idea with the reset theme is, and this is</span> <span class="audio-time caption">still hypothetical since we haven't implemented</span> <span class="audio-time caption">it, is to have reset themes for specific</span> <span class="audio-time caption">Emacs versions.</span> <span class="audio-time caption">So we, in Emacs 32, we might have an Emacs 31</span> <span class="audio-time caption">reset theme for all the options that we have</span> <span class="audio-time caption">changed in Emacs 31, in Emacs 32, so that we</span> <span class="audio-time caption">could reset them to the previous option.</span> <span class="audio-time caption">So that in this sense too, if the discussion, if</span> <span class="audio-time caption">the question is really just, we don't want to</span> <span class="audio-time caption">annoy people who have...</span> <span class="audio-time caption">When upgrading, of course, it's still a minor</span> <span class="audio-time caption">inconvenience because they have to write</span> <span class="audio-time caption">load-theme emacs31-reset in their configuration, but</span> <span class="audio-time caption">it would be easier for them to actually undo</span> <span class="audio-time caption">any changes.</span> <span class="audio-time caption">And in future versions of Emacs, hopefully also</span> <span class="audio-time caption">persist these changes so that you can really sort</span> <span class="audio-time caption">of like pinning your version of Emacs, a soft</span> <span class="audio-time caption">pinning of options.</span> <span class="audio-time caption">So this is something for the future.</span> <span class="audio-time caption">Consider as well, which would be reusing the</span> <span class="audio-time caption">theme approach, which is another reason why I</span> <span class="audio-time caption">hope that the notion of user option themes will</span> <span class="audio-time caption">become more, because it's been there from</span> <span class="audio-time caption">the beginning.</span> <span class="audio-time caption">The Customize system has always supported user</span> <span class="audio-time caption">options to be added, but people have always only</span> <span class="audio-time caption">customized, not only... I'm not sure no one has</span> <span class="audio-time caption">ever done it, but it has not been a popular</span> <span class="audio-time caption">approach to use the user options, even though the</span> <span class="audio-time caption">technical facilities have been there all the time.</span> <span class="audio-time caption">That's also going to be interesting if the reset</span> <span class="audio-time caption">theme would be forwards compatible.</span> <span class="audio-time caption">But that's another discussion that makes it even</span> <span class="audio-time caption">more complicated.</span> <span class="audio-time caption">So that you could add them hypothetically to ELPA</span> <span class="audio-time caption">as a core package.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Nice. Yeah.</span> <span class="audio-time caption">Of course, the reset themes, if you</span> <span class="audio-time caption">implement them, that's great because it opens up</span> <span class="audio-time caption">the possibility to be a little bit more ambitious</span> <span class="audio-time caption">with the defaults and break.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Yeah. Because that's exactly... Every core...</span> <span class="audio-time caption">Every default discussion boils down to: if we</span> <span class="audio-time caption">break this, people won't understand what changed.</span> <span class="audio-time caption">If we change this, people won't understand</span> <span class="audio-time caption">what broke. But on the other side, people like</span> <span class="audio-time caption">all new...</span> <span class="audio-time caption">Can we reasonably assume that all new people</span> <span class="audio-time caption">would actually want this theme?</span> <span class="audio-time caption">Then we want to give us some sort of more</span> <span class="audio-time caption">flexibility in this sense without actually the</span> <span class="audio-time caption">support, because I think that the value</span> <span class="audio-time caption">proposition of having a stable interface where</span> <span class="audio-time caption">you can expect the appearance of the theme to be</span> <span class="audio-time caption">somewhat stable over time, how Emacs behaves,</span> <span class="audio-time caption">that's actually a positive thing.</span> <p></p><div class="transcript-heading"><span class="audio-time">27:52</span> <strong>Emacs 32: bundled versions of Emacs (Big Emacs - distributions that include more packages)</strong></div><p></p><span class="audio-time caption"><strong>Philip:</strong> And finally, in Emacs 32, this is also a finally.</span> <span class="audio-time caption">For now, one thing I just thought of, which I was</span> <span class="audio-time caption">reminded of, there's a big plan for Emacs 31.</span> <span class="audio-time caption">This is one of, I've never pronounced his name,</span> <span class="audio-time caption">Sean Whitton, I think it should be pronounced.</span> <span class="audio-time caption">He said that one of his plans as a maintainer</span> <span class="audio-time caption">will be to work on the bundled version of Emacs,</span> <span class="audio-time caption">which some people, including myself, have been</span> <span class="audio-time caption">calling Fat Emacs.</span> <span class="audio-time caption">So adding, selecting certain packages from ELPA,</span> <span class="audio-time caption">from GNU ELPA, and bundle a secondary</span> <span class="audio-time caption">distribution of Emacs which would include</span> <span class="audio-time caption">additional packages,</span> <span class="audio-time caption">Which are currently, so for example, one example</span> <span class="audio-time caption">would be org-tex.</span> <span class="audio-time caption">And then you could, when you install Emacs, you</span> <span class="audio-time caption">could install, I don't know, big or fat</span> <span class="audio-time caption">or whatever...</span> <span class="audio-time caption">Big Emacs with all these packages pre-installed,</span> <span class="audio-time caption">which would be pinned to the right version which</span> <span class="audio-time caption">we would have</span> <span class="audio-time caption">hopefully ensured that they're actually compatible</span> <span class="audio-time caption">with one another.</span> <span class="audio-time caption">And then you have the normal Emacs, which would</span> <span class="audio-time caption">be the thinner one.</span> <span class="audio-time caption">And an interesting corollary of all of this would</span> <span class="audio-time caption">also be that if the way from ELPA into the core</span> <span class="audio-time caption">would be made easier, that the way out of the</span> <span class="audio-time caption">core into ELPA would also be made easier.</span> <span class="audio-time caption">Because that would mean it's more easier to</span> <span class="audio-time caption">deprecate packages over time since you can</span> <span class="audio-time caption">install it.</span> <span class="audio-time caption">This protective layer, let's say, protective</span> <span class="audio-time caption">layer, protected merely by inconvenience and the</span> <span class="audio-time caption">annoyance of moving these packages in and out,</span> <span class="audio-time caption">would fade away over time.</span> <span class="audio-time caption">Some cruft within Emacs itself, within core</span> <span class="audio-time caption">Emacs, could be moved to ELPA.</span> <span class="audio-time caption">So we could actually thin down Emacs.</span> <span class="audio-time caption">That's one possibility.</span> <span class="audio-time caption">Oh, that's big.</span> <span class="audio-time caption">Yeah.</span> <span class="audio-time caption">One strand of commentary in that direction.</span> <span class="audio-time caption">That's something that I'm planning to help in the</span> <span class="audio-time caption">Emacs 32 development cycle.</span> <span class="audio-time caption">Because these options then could also be in...</span> <span class="audio-time caption">Any options related to this could also be added</span> <span class="audio-time caption">to the newcomers preset theme.</span> <p></p><div class="transcript-heading"><span class="audio-time">29:54</span> <strong>Selection versus multiple completion</strong></div><p></p><span class="audio-time caption"><strong>Philip:</strong> So one could of course... Vertico or these</span> <span class="audio-time caption">interactive selection packages... I think I've</span> <span class="audio-time caption">commented that before there is a certain</span> <span class="audio-time caption">controversy there. I think that</span> <span class="audio-time caption">there's a certain controversy that</span> <span class="audio-time caption">selection is not always the same as text</span> <span class="audio-time caption">expansion, which is sometimes like... There are, I</span> <span class="audio-time caption">think, the certain... skeleton, or there's</span> <span class="audio-time caption">this insert... what's it called, auto-insert command...</span> <span class="audio-time caption">It's not auto-insert, something like that, that</span> <span class="audio-time caption">prompts the user for multiple things, but it's not</span> <span class="audio-time caption">written using [completing-read-multiple], but it's</span> <span class="audio-time caption">written in a way that there's a</span> <span class="audio-time caption">manual loop, which waits for an empty input to</span> <span class="audio-time caption">occur. But if you're using vertico or fido,</span> <span class="audio-time caption">by default, if you just press RET, you don't</span> <span class="audio-time caption">actually have an empty input. You just select</span> <span class="audio-time caption">the default option. There's settings like</span> <span class="audio-time caption">these which where these sort of these two kinds</span> <span class="audio-time caption">of completion diverge from one another which</span> <span class="audio-time caption">which is also something I've been talking about</span> <span class="audio-time caption">for a few years but never came around to</span> <span class="audio-time caption">implementing that there should be an API</span> <span class="audio-time caption">distinction between actually selecting user</span> <span class="audio-time caption">options from a list and the completion interface</span> <span class="audio-time caption">which we have for files or commands currently.</span> <span class="audio-time caption">These are semantically two different things, which</span> <span class="audio-time caption">would be interesting to see if it would be worth</span> <span class="audio-time caption">distinguishing the two in a technical sense,</span> <span class="audio-time caption">because that would mean that in certain settings,</span> <span class="audio-time caption">we could enable Fido. I totally admit that</span> <span class="audio-time caption">Fido and Vertico have their advantages when it</span> <span class="audio-time caption">comes to discoverability over standard</span> <span class="audio-time caption">text completion.</span> <span class="audio-time caption">The compromise now was that in Emacs 31 there's</span> <span class="audio-time caption">this option, I think it's eager completion</span> <span class="audio-time caption">updating or something.</span> <span class="audio-time caption">It's a combination, it's a permutation of these</span> <span class="audio-time caption">words in some sense.</span> <span class="audio-time caption">So that's if the completions buffer pops up.</span> <span class="audio-time caption">No, you don't have to...</span> <span class="audio-time caption">It doesn't matter.</span> <span class="audio-time caption">You don't have to visualize it.</span> <span class="audio-time caption">Yeah, where they update as you type.</span> <span class="audio-time caption">Updates as you type, yeah.</span> <span class="audio-time caption">But that doesn't occur down there, but it only</span> <span class="audio-time caption">occurs in the completions buffer.</span> <span class="audio-time caption">That's sort of a compromise.</span> <span class="audio-time caption">That's Fido, right?</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> But the generic completions has had a lot</span> <span class="audio-time caption">of improvements over the last few years.</span> <span class="audio-time caption">And in Emacs 31, it's in a very good state, all</span> <span class="audio-time caption">things considered.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Which was also partially driven by your</span> <span class="audio-time caption">MCT package?</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> MCT, yeah.</span> <span class="audio-time caption">Which was an experiment, of course.</span> <span class="audio-time caption">But yeah, it's basically that idea.</span> <span class="audio-time caption">Because I have used this in earnest, like the</span> <span class="audio-time caption">default like this, I have used it for a long time</span> <span class="audio-time caption">in earnest, like just defaults.</span> <span class="audio-time caption">It's very good.</span> <span class="audio-time caption">It's for sure very good.</span> <span class="audio-time caption">Whereas Fido and Vertico are better if you are</span> <span class="audio-time caption">just getting started and you don't know that</span> <span class="audio-time caption">there is a completion on the mini buffer and</span> <span class="audio-time caption">somehow there is a distinction between the two.</span> <span class="audio-time caption">Like, for somebody who is getting started</span> <span class="audio-time caption">especially, I think this interface is not good.</span> <span class="audio-time caption">But if you know what you are doing, I think this</span> <span class="audio-time caption">interface actually works perfectly.</span> <span class="audio-time caption">And it has a lot of options.</span> <span class="audio-time caption">So, Sacha, what you are showing there is the</span> <span class="audio-time caption">absolute default, but it has so many options that</span> <span class="audio-time caption">you can make it look actually quite different</span> <span class="audio-time caption">from this and very similar to Vertico, for</span> <span class="audio-time caption">example, in terms of the user experience.</span> <span class="audio-time caption">I just realized that...</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Oh, I just realized that if you do the</span> <span class="audio-time caption">TAB TAB, if you do the TAB TAB, it now goes to</span> <span class="audio-time caption">that one, which is great, but you can't filter it</span> <span class="audio-time caption">from there.</span> <span class="audio-time caption">You can't type into it and have stuff happen.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Yeah, it's not down there.</span> <span class="audio-time caption">If you're down there in the mini-buffer, you type.</span> <span class="audio-time caption">There you have just a regular text buffer, so you</span> <span class="audio-time caption">can search or you can select stuff out of there.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> And that's also an option, by the way.</span> <span class="audio-time caption">So what happens on the second tab, for example,</span> <span class="audio-time caption">so you can configure that.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Right, so that was the second tab</span> <span class="audio-time caption">behavior from newcomer-presets.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> That's the option I proposed and then</span> <span class="audio-time caption">objected to.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Yes, work in progress.</span> <span class="audio-time caption">So basically, you have these newcomers.</span> <span class="audio-time caption">We're trying to figure out how to get them</span> <span class="audio-time caption">through their learning journey.</span> <span class="audio-time caption">The newcomer presets can smooth over some of</span> <span class="audio-time caption">the edges.</span> <span class="audio-time caption">It can get over that</span> <span class="audio-time caption">"Yes, there are a lot of options, but at least</span> <span class="audio-time caption">M-x with tab completion will show you the</span> <span class="audio-time caption">things so that you don't have to memorize the</span> <span class="audio-time caption">names as much."</span> <span class="audio-time caption">You can recognize them from the list.</span> <span class="audio-time caption">You can narrow it down.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> The behavior is supposed to actually be</span> <span class="audio-time caption">similar to Bash,</span> <span class="audio-time caption">the way Bash does completion.</span> <p></p><div class="transcript-heading"><span class="audio-time">34:39</span> <strong>Manuals</strong></div><p></p><span class="audio-time caption"><strong>Sacha:</strong> It's probably still... we're going to need</span> <span class="audio-time caption">them to read the tutorial, and we're going to need</span> <span class="audio-time caption">them to use a lot of patience as they get used to Emacs.</span> <span class="audio-time caption">I am not quite sure yet if we can get them all</span> <span class="audio-time caption">the way to, all right, here's how you open your</span> <span class="audio-time caption">config file and define your own keyboard</span> <span class="audio-time caption">shortcuts, for example.</span> <span class="audio-time caption">Bit of a journey.</span> <p></p><div class="transcript-heading"><span class="audio-time">35:08</span> <strong>More examples?</strong></div><p></p><span class="audio-time caption"><strong>Prot:</strong> I think that one way to do that is to</span> <span class="audio-time caption">have more examples in the manual.</span> <span class="audio-time caption">Like, here is how you do this, here is how you</span> <span class="audio-time caption">do that.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Or there's this other manual, the Emacs FAQ.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> I don't mind where it would be, like FAQ</span> <span class="audio-time caption">is totally fine.</span> <span class="audio-time caption">I don't mind exactly where it would be, but</span> <span class="audio-time caption">somewhere in the documentation, like common</span> <span class="audio-time caption">patterns of Emacs configuration kind of thing.</span> <span class="audio-time caption">Maybe it already exists, so if it exists, then of</span> <span class="audio-time caption">course even better.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Emacs FAQ has some things on finding</span> <span class="audio-time caption">related packages,</span> <span class="audio-time caption">common requsts, bug reports, but maybe it was...</span> <span class="audio-time caption">I remember there's something. If I link to it...</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Where is the FAQ?</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> It's a separate manual.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> We do not have it from here, not from the splash screen,</span> <span class="audio-time caption">but it is available from the Help menu.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> I think it's not been that thoroughly maintained.</span> <p></p><div class="transcript-heading"><span class="audio-time">36:22</span> <strong>find-user-init-file?</strong></div><p></p><span class="audio-time caption"><strong>Sacha:</strong> I'm going to take advantage of the fact</span> <span class="audio-time caption">that you've actually been reading emacs-devel.</span> <span class="audio-time caption">Has there already been a long discussion about</span> <span class="audio-time caption">whether a M-x visit-user-init-file makes sense?</span> <span class="audio-time caption">An interactive command that you can use to</span> <span class="audio-time caption">open... I was trying to find it, but even with</span> <span class="audio-time caption">Yhetil's search, I was like, okay, there are</span> <span class="audio-time caption">four threads.</span> <span class="audio-time caption">One of them was a long time ago, and the other</span> <span class="audio-time caption">one was from even longer than that, so I didn't</span> <span class="audio-time caption">know whether it was some other discussion.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> I don't recall any such discussion</span> <span class="audio-time caption">recently, but I also don't think that anybody</span> <span class="audio-time caption">Objection to it.</span> <span class="audio-time caption">So it's really just a matter of someone writing</span> <span class="audio-time caption">it down and adding the documentation.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> I would like to do that.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> It would be quite likely 24 hours.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Okay.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> On the master branch and not Emacs 31</span> <span class="audio-time caption">branch, which would be slightly...</span> <span class="audio-time caption">It's fine.</span> <span class="audio-time caption">Yeah, but even having a button...</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> If it makes it in someday, it doesn't</span> <span class="audio-time caption">have to be in the splash screen.</span> <span class="audio-time caption">It just has to start off being available through...</span> <span class="audio-time caption">And then we don't have to keep telling people, oh</span> <span class="audio-time caption">yeah, do a describe-variable on the init file</span> <span class="audio-time caption">just in case your init file is actually .emacs</span> <span class="audio-time caption">instead of the .emacs.d/init.el that other</span> <span class="audio-time caption">people are telling you to use instead.</span> <span class="audio-time caption">It's a bit of a mess, right?</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> I think some people have been</span> <span class="audio-time caption">recommending doing M-: and then calling</span> <span class="audio-time caption">the [find-file] function with the user init...</span> <span class="audio-time caption">What's the name of the variable again?</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> user-init-file.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> User Emacs file.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Here we go.</span> <span class="audio-time caption">user-init-file.</span> <span class="audio-time caption">Here we go.</span> <span class="audio-time caption">That's the thing.</span> <span class="audio-time caption">Yeah, exactly.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> And if you do</span> <span class="audio-time caption">M-: (find-file user-init-file),</span> <span class="audio-time caption">then it would basically do the</span> <span class="audio-time caption">same thing.</span> <span class="audio-time caption">That's why I'm saying it's such a minor function</span> <span class="audio-time caption">that I don't expect any objections.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Okay, okay.</span> <span class="audio-time caption">So I'm going to suggest that to Emacs Devel at</span> <span class="audio-time caption">some point.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> I've had the same idea many times</span> <span class="audio-time caption">myself, but the transience of memory has thrown</span> <span class="audio-time caption">its way before I actually ended up doing it.</span> <p></p><div class="transcript-heading"><span class="audio-time">38:38</span> <strong>Getting over the reverence for Emacs's history</strong></div><p></p><span class="audio-time caption"><strong>Sacha:</strong> Sometimes I am reluctant to suggest</span> <span class="audio-time caption">things because I figure Emacs is such a</span> <span class="audio-time caption">long history.</span> <span class="audio-time caption">Probably someone has thought of this already, and</span> <span class="audio-time caption">it's probably been discussed and bike-shedded.</span> <span class="audio-time caption">But I think there are little things that we</span> <span class="audio-time caption">can do.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Yeah, but then in that case,</span> <span class="audio-time caption">Yeah, but I think that's actually related to</span> <span class="audio-time caption">another thing I wanted to talk about.</span> <span class="audio-time caption">There's a certain sort of reverence that people</span> <span class="audio-time caption">have for Emacs, because it's such a</span> <span class="audio-time caption">historical project.</span> <span class="audio-time caption">But I mean, the preset theme was something that</span> <span class="audio-time caption">was discussed for many times, and there were</span> <span class="audio-time caption">basically no objections.</span> <span class="audio-time caption">No one said, no, we shouldn't do this, this is a</span> <span class="audio-time caption">bad idea.</span> <span class="audio-time caption">I hope it's not only because I proposed it or</span> <span class="audio-time caption">something, or like the package also suggests that.</span> <span class="audio-time caption">Most of the things I've been working on for Emacs</span> <span class="audio-time caption">31, no one objected to.</span> <span class="audio-time caption">And there's two sides to this.</span> <span class="audio-time caption">There's some people who actually go overboard</span> <span class="audio-time caption">with this and try and reinvent.</span> <span class="audio-time caption">Like when reviewing packages, you see this a lot</span> <span class="audio-time caption">of people try and reinvent functionality, which</span> <span class="audio-time caption">is basically just giving a new name</span> <span class="audio-time caption">Combining two things and giving it a new name</span> <span class="audio-time caption">which isn't always necessary but might be useful</span> <span class="audio-time caption">and then it's some discussion like can we</span> <span class="audio-time caption">actually make more out of this and that's a</span> <span class="audio-time caption">different thing but then there's the people who I</span> <span class="audio-time caption">probably lean more towards that side when I think</span> <span class="audio-time caption">to myself the way I'm doing this is stupid or</span> <span class="audio-time caption">this is not as efficient people have been using</span> <span class="audio-time caption">Emacs for 40 years of course there probably has</span> <span class="audio-time caption">to be a better way to do this</span> <p></p><div class="transcript-heading"><span class="audio-time">40:11</span> <strong>Changes are more likely to happen when someone puts in the work to make a patch</strong></div><p></p><span class="audio-time caption"><strong>Philip:</strong> And sometimes it turns out it simply hasn't been</span> <span class="audio-time caption">implemented and no one has simply done this</span> <span class="audio-time caption">actually small effort of preparing a patch and</span> <span class="audio-time caption">ironing out the details just some people don't</span> <span class="audio-time caption">like discussions of course and it's</span> <span class="audio-time caption">understandable but you can I mean there's really</span> <span class="audio-time caption">no harm in sending a patch and then saying I'm</span> <span class="audio-time caption">sorry I don't have</span> <span class="audio-time caption">It's annoying, of course, from a</span> <span class="audio-time caption">maintainer's perspective.</span> <span class="audio-time caption">I don't recommend doing it, because if you</span> <span class="audio-time caption">prepare a patch but don't have the time to finish</span> <span class="audio-time caption">it up, then if it's a useful thing and you</span> <span class="audio-time caption">actually get someone to be interested in</span> <span class="audio-time caption">maintaining it, then bringing the patch to</span> <span class="audio-time caption">completion, then it's well worth just sending</span> <span class="audio-time caption">a feature.</span> <span class="audio-time caption">Even sending a feature request, you don't even</span> <span class="audio-time caption">have to...</span> <span class="audio-time caption">I mentioned the idea of this preset theme</span> <span class="audio-time caption">many times.</span> <span class="audio-time caption">I wish people would be more conscious of this</span> <span class="audio-time caption">mentality, but I totally understand people who</span> <span class="audio-time caption">think otherwise, because when the first time I</span> <span class="audio-time caption">sent a patch to a mailing list, I was, I don't</span> <span class="audio-time caption">want to say I was sweaty, but I was really</span> <span class="audio-time caption">nervous because I don't know what if they</span> <span class="audio-time caption">insult me or they say, "you fool,</span> <span class="audio-time caption">you didn't format the test properly,</span> <span class="audio-time caption">[??] secret handshake you have to do</span> <span class="audio-time caption">every time you send a patch.</span> <span class="audio-time caption">Begone." Whatever. Which is of course not the case.</span> <span class="audio-time caption">Which is not to say that there are no</span> <span class="audio-time caption">unpleasant people on mailing lists</span> <span class="audio-time caption">but I think that there is</span> <span class="audio-time caption">especially the GNU Kind Communication Guidelines,</span> <span class="audio-time caption">which are supposed to give some sort of goodwill,</span> <span class="audio-time caption">good faith, attention to how people</span> <span class="audio-time caption">should behave on mailing lists, how they should</span> <span class="audio-time caption">treat each other.</span> <span class="audio-time caption">Lots of these preconceptions turn out to be false</span> <span class="audio-time caption">in there.</span> <span class="audio-time caption">That's why I also wanted to participate in this,</span> <span class="audio-time caption">so that people see, oh, the people maintaining</span> <span class="audio-time caption">Emacs aren't wizards locked up in a tower, but</span> <span class="audio-time caption">just, I hope, normal people who happen to spend more time with Emacs.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Yeah, that's a very good point.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Which is why they're valuable, these discussions.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> And I think, Philip, just to add to this,</span> <span class="audio-time caption">your example of leading with a patch, I think, is</span> <span class="audio-time caption">also key here for someone who can write a patch,</span> <span class="audio-time caption">of course, because it cuts out a lot of that</span> <span class="audio-time caption">noise, that initial discussion of, well, maybe</span> <span class="audio-time caption">yes, maybe no, because it frames minds.</span> <span class="audio-time caption">It focuses the attention on something concrete.</span> <span class="audio-time caption">And that can also... Yeah.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Yeah.</span> <span class="audio-time caption">And...</span> <span class="audio-time caption">I mean, having a patch is useful, but getting</span> <span class="audio-time caption">someone interested is also helpful.</span> <span class="audio-time caption">Like the discussion when we merged which-key, I</span> <span class="audio-time caption">helped with that process.</span> <span class="audio-time caption">And I'm not, I think it was, I don't remember his</span> <span class="audio-time caption">last name, Jeremy, who actually did most of</span> <span class="audio-time caption">the work.</span> <span class="audio-time caption">And I was reviewing his patches.</span> <span class="audio-time caption">I was helping along, but I wasn't actually</span> <span class="audio-time caption">writing most of the code.</span> <span class="audio-time caption">I was just going over the proposals and helping</span> <span class="audio-time caption">along and basically pushing the...</span> <span class="audio-time caption">Stunning the process whenever it got stuck so</span> <span class="audio-time caption">that we actually made the necessary changes for</span> <span class="audio-time caption">it to get merged.</span> <p></p><div class="transcript-heading"><span class="audio-time">44:03</span> <strong>Preserving Git history of packages absorbed into the core</strong></div><p></p><span class="audio-time caption"><strong>Philip:</strong> And then I did the last finishing touches of</span> <span class="audio-time caption">merging, because that was also something... Every</span> <span class="audio-time caption">time... We'd like to preserve the Git history of</span> <span class="audio-time caption">packages we merge upstream, which is probably</span> <span class="audio-time caption">something we won't be doing in that way when we</span> <span class="audio-time caption">do the Fat Emacs releases.</span> <span class="audio-time caption">But the entire history of Eglot and the entire</span> <span class="audio-time caption">history of which-key is actually preserved in the</span> <span class="audio-time caption">Emacs Git repository. So if you open the file, you have, it's</span> <span class="audio-time caption">not anymore a tree in a computer science sense, but it's</span> <span class="audio-time caption">actually a proper DAG, because suddenly you have multiple</span> <span class="audio-time caption">roots of the project which come together with the history</span> <span class="audio-time caption">preserved. And that's an annoying thing to do with Git, but</span> <span class="audio-time caption">you can do it. And not everyone knows how to do it, but a few</span> <span class="audio-time caption">people have the commands written down somewhere or look it</span> <span class="audio-time caption">up on a mailing list, as I do. Then that goes through, but that's...</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> So they are wizards after all.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Wizards just reading pre-written down spells.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> It'll be interesting to see if some of</span> <span class="audio-time caption">the starter kits move to using that kind of fat</span> <span class="audio-time caption">Emacs infrastructure once that's in place.</span> <span class="audio-time caption">Because a lot of times the starter kits are there</span> <span class="audio-time caption">to package together.</span> <span class="audio-time caption">Okay, here's a list of the packages that it uses.</span> <span class="audio-time caption">Here's the configuration that makes them play</span> <span class="audio-time caption">nice together.</span> <span class="audio-time caption">And then here's some kind of</span> <span class="audio-time caption">Documentation or videos or a demonstration on how</span> <span class="audio-time caption">to use it to help people get started.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> So I'm curious to see, I mean, I went</span> <span class="audio-time caption">reviewing the options to add to the preset theme.</span> <span class="audio-time caption">I actually went through a number of these starter</span> <span class="audio-time caption">kits to see the options they suggested.</span> <span class="audio-time caption">Selected those out which seemed reasonable to me.</span> <span class="audio-time caption">And of course, this was discussed and people</span> <span class="audio-time caption">objected or added other things.</span> <span class="audio-time caption">But I am curious to see how the starter kits will</span> <span class="audio-time caption">evolve in the future, because that's also</span> <span class="audio-time caption">something we should mention.</span> <p></p><div class="transcript-heading"><span class="audio-time">46:00</span> <strong>Dealing with multiple types of Emacs</strong></div><p></p><span class="audio-time caption"><strong>Philip:</strong> I mean, there is a big problem with the fat Emacs</span> <span class="audio-time caption">approach and suddenly you have two versions</span> <span class="audio-time caption">of Emacs.</span> <span class="audio-time caption">You can write a package which appears to work</span> <span class="audio-time caption">fine in fat Emacs, but it depends on a package</span> <span class="audio-time caption">which is not in the</span> <span class="audio-time caption">core Emacs release, and then that's</span> <span class="audio-time caption">something we will have to deal with in the future</span> <span class="audio-time caption">as well.</span> <span class="audio-time caption">Yeah, that's a tricky part indeed.</span> <span class="audio-time caption">Yeah, but another thing relating... Yeah, the</span> <span class="audio-time caption">sort of fragmentation of what core Emacs is.</span> <span class="audio-time caption">It might be a showstopper, so maybe everything</span> <span class="audio-time caption">I'm telling here is just a wishlist.</span> <span class="audio-time caption">It doesn't end up actualizing.</span> <span class="audio-time caption">And that fragmentation of the setup is one of the</span> <span class="audio-time caption">things... Because it's not actually really</span> <span class="audio-time caption">difficult to solve.</span> <span class="audio-time caption">I mean, if you have a package that depends on</span> <span class="audio-time caption">something from Fat Emacs who just added to the</span> <span class="audio-time caption">package requires lines, you explicitly state</span> <span class="audio-time caption">the dependency.</span> <span class="audio-time caption">But if people are sloppy, then they might not</span> <span class="audio-time caption">notice this immediately.</span> <span class="audio-time caption">And you have runtime issues when people are slow.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> It's a little bit more than that, right?</span> <span class="audio-time caption">So for example, if you have a newbie asking a</span> <span class="audio-time caption">question, because they're using a starter kit or</span> <span class="audio-time caption">in the future, a fat Emacs thing with different</span> <span class="audio-time caption">packages installed and different configuration</span> <span class="audio-time caption">things that they have not personally set up.</span> <span class="audio-time caption">And they don't have the experience to know, oh</span> <span class="audio-time caption">yeah, this is going to be related to that.</span> <span class="audio-time caption">So I should mention it in the help message.</span> <span class="audio-time caption">I mean, large starter communities like, like Doom</span> <span class="audio-time caption">Emacs and Spacemacs will have their own Discord</span> <span class="audio-time caption">or mailing list where people can go and ask</span> <span class="audio-time caption">for help.</span> <span class="audio-time caption">And so people will say, okay, I think I kind of</span> <span class="audio-time caption">know which starting point you're coming from</span> <span class="audio-time caption">because it's the base.</span> <span class="audio-time caption">But if we're, you know, with the smaller starter</span> <span class="audio-time caption">kits, they don't even know how to ask for help.</span> <span class="audio-time caption">And everyone is like, on the regular Emacs</span> <span class="audio-time caption">communities, there's a lot of back and forth if</span> <span class="audio-time caption">you want to dig into, okay, what do you</span> <span class="audio-time caption">have enabled?</span> <span class="audio-time caption">What is affecting your setup?</span> <span class="audio-time caption">Fat Emacs is going to run into that problem.</span> <p></p><div class="transcript-heading"><span class="audio-time">48:09</span> <strong>Fat Emacs is just about bundling more packages from ELPA, not changing the configuration for them</strong></div><p></p><span class="audio-time caption"><strong>Philip:</strong> To be fair, my understanding currently</span> <span class="audio-time caption">is that it wouldn't enable any other options.</span> <span class="audio-time caption">It would just bundle more packages.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> I see.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> So it would be more of an issue for</span> <span class="audio-time caption">package authors.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Yeah, for package options.</span> <span class="audio-time caption">The idea is, I mean, I've used Emacs in offline</span> <span class="audio-time caption">settings where it's like,</span> <span class="audio-time caption">really inconvenient or impossible to install</span> <span class="audio-time caption">additional packages, and just having more</span> <span class="audio-time caption">functionality out of the box which ELPA provides</span> <span class="audio-time caption">and you don't have to install additionally, is</span> <span class="audio-time caption">basically the idea.</span> <span class="audio-time caption">Because this has been a project which has been</span> <span class="audio-time caption">ongoing for years.</span> <span class="audio-time caption">I think this is ever since the conception of</span> <span class="audio-time caption">ELPA itself,</span> <span class="audio-time caption">which is precisely the reason why GNU ELPA</span> <span class="audio-time caption">requires all packages to be signed or to be</span> <span class="audio-time caption">covered by the copyright assignments, while NonGNU</span> <span class="audio-time caption">ELPA does not:</span> <span class="audio-time caption">so that this is possible.</span> <span class="audio-time caption">It's just that finally it looks like we're</span> <span class="audio-time caption">starting to move somewhere in that direction.</span> <span class="audio-time caption">It would be interesting if a decision were to be</span> <span class="audio-time caption">made that we're going to give up on</span> <span class="audio-time caption">this sort of bundling, what decisions that were</span> <span class="audio-time caption">made for the legal status of GNU ELPA, if we</span> <span class="audio-time caption">would merge GNU ELPA and NonGNU ELPA together,</span> <span class="audio-time caption">which is unlikely currently.</span> <span class="audio-time caption">This is just pure speculation at this point, but</span> <span class="audio-time caption">it's something that might be a discussion, which</span> <span class="audio-time caption">will be had in the future.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Okay, so it dispenses with a package</span> <span class="audio-time caption">install part, and so people don't have to worry</span> <span class="audio-time caption">about, okay, how do I make sure</span> <span class="audio-time caption">The package archives are set up, and how do I</span> <span class="audio-time caption">install the packages?</span> <span class="audio-time caption">All that stuff will be pre-installed.</span> <span class="audio-time caption">The auto-mode-alist will be...</span> <span class="audio-time caption">Oh, sorry, go ahead.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> The package archives wouldn't matter</span> <span class="audio-time caption">that much, since we are just talking about the</span> <span class="audio-time caption">GNU ELPA packages, which are installed</span> <span class="audio-time caption">by default.</span> <span class="audio-time caption">It's really just that you don't have to install</span> <span class="audio-time caption">additional packages.</span> <span class="audio-time caption">You don't need a network connection.</span> <span class="audio-time caption">You don't need to know about the</span> <span class="audio-time caption">package existence.</span> <span class="audio-time caption">It would be registered in the</span> <span class="audio-time caption">auto-mode-alist anyway.</span> <span class="audio-time caption">So if you open a, I don't know, what's the</span> <span class="audio-time caption">package, some major mode that's not going to</span> <span class="audio-time caption">open, which is not in the core.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> I think you might [??] earlier.</span> <span class="audio-time caption">I think that would qualify.</span> <span class="audio-time caption">I think you mentioned auctex earlier, which is</span> <span class="audio-time caption">on ELPA, but not in Core.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> The tricky thing there is that Emacs</span> <span class="audio-time caption">already has a LaTeX mode by default, and that</span> <span class="audio-time caption">already applies, but auctex extends it.</span> <span class="audio-time caption">That's why I was looking for another example.</span> <span class="audio-time caption">Okay, that's the idea, but it wouldn't only be</span> <span class="audio-time caption">major modes, I assume.</span> <span class="audio-time caption">There's going to be some discussion as to what</span> <span class="audio-time caption">packages we want to add.</span> <span class="audio-time caption">Currently, it's not certain.</span> <span class="audio-time caption">Because we're working on finishing up Emacs 31.</span> <span class="audio-time caption">That's where most of the bug fixing efforts are</span> <span class="audio-time caption">going in right now before we progress to any</span> <span class="audio-time caption">further developments.</span> <span class="audio-time caption">But that also includes proposals.</span> <span class="audio-time caption">That includes proposals as to the preset theme,</span> <span class="audio-time caption">which I am still interested in reading.</span> <p></p><div class="transcript-heading"><span class="audio-time">51:23</span> <strong>Customize</strong></div><p></p><span class="audio-time caption"><strong>Sacha:</strong> I want to come back to something Prot</span> <span class="audio-time caption">mentioned in my conversation with him about</span> <span class="audio-time caption">newcomers, and that is the Customize interface</span> <span class="audio-time caption">versus getting people to the Emacs Lisp directly.</span> <span class="audio-time caption">And I think, Prot, you were not very keen</span> <span class="audio-time caption">on Customize.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Yeah, basically if I say it in one</span> <span class="audio-time caption">sentence is: I think the earlier they get into</span> <span class="audio-time caption">Emacs Lisp, like seeing it and interacting with</span> <span class="audio-time caption">it, the better it is for them long term.</span> <span class="audio-time caption">Granted, I am making the assumption that this is</span> <span class="audio-time caption">a user that will be there long term, right?</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Of course.</span> <span class="audio-time caption">And this is specifically about the Customize</span> <span class="audio-time caption">UI, right?</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Yeah, yeah, not the underlying</span> <span class="audio-time caption">functionality, like, yeah.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> It's great for simple options like, yes,</span> <span class="audio-time caption">we can check the checkbox, or we can select from</span> <span class="audio-time caption">the drop-down list or whatever, but browsing it is,</span> <span class="audio-time caption">as you mentioned, overwhelming in the general sense</span> <span class="audio-time caption">of Emacs being overwhelming, and when you start</span> <span class="audio-time caption">wanting to do something slightly more</span> <span class="audio-time caption">sophisticated like</span> <span class="audio-time caption">you know, let's add some more capture templates,</span> <span class="audio-time caption">then it's challenging for people to do.</span> <span class="audio-time caption">So I'm wondering whether, in general, we should</span> <span class="audio-time caption">be... Is our general strategy to be</span> <span class="audio-time caption">guiding people to, yes, Customize is there, but</span> <span class="audio-time caption">really you want to be doing Emacs Lisp as</span> <span class="audio-time caption">quickly as possible.</span> <span class="audio-time caption">Let's make it easier for you to get your</span> <span class="audio-time caption">init file.</span> <span class="audio-time caption">Let's make it easier for you to test your init</span> <span class="audio-time caption">file and not fall apart when you miss a</span> <span class="audio-time caption">parenthesis and all, things like that.</span> <span class="audio-time caption">Do we want to guide people that way?</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> One question I think we should</span> <span class="audio-time caption">distinguish is the idea of a UI the problem or is</span> <span class="audio-time caption">it really... Because I personally I have a new Emacs</span> <span class="audio-time caption">configuration at my day job, and I do everything</span> <span class="audio-time caption">using Customize.</span> <span class="audio-time caption">I don't even care about using use-package</span> <span class="audio-time caption">or whatever.</span> <span class="audio-time caption">Just customize the stuff using...</span> <span class="audio-time caption">There's a big blob of user options which I've</span> <span class="audio-time caption">modified, and that goes through, and I don't care</span> <span class="audio-time caption">about it, but I claim to have some understanding</span> <span class="audio-time caption">of what's going on, and the rest of the function</span> <span class="audio-time caption">is just some defuns which I find convenient.</span> <span class="audio-time caption">But for me, it's okay, because I have some sort of</span> <span class="audio-time caption">intuition of how the Customize UI works.</span> <span class="audio-time caption">If there were a better UI for Customize, would</span> <span class="audio-time caption">you still say that if it were written in an</span> <span class="audio-time caption">intuitive way, say using</span> <span class="audio-time caption">Fido modes.</span> <span class="audio-time caption">So that's, it would use interactive narrowing and</span> <span class="audio-time caption">it would somehow work in a build on existing</span> <span class="audio-time caption">intuitions because the current Customize, the</span> <span class="audio-time caption">Customize UI, the easy customization interface I</span> <span class="audio-time caption">think is a technical term to use is based around</span> <span class="audio-time caption">this widget library interface and sort of make</span> <span class="audio-time caption">replicating a TUI menu but not... And then you have to...</span> <span class="audio-time caption">And yeah, of course, the intuition... Like, if you</span> <span class="audio-time caption">click on things, it doesn't always behave the same</span> <span class="audio-time caption">thing you would expect from a regular settings</span> <span class="audio-time caption">menu, which is by the way also something that</span> <span class="audio-time caption">CUA specifies.</span> <p></p><div class="transcript-heading"><span class="audio-time">54:41</span> <strong>CUA - Common User Access</strong></div><p></p><span class="audio-time caption"><strong>Philip:</strong> I recently looked into what CUA lists. Like, if</span> <span class="audio-time caption">you look at the Wikipedia page, CUA specifies that</span> <span class="audio-time caption">every application has to have these settings menu</span> <span class="audio-time caption">with tabs on the bottom on the top where it lists</span> <span class="audio-time caption">all the options you can specify and interestingly</span> <span class="audio-time caption">C-c and C-v is not listed as...</span> <p></p><div class="transcript-heading"><span class="audio-time">55:00</span> <strong>ini file format? https://sdf.org/~pkal//blog/emacs/ini-init.html</strong></div><p></p><span class="audio-time caption"><strong>Philip:</strong> Apparently not CUA, but Shift Insert and</span> <span class="audio-time caption">Control Insert...</span> <span class="audio-time caption">I might be misunderstanding this, but this seems</span> <span class="audio-time caption">to be a misnomer.</span> <p></p><div class="transcript-heading"><span class="audio-time">55:10</span> <strong>Emacs configuration generator
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience/ye29-prot-and-pkal-emacs-newcomer-experience-00-55-45-367.jpg"><img loading="lazy" src="https://sachachua.com/blog/2026/05/may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience/ye29-prot-and-pkal-emacs-newcomer-experience-00-55-45-367.jpg" alt="image from video 00:55:45.367"></a><span class="audio-time caption"><strong>Philip:</strong> But if we had some sort of a UI like this CUA</span> <span class="audio-time caption">configuration UI, would that be something where</span> <span class="audio-time caption">you'd say as an intermediate stage for just</span> <span class="audio-time caption">setting options?</span> <span class="audio-time caption">Because that was part of my thought process with</span> <span class="audio-time caption">Emacs Configuration Generator.</span> <span class="audio-time caption">Just configuring Emacs is such a subset of Lisp</span> <span class="audio-time caption">as it's actually not programming Lisp.</span> <span class="audio-time caption">You can easily get by by just using add-hook, set</span> <span class="audio-time caption">up or setq, and add to list or stuff like that.</span> <span class="audio-time caption">But you don't really have to understand.</span> <span class="audio-time caption">It's just a peculiar syntax for how to</span> <span class="audio-time caption">program Lisp.</span> <p></p><div class="transcript-heading"><span class="audio-time">55:54</span> <strong>INI-style configuration</strong></div><p></p><span class="audio-time caption"><strong>Philip:</strong> I'm not sure if either of you have seen, I wrote</span> <span class="audio-time caption">a blog post</span> <span class="audio-time caption">last March, no, not March, what's the name of</span> <span class="audio-time caption">the month?</span> <span class="audio-time caption">November, October or something, where I gave a</span> <span class="audio-time caption">prototype for a INI-like configuration syntax.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> I must have read it, but I don't</span> <span class="audio-time caption">remember it.</span> <span class="audio-time caption">You must have read it.</span> <span class="audio-time caption">Yeah, yeah, yeah, because I always read my feeds,</span> <span class="audio-time caption">but now it doesn't ring a bell.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Exactly.</span> <span class="audio-time caption">You see there's this basically a simplified</span> <span class="audio-time caption">syntax, which should be... The idea was it should</span> <span class="audio-time caption">follow a conventional configuration-like format,</span> <span class="audio-time caption">and each of these lines gets translated directly</span> <span class="audio-time caption">to an Emacs Lisp expression.</span> <span class="audio-time caption">And due to this, I don't want to call it an</span> <span class="audio-time caption">isomorphism, but the easy translation in both</span> <span class="audio-time caption">directions, I think that the expectation of</span> <span class="audio-time caption">saying write Emacs Lisp...</span> <span class="audio-time caption">There has to be some defun or something if you're</span> <span class="audio-time caption">writing Emacs Lisp.</span> <span class="audio-time caption">That's to exaggerate.</span> <span class="audio-time caption">If you're just writing setq, set, add-hook,</span> <span class="audio-time caption">add-to-list, these common configuration patterns,</span> <span class="audio-time caption">which are well worth documenting in the manual, to</span> <span class="audio-time caption">understand what are the patterns that you have to</span> <span class="audio-time caption">use to configure a package, even understanding</span> <span class="audio-time caption">the signature...</span> <span class="audio-time caption">The distinction between add-to-list and add-hook</span> <span class="audio-time caption">is that hooks are lists which can have mode-local</span> <span class="audio-time caption">extensions but also inherit from global settings.</span> <span class="audio-time caption">Not obvious from the beginning to everyone.</span> <span class="audio-time caption">This is not list programming.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Yeah, fair enough.</span> <span class="audio-time caption">Though even then, they start to see the</span> <span class="audio-time caption">parentheses, get used to the syntax.</span> <span class="audio-time caption">They have to remember to quote stuff.</span> <span class="audio-time caption">Even though it's not really programming, I see</span> <span class="audio-time caption">what you're saying.</span> <span class="audio-time caption">They put themselves in the situation.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> One of the ideas precisely in the</span> <span class="audio-time caption">config syntax is that if you have an option like</span> <span class="audio-time caption">set, you see the first line, set mode line</span> <span class="audio-time caption">compact long.</span> <span class="audio-time caption">Long is a symbol.</span> <span class="audio-time caption">I just use regular read to read this, and it's</span> <span class="audio-time caption">not evaluated.</span> <span class="audio-time caption">There's an option down there somewhere, I think,</span> <span class="audio-time caption">eval set, where the format expression is an S</span> <span class="audio-time caption">expression that's evaluated to a string.</span> <span class="audio-time caption">So you have to opt into evaluation.</span> <span class="audio-time caption">which seems more intuitive to me for a regular</span> <span class="audio-time caption">configuration when you're writing it, because all</span> <span class="audio-time caption">these things... Like, I have to think about quoting.</span> <span class="audio-time caption">Then there's the issue like with</span> <span class="audio-time caption">with-eval-after-load... Can I customize this</span> <span class="audio-time caption">variable before the package is loaded, after the</span> <span class="audio-time caption">package is loaded? If it has, like... If you're adding</span> <span class="audio-time caption">something to a list and the list has a default</span> <span class="audio-time caption">value that you don't want to set the value of the</span> <span class="audio-time caption">default, don't want to add it to the list because</span> <span class="audio-time caption">then it's not loaded, and it</span> <span class="audio-time caption">could trigger a undefined variable signal.</span> <span class="audio-time caption">So these are other inconveniences that I don't, I</span> <span class="audio-time caption">personally do not see any value in teaching</span> <span class="audio-time caption">people or having people to deal with these sorts</span> <span class="audio-time caption">of issues before they have any</span> <span class="audio-time caption">broader intuition.</span> <span class="audio-time caption">Which is a very idiosyncratic take perhaps, but...</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> No, no, it's fair.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> What I'm trying to get at is this sort</span> <span class="audio-time caption">of any configuration syntax would be something</span> <span class="audio-time caption">that a UI could generate a lot easier and in a</span> <span class="audio-time caption">way that wouldn't have this artificial split</span> <span class="audio-time caption">between your own personal handcrafted</span> <span class="audio-time caption">configuration and the generated part of</span> <span class="audio-time caption">the configuration.</span> <span class="audio-time caption">Mechanically changing this, finding the section</span> <span class="audio-time caption">package avy, because it has all of these</span> <span class="audio-time caption">primitives which didn't exist early on in Emacs,</span> <span class="audio-time caption">like packages and features exist and so on.</span> <span class="audio-time caption">The sort of structure which use-package</span> <span class="audio-time caption">usually provides.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> I have about one minute before the</span> <span class="audio-time caption">kiddo starts on lunch break, so I'm going to</span> <span class="audio-time caption">interrupt a little bit and do a quick summary.</span> <span class="audio-time caption">But the two of you are welcome to keep hanging</span> <span class="audio-time caption">out and chatting.</span> <span class="audio-time caption">I'll leave the Big Blue Button room open.</span> <span class="audio-time caption">And if you want, I can set it up so people can</span> <span class="audio-time caption">join you, depending on your time, et cetera,</span> <span class="audio-time caption">et cetera.</span> <p></p><div class="transcript-heading"><span class="audio-time">1:00:21</span> <strong>Quick summary</strong></div><p></p><span class="audio-time caption"><strong>Sacha:</strong> But basically, what I'm getting for a quick</span> <span class="audio-time caption">summary of the conversation: Emacs 31: the</span> <span class="audio-time caption">newcomer presets is</span> <span class="audio-time caption">work in progress.</span> <span class="audio-time caption">People are definitely open to improvements,</span> <span class="audio-time caption">ideas, other suggestions for other features.</span> <span class="audio-time caption">The kiddo is just running out now.</span> <span class="audio-time caption">I will put the chat in the thing.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Yeah, of course, of course.</span> <span class="audio-time caption">That's fun.</span> <span class="audio-time caption">So, what's happened?</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Do you want me to open up the chat</span> <span class="audio-time caption">to everybody?</span> <span class="audio-time caption">Or do you have other things?</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Me, I can stay for another 20 minutes.</span> <span class="audio-time caption">Just to say I can stay for another 20 minutes</span> <span class="audio-time caption">because then I have to take the dog.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Yeah, and Phil?</span> <span class="audio-time caption">Oh, you have to leave.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> 20 minutes is fine.</span> <span class="audio-time caption">20 minutes is fine for me as well.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Okay, okay.</span> <span class="audio-time caption">I will put the thing in the chat and people can</span> <span class="audio-time caption">continue because the kiddo was like, ah!</span> <span class="audio-time caption">Okay, yes.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Okay, okay, okay.</span> <span class="audio-time caption">Good.</span> <span class="audio-time caption">So, yeah, of course, there is a chat going.</span> <span class="audio-time caption">Yeah, let's see.</span> <span class="audio-time caption">So, Sacha, you will link it there.</span> <span class="audio-time caption">Ah, nice.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> So, I presume there has been an</span> <span class="audio-time caption">idea of people watching this.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> So this is live.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> And I can copy the chat thus far since</span> <span class="audio-time caption">we didn't even get to any other questions.</span> <span class="audio-time caption">Hang on a second.</span> <span class="audio-time caption">Where am I even?</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> We're trying to deal with those, right?</span> <span class="audio-time caption">Yeah, yeah, yeah.</span> <span class="audio-time caption">Well, eventually to have a discussion and also</span> <span class="audio-time caption">take questions, eventually you need to have more</span> <span class="audio-time caption">time, I guess.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Yeah, yeah.</span> <span class="audio-time caption">But thank you all so much.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Yeah, yeah, yeah.</span> <span class="audio-time caption">That's good.</span> <span class="audio-time caption">Yeah, yeah.</span> <span class="audio-time caption">Thank you, Sacha.</span> <span class="audio-time caption">Thank you very much.</span> <span class="audio-time caption">And of course, the kiddo overrides all.</span> <p></p><div class="transcript-heading"><span class="audio-time">1:02:27</span> <strong>Continuing with INI</strong></div><p></p><span class="audio-time caption"><strong>Prot:</strong> That thing with the INI, I think it's</span> <span class="audio-time caption">very promising.</span> <span class="audio-time caption">I mean, if you flesh that out.</span> <span class="audio-time caption">Because the other thing is, yeah, with the</span> <span class="audio-time caption">INI configuration, because what would be, though,</span> <span class="audio-time caption">the fate of what is now added, you know, when you</span> <span class="audio-time caption">modify something and it adds this, you know, this</span> <span class="audio-time caption">has been set by Custom, do not touch it kind</span> <span class="audio-time caption">of thing.</span> <span class="audio-time caption">You know what I'm talking about, right?</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Yeah, you mean the generated user glob.</span> <span class="audio-time caption">Well, my idea, or if I were, if I had</span> <span class="audio-time caption">the time /motivation/whatever to flesh this out,</span> <span class="audio-time caption">because currently it works...</span> <span class="audio-time caption">Currently it's an actually existing Elisp file</span> <span class="audio-time caption">which you could use, but I think it would be most</span> <span class="audio-time caption">interesting if it would be upstreamed.</span> <span class="audio-time caption">It would sort of be like, if you don't have</span> <span class="audio-time caption">a .el file, Emacs would look for it</span> <span class="audio-time caption">.ini file,</span> <span class="audio-time caption">or emacs.ini file or something like that.</span> <span class="audio-time caption">Then, of course, you can check, like, does the</span> <span class="audio-time caption">INI file exist or does the .el file exist?</span> <span class="audio-time caption">Probably there would be a user option to select</span> <span class="audio-time caption">into which it would inject the new options.</span> <span class="audio-time caption">And by default, it would select, for example, if</span> <span class="audio-time caption">the INI file exists, then it would use the</span> <span class="audio-time caption">INI file.</span> <span class="audio-time caption">But there is some controversy to this, because I</span> <span class="audio-time caption">totally understand the sentiment we're coming</span> <span class="audio-time caption">from with...</span> <span class="audio-time caption">You're using Emacs, so you have to learn Lisp.</span> <span class="audio-time caption">But for me, the bar is a bit higher than just the</span> <span class="audio-time caption">inconvenience of writing out this more or less.</span> <span class="audio-time caption">It's, as Joel Sussman referred to it, this</span> <span class="audio-time caption">ritualistic Lisp.</span> <span class="audio-time caption">You always have to repeat the same stuff all over</span> <span class="audio-time caption">again, like with eval, afterload, set.</span> <span class="audio-time caption">add-to-list, then you have to quote the option in</span> <span class="audio-time caption">one case.</span> <span class="audio-time caption">And if you change something in a map, then you</span> <span class="audio-time caption">don't have to add it.</span> <span class="audio-time caption">And of course, if you know Lisp, then you know</span> <span class="audio-time caption">that in one case, a keymap is a cons cell, so</span> <span class="audio-time caption">you're actually modifying the rest of the cons cell.</span> <span class="audio-time caption">That's why you don't need to quote it.</span> <span class="audio-time caption">But in the other case, you're accessing it via</span> <span class="audio-time caption">symbols, so you need to quote it.</span> <span class="audio-time caption">But this is all technical details.</span> <span class="audio-time caption">There's no necessity in it.</span> <span class="audio-time caption">It doesn't have to be that way.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Yeah, yeah, yeah, that's fair, that's fair,</span> <span class="audio-time caption">of course.</span> <p></p><div class="transcript-heading"><span class="audio-time">1:04:42</span> <strong>Motivation</strong></div><p></p><span class="audio-time caption"><strong>Philip:</strong> One thing I wanted to bring up in the discussion</span> <span class="audio-time caption">when we were talking about reverence was there</span> <span class="audio-time caption">is, I mean, one part of the thing that gave me</span> <span class="audio-time caption">the motivation to go through with learning Emacs,</span> <span class="audio-time caption">even though I didn't use the tutorial initially,</span> <span class="audio-time caption">was sort of a reputation I heard about Emacs.</span> <span class="audio-time caption">And the videos I saw, wow, you can do these</span> <span class="audio-time caption">cool things.</span> <span class="audio-time caption">And this motivation, this image I had of Emacs</span> <span class="audio-time caption">help me go through, but if you overshoot this</span> <span class="audio-time caption">approach, then people expect too much in the</span> <span class="audio-time caption">beginning and are disappointed in the end and</span> <span class="audio-time caption">don't pull through.</span> <span class="audio-time caption">There's this question of having, how's it called,</span> <span class="audio-time caption">the ??...</span> <span class="audio-time caption">How to motivate people enough to be interested in</span> <span class="audio-time caption">Emacs, to actually learn it, but not to</span> <span class="audio-time caption">oversell it.</span> <span class="audio-time caption">If you give some sort of a demo of using Emacs,</span> <span class="audio-time caption">which is simply not representative of how it</span> <span class="audio-time caption">actually works, then that's something which</span> <span class="audio-time caption">would backfire.</span> <span class="audio-time caption">But I guess we can take a look at the</span> <span class="audio-time caption">questions, right?</span> <span class="audio-time caption">Yeah, let's see.</span> <span class="audio-time caption">Let's see.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Yeah, yeah, yeah.</span> <span class="audio-time caption">So yeah, I didn't read them.</span> <span class="audio-time caption">I had the chat open, but I didn't have</span> <span class="audio-time caption">the time to read them.</span> <span class="audio-time caption">Sorry?</span> <span class="audio-time caption">I'm not sure how to parse these.</span> <span class="audio-time caption">Is this from top to bottom?</span> <span class="audio-time caption">I guess from top to bottom is how they</span> <span class="audio-time caption">arrived in the chat.</span> <span class="audio-time caption">The top is the earliest.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> The usernames are mentioned below.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> I guess that's a copy-paste thing.</span> <span class="audio-time caption">Yeah, yeah, yeah.</span> <span class="audio-time caption">So there are some...</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> I gave the kiddo some packed lunch, so I'm back.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Oh, hello there!</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> We were just wondering about how to</span> <span class="audio-time caption">read the comments you posted.</span> <span class="audio-time caption">Maybe you have a better UI.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> I pasted them into the chat.</span> <span class="audio-time caption">So in the Big Blue Button...</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> But that's the order of occurrence?</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> That's order of occurrence.</span> <span class="audio-time caption">It's totally not very... It's just like a</span> <span class="audio-time caption">big paste.</span> <p></p><div class="transcript-heading"><span class="audio-time">1:06:50</span> <strong>Politics and philosophy</strong></div><p></p><span class="audio-time caption"><strong>Prot:</strong> While you read it, let me...</span> <span class="audio-time caption">Yeah, there is a comment there from LC2000 about</span> <span class="audio-time caption">the splash screen having a lot of emphasis on the</span> <span class="audio-time caption">legal side, which is a fair comment.</span> <span class="audio-time caption">I think the legal side is important though,</span> <span class="audio-time caption">because of course, free software and all that, but</span> <span class="audio-time caption">of course, it could be rearranged. So maybe you</span> <span class="audio-time caption">don't want to have it at the top front and center,</span> <span class="audio-time caption">you want to have it further down. Maybe. I don't</span> <span class="audio-time caption">know. I don't have a strong opinion, but I think</span> <span class="audio-time caption">the legal side is it should be there at some</span> <span class="audio-time caption">point. I feel like it's a political</span> <span class="audio-time caption">minefield though.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Just leave that alone.</span> <span class="audio-time caption">Otherwise: 200 comments on emacs-devel,</span> <span class="audio-time caption">one of those really long threads.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> I cannot under-emphasize how surprised</span> <span class="audio-time caption">I was when my suggestion to add a checkbox on the</span> <span class="audio-time caption">splash screen just went through.</span> <span class="audio-time caption">Because I expected people to object, no, we can't</span> <span class="audio-time caption">add it there because of some system.</span> <span class="audio-time caption">It wouldn't look the way it should look and that</span> <span class="audio-time caption">would be confusing or whatever.</span> <span class="audio-time caption">But apparently change is possible.</span> <span class="audio-time caption">You have to be careful and be patient.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> And I guess here there is an</span> <span class="audio-time caption">assumption, right?</span> <span class="audio-time caption">There is also an assumption that people will</span> <span class="audio-time caption">attack you or be unreasonable.</span> <span class="audio-time caption">And I think this is not true.</span> <span class="audio-time caption">You mentioned it earlier as well.</span> <span class="audio-time caption">Eventually you have to get on the mailing list</span> <span class="audio-time caption">because people, if they don't hear the opinion,</span> <span class="audio-time caption">the counterpoint, they will never know what to do</span> <span class="audio-time caption">with it.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> But it's not entirely unreasonable</span> <span class="audio-time caption">because there are discussions that can be... There</span> <span class="audio-time caption">are people on emacs-devel, it's sad to admit it, but</span> <span class="audio-time caption">there are people who voice strong opinions, like</span> <span class="audio-time caption">strong opinions, with no power behind them, which</span> <span class="audio-time caption">can scare people away because there's no... There</span> <span class="audio-time caption">are no tags. There's no index of</span> <span class="audio-time caption">people on emacs-devel, so you don't know if some</span> <span class="audio-time caption">John Doe responding to your message, if he's</span> <span class="audio-time caption">actually responsible for this and makes a</span> <span class="audio-time caption">decision, or if it's if Eli is sending a message</span> <span class="audio-time caption">and his decision on the discussion actually</span> <span class="audio-time caption">weighs a lot more than other matters.</span> <p></p><div class="transcript-heading"><span class="audio-time">1:09:23</span> <strong>Experimenting with things outside core</strong></div><p></p><span class="audio-time caption"><strong>Sacha:</strong> I feel like sometimes experimenting with</span> <span class="audio-time caption">newbie-focused resources, like the unofficial</span> <span class="audio-time caption">ones that are around... At least we can try the</span> <span class="audio-time caption">ideas out and then say, hey, here's the patch and</span> <span class="audio-time caption">also here's what people have been using</span> <span class="audio-time caption">it for, so you can see it a bit more concretely,</span> <span class="audio-time caption">than dropping an idea into the discussion and</span> <span class="audio-time caption">then having the whole bike-shedding happening</span> <span class="audio-time caption">without as much data.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> That's seriously my main recommendation.</span> <span class="audio-time caption">If you want to propose something, add a</span> <span class="audio-time caption">prototype, add a patch, add something to narrow</span> <span class="audio-time caption">down the discussion.</span> <span class="audio-time caption">That's something people would take away from this</span> <span class="audio-time caption">discussion, from my experience.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> I 100% agree.</span> <span class="audio-time caption">I think that's the way to go.</span> <span class="audio-time caption">Just implement something so that it focuses</span> <span class="audio-time caption">the attention.</span> <span class="audio-time caption">Otherwise, you will get those endless discussions</span> <span class="audio-time caption">very quickly.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Or try it as a package first, and then</span> <span class="audio-time caption">it can be core.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Excuse me?</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Oh, I was thinking if it's possible to prototype</span> <span class="audio-time caption">something as a package,</span> <span class="audio-time caption">now that Emacs has made it a lot easier for</span> <span class="audio-time caption">people to install packages, then at least it can be tested</span> <span class="audio-time caption">before having all the conversations about whether it should</span> <span class="audio-time caption">be as part of core</span> <span class="audio-time caption">or part of the splash screen or everything else.</span> <p></p><div class="transcript-heading"><span class="audio-time">1:10:42</span> <strong>Extending the core</strong></div><p></p><span class="audio-time caption"><strong>Philip:</strong> The counter tendency I feel obliged to</span> <span class="audio-time caption">mention is that many times proposing something as</span> <span class="audio-time caption">a package or as an extension to the core can</span> <span class="audio-time caption">actually simplify the implementation vastly.</span> <span class="audio-time caption">Especially if you need to make one or two twists</span> <span class="audio-time caption">upstream and you need something like an</span> <span class="audio-time caption">additional hook or something to exist upstream.</span> <span class="audio-time caption">If it's a package in the core, then it's a lot</span> <span class="audio-time caption">easier to explain why you have to make</span> <span class="audio-time caption">this change than</span> <span class="audio-time caption">having to deal with some sort of advice and</span> <span class="audio-time caption">changing a lot of things.</span> <span class="audio-time caption">There was a certain tendency during the</span> <span class="audio-time caption">mid-2010s, which I only know from history, was to</span> <span class="audio-time caption">re-implement a lot of stuff in logs, in packages,</span> <span class="audio-time caption">instead of working on them upstream.</span> <span class="audio-time caption">That created a lot of divergence</span> <span class="audio-time caption">between packages,</span> <span class="audio-time caption">and in my opinion, complicated</span> <span class="audio-time caption">things because it introduces this entire</span> <span class="audio-time caption">choice fatigue.</span> <span class="audio-time caption">Should I use Flymake?</span> <span class="audio-time caption">Should I use Flycheck?</span> <span class="audio-time caption">Should I use LSP mode?</span> <span class="audio-time caption">Should I use Eglot?</span> <span class="audio-time caption">Which is not a historically accurate example in</span> <span class="audio-time caption">the stats that I'm given,</span> <span class="audio-time caption">But I'm certainly in favor of at least considering</span> <span class="audio-time caption">upstream contributions.</span> <p></p><div class="transcript-heading"><span class="audio-time">1:11:52</span> <strong>Guide to contributing to ELPA
</strong></div><p></p><a href="https://sachachua.com/blog/2026/05/may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience/ye29-prot-and-pkal-emacs-newcomer-experience-01-12-27-567.jpg"><img loading="lazy" src="https://sachachua.com/blog/2026/05/may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience/ye29-prot-and-pkal-emacs-newcomer-experience-01-12-27-567.jpg" alt="image from video 01:12:27.567"></a><span class="audio-time caption"><strong>Philip:</strong> Even like packages, of course, it's the way we</span> <span class="audio-time caption">recently published these guidelines, or not</span> <span class="audio-time caption">guidelines, this contribution guide to publishing</span> <span class="audio-time caption">packages on ELPA, which is on, if you want to</span> <span class="audio-time caption">open it in the browser, it's on the ELPA</span> <span class="audio-time caption">homepage, which lists sort of these hard criteria</span> <span class="audio-time caption">which we require from ELPA.</span> <span class="audio-time caption">Just elpa.gnu.org, yeah, it's...</span> <span class="audio-time caption">That's going to be a link to the page.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Yeah, this is pretty recent.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> This is recent, and then there's a list</span> <span class="audio-time caption">of suggestions.</span> <span class="audio-time caption">But this is getting off the actual point.</span> <span class="audio-time caption">I'm just saying that relating to the general</span> <span class="audio-time caption">point, my experience is that proposing something</span> <span class="audio-time caption">concrete but also be open to hearing the opinions</span> <span class="audio-time caption">of other people</span> <span class="audio-time caption">These are the two necessary but maybe not always</span> <span class="audio-time caption">sufficient ingredients to making the</span> <span class="audio-time caption">changing stuff.</span> <span class="audio-time caption">Because if you just say, I want this to be</span> <span class="audio-time caption">different but don't put in the work, then</span> <span class="audio-time caption">everyone's going to forget it.</span> <span class="audio-time caption">But if you propose something and then insist that</span> <span class="audio-time caption">it has to be exactly this way, then you're just</span> <span class="audio-time caption">creating social tension.</span> <span class="audio-time caption">Maybe missing out on interesting things.</span> <p></p><div class="transcript-heading"><span class="audio-time">1:13:11</span> <strong>Making the newcomer experience better</strong></div><p></p><span class="audio-time caption"><strong>Sacha:</strong> And especially since people are using</span> <span class="audio-time caption">Emacs for so many different reasons and coming</span> <span class="audio-time caption">from so many different backgrounds, what you are</span> <span class="audio-time caption">very firmly committed to might very well work for</span> <span class="audio-time caption">one set of people, but will run into these issues</span> <span class="audio-time caption">for all these other people.</span> <span class="audio-time caption">So if we want to bring it back to this, you know,</span> <span class="audio-time caption">how do we make the newcomer experience better?</span> <span class="audio-time caption">It's great that in core, there's starting to be a</span> <span class="audio-time caption">little bit more infrastructure for supporting</span> <span class="audio-time caption">things like sets of reasonable defaults</span> <span class="audio-time caption">for people.</span> <span class="audio-time caption">And maybe we as a community need to figure out,</span> <span class="audio-time caption">all right, how do we write documentation</span> <span class="audio-time caption">around it?</span> <span class="audio-time caption">How do we make tutorial videos?</span> <span class="audio-time caption">How do we encapsulate, okay, this is what this</span> <span class="audio-time caption">typical newcomer experience is like for this set</span> <span class="audio-time caption">of people and maybe these options or packages or</span> <span class="audio-time caption">a glue code might be helpful for this group?</span> <span class="audio-time caption">Maybe.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Yeah, like in theory, you can imagine something</span> <span class="audio-time caption">like, if you are a Python developer, here is your</span> <span class="audio-time caption">Python presets theme. If you are doing</span> <span class="audio-time caption">Org or whatever, here is your LaTeX and friends,</span> <span class="audio-time caption">right, and you could also have extensions like</span> <span class="audio-time caption">that in the future.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> I mean nothing about the idea is... It</span> <span class="audio-time caption">could have been used as a package people can</span> <span class="audio-time caption">load otherwise.</span> <p></p><div class="transcript-heading"><span class="audio-time">1:14:30</span> <strong>"user option themes" versus "appearance themes"</strong></div><p></p><span class="audio-time caption"><strong>Philip:</strong> And hopefully, as I said, there is</span> <span class="audio-time caption">certainly additional work which can be put in to</span> <span class="audio-time caption">support making user option themes better supported.</span> <span class="audio-time caption">I think one of the things that will be useful is</span> <span class="audio-time caption">actually referring to them just in nomenclature</span> <span class="audio-time caption">points as user option themes to distinguish</span> <span class="audio-time caption">them from.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> From themes.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> From color themes, yeah.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Color themes, yeah.</span> <span class="audio-time caption">We even introduced the distinction that themes have</span> <span class="audio-time caption">kinds since like Emacs 20.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> 29, I think.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> 29.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> I think you did that, right?</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> I think I worked on a patch.</span> <span class="audio-time caption">But that was exactly, I mean, that was already</span> <span class="audio-time caption">where the seeds for the current theme were</span> <span class="audio-time caption">started, because we wanted to distinguish between</span> <span class="audio-time caption">these different kinds of things.</span> <span class="audio-time caption">Were there any other questions?</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> I don't think so.</span> <p></p><div class="transcript-heading"><span class="audio-time">1:15:24</span> <strong>find-library</strong></div><p></p><span class="audio-time caption"><strong>Prot:</strong> But yeah, as we saw now with the find-library</span> <span class="audio-time caption">that Sacha did in the beginning, it would be nice</span> <span class="audio-time caption">to also eventually be able to find the theme</span> <span class="audio-time caption">or whatever.</span> <span class="audio-time caption">Maybe it's a different find-theme,</span> <span class="audio-time caption">if for whatever reason it cannot be find-library.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> That's actually no reason why that</span> <span class="audio-time caption">shouldn't be the case.</span> <span class="audio-time caption">I mean, you could just extend the logic to not</span> <span class="audio-time caption">only consider the load-list, but also the...</span> <span class="audio-time caption">Whatever the variable is for the list, then it</span> <span class="audio-time caption">should be able to find that as well, even though</span> <span class="audio-time caption">it's strictly speaking, that's a library.</span> <span class="audio-time caption">But that's a decision that someone has to make at</span> <span class="audio-time caption">some point or convince someone.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> I think find-library does work for it.</span> <span class="audio-time caption">Like, find-library will find it only if</span> <span class="audio-time caption">it's loaded.</span> <span class="audio-time caption">And then since I can't, like, undo it...</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> If it's a package...</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Yeah, yeah.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> If you install it as a package, yes.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Because then the theme is in a</span> <span class="audio-time caption">directory which package.el has added to a</span> <span class="audio-time caption">load list.</span> <span class="audio-time caption">I think the preset, if my memory serves</span> <span class="audio-time caption">me correct, then find library only looks through</span> <span class="audio-time caption">load-path.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> I see, I see.</span> <span class="audio-time caption">And etc/themes is not in the load-path.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Exactly.</span> <span class="audio-time caption">Because these aren't, this is, I don't know why.</span> <span class="audio-time caption">It's not...</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Okay, all right.</span> <span class="audio-time caption">That's another message to emacs-devel.</span> <p></p><div class="transcript-heading"><span class="audio-time">1:16:49</span> <strong>configuration generator in Emacs? maybe more wizards?</strong></div><p></p><span class="audio-time caption"><strong>Philip:</strong> It's the sort of annoyance which from my</span> <span class="audio-time caption">perspective is so inconvenient that I forget it</span> <span class="audio-time caption">every time and then you don't change it.</span> <p></p><div class="transcript-heading"><span class="audio-time">1:16:59</span> <strong>Starter kits</strong></div><p></p><span class="audio-time caption"><strong>Sacha:</strong> @brongulus says the Doom Emacs module</span> <span class="audio-time caption">approach is very nice for beginners and entices</span> <span class="audio-time caption">them to get into things more.</span> <span class="audio-time caption">People interested in a certain common set of</span> <span class="audio-time caption">functionality can get an opinionated starting</span> <span class="audio-time caption">point in Emacs, rather than worrying about what</span> <span class="audio-time caption">to install.</span> <span class="audio-time caption">And someone else in the previous</span> <span class="audio-time caption">That's sort of like the theme approach, isn't it?</span> <span class="audio-time caption">Sort of, yeah.</span> <span class="audio-time caption">It's not just, hey, these are the packages and</span> <span class="audio-time caption">you can comment and uncomment lines that load the</span> <span class="audio-time caption">different modules, but also here's the glue to</span> <span class="audio-time caption">sort of start to make some of them work better</span> <span class="audio-time caption">together or to change them to reasonable defaults.</span> <p></p><div class="transcript-heading"><span class="audio-time">1:17:39</span> <strong>Configuration generator in Emacs Lisp?</strong></div><p></p><span class="audio-time caption"><strong>Sacha:</strong> I was wondering, actually, along those lines, any</span> <span class="audio-time caption">thoughts about making your configuration</span> <span class="audio-time caption">generator type thing in Emacs?</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> The reason I, in the configuration</span> <span class="audio-time caption">generator, did not implement it in Emacs was</span> <span class="audio-time caption">precisely due to if it were in Emacs and would</span> <span class="audio-time caption">use, for example, something like the widget</span> <span class="audio-time caption">library and there would be these fine UI</span> <span class="audio-time caption">discrepancies which people wouldn't expect to</span> <span class="audio-time caption">behave the way they do, then scrolling doesn't</span> <span class="audio-time caption">behave exactly the way they expect it to do.</span> <span class="audio-time caption">But there has been an idea, I think, when I</span> <span class="audio-time caption">mentioned the configuration generator the</span> <span class="audio-time caption">first time.</span> <span class="audio-time caption">It was the notion of having actually a shared</span> <span class="audio-time caption">file format behind it, just some S expression,</span> <span class="audio-time caption">which could be loaded by both the configuration</span> <span class="audio-time caption">generator and a generic configuration wizard,</span> <span class="audio-time caption">which could also be used like every package could</span> <span class="audio-time caption">define their own configuration wizard for asking</span> <span class="audio-time caption">the user selected options and configuring these.</span> <p></p><div class="transcript-heading"><span class="audio-time">1:18:40</span> <strong>extending the archive format</strong></div><p></p><span class="audio-time caption"><strong>Philip:</strong> That's also another thing in Emacs 32</span> <span class="audio-time caption">which I plan to work on, to extend the package</span> <span class="audio-time caption">archive format.</span> <span class="audio-time caption">Among other things, allowing for multiple</span> <span class="audio-time caption">packages to be listed in it, because</span> <span class="audio-time caption">GNU ELPA and NonGNU ELPA both store multiple</span> <span class="audio-time caption">versions of all packages, but you can only</span> <span class="audio-time caption">install the most recent one.</span> <span class="audio-time caption">That's why pinning doesn't work.</span> <span class="audio-time caption">Absolutely no technical reason why this shouldn't</span> <span class="audio-time caption">also list other versions as well.</span> <span class="audio-time caption">And then you could have pinning without having to</span> <span class="audio-time caption">use Git.</span> <span class="audio-time caption">Packages as well.</span> <span class="audio-time caption">And there are a few others.</span> <span class="audio-time caption">There was a thread I think earlier this year</span> <span class="audio-time caption">where I collected a number of these extensions</span> <span class="audio-time caption">for the archive formats which could be extended.</span> <span class="audio-time caption">And now I forgot my thread.</span> <span class="audio-time caption">Now I lost my thread of those.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> But basically extending package.el and</span> <span class="audio-time caption">the archive, yeah.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Specifically the archive, so that...</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Showing the previous versions which are</span> <span class="audio-time caption">already listed, like you said.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Yeah, so that you could pin the version</span> <span class="audio-time caption">so you could install the version.</span> <span class="audio-time caption">I honestly do not remember what I was saying just</span> <span class="audio-time caption">a few seconds ago, which is embarrassing.</span> <span class="audio-time caption">Okay, that's another problem.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Things happen, no worries.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> You were talking about Doom Emacs?</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> There was a comment about the Doom Emacs</span> <span class="audio-time caption">and specifically the fact that there are these</span> <span class="audio-time caption">modules and you can load the module without</span> <span class="audio-time caption">thinking specifically about the packages.</span> <span class="audio-time caption">But then Sacha told you about your package</span> <span class="audio-time caption">configurator wizard.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Package configurator wizard and then</span> <span class="audio-time caption">extending the metadata could also include this</span> <span class="audio-time caption">sort of configuration option.</span> <span class="audio-time caption">So that packages, in some sense, could specify</span> <span class="audio-time caption">what options the user would primarily be</span> <span class="audio-time caption">interested in and what order they should</span> <span class="audio-time caption">be traversed.</span> <span class="audio-time caption">And you could have some sort of dependency,</span> <span class="audio-time caption">of course.</span> <span class="audio-time caption">This is some effort which has to be put in, but</span> <span class="audio-time caption">it's not something that's unreasonable, from a</span> <span class="audio-time caption">technical perspective, from implementing this.</span> <span class="audio-time caption">And it would make, I think, it could make, if you</span> <span class="audio-time caption">have the infrastructure for that, that would make</span> <span class="audio-time caption">installing and using packages a lot nicer.</span> <span class="audio-time caption">It sounds very promising, for sure.</span> <p></p><div class="transcript-heading"><span class="audio-time">1:20:56</span> <strong>User interfaces</strong></div><p></p><span class="audio-time caption"><strong>Philip:</strong> The UI question remains the thing.</span> <span class="audio-time caption">Do you want to reuse the Customize UI, which has</span> <span class="audio-time caption">its historical warts?</span> <span class="audio-time caption">Of course, can they be ironed out?</span> <span class="audio-time caption">That's a different question.</span> <span class="audio-time caption">Or do you reinvent something from scratch?</span> <span class="audio-time caption">And I'm usually not that big of a fan of</span> <span class="audio-time caption">reinventing the UI.</span> <span class="audio-time caption">I'm more in the reuse existing interfaces, just</span> <span class="audio-time caption">into the back end.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Plus, if you were to invent a new UI, you</span> <span class="audio-time caption">wouldn't have this new feature already because</span> <span class="audio-time caption">you have too many things that you need</span> <span class="audio-time caption">to implement.</span> <span class="audio-time caption">Whereas just using custom UI allows you to just</span> <span class="audio-time caption">implement the feature and then the interface,</span> <span class="audio-time caption">maybe it's something that somebody else will work</span> <span class="audio-time caption">on or you work on at the latest.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Yeah, but then, of course, that's...</span> <span class="audio-time caption">Even if that is the case, then you have to make</span> <span class="audio-time caption">sure that you don't make assumptions that depend</span> <span class="audio-time caption">on your own customizer in the future.</span> <span class="audio-time caption">It's a whole list of dependencies which is</span> <span class="audio-time caption">just complicated.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> That sounds like a newcomers presets to</span> <span class="audio-time caption">un-wartify Customize, a reset theme to put the</span> <span class="audio-time caption">warts back on as needed, and then we can use the</span> <span class="audio-time caption">slightly more modern interface for the things</span> <span class="audio-time caption">that we had wanted to do, maybe two or three years down the line.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Maybe something like that. A little long-term planning.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> I think just to say this, but of course</span> <span class="audio-time caption">everything we have covered thus far, always we</span> <span class="audio-time caption">have to state it.</span> <span class="audio-time caption">Newcomers with an asterisk, right?</span> <span class="audio-time caption">With the caveat that you still have to put in the</span> <span class="audio-time caption">work, read the manual, be patient, all</span> <span class="audio-time caption">that, right?</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Ideally, it would be nice if you could</span> <span class="audio-time caption">even start without it.</span> <span class="audio-time caption">I mean, I started without it, but it took me</span> <span class="audio-time caption">three or four years to actually write this one.</span> <span class="audio-time caption">I didn't want to write defun.</span> <span class="audio-time caption">I thought, what?</span> <span class="audio-time caption">I don't write my own functions.</span> <span class="audio-time caption">I just want to set options, which was wrong and</span> <span class="audio-time caption">appealing to this.</span> <span class="audio-time caption">That was the point from the beginning.</span> <span class="audio-time caption">But I think, Sacha, you wanted to close there.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Oh, I just wanted to acknowledge that we</span> <span class="audio-time caption">are coming up in the 20 minutes that you said you</span> <span class="audio-time caption">were available for.</span> <span class="audio-time caption">Yeah, yeah, yeah, I need to go.</span> <span class="audio-time caption">Yeah, yeah, the dogs and everything.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Yeah, yeah, I have to take them for a</span> <span class="audio-time caption">walk because I have a meeting afterwards.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Right.</span> <span class="audio-time caption">I wanted to thank both of you.</span> <span class="audio-time caption">I really like this conversation and the heads up</span> <span class="audio-time caption">and the interesting things coming down</span> <span class="audio-time caption">the pipeline.</span> <span class="audio-time caption">So thank you for that.</span> <span class="audio-time caption">We're going to continue, I think, working on the</span> <span class="audio-time caption">user experience for newcomers.</span> <span class="audio-time caption">which will probably be a mix of documentation and</span> <span class="audio-time caption">packages and other experiments and occasional</span> <span class="audio-time caption">email to emacs-devel suggesting things like the</span> <span class="audio-time caption">find-user-init-file and whatever.</span> <span class="audio-time caption">But thank you so much to you and to everyone</span> <span class="audio-time caption">who's tuned in.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> You're welcome.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Thank you for hosting.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Thank you.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Thank you, Prot, for your comments as well.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Take care.</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> Bye-bye.</span> <p></p><span class="audio-time caption"><strong>Prot:</strong> Goodbye, goodbye.</span> <span class="audio-time caption">Where do we close from here?</span> <p></p><span class="audio-time caption"><strong>Philip:</strong> I'm just going to close the tab.</span> <span class="audio-time caption">Bye.</span></div>
<p></p>


<a name="end-ye29-transcript"></a>
</div>
</div>
<div class="outline-3">
<h3><a href="https://sachachua.com/blog/category/emacs/feed/index.xml#ye29-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience-chat">Chat</a></h3>
<div class="outline-text-3">
<div class="chat">
<ul>
<li>nick:protesilaos ​Hello folks!</li>
<li>nick:MichaelVash7886 ​hi</li>
<li>nick:protesilaos ​We still have a few more minutes. Looking forward to it!</li>
<li>nick:MichaelVash7886 ​ended up starting on doom and the nice thing is anything I want to try out is either in there or it's a simple tweak away. but it's several layers of abstractions to change certain things</li>
<li>nick:MichaelVash7886 ​for me to go from using doom to being able to program with a vanilla emacs I know it's going to be a journey to get things like completion, eglot, etc all setup</li>
<li>nick:MichaelVash7886 ​also looking at moving away from evil to using something like Meow and vanilla emacs binds</li>
<li>nick:lc2000 ​​Speaking of splash screen, there's still plenty of room, why not inline the GPL, and a small essay. Kidding of course, but what of slaying that sacred cow…?</li>
<li>nick:lc2000 ​(As it stands, it prioritizes ideology, laywer-mandated stuff from before case law, credits, funding via manual ordering… and if new users don't recoil some things they may actually need/want.)</li>
<li>nick:takoverflow ​​Hello Prot, Sacha and Philip!</li>
<li>nick:takoverflow ​Thanks for this discussion</li>
<li>nick:RandCode ​​greetings, everyone!</li>
<li>nick:RandCode ​​emacs has a place for chatting in all of irc, matrix, xmpp and telegram room! (also email)</li>
<li>nick:lc2000 ​​Packages are great at bundling functionalities, but Doom/Spacemacs/etc also fix the multi-package integration "glue", which technically could be packages (see all prior "config modules" attempts…).</li>
<li>nick:sachactube ​​<a href="https://bbb.emacsverse.org/rooms/chat">https://bbb.emacsverse.org/rooms/chat</a>…</li>
<li>nick:protesilaos ​Come join us :)</li>
<li>nick:lc2000 ​Probably best to talk of modern de facto "standards" (vs full CUA as then-defined), e.g. if there's a "region" new users expect C-c (or C-c C-c in anger) to work, and idem C-x/etc - easy wins maybe.</li>
<li>nick:brongulus I do prefer the idosyncracies of with-eval-after-load and actually explicitly binding and creating hooks, rather than relying on use-package is that it tells me explicitly the order in which things would be evaluated. In contrast to use-package where I would have to know about defer and how to properly define the order of loading of different packages.</li>
<li>nick:Protesilaos @brongulus Fair point! I also like it. The thing with use-package is that you understand it better if you know what it does under the hood.</li>
<li>nick:brongulus This is where the doom emacs' module approach is very nice for beginners and entices them <a href="https://github.com/doomemacs/doomemacs/blob/master/modules/README.org">https://github.com/doomemacs/doomemacs/blob/master/modules/README.org</a></li>
<li>nick:brongulus People interested in a certain common set of functionality can get an opinionated starting point in emacs rather than worrying about what to install</li>
<li>nick:brongulus This is how it looks <a href="https://github.com/doomemacs/doomemacs/blob/master/static/init.example.el">https://github.com/doomemacs/doomemacs/blob/master/static/init.example.el</a></li>
<li>nick:brongulus Thank you for the meeting o.</li>
</ul>

</div>
</div>
</div>
<div class="outline-3">
<h3><a href="https://sachachua.com/blog/category/emacs/feed/index.xml#may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience-some-types-of-new-users-to-think-about">Some types of new users to think about</a></h3>
<div class="outline-text-3">
<ul>
<li>Non-programmer interested in using Org Mode for notes and task management</li>
<li>Researcher interested in publishing, reproducible research, literate programming</li>
<li>Programmer interested in coding with Emacs
<ul>
<li>Coming from VSCode</li>
<li>Coming from Vi</li>
</ul></li>
<li>Programmer still using a different IDE, just interested in Magit</li>
<li>Long-time Emacs user who hasn't explored Emacs Lisp</li>
</ul>
</div>
</div>
<div class="outline-3">
<h3><a href="https://sachachua.com/blog/category/emacs/feed/index.xml#may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience-part-of-a-learning-journey">Sketching out their learning journey</a></h3>
<div class="outline-text-3">
<ul>
<li>Install Emacs</li>
<li>Use Emacs via the menu bar and toolbar</li>
<li>Get a little overwhelmed</li>
<li>Use M-x to call commands by name</li>
<li>Learn how to set up completion</li>
<li>Use some keyboard shortcuts</li>
<li>Figure out how to learn and connect</li>
<li>Customize some options</li>
<li>…</li>
<li>Eureka!</li>
<li>Define their own keyboard shortcuts
<ul>
<li>Challenge: init file</li>
</ul></li>
<li>…</li>
<li>Define their own functions
<ul>
<li>Challenge: Emacs Lisp</li>
</ul></li>
</ul>
</div>
</div>
<div class="outline-3">
<h3><a href="https://sachachua.com/blog/category/emacs/feed/index.xml#may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience-other-notes">Other notes</a></h3>
<div class="outline-text-3">
<p>
Learning how to modify Emacs with Emacs Lisp can help people really
appreciate its power. For example, you need Emacs Lisp to set your own
keyboard shortcuts. You can't set them through the Options menu or the
<code>M-x customize</code> interface. One challenge is that the Emacs Lisp
configuration file that is loaded at the start of every Emacs session
might be in one of several places, which means that in order for
newbies to understand how to add something like:
</p>


<div class="org-src-container">
<pre><code>(<span class="org-keyword">bind-key</span> <span class="org-string">"C-c r"</span> <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">org-capture</span>)
</code></pre>
</div>


<p>
we need to either include a link to something like <a href="https://www.emacswiki.org/emacs/InitFile">EmacsWiki: Init
File</a>, or repeat the instructions and the troubleshooting steps in beginner tutorials.
</p>

<ul>
<li>user-init-file defaults to <code>.emacs</code> for new users if none of <code>~/.emacs</code>, <code>~/.emacs.el</code>, <code>~/.emacs.d/init.el</code>, and <code>~/.config/emacs/init.el</code> exist.</li>

<li>After you select newcomer-presets from the splash screen, this is not persisted automatically. "Options &gt; Save Options" doesn't save it either. Because people usually think of themes as cosmetic, they're not likely to find it under "Options &gt; Customize Emacs &gt; Custom Themes; newcomers-presets; Save Theme Settings." The "Options &gt; Save Options" will save the change that newcomers-presets made to the tab bar, thus creating a <code>~/.emacs</code>.</li>
<li><a href="https://doc.emacsen.de/gallery.html">https://doc.emacsen.de/gallery.html</a> - gallery of themes built into Emacs</li>
</ul>
</div>
</div>
<div class="outline-3">
<h3><a href="https://sachachua.com/blog/category/emacs/feed/index.xml#may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience-some-screenshots-of-a-fresh-emacs">Some screenshots of a fresh Emacs</a></h3>
<div class="outline-text-3">

<figure>
<a href="https://sachachua.com/blog/2026/05/may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience/2026-05-12_08-59-17.png"><img src="https://sachachua.com/blog/2026/05/may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience/2026-05-12_08-59-17.png" alt="2026-05-12_08-59-17.png"></a>

<figcaption><span class="figure-number">Figure 1: </span>The splash screen for a new Emacs</figcaption>
</figure>


<figure>
<a href="https://sachachua.com/blog/2026/05/may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience/2026-05-12_09-01-50.png"><img src="https://sachachua.com/blog/2026/05/may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience/2026-05-12_09-01-50.png" alt="2026-05-12_09-01-50.png"></a>

<figcaption><span class="figure-number">Figure 2: </span>File menu</figcaption>
</figure>


<figure>
<a href="https://sachachua.com/blog/2026/05/may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience/2026-05-12_09-02-43.png"><img src="https://sachachua.com/blog/2026/05/may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience/2026-05-12_09-02-43.png" alt="2026-05-12_09-02-43.png"></a>

<figcaption><span class="figure-number">Figure 3: </span>Customize menu</figcaption>
</figure>


<figure>
<a href="https://sachachua.com/blog/2026/05/may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience/2026-05-12_09-03-37.png"><img src="https://sachachua.com/blog/2026/05/may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience/2026-05-12_09-03-37.png" alt="2026-05-12_09-03-37.png"></a>

<figcaption><span class="figure-number">Figure 4: </span>Help menu</figcaption>
</figure>
</div>
</div>
<div class="outline-3">
<h3><a href="https://sachachua.com/blog/category/emacs/feed/index.xml#may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience-trying-pkal-s-emacs-configuration-generator">Trying pkal's Emacs Configuration Generator</a></h3>
<div class="outline-text-3">
<p>
<a href="https://codeberg.org/pkal/ecg/src/branch/master/ecg.lisp">Emacs Configuration Generator</a> - old source code, site is no longer live
</p>


<div class="org-src-container">
<pre><code>sbcl --load ecg.lisp --eval <span class="org-string">"(ecg:start)"</span>
</code></pre>
</div>



<figure>
<a href="https://sachachua.com/blog/2026/05/may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience/2026-05-13_21-36-30.png"><img src="https://sachachua.com/blog/2026/05/may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience/2026-05-13_21-36-30.png" alt="2026-05-13_21-36-30.png"></a>

<figcaption><span class="figure-number">Figure 5: </span>Web interface</figcaption>
</figure>


<figure>
<a href="https://sachachua.com/blog/2026/05/may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience/2026-05-13_21-37-11.png"><img src="https://sachachua.com/blog/2026/05/may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience/2026-05-13_21-37-11.png" alt="2026-05-13_21-37-11.png"></a>

<figcaption><span class="figure-number">Figure 6: </span>Theme preview, other options</figcaption>
</figure>

<p>
Sample generated configuration:
</p>


<div class="org-src-container">
<pre><code><span class="org-comment-delimiter">;;; </span><span class="org-comment">Personal configuration -*- lexical-binding: t -*-</span>

<span class="org-comment-delimiter">;; </span><span class="org-comment">Save the contents of this file under ~/.emacs.d/init.el</span>
<span class="org-comment-delimiter">;; </span><span class="org-comment">Do not forget to use Emacs' built-in help system:</span>
<span class="org-comment-delimiter">;; </span><span class="org-comment">Use C-h C-h to get an overview of all help commands.  All you</span>
<span class="org-comment-delimiter">;; </span><span class="org-comment">need to know about Emacs (what commands exist, what functions do,</span>
<span class="org-comment-delimiter">;; </span><span class="org-comment">what variables specify), the help system can provide.</span>

<span class="org-comment-delimiter">;; </span><span class="org-comment">Load a custom theme</span>
(load-theme <span class="org-highlight-quoted-quote">'</span><span class="org-highlight-quoted-symbol">modus-operandi</span> t)

<span class="org-comment-delimiter">;; </span><span class="org-comment">Use whatever the default monospace font is</span>
(<span class="org-keyword">setq</span> font-use-system-font t)

<span class="org-comment-delimiter">;; </span><span class="org-comment">Miscellaneous options</span>
(<span class="org-keyword">setq-default</span> major-mode
              (<span class="org-keyword">lambda</span> () <span class="org-comment-delimiter">; </span><span class="org-comment">guess major mode from file name</span>
                (<span class="org-keyword">unless</span> buffer-file-name
                  (<span class="org-keyword">let</span> ((buffer-file-name (buffer-name)))
                    (set-auto-mode)))))
(<span class="org-keyword">setq</span> confirm-kill-emacs <span class="org-highlight-quoted-quote">#'</span><span class="org-highlight-quoted-symbol">yes-or-no-p</span>)
(<span class="org-keyword">setq</span> window-resize-pixelwise t)
(<span class="org-keyword">setq</span> frame-resize-pixelwise t)
(save-place-mode t)
(savehist-mode t)
(recentf-mode t)
(<span class="org-keyword">defalias</span> <span class="org-highlight-quoted-quote">'</span><span class="org-function-name">yes-or-no</span> <span class="org-highlight-quoted-quote">#'</span><span class="org-highlight-quoted-symbol">y-or-n-p</span>)

<span class="org-comment-delimiter">;; </span><span class="org-comment">Store automatic customisation options elsewhere</span>
(<span class="org-keyword">setq</span> custom-file (locate-user-emacs-file <span class="org-string">"custom.el"</span>))
(<span class="org-keyword">when</span> (file-exists-p custom-file)
  (load custom-file))
</code></pre>
</div>

</div>
</div>
<div><a href="https://sachachua.com/blog/2026/05/may-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience/index.org">View Org source for this post</a></div>
<p>You can <a href="https://social.sachachua.com/@sacha/statuses/01KRVXD8X86JQA5078S5HED6QM" target="_blank">comment on Mastodon</a> or <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2026%2F05%2Fmay-14-sacha-prot-and-philip-kaludercic-talk-emacs-newcomer-experience%2F&amp;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></body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Org Mode requests: [RFC] LaTeX survey]]></title>
            <link>https://list.orgmode.org/CAO48Bk-hzrwXe4jOZYnhv5B12AvdTJ39E8fdAkTQRgBGuq3J9A@mail.gmail.com</link>
            <guid>https://list.orgmode.org/CAO48Bk-hzrwXe4jOZYnhv5B12AvdTJ39E8fdAkTQRgBGuq3J9A@mail.gmail.com</guid>
            <pubDate>Sun, 17 May 2026 07:33:29 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body>[request] flags:--- replies:21</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Irreal: Emacs As An Effortless Bloom]]></title>
            <link>https://irreal.org/blog/?p=13811</link>
            <guid>https://irreal.org/blog/?p=13811</guid>
            <pubDate>Sat, 16 May 2026 14:29:54 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>
Charlie Holland has an <a href="https://www.chiply.dev/post-emacs-carnival-may#main-content">interesting contribution</a> to <a href="https://www.emacswiki.org/emacs/CarnivalMay2026">May’s Emacs Carnival</a>, which this month is on the topic “If I may recommend…” His notion is that Emacs is an effortless bloom. The “effortless” part is because Emacs—contra conventional wisdom—is easy to use and can, in fact, significantly simplify your work flow by providing a uniform interface to several different computer programming languages and their environments. If you’ve ever had to negotiate such a collection, you know that this is not a trivial thing.
</p>
<p>
The “bloom” part is more nuanced. The idea is that like a rose whose roots “fan in” water and nutrients and whose flower “fans out” its petals and beauty to encourage pollination, Emacs has its own fanning in and out. The center of this action is the text buffer. Data from various sources can be fanned into a buffer from which it can be fanned out to various functions for processing. The altered text buffer can then be fanned out to other targets.
</p>
<p>
Holland’s post is a bit lyrical so you need to read it to get the full impact of his fan in, fan out metaphor. He considers whether any other editor could achieve the same power as Emacs. He concludes that any editor could, in theory, achieve the same power but in order to do so it would have to replicate the idea of the buffer as the single important data structure on which everything else operates.
</p>
<p>
It’s an interesting post worth a few minutes of your time.</p>
</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Org Mode requests: [RFC] org-colview: Where should a new COLUMNS keyword be inserted?]]></title>
            <link>https://list.orgmode.org/87wlx3hmwl.fsf@gmail.com</link>
            <guid>https://list.orgmode.org/87wlx3hmwl.fsf@gmail.com</guid>
            <pubDate>Sat, 16 May 2026 06:46:34 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body>[request] flags:--- replies:10 topic:org-colview</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Jiacai Liu: My Thoughts on Bun's Rust Rewrite]]></title>
            <link>https://en.liujiacai.net/2026/05/16/bun-rust-port/</link>
            <guid>https://en.liujiacai.net/2026/05/16/bun-rust-port/</guid>
            <pubDate>Sat, 16 May 2026 03:59:54 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>
Before we discuss <a href="https://github.com/oven-sh/bun/pull/30412">Rewrite Bun in Rust</a>, there's something that needs to be said, because no one is saying it.</p>
<p>
Bun stands where it does today because of Zig.</p>
<p>
</p><figure>
 
 <img src="https://fs.liujiacai.net/cdn-img/zigcc/bun-rust-port.webp">
 
</figure>
<p></p>
<p>
Jarred chose Zig back then not because it was "cool," but because Zig enabled a small team to rapidly prototype a high-performance JS runtime without a GC, without a heavy runtime. Zig's low friction, direct memory manipulation, and straightforward C interop were the core reasons Bun could punch above its weight on performance with an extremely small team in its early days. The architecture, data structures, and low-level design of Bun that you see today – that was shaped by Zig.</p></body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Amin Bandali: FFS code review and Emacs extensibility with Protesilaos]]></title>
            <link>https://kelar.org/~bandali/gnu/emacs/ffs-emacs-ext-prot.html</link>
            <guid>https://kelar.org/~bandali/gnu/emacs/ffs-emacs-ext-prot.html</guid>
            <pubDate>Fri, 15 May 2026 02:55:33 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>
In the recent weeks I've been engaging <a href="https://protesilaos.com/coach/">Prot as an Emacs coach</a> to help
with doing review passes over my upcoming <a href="https://git.kelar.org/~bandali/ffs"><code>ffs</code></a> package as I work on
polishing and documenting it in preparation for offering it for
inclusion in GNU ELPA.
</p>

<p>
<b>UPDATE 2026-05-15 08:50:10 -0400:</b> Prot also published an article
about our session on his website:
<a href="https://protesilaos.com/codelog/2026-05-15-emacs-amin-bandali-ffs-display-buffer-org-capture/">https://protesilaos.com/codelog/2026-05-15-emacs-amin-bandali-ffs-display-buffer-org-capture/</a>
</p>

<p>
Today we had our third session where we started by reviewing and
talking about my recent changes to <code>ffs</code>, then ventured to other
Emacs-related topics with the overarching theme of the flexibility
and extensibility of GNU Emacs, including <code>display-buffer-alist</code>,
keyboard macros, defining a custom <a href="https://kelar.org/~bandali/gnu/emacs/dotemacs.html#lisp-bandali-oxen"><code>ox-bhtml</code></a> Org export backend
derived from Org's <code>ox-html</code> for ultimate flexibility when exporting
my site's pages from Org to HTML, Org capture, plain text files and
Emacs's <code>diary</code> and how it compares to <code>org-agenda</code>, and keeping a
journal with the help of Emacs.
</p>

<p>
Here is the video recording of our session, which I share with Prot's
permission:
</p>

<video src="https://archive.org/download/ffs-emacs-ext-prot-20260514/ffs-emacs-ext-prot-20260514.mp4" poster="https://kelar.org/~bandali/gnu/emacs/ffs-emacs-ext-prot-poster.jpg">

<p>
Sorry, this embedded video will not work,
because your web browser does not support HTML5 video.<br>
<a href="https://archive.org/download/ffs-emacs-ext-prot-20260514/ffs-emacs-ext-prot-20260514.mp4">[ please watch the video in your favourite streaming media player ]​</a>
</p>
</video>

<p>
You can <a href="https://archive.org/details/ffs-emacs-ext-prot-20260514">view</a> or <a href="https://archive.org/download/ffs-emacs-ext-prot-20260514/ffs-emacs-ext-prot-20260514.mp4">download the full-resolution video</a> from the Internet
Archive.
</p>

<p>
Lastly, here is the snippet Prot shared for having Isearch treat space
as a wildcard, helpful for more easily matching multiple parts of a
line:
</p>

<div class="org-src-container">
<pre><code>(setq search-whitespace-regexp ".*?")
(setq isearch-lax-whitespace t)
(setq isearch-regexp-lax-whitespace nil)
</code></pre>
</div>

<p>
Take care, and so long for now.
</p>
</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Protesilaos: Emacs coaching with Amin Bandali about ffs, display-buffer-alist, Org, and more]]></title>
            <link>https://protesilaos.com/codelog/2026-05-15-emacs-amin-bandali-ffs-display-buffer-org-capture/</link>
            <guid>https://protesilaos.com/codelog/2026-05-15-emacs-amin-bandali-ffs-display-buffer-org-capture/</guid>
            <pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>Yesterday I met with Amin Bandali to talk about Emacs. Amin asked me
if he could record the session, which I agreed to. The video is
available on Amin’s website: <a href="https://kelar.org/~bandali/gnu/emacs/ffs-emacs-ext-prot.html">https://kelar.org/~bandali/gnu/emacs/ffs-emacs-ext-prot.html</a>.</p>

<p>We started with a review of the latest changes to the <code class="language-plaintext highlighter-rouge">ffs</code> package
that Amin has been developing. We had looked into it before and wanted
to check on its current state.</p>

<p>Amin then asked me about the <code class="language-plaintext highlighter-rouge">display-buffer-alist</code>, which I had
mentioned before. To me, this is the single most important variable
for making Emacs feel more like your own. The reason is that it allows
you to control the placement of buffers to match your expectations. I
demonstrated some of the main ideas.</p>

<p>Another nice little feature is the built-in <code class="language-plaintext highlighter-rouge">isearch</code>. I explained how
it is especially helpful while recording keyboard macros. Though it is
nice to use in general. One tweak for it is to display a counter with
its matches. Another is to change how it treats spaces, so that it can
match any character in-between. This is not as flexible as, say,
<code class="language-plaintext highlighter-rouge">consult-line</code> (from the <code class="language-plaintext highlighter-rouge">consult</code> package) when combined with
<code class="language-plaintext highlighter-rouge">vertico</code> and <code class="language-plaintext highlighter-rouge">orderless</code>. Though it still has its uses.</p>

<p>[ I have lots of little extras for <code class="language-plaintext highlighter-rouge">isearch</code>, but those should be
  good for most users. ]</p>

<p>Amin told me about rediscovering the value of Org in the context of
statically generating his website. He showed me the custom Org HTML
export backend he has been working on. Org has so many nice features
which can be used independent of each other. In this light, we also
discussed the <code class="language-plaintext highlighter-rouge">diary</code> compared to the Org agenda.</p>

<p>Find all of Amin’s publications on his website: <a href="https://kelar.org/~bandali/">https://kelar.org/~bandali/</a>.</p>
        </body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Irreal: Emacs And The Bazaar/Git Saga]]></title>
            <link>https://irreal.org/blog/?p=13807</link>
            <guid>https://irreal.org/blog/?p=13807</guid>
            <pubDate>Thu, 14 May 2026 14:45:38 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>
Thanos Apollo has an interesting post about an almost forgotten Emacs battle: <a href="https://thanosapollo.org/posts/bzr-saga/">the choice between Bazaar and Git as the new version control system for Emacs</a>. Twenty years ago, Emacs was still using CVS, a venerable RCS that was well past its sell date.. It was clear to everyone that a new system was needed. The question was which one. The two contenders were Bazaar and Git.
</p>
<p>
On the technical merits the choice was clear. Git was faster and more reliable and most, if not all, of the developers wanted to move to it. But there were political considerations. Bazaar was a GNU project and Git was not. RMS felt strongly that the GNU project should support its own applications and insisted that Bazaar be used and given a chance to improve. It was maintained by <a href="https://en.wikipedia.org/wiki/Canonical_(company)">Canonical</a> but they eventually abandoned the effort. Even though the development was stalled and error reports were piling up unresolved for years, RMS insisted on staying the course.
</p>
<p>
The saga would probably still be going on were it not for Eric Raymond (ESR). He had been working for some time on a utility to import various RCS systems into Git while maintaining whatever metadata the old system offered. At one point he decided to convert Emacs to Git. It was a particularly difficult problem because there was more than one source RCS in play and because some of the records were old and incomplete.
</p>
<p>
Nonetheless, ESR managed the conversion and in 2014 announced that he had the conversion scripts ready and was set to go. In November 2014 he ran his scripts and suddenly Emacs was available as a Git repo. The developers started using it and the battle was over.</p>
</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Charlie Holland: May I recommend&#x2026; understanding Emacs's patterns]]></title>
            <link>https://www.chiply.dev/post-emacs-carnival-may</link>
            <guid>https://www.chiply.dev/post-emacs-carnival-may</guid>
            <pubDate>Thu, 14 May 2026 04:58:00 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><div class="outline-2">
<h2><span class="section-number-2">1.</span> About</h2>
<div class="outline-text-2">

<div class="figure">
<p><img src="https://www.chiply.dev/images/emacs-carnival-may-banner.jpeg" alt="emacs-carnival-may-banner.jpeg">
</p>
<p><span class="figure-number">Figure 1: </span>JPEG produced with <a href="https://platform.openai.com/docs/models/gpt-image-1">OpenAI gpt-image-1</a></p>
</div>

<p>
What's in a name? That which we call Emacs<br>
By any other name, works just as well;<br>
Our editor could, were it not an Emacs call'd,<br>
Retain those perfect patterns which it owes<br>
Without that title.  Emacsen, doff thy names,<br>
And for those names, which are no part of thee,<br>
Take all my code.<br>
</p>

<p>
The above, unless I've completely forgotten my Shakespeare, was a soliloquy from Juliet <b>Cons</b>ulet regarding Romeo Monta<b>gnu</b>
</p>

<p>
"Emacs is an Effortless Bloom," or at least, this is what my brain has been screaming into its own void for the past few months…. (by the way, there is <a href="https://www.chiply.dev/#a-better-simile">a better simile</a>).
</p>

<p>
I have recently been publishing posts to my blog as part of a composite series on the usage patterns that make Emacs powerful to its most fluent users.  I don't know if "Emacs is an Effortless Bloom" will be the name of the series when all is said and done….  
</p>

<p>
Maybe it's more of a mantra, or perhaps even a haunting brain spasm at the moment.  At least, this phrase has been popping involuntarily into my mind since I started this series, and I think it's worth thinking about why.  
</p>

<p>
In this post, I'll discuss, among others, two core patterns that make Emacs easy and powerful, <b>Incremental Completing Read</b> and <b>recognize-dispatch</b>.
</p>

<p>
If you find the prose herein flowery, it's because it pertains to flowers 😉.
</p>
</div>
</div>
<div class="outline-2">
<h2><span class="section-number-2">2.</span> "Effortless"</h2>
<div class="outline-text-2">
<p>
My goal of the series is to promote Emacs usage by conveying how and why it makes computer use easier.  I feel Emacs gets a bad rap in the broader society of builders because there is a common notion that it's arcane and complicated and, therefore, difficult to use.  I do believe this notion is a false one, and much of my writing and talking about Emacs revolves around precisely why Emacs makes using a computer <i>easy</i>.
</p>

<p>
When I tell folks "I use Emacs", I typically get some kind of "Wow, good for you" or "that's impressive!" or "I wish I could use Emacs, but I never had the time to grok it".  Despite the flattery, I always feel dejected by these comments, especially as a lonely advocate for its use and a firm believer that using Emacs is easy.
</p>

<p>
It is largely this misconception that motivated me to write my series, and hopefully in doing so I can dispel the notion that Emacs is some nuclear wand only to be brandished by the lisp era's most considerate wizards.
</p>
</div>
</div>
<div class="outline-2">
<h2><span class="section-number-2">3.</span> "Bloom"</h2>
<div class="outline-text-2">
<p>
This one is not self-explanatory, and the word came to me before its justification… it just felt 'right'.  As I continue to think critically about Emacs's patterns and why they make computer use effortless, I can attribute a few significances to this word.
</p>
</div>
<div class="outline-3">
<h3><span class="section-number-3">3.1.</span> Bloom as in Blossom</h3>
<div class="outline-text-3">
<p>
First, when I started using Emacs, it really did make me feel like I had come into my own as a builder.  
</p>

<p>
I had a somewhat unconventional entry point to Emacs.  I had just learned Visual Basic for Applications (VBA) in order to automate clinical research workflows at a research institution.  This was my first job, and my first foray into the world of automating via programming.  Learning VBA was an almost indescribable stepwise increase in my power as a computer user and builder of clinical research workflows.  But that ability lost its leverage quickly….
</p>

<p>
As the data practice in our research firm outgrew the memory and performance constraints of Excel + VBA, I found that I needed to learn 3 new languages to support our operations: SQL for data extraction from our data warehouse, Python for automated workflows, and the researcher-friendly R for analysis and predictive modelling.  
</p>

<p>
With this polyglot burden came another one: I needed to learn <b>3 new GUIs</b> to be able to write and execute the programs I'd written in these 3 languages.  Not only was this daunting, it was also uncomfortable.  My glorious unified experience of doing everything in VBA now had the friction of context switching between different GUIs, all with different usage paradigms, patterns, and keybindings.
</p>

<p>
I recognized what underpinned my dread in this brief but tumultuous phase: the incidental complexity of adding languages to my toolbelt scaled somewhat worse than linearly with the number of languages.  For every 1 new programming language I wanted to speak, I would have to learn at least 1 new interface modality to support that.  I knew I was good at learning languages (and bad at learning GUIs), so how could I escape this friction?
</p>

<p>
As if from some theophany, Emacs came to me in an article I was reading about how Unix works.  It was mentioned off-hand, in a single sentence, but with a compelling label as the 'most powerful, programmable editor'.  
</p>

<p>
Huh… I thought "if I (and indeed anyone else) can program the <i>editor</i>, maybe I can work with all these languages and runtimes in a single environment".  After watching dozens of Emacs demos on YouTube, I became convicted that this was indeed the case.  Shoutouts are well deserved here for Magnar Sveen's <a href="https://www.youtube.com/playlist?list=PLVfFIUHWy-aNaF08m34sO81dsVr4L7uI-">Emacs Rocks</a>, Mike Zamansky's <a href="https://www.youtube.com/playlist?list=PL9KxKa8NpFxIcNQa9js7dQQIHc81b0-Xg">Using Emacs</a>, and Aaron Bieber's (no relation) <a href="https://www.youtube.com/watch?v=JWD1Fpdd4Pc">very brave pitch on Emacs that he delivered at a vim conference</a>.
</p>

<p>
Before I had seen the light of Emacs, I felt uncomfortably bounded and acutely constrained by the possibly infinite number of new tools I would need to grok in order to become a polyglot.  This infinite expanse of tooling came with an ironic feeling of claustrophobia.  But with Emacs, those bounds seemed to disappear, and I felt like my mind was able to 'blossom' in the fertile soil of Emacs's rich and endlessly configurable environment.
</p>
</div>
</div>
<div class="outline-3">
<h3><span class="section-number-3">3.2.</span> Bloom as in the Roots Fan-In, the Petals Fan-Out</h3>
<div class="outline-text-3">
<p>
Picture a rose, a purple one if you could (as we are talking about Emacs here).
</p>

<p>
On one end, the rose has roots, pulling in nutrients and dihydrogen oxide through a complex and ever growing tendrillic network.  At the other, we see the rose's beautiful flowering of petals: the outcome of all this rose's growth, the attractor of admiring eyes, and the basis for proliferation through pollination.  Emacs's patterns, architecturally, remind me of this kind of flowering because we can see that Emacs fans-in and fans-out in the same beautiful and life-giving ways as our purple rose's roots and petals do.
</p>

<p>
Consider the buffer.  Anything you look at in Emacs (no need to enumerate, I literally mean <i>everything</i>) is a buffer of characters with text properties layered on top.  I'm simplifying a little bit, but that's pretty much it.  That standardization is the core data model from which everything else grows.  
</p>

<p>
The roots of the rose look the same whether they're pulling minerals from clay, soil, or sand (it's all just water and ions in the end).  In Emacs, <i>any</i> <b>thing</b> is pulled into just characters and properties in a buffer (fan-in).  The corollary is that every editing primitive you learn — search, kill, mark, narrow, replace, undo, blah blah blah — works against <i>every</i> piece of content you'll ever look at in Emacs, because nothing is special with respect to this data model, and no exceptions will be found.  The characters + text props is the unifying idea, and the buffer in which they reside offers a universal vocabulary with which you can speak into Emacs whatever your heart desires, Juliet 😉.
</p>

<p>
On top of that vocabulary sits Elisp, and on top of Elisp sit the applications.  Whatever you can likely imagine (Email, RSS, calendar, version control, file management, IRC, music, financial ledger, terminal, etc…) is a small Elisp program that puts text into a buffer (often with a specialized major-mode) and binds keys to commands that transform and navigate that text.  
</p>

<p>
There is no fundamental linguistic difference between something as complex as <a href="https://magit.vc/">Magit</a> and something as simple as a mode I may write to depict an ASCII rose in a popup buffer.  The elisp entities powering those modes live in the same namespace, share the same APIs, and adhere to the same Emacsien and Elispien conventions.  This is the deeper meaning of 'interface unification': you don't merely view different things through one interface (which is valuable by itself).  Instead, you build, extend, and rewire them <i>through one interface</i>.  And if a use case doesn't have an application yet, building one is easy, because you have the full power of Elisp.
</p>

<p>
The next pattern lives at the input layer, and is evocative of many an 'at-your-fingertips' metaphor.  When Emacs asks you to choose something (files, buffers, commands, or indeed a candidate from any context) it doesn't ask you to remember what you're looking for verbatim.  <b>Incremental Completing Read</b> (ICR) drastically reduces the burden of recall when searching for anything when you're inside of Emacs, and the flexible filtering offered, for example, by packages like <a href="https://github.com/oantolin/orderless">Orderless</a>, make the resulting candidate set small and specific enough that recognition is often trivial. 
</p>

<p>
ICR in Emacs can take whatever set of candidates is in play and filters it live as you type, ranking by recency and <a href="https://en.wikipedia.org/wiki/Frecency">frecency</a>, fuzzy-matching, re-sorting by relevance, etc….  When you hit M-x (to run a command), you don't have to know the exact command name; you simply have to know, or perhaps more accurately 'intuit', enough of its shape to narrow the field.  And because every domain in Emacs eventually exposes its candidates through the same minibuffer mechanism, the entire universe of things-you-might-want pulls through a single, deeply familiar selector (fan-in).  At runtime, you can materialize and search this universe (fan-out) with only your tiny, fuzzy notion of what you're looking for.  This recall facility is something that makes using Emacs powerful, but also cognitively ergonomic.  Like with buffers + text + props, you'll find after a while that most of your Emacs usage funnels through this unified interface of minibuffer completion.
</p>

<p>
ICR is only part of this story.  After you've selected your candidate, what can you do with it?  Emacs cheekily answers "what can't you do with it!", and more helpfully adds "let me show you <i>exactly</i> what you can do with it".  This comes from an implementation of what I think of as the <b>recognize-dispatch</b> pattern.  
</p>

<p>
In most software, the answer ("what can I do with this thing on the screen") is hardcoded to a single default action: the open-file dialog opens files, the contact picker picks contacts, and so on.  Packages like <a href="https://github.com/oantolin/embark">Embark</a> and <a href="https://www.gnu.org/software/hyperbole/">Hyperbole</a> change the cardinality here for the better.  
</p>

<p>
Any "thing" (which is a funnily loaded word in Emacs land) on which you can place your cursor (file path, a URL, a symbol, a region, etc…) has a type, and that type has a menu of actions associated with it.  Because both the types and actions are extensible, Embark offers the ability to assign a specific type (or set of specific types) to <i>anything</i> that appears in Emacs (fan-in) and enables you to take <i>any</i> action on that thing (fan-out).  
</p>

<p>
In this way, for example, a symbol is a thing you can describe, jump to, occur, rename, search the web for, hand to an LLM, ad infinitum….  A file is a thing you can open, diff, copy a path to, rename, attach to an email, ad infinitum….  The "infinitum" part is quite literal, especially when you consider that you can use any parameterized command as an Embark action (you aren't limited to what's in the defined menus).  In this way, the actions accrue as you continue to extend Emacs.  When you install a new package (fan-in), suddenly all your existing nouns, or types, gain new verbs, or actions (fan-out).
</p>

<p>
Also consider how, with Emacs, you can achieve the same kind of piping paradigm you would with a Unix shell.  In a spiritual recovery of the 90's era <a href="https://en.wikipedia.org/wiki/Common_Lisp_Interface_Manager">CLIM (Common Lisp Interface Manager)</a> implementation of presentation-types, output of some command in Emacs can be input to another via this recognize-dispatch system.  The snake eats its tail, somehow in a non self-cannibalistic manner, just like in the all-powerful Unix shell.
</p>

<p>
An especially enabling set of actions that you can add in this way is provided by language servers in Emacs.  For decades, "go to definition," "find references," and "rename symbol" were the exclusive privileges of IDEs that had been hand-coded (and price-tagged) for a specific language.  The <a href="https://microsoft.github.io/language-server-protocol/">Language Server Protocol</a> (LSP) externalizes that introspection into a per-language server that speaks a common format.  Emacs (via <a href="https://github.com/joaotavora/eglot">eglot</a> or <a href="https://emacs-lsp.github.io/lsp-mode/">lsp-mode</a>) talks to the server, the server reports types and locations, and Emacs renders the result into a buffer.  The upshot is that Emacs's existing typed-thing machinery inherits the introspective powers of a language server, in every language that has one (fan-in).  The cost of literacy in a new language collapses (yay for me!), because the editor doesn't have to learn anything new; only the server (or the implementer of the server) does.  In this way, you can effortlessly navigate, code, and execute in any language (fan-out) using the same usage pattern.
</p>

<p>
There is so much power in this pattern: recognize the noun, dispatch a verb.  Pour all instances into a single channel (fan-in); radiate out from that channel with the full force of every extension you've ever installed (fan-out).
</p>

<p>
This fan-in, fan-out occurs at the application level as well.  Take <a href="https://github.com/skeeto/elfeed">elfeed</a>, for example, the leading RSS reader in Emacs.  All the vagaries of any news source you subscribe to funnels its new items into a flat list (fan-in) in an elfeed-search buffer, and all the Emacs facilities that work in any other mode are available to you as you navigate and consume these news sources (fan-out).  As another example, take <a href="https://www.djcbsoftware.nl/code/mu/mu4e.html">mu4e</a>, a popular email package for Emacs.  Emails from all your email addresses, again, are funneled into a single flat list (fan-in), and you have all the power of Emacs at your disposal to navigate mail, read, and respond (fan-out). 
</p>

<p>
The rose has the structure it has because it works, and many years of evolution have brought its beautiful form and function to bear.  
</p>

<p>
The bloom:
</p>

<p>
Pull broadly, push narrowly; pull narrowly, push broadly.  
</p>

<p>
With <b>recognize-dispatch</b>, pull broadly everything into text buffers, push narrowly into an actionable type system; pull narrowly from that sparse set of typed things, push broadly into any conceivable action.  
</p>

<p>
Any search or selection you need to do inbetween is made effortless by ICR, where, by the way, types and actions are still available (thanks to Embark).  Pull broadly any candidate source into Emacs and push narrowly into the minibuffer's ICR system; pull narrowly from a filtered candidate set and push broadly into any conceivable action on your selection.
</p>

<p>
You can even see the two patterns work gracefully in concert:  consider dispatching a huge action menu for a generic target.  You don't want to manually scan through the which-key buffer to select that action, so you can use embark-help to run ICR and select your action that way.  Beautiful!
</p>

<p>
Emacs's patterns aren't incidental.  They're something closer to the right answer to a question every aspirationally generic tool eventually asks, which is "how do you make one interface stand in for many, without losing the specificity of any"?
</p>
</div>
</div>
</div>
<div class="outline-2">
<h2><span class="section-number-2">4.</span> A better simile</h2>
<div class="outline-text-2">
<p>
My simile for Emacs is the blooming of a rose….  Oh, Romeo, why did you do such a thing!
</p>

<p>
I have to come clean and admit that this simile (maybe more honestly a metaphor) is highly contrived (this is a sideshow in a carnival after all 😜), and I did feel the cognitive dissonance when trying to shoehorn this rose metaphor into the fan-in/fan-out meta pattern of Emacs.  
</p>

<p>
There is another, better, way to think about this pattern. 
</p>

<p>
<a href="https://www.reddit.com/user/gwern/">Gwern Branwen</a>, of <a href="https://gwern.net">gwern.net</a>, provided a much better simile on <a href="https://www.reddit.com/r/emacs/comments/1tc6c9h/may_i_recommend_understanding_emacss_patterns/">this post's r/emacs thread</a>: "You could also consider your 'bloom' to be a 'bow-tie network', which is good for end-to-endianness: bow-tie network <a href="https://gwern.net/ref/csete-doyle-2004">https://gwern.net/ref/csete-doyle-2004</a> <a href="https://gwern.net/doc/biology/2004-csete.pdf">https://gwern.net/doc/biology/2004-csete.pdf</a>"
</p>

<p>
Gwern's comment paints a much more faithful and insightful simile for the Emacs meta pattern, and it actually sharpens my own understanding of this pattern.  And to my surprise 🤯, Gwern's excerpts from Marie Csete and John Doyle's "Bow ties, metabolism and disease" paper actually mention the fan-in, fan-out phenomenon explicitly, albeit without the ugly hyphens I used in this post:
</p>

<p>
"As shown in Figure 1, a myriad of nutrient sources are catabolized, or ‘fan in’, to produce a handful of activated carriers (eg. ATP, NADH and NADPH) and 12 precursor metabolites (eg. glucose 6-phosphate, fructose 6-phosphate, phosphoenolpyruvate and pyruvate), which are then synthesized into ~70 larger building blocks (eg. amino acids, nucleotides, fatty acids and sugars). The precursors and carriers can be thought of as two ‘knots’ of separate bow ties that are both fed by catabolism, but whereas the former ‘fan out’ locally to the biosynthesis of universal building blocks, the latter fan out to the whole cell to provide energy, reducing power and small moieties."
</p>

<p>
The bow-tie's appeal, aside of course from sparing me the apology for being silly and contrived 😉, is that it names the <i>function</i> of the narrow part, while the rose thing tenuously names its <i>shape</i>.  A rose has a stem, sure, and the stem does technically connect the roots to the bloom….  But the stem is mostly a passive conduit.  The bow-tie's <i>knot</i> is where the action happens.  In metabolism, the knot is the small set of activated carriers and precursor metabolites, and then every nutrient that gets catabolized has to pass through that knot to become anything else.  The knot is the universal intermediate currency.  And like Csete and Doyle point out, there's more than one of them!
</p>

<p>
In Emacs, one knot (not <span class="underline"><span class="underline">the knot</span></span>, I'll explain in a moment…) is the buffer: characters with text properties.  Every input (again I will spare the enumeration as I do literally mean <i>everything</i>) passes through that narrow representation in order to be looked at, edited, searched, or acted on.  And every Emacs facility (again sparing the enumeration) operates against <i>that</i> narrow representation.
</p>

<p>
Csete and Doyle even anticipate the multi-knot layering I was missing with the contrived rose thing in my sideshow.
</p>

<p>
They describe the "precursors and carriers" as "two knots of separate bow ties", each having its own fan-in and fan-out.  
</p>

<p>
Emacs has the same multi-knot structure.  The buffer-plus-text-properties is one (of many) knots in Emacs, and as previously mentioned, is the foundational one.  ICR, separately, is its own bow-tie, with its own narrow waist, and Embark/Hyperbole (inspired-by or harmonizing-with CLIM's presentation-types idea) is yet another.  And there are more and more (see my blabbering on RSS feeds and emails above).
</p>

<p>
What's especially better about Gwern's simile is that the bow-tie shape itself isn't unique to metabolism or to Emacs.  Among other things, I'm sure it's why the Unix shell is the way it is, with plain text streams (pipes for the win!) as its universal intermediate.
</p>

<p>
As a final note, I think it's absolute fascinating and thought provoking that the best simile I can identify for Emacs's meta pattern comes from the study of biochemical systems.  I have nothing profound to say about that, I just think it's ruddy interesting.
</p>
</div>
</div>
<div class="outline-2">
<h2><span class="section-number-2">5.</span> Emacs by any other name</h2>
<div class="outline-text-2">
<p>
Emacs is not magic, and exactly zero of the patterns I've described are intellectually proprietary to it. 
</p>

<p>
A few patterns have already begun to leak out. The Language Server Protocol, in fact, wasn't invented for Emacs.  It was invented at Microsoft for <a href="https://code.visualstudio.com/">Visual Studio Code</a>, and the rest of the editor world (Emacs included, via eglot) caught up.  ICR-style recognition-over-recall pickers have shown up as command palettes in VS Code and <a href="https://www.sublimetext.com/">Sublime Text</a>.  And plugin systems of course exist in nearly every modern editor.  So the question is fair: What's in a rose?.  Could another editor <i>be</i> Emacs, given enough effort?  In principle, yes.
</p>

<p>
But in practice, the difficulty isn't any one pattern, but instead in the composition of those patterns.  The gander is much greater than the sum of its geese, and in Emacs, the patterns synergize with each other, while somehow staying out of each other's way.  
</p>

<p>
The patterns all 'play nice in the sandbox' if you will, but they can play more fortuitously as a team.  Embark's typed-thing dispatch is only as good as the ubiquity of buffers and text properties beneath it. If half your "things" live in special-purpose UI widgets that aren't presented as text-in-buffers, then Embark woefully can't see them.  ICR is only as good as the standardization of candidates. Even LSP — the most ubiquitous pattern leveraged outside of Emacs — only delivers its full potential when the editor already has a uniform "thing under point" model to which the server's responses can attach, and from which Emacs's fan-out action system can be dispatched.  
</p>

<p>
There's also a sociological aspect to this.  The patterns crystallized out of the Emacs community precisely because the community is philosophically aligned with discovering them.  Everything is Lisp; every interaction is inspectable, hookable, redefinable.  New patterns surface, get implemented as packages, and interestingly, many of these new patterns get factored upstream into the Emacs source.  While any other editor could, in theory, be another Emacs, those editors that want to import the patterns wholesale would have to import the conditions that produced them and promote the culture that supported them.
</p>

<p>
But none of that is to say it's impossible.  If a future editor actually delivered the full stack of patterns (text buffers as universal substrate, a Lisp-equivalent extension language with shared namespace, ICR, Embark/Hyperbole-style typed dispatch, LSP-style introspection, the fan-in/fan-out logic of one channel for everything), then it would definitively be powerful in the same way Emacs is powerful.  Whether we called it Emacs or not would be arbitrary nomenclature.
</p>

<p>
Which brings me, predictably, to Juliet:
</p>

<p>
What's in a name? That which we call Emacs<br>
By any other name, works just the same;<br>
Our editor could, were it not an Emacs call'd,<br>
Retain those perfect patterns which it owes<br>
Without that title.  Emacsen, doff thy names,<br>
And for those names, which are no part of thee,<br>
Take all my code.<br>
</p>
</div>
</div></body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Dave Pearson: Stopping an accidental push]]></title>
            <link>https://blog.davep.org/2026/05/13/stopping-an-accidental-push.html</link>
            <guid>https://blog.davep.org/2026/05/13/stopping-an-accidental-push.html</guid>
            <pubDate>Wed, 13 May 2026 18:04:49 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>After starting to make use of <a href="https://blog.davep.org/2026/05/10/more-syncing-github-to-gitlab-and-codeberg.html">the GitLab/Codeberg sync
approach</a> for
various repositories, I found that my muscle memory in
<a href="https://magit.vc/" target="_blank">Magit</a> was getting the better of me and, on occasion,
I'd push a new branch to <code>backups</code> when I wanted <code>origin</code>. I sensed there
had to be a way round that.</p>
<p>Here's what I settled on:</p>
<div class="highlight"><pre><span></span><code><span class="p">(</span><span class="nv">advice-add</span>
<span class="w"> </span><span class="ss">'magit-list-remotes</span>
<span class="w"> </span><span class="nb">:filter-return</span><span class="w"> </span><span class="p">(</span><span class="nb">lambda</span><span class="w"> </span><span class="p">(</span><span class="nv">remotes</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="nf">delete</span><span class="w"> </span><span class="s">"backups"</span><span class="w"> </span><span class="nv">remotes</span><span class="p">)))</span>
</code></pre></div>

<p>Now I never see <code>backups</code> in Magit and now I can keep using my muscle memory
(rather than actually reading what is in front of me, it seems).</p></body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Irreal: Cl-flet, Cl-letf, And Cl-labels Explained]]></title>
            <link>https://irreal.org/blog/?p=13805</link>
            <guid>https://irreal.org/blog/?p=13805</guid>
            <pubDate>Wed, 13 May 2026 14:33:25 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>
A few weeks ago, Bozhidar Batsov had <a href="https://emacsredux.com/blog/2026/04/06/the-many-faces-of-flet/">a splendid post</a> on  <code>cl-flet</code>, <code>cl-letf</code>, and <code>cl-labels</code>. I didn’t get a chance to write about it then but his post is very useful for understanding these macros and how they differ.
</p>
<p>
The macros are the replacements for the now deprecated <code>flet</code>, which, in turn, was imported from Common Lisp with the added feature of having dynamic scope. As Batsov points out, making the scope dynamic conflates the notion of local and dynamic scope, which can be a bit confusing. This behavior is preserved by the cl-letf macro for those who need it.
</p>
<p>
The <code>cl-flet</code> macro is just like the <code>flet</code> macro from Common Lisp. It defines a local function whose definition is available only from within its scope. The salient fact is that its definition is <i>not</i> available from within the function definition so it can’t be called recursively.
</p>
<p>
The <code>cl-labels</code> macro is like <code>labels</code> from Common Lisp. It’s similar to <code>cl-flet</code> except  that its definition <i>is</i> available from within the function definition so it <i>is</i> recursive.
</p>
<p>
Finally, the <code>cl-letf</code> macro largely replicates the behavior of the old (Elisp) <code>flet</code> macro with the addition that it can dynamically replace the definition of any <code>setf</code>-able definition. This can complicate its use a bit. See Batsov’s post for the details.
</p>
<p>
If you’re like me, you don’t use any of these macros that often so it’s easy to forget the details. For that reason it’s worthwhile bookmarking Batsov’s post so that you can refresh your memory whenever you need to.</p>
</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[James Dyer: A Tiny Nohup: Keeping Media Alive When Emacs Exits]]></title>
            <link>https://emacs.dyerdwelling.family/emacs/20260512184707-emacs--a-tiny-nohup-keeping-media-alive-when-emacs-exits/</link>
            <guid>https://emacs.dyerdwelling.family/emacs/20260512184707-emacs--a-tiny-nohup-keeping-media-alive-when-emacs-exits/</guid>
            <pubDate>Wed, 13 May 2026 09:53:00 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>
This post is simply about some more yak shaving and there was this one niggle that I just kept putting off, because it never really annoyed me enough, but recently I started watching a lot more video content from within dired and it finally got to me.
</p>

<p>
The problem.  I press <code>W</code> in dired, which is bound to <code>dired-do-async-shell-command</code>, type <code>mpv</code> (or accept the default guess that my <code>dired-guess-shell-alist-user</code> provides for video files), and the video starts playing.  Great.  But when I close Emacs, the video dies too.  The whole point of an async command is that it runs in the background, right?, so why does it disappear when Emacs goes away?, this is most perplexing!
</p>


<div class="figure">
<p><img loading="lazy" src="https://emacs.dyerdwelling.family/static/emacs/20260512184707-emacs--A-Tiny-Nohup-Keeping-Media-Alive-When-Emacs-Exits.jpg" alt="20260512184707-emacs--A-Tiny-Nohup-Keeping-Media-Alive-When-Emacs-Exits.jpg" width="100%">
</p>
</div>

<p>
Now I should say, the answer is obvious in retrospect, but it took me a little while to actually stop and think about it properly.  The command <code>dired-do-async-shell-command</code> adds a trailing <code>&amp;</code> to the shell command and passes it to <code>async-shell-command</code>, which creates a shell process - Emacs is the parent of that shell, and the shell is the parent of <code>mpv</code>.  When Emacs exits, it kills its child processes, the shell goes down, and <code>mpv</code> gets orphaned, which is fine actually, the problem is not being orphaned, the problem is that it receives a SIGHUP from the process group cleanup and dies before it can be reparented to init.  So the media stops.
</p>

<p>
The solution is a single, tiny piece of advice.  I just prepend <code>nohup</code> to the command string before <code>dired-do-async-shell-command</code> does anything with it.  <code>nohup</code> makes the process ignore SIGHUP, so when the shell gets killed by Emacs, <code>mpv</code> is orphaned cleanly and keeps running.
</p>

<div class="org-src-container">
<pre>(<span>defun</span> <span>my/dired-async-shell-command-nohup</span> (orig-fun command <span>&amp;optional</span> arg file-list)
  <span>"Wrap COMMAND with `</span><span>nohup</span><span>' so the process survives Emacs exit."</span>
  (funcall orig-fun (concat <span>"nohup "</span> command) arg file-list))

(<span>with-eval-after-load</span> 'dired
  (advice-add 'dired-do-async-shell-command
              <span>:around</span> #'my/dired-async-shell-command-nohup))
</pre>
</div>

<p>
That is it.  Six lines of Elisp, five of which are boilerplate.
</p>

<p>
And yes, this works for any command you run through <code>W</code>, not just <code>mpv</code>.  <code>gimp</code>, <code>firefox</code>, <code>libreoffice</code> - they all get the <code>nohup</code> treatment now.  Which is fine, those programs usually detach themselves anyway, but it does not hurt to have it.
</p>

<p>
So that is the tweak.  A tiny, one-function, one-advice change that finally stopped my videos from dying every time I closed Emacs.  I suspect someone will tell me that there is a simply variable flag that I can set that enables this anyway, but hey ho!
</p>
</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Bicycle for Your Mind: Alfred Liberates Keyboard Commands]]></title>
            <link>https://bicycleforyourmind.com/alfred-liberates-keyboard-commands</link>
            <guid>https://bicycleforyourmind.com/alfred-liberates-keyboard-commands</guid>
            <pubDate>Wed, 13 May 2026 07:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p><img src="https://cdn.blot.im/blog_c4a729f3205a44e5a9669523ddfb8b2e/_image_cache/9b61e270-0c26-4eb3-9c18-73589f64b37c/al000.jpg" alt="Keyboard Commands" width="2400" height="3000"><span class="caption">Keyboard Commands</span></p>

<p>I ran out of keyboard commands.</p>
<p>OK, that sounds weird. Let me explain. In Alfred, I have the following keyboard assignments:</p>
<p><code>⇧⌃A</code>: App Store<br>
<code>⇧⌃B</code>: BBEdit<br>
<code>⇧⌃E</code>: Emacs</p>
<p>I had covered the alphabet. Every letter had an application associated with it. I started a second layer. I assigned <code>⇧⌃⌥B</code> to Better Finder Rename, <code>⇧⌃⌥E</code> to EagleFiler and so on. Soon I was running out of choices again.</p>
<p>Over a period of almost 15 years, I made do. I loved Alfred, I also loved keyboard commands. I wanted to be able type a keyboard command and then choose from a list of applications which were tied to that keyboard command. I wanted to be able to type something small to be able to navigate this list and launch the application I wanted.</p>
<p>I didn’t know how to do this in Alfred. I had hacked together a solution in <a href="https://bicycleforyourmind.com/leader_key_in_keyboard_maestro">Keyboard Maestro</a>, but I wanted to do it in Alfred. It was my launcher. So, I went to the Community for Alfred and asked, <a href="https://www.alfredforum.com/topic/23818-choosing-to-launch-particular-programs-with-a-shortcut/" target="_blank">Choosing to launch particular programs with a shortcut - Workflow Help &amp; Questions - Alfred App Community Forum</a>. <strong>FireFingers21</strong> answered with a workflow.</p>
<p>FireFingers21’s solution had two parts:</p>
<ol>
<li>The ability to assign a keyboard command to a workflow which would give me a list of applications assigned to it. I could press the keyboard command and then choose from a list by typing the number corresponding to my choice. Hit ↵ to launch.</li>
<li>The ability to assign a keyboard command to a workflow which presented a similar list. This time the list could contain multiple applications grouped together.</li>
</ol>
<h2>This Is How It Helped</h2>
<p><img src="https://cdn.blot.im/blog_c4a729f3205a44e5a9669523ddfb8b2e/_image_cache/9baf442f-0952-44e2-9c63-b06ed6476fff/al001.png" alt="Outliners" width="729" height="339"><span class="caption">Outliners</span></p>
<p>Previously, I had <code>⇧⌃O</code> assigned to open OmniOutliner. The same command now gives me the ability to launch OmniOutliner, Zavala, or Opal, depending on my needs. This is now the Outliner keyboard command.</p>
<p><img src="https://cdn.blot.im/blog_c4a729f3205a44e5a9669523ddfb8b2e/_image_cache/079a6a3b-15bb-4527-9bbd-e1f909045904/al002.png" alt="Editors" width="1138" height="396"><span class="caption">Editors</span></p>
<p><code>⇧⌃E</code>, opened Emacs. Not anymore, now it can open any of these programs. Don’t laugh. I am aware that I have too many editors installed.</p>
<p><img src="https://cdn.blot.im/blog_c4a729f3205a44e5a9669523ddfb8b2e/_image_cache/b1645b70-ae96-4eaa-abd2-629c6feeb080/al003.png" alt="Multi" width="840" height="251"><span class="caption">Multi</span></p>
<p>I have <code>Hyper-A</code> assigned to multi-application launches. Every morning I used to start my workday by pressing <code>Hyper-A</code> and that would launch:</p>
<ol>
<li>SpamSieve</li>
<li>Mail</li>
<li>Safari</li>
<li>Ghostty</li>
</ol>
<p>Now it gives me a choice. I can also launch my updates group:</p>
<ol>
<li>Applite</li>
<li>Mac App store</li>
<li>Latest</li>
<li>Wailbrew</li>
</ol>
<p>One keyboard command, groups of multiple applications launched together.</p>
<h2>Conclusion</h2>
<ol>
<li>I have keyboard commands to spare.</li>
<li>Alfred is a great product. I knew that.</li>
<li>The community around Alfred are helpful and informative.</li>
<li>Don’t hesitate to ask questions when you don’t know how to do something. There are helpful people around who might have the answers and they are willing and ready to help you.</li>
<li>Thanks to FireFingers21 and Vero for their help.</li>
</ol>
<p><strong>Note</strong>: Thanks to <a href="https://www.pexels.com/@darrenhalos/" target="_blank">Darren Halos</a> for the picture.</p>
<p>macosxguru at the gmail thingie.</p> </body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Org Mode requests: [FR] Re: [FR] Tracking numerical habits]]></title>
            <link>https://list.orgmode.org/87pl2z28bf.fsf@gmail.com</link>
            <guid>https://list.orgmode.org/87pl2z28bf.fsf@gmail.com</guid>
            <pubDate>Wed, 13 May 2026 05:21:40 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body>[request] flags:-O- replies:11</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Org Mode requests: [RFC] Round priorities in iCalendar export]]></title>
            <link>https://list.orgmode.org/24b44cbc-ca83-4f2b-b9cf-e23455844e43@gmail.com</link>
            <guid>https://list.orgmode.org/24b44cbc-ca83-4f2b-b9cf-e23455844e43@gmail.com</guid>
            <pubDate>Tue, 12 May 2026 23:18:18 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body>[request] flags:--- replies:2</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Irreal: Context Menus for Elisp Development]]></title>
            <link>https://irreal.org/blog/?p=13803</link>
            <guid>https://irreal.org/blog/?p=13803</guid>
            <pubDate>Tue, 12 May 2026 15:27:37 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>
Charles Choi is back with more menus. Most of you know that I generally eschew the use of Emacs menus but they definitely have a place in seldom used commands whose name or key shortcut are hard to remember. In most cases, it’s possible to play around with fuzzy command completion and find what you’re looking for but it’s a lot easier to simply use a menu if it’s there.
</p>
<p>
That’s where Choi’s latest update to <a href="https://irreal.org/blog/?p=13711">Anju</a> comes in. He says that the introduction of <code>context-menu-mode</code> in Emacs 28 made it possible <a href="http://yummymelon.com/devnull/enhancing-elisp-development-with-context-menus.html">to provide cotentxt sensitive menus for Elisp development</a> and he has added it to the latest version of Anju.
</p>
<p>
His post has a couple of screen shots of his menus in action. In the first, the point is on a function definition and the menu, among other things, offers the choice to instrument that function. In the second, the function has been instrumented and now the (context sensitive) menu offers things you can do—such as step into, set a breakpoint, and others—with the function. Naturally all of this is dependent on where the point is. That’s the point: the menu is context sensitive.
</p>
<p>
Choi says that the use of the context menus has markedly improved his Elisp development. If you do some but not a lot of Emacs development, it may be a win for you. On the other hand, Choi certainly <i>does</i> do a lot of Emacs development and still finds it a win. Perhaps—no matter your normal workflow—you will too.</p>
</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Org Mode requests: [FR] ox-md: Verbatim link export]]></title>
            <link>https://list.orgmode.org/877bp92lr4.fsf@gmail.com</link>
            <guid>https://list.orgmode.org/877bp92lr4.fsf@gmail.com</guid>
            <pubDate>Tue, 12 May 2026 06:19:11 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body>[request] flags:--- replies:0 topic:ox-md</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Bozhidar Batsov: Port: a minimalist prepl client for Emacs]]></title>
            <link>https://batsov.com/articles/2026/05/12/port-a-minimalist-prepl-client-for-emacs/</link>
            <guid>https://batsov.com/articles/2026/05/12/port-a-minimalist-prepl-client-for-emacs/</guid>
            <pubDate>Tue, 12 May 2026 06:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>For ages I’ve had “add prepl support to CIDER” sitting somewhere in the back of
my head. CIDER is built firmly around nREPL, but
<a href="https://clojure.org/reference/repl_and_main#prepl">prepl</a> ships with Clojure
itself, and the appeal of dropping the external REPL server requirement is
obvious.  Recently, as part of a broader internals cleanup “mini-project” in
CIDER, I finally sat down and put a prototype together:
<a href="https://github.com/clojure-emacs/cider/pull/3899">cider#3899</a>.</p>

<p>The good news is that the prototype sort of worked. The bad news is that the
more I poked at it, the more I kept running into the same pattern. CIDER
assumes ops, sessions, request ids, and a whole structured protocol that
prepl simply doesn’t have. The amount of CIDER code that would need to grow
“is this nREPL or prepl?” branches added up quickly, and I’d be papering
over prepl’s limitations in dozens of subtle places. The exercise was fun,
but it ended up reaffirming my long-standing belief that nREPL is a much
better fit for editor tooling than prepl is.</p>

<p>The exercise did leave me thinking though. What if, instead of bolting prepl
onto CIDER, I built a small standalone client in the spirit of
<a href="https://github.com/clojure-emacs/inf-clojure">inf-clojure</a> and
<a href="https://github.com/sanel/monroe">monroe</a>? Something tiny and focused that
doesn’t have to pretend to be CIDER, and where prepl’s quirks would be the
design rather than something to work around.</p>

<p>Conveniently, I was on vacation in Portugal at the time, where I spent a few
days in Porto, and the name pretty much picked itself.
<a href="https://github.com/clojure-emacs/port">Port</a> was born. It kept us firmly in the
land of fun, drink-inspired Clojure-on-editor names: CIDER,
<a href="https://calva.io">Calva</a> (after Calvados, the apple brandy), and now Port (the
famous fortified wine). The protocol Port talks to is <code class="language-plaintext highlighter-rouge">prepl</code>, over a TCP
<strong>port</strong>, so the pun was hard to pass up.</p>

<p>This time around I didn’t manage to land on a backronym I love (at least not
yet). The contenders so far:</p>

<ul>
  <li>prepl omnipotent repl toolkit (my favorite so far)</li>
  <li>prepl-operated repl toolkit</li>
  <li>peak optimized repl toolkit</li>
</ul>

<p>Naming is hard. I remain open to better suggestions. :D</p>

<h2>Scope, or what Port isn’t</h2>

<p>Port is a side project. I don’t plan to invest serious time in it past the
point I consider it feature-complete, which won’t be far beyond what’s
already there. The deliberate goal is to keep it simple and focused, and its
feature set will stay close to inf-clojure and monroe. <strong>Port is not
competing with CIDER.</strong> If you want the full feature set (debugger,
inspector, test runner, profiler, structured stacktraces, refactor support),
CIDER + <code class="language-plaintext highlighter-rouge">cider-nrepl</code> is, and will remain, the way.</p>

<p>What Port gives you today is a small, dependable Clojure REPL that you can
hook into Emacs without any external dependencies, just a stock Clojure JVM
with a prepl listening on a port.</p>

<h2>A few architectural notes</h2>

<p>If you’re up for the long version, <a href="https://github.com/clojure-emacs/port/blob/main/doc/design.md">doc/design.md</a>
goes deep. Here’s the short version of what prepl gives you compared to nREPL:</p>

<ul>
  <li><strong>No bencode</strong>. prepl emits EDN-tagged maps, one per line. This might be a feature or a problem, depending on your perspective.</li>
  <li><strong>No middleware</strong>. Whatever the server prints is what you get. No
interception, no extension surface.</li>
  <li><strong>No sessions</strong>. There’s one thread per TCP connection.</li>
  <li><strong>No ops</strong>. You send a Clojure form, the server evaluates it, and prints
back tagged messages: <code class="language-plaintext highlighter-rouge">:ret</code>, <code class="language-plaintext highlighter-rouge">:out</code>, <code class="language-plaintext highlighter-rouge">:err</code>, <code class="language-plaintext highlighter-rouge">:tap</code>, plus an <code class="language-plaintext highlighter-rouge">:exception
true</code> flag on errors.</li>
  <li><strong>No request id</strong>. This is the main issue. Tags identify the <em>kind</em> of
message, not which request produced it.</li>
</ul>

<p>That last point is the central design constraint. If you want to issue a
request and reliably read back its result without accidentally consuming
output from an unrelated background <code class="language-plaintext highlighter-rouge">future</code> or <code class="language-plaintext highlighter-rouge">tap&gt;</code>, you need to layer
correlation on top of the protocol. Port does this with two tricks:</p>

<ol>
  <li><strong>Two sockets per session.</strong> A user socket drives the REPL buffer with
raw streaming output, and a separate tool socket carries helper-command
requests. Background prints from <code class="language-plaintext highlighter-rouge">future</code>/<code class="language-plaintext highlighter-rouge">agent</code> on the user thread
don’t bleed into the tool channel.</li>
  <li><strong>A bootstrap form.</strong> On connect, the tool socket evaluates a one-shot
form that defines a <code class="language-plaintext highlighter-rouge">port.tooling/-eval</code> wrapper. Every subsequent helper
call goes through it, which captures <code class="language-plaintext highlighter-rouge">*out*</code> / <code class="language-plaintext highlighter-rouge">*err*</code> and returns a
tagged map containing the request id. The client matches the id against
a pending-callback registry.</li>
</ol>

<p>This is what nREPL provides via sessions and ops, just reinvented at the TCP
layer. It’s a fair amount of work for something nREPL gives you for free,
which only strengthens my view that nREPL is the better protocol for editor
tooling. Still, it was an interesting and educational exercise.</p>

<h2>Zero dependencies</h2>

<p>One thing I’m fairly proud of: Port has no hard dependencies. You’ll want either
<code class="language-plaintext highlighter-rouge">clojure-mode</code> or <code class="language-plaintext highlighter-rouge">clojure-ts-mode</code> installed for the source-buffer side of
things, but Port itself only soft-depends on them via runtime <code class="language-plaintext highlighter-rouge">fboundp</code>
checks. Hook it onto whichever one(s) you actually use. I intend to keep it that
way. Dependency creep is a real problem in the Emacs (every?) ecosystem, and a small
package should stay small.</p>

<h2>What’s there in 0.1</h2>

<p>I tagged <a href="https://github.com/clojure-emacs/port/releases/tag/v0.1.0">v0.1.0</a>
yesterday. It’s small but already perfectly usable:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">M-x port</code> “jacks in” (bootstraps) (auto-detects <code class="language-plaintext highlighter-rouge">deps.edn</code> / <code class="language-plaintext highlighter-rouge">project.clj</code> /
<code class="language-plaintext highlighter-rouge">bb.edn</code>, starts a server and connects to it)</li>
  <li>single-buffer REPL with persistent input history, completion, and eldoc
at the prompt</li>
  <li>interactive evaluation from source buffers with pretty-printed results</li>
  <li>structured stacktrace buffer with cause chain and navigable frames</li>
  <li><code class="language-plaintext highlighter-rouge">M-.</code> find-definition that follows into jar sources</li>
  <li>doc/source/apropos/macroexpand helpers</li>
</ul>

<p>MELPA submission is queued up next. After that, expect Port to be in
<a href="https://batsov.com/articles/2025/11/16/burst-driven-development-my-approach-to-oss-projects-maintenance/">burst-driven</a>
maintenance mode like most of my smaller projects.</p>

<p>Feedback, ideas, and contributions are most welcome. The
<a href="https://github.com/clojure-emacs/port/issues">issue tracker</a> is the right
place.</p>

<h2>Closing thoughts</h2>

<p>Funny thing, I’d never actually written any code against prepl until I
started this project. It was fun to spend some quality time with the
“competition” of my beloved nREPL. Working with a different protocol always
teaches you something about the one you’re used to, and I came away from
this with a renewed appreciation for both: prepl is genuinely elegant for
what it is, and nREPL is genuinely well-designed for what we use it for.</p>

<p>Big thanks to <a href="https://www.clojuriststogether.org/">Clojurists Together</a> and
everyone else who supports my OSS Clojure work. You rock! Now if you’ll
excuse me, I have new releases of CIDER, clj-refactor, and refactor-nrepl
to get back to.</p>

<p>Keep hacking!</p></body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Dave's blog: Remote Linux kernel development with Emacs]]></title>
            <link>https://davemq.github.io/2026/05/12/remote-linux-dev-with-emacs.html</link>
            <guid>https://davemq.github.io/2026/05/12/remote-linux-dev-with-emacs.html</guid>
            <pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>I work on developing features and fixing bugs in the Linux kernel in
areas specific to IBM Power. I use a number of Emacs’ facilities to
get my work done.</p>

<h1>Magit</h1>

<p>I use <a href="https://magit.vc/">Magit</a> extensively with clones of various Git repositories from
<a href="https://git.kernel.org/">https://git.kernel.org/</a>. I keep learning new (to me) things about git
and Magit and using them. I’ve found it useful to learn how things work
with the command line before attempting to use them in Magit.</p>

<h1>Compilation</h1>

<p>This work being with C source code, I make heavy use of <code class="language-plaintext highlighter-rouge">M-x
compile</code>. I’ve made my life easier by preloading a couple of items in
<code class="language-plaintext highlighter-rouge">compile-history</code>. I don’t need this everywhere, just in
my Linux trees, so I put all of my Linux repositories under ~/linux,
and there I’ve created a .dir-locals.el for directory local variables:</p>

<figure><pre><code class="language-emacs-lisp"><span class="p">((</span><span class="no">nil</span> <span class="o">.</span> <span class="p">((</span><span class="nv">compile-history</span> 
	  <span class="o">.</span> 
	  <span class="p">(</span><span class="s">"nice make -k ARCH=powerpc CROSS_COMPILE=powerpc64le-linux-gnu- -j `nproc` all compile_commands.json gtags"</span>
	   <span class="s">"nice make -k ARCH=powerpc CROSS_COMPILE=powerpc64le-linux-gnu- -j `nproc` tarzst-pkg"</span>
	   <span class="p">)</span>
	  <span class="p">)</span>
	 <span class="p">)</span>
      <span class="p">)</span>
 <span class="p">)</span></code></pre></figure>

<p>I do my work on my x86_64 laptop, and cross compile for the powerpc
architecture in 64-bit little endian mode. I take advantage of all of
the threads available on my laptop. I use <code class="language-plaintext highlighter-rouge">nice</code> to make it a bit
easier to interactive things while compiling.</p>

<p>The first history item does the big work. I build the <strong>all</strong> target to
build the kernel and modules. I build compile_commands.json to capture
the information needed by <code class="language-plaintext highlighter-rouge">clangd</code> to use with Eglot. I also
keep gtags databases up-to-date, though I should probably drop that
since I’m completely using Eglot with clangd at this point.</p>

<p>The second history item creates a .tar.zst file from the kernel and
modules, which I transfer to the remote Power partition.</p>

<h1>C mode and Eglot</h1>

<p>I use c-ts-mode with Eglot. Eglot is integrated with xref.</p>

<h1>TRAMP</h1>

<p>My test systems are remote, so I need to transfer the kernel and
modules over to it. I initially use TRAMP with the <strong>scp</strong> method to
transfer the compressed tar file. If I rebuild and create a new
package with the same name, I switch to the  <strong>rsync</strong> method to
transfer. This saves several seconds each time.</p>

<p>In both of these cases, I’ve set up keys so I do passwordless
authentication.</p>

<h1>Non-Emacs things on the remote system</h1>

<p>Once I have the tar file on the remote system, there are some
non-Emacs things to do. I’m almost certain I can do them in Emacs, as
they’re just command line things, but I’m just not used to that and
haven’t pushed myself to try it.</p>

<ul>
  <li>untar the tarball in / (as root)</li>
  <li>run <code class="language-plaintext highlighter-rouge">dracut</code> to create an init ramdisk</li>
  <li>optionally remove older kernels and modules</li>
  <li>run <code class="language-plaintext highlighter-rouge">grub2-mkconfig</code> to add the new kernel to the GRUB menu</li>
  <li>copy the new grub config file to the right place</li>
  <li>reboot</li>
</ul></body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Thanos Apollo: The Most Emacs Bzr Saga]]></title>
            <link>https://thanosapollo.org/posts/bzr-saga/</link>
            <guid>https://thanosapollo.org/posts/bzr-saga/</guid>
            <pubDate>Mon, 11 May 2026 21:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>Since I had no interesting books to read today, nor interesting films
to watch, I decided to scavenge for the most intriguing content one
can find online.  I ended up reading the Linux kernel mailing lists,
but those discussions seemed to be 18+, so I settled for the
comparatively civil emacs-devel.</p>
<p>For those unfamiliar, emacs-devel is the primary development
discussion list for GNU Emacs – where design decisions get made,
patches get reviewed, and occasionally where people spend 200 messages
arguing about version control software.  This is the story of that
last one.</p>
<h2>2008: “This question is over and decided”</h2>
<p>In March 2008, Emacs was migrating from CVS (yes, CVS) to something
more “modern”. The two contenders were Git and Bazaar.</p>
<ul>
<li>Git, created by Linus Torvalds for the Linux kernel.</li>
<li>Bazaar was a GNU project, <em>maintained by Canonical</em></li>
</ul>
<p>A 236-message thread erupted on emacs-devel.  People benchmarked both
tools.  The results were not subtle.  <a href="https://yhetil.org/emacs-devel/jeprtyalxt.fsf@sykes.suse.de/">Andreas Schwab</a>, one of the core
developers, reported his first impression:</p>
<blockquote>
<p>My first impression is that bzr is slow, so slow that it is completely
unusable.  How can it come that a simple bzr log takes more than a
minute to even start?  Even cvs log is instantaneous in comparison,
although it has to request the log from the server.</p>
</blockquote>
<p>David Kastrup found it equally puzzling:</p>
<blockquote>
<p>I find this surprising: “git log” is pretty much instantaneous, and
git recalculates a code piece’s history in the process.  In contrast,
one has to tell Bazaar when one copies or moves or renames files, so
it should have the information available right away.</p>
</blockquote>
<p>The actual numbers:</p>
<ul>
<li><code>git log | head -1</code> 0.012 seconds.  The same command with Bazaar took 21.5 seconds.</li>
<li>Committing a single-file change: 0.08 seconds with Git, 17 seconds with Bazaar.</li>
</ul>
<p>The benchmarks kept coming.  <a href="https://yhetil.org/emacs-devel/jwvod9cq7av.fsf-monnier+emacs@gnu.org/">Stefan Monnier</a>, the head maintainer, set
the bar low:</p>
<blockquote>
<p>I don’t care if Bzr is slower or faster than Git, but in
order to switch to Bzr, we need it to be ‘fast enough’.  Currently it
is not.  At the very least the ‘bzr diff’ should not take more than a
couple seconds.</p>
</blockquote>
<p>Meanwhile, <a href="https://yhetil.org/emacs-devel/d06a5cd30803122130h4dedcfbdx2cf5dda7ebd507ee@mail.gmail.com/">Jonathan Lange</a>, an actual Bazaar developer from Canonical,
was in the thread doing tech support.</p>
<p>His recommended workflow for the initial checkout:</p>
<blockquote>
<p>An even better way to do the initial download is this:</p>
<p>$ wget <a href="http://bzr.notengoamigos.org/emacs.tar.gz">http://bzr.notengoamigos.org/emacs.tar.gz</a></p>
<p>$ tar xzf emacs.tar.gz</p>
<p>$ bzr init-repo emacs-bzr</p>
<p>$ cd emacs-bzr</p>
<p>$ bzr branch ../emacs trunk</p>
<p>$ cd trunk</p>
<p>$ bzr pull –remember <a href="http://bzr.notengoamigos.org/emacs/trunk/">http://bzr.notengoamigos.org/emacs/trunk/</a></p>
</blockquote>
<p>Compare that to <code>git clone</code>!</p>
<p>Someone in the thread finally asked the obvious question:</p>
<blockquote>
<p>To the emacs maintainers and decision makers: What more information is
required to convince bzr is not the right tool at the present moment?</p>
</blockquote>
<p>Richard Stallman’s reply:</p>
<blockquote>
<p>This decision is not a decision for the present moment.  It is a long
term decision.  So it would be better to wait a few months while Bzr
developers improve it, than to make some other “temporary” decision
that would probably be hard to reverse.</p>
</blockquote>
<p>And in case anyone missed the point, in a <a href="https://yhetil.org/emacs-devel/E1JbhT2-0003HR-PP@fencepost.gnu.org/">separate message</a>:</p>
<blockquote>
<p>This question is over and decided.
We will use GNU Bzr, because it is a GNU package.</p>
</blockquote>
<p>When someone pointed out that this political decision was “wiping away
all technical arguments,” RMS <a href="https://yhetil.org/emacs-devel/E1JfqPy-00030x-I0@fencepost.gnu.org/">replied</a>:</p>
<blockquote>
<p>The rule that GNU packages should support each other helps make the
GNU system as a whole work better.</p>
</blockquote>
<p>Someone asked the obvious follow-up: “Why can’t we just make Git part
of the GNU system?”</p>
<p>RMS:</p>
<blockquote>
<p>We could include it in the GNU system, but
its developers are not likely to want to make it a GNU package.</p>
</blockquote>
<p>To be fair to RMS, there’s a real principle here.  If the GNU project
doesn’t use its own tools, it sends a message that those tools aren’t
good enough, which undermines the whole idea of a self-sufficient free
software ecosystem.  He’d been making this argument for decades, and
it had served the project well in many other cases.  The problem
wasn’t the principle.  The problem was that Bazaar couldn’t live up to
it.</p>
<p>The 236-message thread, the benchmarks, the Canonical employee’s
workarounds; none of it changed the outcome.  The decision was
political, and the politics were settled.</p>
<h2>2008-2012: The long tail</h2>
<p>The rest of the world moved to Git.  GitHub launched in 2008 and
exploded.  Emacs contributors, meanwhile, had to learn Bazaar, a
tool they used nowhere else, just to submit patches.</p>
<p>Threads like “Help me unstick my bzr, please” and “Can NOT bzr the
emacs repos (may be bzr has a memory leak)” became regular
occurrences.</p>
<p><strong>Then in 2012, Canonical laid off the Bazaar development team.</strong></p>
<h2>2013</h2>
<p>In March 2013, a year after Bazaar’s development ceased, <a href="https://yhetil.org/emacs-devel/m2620euf2l.fsf@newartisans.com/T/#u">John Wiegley
posted</a> what everyone had been wanting to say:</p>
<blockquote>
<p>We have often debated the merits of Git vs. Bazaar, and which one the
GNU project should use for Emacs development.  I think now is an
appropriate time to revisit this decision.</p>
<p>My main reason for bringing this up again is that Bazaar development
has effectively stalled.  There are major bugs which have been in their
bug-tracker for years now – bugs affecting Emacs development, such as
the ELPA repository – which have been ignored all this time.</p>
<p>So, to Richard as the undisputed Czar of all things Emacs: can we now,
pretty please, switch to Git?</p>
</blockquote>
<p>200 messages followed.</p>
<p>RMS’s first response:</p>
<blockquote>
<p>The maintainer says he is fixing some bugs, and
I asked him just yesterday to fix the ELPA branch bug. I’d like to
give him a reasonable time to do this.</p>
</blockquote>
<p>The bug was 1.5 years old.  <a href="https://yhetil.org/emacs-devel/87hajxqlly.fsf@yandex.ru/">Dmitry Gutov called it out</a>:</p>
<blockquote>
<p>Isn’t this a bit late? The bug is 1.5 years old.  Was he not aware of it before?</p>
</blockquote>
<p>Then RMS <a href="https://yhetil.org/emacs-devel/E1UKtwC-0006bM-Dd@fencepost.gnu.org/">revealed his hand</a>:</p>
<blockquote>
<p>I am trying to determine whether Bzr is effectively maintained or
not.  I’d rather get a Yes answer than a No answer.</p>
</blockquote>
<p>That’s a remarkably honest thing to say publicly.  He wasn’t hiding
his preference.  He genuinely believed in the principle of GNU
projects supporting each other, and he was hoping reality would
cooperate.</p>
<p><a href="https://yhetil.org/emacs-devel/m3txnwj6zm.fsf@chopper.vpn.verona.se/">Joakim Verona</a>, a longtime Bazaar user and Emacs contributor, described
the reality on the ground:</p>
<blockquote>
<p>I have done my best to be a constructive user of the tool, and I have
had many technical difficulties.  When I try to find solutions to the
issues I notice the following:</p>
<ul>
<li>The bzr community is very helpful. This is good.</li>
<li>There are many well known bugs. There are also many well known
patches for these, some of them provided by Emacs developers. They
never enter upstream. By “never” I mean years. This is bad.</li>
</ul>
</blockquote>
<p><a href="https://yhetil.org/emacs-devel/E1UL4KW-0002zx-Jj@fencepost.gnu.org/">RMS replied</a>:</p>
<blockquote>
<p>I don’t have time to read the Bzr mailing list. Or any development
mailing list.  The only such list I am on is this one.  You might as
well tell me to fly to the moon as tell me to read something on the
Bzr list.</p>
</blockquote>
<p>And when asked whether the users of Bazaar should have a say in
whether Bazaar is sufficiently maintained:</p>
<blockquote>
<p>When I have to decide whether a maintainer is doing an adequate job or
needs to be replaced, I pay attention to whatever relevant information
I get.  However, to give users “a say” in the decision seems improper,
so I don’t do that.</p>
</blockquote>
<p>Karl Fogel, a veteran open source developer (author of <a href="https://producingoss.com/">Producing Open
Source Software</a> and one of the original Subversion developers),
delivered the sharpest critique in the thread:</p>
<blockquote>
<p>Well, really, you don’t have time to pay close enough attention to Bzr
development to competently decide whether it’s still a good choice for
Emacs.  That’s fine – no one has time to do every important thing,
and you do many other important things.</p>
<p>But then why do you think you still have the time &amp; mental bandwidth
to make this decision well?  Why not delegate it to the Emacs
maintainers on the grounds that you no longer have time to do a good
job of this evaluation?</p>
</blockquote>
<p>He pointed out that asking one person about one bug is not a proxy for
project health, and that others in the thread had already done more
thorough research than RMS could, given his time constraints.</p>
<p>RMS’s reply:</p>
<blockquote>
<p>Because more than Emacs is at stake here.</p>
</blockquote>
<p>One line, but it’s the core of his worldview.  If the flagship GNU
project abandons a GNU tool, what signal does that send to every other
GNU package?  He wasn’t wrong about the stakes.  He was wrong about
the tool.</p>
<p>Karl pushed once more:</p>
<blockquote>
<p>You should either devote enough time to evaluating Bzr’s maintenance
state to get a reliable answer, or delegate to someone who can do
so.  Instead, you’re asking the maintainers to rely on your
investigation… yet you clearly don’t have time to do a good
job.  This is a poor use of everyone’s time.</p>
</blockquote>
<p>RMS:</p>
<blockquote>
<p>I already have a plan for how to proceed on this, and I am doing it.</p>
</blockquote>
<p>No details. No timeline. No delegation. Trust me.</p>
<p>Meanwhile, Stefan Monnier, posted exactly one substantive message in
the entire 200-message thread:</p>
<blockquote>
<p>Just like I didn’t fight Richard’s choice of Bazaar, I don’t care very
much whether we keep using Bazaar or we change to Git, Monotone,
Darcs, Mercurial, OpenCM, Fossil, younameit.</p>
<p>The only thing I care for now is to move away from Bazaar for the
’elpa’ branch because Bazaar can’t handle it properly.</p>
</blockquote>
<p>Leo Liu summarized what everyone was thinking:</p>
<blockquote>
<p>Most GNU projects aren’t using BZR as you might be aware.</p>
<p>While helping BZR fixing bugs might be a gain for BZR, it is a loss as
a whole for GNU.  Volunteers spend their spare time on GNU projects
and if 20% of that time is taken up by wrestling with BZR, it becomes
costly to the point discouraging people from joining.</p>
<p>For the greater good of GNU, move off BZR seems like the only sound
choice.</p>
</blockquote>
<p>The thread ended without a clear resolution.  RMS had a plan.  He was
working on it.  The 200 messages didn’t produce a decision, but they
did make the community’s position unmistakable.</p>
<h2>2013: The ELPA branch breaks</h2>
<p>Later that year, Stefan made the practical move that set the stage for
everything that followed.  The ELPA branch was broken on Bazaar, a bug
that crashed on checkout, with no one left to fix it.  Stefan moved it
to Git, and his announcement showed exactly the kind of careful
leadership that had kept Emacs development running through all of
this:</p>
<blockquote>
<p>I’m not terribly happy about this change, since it means we’ll be
using two different tools (Git for ’elpa’ and Bzr for ’trunk’), but I
really see no other way out.</p>
<p>I don’t want this to be a discussion about the merits/pitfalls of Git
vs Bzr, and this is not an occasion to discuss the use of Git for the
’trunk’ either.</p>
</blockquote>
<p>He knew exactly what everyone was thinking “if Git is good enough for
ELPA, why not for trunk?” and he headed it off.  One problem at a
time.</p>
<h2>2014: ESR pushes the button</h2>
<p>By August 2014, Eric S. Raymond had the conversion scripts ready.</p>
<p>He’d been <a href="https://yhetil.org/emacs-devel/20140810205631.GA17907@thyrsus.com/">working on it quietly</a>:</p>
<blockquote>
<p>You haven’t heard much about it because the hard work is all done. I
have the scripts ready to go and need only about eight hours’ notice
before pushing the button.</p>
</blockquote>
<p>The actual migration happened in November 2014. On November 13th, ESR
posted a <a href="https://yhetil.org/emacs-devel/20141113031255.GA21938@thyrsus.com/">six-word message</a>:</p>
<blockquote>
<p>Commits are open.  Have at it.</p>
</blockquote>
<p>Which some even described as <a href="https://yhetil.org/emacs-devel/8761ej6ql7.fsf@ktab.red-bean.com/">heroic</a>.</p>
<p>Six years of debate, 236 messages in the 2008 thread, 200 messages in
the 2013 thread, Stefan’s years of quiet maintenance, countless “help
me unstick my bzr” pleas, one dead version control system, and it
ended with six words.</p>
<h2>The aftermath</h2>
<p>The days following the migration were educational.  Half the core
contributors had never used Git:</p>
<ul>
<li>“<a href="https://yhetil.org/emacs-devel/m3sihnf5jy.fsf@stories.gnus.org/">This Is The Git Help Mailing List</a>”</li>
<li>“git pull fails with merge conflicts.  How can this possibly happen?”</li>
<li>“A simple git workflow for the rest of us”</li>
<li>“need help adjusting workflow to git”</li>
<li>“Good book on Git”</li>
<li>“Obscure error/warning/information message from git pull” (124 messages)</li>
</ul>
<p>These were people who’d been developing one of the most important text
editors in the world for years, asking basic Git questions, because
they’d been stuck on Bazaar while the rest of the world moved on.</p>
<p>What a bzr saga! Anyway, better than any film I could have watched
tonight.</p>
</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Org Mode requests: [FR BARK] Add ability to set a summary]]></title>
            <link>https://list.orgmode.org/CH3PR84MB342422B026DC65B7EAF5B2DEC5382@ch3pr84mb3424.namprd84.prod.outlook.com</link>
            <guid>https://list.orgmode.org/CH3PR84MB342422B026DC65B7EAF5B2DEC5382@ch3pr84mb3424.namprd84.prod.outlook.com</guid>
            <pubDate>Mon, 11 May 2026 18:33:20 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body>[request] flags:--- replies:1 topic:BARK</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Charles Choi: Enhancing Elisp Development with Context Menus]]></title>
            <link>http://yummymelon.com/devnull/enhancing-elisp-development-with-context-menus.html</link>
            <guid>http://yummymelon.com/devnull/enhancing-elisp-development-with-context-menus.html</guid>
            <pubDate>Mon, 11 May 2026 18:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>As celebrated as Emacs is for its programmability, I find the actual process of developing Emacs Lisp (Elisp) to be quite underwhelming. Developing in Elisp has meant learning its libraries and idioms, which is to be expected. What I really don’t care for though are the arcane keybindings associated with doing basic things like evaluating, navigating (Xref), and debugging (especially debugging). While I’ve already committed to muscle memory most of said keybindings, I’d argue that having a mouse-based “point and click” interface is beneficial for both novice and experienced Elisp developers alike, as it lets one focus on the code and not on recalling the right key incantation <em>all the time</em>.</p>
<p>The addition of <code>context-menu-mode</code> in Emacs 28 has provided the opportunity to build a mouse-based UI for Elisp development and I’m happy to announce the availability of one in the latest <a href="https://github.com/kickingvegas/anju/discussions/84">v1.3.0 update to Anju</a>, now on <a href="https://melpa.org/#/anju">MELPA</a>.</p>
<p>To get an idea of what’s available in the v1.3.0 update, here’s a screenshot of the context menu when normally editing an Elisp file where the point is on the symbol <code>foo</code>.</p>
<p><img alt="img" src="http://yummymelon.com/devnull/images/elisp-context-menus/anju-context-menu-elisp.png"></p>
<p>If <code>foo</code> is instrumented for debugging and run, the context menu is adjusted to provide Edebug commands as shown below.</p>
<p><img alt="img" src="http://yummymelon.com/devnull/images/elisp-context-menus/anju-context-menu-edebug.png"></p>
<p>The context menu enhancements provided by Anju take full advantage of built-in functions that identify context at <em>point</em>. Is the point on a symbol? In a function? In an ERT test? On a <code>lambda</code>? The menu items added by Anju take these factors into account to provide a <em>relevant</em> menu offering.</p>
<p>Users can read more about Anju’s context menu enhancements for Elisp development at <a href="https://kickingvegas.github.io/anju/Emacs-Lisp-Context-Menu.html">Emacs Lisp Context Menu (Anju User Guide)</a>.</p>
<h1>Some backstory with Edebug</h1>
<p>Back in 2024, I did a deep dive into Edebug so as to <a href="http://yummymelon.com/presentations/demystifying-edebug/demystifying-edebug.html">give a presentation on it</a> at the <a href="https://www.meetup.com/emacs-sf/events/301454544/?eventOrigin=group_events_list">EmacsSF meetup</a>. In doing so, I realized that all the core features for having an Elisp IDE were there, but no good UI to present it. I set upon prototyping one using Transient, with decidedly mixed results due to both Edebug and Transient fighting each other over window management.</p>
<p>A later <a href="http://yummymelon.com/devnull/prototyping-a-toolbar-ui-for-edebug.html">Edebug UI prototype using the toolbar</a> was attempted but it also had its issues, particularly with layout (or lack thereof) and toolbar-specific bugs in macOS. But a benefit of using the toolbar was that its UI interactions did not interfere with window management. The context menu also shares this benefit.</p>
<h1>Closing Thoughts</h1>
<p>The context menu has markedly improved my developer experience with Elisp, as I find myself using it more than typing out keybindings. Even with keybindings, I’ll use the <a href="https://kickingvegas.github.io/casual/Elisp.html">Casual Elisp Transient</a> to accomplish most Elisp interactions that don’t require Edebug.</p>
<p>That said, I’m not here to eschew keybindings. I still use them, when convenient. But in many circumstances they are not. The context menu can provide an easier way to achieve the same thing. Isn’t that a good thing?</p></body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Irreal: ICanHazShortcut 2.0]]></title>
            <link>https://irreal.org/blog/?p=13801</link>
            <guid>https://irreal.org/blog/?p=13801</guid>
            <pubDate>Mon, 11 May 2026 14:27:26 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>
I’ve been using ICanHazShortcut for  years. I originally started using it to have an easy way to switch to Emacs from anywhere in my system. Eventually, I added Safari and HomeKit to the list of apps I can invoke with a simple keypress but most of my ICanHazShortcut shortcuts are Emacs related. For example, I have <kbd>F9</kbd> mapped to Emacs capture so that I can invoke any Org capture template from anywhere on my system. That’s really handy and I use it several times a day. I also have a shortcut to invoke <a href="https://github.com/tecosaur/emacs-everywhere">Emacs Everywhere</a> so that I can escape into the comfort of Emacs when entering data in some other app.
</p>
<p>
Today (Sunday, as I write this) I received a notification that a new version of ICanHazShortcut was available. It’s completely rewritten in Swift from Basic and has some new capabilities. You can read about them at the above link. For me, not much has changed. The new version continues doing what ICanHazShortcut has always done.
</p>
<p>
ICanHazShortcut is a minimal app that simply provides a shortcut for any command that you can specify in the terminal. There are plenty of more full featured key mappers available that may be better for more complicated situations but I find ICanHazShortcut perfect. It’s light weight and easy to configure. I almost never mess with ICanHazShortcut’s configuration. The last time I changed it—to add HomeKit, I think—was years ago. It truly is a set it and forget it app.
</p>
<p>
If you want a simple app for invoking Emacs—or anything else—in various ways, take a look at ICanHazShortcut; it’s worked very well for me.</p>
</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Sacha Chua: 2026-05-11 Emacs news]]></title>
            <link>https://sachachua.com/blog/2026/05/2026-05-11-emacs-news/</link>
            <guid>https://sachachua.com/blog/2026/05/2026-05-11-emacs-news/</guid>
            <pubDate>Mon, 11 May 2026 13:00:59 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>
People are getting Emacs 31 ready for release. Looking forward to
that! See <a href="https://github.com/emacs-mirror/emacs/blob/master/etc/NEWS.31">emacs/etc/NEWS.31</a> for details.
</p>

<p>
Lots of posts for the Emacs Carnival theme of <a href="https://www.emacswiki.org/emacs/CarnivalMay2026">"May I recommend…"</a>, yay!
</p>

<ul>
<li>Emacs 31:
<ul>
<li><a href="https://www.reddit.com/r/emacs/comments/1t6gkdz/the_emacs31_branch_has_been_created/">The emacs-31 branch has been created!</a> (<a href="https://irreal.org/blog/?p=13795">Irreal</a>)</li>
<li><a href="https://build.opensuse.org/package/show/home:Thaodan:emacs:emacs31/emacs-31">openSUSE package for emacs-31</a> (<a href="https://mastodon.social/@thaodan/116545552801001819">@thaodan</a>)</li>
</ul></li>
<li>Upcoming events (<a href="https://emacslife.com/calendar/emacs-calendar.ics">iCal file</a>, <a href="https://emacslife.com/calendar/">Org</a>):
<ul>
<li>London Emacs (in person): Emacs London meetup <a href="https://www.meetup.com/london-emacs-hacking/events/314540885/">https://www.meetup.com/london-emacs-hacking/events/314540885/</a> Tue May 12 1800 Europe/London</li>
<li>Emacs Berlin: In-Person-Only Emacs-Berlin Stammtisch <a href="https://emacs-berlin.org/">https://emacs-berlin.org/</a> Tue May 12 1900 Europe/Berlin</li>
<li>OrgMeetup (virtual) <a href="https://orgmode.org/worg/orgmeetup.html">https://orgmode.org/worg/orgmeetup.html</a> Wed May 13 0900 America/Vancouver - 1100 America/Chicago - 1200 America/Toronto - 1600 Etc/GMT - 1800 Europe/Berlin - 2130 Asia/Kolkata – Thu May 14 0000 Asia/Singapore</li>
<li>M-x Research: TBA <a href="https://m-x-research.github.io/">https://m-x-research.github.io/</a> Wed May 20 0800 America/Vancouver - 1000 America/Chicago - 1100 America/Toronto - 1500 Etc/GMT - 1700 Europe/Berlin - 2030 Asia/Kolkata - 2300 Asia/Singapore</li>
<li>Emacs APAC: Emacs APAC meetup (virtual) <a href="https://emacs-apac.gitlab.io/announcements/">https://emacs-apac.gitlab.io/announcements/</a> Sat May 23 0130 America/Vancouver - 0330 America/Chicago - 0430 America/Toronto - 0830 Etc/GMT - 1030 Europe/Berlin - 1400 Asia/Kolkata - 1630 Asia/Singapore</li>
</ul></li>
<li>Emacs configuration:
<ul>
<li><a href="https://mbork.pl/2026-05-09_describe-personal-keybindings">Marcin Borkowski: describe-personal-keybindings</a> (<a href="https://irreal.org/blog/?p=13799">Irreal</a>)</li>
<li><a href="https://www.chiply.dev/post-my-dotfiles">My Dotfiles: macOS Bootstrap and an Emacs Distribution</a> (<a href="https://www.reddit.com/r/emacs/comments/1t6l4b9/my_dotfiles_macos_bootstrap_and_an_emacs/">Reddit</a>)</li>
<li><a href="https://www.reddit.com/r/emacs/comments/1t8yb7h/backpack_emacs_hits_version_05/">Backpack Emacs hits version 0.5</a></li>
</ul></li>
<li>Emacs Lisp:
<ul>
<li><a href="https://kelar.org/~bandali/gnu/emacs/ffs-code-review-prot.html">Amin Bandali: FFS code review with Protesilaos</a> (<a href="https://protesilaos.com/codelog/2026-05-08-emacs-coaching-amin-bandali/">Prot</a>)</li>
<li><a href="https://vannilla.org/write/1533394929/article.html">The Emacs's Gamegrid library #1</a>, <a href="https://vannilla.org/write/1533740728/article.html">#2</a>, <a href="https://vannilla.org/write/1533913392/article.html">#3</a>, <a href="https://vannilla.org/write/1535488871/article.html">#4</a></li>
</ul></li>
<li>Appearance:
<ul>
<li><a href="https://www.reddit.com/r/emacs/comments/1t4evbd/recent_commits_to_emacsmaster_introduce_margin/">Recent Commits to emacs:master: Introduce 'margin' face for window margin background</a></li>
<li><a href="https://github.com/mang-jin/emacs-theme-nvim-dark">Emacs theme that looks like v0.10+ Neovim's default dark theme</a> (<a href="https://www.reddit.com/r/emacs/comments/1t8yy6u/emacs_theme_that_looks_like_v010_neovims_default/">Reddit</a>)</li>
</ul></li>
<li>Navigation:
<ul>
<li><a href="https://vannilla.org/write/1680013839/article.html">TAGS, Etags and system headers</a></li>
<li><a href="https://vannilla.org/write/1609258895/article.html">Emacs: writing a project.el backend</a></li>
<li><a href="https://www.youtube.com/watch?v=ptehgb80zH8">Emacs Buffer Comparison Made Easy With Ebuffers 2026 05 10 02:31:35</a> (05:31)</li>
<li><a href="https://www.youtube.com/watch?v=-6B62JpdWgs">LIVE: bribing myself to work on async Rust TCP connections</a> (02:35:52, Emacs navigation chapter at <a href="https://www.youtube.com/watch?v=-6B62JpdWgs&amp;t=7215s">2:00:15</a>)</li>
</ul></li>
<li>TRAMP:
<ul>
<li><a href="https://utcc.utoronto.ca/~cks/space/blog/programming/EmacsTrampNotes">Notes on using GNU Emacs' Tramp system in an unusual shell environment</a> (<a href="https://lobste.rs/s/vwjrsl/notes_on_using_gnu_emacs_tramp_system">lobste.rs</a>)</li>
</ul></li>
<li>Dired:
<ul>
<li><a href="https://emacs.dyerdwelling.family/emacs/20260416103000-emacs--a-zoomed-in-vc-dir-for-the-current-directory/">James Dyer: A Zoomed in vc dir for the Current Directory in dired</a></li>
</ul></li>
<li>Writing:
<ul>
<li><a href="https://www.reddit.com/r/emacs/comments/1t5kaku/markdowntsmode_got_a_major_overhaul_and_is_now/">markdown-ts-mode got a major overhaul and is now part of Emacs 31</a></li>
<li><a href="https://blog.davep.org/2026/05/08/blogmore-el-v4-5-0.html">Dave Pearson: blogmore.el v4.5.0</a> - add blogmore-set-as-cover
<ul>
<li><a href="https://blog.davep.org/2026/05/07/blogmore-el-v4-4-0.html">v4.4.0</a> - blogmore-become-like</li>
</ul></li>
<li><a href="https://codeberg.org/liberty/just-write/src/branch/main/jw.el">jw.el: Just Write, a microjournaling tool (uses external binary)</a> (<a href="https://mathstodon.xyz/@liberty/116517775716575306">@liberty@mathstodon.xyz</a>)</li>
</ul></li>
<li>Denote:
<ul>
<li><a href="https://www.alcarney.me/blog/2026/organising-series-with-denote-sequence/">Organising Series with denote-sequence — Alex Carney</a> (<a href="https://mastodon.social/@alcarney/116552920982223453">@alcarney</a>)</li>
</ul></li>
<li>Org Mode:
<ul>
<li><a href="https://list.orgmode.org/87zf267i1c.fsf@gmail.com">Org Mode requests: [FR] ox-md: Export custom-id search strings (::#) as anchors</a></li>
<li><a href="https://jonathanchu.is/posts/introducing-grove/">grove.el - an Obsidian-like note-taking mode for Emacs</a> (<a href="https://www.reddit.com/r/emacs/comments/1t4xmcb/groveel_an_obsidianlike_notetaking_mode_for_emacs/">r/emacs</a>, <a href="https://www.reddit.com/r/orgmode/comments/1t4xmsk/groveel_an_obsidianlike_notetaking_mode_for_emacs/">r/orgmode</a>, <a href="https://irreal.org/blog/?p=13792">Irreal</a>, <a href="https://news.ycombinator.com/item?id=48016809">HN</a>, <a href="https://news.ycombinator.com/item?id=48013448">HN</a>)</li>
<li><a href="https://www.youtube.com/watch?v=94jFimnlvNM">mon workflow emacs</a> (18:31)</li>
<li><a href="https://www.youtube.com/watch?v=IygqcQhLhOo">Spacemacs | Org-mode Table Spreadsheet Formula | Productivité</a> (05:19)</li>
<li>Import, export, and integration:
<ul>
<li><a href="https://gitlab.com/jdm204/ox-html-file-embedding">Tiny package for org links which base64 embed files into HTML export for sharing</a> (<a href="https://www.reddit.com/r/orgmode/comments/1t93h3e/tiny_package_for_org_links_which_base64_embed/">Reddit</a>)</li>
<li><a href="https://list.orgmode.org/87bjeqvqc6.fsf@christianmoe.com/">Note about needing to escape things in Org macros</a> (<a href="https://mathstodon.xyz/@pabryan/116537127097802685">@pabryan@mathstodon.xyz</a>)</li>
<li><a href="https://fediverse.tv/w/xhaKt3dwzHuLxeq7FDGZcH">LuaLaTex y fontspec (Orgmode) - FediverseTV</a> (<a href="https://fediverse.tv/w/xhaKt3dwzHuLxeq7FDGZcH">@emacs_org@fediverse.tv</a>)</li>
<li><a href="https://gitlab.com/yugaego/emacs-config/-/blob/main/configs/init-org.el?ref_type=heads#L109">Config for using multiple org-publish projects</a> (<a href="https://fosstodon.org/@yugaego/116549279791127644">@yugaego@fosstodon.org</a>)</li>
<li><a href="https://jan-iversen.de/2026/05/06/blogumzug.html">Blog-Umzug? | Jan Iversen</a> (<a href="https://nerdculture.de/@razorback/116529000129741089">@razorback@nerdculture.de</a>)</li>
<li><a href="https://git.sr.ht/~zelda/sync.el">sync.el - sync Org files with git automatically</a> (<a href="https://www.reddit.com/r/orgmode/comments/1t84mr5/syncel_actually_exists_this_time_no_crypto/">Reddit</a>)</li>
<li><a href="http://en.andros.dev/blog/ba142044/twtxt-vs-org-social-the-evolution-of-an-idea/">Andros Fenollosa: twtxt vs Org Social: the evolution of an idea</a></li>
<li><a href="https://fediverse.tv/w/k2PBKSZ6prEwK2DccNQjvV">Descubriendo la red Org-social - FediverseTV</a> (<a href="https://fediverse.tv/w/k2PBKSZ6prEwK2DccNQjvV">@emacs_org@fediverse.tv</a>)</li>
</ul></li>
<li>Org development:
<ul>
<li><a href="https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/etc/ORG-NEWS?id=004e0828b7758b70ceb0ff47cdd872940c49dcdb">ox-latex.el: New variable org-latex-descriptive-environment</a></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/etc/ORG-NEWS?id=732610714eea47a133ca0bfc163d30a871b25e7b">ob-tangle: Make tangling from archived trees optional</a></li>
</ul></li>
</ul></li>
<li>Completion:
<ul>
<li><a href="https://www.chiply.dev/post-vompeccc-showcase">Emacs Completion Showcase with VOMPECCC (video)</a> (<a href="https://www.youtube.com/watch?v=wyzUXScErjE">YouTube</a> 01:08:43, <a href="https://www.reddit.com/r/emacs/comments/1t57j68/emacs_completion_showcase_with_vompeccc_video/">Reddit</a>, <a href="https://news.ycombinator.com/item?id=48037156">HN</a>, <a href="https://lobste.rs/s/ixlzlj/emacs_completion_showcase_with_vompeccc">lobste.rs</a>)</li>
<li><a href="https://github.com/kn66/vertico-buffer-frame">Follow-up: vertico-buffer-frame, a child-frame experiment for vertico-buffer</a> (<a href="https://www.reddit.com/r/emacs/comments/1t4fu7w/followup_verticobufferframe_a_childframe/">Reddit</a>)</li>
<li><a href="https://github.com/jojojames/fzf-async">fzf-async</a> (<a href="https://www.reddit.com/r/emacs/comments/1t6rs2h/fzfasync/">Reddit</a>)</li>
<li><a href="https://github.com/zenitsu7772000/yuta.el">Yuta.el: native fuzzy finder, Lsp Completion, and command palette for Emacs (uses external CLI tools)</a> (<a href="https://www.reddit.com/r/emacs/comments/1t4jq5h/yutael_is_a_fast_native_fuzzy_finder_lsp/">Reddit</a>)</li>
</ul></li>
<li>Coding:
<ul>
<li><a href="https://www.youtube.com/watch?v=NTHRxu7LFjI">My Doom Emacs setup for Rust development in less than two minutes</a> (01:36)</li>
<li><a href="https://thanosapollo.org/projects/emacs-forgejo/">emacs-forgejo | Thanos Apollo</a> (<a href="https://sigmoid.social/@csantosb/116546018189748980">@csantosb@sigmoid.social</a>)</li>
<li><a href="https://github.com/cobacdavid/hprpl">hprpl-mode</a> for the HP-48G</li>
<li><a href="https://www.reddit.com/r/emacs/comments/1t9ib4b/finally_gotodefinition_w_eglot_on_jvm_languages/">Finally go-to-definition w/ Eglot on JVM languages (Kotlin and Java)! do you know how to improve it?</a></li>
<li><a href="https://github.com/PlugwiseBV/LuaProbe.el">Using our new Lua debbuger: LuaProbe, we made an Emacs package for it</a> (<a href="https://www.reddit.com/r/emacs/comments/1t3bycu/using_our_new_lua_debbuger_luaprobe_we_made_an/">Reddit</a>)</li>
<li><a href="https://www.youtube.com/watch?v=wSKdspfOdSU">Configurando o Windows para Programar Jogos em C | Indie Game Dev</a> (48:38)</li>
<li><a href="https://eshelyaron.com/sweep.html#High_002dlevel-Architecture">Sweep: SWI-Prolog Embedded in Emacs</a> (<a href="https://mastodon.social/@PuercoPop/116522365591905026">@PuercoPop</a>)</li>
<li><a href="https://jao.io/blog/geiser-moved-to-codeberg.html">jao: geiser moved to codeberg</a> - Scheme interfaces</li>
</ul></li>
<li>Math:
<ul>
<li><a href="https://vannilla.org/write/1738103064/article.html">The Simple Emacs Spreadsheet</a></li>
</ul></li>
<li>Shells:
<ul>
<li><a href="https://www.jamescherti.com/emacs-toggle-a-shell-window-shell-pop/">Toggle an Emacs terminal with a single keystroke using shell-pop (Recently Refactored)</a> (<a href="https://www.reddit.com/r/emacs/comments/1t7fp1v/toggle_an_emacs_terminal_with_a_single_keystroke/">Reddit</a>)</li>
<li><a href="https://www.reddit.com/r/emacs/comments/1t821vz/just_a_quick_eat_survey/">Just a quick "Eat" survey</a></li>
<li><a href="https://sr.ht/~hajovonta/termit/">termit: Terminal emulator for Emacs</a> (<a href="https://mastodon.online/@hajovonta/116529852107644722">@hajovonta@mastodon.online</a>)</li>
</ul></li>
<li>Web:
<ul>
<li><a href="https://einar.codeberg.page/speed_improvement_hack_for_dired_with_eww.html">Einar Mostad: Speed improvement hack for dired with EWW</a> - browse-url-handlers</li>
</ul></li>
<li>Mail, news, and chat:
<ul>
<li><a href="https://mastodon.world/@minad/116534494908640147">What improvements would you like to see in elfeed? (@minad@mastodon.world)</a></li>
<li><a href="https://github.com/emacs-elfeed/elfeed/commit/072a609bb7e67c9b300ab22859a9423f7d7734d3">Add elfeed-tree-mode · emacs-elfeed/elfeed@072a609 · GitHub</a> (<a href="https://mastodon.world/@minad/116544681551499931">@minad@mastodon.world</a>)</li>
</ul></li>
<li>Multimedia:
<ul>
<li><a href="https://codeberg.org/contrapunctus/sxiv.el">contrapunctus/sxiv.el: Launch (n)sxiv ((Neo) Simple X Image Viewer)</a> (<a href="https://fe.disroot.org/objects/2b02fc3e-a422-4795-97a8-0d8cfc0e915a">@contrapunctus@fe.disroot.org</a>)</li>
</ul></li>
<li>AI:
<ul>
<li><a href="https://www.reddit.com/gallery/1t8vgxr">I made elisp-quality-ai: AI-friendly quality reports for Emacs Lisp projects</a></li>
<li><a href="https://github.com/deno1011/emacs-mac-setup/blob/main/README.md">Emacs with Org-Mode and Claude for Apple MacBook</a> (<a href="https://news.ycombinator.com/item?id=48065731">HN</a>)</li>
<li><a href="https://github.com/gicrisf/ox-skills">ox-skills: manage AI agent skills in Org-mode</a> (<a href="https://www.reddit.com/r/emacs/comments/1t86yst/oxskills_manage_ai_agent_skills_in_orgmode/">Reddit</a>)</li>
<li><a href="https://infosec.town/notes/alwbcffuqxf2ekpw">display-buffer-alist config for claude-code (@cyberwolf@infosec.town)</a></li>
</ul></li>
<li>Community:
<ul>
<li><a href="https://www.reddit.com/r/emacs/comments/1t438si/fortnightly_tips_tricks_and_questions_20260505/">Fortnightly Tips, Tricks, and Questions — 2026-05-05 / week 18</a></li>
<li><a href="https://sachachua.com/blog/2026/05/emacs-carnival-may-2026-may-i-recommend/">Sacha Chua: Emacs Carnival May 2026: "May I recommend…"</a>
<ul>
<li><a href="https://www.finaprosadigital.com/2026-05-02-may-emacs-carnival.html">May Emacs Carnival</a>: Carlos Pajuelo</li>
<li><a href="https://idlip.in/posts/may-i-recommend/">May I Recommend EWM | Dilip's Log</a></li>
<li><a href="https://sachachua.com/blog/2026/05/from-david-dimagid-what-we-talk-about-when-we-talk-about-recommending-emacs-packages/">Sacha Chua: From David Dimagid: What we talk about when we talk about recommending Emacs packages</a></li>
<li><a href="https://vannilla.org/write/1778277936/article.html">May I recommend… escaping the minibuffer</a> (<a href="https://mibl.vannilla.org/@vanni/statuses/01KR4TJ3RG34K6W9A43ES5FH4Q">@vanni@mibl.vannilla.org</a>)</li>
<li><a href="https://giampaolo.guiducci.it/posts/2026-05-09-may-i-recommend-vibemacsing/">May I recommend… vibemacsing? | Giampaolo Guiducci</a> (<a href="https://fosstodon.org/@gosub/116548774985172047">@gosub@fosstodon.org</a>)</li>
<li><a href="https://mstempl.netlify.app/post/may-i-recommend/">May I recommend… to only add items to your init files you understand and document?</a> Martin Stemplinger</li>
<li><a href="https://curtismchale.ca/2026/05/05/emacs-carnival-may-i-recommend">Curtis McHale: Emacs Carnival: May I recommend…</a></li>
</ul></li>
<li><a href="https://kelar.org/~bandali/gnu/emacs/emacs-chat-202605.html">Amin Bandali: Emacs Chat with Sacha Chua</a> (<a href="https://www.youtube.com/watch?v=ZiTQt8q1Ybc">YouTube</a> 01:12:31, <a href="https://irreal.org/blog/?p=13797">Irreal</a>, <a href="https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/">Sacha</a>)</li>
<li><a href="https://sachachua.com/blog/2026/05/may-7-emacs-chat-with-shae-erisson/">Sacha Chua: Emacs Chat 22: Shae Erisson</a> (<a href="https://www.youtube.com/watch?v=Ovya0O2otbU">YouTube</a>, 01:02:36)</li>
<li><a href="https://www.reddit.com/r/emacs/comments/1t43rrt/i_just_dont_get_it/">I just dont get it…</a> - long discussion about Emacs Lisp and customization</li>
<li><a href="https://www.youtube.com/watch?v=iuwn8GpRj7w">Emacs ATX Meetup. May 2026. GNU Hyperbole.</a> (01:44:31)</li>
<li><a href="https://fosstodon.org/@chiply/116518555422356975">Thread about what makes Emacs easy for you (@chiply@fosstodon.org)</a></li>
<li><a href="https://toobnix.org/w/mu2Wm3Y7F6dBbqBivkXL1x">Kent Pitman, Ramin Honary, Screwlisp #climate #emacs autocomplete #lisp #unix_surrealism #logic #lispyGopherClimate - toobnix</a> (<a href="https://gamerplus.org/@screwlisp/116524570149752933">@screwlisp@gamerplus.org</a>)</li>
<li><a href="https://curtismchale.ca/2026/05/05/the-gravitational-pull-of-familiar-tools">Curtis McHale: The gravitational pull of familiar tools</a></li>
</ul></li>
<li>Other:
<ul>
<li><a href="https://codeberg.org/veer66/ya-sort-lines">veer66/ya-sort-lines: Yet-another sort lines - Codeberg.org</a> (<a href="https://mstdn.io/@veer66/116539186622279157">@veer66@mstdn.io</a>)</li>
<li><a href="https://codeberg.org/jamesendreshowell/ramb">jamesendreshowell/ramb: Emacs package Really Actually Make Backups - Codeberg.org</a> (<a href="https://fediscience.org/@jameshowell/116522614001195322">@jameshowell@fediscience.org</a>)</li>
<li><a href="https://protesilaos.com/codelog/2026-05-02-emacs-buffer-to-pdf-new-package/">Protesilaos: Emacs: save any buffer as PDF (my new buffer-to-pdf package)</a></li>
<li><a href="http://corwin.bru.st/2026-05-08-last-rev.pl/">Corwin Brust: last-rev.pl</a> - find the most recent commit to each Emacs branch (or other Savannah projects)</li>
<li><a href="https://www.jamescherti.com/compiling-emacs/">James Cherti: A Technical Guide for Compiling Emacs and its Packages for Maximum Performance on UNIX or GNU/Linux systems</a></li>
<li><a href="https://protesilaos.com/codelog/2026-05-04-emacs-keyboard-ergonomics/">Protesilaos: Re: Emacs and keyboard ergonomics</a> (<a href="https://irreal.org/blog/?p=13788">Irreal</a>)</li>
</ul></li>
<li>Emacs development:
<ul>
<li>emacs-devel: <a href="https://yhetil.org/emacs-devel/CAM=F=bBAT3mTHqqut2fvYN=SJ=NNqBisePTWGjO-XpzRAO7=9w@mail.gmail.com/">Re: Tail recursion - Lynn Winebarger</a> - emacs-31 probably not going to have igc</li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=66729f3e5080f8853393e5f88ce6f062b45164b7">New variable 'completion-frontend-properties' (bug#80990)</a></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=0d287aa2761af39f64d5d0d7f4e6b74430ec8b74">Bump master Emacs version to 32.0.50</a></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=d24b10ca75f49217f8585ce9c0fb53209693f882">Introduce 'margin' face for window margin background</a></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=ed1fe2ca9590a97aee62f74630f7f1f9d795bcb2">nadvice.el: Make it easier to find how to change an interactive-form</a></li>
<li><a href="https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=a952324e9be37869158e8a9cc4f676fa6113a343">keyboard.c: Allow SIGINT to `quit` in batch mode, instead of exit</a></li>
</ul></li>
<li>New packages:
<ul>
<li><a target="_blank" href="https://melpa.org/#/apple-container-tramp">apple-container-tramp</a>: TRAMP integration for apple container (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/claude-code-context">claude-code-context</a>: Share buffer context with Claude Code (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/folgezett">folgezett</a>: Folgezettel IDs for org-roam (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/gnus-browse-url-in-article">gnus-browse-url-in-article</a>: Smarter browse-url for Gnus articles (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/har-viewer">har-viewer</a>: Major mode for viewing HTTP Archive (HAR) files (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/indigo">indigo</a>: Emacs interface to the Indigo cheminformatics library (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/nucleo-completion">nucleo-completion</a>: Nucleo-backed completion style (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/shannon-max">shannon-max</a>: Analyze your keybindings with information theory (MELPA)</li>
<li><a target="_blank" href="https://melpa.org/#/verdict-dart">verdict-dart</a>: Dart runner for verdict (MELPA)</li>
</ul></li>
</ul>

<p>
Links from <a href="https://www.reddit.com/r/emacs">reddit.com/r/emacs</a>, <a href="https://www.reddit.com/r/orgmode">r/orgmode</a>, <a href="https://www.reddit.com/r/spacemacs">r/spacemacs</a>, <a href="https://mastodon.social/tags/emacs">Mastodon #emacs</a>, <a href="https://bsky.app/hashtag/emacs">Bluesky #emacs</a>, <a href="https://hn.algolia.com/?query=emacs&amp;sort=byDate&amp;prefix&amp;page=0&amp;dateRange=all&amp;type=story">Hacker News</a>, <a href="https://lobste.rs/search?q=emacs&amp;what=stories&amp;order=newest">lobste.rs</a>, <a href="https://programming.dev/c/emacs?dataType=Post&amp;page=1&amp;sort=New">programming.dev</a>, <a href="https://lemmy.world/c/emacs">lemmy.world</a>, <a href="https://lemmy.ml/c/emacs?dataType=Post&amp;page=1&amp;sort=New">lemmy.ml</a>, <a href="https://planet.emacslife.com">planet.emacslife.com</a>, <a href="https://www.youtube.com/playlist?list=PL4th0AZixyREOtvxDpdxC9oMuX7Ar7Sdt">YouTube</a>, <a href="http://git.savannah.gnu.org/cgit/emacs.git/log/etc/NEWS">the Emacs NEWS file</a>, <a href="https://emacslife.com/calendar/">Emacs Calendar</a>, and <a href="https://lists.gnu.org/archive/html/emacs-devel/2026-05">emacs-devel</a>. Thanks to Andrés Ramírez for emacs-devel links. Do you have an Emacs-related link or announcement? Please e-mail me at <a href="mailto:sacha@sachachua.com">sacha@sachachua.com</a>. Thank you!
</p>
<div><a href="https://sachachua.com/blog/2026/05/2026-05-11-emacs-news/index.org">View Org source for this post</a></div>
<p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2026%2F05%2F2026-05-11-emacs-news%2F&amp;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></body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[James Cherti: A Technical Guide to Compiling Emacs for Performance on Linux and Unix systems]]></title>
            <link>https://www.jamescherti.com/compiling-emacs/</link>
            <guid>https://www.jamescherti.com/compiling-emacs/</guid>
            <pubDate>Mon, 11 May 2026 11:52:16 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>Most Linux distributions ship generic binaries compiled to run safely on a vast array of older hardware configurations. While this ensures broad compatibility, it sacrifices the speed that comes from using the specific, modern instruction sets of your processor. Building Emacs directly from source allows instructing the compiler to generate machine code targeted at your CPU architecture, resulting in a faster and more efficient runtime environment.</p>



<p><strong>Before we dive in, please consider sharing this article on your website, blog, Mastodon, Reddit, X, Linkedin, or other social media platforms. Sharing it will help other Emacs users discover how to properly build Emacs for performance.</strong></p>



<p>Beyond raw hardware optimization, building from source enables dropping decades of legacy compatibility layers and embracing modern desktop technologies. For example, Wayland users can configure the build to bypass old X11 display protocols in favor of a Wayland environment, ensuring smoother rendering and better system integration.</p>



<p>Additionally, this article details how to optimize the internal native Lisp compiler, which transforms Lisp packages into machine code to ensure that every Emacs package in your configuration operates at its maximum potential speed.</p>



<p>Here is the step-by-step process for building a highly optimized Emacs binary and packages.</p>



<h2>Installing dependencies</h2>



<h3>Arch Linux</h3>



<p>On Arch Linux, the cleanest and most native method to resolve build dependencies is to use the official Emacs <code>PKGBUILD</code>, which automatically read the official dependency list and install them:</p>


<pre><span><code class="hljs language-plaintext">mkdir -p ~/emacs-deps
cd ~/emacs-deps
wget https://gitlab.archlinux.org/archlinux/packaging/packages/emacs/-/raw/main/PKGBUILD
makepkg --syncdeps --nobuild</code></span></pre>


<p>NOTE: Once <code>makepkg</code> finishes installing the dependencies, you can safely delete the <code>~/emacs-deps</code> directory.</p>



<h3>Debian, Mint and Ubuntu</h3>



<p>On Debian-based systems, the most efficient method to gather dependencies is to use the package manager to automatically fetch them based on the distribution’s source package. You must first ensure that source repositories are enabled:</p>



<ul>
<li>Open <code>/etc/apt/sources.list</code> with root privileges in your text editor.</li>



<li>Find the lines starting with <code>deb-src</code> (Read: <a href="https://wiki.debian.org/SourcesList#sources.list_format">“sources.list format</a>” on Debian Wiki) and uncomment them by removing the <code>#</code> at the beginning of the line.</li>



<li>Update your package lists and download the install Emacs dependencies:</li>
</ul>


<pre><span><code class="hljs">sudo apt update
sudo apt build-dep emacs</code></span></pre>


<h3>Other Linux Distributions (Generic)</h3>



<p>If you are using a distribution not listed above, you will need to use your distribution’s specific package manager to install the required development libraries. Look for packages that include the library headers, typically suffixed with -dev or -devel.</p>



<p>Here is the master list of upstream library names required to compile this specific Wayland and Native-Comp optimized build:</p>



<ul>
<li><strong>Core Build Tools:</strong> gcc, make, autoconf, automake, pkg-config (or pkgconf), git, texinfo</li>



<li><strong>Native Compilation Engine:</strong> libgccjit (Ensure this matches your GCC version)</li>



<li><strong>System and Core Libraries:</strong> glib2, gnutls, zlib, ncurses, sqlite3, tree-sitter, gmp</li>



<li><strong>Graphics and Wayland Toolkit (PGTK):</strong> gtk3, cairo, harfbuzz, pango, dbus</li>



<li><strong>Image Formats:</strong> libjpeg (or libjpeg-turbo), libpng, libtiff, giflib, libwebp, librsvg2, lcms2</li>



<li><strong>Fonts and Text Shaping:</strong> fontconfig, freetype2, libotf, m17n-lib, libxml2</li>
</ul>



<h2>Optimizing the Native Lisp Compiler</h2>



<h3>Fine-Tuning Native Compilation</h3>



<p>Before building Emacs with native compilation support, we will optimize how Emacs transforms Lisp packages into machine code. This is managed via the <code>native-comp-compiler-options</code> variable. While the main Emacs build uses your global <code>CFLAGS</code>, this variable specifically instructs <code>libgccjit</code> on how to handle every <code>.el</code> file it encounters.</p>



<p>Add the following to your <code>early-init.el</code> file:</p>


<pre><span><code class="hljs language-lisp"><span class="hljs-comment">;; Display the architecture using:</span>
<span class="hljs-comment">;;   gcc -march=native -Q --help=target | grep march</span>
<span class="hljs-comment">;;</span>
<span class="hljs-comment">;; The above command asks the compiler to resolve native for your current CPU</span>
<span class="hljs-comment">;; and display the resulting target. For example, if the output shows</span>
<span class="hljs-comment">;; -march=skylake, you know that skylake is the identifier you should pass to</span>
<span class="hljs-comment">;; -mtune and -march.</span>
(<span class="hljs-name">setq</span> my-cpu-architecture <span class="hljs-string">"CHANGE_THIS_TO_YOUR_ARCHITECTURE"</span>)

<span class="hljs-comment">;; `native-comp-compiler-options' specifies flags passed directly to the C</span>
<span class="hljs-comment">;; compiler (for example, GCC) when compiling the Lisp-to-C output</span>
<span class="hljs-comment">;; produced by the native compilation process. These flags affect code</span>
<span class="hljs-comment">;; generation, optimization, and debugging information.</span>
(<span class="hljs-name">setq</span> native-comp-compiler-options `(;; The most meaningful optimizations:
                                     <span class="hljs-string">"-O2"</span>
                                     ,(format <span class="hljs-string">"-mtune=%s"</span> my-cpu-architecture)
                                     ,(format <span class="hljs-string">"-march=%s"</span> my-cpu-architecture)
                                     ;; Reduce .eln size and compilation
                                     ;; overhead.
                                     <span class="hljs-string">"-g0"</span>
                                     ;; Good defensive choice for Emacs
                                     ;; stability.
                                     <span class="hljs-string">"-fno-omit-frame-pointer"</span>
                                     <span class="hljs-string">"-fno-finite-math-only"</span>))

(<span class="hljs-name">setq</span> native-comp-driver-options '(;; -Wl,-z,pack-relative-relocs compresses
                                   ;; relocation tables to reduce file size and
                                   ;; slightly improve load times.
                                   <span class="hljs-string">"-Wl,-z,pack-relative-relocs"</span>
                                   ;; -Wl,-O2 applies standard linker-level
                                   ;; optimizations (like string merging) to the
                                   ;; generated shared object.
                                   <span class="hljs-string">"-Wl,-O2"</span>
                                   ;; -Wl,--as-needed prevents the linker from
                                   ;; recording dependencies on libraries that
                                   ;; are not actually used by the code.
                                   <span class="hljs-string">"-Wl,--as-needed"</span>))</code></span></pre>


<p><strong>IMPORTANT:</strong> Change <code>CHANGE_THIS_TO_YOUR_ARCHITECTURE</code> to your specific architecture. Run the following command to display the CPU architecture:</p>


<pre><span><code class="hljs">gcc -march=native -Q --help=target | grep march</code></span></pre>


<p><strong>The above command asks the compiler to resolve <code>native</code> for your current CPU and display the resulting target. For example, if the output shows <code>-march=skylake</code>, then replace <code>CHANGE_THIS_TO_YOUR_ARCHITECTURE</code> with <code>skylake</code>.</strong></p>



<p>(If you prefer automatic CPU architecture detection, refer to the comments section below. I shared a function that detects the CPU architecture using gcc and adds it to the configuration.)</p>



<p><strong>NOTE:</strong> <em>Avoid adding <code>-mtune=native</code> and/or <em><code>-march=native</code></em> to the <code>native-comp-compiler-options</code> variable. While these flags work in global <code>CFLAGS</code>, libgccjit, the library responsible for native compilation, often fails to resolve the <code>native</code> keyword correctly. This happens because the JIT interface does not always trigger the same host-probing logic as the standalone GCC driver.</em></p>



<p>The rationale behind the selection of these flags is as follows</p>



<ul>
<li>The choice of <code>-O2</code> is an intentional balance. While <code>-O3</code> may provide small performance gains in some workloads, it can also increase binary size and occasionally reduce responsiveness. <code>-Ofast</code> is generally discouraged because it enables aggressive floating-point optimizations.</li>



<li>Using <code>-g0</code> disables the generation of debug symbols for .eln files, which reduces their size on disk and speeds up the compilation process itself.</li>



<li><code>-fno-omit-frame-pointer</code> The Emacs developers recommend using this flag to disable omit-frame-pointer. Although enabling omit-frame-pointer frees up a general-purpose CPU register, it does not yield significant performance gains on modern architectures and can lead to bugs that are difficult to debug. According to Eli Zaretskii, an Emacs developer: “See bug#76180. This is in the context of the igc branch, where <code>omit-frame-pointer</code> is particularly troublesome, though it also causes problems in other situations. For further details, see etc/DEBUG in the Emacs source tree.”</li>



<li>The <code>-fno-finite-math-only</code> flag prevents the compiler from assuming that floating-point operations never produce NaN or infinity values. This flag is mostly defensive because GCC does not enable -ffinite-math-only at -O2 by default, but it can help avoid unsafe assumptions if additional aggressive optimization flags are introduced later.</li>
</ul>



<p>For users looking to ensure a fully optimized environment, the <strong><a href="https://github.com/jamescherti/compile-angel.el">compile-angel</a></strong> package is a valuable addition to the native compilation workflow. Integrating compile-angel guarantees that every .el file in your load path, including your own configuration and manually managed .el files, is properly byte and natively compiled. This ensures a consistent performance boost across the entire editor.</p>



<h3>Purging the Native Cache to Force JIT Recompilation</h3>



<p>After modifying the <code>native-comp-compiler-options</code> and/or <code>native-comp-driver-options</code> variables, you must force Emacs to rebuild your packages. <strong>Ensure Emacs is closed and delete all existing <code>.eln</code> binaries</strong> using the following command:</p>


<pre><span><code class="hljs language-plaintext">find ~/.emacs.d/ -name '*.eln' -delete</code></span></pre>


<p>Because Emacs uses a deferred compilation engine (Native JIT compiler), you do not need to manually trigger a build script. Simply launch Emacs and begin your normal workflow. As Emacs loads your packages and detects the missing <code>.eln</code> files, it will spin up background threads to recompile them using your new optimization flags.</p>



<h2>Compiling Emacs for Performance</h2>



<h3>Step 1: Cloning and Preparing the Source</h3>



<p>To build Emacs, you must first obtain the source code from the official mirror and switch to a stable release branch:</p>


<pre><span><code class="hljs language-plaintext">git clone https://github.com/emacs-mirror/emacs
cd emacs
git checkout "emacs-30.2"</code></span></pre>


<p><strong>NOTE:</strong> The official Savannah Git repository at <em>https://git.savannah.gnu.org/git/emacs.git</em> can occasionally be slow or unreliable, so this guide uses the official GitHub mirror instead.</p>



<p>We target a specific release tag like <code>emacs-30.2</code> (If you desire to install another version, you can display tags using the <code>git tag</code> command) to ensure a stable foundation. Building from a tagged release, rather than the bleeding-edge development branch like the <code>master</code> branch, minimizes the risk of build failures or experimental regressions that could impact your daily productivity.</p>



<p>Standard cleanup is often insufficient when switching branches or recovering from a failed build. Execute the following commands to ensure a pristine environment where no residual artifacts can interfere with the new build:</p>


<pre><span><code class="hljs language-plaintext">git reset --hard HEAD
git clean -f -d -x
rm -fr .git/hooks/*</code></span></pre>


<p><em>(Executing these commands acts as the ultimate factory reset for your repository, which is important when switching between major Emacs versions. Emacs has a highly complex build process where the C core compiles its own Lisp files; if leftover artifacts from a previous configuration, such as cached object files, old Makefiles, or stale byte-compiled .elc scripts, git hooks, are left behind, they can silently contaminate the new build and cause segmentation faults or compile-time errors. Together, these commands guarantee a pristine, predictable environment.)</em></p>



<p><strong>Once inside the repository, all subsequent configuration and compilation commands are executed from this directory.</strong></p>



<h3>Step 2: Generating the Configuration Script</h3>



<p>Emacs uses the Autotools build system, which requires generating the final configuration script before it can be used:</p>


<pre><span><code class="hljs language-bash">./autogen.sh</code></span></pre>


<p>This shell script reads the developer configuration files provided in the repository and generates the final <code>./configure</code> script. It sets up the necessary infrastructure to inspect your specific environment, locate system libraries, and prepare the Makefile.</p>



<h3>Step 3: Setting Compiler and Linker Flags</h3>



<p>To enhance runtime performance, we must export specific variables that instruct the C compiler and linker to optimize the resulting binary for the host CPU:</p>


<pre><span><code class="hljs language-bash"><span class="hljs-built_in">export</span> CFLAGS=<span class="hljs-string">"-O2 -pipe -march=native -mtune=native -fno-omit-frame-pointer -fno-plt -flto=auto"</span>
<span class="hljs-built_in">export</span> LDFLAGS=<span class="hljs-string">"-Wl,-O2 -Wl,-z,now -Wl,-z,relro -Wl,--sort-common -Wl,--as-needed -Wl,-z,pack-relative-relocs -flto=auto -O2"</span></code></span></pre>


<p>The <code>CFLAGS</code> variable tells the compiler to apply safe, general-purpose optimizations (<code>-O2</code>), optimize instruction scheduling for the specific CPU compiling the code (<code>-march=native</code> and <code>-mtune=native</code>), store the metadata necessary for the linker to later perform cross-module optimization (<code>-flto=auto</code>), disable omit-frame-pointer (<code>-fno-omit-frame-pointer</code>), use memory pipes instead of temporary files to speed up the build (<code>-pipe</code>), and remove indirect PLT calls to external functions, improving runtime call efficiency at the cost of slightly higher startup and dynamic loading overhead (<code>-fno-plt</code>). </p>



<p>The <code>LDFLAGS</code> variable instructs the linker to apply additional optimization passes to the final executable (<code>-Wl,-O2</code>), group common symbols to reduce duplicate storage (<code>-Wl,--sort-common</code>), avoid linking unused shared libraries (<code>-Wl,--as-needed</code>), reduces binary size by performing a global analysis to inline functions and remove dead code across the entire program (<code>-flto=auto</code>), compress relative relocations to reduce relocation overhead and binary size (<code>-Wl,-z,pack-relative-relocs</code>), resolve all dynamic symbols at startup, trading slightly slower launch time for faster, more consistent runtime execution (<code>-Wl,-z,now -Wl,-z,relro</code>). Together, these flags help produce a smaller, more memory-efficient executable with improved startup and runtime performance.</p>



<p><strong>NOTE 1:</strong> To successfully build Emacs using Link-Time Optimization (LTO) <code>-flto</code>, It is recommended to maintain a consistent optimization level, such as <code>-O2</code>, across both the compilation (<code>CFLAGS</code>) and linking stages (<code>LDFLAGS</code>). When enabling <code>-flto=auto</code> in your <code>CFLAGS</code>, the compiler emits GIMPLE intermediate representation; the actual transformation into an optimized executable is deferred until the linking phase, where the GCC driver re-invokes internal optimization passes. While modern GCC versions can often infer the correct heuristics from metadata embedded within the object files if a link-time flag is missing, explicitly including <code>-O2</code> in your <code>LDFLAGS</code> is recommended for a predictable, deterministic build. This practice ensures that the whole-program analysis phase executes the exact same optimization level as the initial compilation. (<a href="https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html">Source</a>: “To use the link-time optimizer, <code>-flto</code> and optimization options should be specified at compile time and during the final link. It is recommended that you compile all the files participating in the same link with the same options and also specify those options at link time…”)</p>



<p><strong>NOTE 2:</strong> You must ensure <code>CC</code> are exported to the exact <code>gcc</code> version that matches your libgccjit version. For example: <code>export CC="/usr/bin/gcc-11"</code>.</p>



<h3>Step 4: Configuring the Build</h3>



<p>We run the configure script to select exactly which features to include.</p>



<p>For X11 users:</p>


<pre><span><code class="hljs language-plaintext">./configure \
  --with-x \
  --with-x-toolkit=gtk3 \
  --without-toolkit-scroll-bars \
  --with-cairo \
  --without-xft \
  --with-harfbuzz \
  --without-libotf \
  --with-gnutls \
  --without-xdbe \
  --without-xim \
  --without-gpm \
  --disable-gc-mark-trace \
  --enable-link-time-optimization \
  --with-gsettings \
  --with-modules \
  --with-threads \
  --with-libgmp \
  --with-xml2 \
  --with-tree-sitter \
  --with-zlib \
  --without-included-regex \
  --with-native-compilation \
  --with-file-notification=inotify \
  --without-compress-install</code></span></pre>


<p>For Wayland users:</p>


<pre><span><code class="hljs language-plaintext">./configure \
  --without-x \
  --with-pgtk \
  --with-toolkit-scroll-bars \
  --with-cairo \
  --without-xft \
  --with-harfbuzz \
  --without-libotf \
  --with-gnutls \
  --without-xdbe \
  --without-xim \
  --without-gpm \
  --disable-gc-mark-trace \
  --enable-link-time-optimization \
  --with-gsettings \
  --with-modules \
  --with-threads \
  --with-libgmp \
  --with-xml2 \
  --with-tree-sitter \
  --with-zlib \
  --without-included-regex \
  --with-native-compilation \
  --with-file-notification=inotify \
  --without-compress-install</code></span></pre>


<p>The rationale behind the selection of these flags is as follows</p>



<ul>
<li><code>--enable-link-time-optimization</code> Instructs the build system to natively apply link-time optimization. This ensures the Emacs build scripts coordinate the optimization properly across all compiled object files to produce the fastest possible executable. When you pass this to <code>./configure</code>, the build system actively probes your environment. If you look at the <code>configure.ac</code> script, you will see it attempts to find the number of available CPU cores. It then automatically injects <code>-flto=N</code> (where N is your core count) into the build flags. More importantly, this flag ensures that archiving tools like <code>ar</code> and <code>ranlib</code> are configured to use the correct LTO plugins.</li>



<li><code>--disable-gc-mark-trace</code>: Disable the GC mark trace buffer for about 5% better garbage collection performance. It removes debugging code from the garbage collector marking phase. This provides a reduction in overhead during garbage collection cycles, leading to a more responsive experience during memory-intensive tasks.</li>



<li><code>--with-native-compilation</code> Enable native compilation. (I omitted the aot flag to instruct the build system to skip compiling the built-in Lisp files during the make step. Instead, Emacs defers this work until runtime, where it will use the optimizations in <code>native-comp-compiler-options</code> and <code>native-comp-driver-options</code> while compiling all .el files the first time Emacs is launched.)</li>



<li><code>--with-cairo</code> and <code>--with-harfbuzz</code> enable modern text rendering.</li>



<li><code>--without-compress-install</code> By default, Emacs compresses its installed Lisp files to save disk space. Using this flag keeps the files uncompressed. The benefit is faster load times when Emacs needs to read these files from disk, as it skips the decompression step entirely. (On modern SSDs, loading compressed .el.gz files generally takes a bit more time than loading uncompressed files. While compression definitely saved time on older spinning hard drives by reducing I/O waits, modern solid-state drives can read uncompressed data at gigabytes per second. That being said, the actual performance gain of using uncompressed files is often negligible in practice. This is especially true if you are compiling all your .el files, because Emacs prefers to load the compiled byte-code .elc or native code .eln)</li>



<li><code>--without-xft</code> Disable xft because modern Emacs rendering no longer needs it. Modern GTK builds of Emacs use Cairo + HarfBuzz handle rendering.</li>



<li><code>--without-included-regex</code> Makes Emacs use the system libc regex implementation. On contemporary Linux systems using glibc, the system regex engine is usually better optimized and maintained than Emacs’s bundled GNU regex implementation.</li>



<li><code>--with-libgmp</code> Enables GMP, the GNU Multiple Precision Arithmetic Library, an optimized engine Emacs relies on to calculate arbitrary-precision integers (bignums) at bare-metal speeds. Modern Emacs workflows constantly process massive numbers in the background. If you disable this flag or fail to install the system library, Emacs is forced to fall back on mini-gmp, a generic, software-only C implementation designed strictly for portability rather than speed.</li>



<li><strong><code>--without-xim</code></strong>: Disable XIM, a legacy X Input Method protocol used primarily for typing complex languages (like Chinese, Japanese, or Korean) on old X11 systems. If you use GTK3/Wayland, modern input methods handle this instead. Disabling this is recommended for Wayland/PGTK users as it removes unnecessary X11-specific code.</li>



<li><code>--with-file-notification=inotify</code> Guarantees that the build will use the Linux kernel’s efficient event-watching API rather than falling back to slow, resource-heavy polling if the detection fails.</li>



<li><code>--with-gsettings</code> Enable communication with the GTK configuration storage system. This allows inheriting system-wide preferences for themes, fonts, antialiasing hints…</li>



<li><code>--without-libotf</code>: Disables the legacy OpenType Font library. This is recommended for modern builds that use HarfBuzz (<code>--with-harfbuzz</code>), as HarfBuzz handles text shaping more efficiently. Disabling this library reduces binary size without sacrificing font quality in modern desktop environments.</li>



<li><code>--with-gnutls</code>: Enables secure network communication. This is required for secure package installation from MELPA/ELPA and for browsing HTTPS websites via EWW.</li>



<li><code>--without-xdbe</code>: Disables the X11 Double Buffer Extension. This protocol is redundant for modern builds because both the PGTK (Wayland) and GTK3 (X11) layers handle window buffering internally. Disabling it simplifies the binary and ensures Emacs uses modern rendering paths.</li>



<li><code>--without-gpm</code> Disable General Purpose Mouse (GPM), a background service that provides mouse support for the Linux console (the text-only TTY you see before logging into a graphical desktop). Unless you plan to use Emacs in a bare-metal Linux console (outside of a terminal emulator like Alacritty, Foot, or GNOME Terminal), GPM is unnecessary. Modern terminal emulators use their own internal protocols for mouse interaction that do not rely on the GPM daemon.</li>
</ul>



<h3>Additional flags to pass to ./configure</h3>



<p>If your workflow is primarily text-based, you can significantly reduce the number of external libraries linked to your binary. However, each omission comes with a specific trade-off:</p>



<ul>
<li><code>--without-sound</code> Disables support for audio notifications. You will not hear the audible system bell or sound cues from productivity packages like Pomodoro timers or chat clients.</li>



<li><code>--without-libsystemd</code> Disables the ability for Emacs to communicate with systemd. You cannot use advanced systemd service features, such as Type=notify, which allows systemd to know exactly when the Emacs daemon is fully loaded and ready.</li>



<li><code>--without-dbus</code>: Disables D-Bus integration in Emacs. This produces a slightly leaner build, but removes integration with desktop services that rely on D-Bus. Depending on the desktop environment and enabled packages, this can affect desktop notifications, interaction with services such as GNOME Keyring, file manager integration, power and network state notifications, and various portal-based desktop features. It is generally safe on minimal Emacs GUI builds or terminal-only setups, but many modern Linux desktop environments expect D-Bus support.</li>



<li><strong><code>--without-gconf</code></strong> Disables support for GConf. This is a deprecated GNOME configuration system that was replaced by GSettings. Disabling it ensures your build is not carrying legacy, obsolete desktop integrations.</li>



<li><code>--without-sqlite3</code> Disables the built-in SQLite engine. This breaks modern packages that rely on a local database for performance, such as <code>org-roam</code> or certain mail indexers.</li>



<li><code>--without-m17n-flt</code> Disables the m17n library for complex text layout. While fine for English-only workflows, this will cause rendering issues (incorrect character joining or positioning) for complex scripts like Indic or Thai.</li>



<li><code>--without-selinux</code> Disables Security-Enhanced Linux support. On systems where SELinux is active, Emacs will be unable to preserve or manage SELinux security contexts when creating or copying files, potentially leading to permission issues or security policy violations.</li>



<li><strong><code>--without-libsmack</code></strong> Disables Smack security support. Similar to SELinux, if your Linux distribution uses the Smack kernel security module, disabling this prevents Emacs from managing those specific security contexts on files.</li>



<li><code>--disable-build-details</code>: Omits build metadata, such as your machine’s hostname and the compilation timestamp, from the final executable. While this doesn’t provides performance or startup speed benefits, it ensures a “reproducible build” and prevents your personal system details from leaking if you share your compiled binary.</li>



<li><code>--without-gif</code>, <code>--without-jpeg</code>, <code>--without-png</code>, <code>--without-rsvg</code>, <code>--without-tiff</code>, <code>--without-xpm</code>, <code>--without-webp</code> Disabling these prevents Emacs from linking against heavy image processing libraries. Emacs will be unable to render these image formats natively. This breaks functionality for image-heavy modes, such as <code>image-mode</code>, viewing PDFs via <code>pdf-tools</code>, or displaying mathematical LaTeX previews.</li>



<li><code>--without-imagemagick</code> Prevent Emacs from using this large dependency for complex image transformations. You lose the ability to perform advanced image manipulation (like dynamic resizing or rotation of certain formats) within Emacs buffers.</li>



<li><code>--without-lcms2</code> Remove the Little CMS color management layer. Images may appear with slightly incorrect colors on high-quality displays, as Emacs will ignore ICC color profiles embedded in files.</li>



<li><code>--without-xinput2</code>: Disables the modern X11 input extension. <strong>Warning:</strong> If you are building for X11, disabling this will break pixel-precision smooth scrolling for trackpads and mouse wheels, forcing Emacs to use choppy line-by-line scrolling. This flag does nothing for Wayland/PGTK builds and offers no performance benefits.</li>



<li><code>--disable-acl</code>: Disables support for Access Control Lists. Disabling this reduces the number of system calls Emacs performs during file operations. This is a good choice for single-user systems where standard Unix permissions are sufficient.</li>



<li><code>--disable-xattr</code>: Disables support for Extended File Attributes. Only keep this enabled if you rely on SELinux or filesystem-level file tagging.</li>



<li><code>--without-kerberos --without-pop --without-kerberos5 --without-hesiod --without-mail-unlink</code>: These flags disable support for ancient mail retrieval methods, directory services, and local mail spool manipulation. Because modern Emacs mail setups rely on external synchronization, disabling these ensures the build script does not waste time searching for legacy network libraries and keeps the binary entirely free of dead mail code.</li>
</ul>



<h3>Step 5: Compiling the Source Code</h3>



<p>With the configuration complete, the next step is to compile the C source files and the core Emacs Lisp files:</p>


<pre><span><code class="hljs language-plaintext">make -j "$(nproc)" -l "$(nproc --ignore=1)"</code></span></pre>


<ul>
<li><code>-j $(nproc)</code>: This sets the maximum number of concurrent jobs to the number of CPU cores. Make will attempt to run up to the the number of CPU cores compilation commands in parallel. This is an upper bound; actual concurrency may be lower depending on dependencies and system load.</li>



<li><code>-l $(nproc --ignore=1)</code>: This sets a load average limit. <code>$(nproc --ignore=1)</code> returns the number of available CPU cores minus 1. Example: on an 8-core system, this evaluates to <code>7</code>. So effectively, <code>-l 7</code> means: <em>do not start new jobs if system load average is 7 or higher</em>. Make uses system load average (typically 1-minute load average) as a throttling mechanism.</li>
</ul>



<p>On a low-load system, Make may run close to 48 jobs in parallel. Under high CPU pressure, Make will throttle and pause scheduling new jobs until load decreases.</p>



<p><em>(Related article: Similar to <code>make -j</code> command above for Emacs compilation, read “<a href="https://www.jamescherti.com/emacs-native-compilation-config-jobs/">Enabling Emacs native compilation and dynamically adjusting the number of Elisp files compiled in parallel</a>“)</em></p>



<h3>Step 6: Installing the Stripped Binary</h3>



<p>The final step is to copy the compiled binary and its associated files to their proper locations on your file system.</p>


<pre><span><code class="hljs language-plaintext">sudo make install-strip</code></span></pre>


<p>While the standard <code>make install</code> simply copies the compiled files, <code>make install-strip</code> performs an additional optimization. It strips debugging symbols from the final executable. Removing these symbols reduces reduces binary size on disk.</p>



<h2>Verifying Emacs Build Features</h2>



<p>After successfully compiling Emacs from source, execute the resulting Emacs binary.</p>



<p>Once the editor is running, it is good practice to verify that your desired features, such as native JSON parsing or tree-sitter support, were correctly detected and linked during the build process.</p>



<p>You can verify this by inspecting the <code>system-configuration-features</code> variable. To view its contents, type <code>M-x describe-variable RET system-configuration-features RET</code>, which will output a string detailing the exact libraries and features baked into your current executable.</p>



<h2>Optional: Risky Emacs Optimizations</h2>



<h4><strong>Risky Optimization: Replacing -O2 with -O3</strong></h4>



<p><strong>NOTE:</strong> The Emacs developers strongly recommend against using <code>-O3</code>, <code>-Os</code>, and <code>-fsanitize=undefined</code> for ordinary production builds, stating that these flags are known to sometimes cause unpredictable problems with the generated code. (Source: <a href="https://github.com/emacs-mirror/emacs/blob/master/INSTALL">The <code>INSTALL</code> file in the Emacs source tree</a>.) <strong>That said, I have compiled Emacs using <code>-O3</code> and have not experienced any issues.</strong></p>



<p>Here is how to apply this optimization:</p>



<ul>
<li><strong>Compiler configuration:</strong> Replace the <code>-O2</code> flag with <code>-O3</code> in your <code>CFLAGS</code>. (Avoid substituting <code>-Wl,-O2</code> with <code>-Wl,-O3</code> in your <code>LDFLAGS</code>, as the underlying GNU ld documents optimization levels up to -O2 for linker optimizations.)</li>



<li><strong>Linker configuration:</strong> Replace the <code>-O2</code> flag with <code>-O3</code> in <code>LDFLAGS</code>.</li>



<li><strong>Emacs configuration:</strong> Replace <code>-O2</code> flag with <code>-O3</code> in the <code>native-comp-compiler-options</code> variable.</li>
</ul>



<p>The theoretical benefits of <code>-O3</code>:</p>



<ul>
<li>Aggressive function Inlining: Function inlining speeds up execution by pasting a function’s code directly where it is called, eliminating the overhead of jumping to a different memory address. </li>



<li>Loop Unrolling: Loop unrolling is a compiler optimization that copies parts of a loop multiple times so the program does not need to repeatedly check conditions like <code>i &lt; 10</code> as often. This reduces repeated checks and jumps, allowing the CPU to spend more time performing useful work instead of constantly deciding whether to continue the loop. This creates longer uninterrupted sections of code, which modern processors can execute more efficiently by processing several independent operations in parallel at the same time.</li>



<li>Faster Buffer Processing (Vectorization/SIMD): For heavy text searching, such as complex regular expression matching or byte-level buffer manipulation, <code>-O3</code> may allow the compiler to use special CPU instructions that operate on many bytes of data at once instead of processing each byte individually. For example, instead of comparing one character at a time, the CPU may compare 16, 32, or more characters in a single operation, which can improve performance in some workloads.</li>
</ul>



<p>The tangible risks of <code>-O3</code>:</p>



<ul>
<li>Instruction Cache Bloat: Aggressive inlining copies large amounts of code directly into other functions, which can significantly increase the size of the final executable.</li>



<li>Exposing Undefined Behavior: <code>-O3</code> enables more aggressive optimizations that assume the C source code fully follows the rules of the C standard. In large and old codebases like Emacs, some code may accidentally rely on behavior that is technically invalid or undefined. When combined with Link-Time Optimization (LTO), the compiler can optimize across multiple source files and make transformations that expose these hidden issues, potentially causing random crashes, UI freezes, or unstable behavior.</li>



<li>Mangled Stack Traces: <code>-O3</code> aggressively rearranges and simplifies code to improve performance. Functions may be merged, variables may disappear entirely, and instructions may execute in a very different order than they appear in the original source code. If Emacs crashes, debugging tools such as <code>gdb</code> may produce stack traces that no longer clearly match the original program structure, making debugging substantially more difficult.</li>
</ul>



<p>Using <code>-O3</code> is an experimental optimization. If you experience out-of-memory build failures, random micro-stutters, UI freezing, or crashes, revert to a standard <code>-O2</code> build with or without LTO.</p>



<h3>Conclusion</h3>



<p>Compiling Emacs from source and bypassing generic Emacs distribution binaries strips away decades of legacy compatibility layers and align the Emacs’ execution directly with your specific hardware architecture.</p>



<p>Remember to trigger a fresh recompilation whenever you update core system toolchains, such as GCC or your graphical compositor, to maintain binary compatibility and performance integrity.</p>
<div class="yarpp yarpp-related yarpp-related-rss yarpp-template-list">

<h3>Related posts:</h3><ol>
<li><a href="https://www.jamescherti.com/emacs-evil-mode-restore-line-column-mark/">Emacs Evil Mode: How to restore both the line and column number of a mark, not just the line number</a></li>
<li><a href="https://www.jamescherti.com/emacs-open-vertico-consult-ivy-counsel-candidate-new-tab/">Emacs: Open a Vertico/Consult or Ivy/Counsel candidate in a new tab</a></li>
<li><a href="https://www.jamescherti.com/elispcomp-elisp-compilation-from-command-line/">Elispcomp: Compiling Elisp code directly from the command line</a></li>
<li><a href="https://www.jamescherti.com/buffer-guardian-el-automatically-save-emacs-buffers/">buffer-guardian.el – Automatically Save Emacs Buffers Without Manual Intervention (When Buffers Lose Focus, Regularly, or After Emacs is Idle)</a></li>
<li><a href="https://www.jamescherti.com/emacs-evil-disable-automatic-removal-of-spaces-after-leaving-insert-mode/">Emacs Evil Mode: Disabling the automatic removal of spaces after leaving Insert mode</a></li>
<li><a href="https://www.jamescherti.com/emacs-quick-sdcv-offline-dictionary/">quick-sdcv.el, a package that enables Emacs to function as an offline dictionary using sdcv</a></li>
<li><a href="https://www.jamescherti.com/emacs-symbol-highlighting-built-in-functions/">Emacs: Toggling symbol highlighting with unique colors for each symbol using built-in functions</a></li>
</ol>
</div>
</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Org Mode requests: [FR] ox-md: Export custom-id search strings (::#) as anchors]]></title>
            <link>https://list.orgmode.org/87zf267i1c.fsf@gmail.com</link>
            <guid>https://list.orgmode.org/87zf267i1c.fsf@gmail.com</guid>
            <pubDate>Mon, 11 May 2026 03:15:59 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body>[request] flags:--- replies:0 topic:ox-md</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Irreal: Personal Keybindings]]></title>
            <link>https://irreal.org/blog/?p=13799</link>
            <guid>https://irreal.org/blog/?p=13799</guid>
            <pubDate>Sun, 10 May 2026 14:52:57 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>
Marcin Borkowski (mbork) has an <a href="https://mbork.pl/2026-05-09_describe-personal-keybindings">interesting post on the describe-personal-keybindings command</a>. The idea is that the command lists the keybindings that you have set in your configuration. It’s convenient, mbork says, for checking that new Emacs releases haven’t stolen one of your bindings. It’s also interesting to see what bindings you’ve added and what, if anything, they’ve replaced.
</p>
<p>
But there’s a catch. In order for a personal keybinding to show up, it must have been set with the <code>bind-key</code> macro. That’s a problem for those of us who are long term users. Those who use <code>use-package</code> exclusively have no problem since the <code>:bind</code> command  uses <code>bind-key</code> automatically but bindings set with, say, <code>define-key</code> will not appear in the <code>describe-personal-keybindings</code> output.
</p>
<p>
That’s inspired mbork to refactor his <code>init.el</code> to use <code>use-pacjkage</code> and for stand-alone bindings, the <code>bind-key</code> macro.
</p>
<p>
The minions are insisting that I mention what they consider the best part of mbork’s post. That, of course, concerned dark mode. Mbork begins his post by mentioning a Web app that provides a Web based cheat sheet of Emacs commands. Mbork says it’s a cool command but not for him because
</p>
<blockquote>
<p>
if I were to create something like that, it would run in Emacs and not in the browser, it would definitely mention transpose-.* commands, and it would never be dark-mode-only;-).
</p>
</blockquote>
<p>
The minions haven’t been causing much trouble lately so I thought it only fair to indulge their desire to get mbork’s dislike of dark mode on the record.</p>
</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Einar Mostad: Speed improvement hack for dired with EWW]]></title>
            <link>https://einar.codeberg.page/speed_improvement_hack_for_dired_with_eww.html</link>
            <guid>https://einar.codeberg.page/speed_improvement_hack_for_dired_with_eww.html</guid>
            <pubDate>Sun, 10 May 2026 14:47:00 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>
I have used EWW in Emacs for some of my browsing for a while and it does the job very well unless browsing single page applications or other sites that do not send HTML unless you run JavaScript. Thank you Lars Magne Ingebrigtsen for making EWW! Hitting R filters out all the noise for a really pleasant reading experience. It is good to browse within Emacs with no context switching in a keyboard-driven way.
</p>

<p>
(Apropos they joys of context switching: When I am a bit tired, I use Emacs keybindings everywhere. Tap-to-click is naturally off on my laptops to prevent insanity. I am often able to "help" my students a lot within just a few seconds of random keybindings and clicking everywhere on their laptops. It is really good for students to learn patience and tolerance towards people unable to handle computers. They need that for their user support class and future work in the IT industry.)
</p>

<p>
When <a href="https://joshblais.com/blog/emacs-as-my-browser/">Joshua Blaise wrote about his eww setup and use</a>, I read it with interest and stole most of his ideas for my own config. The important one for this little hack is that I set up URLs with endings like .mp3, .mp4, .m4v, .mkv etc to launch in mpv when browsing to them. This makes watching videos and listening to audio content easy with EWW. EWW is also good for browsing local files by hitting W with point on a file in dired.
</p>

<p>
In dired, I usually launch external programs for photo editing, media playback etc by pressing &amp; with point on a file name. This brings up the completing-read interface in the minibuffer which asks me if I would like to use dired's guess as to which program to use (which I have set to guess xdg-open first) or something else. I press return and then mpv, gimp, darktable or whatever launches with the file.
</p>

<p>
I had an html file in my downloads folder which I launched with W to read in EWW. I then, by mistake, hit W when on a .mp3 file, and it launched in mpv. Since W launches the file in EWW and EWW was configured to open .mp3 files in mpv, it did that without asking me which program to use. It is faster to hit W than to hit &amp; RET, or in worst case write a program name and RET. So now I launch media files with W in dired in stead of using &amp;. It speeds things up a bit.
</p>

<p>
(While writing this, I also remembered that I have functions for playing enclosure links and links in elfeed through mpv that I might replace or improve by shuffling the links to EWW or einar-browse-url-mpv. I wrote my configuration for elfeed very early in my Emacs journey, without really understanding any of it, by copying snippets from the Emacs wiki, blogs and Reddit so it is high time to look at it again anyway. I can probably simplify it.)
</p>

<p>
Here are the relevant parts of my configuration for EWW to get this working:
</p>
<div class="org-src-container">
<pre>(<span>defun</span> <span>einar-browse-url-mpv</span> (url <span>&amp;rest</span> _args)
  <span>"Opens URL in mpv."</span>
  (start-process <span>"mpv"</span> nil <span>"mpv"</span> url))

(<span>use-package</span> eww
  <span>:config</span>
  (<span>setopt</span> browse-url-handlers
          '((<span>"</span><span>\\</span><span>(</span><span>youtube\\.com</span><span>\\</span><span>|</span><span>youtu\\.be</span><span>\\</span><span>|</span><span>vimeo\\.com</span><span>\\</span><span>|</span><span>twitch\\.tv</span><span>\\</span><span>)</span><span>"</span> . einar-browse-url-mpv)
            (<span>"\\.mp3$"</span> . einar-browse-url-mpv)
            (<span>"\\.mp4$"</span> . einar-browse-url-mpv)
            (<span>"\\.webp$"</span> . einar-browse-url-mpv)
            (<span>"\\.m4v$"</span> . einar-browse-url-mpv)
            (<span>"\\.mkv$"</span> . einar-browse-url-mpv)
            (<span>"\\.pdf$"</span> . einar-browse-url-pdf)
            (<span>"."</span> . eww-browse-url))))
</pre>
</div>
<div class="taglist"><a href="https://einar.codeberg.page/tags.html">Tags</a>: <a href="https://einar.codeberg.page/tag-emacs.html">emacs</a> <a href="https://einar.codeberg.page/tag-gnulinux.html">gnulinux</a> </div></body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Irreal: Emacs Chat 21]]></title>
            <link>https://irreal.org/blog/?p=13797</link>
            <guid>https://irreal.org/blog/?p=13797</guid>
            <pubDate>Sat, 09 May 2026 15:14:22 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>
Those of us who have been around long enough remember Sacha Chua’s Emacs Chat videos. The last one was a decade ago but now that Chua’s daughter is a bit older, she’s decided to resurrect them. <a href="https://kelar.org/~bandali/gnu/emacs/emacs-chat-202605.html">The first new episode, Emacs Chat 21, is with Amin Bandali</a> with whom she’s worked on <a href="https://emacsconf.org/">EmacsConf</a> for the last 7 years.
</p>
<p>
The format is always the same. Chua and her guest discuss the guest’s Emacs configuration and how they’ve solved various problems. There’s way too much material for a quick recapitulation—the video is an hour and 12 minutes long—but there’s a transcript at the link so you can go through it at your leisure if you find the video’s pace too rapid.
</p>
<p>
There were a couple of things that I found particularly interesting. The first is the upcoming user-lisp-directory. It allows you to specify a directory for your Lisp files and Emacs will automatically compile them and add them to the load-path for you. Bandali uses it as a replacement for the package system because he prefers to configure things manually.
</p>
<p>
The second interesting thing for me was his use of EXWM (Emacs X Window Manager), which goes a long way towards the dream of bringing <i>everything</i> into Emacs. I’ve long wanted to try it out but as its name suggests, it works with the X-Windows system only. The Irreal bunker has famously standardized on Macs so EXWM is unavailable to us. I’d still love to try it though.
</p>
<p>
There’s a <i>lot</i> of material in the chat so you’ll have to watch it—or at least skim the transcript—to get the whole picture. There are links to his configuration so you can steal anything that seems useful to you.
</p>
<p>
I’m really happy to see Chua resurrecting her Emacs Chats. I really enjoyed the previous ones and learned a lot from them and I’m sure that will be true of the new ones too.</p>
</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Dave Pearson: make-phony.el v1.4.0]]></title>
            <link>https://blog.davep.org/2026/05/09/make-phony-el-v1-4-0.html</link>
            <guid>https://blog.davep.org/2026/05/09/make-phony-el-v1-4-0.html</guid>
            <pubDate>Sat, 09 May 2026 07:36:11 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>I've done a small update to
<a href="https://github.com/davep/make-phony.el" target="_blank"><code>make-phony.el</code></a>, my little
<a href="https://blog.davep.org/tag/emacs/">Emacs</a> package that lets me be lazy when adding <code>.PHONY</code> to
mark a target as a <a href="https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html" target="_blank">phony
target</a>
in a Makefile.</p>
<p>The only change is a tweak to the regular expression, to tighten up the
check for a target that can be marked.</p></body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Marcin Borkowski: describe-personal-keybindings]]></title>
            <link>https://mbork.pl/2026-05-09_describe-personal-keybindings</link>
            <guid>https://mbork.pl/2026-05-09_describe-personal-keybindings</guid>
            <pubDate>Sat, 09 May 2026 03:53:14 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body>Some time ago one Emacs user made themselves a local web app showing various Emacs keybindings – basically, a web-based Emacs cheatsheet. It’s definitely a nice project even if not for me – if I were to create something like that, it would run in Emacs and not in the browser, it would definitely mention transpose-.* commands, and it would never be dark-mode-only;-). But it’s a really cool and nice project nevertheless! That’s not the topic of this post, however. In a Reddit discussion about this tool someone mentioned a command that blew me away: describe-personal-bindings.</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Corwin Brust: last-rev.pl]]></title>
            <link>http://corwin.bru.st/2026-05-08-last-rev.pl/</link>
            <guid>http://corwin.bru.st/2026-05-08-last-rev.pl/</guid>
            <pubDate>Fri, 08 May 2026 18:59:59 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><h1>last-rev.pl</h1>

<p>
As returning readers will know, I produce (or try to produce) regular builds of Emacs for Windows.  When things work, these produce pre-compiled binaries as an installer and unpack-and-run zip files. You can find links to the latest set for each branch in the box at the top-left each page on the site.</p>
<p>
Today's post is about one program out from the middle of the bucket-brigade of data I have created, generally in an effort to avoid unneeded queries of the upstream (Savannah or Savannah mirrors hosted) repositories.</p></body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Dave Pearson: blogmore.el v4.5.0]]></title>
            <link>https://blog.davep.org/2026/05/08/blogmore-el-v4-5-0.html</link>
            <guid>https://blog.davep.org/2026/05/08/blogmore-el-v4-5-0.html</guid>
            <pubDate>Fri, 08 May 2026 18:27:54 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>Carrying on with <a href="https://blog.davep.org/2026/05/07/blogmore-el-v4-4-0.html">the theme of being lazy while editing
posts</a>, I've released
<a href="https://github.com/davep/blogmore.el" target="_blank"><code>blogmore.el</code></a> v4.5.0. This version
adds <code>blogmore-set-as-cover</code>. With this, if you place <code>point</code> on a line that
is an image and run the command, it is set as the <code>cover</code> for the post.</p>
<p>Sure, it's not like it's hard to copy, move, insert a new line, type
<code>cover:</code> and then paste the text, but this is faster and more accurate.</p>
<p>And I'm lazy.</p>
<p>And I like hacking on <a href="https://blog.davep.org/tag/emacs-lisp/">Emacs Lisp</a> that makes my workflow
flow faster.</p></body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[James Cherti: Easily Toggle an Emacs Terminal with a Single Keystroke using shell-pop (Recently Refactored)]]></title>
            <link>https://www.jamescherti.com/emacs-toggle-a-shell-window-shell-pop/</link>
            <guid>https://www.jamescherti.com/emacs-toggle-a-shell-window-shell-pop/</guid>
            <pubDate>Fri, 08 May 2026 14:41:33 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>The <strong><a href="https://github.com/kyagi/shell-pop-el">shell-pop</a></strong> Emacs package provides on-demand access to a terminal buffer via a single, configurable key binding. It allows toggling a terminal window without disrupting the workspace layout, making it a useful tool for quick command-line tasks.</p>



<p><strong><span>NOTE:</span></strong> Kazuo Yagi, <strong>the shell-pop original author, appointed me as a co-maintainer of shell-pop</strong> Emacs package. I recently refactored <strong>shell-pop</strong> to improve robustness, fix bugs, and add support for additional terminals (<em>vterm</em> and <em>eat</em>). Stepping into the maintainer role gave me the opportunity to give the codebase a thorough refactoring.</p>



<figure><img width="1024" height="947" src="https://www.jamescherti.com/wp-content/uploads/emacs-shell-pop-1024x947.png" alt="" srcset="https://www.jamescherti.com/wp-content/uploads/emacs-shell-pop-1024x947.png 1024w, https://www.jamescherti.com/wp-content/uploads/emacs-shell-pop-300x278.png 300w, https://www.jamescherti.com/wp-content/uploads/emacs-shell-pop-768x710.png 768w, https://www.jamescherti.com/wp-content/uploads/emacs-shell-pop-324x300.png 324w, https://www.jamescherti.com/wp-content/uploads/emacs-shell-pop.png 1188w"></figure>



<h2>Why use shell-pop?</h2>



<p>Adding <strong>shell-pop</strong> to your workflow offers the following benefits:</p>



<ul>
<li>Your terminal session remains active in the background, retaining your command history and running processes.</li>



<li>It can automatically change the terminal directory to match the file or project you are currently visiting in Emacs.</li>



<li>Toggling the shell does not ruin your carefully arranged window splits. (Especially when <code>shell-pop-full-span</code> is set to set to t)</li>



<li>It supports a wide variety of terminal emulators (term, eshell, ansi-term, vterm, and eat).</li>



<li>It provides control over the terminal window layout, allowing you to specify its exact size as a percentage, define its position (top, bottom, left, right, or full screen), and choose whether it should span the entire width of the frame.</li>



<li>It handles cleanup gracefully by automatically killing the terminal buffer and safely deleting its window when the underlying shell process exits.</li>



<li>It includes a comprehensive set of lifecycle hooks (for opening, closing, and exiting), allowing you to trigger custom Emacs Lisp functions automatically based on the terminal state.</li>
</ul>



<h2>Installation and configuration</h2>



<p>To install <strong>shell-pop</strong> from MELPA:</p>



<ol>
<li>If you haven’t already done so, <a href="https://melpa.org/#/getting-started">add MELPA repository to your Emacs configuration</a>.</li>



<li>Add the following code to your Emacs init file to install <strong>shell-pop</strong> from MELPA:</li>
</ol>


<pre><span><code class="hljs language-lisp">(<span class="hljs-name">use-package</span> shell-pop
  <span class="hljs-comment">;; :bind automatically sets up the keybinding AND tells Emacs to lazy-load the</span>
  <span class="hljs-comment">;; package the moment the key is pressed.</span>
  <span class="hljs-symbol">:bind</span> ((<span class="hljs-string">"C-c t"</span> . shell-pop))
  <span class="hljs-symbol">:custom</span>
  <span class="hljs-comment">;; The key sequence used to toggle the shell window.</span>
  (<span class="hljs-name">shell-pop-universal-key</span> <span class="hljs-string">"C-c t"</span>)

  <span class="hljs-comment">;; Sets the screen position where the shell popup appears.</span>
  <span class="hljs-comment">;; You can choose "bottom", "top", "right", "left", or "full".</span>
  (<span class="hljs-name">shell-pop-window-position</span> <span class="hljs-string">"bottom"</span>)

  <span class="hljs-comment">;; If non-nil, the window stretches across the entire frame width.</span>
  (<span class="hljs-name">shell-pop-full-span</span> <span class="hljs-literal">nil</span>)

  <span class="hljs-comment">;; The path to the shell executable used by the terminal emulator</span>
  <span class="hljs-comment">;; (e.g., "/usr/bin/env bash").</span>
  (<span class="hljs-name">shell-pop-term-shell</span> shell-file-name)

  <span class="hljs-comment">;; The height or width of the window as a percentage of the frame.</span>
  (<span class="hljs-name">shell-pop-window-size</span> <span class="hljs-number">30</span>)

  <span class="hljs-comment">;; Setting this to non-nil sends commands to the shell. This is not always</span>
  <span class="hljs-comment">;; desirable, as it can send commands to any prompt.</span>
  (<span class="hljs-name">shell-pop-autocd-to-working-dir</span> <span class="hljs-literal">nil</span>))</code></span></pre>


<h2>Configuring the terminal</h2>



<p>Here are the exact configurations for the most popular Emacs shells. Simply copy and paste your preferred option into your init file:</p>



<h4>ansi-term</h4>


<pre><span><code class="hljs language-lisp">(<span class="hljs-name">with-eval-after-load</span> 'shell-pop
  (<span class="hljs-name">setopt</span> shell-pop-shell-type '(<span class="hljs-string">"ansi-term"</span> <span class="hljs-string">"*ansi-term*"</span>
                                 (lambda ()
                                   (ansi-term shell-pop-term-shell)))))</code></span></pre>


<h4>term</h4>


<pre><span><code class="hljs language-lisp">(<span class="hljs-name">with-eval-after-load</span> 'shell-pop
  (<span class="hljs-name">setopt</span> shell-pop-shell-type '(<span class="hljs-string">"terminal"</span> <span class="hljs-string">"*terminal*"</span>
                                 (lambda ()
                                   (term shell-pop-term-shell)))))</code></span></pre>


<h4>vterm</h4>



<p><em>Note: Requires the <code>vterm</code> package to be installed.</em></p>


<pre><span><code class="hljs language-lisp">(<span class="hljs-name">with-eval-after-load</span> 'shell-pop
  (<span class="hljs-name">setopt</span> shell-pop-shell-type '(<span class="hljs-string">"vterm"</span> <span class="hljs-string">"*vterm*"</span>
                                 (lambda ()
                                   (when (fboundp 'vterm)
                                     (let ((vterm-shell shell-pop-term-shell))
                                       (vterm)))))))</code></span></pre>


<h4>eat</h4>



<p><em>Note: Requires the <code>eat</code> package to be installed.</em></p>


<pre><span><code class="hljs language-lisp">(<span class="hljs-name">with-eval-after-load</span> 'shell-pop
  (<span class="hljs-name">setopt</span> shell-pop-shell-type '(<span class="hljs-string">"eat"</span> <span class="hljs-string">"*eat*"</span>
                                 (lambda ()
                                   (when (fboundp 'eat)
                                     (eat shell-pop-term-shell))))))</code></span></pre>


<h2>Enhancements that I implemented as co-maintainer</h2>



<p>If you are a long-time <strong>shell-pop</strong> user, here are the changes I recently made to the package. I encourage you to try the latest version and <a href="https://github.com/kyagi/shell-pop-el/issues">send Kazuo Yagi and me your feedback in the issue tracker</a>:</p>



<ul>
<li>I added support for the <strong>vterm</strong> and <strong>eat</strong> terminals, two highly requested modern terminal emulators. This includes implementing automatic directory synchronization to ensure the shell always matches the current working directory in Emacs.</li>



<li>Previously, the package relied on global variables and buffer deletion to manage window states. This caused unpredictable behavior when using complex layouts, multiple frames, or tabs. I refactored shell-pop to isolate state tracking by attaching it directly to Emacs window parameters.</li>



<li>I resolved issues related to zombie buffers and asynchronous window hijacking. The code now stores buffer objects instead of names, scopes process sentinels strictly to the shell window, and correctly verifies buffer lifespans before attempting restoration.</li>



<li>The toggle functionality now correctly recognizes active shell windows even when the cursor is focused elsewhere in the frame, preventing redundant terminal pop-ups.</li>



<li>I fixed a directory desync bug by unconditionally enforcing auto cd. Emacs will no longer lose track of the shell’s actual working directory if a user manually changes directories inside the terminal.</li>



<li>The teardown routines were adjusted to ensure native terminal cleanup processes, such as writing Eshell history, execute fully before the buffer is destroyed.</li>



<li>I replaced the simulated Ctrl-L keystroke with an explicit clear command to prevent literal ^L characters from printing in the terminal input buffer.</li>



<li>The hard dependency on the term package is now optional. Users who prefer vterm, eat, standard shells or Eshell are no longer forced to load unnecessary terminal packages on startup.</li>
</ul>



<h2>Conclusion</h2>



<p>Taking on a maintenance role for a tool I use daily has been an interesting experience. These recent updates aim to make <strong>shell-pop</strong> more reliable and modern. I encourage you to try the latest version and send us your feedback. </p>
<div class="yarpp yarpp-related yarpp-related-rss yarpp-template-list">

<h3>Related posts:</h3><ol>
<li><a href="https://www.jamescherti.com/emacs-enhanced-evil-paredit/">Emacs enhanced-evil-paredit.el package: Preventing Parenthesis Imbalance when Using Evil-mode with Paredit</a></li>
<li><a href="https://www.jamescherti.com/emacs-compile-angel-byte-native-compile/">The compile-angel Emacs package: Byte-compile and Native-compile Emacs Lisp libraries Automatically</a></li>
<li><a href="https://www.jamescherti.com/easysession-el-persist-restore-emacs-session/">easysession.el – Easily persist and restore your Emacs editing sessions</a></li>
<li><a href="https://www.jamescherti.com/essential-emacs-packages/">Must-have Emacs Packages for Efficient Software Development and Text Editing</a></li>
<li><a href="https://www.jamescherti.com/buffer-guardian-el-automatically-save-emacs-buffers/">buffer-guardian.el – Automatically Save Emacs Buffers Without Manual Intervention (When Buffers Lose Focus, Regularly, or After Emacs is Idle)</a></li>
<li><a href="https://www.jamescherti.com/emacs-native-compilation-config-jobs/">Enabling Emacs Native Compilation and Dynamically Adjusting the Number of Elisp Files Compiled in Parallel</a></li>
<li><a href="https://www.jamescherti.com/fold-outline-indentation-emacs-package/">outline-indent – Indentation based Folding and Outlining in Emacs</a></li>
</ol>
</div>
</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Irreal: The Emacs 31 Branch Has Been Created]]></title>
            <link>https://irreal.org/blog/?p=13795</link>
            <guid>https://irreal.org/blog/?p=13795</guid>
            <pubDate>Fri, 08 May 2026 14:10:46 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>
As I mentioned a few days ago, <a href="https://irreal.org/blog/?p=13782">the Emacs 31 release process was on the verge of starting</a>. Now Sean Whitton writes to tell us that <a href="https://lists.gnu.org/archive/html/emacs-devel/2026-05/msg00194.html">the Emacs 31 branch has been created and that the feature freeze has begun</a>.
</p>
<p>
This means that the Emacs 31 release cycle has begun and that’s what on the Emacs 31 branch is pretty much—modulo bug fixes and last minute emergency additions—what the final release will be like.
</p>
<p>
The release cycle—if you believe in history—is apt to be long but even though that can be frustrating it means that the final product is going to be rock solid.
</p>
<p>
Although I keep repeating it, I can’t say it enough: thanks to all the developers who selflessly donate their time and efforts to making and keeping Emacs one of the best—if not the best—editors available.</p>
</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Amin Bandali: FFS code review with Protesilaos]]></title>
            <link>https://kelar.org/~bandali/gnu/emacs/ffs-code-review-prot.html</link>
            <guid>https://kelar.org/~bandali/gnu/emacs/ffs-code-review-prot.html</guid>
            <pubDate>Fri, 08 May 2026 02:10:33 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>
In the recent weeks I've been engaging <a href="https://protesilaos.com/coach/">Prot as an Emacs coach</a> to help
with doing review passes over my upcoming <a href="https://git.kelar.org/~bandali/ffs"><code>ffs</code></a> package as I work on
polishing and documenting it in preparation for offering it for
inclusion in GNU ELPA.
</p>

<p>
Yesterday we had our second session focused on <code>ffs</code>, which I recorded
and share publicly with everyone with Prot's permission, so that
others can also benefit from Prot's insights and experience as we
discuss various aspects of Emacs package development with the concrete
example of <code>ffs</code>.
</p>

<p>
Here is the video recording of our session:
</p>

<video src="https://archive.org/download/ffs-code-review-prot-20260506/ffs-code-review-prot-20260506.mp4" poster="https://kelar.org/~bandali/gnu/emacs/ffs-code-review-prot-poster.jpg">

<p>
Sorry, this embedded video will not work,
because your web browser does not support HTML5 video.<br>
<a href="https://archive.org/download/ffs-code-review-prot-20260506/ffs-code-review-prot-20260506.mp4">[ please watch the video in your favourite streaming media player ]​</a>
</p>
</video>

<p>
You can <a href="https://archive.org/details/ffs-code-review-prot-20260506">view</a> or <a href="https://archive.org/download/ffs-code-review-prot-20260506/ffs-code-review-prot-20260506.mkv">download the full-resolution video</a> from the Internet
Archive.
</p>

<p>
I addressed most of Prot's feedback about <code>ffs</code> from our first
session, and I'll be working on the changes we discussed in this
session in the next days.
</p>

<p>
In the last third of the video we switched topics to discuss a few
Emacs-related tangents including adding a 'padding' effect for the
mode line and its constructs, and distilling and separating the
easily-reusable package-like parts of one's Emacs configuration from
the actual configuration of those parts (e.g. the distinction of
<code>prot-lisp</code> and <code>prot-emacs-modules</code> in <a href="https://protesilaos.com/emacs/dotemacs">Prot's Emacs configuration</a>).
</p>

<p>
For mode line padding, here is the snippet I'm using with Prot's
<code>doric-themes</code>:
</p>

<div class="org-src-container">
<pre><code>(doric-themes-with-colors
  (custom-set-faces
   `(mode-line
     ((t :box (:line-width 6 :color ,bg-shadow-intense))))
   `(mode-line-inactive
     ((t :box (:line-width 6 :color ,bg-shadow-subtle))))
   `(mode-line-highlight
     ((t :box (:color ,bg-shadow-intense))))))
</code></pre>
</div>

<p>
Take care, and so long for now.
</p>
</body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Protesilaos: Emacs coaching with Amin Bandali]]></title>
            <link>https://protesilaos.com/codelog/2026-05-08-emacs-coaching-amin-bandali/</link>
            <guid>https://protesilaos.com/codelog/2026-05-08-emacs-coaching-amin-bandali/</guid>
            <pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>I met with Amin Bandali to talk about Emacs, specifically Amin’s
upcoming <code class="language-plaintext highlighter-rouge">ffs</code> package. Amin informed me about changes to <code class="language-plaintext highlighter-rouge">ffs</code> in
light of a discussion we had during a previous session.</p>

<p>Amin asked me to record the meeting and then publish it, which I
happily agreed to. You can watch it on Amin’s website:
<a href="https://kelar.org/~bandali/gnu/emacs/ffs-code-review-prot.html">https://kelar.org/~bandali/gnu/emacs/ffs-code-review-prot.html</a>.</p>

<p>[ NOTE: I normally do not share anything about my meetings with
  people. Not who they are nor what we talk about. ]</p>

<p>Thanks to Amin for making this happen! I am looking forward to new
developments.</p>

<p>By the way, I learnt about the function <code class="language-plaintext highlighter-rouge">x-export-frames</code> from a
mention in Amin’s <code class="language-plaintext highlighter-rouge">ffs</code> package, which led me to write
<code class="language-plaintext highlighter-rouge">buffer-to-pdf</code>: <a href="https://github.com/protesilaos/buffer-to-pdf">https://github.com/protesilaos/buffer-to-pdf</a>.</p>
        </body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Sacha Chua: Emacs Chat 22: Shae Erisson]]></title>
            <link>https://sachachua.com/blog/2026/05/may-7-emacs-chat-with-shae-erisson/</link>
            <guid>https://sachachua.com/blog/2026/05/may-7-emacs-chat-with-shae-erisson/</guid>
            <pubDate>Thu, 07 May 2026 18:55:38 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><div class="update">
<p>
<span class="timestamp-wrapper"><time>[2026-05-08 Fri]</time></span>: Transcript, yay!
</p>

</div>

<p>
I chatted with Shae Erisson about Emacs, keyboards, Org Mode, and life.
<video src="https://archive.org/download/ec22-shae-erisson/ec22-shae-erisson.mp4"><track></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/category/emacs/feed/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>
<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 class="outline-3">
<h3>Chapters</h3>
<div class="outline-text-3">
<p>
</p><ul>
<li><span class="media-time">0:07</span> Intro</li>
<li><span class="media-time">1:01</span> 1999, IRC, community building in Haskell</li>
<li><span class="media-time">2:02</span> Emacs as a light-weight build-your-own-editor toolkit</li>
<li><span class="media-time">2:55</span> LSP, treesitter, Magit, jujutsu, C++, Python, Haskell, rust</li>
<li><span class="media-time">3:38</span> how does a new person experience Emacs? Emacs is always fun.</li>
<li><span class="media-time">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">6:45</span> Purpose-specific function keys</li>
<li><span class="media-time">7:34</span> Trackballs, scroll</li>

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

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

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

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

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

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

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

<p></p>
</div>
</div>
<div class="outline-3">
<h3>Transcript</h3>
<div class="outline-text-3">
<a name="ID-ec22-transcript"></a><div>
                  Transcript
<p>
</p><div class="full-transcript"><p></p><div class="transcript-heading"><span class="audio-time">0:00</span> <strong>Intro</strong></div><p></p><span class="audio-time caption"><strong>Sacha:</strong> Okay, so I'm going to actually remember to hit go live.</span> <span class="audio-time caption">I've got a 10 second delay, so if we need to panic, we can panic.</span> <span class="audio-time caption">Okay, so let's see.</span> <span class="audio-time caption">I think we are live.</span> <span class="audio-time caption">Hi, everyone.</span> <span class="audio-time caption">This is Emacs Chat number 22 after a long hiatus.</span> <span class="audio-time caption">And today, I'm here with Shae Erisson, who is also like</span> <span class="audio-time caption">an Emacs friend from a long time back.</span> <span class="audio-time caption">So this is it.</span> <span class="audio-time caption">As you were just saying, this is the first time we're actually</span> <span class="audio-time caption">talking live.</span> <span class="audio-time caption">And I'm looking forward to hearing about your configuration, how you</span> <span class="audio-time caption">use Emacs, Shae.</span> <span class="audio-time caption">But before we dive into that, can you give us a little bit of context?</span> <span class="audio-time caption">Who you are, what sorts of things you do,</span> <span class="audio-time caption">and how you use Emacs for that?</span> <p></p><div class="transcript-heading"><span class="audio-time">0:57</span> <strong>1999, IRC, community building in Haskell</strong></div><p></p><span class="audio-time caption"><strong>Shae:</strong> I would say that...</span> <span class="audio-time caption">I guess I started using Emacs in 1999 when I moved to Finland.</span> <span class="audio-time caption">And I remember about the same time I was on IRC and I was really</span> <span class="audio-time caption">frustrated.</span> <span class="audio-time caption">I remember I got on the Perl IRC channel and I was like, hey, I want</span> <span class="audio-time caption">an editor that has syntax highlighting.</span> <span class="audio-time caption">I want to see colors to these words when I'm typing them.</span> <span class="audio-time caption">And they were like, noob, and they kick-banned me.</span> <span class="audio-time caption">And I was like, well, maybe I don't want to learn Perl, which I never</span> <span class="audio-time caption">did.</span> <span class="audio-time caption">And I guess that was an early introduction into I wanted to be part</span> <span class="audio-time caption">of communities where people were sharing positive things and building</span> <span class="audio-time caption">up each other.</span> <span class="audio-time caption">Actually, I ended up starting the Haskell IRC channel a couple of</span> <span class="audio-time caption">years later, and that became a very big thing.</span> <span class="audio-time caption">I would say that I'm mostly known for my work in community building</span> <span class="audio-time caption">in the Haskell programming language community, because I did that</span> <span class="audio-time caption">for, I don't know, 15 or 20 years.</span> <span class="audio-time caption">But I really like Emacs.</span> <p></p><div class="transcript-heading"><span class="audio-time">1:58</span> <strong>Emacs as a light-weight build-your-own-editor toolkit</strong></div><p></p><span class="audio-time caption"><strong>Shae:</strong> So like last week at the same time I had the standing chat with a</span> <span class="audio-time caption">friend of mine who is also a programmer and he said oh so you're</span> <span class="audio-time caption">going to do this thing in a week do you want to give me like a</span> <span class="audio-time caption">preview of the talk and I was like yeah I guess so and some of the</span> <span class="audio-time caption">things that were really interesting was he was like I've never really</span> <span class="audio-time caption">tried Emacs I don't know much about it I kind of have this impression</span> <span class="audio-time caption">that it is a very lightweight build your own editor toolkit and I</span> <span class="audio-time caption">I was kind of taken aback because, you know, I guess I still have</span> <span class="audio-time caption">this long ago and far away.</span> <span class="audio-time caption">I don't know if you remember 8 Megs and Constantly Swapping is what</span> <span class="audio-time caption">people used to call Emacs and things like that.</span> <span class="audio-time caption">And I was, it was just kind of, I realized I'm still in my little</span> <span class="audio-time caption">echo chamber.</span> <span class="audio-time caption">And this is why I like to talk to other people all the time is</span> <span class="audio-time caption">because I want to have some exposure to what other people are doing.</span> <p></p><div class="transcript-heading"><span class="audio-time">2:51</span> <strong>LSP, treesitter, Magit, jujutsu, C++, Python, Haskell, rust</strong></div><p></p><span class="audio-time caption"><strong>Shae:</strong> I guess things about Emacs that really changed stuff for me is</span> <span class="audio-time caption">language server protocol, TreeSitter.</span> <span class="audio-time caption">Those, I think, are two very powerful tools that are much more</span> <span class="audio-time caption">generic than, I mean, Magit, of course, is like magic.</span> <span class="audio-time caption">Although I've mostly switched to jujitsu lately instead for the last</span> <span class="audio-time caption">year.</span> <span class="audio-time caption">Let's see, I had, I guess, let's see, I did C++, I did Python, I did</span> <span class="audio-time caption">a whole lot of Python.</span> <span class="audio-time caption">And then I had Haskell jobs for five or six years.</span> <span class="audio-time caption">And then I switched to Rust about a year and a half ago.</span> <span class="audio-time caption">I now have a Rust job.</span> <span class="audio-time caption">And one of the things that Prot had asked, I think, or you had asked,</span> <span class="audio-time caption">and I forget exactly how this went.</span> <p></p><div class="transcript-heading"><span class="audio-time">3:35</span> <strong>how does a new person experience Emacs? Emacs is always fun.</strong></div><p></p><span class="audio-time caption"><strong>Shae:</strong> It was great fun watching your livestream.</span> <span class="audio-time caption">And it was, how does a new person</span> <span class="audio-time caption">kind of get comfortable with using Emacs for a particular purpose.</span> <span class="audio-time caption">And I look for things, in fact, like how do I use Emacs for Rust,</span> <span class="audio-time caption">Rust development?</span> <span class="audio-time caption">And I found a couple of good guides on, and I was able to follow most</span> <span class="audio-time caption">of them, although my Yesnitit stuff is broken and I don't exactly</span> <span class="audio-time caption">know why tab doesn't work, right?</span> <span class="audio-time caption">But, you know, like there's always, Emacs is always fun, right?</span> <span class="audio-time caption">There's so many cool things you could do with it.</span> <p></p><div class="transcript-heading"><span class="audio-time">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"><strong>Shae:</strong> I noticed, I actually hadn't seen your preview page and I noticed</span> <span class="audio-time caption">that you found my Markov keyboard.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> When you say Emacs is fun, I'm reminded of all of your fun,</span> <span class="audio-time caption">crazy keyboard experiments.</span> <span class="audio-time caption">It's like, what?</span> <span class="audio-time caption">I have a feeling you like to tinker with things.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Yeah, so I think actually the influences as to how I got to</span> <span class="audio-time caption">where I am are pretty interesting.</span> <span class="audio-time caption">So the person that I ended up moving to Finland to for dating her, we</span> <span class="audio-time caption">started a company, we did projects, and I was the programmer. We had</span> <span class="audio-time caption">this pretty big project. I guess it was like 350,000 euros.</span> <span class="audio-time caption">And I mean, that was going to be over four years</span> <span class="audio-time caption">and we had to kind of complete the whole thing,</span> <span class="audio-time caption">and I was the programmer and we'd had the lowest bid...</span> <span class="audio-time caption">I had an IBM model M, you know, the super clicky with like all the...</span> <span class="audio-time caption">And about three years into it, my arm started really hurting a lot.</span> <span class="audio-time caption">But I was the only programmer.</span> <span class="audio-time caption">And nobody else knew all the code.</span> <span class="audio-time caption">And we had to ship it, because that's how we got paid.</span> <span class="audio-time caption">And so I ended up pushing through.</span> <span class="audio-time caption">And at the end of it, my arm just didn't work anymore.</span> <span class="audio-time caption">So for about a year and three months, what I did was I actually</span> <span class="audio-time caption">taught myself to type right hand.</span> <span class="audio-time caption">...Dvorak, because I was already using two-hand Dvorak,</span> <span class="audio-time caption">and so I kept programming, but I just...</span> <span class="audio-time caption">One of the things was... like, I like programming,</span> <span class="audio-time caption">I like using computers, I don't want to wear out my arms again,</span> <span class="audio-time caption">I don't want to blow them out,</span> <span class="audio-time caption">so I ended up switching to split keyboards,</span> <span class="audio-time caption">and I will show you.</span> <span class="audio-time caption">This is very much the kind of thing that I like to use,</span> <span class="audio-time caption">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" 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"></a><span class="audio-time caption"><strong>Shae:</strong> This is an Ergodox Infinity,</span> <span class="audio-time caption">but there's a lot of other keyboard flavors like this.</span> <span class="audio-time caption">And one of the things that I particularly like about this...</span> <span class="audio-time caption">So around the same time I met Jeff Raskin,</span> <span class="audio-time caption">who wrote the Inhumane Interface.</span> <span class="audio-time caption">And so for this particular thing, this is like Control and Alt and</span> <span class="audio-time caption">Hyper and Super and Shift.</span> <span class="audio-time caption">And this means that under one thumb, I have a lot more modifier keys</span> <span class="audio-time caption">than you get off of a standard.</span> <span class="audio-time caption">And it also means...</span> <span class="audio-time caption">A lot of my problems started with Emacs pinky,</span> <span class="audio-time caption">the dreaded, the infamous...</span> <span class="audio-time caption">I think that one of my... I made a keyboard layout</span> <span class="audio-time caption">called "I am not koala." You may not know this,</span> <span class="audio-time caption">but koalas have two thumbs. They have one on each side.</span> <span class="audio-time caption">And that's cool, but I don't have two thumbs,</span> <span class="audio-time caption">and I realized that when I was trying to grab something,</span> <span class="audio-time caption">I didn't put my pinky on it. That would be silly, right?</span> <span class="audio-time caption">I want to put my thumb around it.</span> <span class="audio-time caption">And so I decided I would move</span> <span class="audio-time caption">all of my chording keys under my thumbs.</span> <span class="audio-time caption">And that's kind of how I...</span> <p></p><div class="transcript-heading"><span class="audio-time">6:43</span> <strong>Purpose-specific function keys</strong></div><p></p><span class="audio-time caption"><strong>Shae:</strong> And another thing I did was when I was</span> <span class="audio-time caption">really only able to use one hand,</span> <span class="audio-time caption">was I made my function keys mostly purpose-specific.</span> <span class="audio-time caption">And that was from Jeff Raskin's writings in The Humane Interface.</span> <span class="audio-time caption">So I guess I'm a programmer who really likes writing code, doesn't</span> <span class="audio-time caption">want to wear out my arms, and likes to do fun keyboard things, yeah.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Definitely. You're in it for the long term.</span> <span class="audio-time caption">You don't want to use up all of your arm capacity now</span> <span class="audio-time caption">and not be able to keep programming in the future.</span> <span class="audio-time caption">And now there's hardware to make that easier.</span> <span class="audio-time caption">So I'm glad.</span> <span class="audio-time caption">Split keyboards with extra thumb keys seem to be very popular in</span> <span class="audio-time caption">the Emacs community.</span> <span class="audio-time caption">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">7:30</span> <strong>Trackballs, scroll
</strong></div><p></p><a href="https://sachachua.com/blog/category/emacs/feed/ec22-shae-erisson-00-07-37-067.jpg"><img loading="lazy" src="https://sachachua.com/blog/category/emacs/feed/ec22-shae-erisson-00-07-37-067.jpg" alt="image from video 00:07:37.067"></a><span class="audio-time caption"><strong>Shae:</strong> Another thing I ended up switching to was I started using</span> <span class="audio-time caption">trackballs.</span> <span class="audio-time caption">Oh yeah, yeah.</span> <span class="audio-time caption">I tend to go completely overboard when trying out new things, so I</span> <span class="audio-time caption">bought 20 different models of trackballs and ended up settling on</span> <span class="audio-time caption">this one.</span> <span class="audio-time caption">The nice thing about this one is that this is how you scroll, and it</span> <span class="audio-time caption">has four buttons.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> That is really cool. I like using ThinkPads,</span> <span class="audio-time caption">so I've been just living off the tiny little</span> <span class="audio-time caption">mouse in the middle of the keyboard.</span> <span class="audio-time caption">But back in the day, I also used a trackball.</span> <span class="audio-time caption">If I can get to the point where I want to take my hands off the</span> <span class="audio-time caption">keyboard again in order to do mouse things, that would probably be</span> <span class="audio-time caption">the direction I would go.</span> <p></p><div class="transcript-heading"><span class="audio-time">8:14</span> <strong>1" trackpad rings</strong></div><p></p><span class="audio-time caption"><strong>Shae:</strong> I had an experiment in that area, which is where I purchased</span> <span class="audio-time caption">a one-inch touchpad, and I strapped it to my finger.</span> <span class="audio-time caption">And it was a PS2, and it had a USB converter plugged into it.</span> <span class="audio-time caption">And the idea was I could keep typing, and then I could move the mouse</span> <span class="audio-time caption">around without taking my hands off the keyboard.</span> <span class="audio-time caption">And now they actually have touchpad rings.</span> <span class="audio-time caption">They came out six months or a year ago.</span> <span class="audio-time caption">It's relatively recent.</span> <span class="audio-time caption">But the idea is no change in context.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> I've only seen the scroll rings,</span> <span class="audio-time caption">but now there's a touchpad version.</span> <span class="audio-time caption">That is interesting.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Yeah, I think that's pretty cool stuff.</span> <span class="audio-time caption">Hardware is actually improving things.</span> <p></p><div class="transcript-heading"><span class="audio-time">8:54</span> <strong>Pair programming: ttyshare, shwim</strong></div><p></p><span class="audio-time caption"><strong>Shae:</strong> Oh, another thing, one of the things you talked about with Prot was</span> <span class="audio-time caption">how do you learn other people's stuff?</span> <span class="audio-time caption">And one of the things that I use for pairing, so I have one coworker,</span> <span class="audio-time caption">and it's a strange, interesting job.</span> <span class="audio-time caption">I like it a lot.</span> <span class="audio-time caption">And I met this coworker at a previous job, and one of the things,</span> <span class="audio-time caption">let's see if I can find it.</span> <span class="audio-time caption">So we used to, at the previous job,</span> <span class="audio-time caption">we used this thing called ttyshare.</span> <span class="audio-time caption">Have you heard of it?</span> <span class="audio-time caption">ttyshare.</span> <span class="audio-time caption">It's great.</span> <span class="audio-time caption">You can run it in a terminal and then you can effectively share your</span> <span class="audio-time caption">terminal with someone else.</span> <span class="audio-time caption">And so you have multiplayer terminals and that's neat.</span> <span class="audio-time caption">It was kind of a pain to set up.</span> <span class="audio-time caption">You had to make sure that you weren't NATed,</span> <span class="audio-time caption">you know, like you had to have effectively...</span> <span class="audio-time caption">someone had to have a public IP.</span> <span class="audio-time caption">You had to do a couple of other things.</span> <span class="audio-time caption">And as part of my job, I'm now, I guess, part maintainer for Magic</span> <span class="audio-time caption">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" 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"></a><span class="audio-time caption"><strong>Shae:</strong> And so one of the things that my coworker wrote was this nifty thing</span> <span class="audio-time caption">called ShWiM.</span> <span class="audio-time caption">And it's basically "shell with me."</span> <span class="audio-time caption">And it's a wrapper around TTY share so that with one single command,</span> <span class="audio-time caption">you can share a terminal.</span> <span class="audio-time caption">And the way that we use this is...</span> <span class="audio-time caption">We both run Emacs as a server, and then we use emacsclient in the</span> <span class="audio-time caption">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" 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"></a><span class="audio-time caption"><strong>Shae:</strong> I don't know if you've ever done this, but I can have a terminal</span> <span class="audio-time caption">right next to this, and if I run emacsclient in a window, then I'm</span> <span class="audio-time caption">sharing the same thing.</span> <span class="audio-time caption">This is a graphical chat with Sacha,</span> <span class="audio-time caption">in the terminal or in the UI, and both of them are updated.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> That's fantastic.</span> <span class="audio-time caption">I remember people were using tmate for something similar before</span> <span class="audio-time caption">where you could share that.</span> <span class="audio-time caption">But yeah, it's just making it seamless, making it frictionless.</span> <span class="audio-time caption">And on the other side, I have also just been</span> <span class="audio-time caption">using wormhole to send large files</span> <span class="audio-time caption">back and forth between Karthik and John Wiegley because we have this</span> <span class="audio-time caption">other Emacs chat thing where we're going to post it eventually,</span> <span class="audio-time caption">once I finish figuring out how to</span> <span class="audio-time caption">redact all the personal information and Org files.</span> <span class="audio-time caption">But yeah, it's great for being able to send things without having to</span> <span class="audio-time caption">worry about, oh, you know, what's my public IP?</span> <span class="audio-time caption">Can I tunnel all the different things to get past whatever firewalls</span> <span class="audio-time caption">there are?</span> <span class="audio-time caption">So if this also works for terminal things plus Emacs client, that</span> <span class="audio-time caption">sounds really, really exciting.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> We've tried some other experiments.</span> <span class="audio-time caption">One of the things we tried to do was, and the only downside is like,</span> <span class="audio-time caption">what if my terminal has a different size, then you have to kind of</span> <span class="audio-time caption">shrink and match.</span> <span class="audio-time caption">And so we tried to honestly directly bridge to Emacs clients.</span> <span class="audio-time caption">And because I don't know if you're aware that there's effectively a</span> <span class="audio-time caption">local socket for the Emacs client that you can have multiple things</span> <span class="audio-time caption">connect to.</span> <span class="audio-time caption">But it turns out there's some sort of like system so I couldn't like</span> <span class="audio-time caption">reach across the network and directly use my co-workers Emacs session</span> <span class="audio-time caption">and he couldn't use mine.</span> <span class="audio-time caption">Weird things happened when we tried to do this cross host.</span> <span class="audio-time caption">As far as I can tell the Emacs client only works in the same host.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> That's interesting.</span> <span class="audio-time caption">Lately, I've also been experimenting with CRDT, which has that</span> <span class="audio-time caption">Emacs-less plant as well.</span> <span class="audio-time caption">So that's been nice.</span> <span class="audio-time caption">But yeah, of course, a lot of people will be kind of stuck with the</span> <span class="audio-time caption">first challenge of finding someone that they can pair in Emacs with.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> I understand.</span> <span class="audio-time caption">And I think I'm honestly very happy that my one single coworker at</span> <span class="audio-time caption">this job is also a big Emacs user.</span> <span class="audio-time caption">And so we exchanged cool ideas and worked on stuff.</span> <span class="audio-time caption">And I'm very happy about that.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Were they already an Emacs person before they joined?</span> <span class="audio-time caption">Or did you pick the coworker because they were an Emacs person?</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> They picked me.</span> <span class="audio-time caption">They were pretty much the person who started this thing.</span> <span class="audio-time caption">And they picked me because they'd worked with me at the previous job.</span> <span class="audio-time caption">Although I did have an experience like that.</span> <span class="audio-time caption">I had this massive Emacs config file, like 20,000 lines, and half of</span> <span class="audio-time caption">it was comments because it had accrued over 20 years.</span> <p></p><div class="transcript-heading"><span class="audio-time">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"><strong>Shae:</strong> And in 2019, when I first went to the Recurse Center, well, my first</span> <span class="audio-time caption">batch, I just was extremely extroverted and social.</span> <span class="audio-time caption">But my second immediate following batch, which is not the common</span> <span class="audio-time caption">pattern, I was like, okay, my goal is to write a bunch of Haskell,</span> <span class="audio-time caption">get some Haskell jobs,</span> <span class="audio-time caption">And so I went to the quiet room on the quiet floor.</span> <span class="audio-time caption">But then someone else came in, Marianne, my favorite programming</span> <span class="audio-time caption">friend.</span> <span class="audio-time caption">And she was like, what is that keyboard you're using?</span> <span class="audio-time caption">And I was like, ah, this is an Ergodox thing.</span> <span class="audio-time caption">And then she's like, what is this editor you're using?</span> <span class="audio-time caption">And I was like, oh, that's Emacs.</span> <span class="audio-time caption">And I was kind of a grumpy, like, I'm trying to get stuff done.</span> <span class="audio-time caption">But she was persistent.</span> <span class="audio-time caption">She was like, show me this thing.</span> <span class="audio-time caption">And so I was like, I'll show you Emacs.</span> <span class="audio-time caption">And she was like, this is great.</span> <span class="audio-time caption">And I was like.</span> <span class="audio-time caption">This thing?</span> <span class="audio-time caption">OK, cool.</span> <span class="audio-time caption">And I was like, I don't think you want my config.</span> <span class="audio-time caption">You'll probably want a starter kit.</span> <span class="audio-time caption">And she was like, well, what are starter kits?</span> <span class="audio-time caption">And I was like, well, I've heard about Spacemacs.</span> <span class="audio-time caption">I've heard about Doom.</span> <span class="audio-time caption">And I would try one of those.</span> <span class="audio-time caption">So she tried Spacemacs.</span> <span class="audio-time caption">And I guess this next part happened over several months.</span> <span class="audio-time caption">She tried Spacemacs.</span> <span class="audio-time caption">And then she was like, I like it, but it's slow.</span> <span class="audio-time caption">So I'm switching to Doom Emacs.</span> <span class="audio-time caption">And I would pair with her.</span> <span class="audio-time caption">And I was like, wow, look at all these cool things that the starter</span> <span class="audio-time caption">kits can do.</span> <span class="audio-time caption">I ended up flushing my entire 20-year-old config and kind of starting</span> <span class="audio-time caption">over and stealing a lot of great ideas from the starter kits.</span> <span class="audio-time caption">And Marianne is very ambitious, independent, hardworking, very</span> <span class="audio-time caption">focused.</span> <span class="audio-time caption">I'm not very focused.</span> <span class="audio-time caption">But I've learned a lot of things from her and watching her kind of...</span> <span class="audio-time caption">I haven't done C in Emacs in a long time so it's great fun to watch</span> <span class="audio-time caption">her learn these new things and then I learned stuff too and yeah it's</span> <span class="audio-time caption">good to have collaborative people to work with.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> So it sounds like if people would like to encourage more</span> <span class="audio-time caption">people to talk to them about Emacs, feel free to use your strange</span> <span class="audio-time caption">keyboards out in public.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> I like that.</span> <span class="audio-time caption">That's good.</span> <span class="audio-time caption">That is good.</span> <span class="audio-time caption">Yeah I think that's reasonable.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Yeah, and I've just recently started digging into the</span> <span class="audio-time caption">starter kits too, because I realized I don't know much about them.</span> <span class="audio-time caption">It is really interesting going through them and discovering all these</span> <span class="audio-time caption">Emacs 31 options that you can enable to simplify your config or</span> <span class="audio-time caption">improve your workflow and all that stuff.</span> <span class="audio-time caption">So there's a lot of good stuff in starter kits, even for people who</span> <span class="audio-time caption">are not newcomers.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> I agree.</span> <span class="audio-time caption">And I think there's nothing wrong with just learning a bunch of new</span> <span class="audio-time caption">things, trying them out, and also throwing them away if you don't</span> <span class="audio-time caption">like them.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Now that you've declared Emacs bankruptcy and rebuilt your</span> <span class="audio-time caption">Emacs on top of other people's starter kits, what has made it into</span> <span class="audio-time caption">your config?</span> <span class="audio-time caption">What have you kept from those 20 years of tinkering with Emacs that</span> <span class="audio-time caption">you really wanted to stick around?</span> <p></p><div class="transcript-heading"><span class="audio-time">16:06</span> <strong>hippie-expand</strong></div><p></p><span class="audio-time caption"><strong>Shae:</strong> I think the only thing that has absolutely stuck around is my</span> <span class="audio-time caption">use of hippie-expand, which is, I believe, a very old...</span> <span class="audio-time caption">an ancient tool from a different time.</span> <span class="audio-time caption">Most of the other stuff is kind of gone.</span> <span class="audio-time caption">Gone to the wayside.</span> <span class="audio-time caption">But I really like, I honestly really like hippie-expand.</span> <span class="audio-time caption">And I know that like, I have rarely heard of other people who use</span> <span class="audio-time caption">hippie-expand.</span> <span class="audio-time caption">But you use it?</span> <span class="audio-time caption">I think you just muted yourself.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> I also vote for hippie-expand.</span> <span class="audio-time caption">It's a nice way to try different functions and just say, I just want</span> <span class="audio-time caption">all these different possible completions to go in there.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Yeah.</span> <span class="audio-time caption">The thing for me that really sold me on hippie-expand is that most of</span> <span class="audio-time caption">the time when I am...</span> <span class="audio-time caption">When I'm doing something, I want to say, like, I can already see that</span> <span class="audio-time caption">word, just pick that one.</span> <span class="audio-time caption">And so I'll type the first characters and hit, like, meta forward</span> <span class="audio-time caption">slash, and ta-da, it's usually there.</span> <span class="audio-time caption">But then sometimes I do really want, like, some Elisp or some other</span> <span class="audio-time caption">stuff.</span> <span class="audio-time caption">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">17:14</span> <strong>yasnippet</strong></div><p></p><span class="audio-time caption"><strong>Shae:</strong> I actually only changed it for the first time recently because I was</span> <span class="audio-time caption">reading a how to write Rust well inside Emacs and they said oh well</span> <span class="audio-time caption">you want to use yasnippet and so I you know the funny thing is that</span> <span class="audio-time caption">yasnippet I believe is the thing that got me into Emacs like in 1999</span> <span class="audio-time caption">I met this Finnish person Erno Kuusela in Oulu, Finland.</span> <span class="audio-time caption">Really cool guy.</span> <span class="audio-time caption">I was like, wow, how do you do this?</span> <span class="audio-time caption">As soon as you open a file, it's got a substructure and a skeleton.</span> <span class="audio-time caption">And when you type part of a function or something,</span> <span class="audio-time caption">it just populates it.</span> <span class="audio-time caption">And he was like, I'm using this snippet command in Emacs.</span> <span class="audio-time caption">That's why I was like, what's Emacs?</span> <span class="audio-time caption">It was very exciting.</span> <span class="audio-time caption">And at the time, I was using Vim.</span> <span class="audio-time caption">And Vim was not as, I don't want to say, automatable.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Yeah, now with Neovim and Lua, people are writing more</span> <span class="audio-time caption">extensions for it.</span> <span class="audio-time caption">But before, you had to know a lot of magic in order to customize Vim.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Right, right.</span> <span class="audio-time caption">I agree.</span> <span class="audio-time caption">Let's see, what else do I do?</span> <span class="audio-time caption">I run my own email server, and I, of course, read my email in Emacs.</span> <span class="audio-time caption">In GNU, no less.</span> <span class="audio-time caption">Which is, I know, an NNTP reader, but it's still also a great...</span> <span class="audio-time caption">I used to use twiddle compile and I think that stopped working like</span> <span class="audio-time caption">six years ago, so I need to get rid of this comment, but there's</span> <span class="audio-time caption">still a lot of kind of cruft from earlier times.</span> <p></p><div class="transcript-heading"><span class="audio-time">18:52</span> <strong>Function keys</strong></div><p></p><span class="audio-time caption"><strong>Shae:</strong> Remember how I said that I use function keys to have like purpose</span> <span class="audio-time caption">specific stuff?</span> <span class="audio-time caption">This was especially true because, I mean, I had my left arm strapped</span> <span class="audio-time caption">to my chest for like a year and three months before I even started</span> <span class="audio-time caption">regaining any flexibility, and that meant that...</span> <span class="audio-time caption">I'm amazed that you could just map them directly to single commands</span> <span class="audio-time caption">instead of giving in to the temptation to make them prefixes for</span> <span class="audio-time caption">longer keystrokes.</span> <span class="audio-time caption">I didn't really have the choice because I had only one arm that</span> <span class="audio-time caption">worked. It was just a lot harder to do any chording at the time.</span> <span class="audio-time caption">I still have a lot of these.</span> <span class="audio-time caption">F3 I use a lot, which is like, oh, what am I working on right now?</span> <span class="audio-time caption">That is org-clock-goto.</span> <span class="audio-time caption">A lot of times, I want to have a terminal</span> <span class="audio-time caption">that's in Emacs, so that's vterm,</span> <p></p><div class="transcript-heading"><span class="audio-time">20:02</span> <strong>Org Mode
</strong></div><p></p><a href="https://sachachua.com/blog/category/emacs/feed/ec22-shae-erisson-00-20-17-133.jpg"><img loading="lazy" src="https://sachachua.com/blog/category/emacs/feed/ec22-shae-erisson-00-20-17-133.jpg" alt="image from video 00:20:17.133"></a><span class="audio-time caption"><strong>Shae:</strong> And I actually really do use the calendar all the time. This is like</span> <span class="audio-time caption">just switch to whatever it is. Of course, my email is here. You know</span> <span class="audio-time caption">what, let's see... So this... I don't know, have you seen this</span> <span class="audio-time caption">before? Have you seen this thing called STARTED in an Org mode file?</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> I use a STARTED state, yes.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Well, I got it from you!</span> <span class="audio-time caption">So if I look at like, my Org Mode configuration,</span> <span class="audio-time caption">a lot of this STARTED stuff I have from you,</span> <span class="audio-time caption">I don't know when,</span> <span class="audio-time caption">but you were the person who introduced me to it.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> It's the reminder that I did start working on this.</span> <span class="audio-time caption">I tend to get distracted by intermediate tasks, so it's nice to be</span> <span class="audio-time caption">able to say, try to finish these ones first before you move on to the</span> <span class="audio-time caption">next thing, maybe?</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> I agree. I have the same thing, yeah.</span> <span class="audio-time caption">And I keep meaning, because this is...</span> <span class="audio-time caption">I know that you can put Org Mode configuration into the first</span> <span class="audio-time caption">TODO item. I would really like to move it into the elisp</span> <span class="audio-time caption">and I just haven't gotten around to it.</span> <span class="audio-time caption">And it's been 10 years. I mean,</span> <span class="audio-time caption">maybe I should just do it.</span> <p></p><div class="transcript-heading"><span class="audio-time">21:14</span> <strong>Show Org agenda when idle
</strong></div><p></p><a href="https://sachachua.com/blog/category/emacs/feed/ec22-shae-erisson-00-21-23-933.jpg"><img loading="lazy" src="https://sachachua.com/blog/category/emacs/feed/ec22-shae-erisson-00-21-23-933.jpg" alt="image from video 00:21:23.933"></a><span class="audio-time caption"><strong>Shae:</strong> One of the things I did that I found fun...</span> <span class="audio-time caption">I really have written almost zero Elisp,</span> <span class="audio-time caption">but I did actually puzzle my way through this a year ago.</span> <span class="audio-time caption">Since so much of my life is in Org Mode, I learned how to make timers.</span> <span class="audio-time caption">This is very close to what you get directly out of how to do timers</span> <span class="audio-time caption">in Emacs.</span> <span class="audio-time caption">After some amount of time, I want my Org agenda to pop up because I</span> <span class="audio-time caption">want to say like, oh, what is the stuff I'm supposed to be doing?</span> <span class="audio-time caption">And what am I forgetting?</span> <span class="audio-time caption">What has been scheduled?</span> <span class="audio-time caption">And what is on my to-do list?</span> <span class="audio-time caption">And I also like to look at</span> <span class="audio-time caption">what is the stuff I've been working on lately?</span> <span class="audio-time caption">And I really like that a lot.</span> <p></p><div class="transcript-heading"><span class="audio-time">21:58</span> <strong>Programmers want flow. When programming, light turns red
</strong></div><p></p><a href="https://sachachua.com/blog/category/emacs/feed/ec22-shae-erisson-00-22-16-067.jpg"><img loading="lazy" src="https://sachachua.com/blog/category/emacs/feed/ec22-shae-erisson-00-22-16-067.jpg" alt="image from video 00:22:16.067"></a><span class="audio-time caption"><strong>Shae:</strong> Another thing that I realized is that I had a blog post</span> <span class="audio-time caption">that was wildly popular.</span> <span class="audio-time caption">Where did I put it?</span> <span class="audio-time caption">And it was all about Emacs.</span> <span class="audio-time caption">I don't know if you saw the... Here we go.</span> <span class="audio-time caption">It was... Ah, here it is.</span> <span class="audio-time caption">So here it is in... This is very much an Emacs...</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Oh, yeah, I remember that one.</span> <span class="audio-time caption">I put it in Emacs News.</span> <span class="audio-time caption">I thought it was great.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> All right, cool.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> I would like the kiddo to sometimes be able to acknowledge this,</span> <span class="audio-time caption">but this is not happening.</span> <span class="audio-time caption">Still, yes.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Right, right.</span> <span class="audio-time caption">Yeah, and so this was really fun because, like...</span> <span class="audio-time caption">I had a friend who was in development and there was like millions of</span> <span class="audio-time caption">dollars spent on how do you detect whether a programmer is in flow</span> <span class="audio-time caption">and it came down to if they're typing they're probably in flow so and</span> <span class="audio-time caption">that was it because they tried to look at EGs and doing all kinds of</span> <span class="audio-time caption">other stuff but it was like if they're typing don't interrupt them.</span> <span class="audio-time caption">And I don't know, because I do so much in Emacs, I'm not sure how</span> <span class="audio-time caption">accurate this was. But basically,</span> <span class="audio-time caption">that's where I learned to do timers the first time.</span> <span class="audio-time caption">Or maybe... I don't remember which one I did first.</span> <span class="audio-time caption">And the idea then was as soon as basically my average typing into</span> <span class="audio-time caption">Emacs has gone up a certain amount,</span> <span class="audio-time caption">then it will actually switch to busy.</span> <span class="audio-time caption">And it works just fine. It was a lot of fun to write.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> So yeah, interesting use of getting the activity.</span> <span class="audio-time caption">I've seen other fun implementations of this.</span> <span class="audio-time caption">I think there's a c-c-c-combo package that makes some fun</span> <span class="audio-time caption">animation appear if you're typing really quickly.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Oh, oh, yeah.</span> <span class="audio-time caption">I'm guessing because I think Atom, the Atom editor had that for a</span> <span class="audio-time caption">while.</span> <span class="audio-time caption">I guess that's where it came from.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> So yeah, because you can instrument Emacs and play around</span> <span class="audio-time caption">with it, you can certainly do all sorts of things based on that</span> <span class="audio-time caption">information.</span> <span class="audio-time caption">Okay, so you've got it, you've got it set up so that when you come</span> <span class="audio-time caption">back to your computer, it'll show you the stuff that you've been</span> <span class="audio-time caption">working on.</span> <span class="audio-time caption">And when you're working on the things, you can tell it to tell the</span> <span class="audio-time caption">rest of the world not to bug you.</span> <span class="audio-time caption">Gotcha.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> That's right.</span> <span class="audio-time caption">[Sacha: What other fun stuff do you have in there?</span> <p></p><div class="transcript-heading"><span class="audio-time">24:25</span> <strong>ef-themes and modus-themes, season</strong></div><p></p><span class="audio-time caption"><strong>Shae:</strong> I discovered that I love the EF themes.</span> <span class="audio-time caption">I love the Modus themes.</span> <span class="audio-time caption">They make me very happy.</span> <span class="audio-time caption">They're just unreasonably pleasant.</span> <span class="audio-time caption">As someone who has tried every single Emacs theme ever, they're just</span> <span class="audio-time caption">my favorite themes.</span> <p></p><a href="https://sachachua.com/blog/category/emacs/feed/ec22-shae-erisson-00-24-41-000.jpg"><img loading="lazy" src="https://sachachua.com/blog/category/emacs/feed/ec22-shae-erisson-00-24-41-000.jpg" alt="image from video 00:24:41.000"></a><span class="audio-time caption"><strong>Shae:</strong> And so, at the moment, it's</span> <span class="audio-time caption">summer... Where did my summer go? How can this be? There we go.</span> <span class="audio-time caption">How come I'm in spring? Wait, isn't spring over?</span> <span class="audio-time caption">Hasn't summer just started?</span> <span class="audio-time caption">You know what I was thinking would be fun would be take the time of</span> <span class="audio-time caption">day, and you know that the EF themes has spring, summer, autumn,</span> <span class="audio-time caption">and winter, and I'm not sure if there are dark versions of each of</span> <span class="audio-time caption">those, but I thought, like I know that Modus themes will do this like</span> <span class="audio-time caption">check for the local time of when it turns dark, and then it</span> <span class="audio-time caption">will go from the light theme to the dark theme as soon as the sun</span> <span class="audio-time caption">hits, and I was like, well, what if I do that for seasons, you know,</span> <span class="audio-time caption">wouldn't that be cool?</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> There's this subtle sense of change as you go through the year.</span> <span class="audio-time caption">But of course you also have this thing there</span> <span class="audio-time caption">where you just randomize it.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Well, I like that.</span> <span class="audio-time caption">Sometimes it's like I'm just kind of like, ah, I'm bored.</span> <span class="audio-time caption">I'm just bored of what I'm looking at.</span> <span class="audio-time caption">And so I will just change my thing.</span> <span class="audio-time caption">And it's just time for something.</span> <span class="audio-time caption">I don't know.</span> <span class="audio-time caption">It seems to work.</span> <span class="audio-time caption">It's like it gives me a little brain break from what I was staring at.</span> <span class="audio-time caption">And I did not know I was going to reset the effects scale, but that's</span> <span class="audio-time caption">fine.</span> <span class="audio-time caption">Interesting.</span> <span class="audio-time caption">What else do I have in here?</span> <p></p><div class="transcript-heading"><span class="audio-time">25:56</span> <strong>htmlize (does this still work on Wayland?)</strong></div><p></p><span class="audio-time caption"><strong>Shae:</strong> Oh, Emacs HTMLize.</span> <span class="audio-time caption">I'm a little sad.</span> <span class="audio-time caption">I switched to Wayland.</span> <span class="audio-time caption">And if I remember correctly, HTMLize only works with, or maybe</span> <span class="audio-time caption">HTMLize still works, and it's the SVG one that doesn't work.</span> <span class="audio-time caption">Emacs SVG is a thing that if you're running with an X11 backend, you</span> <span class="audio-time caption">can turn your current screen directly into an SVG, which is really</span> <span class="audio-time caption">cute.</span> <span class="audio-time caption">It does not work in Wayland.</span> <span class="audio-time caption">I think HTMLize does still work.</span> <span class="audio-time caption">What other things do I have in here?</span> <span class="audio-time caption">I don't know.</span> <span class="audio-time caption">I guess a lot of it lately has been trying to make Rust things work</span> <span class="audio-time caption">smoothly.</span> <span class="audio-time caption">I've been trying to do some... I wonder does... Oh, cool.</span> <span class="audio-time caption">That was not what I expected.</span> <p></p><div class="transcript-heading"><span class="audio-time">26:37</span> <strong>lsp-ui-imenu, jumping through rust code
</strong></div><p></p><a href="https://sachachua.com/blog/category/emacs/feed/ec22-shae-erisson-00-26-41-100.jpg"><img loading="lazy" src="https://sachachua.com/blog/category/emacs/feed/ec22-shae-erisson-00-26-41-100.jpg" alt="image from video 00:26:41.100"></a><span class="audio-time caption"><strong>Shae:</strong> I just started doing this thing with imenu.</span> <span class="audio-time caption">imenu integrates nicely with LSP.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> That is a very pretty sidebar thing, and I need to learn how</span> <span class="audio-time caption">to do that.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> So because I have all these extra modifiers, my s-i is</span> <span class="audio-time caption">lsp-ui-imenu.</span> <span class="audio-time caption">And the reason that what I mostly use that for is when I have like a</span> <span class="audio-time caption">bunch of Rust code and I want to quickly jump through the structure</span> <span class="audio-time caption">of it.</span> <span class="audio-time caption">Basically that integrates with LSP, finds all the definitions, and I</span> <span class="audio-time caption">can quickly jump through it.</span> <span class="audio-time caption">I used to use lsp-treemacs for that, but lsp-treemacs puts things in</span> <span class="audio-time caption">its own order, not quite the same order I want, although treemacs is</span> <span class="audio-time caption">quite nice.</span> <span class="audio-time caption">I think that the thing to do is that you and I at some time maybe the</span> <span class="audio-time caption">next time if we do this again we should set up with a Shwim</span> <span class="audio-time caption">connection and you and I can both share our Emacs and then you can</span> <span class="audio-time caption">show me cool things that you do and I can show you cool things that I</span> <span class="audio-time caption">do and then we can start filing over some of the things.</span> <span class="audio-time caption">How about that?</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> That sounds fantastic.</span> <span class="audio-time caption">I know we'd wanted to experiment with pair programming a long time</span> <span class="audio-time caption">ago so that sounds like a seamless way to do it.</span> <span class="audio-time caption">And therefore I will go and figure out how to install shim and get it</span> <span class="audio-time caption">working.</span> <span class="audio-time caption">I will probably need your help to actually test it.</span> <span class="audio-time caption">I don't know, I think I can rustle up.</span> <span class="audio-time caption">Maybe it'll work off my phone.</span> <span class="audio-time caption">You haven't tried that.</span> <span class="audio-time caption">But lspui, okay, so I've just been using straight up imenu, like on</span> <span class="audio-time caption">Neanderthal, but lsp-ui has this fancy grouping of things and colors</span> <span class="audio-time caption">and stuff, so I definitely want to check that out.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> I'm a fan, yeah.</span> <span class="audio-time caption">I don't know.</span> <span class="audio-time caption">Do I have anything else exciting that goes with this in here?</span> <p></p><div class="transcript-heading"><span class="audio-time">28:25</span> <strong>laptop with 126GB of RAM</strong></div><p></p><span class="audio-time caption"><strong>Shae:</strong> I will say that at the moment, the system I'm working on, I like</span> <span class="audio-time caption">buying unreasonably powerful laptops.</span> <span class="audio-time caption">And so, like, this system has 128 gigs of RAM and 24 cores.</span> <span class="audio-time caption">My previous laptop has 192 gigs of RAM.</span> <span class="audio-time caption">Long story short, I end up in a lot of cases where I want to use more</span> <span class="audio-time caption">memory.</span> <span class="audio-time caption">I've got all these cores.</span> <span class="audio-time caption">Can you do something with them?</span> <span class="audio-time caption">Perhaps you've already seen things like LSP doctor, which will say,</span> <span class="audio-time caption">have you tried this thing?</span> <span class="audio-time caption">Have you done this other thing?</span> <span class="audio-time caption">LSP has really changed</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> I have not.</span> <span class="audio-time caption">Sorry, would you like to show me this LSP doctor thing?</span> <span class="audio-time caption">Because I have not ever seen it.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Yeah.</span> <span class="audio-time caption">Do you use language servers much for your development?</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> I am only just getting used to having a relatively modern</span> <span class="audio-time caption">2018 instead of 2010 laptop.</span> <span class="audio-time caption">And so I have the red squigglies and various things, but I don't know</span> <span class="audio-time caption">what to do with them yet.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Well, I mean, I'm doing a lot of this.</span> <span class="audio-time caption">So I have...</span> <p></p><div class="transcript-heading"><span class="audio-time">29:46</span> <strong>LSP coolness, Haskell, treesitter</strong></div><p></p><span class="audio-time caption"><strong>Shae:</strong> Originally for me it was like I spent a lot of time with the Haskell</span> <span class="audio-time caption">language server because I was doing so much Haskell and it was a</span> <span class="audio-time caption">super powerful thing.</span> <span class="audio-time caption">In fact, somebody decided to hammer in half of a proof assistant into</span> <span class="audio-time caption">the Haskell language server and that was magic.</span> <span class="audio-time caption">You could do incredible stuff with that because you could just grab</span> <span class="audio-time caption">all of your local variables and transform the whole shape of your</span> <span class="audio-time caption">function and you could just write little snippets and just have it</span> <span class="audio-time caption">work.</span> <span class="audio-time caption">And that was amazing.</span> <span class="audio-time caption">It wasn't quite... One of the goals that I believe is...</span> <span class="audio-time caption">For future development of all programming editors, I believe that</span> <span class="audio-time caption">something like Emacs macros, but instead for abstract syntax trees, I</span> <span class="audio-time caption">believe this is an essential ingredient that we do not yet have.</span> <span class="audio-time caption">And I think that TreeSitter is the first step towards there.</span> <span class="audio-time caption">We now have one of the hats, right?</span> <span class="audio-time caption">Which is where we can take... TreeSitter is, you know, if you've used</span> <span class="audio-time caption">it...</span> <span class="audio-time caption">It is like you write some effectively C code to produce a really fast</span> <span class="audio-time caption">parser.</span> <span class="audio-time caption">Or is it like JavaScript that then compiles to C code?</span> <span class="audio-time caption">I forget exactly how it works.</span> <span class="audio-time caption">But the nice thing about TreeSitter is, I don't know if you remember,</span> <span class="audio-time caption">I'm sure you do remember, that if you were writing Python code and</span> <span class="audio-time caption">you used a triple-quoted string, you had to then add a comment with</span> <span class="audio-time caption">another quote because regular expressions is how Emacs was doing all</span> <span class="audio-time caption">the syntax highlighting.</span> <span class="audio-time caption">And honestly, that was kind of crap.</span> <span class="audio-time caption">And then there were projects like the Semantic Bovinator that made a</span> <span class="audio-time caption">full parsing suite in Elisp, which to me is half brilliant and half</span> <span class="audio-time caption">insane.</span> <span class="audio-time caption">And then there was TreeSitter, which kind of took over the world</span> <span class="audio-time caption">because it was... I think that the language server and TreeSitter are</span> <span class="audio-time caption">the first two of these editor generic pieces, and I suspect there</span> <span class="audio-time caption">will be more.</span> <span class="audio-time caption">I think that something where you can modify the abstract syntax tree</span> <span class="audio-time caption">and then put back to the source</span> <span class="audio-time caption">is one of those potential paths forward.</span> <span class="audio-time caption">I hope so.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Yeah, that would be great if you could just do the</span> <span class="audio-time caption">manipulations and then roundtrip it back into source code.</span> <span class="audio-time caption">Just regenerate the changed part of your code.</span> <span class="audio-time caption">That sounds fantastic.</span> <span class="audio-time caption">So it sounds like you were able to do some kind of manipulation with</span> <span class="audio-time caption">the Haskell use case that you were describing.</span> <span class="audio-time caption">Any chance you can show us like the awesomeness?</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Sadly,</span> <span class="audio-time caption">that sadly does not work anymore.</span> <p></p><div class="transcript-heading"><span class="audio-time">31:58</span> <strong>Combobulate</strong></div><p></p><span class="audio-time caption"><strong>Shae:</strong> But you know, if you're looking for something in that area, have you</span> <span class="audio-time caption">heard of a Emacs library called Combobulate?</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> I have heard of it.</span> <span class="audio-time caption">I haven't dug into it.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> So it uses TreeSitter for source code manipulation by, and</span> <span class="audio-time caption">it's a lot closer to the way that like, you know, in Org Mode, you</span> <span class="audio-time caption">can like hold meta and arrow to kind of move things around.</span> <span class="audio-time caption">It uses TreeSitter to let you both move around in the context as well</span> <span class="audio-time caption">as actually alter the shape.</span> <span class="audio-time caption">And to me, this is the first step towards this tool that I want,</span> <span class="audio-time caption">which is where I can write a keyboard macro and have it edit an</span> <span class="audio-time caption">abstract syntax tree and then spit the results back into the buffer.</span> <span class="audio-time caption">Yeah.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> All right.</span> <p></p><div class="transcript-heading"><span class="audio-time">32:46</span> <strong>What else are you using your 126 gigabytes of RAM for?</strong></div><p></p><span class="audio-time caption"><strong>Sacha:</strong> What else are you using your 126 gigabytes of RAM for?</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Let's see.</span> <span class="audio-time caption">Honestly, I'm going to tell you that Rust Analyzer can take a lot of</span> <span class="audio-time caption">memory.</span> <span class="audio-time caption">And a Rust compilation can take a lot of cores.</span> <span class="audio-time caption">And I'm okay with that because I actually, I do like, and I will say</span> <span class="audio-time caption">that this laptop is actually from this year.</span> <span class="audio-time caption">So it's a brand new, like, top of the line.</span> <span class="audio-time caption">But then like, how would I, because I've got like, which I think is a</span> <span class="audio-time caption">bunch of matrix multiplication hardware.</span> <span class="audio-time caption">How do I use that from Emacs?</span> <span class="audio-time caption">I don't know. I'm sure I can find something, you know.</span> <p></p><div class="transcript-heading"><span class="audio-time">33:25</span> <strong>TalonVoice</strong></div><p></p><span class="audio-time caption"><strong>Sacha:</strong> Maybe voice computing?</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Oh, that's an idea. Yeah, one of my friends, she's using Talon.</span> <span class="audio-time caption">Have you heard of Talon?</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Yeah, I've heard of Talon.</span> <span class="audio-time caption">There are a couple of videos about people using Talon to code by</span> <span class="audio-time caption">voice, usually involving memorizing kind of a different alphabet for</span> <span class="audio-time caption">very quickly accessing different shortcuts.</span> <span class="audio-time caption">But it sounds really cool, and you sound like you've got the hardware</span> <span class="audio-time caption">to do something amazing with it.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> That's true.</span> <span class="audio-time caption">Well, you know, Talon actually lets you do something very similar to</span> <span class="audio-time caption">Combobulate, where you can navigate the AST of your source code.</span> <span class="audio-time caption">You can kind of move around very quickly.</span> <span class="audio-time caption">I don't know, like, are we like at the end of our?</span> <span class="audio-time caption">No, no, we're halfway through, right?</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> We're halfway through.</span> <span class="audio-time caption">I have about 28 minutes before the kiddo runs out and starts</span> <span class="audio-time caption">demanding lunch.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Okay, well, I feel like I've been driving the structure of</span> <span class="audio-time caption">our just kind of like dumping random things.</span> <span class="audio-time caption">Did you have any questions or anything you wanted to cover?</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> This is all amazing.</span> <span class="audio-time caption">I come in with no preconceived notions.</span> <span class="audio-time caption">I'm just like, okay, shapr does cool things with Emacs.</span> <span class="audio-time caption">Let's hear about it.</span> <span class="audio-time caption">Let's go, let's go.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> That works for me.</span> <span class="audio-time caption">Yeah.</span> <span class="audio-time caption">I mean, a lot of it's been focused on Rust development lately.</span> <span class="audio-time caption">Rust and Jujutsu.</span> <p></p><div class="transcript-heading"><span class="audio-time">34:45</span> <strong>NixOS, following Steve Purcell about 5 years behind</strong></div><p></p><span class="audio-time caption"><strong>Shae:</strong> I've been doing a lot of Nix.</span> <span class="audio-time caption">I'm running NixOS.</span> <span class="audio-time caption">I don't know if you're familiar, but that's been great fun.</span> <span class="audio-time caption">It's funny, I feel like I've been following Steve Purcell around from</span> <span class="audio-time caption">a technical perspective.</span> <span class="audio-time caption">I'm always about five years behind Steve.</span> <p></p><div class="transcript-heading"><span class="audio-time">35:03</span> <strong>envrc</strong></div><p></p><span class="audio-time caption"><strong>Shae:</strong> I was like, oh, you know, NixOS is kind of a pain with Emacs.</span> <span class="audio-time caption">And just like this, what was it, NixOS?</span> <span class="audio-time caption">I forget.</span> <span class="audio-time caption">Anyway, Steve was like, oh, well, have you tried my library, envrc?</span> <span class="audio-time caption">And I was like, what's that?</span> <span class="audio-time caption">And he was like, well, now each buffer can have its own envrc.</span> <span class="audio-time caption">And I was like, it's perfect.</span> <span class="audio-time caption">That's exactly what I need.</span> <span class="audio-time caption">Because previously, every time I switched buffers, it would then go</span> <span class="audio-time caption">load all of the local</span> <span class="audio-time caption">everything in Nix.</span> <span class="audio-time caption">And sometimes that could take a long time, especially if I'm doing</span> <span class="audio-time caption">Haskell, that could take 10 seconds, and I really don't want that</span> <span class="audio-time caption">sort of lag.</span> <span class="audio-time caption">And so Steve Purcell's brilliant library, envrc, says, you know what?</span> <span class="audio-time caption">Every single buffer can just keep such a thing, and then you can only</span> <span class="audio-time caption">relit it when you need to.</span> <span class="audio-time caption">And that's pretty awesome.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> That sounds cool, and I should check that out too.</span> <p></p><div class="transcript-heading"><span class="audio-time">35:52</span> <strong>time-tracking</strong></div><p></p><span class="audio-time caption"><strong>Sacha:</strong> @JacksonScholberg has a question.</span> <span class="audio-time caption">He says, "I was curious about what you were tracking your time working</span> <span class="audio-time caption">on, how you track it."</span> <span class="audio-time caption">Is it just Org Clock?</span> <span class="audio-time caption">So this is how you keep track of the things you're working on and</span> <span class="audio-time caption">what got interrupted by the new thing that you just added to the</span> <span class="audio-time caption">stack and so forth?</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Right.</span> <span class="audio-time caption">In fact, I have this thing.</span> <span class="audio-time caption">Honestly, when I sit down on my computer,</span> <span class="audio-time caption">Just clock in.</span> <span class="audio-time caption">You'll notice in the bottom right here, we have chat with Sacha,</span> <span class="audio-time caption">right?</span> <span class="audio-time caption">And so like, I just kind of clock in stuff.</span> <span class="audio-time caption">And like, I'm not always, I really kind of need to reorganize my Org</span> <span class="audio-time caption">mode files because I've been naming them per host because I</span> <span class="audio-time caption">previously had like a work Org mode and I had a home Org mode.</span> <span class="audio-time caption">now that my home hardware is also my work hardware I guess and so</span> <span class="audio-time caption">like I still have my previous laptops things where I'm keeping my</span> <span class="audio-time caption">events I really need to reorganize things but I mean yeah I schedule</span> <span class="audio-time caption">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">37:01</span> <strong>taxes with Org Mode, remote lookup
</strong></div><p></p><a href="https://sachachua.com/blog/category/emacs/feed/ec22-shae-erisson-00-37-09-900.jpg"><img loading="lazy" src="https://sachachua.com/blog/category/emacs/feed/ec22-shae-erisson-00-37-09-900.jpg" alt="image from video 00:37:09.900"></a><span class="audio-time caption"><strong>Shae:</strong> I decided that it would be great fun to do my taxes.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> You are showing me your taxes, do I need to like black out</span> <span class="audio-time caption">this whole thing?</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Well, this is actually just an example from the docs.</span> <span class="audio-time caption">So I could actually share my taxes on it because I mostly don't care.</span> <span class="audio-time caption">But I think in fact you can figure out exactly how much money I'm</span> <span class="audio-time caption">making by looking at the open whatever.</span> <span class="audio-time caption">So the thing about this is that I decided to file all of my tax forms</span> <span class="audio-time caption">directly into Org Mode spreadsheets and then do remote lookups.</span> <span class="audio-time caption">So basically each spreadsheet was one particular form.</span> <span class="audio-time caption">And then once I'd gotten to the bottom, like I need this result, like</span> <span class="audio-time caption">what's my estimated income?</span> <span class="audio-time caption">And then I would use the lookup, kind of this cross spreadsheet</span> <span class="audio-time caption">lookup.</span> <span class="audio-time caption">And that's how I did my taxes for last year.</span> <span class="audio-time caption">And then my de facto mother-in-law, she's an accountant, and she</span> <span class="audio-time caption">didn't exactly do this thing, but it was pretty close.</span> <span class="audio-time caption">She was like, you've got all your taxes in the spreadsheet.</span> <span class="audio-time caption">I was like, yeah.</span> <span class="audio-time caption">And then she looked at it and she was like, what is that?</span> <span class="audio-time caption">And I was like, anyway.</span> <span class="audio-time caption">So I got to kind of file everything back out into TurboTax, but that</span> <span class="audio-time caption">was a fun thing to build.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Yeah, I have something like that too.</span> <span class="audio-time caption">So for example, whenever I do my tax paperwork, I just have to have</span> <span class="audio-time caption">like, you know, the step by step checklist.</span> <span class="audio-time caption">Okay, this is where I need to go to get this number.</span> <span class="audio-time caption">This is where I can put it in.</span> <span class="audio-time caption">And then eventually it spits out a table that says, okay, put this in</span> <span class="audio-time caption">box 11, put this in box 13, so that I don't have to do the steps by</span> <span class="audio-time caption">hand.</span> <span class="audio-time caption">Because even before the, you know, for me, I use like simple stacks</span> <span class="audio-time caption">or whatever, it's web based.</span> <span class="audio-time caption">But before you get to the point where you can put the numbers in the</span> <span class="audio-time caption">form, you gotta go to this website, calculate this thing, and Org</span> <span class="audio-time caption">just makes all of that so much easier.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> I agree.</span> <span class="audio-time caption">Yeah.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> And this remote lookup thing is something I'm always looking</span> <span class="audio-time caption">up because Org tables are so powerful, but also I need more examples</span> <span class="audio-time caption">in my life to remember how to use them.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Well, I think it took me four hours the first time to get it</span> <span class="audio-time caption">all figured out.</span> <span class="audio-time caption">But I can send you an example without showing it here.</span> <span class="audio-time caption">I can send you an example because I figured out, I think I've</span> <span class="audio-time caption">hammered the remote lookup down very thoroughly.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> And once you've got it right, you can just keep filling that</span> <span class="audio-time caption">in or copy and paste it.</span> <span class="audio-time caption">You have an example of the syntax and that's already all you need.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Right.</span> <span class="audio-time caption">I did run across some limitations of the</span> <span class="audio-time caption">evaluation method of Org mode spreadsheets.</span> <span class="audio-time caption">But maybe I've been using them a little too hard,</span> <span class="audio-time caption">if that makes any sense.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Oh, what kind of limitation?</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Honestly, I think I finally found a way to say every</span> <span class="audio-time caption">single... Because it was...</span> <span class="audio-time caption">So really the way that spreadsheets work is they're much more like</span> <span class="audio-time caption">Dataflow.</span> <span class="audio-time caption">And that is just that you end up with, like, either you work from the</span> <span class="audio-time caption">endpoint, which is like much more Haskell style evaluation, which is</span> <span class="audio-time caption">where you're like, I need to start here.</span> <span class="audio-time caption">What depends on this?</span> <span class="audio-time caption">But in the case where you have a whole bunch of different Org Mode</span> <span class="audio-time caption">spreadsheets, I think I ended up with this little text style hack</span> <span class="audio-time caption">where I just ran it a bunch of times.</span> <span class="audio-time caption">So it's like evaluate, evaluate, evaluate.</span> <span class="audio-time caption">Because remote lookups</span> <span class="audio-time caption">I ran, you know, I don't remember.</span> <span class="audio-time caption">And I think I took notes, but I don't remember.</span> <span class="audio-time caption">That's one of the great things about Org Mode is that I swear it's</span> <span class="audio-time caption">my, like, half of my brain is in my Org Mode notes.</span> <span class="audio-time caption">And whenever I had, I'm like, oh, what was that thing?</span> <span class="audio-time caption">I'm like, well, fortunately, with my terrible short-term memory, I</span> <span class="audio-time caption">took copious notes because otherwise I would never be able to get</span> <span class="audio-time caption">back to it.</span> <p></p><div class="transcript-heading"><span class="audio-time">40:55</span> <strong>finding notes with C-s</strong></div><p></p><span class="audio-time caption"><strong>Sacha:</strong> What is your favorite way of finding those notes?</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> I actually use a lot of C-s just because I kind of have</span> <span class="audio-time caption">some idea of where they are in my tree structure and I'll also say I</span> <span class="audio-time caption">use a lot of my Org capture templates and they're not super</span> <span class="audio-time caption">complicated.</span> <span class="audio-time caption">I have like a to-do, I have a journal, I have ideas and like random</span> <span class="audio-time caption">ideas will float into my head like you saw Markov keyboard right it</span> <span class="audio-time caption">is like the weirdest art piece you've seen all day right and</span> <span class="audio-time caption">Markup keyboard shows up on the front page of Hacker News once a year</span> <span class="audio-time caption">or so.</span> <span class="audio-time caption">And people are like, programmers have gone too far.</span> <span class="audio-time caption">This cannot possibly be usable by humans or something.</span> <span class="audio-time caption">And I'm like, well, I don't know.</span> <span class="audio-time caption">I think it was art.</span> <span class="audio-time caption">And so a lot of times those things will drop into my head, something</span> <span class="audio-time caption">like that, where I'm trying to do something else.</span> <span class="audio-time caption">And so I will quickly write down the idea and then just gotten it out</span> <span class="audio-time caption">of my head enough that I can continue with what I was doing.</span> <span class="audio-time caption">And so I have a long list of strange ideas.</span> <span class="audio-time caption">A recent one was like, you've probably had your teeth worked on once</span> <span class="audio-time caption">or twice.</span> <span class="audio-time caption">And you know that the dentist always had to move the light around.</span> <span class="audio-time caption">And I'm like, but we have really good eye tracking.</span> <span class="audio-time caption">Wouldn't it make sense to figure out where the dentist or the car</span> <span class="audio-time caption">mechanic is what they're looking at?</span> <span class="audio-time caption">And then have the light move around behind them to figure out how to</span> <span class="audio-time caption">actually light up the place they're looking at, right?</span> <span class="audio-time caption">We've got vision tracking.</span> <span class="audio-time caption">Why don't we do this?</span> <span class="audio-time caption">But I don't really, yeah.</span> <span class="audio-time caption">I decided maybe I don't want to work on that one right now.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> It sounds like an involved project.</span> <span class="audio-time caption">Yeah.</span> <span class="audio-time caption">Yeah, yeah, yeah.</span> <span class="audio-time caption">Okay, so you're capturing, you're stuffing a lot of these ideas into</span> <span class="audio-time caption">an inbox.</span> <p></p><div class="transcript-heading"><span class="audio-time">42:35</span> <strong>Org Mode, managing inbox</strong></div><p></p><span class="audio-time caption"><strong>Sacha:</strong> A lot of people are probably in the same boat where they've got these</span> <span class="audio-time caption">inboxes full of ideas.</span> <span class="audio-time caption">How do you deal?</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> I archive stuff when I'm done with it.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Oh yeah?</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Yeah, so a lot of times, and I find this very valuable, is</span> <span class="audio-time caption">like if I look at... Do I have it?</span> <span class="audio-time caption">Oops, that was not what I meant to do.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Alright, so you basically just do aggressive speed commands,</span> <span class="audio-time caption">archive, archive, archive, or look at the agenda and just mark a</span> <span class="audio-time caption">whole bunch of things and say, that's it, that's gone.</span> <span class="audio-time caption">It was written down and then it can go.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Yeah, well, when I'm really done with something, when the</span> <span class="audio-time caption">thing is finished, then I will just archive it.</span> <span class="audio-time caption">I mean, do you use Archive much?</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> I do.</span> <span class="audio-time caption">I have a function that goes through my inbox file and just archives</span> <span class="audio-time caption">anything that was marked as done.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Oh, nice!</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Because that way it clears it up, right?</span> <span class="audio-time caption">So I'll refile things where I'm like, okay, it's done, but it has</span> <span class="audio-time caption">important information.</span> <span class="audio-time caption">I want to put it somewhere else.</span> <span class="audio-time caption">But if it's just a transitory task that I'm using to remind myself,</span> <span class="audio-time caption">tomorrow I have to do this, go find the water bottle when it's done,</span> <span class="audio-time caption">I don't need to know about it in the future.</span> <span class="audio-time caption">So it's left in my inbox because I checked it off, and then</span> <span class="audio-time caption">periodically I'll say, clean up inbox.</span> <span class="audio-time caption">Not only will it remove all of the done things, but if I leave a tag</span> <span class="audio-time caption">In the title of the task or if the task matches certain regular</span> <span class="audio-time caption">expressions, it will refile it to the appropriate place in my kind of</span> <span class="audio-time caption">more permanent thing.</span> <span class="audio-time caption">So I can say, okay, all of my Emacs related tasks will get</span> <span class="audio-time caption">automatically refiled to my Emacs category without my having to do</span> <span class="audio-time caption">that manually.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> So you're using tagging because I kept trying to do tagging</span> <span class="audio-time caption">and never quite did it.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> I use tagging sometimes when I remember it, but this is also</span> <span class="audio-time caption">why I use the</span> <span class="audio-time caption">The regular expression match against the title.</span> <span class="audio-time caption">I'm using Orgzly on Android to capture the thing on my phone.</span> <span class="audio-time caption">I might want to say this is a consulting task.</span> <span class="audio-time caption">File it in the right place so it doesn't get lost in my inbox.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Wow.</span> <span class="audio-time caption">When is your interview so I can learn from your tricks?</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> This is now. Here we go! You can ask questions.</span> <span class="audio-time caption">The nice thing about conversations is that we jostle different ideas,</span> <span class="audio-time caption">and we are like, oh yeah, maybe I should write a blog post about that,</span> <span class="audio-time caption">because I take it for granted.</span> <span class="audio-time caption">So now apparently I have to write a blog post about my</span> <span class="audio-time caption">cleaning up process.</span> <span class="audio-time caption">My inbox is very long.</span> <span class="audio-time caption">The other thing, speaking of dealing with really long lists that I</span> <span class="audio-time caption">picked up from John Wiegley was I also sometimes remember to check</span> <span class="audio-time caption">this list of random items.</span> <span class="audio-time caption">So in my agenda, there's also like this, you know, random selection</span> <span class="audio-time caption">of things that I have not gotten around to thinking about further,</span> <span class="audio-time caption">but it's there just in case serendipity or boredom make me do</span> <span class="audio-time caption">something.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> you know that's... I've thought about having...</span> <span class="audio-time caption">because you know, I've got the pop-up this little timer that pops up</span> <span class="audio-time caption">my agenda, but I've thought about maybe adding a section I don't know</span> <span class="audio-time caption">if I could add a section here but it would be something that says</span> <span class="audio-time caption">like at the bottom here's two or three random to-do's that have been</span> <span class="audio-time caption">open for a while just like</span> <span class="audio-time caption">for garbage collection.</span> <span class="audio-time caption">Because I know that in Jujutsu, I've got a cool little query that</span> <span class="audio-time caption">says, if you have any change sets that are more than two weeks old</span> <span class="audio-time caption">and are not in a permanent branch state, maybe you should do</span> <span class="audio-time caption">something about them.</span> <span class="audio-time caption">It's just called to do.</span> <span class="audio-time caption">It'd be kind of nice to have that for Org Mode as well.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Yeah, it's just, you know, and our brains do these strange</span> <span class="audio-time caption">things with randomness, right?</span> <span class="audio-time caption">They're like, oh, I want to see what's new now.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Right, right, yeah.</span> <span class="audio-time caption">Oh, I have a question.</span> <span class="audio-time caption">You have this thing where you had...</span> <p></p><div class="transcript-heading"><span class="audio-time">46:28</span> <strong>Timestamps</strong></div><p></p><span class="audio-time caption"><strong>Shae:</strong> I saw you taking notes with Prot,</span> <span class="audio-time caption">and you had this timestamp.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Oh, yeah, yeah, yeah.</span> <span class="audio-time caption">I'm using it now.</span> <span class="audio-time caption">Okay, okay.</span> <span class="audio-time caption">So I have it bound two ways now.</span> <span class="audio-time caption">I have it as a dabbrev, so dynamic abbreviation, and I also have it</span> <span class="audio-time caption">as a yasnippet because sometimes I'm using it with either SPC or</span> <span class="audio-time caption">tab to complete it.</span> <span class="audio-time caption">And I don't really want to think, I just want to get the timestamp in</span> <span class="audio-time caption">and then move on.</span> <span class="audio-time caption">And so abbrevs can run functions to evaluate it.</span> <span class="audio-time caption">You can insert the timestamp that way.</span> <span class="audio-time caption">Or yesnippet, of course, can evaluate the thing.</span> <span class="audio-time caption">And now I have those.</span> <span class="audio-time caption">It's basically just a wall-clock time so that I can go back and plop</span> <span class="audio-time caption">in the chapters as time offsets, which are automatically calculated</span> <span class="audio-time caption">from the YouTube data on when the stream started.</span> <span class="audio-time caption">So I don't have to manually calculate my chapters.</span> <span class="audio-time caption">But it's super useful to have these times everywhere.</span> <span class="audio-time caption">And in this case, during a conversation, I want to be able to say,</span> <span class="audio-time caption">hey, we talked about something interesting.</span> <span class="audio-time caption">And then be able to go back to that point in the video later on.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> So you're matching?</span> <span class="audio-time caption">Oh, oh, wow.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> So my shortcut for yasnippet is "ot" because</span> <span class="audio-time caption">I never type "ot" elsewhere, and it's close enough.</span> <span class="audio-time caption">I use Dvorak, so my O is on home row, and T is close by.</span> <span class="audio-time caption">Also, on the other hand... There you go.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Did I already show you that this is actually Dvorak?</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Oh, there you go.</span> <span class="audio-time caption">Now I can see the keycaps.</span> <span class="audio-time caption">Yeah, earlier it was kind of blurry, but now, yes, yes.</span> <span class="audio-time caption">So yes, that is my shortcut for inserting the timestamp.</span> <span class="audio-time caption">I previously added seconds as well, but then I realized that my kind</span> <span class="audio-time caption">might be false precision.</span> <span class="audio-time caption">So I just, you know, just use a minute at the moment and then I go</span> <span class="audio-time caption">back and adjust the timestamps a little bit later.</span> <span class="audio-time caption">But yeah, you can use abbreviations for all sorts of things,</span> <span class="audio-time caption">including times and dates and stuff.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Have you ever tried Org timestamp?</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Yeah, Org timer.</span> <span class="audio-time caption">So Org timer gives you a relative timestamp, right?</span> <span class="audio-time caption">You can say Org timer.</span> <span class="audio-time caption">Oh, okay.</span> <span class="audio-time caption">So, sorry.</span> <span class="audio-time caption">Are you talking about the C-u C-c ! or something</span> <span class="audio-time caption">of that sort?</span> <span class="audio-time caption">So that's actually what I initially was doing, but then it was too</span> <span class="audio-time caption">many keystroke word modifiers to remember.</span> <span class="audio-time caption">And then I had to press RET to select the, you know, thing.</span> <span class="audio-time caption">So now I just have an abbreviation insert the Org mode formatted</span> <span class="audio-time caption">timestamp for me.</span> <span class="audio-time caption">And then I have this code that searches for Org timestamp regular</span> <span class="audio-time caption">expression and then does the calculation and conversion and stuff.</span> <p></p><div class="transcript-heading"><span class="audio-time">49:12</span> <strong>Org timers
</strong></div><p></p><a href="https://sachachua.com/blog/category/emacs/feed/ec22-shae-erisson-00-53-52-300.jpg"><img loading="lazy" src="https://sachachua.com/blog/category/emacs/feed/ec22-shae-erisson-00-53-52-300.jpg" alt="image from video 00:53:52.300"></a><span class="audio-time caption"><strong>Sacha:</strong> So Org timer is a separate thing.</span> <span class="audio-time caption">It's useful for meetings and things like that.</span> <span class="audio-time caption">You would say, okay, your Org timer starts at the beginning of the</span> <span class="audio-time caption">meeting and then you can have a list and it automatically, like if</span> <span class="audio-time caption">you alt shift enter or something like that in the list, it'll</span> <span class="audio-time caption">automatically like insert the right timer, relative timer to it.</span> <span class="audio-time caption">There you go.</span> <span class="audio-time caption">So there's an org-timer-start.</span> <span class="audio-time caption">But the reason I didn't go that approach was because then you A. have</span> <span class="audio-time caption">to remember to actually start the timer and B. then you have to</span> <span class="audio-time caption">synchronize your time with video time.</span> <span class="audio-time caption">Which might not have started at the same time.</span> <span class="audio-time caption">So now I'm just like, okay, wall clock for everything.</span> <span class="audio-time caption">And then I can do the transformation with whatever I like.</span> <span class="audio-time caption">And since I'm editing my subtitles in Emacs, I can say, hey, this</span> <span class="audio-time caption">file started at this time, according to YouTube.</span> <span class="audio-time caption">And then just, you know, map all of the wall clocks to the</span> <span class="audio-time caption">appropriate subtitle times.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Wow. That's really cool.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Anyway, so timers, relative, absolute, and using</span> <span class="audio-time caption">abbreviations is great.</span> <span class="audio-time caption">Which I think actually is a thing that I picked up from Karl.</span> <span class="audio-time caption">Karl Voit because he also likes to use... He has an abbreviation,</span> <span class="audio-time caption">not at the Emacs level, but he has an abbreviation on his system level,</span> <span class="audio-time caption">like with his window manager, so he can use this timestamp trick</span> <span class="audio-time caption">anywhere, including in Etherpad or wherever else where you</span> <span class="audio-time caption">want to insert the date and time. That's V-o-i-t, by the way.</span> <span class="audio-time caption">But yeah, so times are a great way to just</span> <span class="audio-time caption">leave yourself a pointer to that moment</span> <span class="audio-time caption">so you can go back to it later.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Now I'm curious, how well does that integrate with this sort</span> <span class="audio-time caption">of thing?</span> <span class="audio-time caption">Because I really like looking back at my history agenda.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> If you have it insert an inactive timestamp, I think it</span> <span class="audio-time caption">should still show up there.</span> <span class="audio-time caption">I think it will be a little like those.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Yeah, it looks like the...</span> <span class="audio-time caption">Well, it looks like these two are showing up.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Yeah, yeah, yeah.</span> <span class="audio-time caption">Yeah, so that's a basic thing that I would have inserted by my either</span> <span class="audio-time caption">abbrev or... So it's not even dabbrev.</span> <span class="audio-time caption">It's just regular abbrev in Emacs.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> What's the difference?</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> dabbrev is like hippie...</span> <span class="audio-time caption">Okay, let me just double check here.</span> <span class="audio-time caption">I feel like dabbrev is sort of hippie expand-ish.</span> <span class="audio-time caption">It looks in your buffer or possibly other buffers.</span> <span class="audio-time caption">And I think hippie-expand and dabbrev, they kind of work together.</span> <span class="audio-time caption">It's an option to have them work together.</span> <span class="audio-time caption">Okay, so hippie-expand is...</span> <span class="audio-time caption">Oh, so I see.</span> <span class="audio-time caption">Hippie-expand is the more advanced version of dabbrev.</span> <span class="audio-time caption">dabbrev was Dynamic Expand, and Hippie Expand says, yes, that, but</span> <span class="audio-time caption">try a whole bunch of other things first.</span> <span class="audio-time caption">But my timestamp thing is actually just done by a regular abbrev,</span> <span class="audio-time caption">and I will find the thing in my config for "ot".</span> <span class="audio-time caption">Oh, yeah. I will put it in my chat.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> My spelling, most people say my emails are spelled really well,</span> <span class="audio-time caption">but it's only because I have ispell set up.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Yeah, ispell is great. I am learning French and therefore...</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Oh, c'est très bien.</span> <span class="audio-time caption">Je parle un peu de français aussi.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Oh, oui.</span> <span class="audio-time caption">I'm keeping a journal in French on my blog</span> <span class="audio-time caption">and I have the Tatoeba Project with all the example sentences</span> <span class="audio-time caption">and I have a consult interface to look up stuff in them</span> <span class="audio-time caption">so I can just borrow other people's words</span> <span class="audio-time caption">and try to make it sound more natural.</span> <span class="audio-time caption">Plus of course the usual</span> <span class="audio-time caption">searching for words in dictionaries and stuff.</span> <span class="audio-time caption">Anyway, in the chat, I put in my global abbrev table definition for</span> <span class="audio-time caption">insert format time string.</span> <span class="audio-time caption">In case you want to steal that, it's right there.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> I will definitely save that into my notes here.</span> <p></p><div class="transcript-heading"><span class="audio-time">53:53</span> <strong>Org Mode snippets</strong></div><p></p><span class="audio-time caption"><strong>Shae:</strong> Another thing I use a lot is I use</span> <span class="audio-time caption">Org Mode snippets.</span> <span class="audio-time caption">I will tell you that the first time, I guess if I look back at...</span> <span class="audio-time caption">This is another thing that I have done a lot of in the past, which is</span> <span class="audio-time caption">where...</span> <span class="audio-time caption">I love the fact that Org Mode snippets are just executable.</span> <span class="audio-time caption">I can just run them.</span> <span class="audio-time caption">I guess two jobs, three jobs ago, there was a case where, because I</span> <span class="audio-time caption">would keep the results around and look at them, there was a case</span> <span class="audio-time caption">where, I guess a couple of months before, something got shipped to a</span> <span class="audio-time caption">customer, and I noticed our database schema had changed and I</span> <span class="audio-time caption">prevented a tremendous amount of upset and emergency by being like</span> <span class="audio-time caption">this doesn't look great. I got one from two weeks ago, and it does</span> <span class="audio-time caption">not match. Something's wrong here. Everybody's like, I don't think</span> <span class="audio-time caption">so, Shae. And I'm, like, no no no, we do have a problem, we've got to</span> <span class="audio-time caption">fix this. And they were, like, oh crap! And then I was like, yeah,</span> <span class="audio-time caption">solved a problem!</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Yeah, I basically try to do as much in a snippet instead of</span> <span class="audio-time caption">in, you know, in a scratch buffer or whatever, just because having</span> <span class="audio-time caption">that record, the fact that I did it, and also any notes that I had</span> <span class="audio-time caption">leading up to it and the output of it, it's just so helpful.</span> <p></p><a href="https://sachachua.com/blog/category/emacs/feed/ec22-shae-erisson-00-55-39-300.jpg"><img loading="lazy" src="https://sachachua.com/blog/category/emacs/feed/ec22-shae-erisson-00-55-39-300.jpg" alt="image from video 00:55:39.300"></a><span class="audio-time caption"><strong>Shae:</strong> Oh, I've got a cool thing that I'm doing for work.</span> <span class="audio-time caption">And that is that our readme file is not only a word file, but we also</span> <span class="audio-time caption">have the demonstration of our actual thing is done by using like</span> <span class="audio-time caption">dependent snippets.</span> <span class="audio-time caption">And so that means that like if you want that, perhaps this is</span> <span class="audio-time caption">something everyone already knows, I don't know, but we basically are</span> <span class="audio-time caption">using the results of earlier commands in later places.</span> <span class="audio-time caption">And the other nice thing about that is that then when we want to</span> <span class="audio-time caption">check, we have to effectively dock tests, right?</span> <span class="audio-time caption">When we want to check and see if our software works the way it does</span> <span class="audio-time caption">in the readme, we evaluate the final Org Mode snippet, which then</span> <span class="audio-time caption">calls it forward, calls it forward,</span> <span class="audio-time caption">and then if something goes up or not.</span> <span class="audio-time caption">Well, I guess I need to fix something.</span> <span class="audio-time caption">And so it was pretty exciting to put Org Mode niftyness into our,</span> <span class="audio-time caption">into my Word reading file, you know?</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Nice, nice.</span> <span class="audio-time caption">And you did mention your other coworker is on board with the whole</span> <span class="audio-time caption">Emacs thing.</span> <span class="audio-time caption">So that's one of the things that people are often like, I want to use</span> <span class="audio-time caption">Org Mode and I want to use it for like the documentation or the</span> <span class="audio-time caption">testing or whatever, but they got to get everyone else on board with</span> <span class="audio-time caption">the thing.</span> <span class="audio-time caption">Otherwise it's Jupyter Notebooks or whatever else, right?</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Right.</span> <span class="audio-time caption">Okay, so I have a joke for you that I came up with a long time ago,</span> <span class="audio-time caption">and that is, do you know the only way, there's only one way that</span> <span class="audio-time caption">Sauron could have organized the invasion of Middle-earth, and do you</span> <span class="audio-time caption">know what he used?</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> What?</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Orc Mode.</span> <span class="audio-time caption">It's a terrible joke, isn't it?</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> That's okay.</span> <span class="audio-time caption">I'm sure someone in the comments will come up with an even worse pun.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> I'm excited!</span> <span class="audio-time caption">It's going to be great!</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Never underestimate the punniness of the Emacs</span> <span class="audio-time caption">community.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> I completely agree.</span> <span class="audio-time caption">I don't know.</span> <span class="audio-time caption">Do I have anything else exciting in here?</span> <p></p><div class="transcript-heading"><span class="audio-time">57:15</span> <strong>Compilation finish function: handle success
</strong></div><p></p><a href="https://sachachua.com/blog/category/emacs/feed/ec22-shae-erisson-00-57-48-300.jpg"><img loading="lazy" src="https://sachachua.com/blog/category/emacs/feed/ec22-shae-erisson-00-57-48-300.jpg" alt="image from video 00:57:48.300"></a><span class="audio-time caption"><strong>Shae:</strong> I actually really like this one.</span> <span class="audio-time caption">I used to run all of my tests in compile.</span> <span class="audio-time caption">F12, I have F12 bound to compile.</span> <span class="audio-time caption">And one of the things I wanted was, I wanted something where it was,</span> <span class="audio-time caption">if the compile is successful, don't show me the results, because</span> <span class="audio-time caption">everything's good.</span> <span class="audio-time caption">And so since I'm doing stuff in Rust, when I run all the tests, it</span> <span class="audio-time caption">leaves the buffer up, and I need to get around to actually doing</span> <span class="audio-time caption">stuff like this for Rustic mode as well, where when the tests pass,</span> <span class="audio-time caption">just go away, because it's all good.</span> <span class="audio-time caption">And when the tests don't pass, show me where to...</span> <span class="audio-time caption">I need to look at the problem.</span> <span class="audio-time caption">And I got this from Enberg and Emacs, I don't know, 20 years ago.</span> <span class="audio-time caption">Maybe it was less than 20 years ago, but it probably wasn't.</span> <span class="audio-time caption">So yeah, there's so much good stuff.</span> <span class="audio-time caption">Yeah, there's just so much good stuff.</span> <span class="audio-time caption">And I also like to, oh, look, here we go.</span> <span class="audio-time caption">You can see that this is long gone, by the way.</span> <span class="audio-time caption">It's not there anymore.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> I have a proper, you know, it's sachachua.com/dotemacs.</span> <span class="audio-time caption">A lot easier to remember.</span> <span class="audio-time caption">But yeah, and I think that's, yeah, yeah, I remember that now.</span> <span class="audio-time caption">defadvice is also obsolete.</span> <span class="audio-time caption">The new hotness is advice-add or something like that.</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> Oh, really? I'm going to make another TODO item for there.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> I was digging through my notes trying to find, do you share</span> <span class="audio-time caption">your config anywhere?</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> No, but you know, at this point if I share it on YouTube, I</span> <span class="audio-time caption">might as well just throw it up somewhere.</span> <span class="audio-time caption">Why not?</span> <span class="audio-time caption">It's not very exciting.</span> <span class="audio-time caption">Like if you look at someone like Ross Baker who has magic, like wow,</span> <span class="audio-time caption">is there some magic coming in from Ross Baker?</span> <span class="audio-time caption">I'm so excited to see more stuff from him.</span> <span class="audio-time caption">There's just like, I guess I feel like compared to almost everybody</span> <span class="audio-time caption">else I know, I feel like a power user.</span> <span class="audio-time caption">Because I'm like, you know, I wish I could do this thing.</span> <span class="audio-time caption">A lot of times someone I know is like, well, I did that thing and</span> <span class="audio-time caption">here's a library.</span> <span class="audio-time caption">And I'm like, yeah, I'll have to do it.</span> <span class="audio-time caption">And I just, I guess I feel like I'm a power user.</span> <span class="audio-time caption">And on the good side, I guess I kind of,</span> <span class="audio-time caption">I really haven't written that much Elisp ever, like I was saying in</span> <span class="audio-time caption">the comments during your interview with Prot.</span> <span class="audio-time caption">And I kind of like to, it's just I guess it's never quite gotten to</span> <span class="audio-time caption">the top of my stack.</span> <span class="audio-time caption">And I did decide it was time for me to send money to Parade for at</span> <span class="audio-time caption">least for themes, if not for like, please teach me some Elisp so I</span> <span class="audio-time caption">can actually, because you know, it's not that Elisp is hard.</span> <span class="audio-time caption">It's more like, how do I kind of, what are the things I interact with?</span> <span class="audio-time caption">What are the words?</span> <span class="audio-time caption">What's the vocabulary of working with Emacs?</span> <span class="audio-time caption">I don't actually really know.</span> <span class="audio-time caption">As a user, sure, I can do cool stuff.</span> <span class="audio-time caption">I can do Lisp macros.</span> <span class="audio-time caption">I've done Scheme and Lisp some of the past, but not inside Emacs.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> Alright, so let me clarify.</span> <span class="audio-time caption">After more than 20 years of using Emacs, did you say you feel like a</span> <span class="audio-time caption">power user or do not feel like a power user?</span> <p></p><span class="audio-time caption"><strong>Shae:</strong> I definitely feel like a power user, but I don't feel like</span> <span class="audio-time caption">someone who does much of anything with Elisp.</span> <span class="audio-time caption">I don't really feel like someone who has much of a clue in the</span> <span class="audio-time caption">internals.</span> <span class="audio-time caption">And that's not entirely true.</span> <span class="audio-time caption">I have some of the ideas.</span> <span class="audio-time caption">But for the most part, I haven't actually needed to know that much</span> <span class="audio-time caption">about the internals.</span> <span class="audio-time caption">And sure, I've dug into things like how do you efficiently work with</span> <span class="audio-time caption">large buffers in your ??, like the ropes data structure and</span> <span class="audio-time caption">stuff like that.</span> <span class="audio-time caption">That was more for fun.</span> <span class="audio-time caption">Although it is something that Emacs does and does extremely well.</span> <span class="audio-time caption">But I'd kind of like to...</span> <span class="audio-time caption">There's a lot of things I'd kind of like to change and I don't really</span> <span class="audio-time caption">have enough of the understanding of the kind of how I would write the</span> <span class="audio-time caption">Elisp to do it.</span> <span class="audio-time caption">Here's a good example.</span> <span class="audio-time caption">When I hit F3, it takes me to the one I'm currently clocked into.</span> <span class="audio-time caption">Unless I haven't clocked in to something since I started Emacs.</span> <span class="audio-time caption">And honestly, I would like to use something like org-ql,</span> <span class="audio-time caption">the Org query language, to go find</span> <span class="audio-time caption">if I've just started Emacs,</span> <span class="audio-time caption">and Org does not know about something, you know,</span> <span class="audio-time caption">I just want you to go search for it.</span> <span class="audio-time caption">I have so many cores and so much memory,</span> <span class="audio-time caption">just go find it.</span> <p></p><span class="audio-time caption"><strong>Sacha:</strong> That sounds like an excellent reason to go learn Emacs</span> <span class="audio-time caption">so that you can have it...</span> <span class="audio-time caption">If you're not currently clocked in, go find the most recent</span> <span class="audio-time caption">clocked in task and go there, or maybe present you with a list of</span> <span class="audio-time caption">things and then go from there.</span> <span class="audio-time caption">I would love to hear about your Emacs Lisp learning journey because</span> <span class="audio-time caption">that's one of the big things that moves people from, you know, power</span> <span class="audio-time caption">users, yes, but users, to using Emacs as a lightweight editor toolkit</span> <span class="audio-time caption">for something that's custom fit to exactly what their workflow is.</span> <span class="audio-time caption">And on that note, I'm going to try to wrap up gracefully before the</span> <span class="audio-time caption">kiddo, you know, just like drags me out here.</span> <span class="audio-time caption">Thank you so much for doing this.</span> <span class="audio-time caption">I look forward to more conversations.</span> <span class="audio-time caption">I'm going to post the transcript and other things like that pretty</span> <span class="audio-time caption">quickly, I think, because I have this nice workflow now that lets me</span> <span class="audio-time caption">take screenshots and everything, but there's so much here that I want</span> <span class="audio-time caption">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>
</div>
<div class="outline-3">
<h3>Chat</h3>
<div class="outline-text-3">
<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&amp;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></body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Charlie Holland: My Dotfiles: macOS Bootstrap and an Emacs Distribution]]></title>
            <link>https://www.chiply.dev/post-my-dotfiles</link>
            <guid>https://www.chiply.dev/post-my-dotfiles</guid>
            <pubDate>Thu, 07 May 2026 15:18:00 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><div class="outline-2">
<h2><span class="section-number-2">1.</span> About&nbsp;&nbsp;&nbsp;<span class="tag"><span class="dotfiles">dotfiles</span>&nbsp;<span class="macos">macos</span>&nbsp;<span class="emacs">emacs</span>&nbsp;<span class="setup">setup</span></span></h2>
<div class="outline-text-2">

<div class="figure">
<p><img src="https://www.chiply.dev/images/dotfiles-banner.jpeg" alt="dotfiles-banner.jpeg">
</p>
<p><span class="figure-number">Figure 1: </span>JPEG produced with <a href="https://openai.com/index/introducing-4o-image-generation/">DALL-E 4o</a></p>
</div>

<p>
My dotfiles for my MacOS rice and Emacs configuration live in two public repositories.  Both repos are shared as a reference; clone, fork, or just lift the bits that look useful to you!
</p>

<p>
This post is a thin entry point, and the READMEs in each repo carry the actual detail.
</p>
</div>
</div>
<div class="outline-2">
<h2><span class="section-number-2">2.</span> <a href="https://github.com/chiply/.files">chiply/.files</a>&nbsp;&nbsp;&nbsp;<span class="tag"><span class="shell">shell</span>&nbsp;<span class="tmux">tmux</span>&nbsp;<span class="macos">macos</span>&nbsp;<span class="bootstrap">bootstrap</span></span></h2>
<div class="outline-text-2">
<p>
A single <code>bootstrap.sh</code> that takes a clean macOS install to a fully provisioned development machine in roughly thirty minutes.  It installs Xcode CLI tools, Homebrew, and a long list of CLI utilities and language toolchains, then symlinks every config in <code>files/</code> into the matching path under <code>$HOME</code>.
</p>

<p>
See repo for installation instructions.
</p>

<p>
What gets installed:
</p>

<ul>
<li><b>Shell</b>: zsh + zinit, <a href="https://starship.rs/">starship</a> prompt, <a href="https://atuin.sh/">atuin</a> shared history</li>
<li><b>Terminal</b>: <a href="https://ghostty.org/">Ghostty</a> with cursor shaders, plus Nerd Fonts</li>
<li><b>Multiplexer</b>: tmux with tmux-powerline, tmuxinator, TPM</li>
<li><b>Window manager</b>: <a href="https://github.com/nikitabobko/AeroSpace">AeroSpace</a>, <a href="https://www.jeantinland.com/toolbox/simple-bar/">simple-bar</a>, <a href="https://github.com/FelixKratz/JankyBorders">JankyBorders</a></li>
<li><b>Languages</b>: pyenv, Poetry, uv, nvm + Node, language servers (json, eslint, copilot, svelte)</li>
<li><b>CLI</b>: <code>gh</code>, <code>k9s</code>, <code>bat</code>, <code>fzf</code>, <code>ripgrep</code>, <code>eza</code>, <code>jq</code>, <code>lazygit</code>, AWS CLI v2, and more</li>
</ul>

<p>
The full package list lives in the repo's <a href="https://github.com/chiply/.files/blob/main/files/.config/Brewfile">Brewfile</a>.  <code>bootstrap.sh</code> also clones <a href="https://www.chiply.dev/#zetta">.zetta.d</a> to <code>~/.zetta.d</code> as part of the Emacs setup; if you only want the shell side, comment out the emacs section.
</p>
</div>
</div>
<div class="outline-2">
<h2><span class="section-number-2">3.</span> <a href="https://github.com/chiply/.zetta.d">chiply/.zetta.d</a>&nbsp;&nbsp;&nbsp;<span class="tag"><span class="emacs">emacs</span>&nbsp;<span class="zetta">zetta</span>&nbsp;<span class="distribution">distribution</span></span></h2>
<div class="outline-text-2">
<p>
My Emacs configuration, packaged as a small distribution.  Around 320 packages wired up via a module DSL, with an Elpaca lockfile pinning every package to an exact commit, and byte- and native-compilation done up front so the first launch is clean.
</p>

<p>
The name is a cheeky play on how we name certain minimalist text editors after <a href="https://en.wikipedia.org/wiki/Metric_prefix">Metric Prefixes</a> <code>nano</code> (10^-9) or <code>pico</code> (10^-12).  This maximalist editor config is named after <code>zetta</code> (10^21).
</p>

<p>
See repo for installation instructions.
</p>

<p>
Notable parts:
</p>

<ul>
<li><b>Triple-modal editing</b>: Evil, Meow, and vanilla side-by-side, switchable on the fly</li>
<li><b>Module DSL</b>: enable categories or individual packages via <code>zetta-modules!</code> in <code>~/.zetta.el</code></li>
<li><b>Reproducible</b>: lockfile + compile-by-default install</li>
<li><b>CI-tested</b>: Emacs 29.4, 30.2, and the 31 snapshot</li>
</ul>

<p>
Zetta also hosts several small packages I've written that live in their own public repos.  See the README's "Bundled custom packages" section for the list.  None of these are released or publicized yet, so bring a pinch of salt if you choose to try them.
</p>
</div>
</div></body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Dave Pearson: blogmore.el v4.4.0]]></title>
            <link>https://blog.davep.org/2026/05/07/blogmore-el-v4-4-0.html</link>
            <guid>https://blog.davep.org/2026/05/07/blogmore-el-v4-4-0.html</guid>
            <pubDate>Thu, 07 May 2026 08:05:10 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p>I've released an update to
<a href="https://github.com/davep/blogmore.el" target="_blank"><code>blogmore.el</code></a>, my
<a href="https://blog.davep.org/tag/emacs/">Emacs</a> package that helps me out when writing this blog. I've
added two commands to this version which help me be lazier than ever.</p>
<p>The first is <code>blogmore-become-like</code>. When run, this prompts for another post
and, once selected, it sets <em>this</em> post's category and tags to be the same
as the other one. I added this because I'm often writing an occasional
series of posts that are all about the same project, and so I always find
myself copying and pasting those frontmatter properties from another post.</p>
<p>The second command I've added is <code>blogmore-toggle-image-centre</code>. Built into
<a href="https://blogmore.davep.dev/" target="_blank">BlogMore</a> is a little bit of styling that will
ensure an image is placed in the centre of the page, if the URL for the
image has <code>#centre</code> on the end. This means that, for most images I add, I
have to go and edit the URL to add that. Now I can just run a single command
when the cursor is on an image and it'll add (or remove, if it's already
there) that styling hint.</p>
<p>In both cases, I've added the commands to the transient menu too.</p></body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Bicycle for Your Mind: Capture and Move On]]></title>
            <link>https://bicycleforyourmind.com/capture-and-move-on</link>
            <guid>https://bicycleforyourmind.com/capture-and-move-on</guid>
            <pubDate>Thu, 07 May 2026 07:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p><img src="https://cdn.blot.im/blog_c4a729f3205a44e5a9669523ddfb8b2e/_image_cache/6fe774d1-9bd5-4432-8e65-01f1e869c6e4/captureicon.png" alt="capture icon" width="1024" height="1024"><span class="caption">capture icon</span></p>
<p><strong>Product</strong>: <a href="https://www.capture.surf/" target="_blank">Capture</a><br>
<strong>Price</strong>: $7.99 · lifetime updates · up to 5 Macs · 7-day free trial</p>

<p>Capture is a product designed to capture something, and move on with your life. It is an universal product, you can be in any application, Safari, Chrome, BBEdit, Finder, anywhere. You can press the keyboard shortcut to invoke capture. Fill in what you want to capture. Hit return and go back to whatever you were doing.</p>
<p>The product is advertised as “Capture thoughts to Obsidian without leaving what you’re doing.” You don’t have to use Obsidian. I use Emacs and it works great for that too. You can use any text editor and it is as useful.</p>
<h2>Two Routes</h2>
<p><img src="https://cdn.blot.im/blog_c4a729f3205a44e5a9669523ddfb8b2e/_image_cache/19f0d54f-3074-494c-8920-0e7ba1c8438a/capture002.png" alt="capture options" width="972" height="784"><span class="caption">capture options</span></p>
<p>Capture gives you two options to capture your content.</p>
<ol>
<li>You can capture to a new individual file. Every capture gets put into a time-stamped new file.</li>
</ol>
<p><img src="https://cdn.blot.im/blog_c4a729f3205a44e5a9669523ddfb8b2e/_image_cache/42c5282b-297d-4fca-97f3-c6870ef1cecd/capture006.png" alt="capture where?" width="972" height="784"><span class="caption">capture where?</span></p>
<ol>
<li>You can append to an existing file which you have specified, or append to a daily note.</li>
</ol>
<p><img src="https://cdn.blot.im/blog_c4a729f3205a44e5a9669523ddfb8b2e/_image_cache/87c11fb8-e4b7-45ff-adf8-346d71d6fd76/capture005.png" alt="capture and folders" width="972" height="784"><span class="caption">capture and folders</span></p>
<p>You can define the Obsidian vault that Capture deals with. In my case it is the folder which contain my org files. Within that folder is another folder called ‘capture’ where I put my captured files into.</p>
<p><img src="https://cdn.blot.im/blog_c4a729f3205a44e5a9669523ddfb8b2e/_image_cache/fbd16734-48c3-4eab-a008-07a893033dff/capture007.png" alt="capture context" width="972" height="784"><span class="caption">capture context</span></p>
<p>Within these options you have various options. You can include context. You get to define the context.</p>
<p><img src="https://cdn.blot.im/blog_c4a729f3205a44e5a9669523ddfb8b2e/_image_cache/f84aa2cf-805b-4b61-b8ec-0ae33dfb6ff0/capture004.png" alt="capture tags" width="972" height="784"><span class="caption">capture tags</span></p>
<p>You can add tags to your captured content.</p>
<p>I am happy with Capture. It is a focused utility which does what it promises well.</p>
<h2>Wishes for Capture</h2>
<ol>
<li>I understand that the link to Obsidian means that this deals with Markdown files. We don’t need that restriction. It can work with Org-mode files and plain text files. Give me the ability to specify the extension I want my files to be.</li>
<li>The command to save the capture is <code>⌘↵</code>. On my machine ↵ saves the capture. There is no way to add a new line. This must be a bug.</li>
</ol>
<h2>Recommendation</h2>
<p>I used the program for fifteen minutes and bought it. It is the kind of utility which I am going to use multiple times a day.</p>
<p>Recommended most heartily.</p>
<p>macosxguru at the gmail thingie.</p> </body></html>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Andros Fenollosa: twtxt vs Org Social: the evolution of an idea]]></title>
            <link>http://en.andros.dev/blog/ba142044/twtxt-vs-org-social-the-evolution-of-an-idea/</link>
            <guid>http://en.andros.dev/blog/ba142044/twtxt-vs-org-social-the-evolution-of-an-idea/</guid>
            <pubDate>Wed, 06 May 2026 13:21:31 GMT</pubDate>
            <content:encoded><![CDATA[<html><head></head><body><p><a href="https://github.com/buckket/twtxt">twtxt</a> was one of the strongest inspirations behind <a href="https://org-social.org/">Org Social</a>: a plain text file served over HTTP, with no active server, no database, no signup. I personally admire the work done by Buckket: the concept is so powerful that it has captured the hearts of many people over the years. Its author gave us an elegant solution for creating a personal microblog, an alternative to Twitter (now X).</p>
<p>That said, Org Social would not exist if it weren't for the limitations of twtxt or the natural evolution of social networks. Org Social keeps its spirit, learns from its mistakes and from the competition, reinforces other concepts (like federation) and adopts modern features (like visibility). It is not an improvement, it is a shift in approach.</p>
<p>That's why I'd like to go over the three most important aspects where Org Social improves on twtxt.</p>
<h2>Technical improvement</h2>
<p>The most obvious one is the ability to have structured metadata thanks to Org Mode.</p>
<pre><code class="language-txt">#+TITLE: Bob's journal
#+NICK: Bob
#+DESCRIPTION: I'm a software developer and I love open source.
#+AVATAR: https://my-awesome-website.com/avatar.jpg
#+LINK: https://my-awesome-website.com
#+FOLLOW: https://foo.org/social.org
#+FOLLOW: https://jane.com/social.org

* Posts
** 2024-12-12T12:00:00+0100
:PROPERTIES:
:LANG: en
:TAGS: emacs org-social
:CLIENT: org-social.el
:VISIBILITY: public
:MOOD: 😊
:END:

Hello Org Social!</code></pre>
<p>This opens the door to giving context to each post, having native threads, tagging, organizing in groups, defining visibility, running polls...</p>
<div class="table"><table>
<thead>
<tr>
<th>Feature</th>
<th>twtxt</th>
<th>Org Social</th>
</tr>
</thead>
<tbody>
<tr>
<td>Format</td>
<td>plain text (Markdown optional)</td>
<td>Org Mode</td>
</tr>
<tr>
<td>Mentions</td>
<td>yes</td>
<td>yes</td>
</tr>
<tr>
<td>Profile metadata</td>
<td>minimal</td>
<td>rich</td>
</tr>
<tr>
<td>Tags</td>
<td><code>#hashtag</code> inside the body</td>
<td><code>:TAGS:</code> as metadata</td>
</tr>
<tr>
<td>Native threads</td>
<td>no</td>
<td><code>REPLY_TO</code></td>
</tr>
<tr>
<td>Multiline</td>
<td>no</td>
<td>yes</td>
</tr>
<tr>
<td>Sub-headers</td>
<td>no</td>
<td>yes (<code>#+</code>)</td>
</tr>
<tr>
<td>Federated groups</td>
<td>no</td>
<td>yes (<code>GROUP</code>)</td>
</tr>
<tr>
<td>Languages</td>
<td>no</td>
<td>yes (<code>LANGUAGE</code>)</td>
</tr>
<tr>
<td>Polls</td>
<td>no</td>
<td>yes</td>
</tr>
<tr>
<td>Reactions / boosts</td>
<td>no</td>
<td>yes</td>
</tr>
<tr>
<td>Visibility</td>
<td>no</td>
<td><code>VISIBILITY</code> (though not fully private)</td>
</tr>
<tr>
<td>Account migration</td>
<td>no</td>
<td><code>MIGRATION</code></td>
</tr>
</tbody>
</table>
</div><p>We don't just get richer post bodies: the possibilities for interaction between users grow without limit. The specification invites you to create, not to work around limitations.</p>
<h2>5 design principles</h2>
<p>Org Social follows these principles:</p>
<ul>
<li><strong>Simplicity</strong>: the format must be easy to understand and write with any text editor, with no special tools or advanced technical skills required.</li>
<li><strong>Accessibility</strong>: the feed must be readable by both humans and machines.</li>
<li><strong>Decentralization</strong>: every user should be a node, a self-hosted feed or one publicly accessible.</li>
<li><strong>Org philosophy</strong>: the format must take advantage of Org Mode features, like links, tables, code blocks, checkbox lists, etc.</li>
<li><strong>Your information belongs to you</strong>: no one owns your feed, content, or followers. Just you and your text file. Where you host it is a separate matter.</li>
</ul>
<p>Without clear rules, the ecosystem fragments. There isn't a single line of the specification that isn't aligned with the points above.</p>
<h2>Infrastructure should add value, not be a requirement</h2>
<p>A very important element in Org Social are the Relays, which let you organize threads, discover other users, receive notifications, run searches, get an RSS feed, etc. However, without them the network would still work: users could keep publishing, following others and interacting. Relays are not the core of the social network. Clients can rely on them, but should never depend on them. This isn't a quality exclusive to Org Social: twtxt is also aligned with this principle. The point lies elsewhere.</p>
<p>The goal of clients is to make reading and writing feeds (<code>social.org</code>) easier, not to be a requirement to participate. That said, they are very practical for building your timeline, since you need to read and sort the feeds of the users you follow. For that there are Desktop and Android versions thanks to Emacs, plus a native iOS version written in Swift.</p>
<p>The differentiating point is balancing different user profiles via the infrastructure. For example:</p>
<ul>
<li><strong>Users with no technical knowledge</strong>: in a couple of clicks you can have an account thanks to Org Social's free hosting. The clients will take care of syncing and publishing for you. It is very similar to how other networks like Mastodon work, except that everything lives in a plain text file locally and transparently.</li>
<li><strong>Users with some technical knowledge</strong>: they can host their <code>social.org</code> on GitHub, GitLab, their own server, etc. They control and manage where it is hosted and how it connects.</li>
<li><strong>Users with deep technical knowledge</strong>: they fully control their presence on the network. They run their own server (with WebDAV, for example), with their own configured domain, with their own caching policies... or they even spin up their own Relay for extra speed or to build private federations.</li>
</ul>
<p>It embraces every kind of user, without sacrificing the essence of the social network. You don't need to be an expert to take part, but if you are one, you control every byte.</p>
<h2>Conclusion</h2>
<p>Org Social doesn't just improve on twtxt technically: it also evolves the concept of a social network on top of plain text. It takes a step forward by providing more infrastructure and incorporating modern features.</p>
<p>The future is not about going massive or competing with Mastodon, but about satisfying a very small niche of users.</p>
<p>Focus on the content or on engaging with others, Org Social will take care of the rest.</p></body></html>]]></content:encoded>
        </item>
    </channel>
</rss>