<?xml version='1.0' encoding='UTF-8'?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>davep</title>
    <link>https://blog.davep.org</link>
    <description>Posts in category "Emacs" from davep</description>
    <atom:link href="https://blog.davep.org/feeds/emacs.rss.xml" rel="self"/>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Thu, 09 Jul 2026 08:36:31 +0000</lastBuildDate>
    <item>
      <title>become.el v1.4.0</title>
      <link>https://blog.davep.org/2026/06/16/become-el-v1-4-0.html</link>
      <description>&lt;p&gt;In the last month or so, as I've mentioned a few times before, I've been
trying to tidy up some of my older personal &lt;a href="https://blog.davep.org/tag/emacs-lisp/"&gt;Emacs Lisp&lt;/a&gt;
packages. I &lt;em&gt;thought&lt;/em&gt; I'd updated all the ones I commonly use, but it turns
out I hadn't. Somehow I'd missed
&lt;a href="https://github.com/davep/become.el" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;become.el&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is another one of those packages whose content started out as ad-hoc
commands, added to the &lt;code&gt;~/.emacs&lt;/code&gt; that first started to emerge as I got to
know Emacs on OS/2 and then GNU/Linux back in the mid-1990s. I think it was
back in 2016&lt;sup id="fnref:419-1"&gt;&lt;a class="footnote-ref" href="#fn:419-1"&gt;1&lt;/a&gt;&lt;/sup&gt;, when I did &lt;a href="https://blog.davep.org/2016/05/26/starting_fresh_with_gnu_emacs.html"&gt;a big revamp of my Emacs
environment&lt;/a&gt;, that I moved
all of those roughly-related commands out into their own file.&lt;/p&gt;
&lt;p&gt;Honestly, I think I can dump most of them now. There's stuff in there for
quickly and easily converting buffers between "DOS format" and "Unix format"
(from back when I was still working a lot on Windows machines, and sometimes
even in MS-DOS-based virtual machines, and often using the
&lt;a href="https://www.delorie.com/djgpp/" rel="noopener noreferrer" target="_blank"&gt;DJGPP&lt;/a&gt;-built version of Emacs).&lt;/p&gt;
&lt;p&gt;One command I still use all the time is
&lt;code&gt;become-free-of-trailing-whitespace&lt;/code&gt;, because I have that set up as part of
a &lt;code&gt;before-save-hook&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight" data-lang="elisp"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;become&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;:ensure&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;t&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;:defer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;t&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;:vc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;:url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;https://github.com/davep/become.el&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;:rev&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;:newest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;:commands&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;become-free-of-trailing-whitespace&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;:init&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;unless&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;noninteractive&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;add-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;before-save-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;become-free-of-trailing-whitespace&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;:bind&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;lt;f12&amp;gt; &amp;lt;tab&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;become-freshly-indented-no-tabs&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;While I know that there are better ways of handling the trailing space issue
these days, this is one I rolled for myself a couple of decades ago and it's
yet to fail me. You can see just how dated it is from this:&lt;/p&gt;
&lt;div class="highlight" data-lang="elisp"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;cl-flet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;is-sig-line&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;                       &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;save-excursion&lt;/span&gt;
&lt;span class="w"&gt;                         &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;beginning-of-line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;                         &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;looking-at&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;^-- $&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;markdown-br-p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;                         &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;save-excursion&lt;/span&gt;
&lt;span class="w"&gt;                           &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;beginning-of-line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;                           &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;major-mode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;markdown-mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;                                &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;looking-at&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;^.+[^ ]  $&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;
&lt;span class="c1"&gt;; ...body removed&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If you know, you'll know why &lt;code&gt;is-sig-line&lt;/code&gt; is there&lt;sup id="fnref:419-2"&gt;&lt;a class="footnote-ref" href="#fn:419-2"&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;I do still use &lt;code&gt;become-freshly-indented-no-tabs&lt;/code&gt; on occasion too, and have
it bound to an easy-to-remember and obvious (to me) key.&lt;/p&gt;
&lt;p&gt;And so, despite the fact that most of the content of &lt;code&gt;become.el&lt;/code&gt; is probably
obsolete at this point, despite the fact that there are probably far better
and more idiomatic ways of doing these things these days... it's my little
personal package that has grown with me in the 3 (and a bit) decades I've
had Emacs under my fingertips. I'm going to keep it around just a little
longer.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:419-1"&gt;
&lt;p&gt;The header for &lt;code&gt;become.el&lt;/code&gt; says 2017, but I think the header itself
came a little later when I &lt;a href="https://blog.davep.org/2017/04/01/another_revamp_of_my_emacs_config.html"&gt;did some more work on my
config&lt;/a&gt;.&amp;#160;&lt;a class="footnote-backref" href="#fnref:419-1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:419-2"&gt;
&lt;p&gt;And if you don't know, &lt;a href="https://en.wikipedia.org/wiki/Signature_block#Standard_delimiter" rel="noopener noreferrer" target="_blank"&gt;now you
do&lt;/a&gt;.&amp;#160;&lt;a class="footnote-backref" href="#fnref:419-2" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/06/16/become-el-v1-4-0.html</guid>
      <category>Emacs</category>
      <category>Emacs</category>
      <category>Emacs Lisp</category>
      <category>Lisp</category>
      <category>become.el</category>
      <category>coding</category>
      <pubDate>Tue, 16 Jun 2026 16:19:59 +0100</pubDate>
    </item>
    <item>
      <title>More mode line tweaking</title>
      <link>https://blog.davep.org/2026/06/15/more-mode-line-tweaking.html</link>
      <description>&lt;p&gt;The &lt;a href="https://blog.davep.org/2026/06/12/simplifying-my-mode-line.html"&gt;simplification of my mode
line&lt;/a&gt; is sticking, in that I like
how it's turned out and I find it more useful to have it this simple. But I
did notice something was missing: I'm a pretty constant but pretty casual
user of &lt;a href="https://github.com/bbatsov/projectile" rel="noopener noreferrer" target="_blank"&gt;projectile&lt;/a&gt;. I know it's a
package that offers a wealth of tools, yet mostly I just use it as a project
bookmark system. For this, though, it works well.&lt;/p&gt;
&lt;p&gt;Given this, having a quick and easy way to check that I'm in the project I
think I'm in is a good idea. While I also have
&lt;a href="https://github.com/jaypei/emacs-neotree" rel="noopener noreferrer" target="_blank"&gt;neotree&lt;/a&gt; open all the time, which
gives a fairly obvious clue, my eyes keep flitting down to the mode line.&lt;/p&gt;
&lt;p&gt;The change I made the other day, deliberately, left the project off. I think
this was a simplification too far. So now it's back.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Slightly updated mode line" height="1660" loading="lazy" src="https://blog.davep.org/attachments/2026/06/15/mode-line-update.webp#centre" width="2070" /&gt;&lt;/p&gt;
&lt;p&gt;The core of &lt;a href="https://github.com/davep/.emacs.d/blob/944e88b18df1147597e0f7be117887bf51c37a77/init.d/packages.d/melpa/mood-line.el" rel="noopener noreferrer" target="_blank"&gt;my mode line
configuration&lt;/a&gt;
now looks like this:&lt;/p&gt;
&lt;div class="highlight" data-lang="elisp"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;setq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mood-line-format&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;mood-line-defformat&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nb"&gt;:left&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="k"&gt;or&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;mood-line-segment-buffer-status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;propertize&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;mood-line--get-glyph&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;:buffer-modified&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;face&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;my/mood-line-good-status&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s"&gt;&amp;quot; &amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;mood-line-segment-buffer-name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;my/mood-line-segment-project&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s"&gt;&amp;quot; &amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;mood-line-segment-major-mode&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nb"&gt;:right&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;my/mood-line-segment-vc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s"&gt;&amp;quot; &amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;propertize&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;mood-line-segment-cursor-position&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;face&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;my/mood-line-cursor-position&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A little busier than it started out, but still pretty clean. I do keep
wondering about the cursor position. In most buffers I have line numbers
showing to the left anyway, and it's rare (but not unknown) that I need to
know what column I'm in. I'm very tempted to remove the cursor position
altogether, then the right-hand side would just be the &lt;code&gt;vc&lt;/code&gt; information, at
which point it might make sense to also move the project name over to the
right, given that the project and the repository information generally go
hand-in-hand.&lt;/p&gt;
&lt;p&gt;I'll stick with this for now, but I can see this happening soon.&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/06/15/more-mode-line-tweaking.html</guid>
      <category>Emacs</category>
      <category>Emacs</category>
      <category>Emacs Lisp</category>
      <category>Lisp</category>
      <pubDate>Mon, 15 Jun 2026 19:47:15 +0100</pubDate>
    </item>
    <item>
      <title>blogmore.el v5.3.0</title>
      <link>https://blog.davep.org/2026/06/14/blogmore-el-v5-3-0.html</link>
      <description>&lt;p&gt;I've released &lt;a href="https://github.com/davep/blogmore.el" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;blogmore.el&lt;/code&gt;&lt;/a&gt; v5.3.0.
This is a pretty small release but adds a command I realised I'd forgotten
to add a couple of releases ago.&lt;/p&gt;
&lt;p&gt;Now that &lt;a href="https://blogmore.davep.dev/" rel="noopener noreferrer" target="_blank"&gt;BlogMore&lt;/a&gt; has the concept of a post
series, and now that &lt;code&gt;blogmore.el&lt;/code&gt; lets you add and remove a series from a
post, it makes sense that I'd want to &lt;em&gt;link&lt;/em&gt; to a series in a post from time
to time, like I can and do with categories and tags.&lt;/p&gt;
&lt;p&gt;So v5.3.0 adds a &lt;code&gt;blogmore-link-series&lt;/code&gt; command. It can also be found in the
transient menu.&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/06/14/blogmore-el-v5-3-0.html</guid>
      <category>Emacs</category>
      <category>BlogMore</category>
      <category>Emacs</category>
      <category>Emacs Lisp</category>
      <category>Lisp</category>
      <category>blogmore.el</category>
      <category>coding</category>
      <pubDate>Sun, 14 Jun 2026 08:49:14 +0100</pubDate>
    </item>
    <item>
      <title>It got darker</title>
      <link>https://blog.davep.org/2026/06/13/it-got-darker.html</link>
      <description>&lt;p&gt;By pure coincidence, it's &lt;a href="https://blog.davep.org/2020/06/14/my-journey-to-the-dark-side-is-complete.html"&gt;six years ago
tomorrow&lt;/a&gt; that I
finally, after years of running &lt;a href="https://blog.davep.org/category/emacs/"&gt;Emacs&lt;/a&gt; with a bright
white background, moved to using a dark theme. It took a little bit of
getting used to but eventually I got very comfortable with it, and since
then have run everything I can in a dark mode too.&lt;/p&gt;
&lt;p&gt;On occasion, in the last year or so, I've had this urge to move to something
darker. Also, in part, it's an urge to change things up a little. I felt it
was time for a refresh of how my Emacs looks. I've tried a few themes, but
none have ever stuck. When trying them I've run into various issues:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It just didn't look nice at all&lt;/li&gt;
&lt;li&gt;Too many other things I use in Emacs didn't get themed&lt;/li&gt;
&lt;li&gt;It looked like there was going to be too much work to do to really theme
  things well&lt;/li&gt;
&lt;li&gt;It caused Emacs to crash&lt;sup id="fnref:424-1"&gt;&lt;a class="footnote-ref" href="#fn:424-1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However, yesterday evening, after &lt;a href="https://blog.davep.org/2026/06/12/simplifying-my-mode-line.html"&gt;making an effort to simplify my mode
line&lt;/a&gt;, I was determined to find a
darker theme that I would be happy with. I think I finally managed!&lt;/p&gt;
&lt;p&gt;&lt;img alt="An even darker Emacs" height="2052" loading="lazy" src="https://blog.davep.org/attachments/2026/06/13/darker-emacs.webp#centre" width="2588" /&gt;&lt;/p&gt;
&lt;p&gt;I've settled on &lt;code&gt;modus-vivendi&lt;/code&gt; from &lt;a href="https://protesilaos.com/emacs/modus-themes" rel="noopener noreferrer" target="_blank"&gt;modus
themes&lt;/a&gt;. Out of the box it felt
right, and from what I can see in the documentation there's an amazing
amount of customisation you can do. The key point there too is the
documentation; there's so much of it, it's incredibly comprehensive.&lt;/p&gt;
&lt;p&gt;For example: the default choice for the mode line is to have an unsubtle
border around it -- presumably to create a good contrast. I found that far
too distracting and was wondering what I could do about it. I didn't have to
wonder long, &lt;a href="https://protesilaos.com/emacs/modus-themes#h:80ddba52-e188-411f-8cc0-480ebd75befe" rel="noopener noreferrer" target="_blank"&gt;the documentation addresses exactly that
situation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Another downside I ran into is that the colours that were showing in the
mode line, when I switched to &lt;code&gt;mood-line&lt;/code&gt; yesterday, were gone. I spent a
short amount of time last night, and a good hour or so this morning, trying
to wrangle &lt;code&gt;mood-line&lt;/code&gt; into something I liked, but I just couldn't get
anything sensible going. Eventually I cracked, fired up
&lt;a href="https://blog.davep.org/tag/antigravity/"&gt;Antigravity&lt;/a&gt;, prompted it with:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I am using mood-line for my mode line -- see
&lt;code&gt;init.d/packages.d/melpa/mood-line.el&lt;/code&gt; and
https://github.com/emacsmirror/mood-line&lt;/p&gt;
&lt;p&gt;I am using https://protesilaos.com/emacs/modus-themes as my theme&lt;/p&gt;
&lt;p&gt;I would like to have finer control over the parts of the mode line I've
configured. For example, I'd like the buffer name to stand out in an
informative colour, but one that is part of the modus theme's colour
scheme.&lt;/p&gt;
&lt;p&gt;Don't make changes yet, but help me understand how I should do this in a
maintainable way.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;and then spent about 20 minutes going back and forth, refining what I
wanted; this &lt;a href="https://github.com/davep/.emacs.d/blob/b9db88bae8f69f7e04f648642a88fe6f5ee02db2/init.d/packages.d/melpa/mood-line.el" rel="noopener noreferrer" target="_blank"&gt;got me a
result&lt;/a&gt;
I'm happy with from a visual point of view. I still need to fully review the
code and the approach it took, but it isn't &lt;em&gt;too&lt;/em&gt; far removed from what I'd
been trying myself.&lt;/p&gt;
&lt;p&gt;Overall I'm pleased with the result, and this is the longest I've stuck with
a new theme (at this point I'm probably about 4 or 5 hours into working in
it). I think that says something significant. I can see myself still wanting
to tweak some aspects of it though. For example, the left-hand fringe
doesn't feel quite right, in a way I can't quite put my finger on. While I
want it to stand out from the main editing area, it feels... disconnected in
some way. Also the background colour of the mode line still feels like it
doesn't quite blend how I'd like.&lt;/p&gt;
&lt;p&gt;Now to see if this lasts...&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:424-1"&gt;
&lt;p&gt;Seriously, just the once, but that happened. I took that as a sign
from the Lisp gods that I was doing something sinful.&amp;#160;&lt;a class="footnote-backref" href="#fnref:424-1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/06/13/it-got-darker.html</guid>
      <category>Emacs</category>
      <category>AI</category>
      <category>Antigravity</category>
      <category>Emacs</category>
      <category>Emacs Lisp</category>
      <category>Lisp</category>
      <pubDate>Sat, 13 Jun 2026 10:49:48 +0100</pubDate>
    </item>
    <item>
      <title>Simplifying my mode line</title>
      <link>https://blog.davep.org/2026/06/12/simplifying-my-mode-line.html</link>
      <description>&lt;p&gt;Every so often I get the urge to change how Emacs looks. Ever since I
finally &lt;a href="https://blog.davep.org/2020/06/14/my-journey-to-the-dark-side-is-complete.html"&gt;fell to the dark
side&lt;/a&gt;, my Emacs
has stayed looking pretty much the same. I like how it looks, but I do keep
having this urge to find a darker theme, and to also make things just a wee
bit more minimal.&lt;/p&gt;
&lt;p&gt;At one point I was very much about, and in favour of, having as much
information as possible in &lt;a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Mode-Line.html" rel="noopener noreferrer" target="_blank"&gt;the mode
line&lt;/a&gt;.
Eventually I realised I didn't use that much and tried to declutter
somewhat, mostly cleaning up minor mode information with
&lt;a href="https://www.gnu.org/software/emacs/manual/html_node/use-package/Diminish.html" rel="noopener noreferrer" target="_blank"&gt;diminish&lt;/a&gt;.
Even then though, I had this feeling that there was still more information
in the mode line than I really needed.&lt;/p&gt;
&lt;p&gt;So, just now, as an experiment, I've decided to start fairly clean. I've
dropped &lt;a href="https://github.com/milkypostman/powerline" rel="noopener noreferrer" target="_blank"&gt;powerline&lt;/a&gt; and instead
decided to have a play with
&lt;a href="https://github.com/emacsmirror/mood-line" rel="noopener noreferrer" target="_blank"&gt;mood-line&lt;/a&gt;. Rather than use one
of its pre-configured formats, I've had a go at rolling my own:&lt;/p&gt;
&lt;div class="highlight" data-lang="elisp"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;setq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mood-line-format&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;mood-line-defformat&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nb"&gt;:left&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="p"&gt;(((&lt;/span&gt;&lt;span class="nv"&gt;mood-line-segment-buffer-status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;mood-line-segment-buffer-name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot; : &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;mood-line-segment-major-mode&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nb"&gt;:right&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="p"&gt;(((&lt;/span&gt;&lt;span class="nv"&gt;mood-line-segment-vc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;  &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;mood-line-segment-cursor-position&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;So far I'm really pleased with the result.&lt;/p&gt;
&lt;p&gt;&lt;img alt="My GNU Emacs" height="1716" loading="lazy" src="https://blog.davep.org/attachments/2026/06/12/mood-line-emacs.webp#centre" width="1818" /&gt;&lt;/p&gt;
&lt;p&gt;For any given buffer the mode line display is now:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The status of the buffer&lt;/li&gt;
&lt;li&gt;The name of the buffer&lt;/li&gt;
&lt;li&gt;The major mode of the buffer&lt;/li&gt;
&lt;li&gt;The git status for what I'm working on&lt;/li&gt;
&lt;li&gt;The cursor position&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Honestly, I'm struggling to think of anything else I really need to see.
Sure, I can imagine there's the odd minor mode I might need to know about,
but generally I either have them enabled all the time anyway, or it's
something so obvious that I know when it's not enabled.&lt;/p&gt;
&lt;p&gt;I'm going to run with this for a while now and see how I feel. I can sense
that I might want to tweak a couple of things (at the moment the left-hand
side will move when I change the unsaved status of the buffer; on the right
there's nothing that tells me that this file I'm editing right now is new to
the repo and not part of it yet), but this basic configuration feels clean
and right.&lt;/p&gt;
&lt;p&gt;Meanwhile... the search for &lt;a href="https://emacsthemes.com/" rel="noopener noreferrer" target="_blank"&gt;a theme&lt;/a&gt; that is
darker and I actually prefer over &lt;a href="https://github.com/purcell/color-theme-sanityinc-tomorrow" rel="noopener noreferrer" target="_blank"&gt;the sanityinc-tomorrow
themes&lt;/a&gt;
continues. I fear this is going to be a lot harder.&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/06/12/simplifying-my-mode-line.html</guid>
      <category>Emacs</category>
      <category>Emacs</category>
      <category>Emacs Lisp</category>
      <category>Lisp</category>
      <pubDate>Fri, 12 Jun 2026 19:06:26 +0100</pubDate>
    </item>
    <item>
      <title>blogmore.el v5.2.0</title>
      <link>https://blog.davep.org/2026/06/12/blogmore-el-v5-2-0.html</link>
      <description>&lt;p&gt;Another quick update to
&lt;a href="https://github.com/davep/blogmore.el" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;blogmore.el&lt;/code&gt;&lt;/a&gt;, again to fix an issue
I've run into with the new frontmatter-handling code. This time it's to
address an actual crash that could happen if a property was available but
empty. For example, if a post had frontmatter that looked like this:&lt;/p&gt;
&lt;div class="highlight" data-lang="yaml"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;blogmore.el&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;v5.2.0&amp;quot;&lt;/span&gt;
&lt;span class="nt"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;2026-06-12&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;08:31:15+0100&amp;quot;&lt;/span&gt;
&lt;span class="nt"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Emacs&lt;/span&gt;
&lt;span class="nt"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And I then went to use &lt;code&gt;blogmore-add-tag&lt;/code&gt;, I'd get a crash saying:&lt;/p&gt;
&lt;div class="highlight" data-lang="text"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Wrong type argument: sequencep, :null
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The reason being that &lt;code&gt;tags&lt;/code&gt; was being parsed with a value of &lt;code&gt;:null&lt;/code&gt;,
rather than (as before) having a value of &lt;code&gt;nil&lt;/code&gt; (which of course meant I had
a nice empty list to do things with). It was an easy enough fix.&lt;/p&gt;
&lt;p&gt;At this point I think I've managed to shake out any serious issues with the
proper YAML-parsing approach to frontmatter, as I've used it to write a
handful of posts now.&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/06/12/blogmore-el-v5-2-0.html</guid>
      <category>Emacs</category>
      <category>BlogMore</category>
      <category>Emacs</category>
      <category>Emacs Lisp</category>
      <category>Lisp</category>
      <category>blogmore.el</category>
      <category>coding</category>
      <pubDate>Fri, 12 Jun 2026 08:31:15 +0100</pubDate>
    </item>
    <item>
      <title>blogmore.el v5.1.0</title>
      <link>https://blog.davep.org/2026/06/11/blogmore-el-v5-1-0.html</link>
      <description>&lt;p&gt;A quick little update to
&lt;a href="https://github.com/davep/blogmore.el" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;blogmore.el&lt;/code&gt;&lt;/a&gt; to fix a couple of
issues introduced by the new YAML-parsing approach to reading frontmatter;
both pretty much stemming from how falsy values are handled.&lt;/p&gt;
&lt;p&gt;Simply put, both boolean &lt;code&gt;false&lt;/code&gt; values, and also empty values (something
that could commonly happen with &lt;code&gt;tags&lt;/code&gt; and &lt;code&gt;series&lt;/code&gt;) would end up showing up
in the frontmatter as &lt;code&gt;null&lt;/code&gt;. This release handles that situation.&lt;/p&gt;
&lt;p&gt;Also, under the hood, I cleaned up some repeated boilerplate related to how
the cached dump calls to &lt;a href="https://blogmore.davep.dev/" rel="noopener noreferrer" target="_blank"&gt;BlogMore&lt;/a&gt; took place.
The code for categories, tags and series data was almost exactly the same,
save for the actual name of the thing being dumped. So I turned it all into
a macro:&lt;/p&gt;
&lt;div class="highlight" data-lang="elisp"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defmacro&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;blogmore--cache-dump&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;dump-name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Generate a function to get DUMP-NAME from BlogMore, with caching.&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;cache-name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;intern&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;blogmore--current-%s-cache&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dump-name&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;getter-name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;intern&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;blogmore--current-%s&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dump-name&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;progn&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defvar&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;cache-name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Cache for the list of %s from existing posts.&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dump-name&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;getter-name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Get a list of %s from existing posts.&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dump-name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;cache-name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;setq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;cache-name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;blogmore--list-of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;symbol-name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dump-name&lt;/span&gt;&lt;span class="p"&gt;))))))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;and now the &lt;code&gt;defvar&lt;/code&gt; that creates the variable that holds the cache, and the
&lt;code&gt;defun&lt;/code&gt; that creates the getter function for the data, are reduced to this
for all three collections of values:&lt;/p&gt;
&lt;div class="highlight" data-lang="elisp"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;blogmore--cache-dump&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;categories&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;blogmore--cache-dump&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;blogmore--cache-dump&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;series&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Sure, I probably could have done all of this in a single global, a central
getter function, and a &lt;a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Hash-Tables.html" rel="noopener noreferrer" target="_blank"&gt;hash
table&lt;/a&gt;,
but the macro approach feels so much more elegant, and more... lispy.&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/06/11/blogmore-el-v5-1-0.html</guid>
      <category>Emacs</category>
      <category>BlogMore</category>
      <category>Emacs</category>
      <category>Emacs Lisp</category>
      <category>Lisp</category>
      <category>blogmore.el</category>
      <category>coding</category>
      <category>defmacro</category>
      <pubDate>Thu, 11 Jun 2026 19:06:24 +0100</pubDate>
    </item>
    <item>
      <title>blogmore.el v5.0.0</title>
      <link>https://blog.davep.org/2026/06/10/blogmore-el-v5-0-0.html</link>
      <description>&lt;p&gt;When I released &lt;a href="https://blog.davep.org/2026/06/09/blogmore-el-v4-7-0.html"&gt;&lt;code&gt;blogmore.el&lt;/code&gt; v4.7.0&lt;/a&gt;
yesterday I finished off by saying that it was my intention, at some point,
to rework the frontmatter-handling code so that it did proper YAML parsing.
As often happens with these sorts of things, "some point" ended up being
that evening.&lt;/p&gt;
&lt;p&gt;I've rewritten everything to do with handling properties in the frontmatter
so that it now uses &lt;a href="https://github.com/zkry/yaml.el" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;yaml.el&lt;/code&gt;&lt;/a&gt;. This has a
number of knock-on effects. The first and most obvious effect is that
anything that is a list/array in the frontmatter is actually properly
treated as a list. A good example here is &lt;code&gt;tags&lt;/code&gt;. Now you can have your tags
look like:&lt;/p&gt;
&lt;div class="highlight" data-lang="yaml"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;BlogMore&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Emacs&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Emacs&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Lisp&amp;quot;&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Lisp&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;blogmore.el&amp;quot;&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;coding&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;or:&lt;/p&gt;
&lt;div class="highlight" data-lang="yaml"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;BlogMore&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Emacs&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Emacs Lisp&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Lisp&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;blogmore.el&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;coding&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;and &lt;code&gt;blogmore.el&lt;/code&gt; will still handle things fine. The same holds for &lt;code&gt;series&lt;/code&gt;
too.&lt;/p&gt;
&lt;p&gt;It should be noted, however, that because I'm now using actual YAML
serialisation code, most other forms of a list will all end up being
transformed into this kind:&lt;/p&gt;
&lt;div class="highlight" data-lang="yaml"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;BlogMore&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Emacs&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Emacs&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Lisp&amp;quot;&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Lisp&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;blogmore.el&amp;quot;&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;coding&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;So if you have a bare list:&lt;/p&gt;
&lt;div class="highlight" data-lang="yaml"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;BlogMore, Emacs, &amp;quot;Emacs Lisp&amp;quot;, Lisp, &amp;quot;blogmore.el&amp;quot;, coding&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;and you make an edit to the tags via &lt;code&gt;blogmore.el&lt;/code&gt;, it will end up as the
version enclosed in &lt;code&gt;[]&lt;/code&gt;. &lt;a href="https://blogmore.davep.dev/" rel="noopener noreferrer" target="_blank"&gt;BlogMore&lt;/a&gt; itself
supports all three versions so this works fine.&lt;/p&gt;
&lt;p&gt;There is a breaking change here too, which in part explains the reason I
bumped the version to 5.0.0: because &lt;code&gt;series&lt;/code&gt; can now be treated as a list
I've removed the &lt;code&gt;blogmore-set-series&lt;/code&gt; command and instead replaced it with
&lt;code&gt;blogmore-add-series&lt;/code&gt; and &lt;code&gt;blogmore-remove-series&lt;/code&gt;. Both can of course be
found in the transient menu.&lt;/p&gt;
&lt;p&gt;Another big change in this release is the way that existing values are
loaded up from your blog. Previously, when you went to add a category, tag
or series, &lt;code&gt;blogmore.el&lt;/code&gt; would use
&lt;a href="https://github.com/burntsushi/ripgrep" rel="noopener noreferrer" target="_blank"&gt;ripgrep&lt;/a&gt; (or a combination of &lt;code&gt;find&lt;/code&gt;
and &lt;code&gt;grep&lt;/code&gt; if &lt;code&gt;rg&lt;/code&gt; wasn't available) to pull out values to help populate a
completion list. This worked fine as long as a) the frontmatter property was
all on one line and b) the body of a post didn't contain something that
looked like a frontmatter property. With this release of &lt;code&gt;blogmore.el&lt;/code&gt; I've
dropped this approach in favour of calling &lt;code&gt;blogmore&lt;/code&gt; itself and using the
&lt;a href="https://blogmore.davep.dev/command_line/#dump-command" rel="noopener noreferrer" target="_blank"&gt;dump command&lt;/a&gt; to get
the actual lists of categories, tags and series.&lt;/p&gt;
&lt;p&gt;This does mean that BlogMore needs to be installed in a location where
&lt;code&gt;blogmore.el&lt;/code&gt; can see it, and to help with this I've added a new &lt;code&gt;defcustom&lt;/code&gt;
called &lt;code&gt;blogmore-command&lt;/code&gt;. By default this is set to call whatever version
of &lt;code&gt;blogmore&lt;/code&gt; can be found in your &lt;code&gt;exec-path&lt;/code&gt;; if this results in
unexpected behaviour you can set &lt;code&gt;blogmore-command&lt;/code&gt; to point to a specific
copy of &lt;code&gt;blogmore&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;There is, however, a small downside to this beneficial&lt;sup id="fnref:385-1"&gt;&lt;a class="footnote-ref" href="#fn:385-1"&gt;1&lt;/a&gt;&lt;/sup&gt; approach: calling
on &lt;code&gt;blogmore&lt;/code&gt; and parsing all posts to get the values is generally going to
be slower. With this in mind I've built in a cache for these values. The
first time you load up the categories, tags or series, the values are held
on to so that subsequent prompts are instantaneous (meaning there is no
further call to &lt;code&gt;blogmore&lt;/code&gt;). To ensure this doesn't confuse things, when you
switch blog (&lt;code&gt;blogmore-work-on&lt;/code&gt;) the caches are cleared. In the unlikely
event that there is a problem with this approach, I've also added a
&lt;code&gt;blogmore-clear-caches&lt;/code&gt; command to force the clearing of the caches.&lt;/p&gt;
&lt;p&gt;There are some other small QoL changes under the hood and also to the
interface. I've moved some things around in the transient menu, and also
ensured that a couple of options are better-disabled depending on the
context.&lt;/p&gt;
&lt;p&gt;&lt;img alt="The current menu" height="227" loading="lazy" src="https://blog.davep.org/attachments/2026/06/10/blogmore-menu.webp#centre" width="619" /&gt;&lt;/p&gt;
&lt;p&gt;All of this makes the package even more robust. Something that started as a
quick hack &lt;a href="https://blog.davep.org/2026/03/19/some-blogmore-elisp.html"&gt;back in March&lt;/a&gt; has turned
into a tool I heavily lean on. Hopefully, for anyone who might happen to use
BlogMore &lt;em&gt;and&lt;/em&gt; GNU Emacs, it'll be a useful daily-driver for them too.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:385-1"&gt;
&lt;p&gt;The benefits being: only values in frontmatter appear, inconsistent
casing is cleaned up, etc.&amp;#160;&lt;a class="footnote-backref" href="#fnref:385-1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/06/10/blogmore-el-v5-0-0.html</guid>
      <category>Emacs</category>
      <category>BlogMore</category>
      <category>Emacs</category>
      <category>Emacs Lisp</category>
      <category>Lisp</category>
      <category>blogmore.el</category>
      <category>coding</category>
      <pubDate>Wed, 10 Jun 2026 10:22:12 +0100</pubDate>
    </item>
    <item>
      <title>blogmore.el v4.7.0</title>
      <link>https://blog.davep.org/2026/06/09/blogmore-el-v4-7-0.html</link>
      <description>&lt;p&gt;A quick update to &lt;a href="https://github.com/davep/blogmore.el" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;blogmore.el&lt;/code&gt;&lt;/a&gt;.
Having &lt;a href="https://blog.davep.org/2026/06/06/blogmore-v2-40-0.html"&gt;recently added series support to
BlogMore&lt;/a&gt; it made sense that I then add a
quick way of adding a post to a series in the package.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Selecting a series" height="718" loading="lazy" src="https://blog.davep.org/attachments/2026/06/09/select-a-series.webp#centre" width="706" /&gt;&lt;/p&gt;
&lt;p&gt;You can, of course, set a new one too, but the idea here (as with categories
and tags) is that you can quickly find back an existing series and add the
current post to it.&lt;/p&gt;
&lt;p&gt;Also, as with tags, the expectation is that either a single series is being
used, or if more than one series is in play for a post they'll be listed as
a comma-separated list. The issue here is that while BlogMore supports this:&lt;/p&gt;
&lt;div class="highlight" data-lang="yaml"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;series&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Some series of posts&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Some other series of posts&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Yet another series of posts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;the frontmatter-handling code in &lt;code&gt;blogmore.el&lt;/code&gt; isn't very sophisticated at
all; it doesn't actually handle it as actual YAML, instead just treating it
as a set of key/value pairs separated by a colon.&lt;/p&gt;
&lt;p&gt;At some point soon I want to give &lt;code&gt;blogmore.el&lt;/code&gt; a revamp and base all of the
frontmatter-handling code on something like
&lt;a href="https://github.com/zkry/yaml.el" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;yaml.el&lt;/code&gt;&lt;/a&gt;. I did do some experimenting
last night to drop it in and handle proper lists. It worked well enough, but
I abandoned the work as I realised I really wanted to start again from
scratch and build &lt;code&gt;blogmore.el&lt;/code&gt; from the bottom up using that package.&lt;/p&gt;
&lt;p&gt;Some time soon...&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/06/09/blogmore-el-v4-7-0.html</guid>
      <category>Emacs</category>
      <category>BlogMore</category>
      <category>Emacs</category>
      <category>Emacs Lisp</category>
      <category>Lisp</category>
      <category>blogmore.el</category>
      <category>coding</category>
      <pubDate>Tue, 09 Jun 2026 08:42:40 +0100</pubDate>
    </item>
    <item>
      <title>blogmore.el v4.6.0</title>
      <link>https://blog.davep.org/2026/06/05/blogmore-el-v4-6-0.html</link>
      <description>&lt;p&gt;After &lt;a href="https://blog.davep.org/2026/06/04/blogmore-v2-38-0.html"&gt;adding floating and inline tables of contents in
BlogMore&lt;/a&gt; the other day, it was time to
update &lt;a href="https://github.com/davep/blogmore.el" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;blogmore.el&lt;/code&gt;&lt;/a&gt; to include
commands to toggle the related frontmatter.&lt;/p&gt;
&lt;p&gt;So, with the release of &lt;a href="https://github.com/davep/blogmore.el/releases/tag/v4.6.0" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;blogmore.el&lt;/code&gt;
v4.6.0&lt;/a&gt;, two new
commands are now available:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;blogmore-toggle-show-toc&lt;/code&gt; toggles the &lt;code&gt;show_toc&lt;/code&gt; frontmatter property.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;blogmore-toggle-show-toc-inline&lt;/code&gt; toggles the &lt;code&gt;show_toc_inline&lt;/code&gt;
  frontmatter property.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both have also been added to the transient menu so they're easy to discover
and use.&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/06/05/blogmore-el-v4-6-0.html</guid>
      <category>Emacs</category>
      <category>BlogMore</category>
      <category>Emacs</category>
      <category>Emacs Lisp</category>
      <category>Lisp</category>
      <category>blogmore.el</category>
      <category>coding</category>
      <pubDate>Fri, 05 Jun 2026 20:01:30 +0100</pubDate>
    </item>
    <item>
      <title>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>
      <description>&lt;p&gt;Pretty much every project that I actively maintain on my &lt;a href="https://github.com/davep" rel="noopener noreferrer" target="_blank"&gt;GitHub
account&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;So I've created &lt;a href="https://github.com/davep/next-gh-pr.el" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;next-gh-pr.el&lt;/code&gt;&lt;/a&gt; to
save me just a little time and let me be just a little more lazy. Inside it
I've currently got a &lt;code&gt;next-gh-pr-insert-markdown-link&lt;/code&gt; command which, when
run, as you might imagine, inserts a link to the next likely PR URL as
Markdown.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/05/19/next-gh-pr-el-v1-0-0.html</guid>
      <category>Emacs</category>
      <category>Emacs</category>
      <category>Emacs Lisp</category>
      <category>GitHub</category>
      <category>Lisp</category>
      <category>coding</category>
      <category>git</category>
      <category>next-gh-pr.el</category>
      <pubDate>Tue, 19 May 2026 16:43:33 +0100</pubDate>
    </item>
    <item>
      <title>Stopping an accidental push</title>
      <link>https://blog.davep.org/2026/05/13/stopping-an-accidental-push.html</link>
      <description>&lt;p&gt;After starting to make use of &lt;a href="https://blog.davep.org/2026/05/10/more-syncing-github-to-gitlab-and-codeberg.html"&gt;the GitLab/Codeberg sync
approach&lt;/a&gt; for
various repositories, I found that my muscle memory in
&lt;a href="https://magit.vc/" rel="noopener noreferrer" target="_blank"&gt;Magit&lt;/a&gt; was getting the better of me and, on occasion,
I'd push a new branch to &lt;code&gt;backups&lt;/code&gt; when I wanted &lt;code&gt;origin&lt;/code&gt;. I sensed there
had to be a way round that.&lt;/p&gt;
&lt;p&gt;Here's what I settled on:&lt;/p&gt;
&lt;div class="highlight" data-lang="elisp"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;advice-add&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;magit-list-remotes&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;:filter-return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;lambda&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;remotes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;backups&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;remotes&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now I never see &lt;code&gt;backups&lt;/code&gt; in Magit and now I can keep using my muscle memory
(rather than actually reading what is in front of me, it seems).&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/05/13/stopping-an-accidental-push.html</guid>
      <category>Emacs</category>
      <category>Emacs</category>
      <category>Emacs Lisp</category>
      <category>Magit</category>
      <category>backups</category>
      <category>git</category>
      <pubDate>Wed, 13 May 2026 19:04:49 +0100</pubDate>
    </item>
    <item>
      <title>make-phony.el v1.4.0</title>
      <link>https://blog.davep.org/2026/05/09/make-phony-el-v1-4-0.html</link>
      <description>&lt;p&gt;I've done a small update to
&lt;a href="https://github.com/davep/make-phony.el" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;make-phony.el&lt;/code&gt;&lt;/a&gt;, my little
&lt;a href="https://blog.davep.org/tag/emacs/"&gt;Emacs&lt;/a&gt; package that lets me be lazy when adding &lt;code&gt;.PHONY&lt;/code&gt; to
mark a target as a &lt;a href="https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html" rel="noopener noreferrer" target="_blank"&gt;PHONY
target&lt;/a&gt;
in a Makefile.&lt;/p&gt;
&lt;p&gt;The only change is a tweak to the regular expression, to tighten up the
check for a target that can be marked.&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/05/09/make-phony-el-v1-4-0.html</guid>
      <category>Emacs</category>
      <category>Emacs</category>
      <category>Emacs Lisp</category>
      <category>Lisp</category>
      <category>coding</category>
      <category>make-phony.el</category>
      <pubDate>Sat, 09 May 2026 08:36:11 +0100</pubDate>
    </item>
    <item>
      <title>blogmore.el v4.5.0</title>
      <link>https://blog.davep.org/2026/05/08/blogmore-el-v4-5-0.html</link>
      <description>&lt;p&gt;Carrying on with &lt;a href="https://blog.davep.org/2026/05/07/blogmore-el-v4-4-0.html"&gt;the theme of being lazy while editing
posts&lt;/a&gt;, I've released
&lt;a href="https://github.com/davep/blogmore.el" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;blogmore.el&lt;/code&gt;&lt;/a&gt; v4.5.0. This version
adds &lt;code&gt;blogmore-set-as-cover&lt;/code&gt;. With this, if you place &lt;code&gt;point&lt;/code&gt; on a line that
is an image and run the command, it is set as the &lt;code&gt;cover&lt;/code&gt; for the post.&lt;/p&gt;
&lt;p&gt;Sure, it's not like it's hard to copy, move, insert a new line, type
&lt;code&gt;cover:&lt;/code&gt; and then paste the text, but this is faster and more accurate.&lt;/p&gt;
&lt;p&gt;And I'm lazy.&lt;/p&gt;
&lt;p&gt;And I like hacking on &lt;a href="https://blog.davep.org/tag/emacs-lisp/"&gt;Emacs Lisp&lt;/a&gt; that makes my workflow
flow faster.&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/05/08/blogmore-el-v4-5-0.html</guid>
      <category>Emacs</category>
      <category>BlogMore</category>
      <category>Emacs</category>
      <category>Emacs Lisp</category>
      <category>Lisp</category>
      <category>blogmore.el</category>
      <category>coding</category>
      <pubDate>Fri, 08 May 2026 19:27:54 +0100</pubDate>
    </item>
    <item>
      <title>blogmore.el v4.4.0</title>
      <link>https://blog.davep.org/2026/05/07/blogmore-el-v4-4-0.html</link>
      <description>&lt;p&gt;I've released an update to
&lt;a href="https://github.com/davep/blogmore.el" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;blogmore.el&lt;/code&gt;&lt;/a&gt;, my
&lt;a href="https://blog.davep.org/tag/emacs/"&gt;Emacs&lt;/a&gt; package that helps me out when writing this blog. I've
added two commands to this version which help me be lazier than ever.&lt;/p&gt;
&lt;p&gt;The first is &lt;code&gt;blogmore-become-like&lt;/code&gt;. When run, this prompts for another post
and, once selected, it sets &lt;em&gt;this&lt;/em&gt; 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.&lt;/p&gt;
&lt;p&gt;The second command I've added is &lt;code&gt;blogmore-toggle-image-centre&lt;/code&gt;. Built into
&lt;a href="https://blogmore.davep.dev/" rel="noopener noreferrer" target="_blank"&gt;BlogMore&lt;/a&gt; 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 &lt;code&gt;#centre&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;In both cases, I've added the commands to the transient menu too.&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/05/07/blogmore-el-v4-4-0.html</guid>
      <category>Emacs</category>
      <category>BlogMore</category>
      <category>Emacs</category>
      <category>Emacs Lisp</category>
      <category>Lisp</category>
      <category>blogmore.el</category>
      <category>coding</category>
      <pubDate>Thu, 07 May 2026 09:05:10 +0100</pubDate>
    </item>
    <item>
      <title>blogmore.el v4.3.0</title>
      <link>https://blog.davep.org/2026/04/28/blogmore-el-v4-3-0.html</link>
      <description>&lt;p&gt;After adding the &lt;a href="https://blog.davep.org/2026/04/27/blogmore-v2-17-0.html"&gt;email comment invite facility to
BlogMore&lt;/a&gt; it only made sense that I add
some commands to &lt;a href="https://github.com/davep/blogmore.el" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;blogmore.el&lt;/code&gt;&lt;/a&gt; to
make it easier to edit the front matter that can help drive that feature.&lt;/p&gt;
&lt;p&gt;So... I've released v4.3.0 of &lt;code&gt;blogmore.el&lt;/code&gt; that adds two new commands:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;blogmore-toggle-invite-comments&lt;/code&gt; -- toggles the comment invitation
  property&lt;/li&gt;
&lt;li&gt;&lt;code&gt;blogmore-invite-comments-to&lt;/code&gt; -- makes it easy to set, edit or remove the
  email address to use when making the invite&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I've also added the two commands to the transient menu, using
&lt;kbd&gt;C&lt;/kbd&gt;-&lt;kbd&gt;t&lt;/kbd&gt; for the former and &lt;kbd&gt;C&lt;/kbd&gt;-&lt;kbd&gt;a&lt;/kbd&gt; for
the latter.&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/04/28/blogmore-el-v4-3-0.html</guid>
      <category>Emacs</category>
      <category>BlogMore</category>
      <category>Emacs</category>
      <category>Emacs Lisp</category>
      <category>Lisp</category>
      <category>blogmore.el</category>
      <category>coding</category>
      <pubDate>Tue, 28 Apr 2026 08:30:43 +0100</pubDate>
    </item>
    <item>
      <title>kbdify.el v1.0.0</title>
      <link>https://blog.davep.org/2026/04/24/kbdify-el-v1-0-0.html</link>
      <description>&lt;p&gt;When I'm writing documentation in &lt;a href="https://blog.davep.org/tag/markdown/"&gt;Markdown&lt;/a&gt; I like, where
possible, to mark up keys with the &lt;code&gt;&amp;lt;kbd&amp;gt;&lt;/code&gt; tag. This was the reason for &lt;a href="https://blog.davep.org/2026/04/04/blogmore-v2-9-0.html"&gt;one
of the updates to BlogMore&lt;/a&gt;: I'd not done
any good default markup for &lt;code&gt;&amp;lt;kbd&amp;gt;&lt;/code&gt; and the moment I realised, I knew I had
to fix it.&lt;/p&gt;
&lt;p&gt;Now that I'm writing more on this blog, and especially about
&lt;a href="https://blog.davep.org/tag/coding/"&gt;coding&lt;/a&gt;, I'm mentioning keys pretty often (even more so given
I'm doing a lot of tidying up of my &lt;a href="https://blog.davep.org/tag/emacs-lisp/"&gt;Emacs Lisp&lt;/a&gt;
packages). The thing is though: I find having to type out &lt;code&gt;&amp;lt;kbd&amp;gt;&lt;/code&gt; and
&lt;code&gt;&amp;lt;/kbd&amp;gt;&lt;/code&gt; kind of tedious, and it's something I mistype from time to time. I
guess I could use some sort of HTML tag inserting tool or whatever, but I
got to thinking that it would be handy if I could point an Emacs command at
a particular sequence in a buffer and have it mark up the whole thing.&lt;/p&gt;
&lt;p&gt;This resulted in a small bit of code I'm calling
&lt;a href="https://github.com/davep/kbdify.el" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;kbdify.el&lt;/code&gt;&lt;/a&gt;. It's pretty simple, if
&lt;code&gt;point&lt;/code&gt; is sat on some text that looks like this:&lt;/p&gt;
&lt;div class="highlight" data-lang="text"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;C-M-S-s-&amp;lt;up&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;and I run &lt;code&gt;kbdify&lt;/code&gt; I get this:&lt;/p&gt;
&lt;div class="highlight" data-lang="text"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;lt;kbd&amp;gt;C&amp;lt;/kbd&amp;gt;-&amp;lt;kbd&amp;gt;M&amp;lt;/kbd&amp;gt;-&amp;lt;kbd&amp;gt;S&amp;lt;/kbd&amp;gt;-&amp;lt;kbd&amp;gt;s&amp;lt;/kbd&amp;gt;-&amp;lt;kbd&amp;gt;&amp;amp;lt;up&amp;amp;gt;&amp;lt;/kbd&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The result rendering as
&lt;kbd&gt;C&lt;/kbd&gt;-&lt;kbd&gt;M&lt;/kbd&gt;-&lt;kbd&gt;S&lt;/kbd&gt;-&lt;kbd&gt;s&lt;/kbd&gt;-&lt;kbd&gt;&amp;lt;up&amp;gt;&lt;/kbd&gt;.&lt;/p&gt;
&lt;p&gt;I could probably take it a bit further, have it optionally work on a region
and stuff like that, but even in its current simplistic form it's going to
be loads quicker and a lot more accurate and will probably perfectly cover
99% of the times I need it. There is the issue that it's not going to handle
something like &lt;code&gt;M-x some-command RET&lt;/code&gt; in the way I might like, but then
again &lt;code&gt;some-command&lt;/code&gt; isn't a key. Like, does it make more sense to have:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;kbd&gt;M&lt;/kbd&gt;-&lt;kbd&gt;x&lt;/kbd&gt; &lt;kbd&gt;some-command&lt;/kbd&gt; &lt;kbd&gt;RET&lt;/kbd&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;anyway? Personally I think this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;kbd&gt;M&lt;/kbd&gt;-&lt;kbd&gt;x&lt;/kbd&gt; &lt;code&gt;some-command&lt;/code&gt; &lt;kbd&gt;RET&lt;/kbd&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;probably makes more sense.&lt;/p&gt;
&lt;p&gt;I think I'm good for now.&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/04/24/kbdify-el-v1-0-0.html</guid>
      <category>Emacs</category>
      <category>Emacs</category>
      <category>Emacs Lisp</category>
      <category>Lisp</category>
      <category>coding</category>
      <category>kbdify.el</category>
      <category>Markdown</category>
      <pubDate>Fri, 24 Apr 2026 17:04:37 +0100</pubDate>
    </item>
    <item>
      <title>itch.el v1.3.0</title>
      <link>https://blog.davep.org/2026/04/24/itch-el-v1-3-0.html</link>
      <description>&lt;p&gt;When I'm working in &lt;a href="https://blog.davep.org/category/emacs/"&gt;Emacs&lt;/a&gt; I use the &lt;code&gt;*scratch*&lt;/code&gt; buffer
quite a bit. I find it especially useful if I'm working on some &lt;a href="https://blog.davep.org/tag/emacs-lisp/"&gt;Emacs
Lisp&lt;/a&gt; code, but I also find it handy as a place to drop
something I want to retrieve soon, or a quick note that I want to refer back
to soon; sometimes I even paste some text there and copy it back just to
strip the formatting from it before using it elsewhere&lt;sup id="fnref:260-1"&gt;&lt;a class="footnote-ref" href="#fn:260-1"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Because of this, for a long time, I carried a little function around that I
had bound to &lt;kbd&gt;M&lt;/kbd&gt;-&lt;kbd&gt;s&lt;/kbd&gt; to quickly take me to the &lt;code&gt;*scratch*&lt;/code&gt;
buffer. Then, I think &lt;a href="https://blog.davep.org/2017/04/01/another_revamp_of_my_emacs_config.html"&gt;around the time I did the follow-up revamp of my Emacs
configuration&lt;/a&gt;, I turned
it into a little package for my own use called
&lt;a href="https://github.com/davep/itch.el" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;itch.el&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The command (&lt;code&gt;itch-scratch-buffer&lt;/code&gt;) is simple enough: run it and I get
switched to my &lt;code&gt;*scratch*&lt;/code&gt; buffer. If I run it with a prefix argument it
switches to &lt;code&gt;*scratch*&lt;/code&gt; and resets the content back to the
&lt;a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Lisp-Interaction.html" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;initial-scratch-message&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;More recently I've found that I'm wanting a scratch buffer that is for
writing Markdown. Like many folk I use it a lot for documentation, and of
course I also use it for this blog. I also use it heavily for keeping notes
in Obsidian&lt;sup id="fnref:260-2"&gt;&lt;a class="footnote-ref" href="#fn:260-2"&gt;2&lt;/a&gt;&lt;/sup&gt;. So, often, I find myself switching to a temporary buffer
(&lt;code&gt;*foo*&lt;/code&gt; or something), setting it to &lt;code&gt;markdown-mode&lt;/code&gt;, and then writing what
I need.&lt;/p&gt;
&lt;p&gt;So yesterday I finally cracked and added &lt;code&gt;itch-markdown-scratch-buffer&lt;/code&gt;.
It's just like &lt;code&gt;itch-scratch-buffer&lt;/code&gt;, only it creates a &lt;code&gt;*scratch:
Markdown*&lt;/code&gt; buffer, using the same clear-if-prefix rule.&lt;/p&gt;
&lt;p&gt;So now I've got this bound to &lt;kbd&gt;M&lt;/kbd&gt;-&lt;kbd&gt;S&lt;/kbd&gt;-&lt;kbd&gt;s&lt;/kbd&gt; and I
can faff around just a little less when I want a Markdown scratchpad.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:260-1"&gt;
&lt;p&gt;On macOS at least, I find the "paste without formatting" support of
some applications to be really inconsistent; a quick layover in the
&lt;code&gt;*scratch*&lt;/code&gt; buffer does the trick every time.&amp;#160;&lt;a class="footnote-backref" href="#fnref:260-1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:260-2"&gt;
&lt;p&gt;Yes, I know, I should be using Org, but sadly it's just never clicked
for me, and I also find good syncing and having a consistent application
on mobile and desktop are important.&amp;#160;&lt;a class="footnote-backref" href="#fnref:260-2" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/04/24/itch-el-v1-3-0.html</guid>
      <category>Emacs</category>
      <category>Emacs</category>
      <category>Emacs Lisp</category>
      <category>Lisp</category>
      <category>coding</category>
      <category>itch.el</category>
      <pubDate>Fri, 24 Apr 2026 08:21:24 +0100</pubDate>
    </item>
    <item>
      <title>unabbrev.el v1.0.0</title>
      <link>https://blog.davep.org/2026/04/23/unabbrev-el-v1-0-0.html</link>
      <description>&lt;p&gt;Back in the late 1990s, like plenty of people who were very online, I was a
very avid user of Usenet. There were a few groups I was very active in, even
a couple that I maintained a FAQ for. Being that active and wanting to help
and answer questions, I was forever posting and pasting links to various
resources. Given that I used &lt;a href="https://blog.davep.org/category/emacs/"&gt;Emacs&lt;/a&gt; to edit my posts&lt;sup id="fnref:256-1"&gt;&lt;a class="footnote-ref" href="#fn:256-1"&gt;1&lt;/a&gt;&lt;/sup&gt;,
I eventually realised that I should come up with a tool that let me call on
common URLs quickly.&lt;/p&gt;
&lt;p&gt;So back in 1998 &lt;a href="https://github.com/davep/handyurl.el" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;handyurl.el&lt;/code&gt;&lt;/a&gt; was
born. It was a simple idea: have a file of URLs that I commonly refer to and
let me quickly pick from one and paste it. This made for a useful tool and
also gave me something to build given I was learning &lt;a href="https://blog.davep.org/tag/emacs-lisp/"&gt;Emacs
Lisp&lt;/a&gt; at the time.&lt;/p&gt;
&lt;p&gt;For reasons I can't quite recall, some time later (the next year, by the
looks of things), I wrote
&lt;a href="https://github.com/davep/quickurl.el" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;quickurl.el&lt;/code&gt;&lt;/a&gt; as a successor to
&lt;code&gt;handyurl.el&lt;/code&gt;. I honestly can't remember &lt;em&gt;why&lt;/em&gt; this happened, I can't
remember why I didn't just keep extending &lt;code&gt;handyurl.el&lt;/code&gt;. But, anyway,
&lt;code&gt;quickurl.el&lt;/code&gt; did more and was more flexible, with built-in URL-grabbing and
editing and so on.&lt;/p&gt;
&lt;p&gt;Not that long later I got an email from the FSF asking if I might be willing
to hand over copyright so that &lt;code&gt;quickurl.el&lt;/code&gt; could become part of Emacs
itself. I was, of course, delighted to do so.&lt;/p&gt;
&lt;p&gt;Eventually &lt;a href="https://blog.davep.org/2022/08/23/i-must-be-getting-old.html"&gt;&lt;code&gt;quickurl.el&lt;/code&gt; was declared
obsolete&lt;/a&gt; and, while it seems to
still be shipped with Emacs, it's not documented or easy to discover.&lt;/p&gt;
&lt;p&gt;In the deprecation notice in &lt;code&gt;NEWS&lt;/code&gt; the suggestion is that the user should
switch to one or more of 3 alternatives:&lt;/p&gt;
&lt;div class="highlight" data-lang="text"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;** The quickurl.el library is now obsolete.
Use &amp;#39;abbrev&amp;#39;, &amp;#39;skeleton&amp;#39; or &amp;#39;tempo&amp;#39; instead.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;abbrev&lt;/code&gt; I know, the other two I've never noticed and don't know anything
about.&lt;/p&gt;
&lt;p&gt;Obviously, between &lt;code&gt;quickurl.el&lt;/code&gt; being pulled into Emacs, and it being made
obsolete, my use of it fell right off. I eventually stopped posting to and
reading Usenet, I also stopped using &lt;a href="http://www.mutt.org/" rel="noopener noreferrer" target="_blank"&gt;mutt&lt;/a&gt;+Emacs as
my mail client of choice, and so found myself seldom writing things that
needed lots of links, in Emacs.&lt;/p&gt;
&lt;p&gt;Until recently.&lt;/p&gt;
&lt;p&gt;At the moment I'm finding that I'm wanting to write on my blog more and
more, and doing that means I often want to include some common links, and I
write my posts in Emacs using &lt;code&gt;markdown-mode&lt;/code&gt; and with a little help from
&lt;a href="https://blog.davep.org/tag/blogmore-el/"&gt;&lt;code&gt;blogmore.el&lt;/code&gt;&lt;/a&gt;; the need to have an easy-to-pick-from
common menu of URLs is back.&lt;/p&gt;
&lt;p&gt;Driven by this I've &lt;a href="https://github.com/davep/.emacs.d/blob/4d4a7b5da662b28764e779aba2700d451f5221a5/init.d/packages.d/personal/blogmore.el#L14-L17" rel="noopener noreferrer" target="_blank"&gt;made a point of using &lt;code&gt;abbrev&lt;/code&gt; to initially solve this
problem&lt;/a&gt;.
This works, but I do have a problem: I keep forgetting what the
abbreviations are. I find myself wanting to have a key binding that lets me
at the very least
&lt;a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Minibuffer-Completion.html" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;completing-read&lt;/code&gt;&lt;/a&gt;
the desired abbrev. So yesterday I quickly knocked up
&lt;a href="https://github.com/davep/unabbrev.el" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;unabbrev.el&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It's simple, straightforward, small and does the job I needed. Doubtless
there's something else out there that can do this sort of thing too, but
part of the fun of Emacs (for me) is that I find I have a need and I can
hack together some Lisp and get that problem solved.&lt;/p&gt;
&lt;p&gt;&lt;img alt="The code in action" height="676" loading="lazy" src="https://blog.davep.org/attachments/2026/04/23/unabbrev.webp#centre" width="734" /&gt;&lt;/p&gt;
&lt;p&gt;I suppose what I &lt;em&gt;should&lt;/em&gt; do is revive either &lt;code&gt;handyurl.el&lt;/code&gt; or &lt;code&gt;quickurl.el&lt;/code&gt;
and tweak and update whichever, at the very least adding some sort of insert
formatting facility that is sensitive to the underlying mode (because links
in Markdown need a format different from links in HTML, etc).&lt;/p&gt;
&lt;p&gt;For now though &lt;code&gt;unabbrev.el&lt;/code&gt; is going to help my failing memory when I want
to link a common resource.&lt;/p&gt;
&lt;p&gt;As an aside, all of this does have me wonder about one thing: is the Free
Software Foundation the place that code goes to die? Like, sure, of course I
&lt;em&gt;can&lt;/em&gt; make changes to &lt;code&gt;quickurl.el&lt;/code&gt; and do my own thing with it, as long as
I don't misrepresent the copyright status and maintain a compatible licence,
etc; but there is this thing where, if Emacs doesn't want that code any
more, if the FSF don't want that code any more, wouldn't it be nice if
they'd sign it back over again?&lt;/p&gt;
&lt;p&gt;I am tempted to drop them a line and see what the deal is. I did &lt;a href="https://fosstodon.org/@davep/116376633686272162" rel="noopener noreferrer" target="_blank"&gt;tag-ask on
Mastodon&lt;/a&gt; but got no reply.
Unfortunately though that account looks like the FSF treat Mastodon as a
write-only resource.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:256-1"&gt;
&lt;p&gt;But curiously never got into
&lt;a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Gnus.html" rel="noopener noreferrer" target="_blank"&gt;Gnus&lt;/a&gt;,
my news client of choice was &lt;a href="https://www.slrn.org/" rel="noopener noreferrer" target="_blank"&gt;slrn&lt;/a&gt; and I
composed posts in Emacs.&amp;#160;&lt;a class="footnote-backref" href="#fnref:256-1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/04/23/unabbrev-el-v1-0-0.html</guid>
      <category>Emacs</category>
      <category>Emacs</category>
      <category>Emacs Lisp</category>
      <category>FOSS</category>
      <category>FSF</category>
      <category>Free Software</category>
      <category>Lisp</category>
      <category>coding</category>
      <category>handyurl.el</category>
      <category>quickurl.el</category>
      <category>unabbrev.el</category>
      <pubDate>Thu, 23 Apr 2026 08:25:57 +0100</pubDate>
    </item>
    <item>
      <title>expando.el v1.6</title>
      <link>https://blog.davep.org/2026/04/22/expando-el-v1-6.html</link>
      <description>&lt;p&gt;Recently I've had an odd problem with &lt;a href="https://blog.davep.org/category/emacs/"&gt;Emacs&lt;/a&gt;:
occasionally, and somewhat randomly, as I wrote code, and only when I wrote
&lt;a href="https://blog.davep.org/tag/emacs-lisp/"&gt;Emacs Lisp&lt;/a&gt; code, and only when working in
&lt;code&gt;emacs-lisp-mode&lt;/code&gt;, I'd find that the buffer I was working in would
disappear. Not just fully disappear, but more like if I'd used
&lt;code&gt;quit-window&lt;/code&gt;. Worse still, once this started happening, it wouldn't go away
unless I turned Emacs off and on again.&lt;/p&gt;
&lt;p&gt;Very un-Emacs!&lt;/p&gt;
&lt;p&gt;Normally this would happen when I'm in full flow on something, so I'd just
restart Emacs and crack on with the thing I was writing; because of this I
wasn't diagnosing what was actually going on.&lt;/p&gt;
&lt;p&gt;Then, today, as I was writing &lt;code&gt;require&lt;/code&gt; in some code, and kept seeing the
buffer go away when I hit &lt;kbd&gt;q&lt;/kbd&gt;, it dawned on me.&lt;/p&gt;
&lt;p&gt;Recently, when &lt;a href="https://blog.davep.org/2026/04/06/expando-el-v1-5.html"&gt;I cleaned up
&lt;code&gt;expando.el&lt;/code&gt;&lt;/a&gt;, I added the ability to
close the window with &lt;kbd&gt;q&lt;/kbd&gt;.&lt;/p&gt;
&lt;div class="highlight" data-lang="diff"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gd"&gt;--- a/expando.el&lt;/span&gt;
&lt;span class="gi"&gt;+++ b/expando.el&lt;/span&gt;
&lt;span class="gu"&gt;@@ -58,7 +58,8 @@ Pass LEVEL as 2 (or prefix a call with \\[universal-argument] and&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;  (let ((form (preceding-sexp)))
&lt;span class="w"&gt; &lt;/span&gt;    (with-current-buffer-window &amp;quot;*Expando Macro*&amp;quot; nil nil
&lt;span class="w"&gt; &lt;/span&gt;      (emacs-lisp-mode)
&lt;span class="gd"&gt;-      (pp (funcall (expando--expander level) form)))))&lt;/span&gt;
&lt;span class="gi"&gt;+      (local-set-key (kbd &amp;quot;q&amp;quot;) #&amp;#39;quit-window)&lt;/span&gt;
&lt;span class="gi"&gt;+      (pp (funcall (expando--expander level) form)))))&lt;/span&gt;

&lt;span class="w"&gt; &lt;/span&gt;(provide &amp;#39;expando)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;So, after opening a window for the purposes of displaying the expanded
macro, switch to &lt;code&gt;emacs-lisp-mode&lt;/code&gt;, locally set the binding so &lt;kbd&gt;q&lt;/kbd&gt;
will call on &lt;code&gt;quit-window&lt;/code&gt;, and I'm all good.&lt;/p&gt;
&lt;p&gt;Except... not, as it turns out.&lt;/p&gt;
&lt;p&gt;To quote from the documentation for &lt;code&gt;local-set-key&lt;/code&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The binding goes in the current buffer’s local map, which in most cases is
shared with all other buffers in the same major mode.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;D'oh!&lt;/p&gt;
&lt;p&gt;Point being, any time I used &lt;code&gt;expando-macro&lt;/code&gt;, I was changing the meaning of
&lt;kbd&gt;q&lt;/kbd&gt; in the keyboard map for &lt;code&gt;emacs-lisp-mode&lt;/code&gt;. :-/&lt;/p&gt;
&lt;p&gt;And so v1.6 of &lt;a href="https://github.com/davep/expando.el" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;expando.el&lt;/code&gt;&lt;/a&gt; is now a
thing, in which I introduce a derived mode of &lt;code&gt;emacs-lisp-mode&lt;/code&gt; and set
&lt;kbd&gt;q&lt;/kbd&gt; in its keyboard map. In fact, I keep the keyboard map nice and
simple.&lt;/p&gt;
&lt;div class="highlight" data-lang="elisp"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defvar&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;expando-view-mode-map&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;map&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;make-sparse-keymap&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;define-key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;map&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kbd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;q&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;quit-window&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;map&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Mode map for &lt;/span&gt;&lt;span class="ss"&gt;`expando-view-mode&amp;#39;&lt;/span&gt;&lt;span class="s"&gt;.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;define-derived-mode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;expando-view-mode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;emacs-lisp-mode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;expando&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Major mode for viewing expanded macros.&lt;/span&gt;

&lt;span class="s"&gt;The key bindings for &lt;/span&gt;&lt;span class="ss"&gt;`expando-view-mode&amp;#39;&lt;/span&gt;&lt;span class="s"&gt; are:&lt;/span&gt;

&lt;span class="s"&gt;\\{expando-view-mode-map}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;From now on I should be able to code in full flow state without the worry
that my window will disappear at any given moment...&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/04/22/expando-el-v1-6.html</guid>
      <category>Emacs</category>
      <category>Emacs</category>
      <category>Emacs Lisp</category>
      <category>Lisp</category>
      <category>coding</category>
      <category>expando.el</category>
      <category>local-set-key</category>
      <pubDate>Wed, 22 Apr 2026 19:21:40 +0100</pubDate>
    </item>
  </channel>
</rss>
