<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" >

  <title>Erik L. Arneson — Writer and Software Developer</title>
  <subtitle>Erik L. Arneson is a freelance writer and software developer with WordPress experience. He is located in Portland, Oregon.</subtitle>
  <generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator>
  <link href="https://arnesonium.com/feeds/emacs.xml" rel="self" type="application/atom+xml" />
  <link href="https://arnesonium.com/" rel="alternate" type="text/html" />
  <updated>2026-04-11T19:26:16+00:00</updated>
  <id>https://arnesonium.com/feeds/emacs.xml</id>
  <author>
    <name>Erik L. Arneson</name>
  </author>
      <entry>
        
        <title>Emacs as the Freelancer&apos;s Command Center</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2026/04/emacs-freelance-command-center" rel="alternate" type="text/html" title="Emacs as the Freelancer's Command Center" />
        <updated>2026-04-10T00:00:00+00:00</updated>
        <id>https://arnesonium.com/2026/04/emacs-freelance-command-center</id>
          <category term="emacs" />
        
          <category term="org-mode" />
        
          <category term="programming" />
        
          <category term="writing" />
        
          <category term="music" />
        
          <category term="wordpress" />
        
          <category term="emacs-lisp" />
        
          <category term="email" />
        
          <category term="git" />
        
          <category term="tools" />
        <content type="html" xml:base="https://arnesonium.com/2026/04/emacs-freelance-command-center">&lt;p&gt;Freelancing for small businesses and organizations leads to a position where you are juggling a
number of projects for multiple clients. You need to keep track of a number of tasks ranging from
software development to sending emails to project management. This is a lot easier when you have a
system that can do a bunch of the work for you, which is why I use Emacs as my freelancer command
center.&lt;/p&gt;

&lt;p&gt;I would like to share some of the tools and workflows I use in Emacs to help me keep on top of
multiple clients’ needs and expectations.&lt;/p&gt;

&lt;!--more--&gt;

&lt;h2 id=&quot;organization-with-org-mode&quot;&gt;Organization with org-mode&lt;/h2&gt;

&lt;p&gt;It should be no surprise that at the center of my Emacs command center is &lt;a href=&quot;https://orgmode.org/&quot;&gt;org-mode&lt;/a&gt;. I have already
&lt;a href=&quot;/tags/org-mode/&quot;&gt;written about it a lot&lt;/a&gt;. Every org-mode user seems to have their own way of keeping track of things,
so please don’t take my organizational scheme as some kind of gospel. A couple of years ago, I wrote
about &lt;a href=&quot;/2024/10/todo-lists-in-org-mode&quot;&gt;how I handle to-do lists in org-mode&lt;/a&gt;, and I am still using that method for to-do keywords.
However, file structure is also important. I have a number of core files.&lt;/p&gt;

&lt;h3 id=&quot;freelanceorg&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Freelance.org&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;This top-level file contains all of my ongoing business tasks, such as tracking potential new
clients, recurring tasks like website maintenance and checking my &lt;a href=&quot;https://mainwp.com/&quot;&gt;MainWP dashboard&lt;/a&gt;. I also have
recurring tasks for invoicing, tracking expenses, and other important business things.&lt;/p&gt;

&lt;p&gt;This file is also where I have my primary time tracking and reporting. Org-mode already supports
this pretty nicely, I just use the built-in &lt;a href=&quot;https://orgmode.org/manual/The-clock-table.html&quot;&gt;clocktable feature&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;clientsorg&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Clients/*.org&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Clients that have large projects or ongoing business get their own file. This makes organization a
lot easier. All tasks associated with a client and their various projects end up in these individual
files. The important part is making sure that these files are included in the time-tracking
clock table &lt;em&gt;and&lt;/em&gt; your org-mode agenda, so you can see what is going on every week.&lt;/p&gt;

&lt;h3 id=&quot;references-and-linking&quot;&gt;References and Linking&lt;/h3&gt;

&lt;p&gt;I have &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C-c l&lt;/code&gt; bound to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;org-store-link&lt;/code&gt; and use it all the time to link to various files,
directories, URLs, and even emails. I can then use those links in my client notes, various tasks in
my to-do list, and so on. This helps me keep my agenda organized even when my filesystem and
browser bookmarks are a bit of a mess.&lt;/p&gt;

&lt;h2 id=&quot;email-with-mu4e&quot;&gt;Email with mu4e&lt;/h2&gt;

&lt;p&gt;I have been reading and managing my email in Emacs for over 25 years. There have been a few breaks
here and there where I have tried out other software or even web mail clients, but it has always been
a headache. I return to Emacs! Long ago, I used &lt;a href=&quot;https://gitlab.com/emacs-vm/vm&quot;&gt;VM&lt;/a&gt; (which seems to have taken on new life!), but
currently I use &lt;a href=&quot;https://djcbsoftware.nl/code/mu/mu4e/index.html&quot;&gt;mu4e&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This gives me a ton of power and flexibility when dealing with email. I have custom functions to
help me compose and organize my email, and I can use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;org-store-link&lt;/code&gt; to keep track of individual
emails from clients as they relate to agenda items. I even have a function to convert emails that I
have written in Markdown into HTML email, and one that searches for questions in a client email to
make sure I haven’t missed anything.&lt;/p&gt;

&lt;p&gt;The ability to write custom code to both process and create email is extremely powerful and a great
time saver.&lt;/p&gt;

&lt;h2 id=&quot;writing-code&quot;&gt;Writing Code&lt;/h2&gt;

&lt;p&gt;I don’t know what else to say about this, I use Emacs for doing all of my software development. I
make sure to use &lt;a href=&quot;https://github.com/joaotavora/eglot&quot;&gt;Eglot&lt;/a&gt; whenever there is a language server available, and I try to leverage all the
fancy features offered by Emacs whenever possible. The vast majority of projects for clients are PHP
(thanks &lt;a href=&quot;/wordpress/&quot;&gt;WordPress&lt;/a&gt;), Go, JavaScript, and TypeScript.&lt;/p&gt;

&lt;h2 id=&quot;writing-words&quot;&gt;Writing Words&lt;/h2&gt;

&lt;p&gt;Previously, I have shared quite a bit about &lt;a href=&quot;/tags/writing/&quot;&gt;writing in Emacs&lt;/a&gt;. I like to start everything in
org-mode, but I also write quite a bit in Markdown. Emacs has become a powerful tool for writing. I
use the &lt;a href=&quot;https://writewithharper.com/&quot;&gt;Harper language server&lt;/a&gt; along with Eglot to check grammar and spelling.&lt;/p&gt;

&lt;h2 id=&quot;track-all-changes-with-magit&quot;&gt;Track All Changes with Magit&lt;/h2&gt;

&lt;p&gt;Version control is essential, a lesson I have learned over 30+ years of software development. While
&lt;a href=&quot;https://git-scm.com/&quot;&gt;Git&lt;/a&gt; is not part of Emacs, the software I use to interface with Git is. &lt;a href=&quot;https://magit.vc/&quot;&gt;Magit&lt;/a&gt; is a Git user interface
that runs entirely in Emacs. I use it to track my writing, my source code, and even all of my
org-mode files. Using version control is so essential that I have a weekly repeating agenda task
reminding me to check all of my everyday files to make sure I have checked-in my changes for the
week.&lt;/p&gt;

&lt;h2 id=&quot;thinking-music-with-emms&quot;&gt;Thinking Music with EMMS&lt;/h2&gt;

&lt;p&gt;I like to have some soothing background music when I am programming, writing, or otherwise working
on my computer. However, if that background music has lyrics, it can be really distracting. It is
easy to make a playlist for various suitable &lt;a href=&quot;https://somafm.com/&quot;&gt;SomaFM&lt;/a&gt; channels to load into &lt;a href=&quot;https://www.gnu.org/software/emms/&quot;&gt;EMMS (the Emacs Multimedia
System)&lt;/a&gt; using the command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;M-x emms-play-playlist&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Try saving the following into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;playlist.el&lt;/code&gt; somewhere, and using it the next time you are writing:&lt;/p&gt;

&lt;div class=&quot;language-emacs-lisp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; &lt;span class=&quot;c1&quot;&gt;;;; This is an EMMS playlist file Play it with M-x emms-play-playlist&lt;/span&gt;
 &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;vg&quot;&gt;*track*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;https://somafm.com/synphaera.pls&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;vg&quot;&gt;*track*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;https://somafm.com/gsclassic.pls&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;vg&quot;&gt;*track*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;https://somafm.com/sonicuniverse.pls&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;vg&quot;&gt;*track*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;https://somafm.com/groovesalad.pls&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And make sure to check out SomaFM’s selection to find some good background music that suits your
tastes!&lt;/p&gt;

&lt;h2 id=&quot;and-the-tools-i-have-missed&quot;&gt;And the tools I have missed&lt;/h2&gt;

&lt;p&gt;There are undoubtedly Emacs tools that I have missed in this brief overview. I have been wracking my
brain as I write, trying to see what I have forgotten or overlooked. Frankly, Emacs has become such
a central part of the organization for my freelancing that there are probably many tools, packages,
and processes that I use every day without thinking about it too much.&lt;/p&gt;

&lt;p&gt;Emacs makes it possible for me to freelance for multiple clients and small businesses without losing
my mind with organization and task management. The tools it provides allow me to stay on top of
multiple projects, handle client relationships, and keep track of years worth of tasks,
communications, and projects. Without it, I’d be sunk!&lt;/p&gt;

&lt;p&gt;What Emacs tools are you using to manage your freelance business? I am always looking for ways to
improve or streamline my process.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The featured image for this post comes from Agostino Ramelli’s&lt;/em&gt; Le diverse et artificiose machine &lt;em&gt;(1588). &lt;a href=&quot;https://publicdomainreview.org/collection/agostino-ramelli-theatre-of-machines/&quot;&gt;Read more about it on the Public Domain Review.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>An Emacs Application Launcher for Regolith</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2025/11/regolith-emacs-launcher" rel="alternate" type="text/html" title="An Emacs Application Launcher for Regolith" />
        <updated>2025-11-19T00:00:00+00:00</updated>
        <id>https://arnesonium.com/2025/11/regolith-emacs-launcher</id>
          <category term="emacs" />
        
          <category term="shell" />
        
          <category term="bash" />
        
          <category term="lisp" />
        
          <category term="programming" />
        
          <category term="ubuntu" />
        <content type="html" xml:base="https://arnesonium.com/2025/11/regolith-emacs-launcher">&lt;p&gt;I run the &lt;a href=&quot;https://regolith-desktop.com/&quot;&gt;Regolith Desktop Environment&lt;/a&gt; on my laptop, which I love because it provides a convenient GNOME wrapper and interface for the &lt;a href=&quot;https://i3wm.org/&quot;&gt;i3 tiling window manager&lt;/a&gt;. Regolith relies on a program called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ilia&lt;/code&gt; for application launching, and sometimes &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ilia&lt;/code&gt; gets caught in some kind of CPU-churning state that locks up my whole system. I have not been able to figure out what is causing it, so I (of course) turned to Emacs for a solution.&lt;/p&gt;

&lt;!--more--&gt;

&lt;h2 id=&quot;turning-to-consult-omni&quot;&gt;Turning to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;consult-omni&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Armin Darvish has created a powerful Emacs package called &lt;a href=&quot;https://github.com/armindarvish/consult-omni&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;consult-omni&lt;/code&gt;&lt;/a&gt;, which provides a wrapper around &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;consult&lt;/code&gt; for searching through any number of information sources. I believe &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;consult-omni&lt;/code&gt; was originally intended to query web search engines and document databases, but Darvish has also provided a search mode for your local desktop applications, and can act as an application launcher.&lt;/p&gt;

&lt;p&gt;Darvish provides an example application launcher in his &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;consult-omni&lt;/code&gt; YouTube tutorial. The source code is straightforward, but I wanted to tweak it just a little. You can view &lt;a href=&quot;https://github.com/armindarvish/consult-omni/wiki/YouTube-Tutorial#create-a-launcher&quot;&gt;his original on the project’s wiki on GitHub&lt;/a&gt;. You can watch him explain his technique below.&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/wNH2E7iT__c?start=8595&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;After a few tweaks, here is what I came up with.&lt;/p&gt;

&lt;div class=&quot;language-emacs-lisp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;defun&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;consult-launcher&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&quot;A launcher suitable for use from a window manager.&quot;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;interactive&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;let*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;width&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;floor&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.6&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;display-pixel-width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))))&lt;/span&gt;
         &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;height&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;floor&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.6&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;display-pixel-height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))))&lt;/span&gt;
         &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;left&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;floor&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.2&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;display-pixel-width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))))&lt;/span&gt;
         &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;top&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;floor&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.2&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;display-pixel-height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))))&lt;/span&gt;
         &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;params&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;omni-launcher&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;width&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cons&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;&apos;text-pixels&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
                   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;height&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cons&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;&apos;text-pixels&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
                   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;left&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;top&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;top&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;minibuffer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;only&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;
         &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;frame&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;make-frame&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;with-selected-frame&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;frame&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;select-frame-set-input-focus&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;;; If i3 is running and there is a control socket, let&apos;s tell&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;;; it we are a floating frame.&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;getenv&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;I3SOCK&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
          &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;call-process&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;i3-msg&quot;&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;
                        &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;format&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;[id=%s] floating enable&quot;&lt;/span&gt;
                                &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;s-trim&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;shell-command-to-string&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;xdotool getactivewindow&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))))&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;unwind-protect&lt;/span&gt;
          &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;progn&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;consult-omni-apps-static&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;.*&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;propertize&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&amp;gt; &quot;&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;&apos;face&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;&apos;consult-omni-path-face&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
                 &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;progn&lt;/span&gt;
          &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;when&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;frame-live-p&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;delete-frame&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
          &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I made two changes to get this to work nicely with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;i3&lt;/code&gt;. First, I removed the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;yequake&lt;/code&gt; dependency. Second, I added a call to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;i3-msg&lt;/code&gt; that sets the launcher frame as floating, which makes it much nicer to use. Like Darvish’s version, you can run this from the command line:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;emacsclient -e &apos;(consult-launcher)&apos;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;adding-an-ilia-fallback&quot;&gt;Adding an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ilia&lt;/code&gt; fallback&lt;/h2&gt;

&lt;p&gt;Don’t tell all the other Emacs users, but I don’t have Emacs set up to launch automatically when I start my computer and log into X11. I probably should, huh? Also, there are times when I (gasp!) shut down Emacs, usually to restart it or fix something that I have broken. When those times happen, I want to be able to launch applications, so I need a failsafe in case &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;consult-launcher&lt;/code&gt; isn’t available!&lt;/p&gt;

&lt;p&gt;To solve this, I created a simple shell wrapper script, which looks like this:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/bash&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Check if Emacs server is running by looking for the server socket&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# Default server name is &quot;server&quot;, but you can change this if needed&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;SERVER_NAME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;EMACS_SERVER_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:-&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;server&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;SERVER_FILE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;XDG_RUNTIME_DIR&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:-&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/tmp&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/emacs/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SERVER_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-S&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$SERVER_FILE&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;# Emacs is running, use emacsclient to launch your application&lt;/span&gt;
    emacsclient &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;(consult-launcher)&apos;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;# Emacs is not running, fall back to ilia&lt;/span&gt;
    ilia &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; apps
&lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If you want to use this, the important part is that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SERVER_FILE&lt;/code&gt; points to the socket that your Emacs server uses. Make sure that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;emacsclient&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ilia&lt;/code&gt; are both in a reasonable location so your shell can find them, then bind this command to whatever you usually use to launch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ilia&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;By the way, if you are using Regolith’s normal method of launching &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ilia&lt;/code&gt;, you can add your shell script to your Regolith configuration pretty easily. Open &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$HOME/.config/regolith3/Xresources&lt;/code&gt; in your text editor, and add the line:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;wm.program.launcher.app: /path/to/your/launcher.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can then run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xrdb -override $HOME/.config/regolith3/Xresources&lt;/code&gt; and it should work! Good luck.&lt;/p&gt;

&lt;h2 id=&quot;drawbacks&quot;&gt;Drawbacks&lt;/h2&gt;

&lt;p&gt;One of the nice things about &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ilia&lt;/code&gt; is that it keeps track of applications your run frequently, so they tend to bubble up to the top of its application listing. The Emacs method doesn’t do that. I don’t mind so much, I always end up typing in application names. It is fun to use Emacs as an application launcher, and I hope that it helps me avoid the CPU-churn problem that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ilia&lt;/code&gt; has been experiencing far too often.&lt;/p&gt;

&lt;p&gt;Have I come up with a clever solution, or a lazy workaround? I’m looking forward to hearing your thoughts.&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Interviewed on &quot;Prot Speaks&quot;</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2025/08/interviewed-on-prot-speaks" rel="alternate" type="text/html" title="Interviewed on "Prot Speaks"" />
        <updated>2025-08-18T00:00:00+00:00</updated>
        <id>https://arnesonium.com/2025/08/prot-speaks-interview</id>
          <category term="emacs" />
        
          <category term="podcast" />
        
          <category term="programming" />
        
          <category term="org-mode" />
        
          <category term="lisp" />
        
          <category term="golang" />
        
          <category term="portland" />
        <content type="html" xml:base="https://arnesonium.com/2025/08/interviewed-on-prot-speaks">&lt;p&gt;Well-known Emacs package creator Protesilaos Stavrou interviewed me for his video podcast series, “Prot Asks.” We talked about a wide variety of topics, from Emacs to podcasting to Portland to public transit. I thought it was a great time, and perhaps you will like it, too!&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;You can read and view the video &lt;a href=&quot;https://protesilaos.com/codelog/2025-08-17-prot-asks-erik-emacs-1990s-portland-oregon-podcasting/&quot;&gt;on Prot’s website and blog&lt;/a&gt;, or you can go &lt;a href=&quot;https://www.youtube.com/watch?v=6wkfFdiwpyU&quot;&gt;straight to YouTube&lt;/a&gt;, or you can watch it embedded here below.&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube-nocookie.com/embed/6wkfFdiwpyU?si=ocNz3f6ehqEYYC2G&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;Note that Prot is looking for people to talk to on this series! You can join in by &lt;a href=&quot;https://protesilaos.com/prot-asks/&quot;&gt;signing up on his website&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;P.S. In the video, I promised that I would do another Emacs Carnival blog post, and I will, I swear! It is in my org-mode to-do file.&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Writing Experience (Emacs Carnival)</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2025/07/writing-experience-emacs-carnival" rel="alternate" type="text/html" title="Writing Experience (Emacs Carnival)" />
        <updated>2025-07-07T00:00:00+00:00</updated>
        <id>https://arnesonium.com/2025/07/writing-experience</id>
          <category term="emacs" />
        
          <category term="writing" />
        
          <category term="org-mode" />
        <content type="html" xml:base="https://arnesonium.com/2025/07/writing-experience-emacs-carnival">&lt;p&gt;This is my contribution to month two of &lt;a href=&quot;https://gregnewman.io/blog/emacs-carnival-2025-07-writing-experience/&quot;&gt;Greg Newman’s Emacs Carnival&lt;/a&gt;. The topic this month is “Writing Experience,” which is perfect, since I write in Emacs all the time. In fact, I am writing this blog post in Emacs right now!
&lt;!--more--&gt;&lt;/p&gt;

&lt;h2 id=&quot;emacs-writing-history&quot;&gt;Emacs Writing History&lt;/h2&gt;

&lt;p&gt;I do not know how long I have been writing in Emacs, but I have documents written in LaTeX from the early 2000s that were definitely written in Emacs, and I know those weren’t the first. I guess what is interesting about my writing experience in Emacs is how it has developed over the years. Where I originally wrote everything in plain text or LaTeX, over time I moved to org-mode and Markdown.&lt;/p&gt;

&lt;p&gt;Writing LaTeX in Emacs taught me to view documents and writing the same way I view source code. Since all of my writing was in text formats, I could easily use version control software to store archives full of text. I began by using &lt;a href=&quot;https://en.wikipedia.org/wiki/Concurrent_Versions_System&quot;&gt;Concurrent Versions System (CVS)&lt;/a&gt;, but eventually moved to Git. I have a few Git repositories with writing, but my biggest dates back to 2009. Those early commits are all LaTeX and plain text files.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;commit c64500897e2509bc3316d252cda10a9119384933
Author: Erik L. Arneson &amp;lt;pXXX@XXX.XXX&amp;gt;
Date:   Sat Dec 5 10:51:06 2009 -0800

    Initial import of an old repository.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The oldest org-mode file in my writing repository dates to December 27th, 2010, and is titled “Beer and Pizza.” The commit message indicates that I pulled some writing over from another repository in this commit, so obviously I had been writing with org-mode for quite a while. I know, for instance, that “Beer and Pizza” was an article that I wrote for an early incarnation of &lt;a href=&quot;https://southernoregonmagazine.com/&quot;&gt;Southern Oregon Magazine&lt;/a&gt;, and my notes are dated back to February of that year.&lt;/p&gt;

&lt;h2 id=&quot;org-mode-is-a-life-changer&quot;&gt;Org-mode Is A Life-changer&lt;/h2&gt;

&lt;p&gt;You have probably read other people’s experience with writing in org-mode in Emacs, so instead of sharing an exhausting list of all the life-changing, writing-improving things that it has brought me, here are a few bits that I really love about it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It is fantastic at organizing writing projects.&lt;/strong&gt; From being able to shift around headings and blocks of text, to combining to-do lists with writing projects, to being able to create macros and include different files—all of these things make org-mode perfect for working on medium and large projects. I write everything from blog posts to podcast scripts to &lt;em&gt;books&lt;/em&gt; in org-mode, and it helps me stay organized.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I do not have to write in Word or Google Docs.&lt;/strong&gt; The export functions in org-mode do a great job creating Word files, ODT files, HTML files, and all kinds of formats. If org-mode’s export abilities aren’t good enough, it can also interface with &lt;a href=&quot;https://pandoc.org/&quot;&gt;pandoc&lt;/a&gt; to cover all the other cases! This means I get to use all of my familiar tools and processes when writing, and I don’t have to worry about &lt;a href=&quot;https://lions-way-presents.captivate.fm/episode/the-word-processor-war/&quot;&gt;awful word processing software&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Everything I need to write can happen in org-mode!&lt;/strong&gt; I have several websites that are built entirely out of org-mode. When I need to create slides for a lecture, I do it in org-mode. When I write adventures for Dungeons &amp;amp; Dragons, I do it in org-mode. When I need to whip up a spreadsheet to handle my household budget, I do it in org-mode. When I need to write a formal letter, I do it in org-mode. Frankly, it is so expressive and flexible, that I don’t need to use other tools for writing. It’s all Emacs and org-mode.&lt;/p&gt;

&lt;h2 id=&quot;emacs-can-be-distraction-free&quot;&gt;Emacs Can Be Distraction-Free&lt;/h2&gt;

&lt;p&gt;I have a hotkey connected to &lt;a href=&quot;https://github.com/joostkremers/writeroom-mode&quot;&gt;writeroom-mode&lt;/a&gt;, which plonks me right into a full-screen, distraction-free writing mode. Easy as pie! This means that when I really need to get down to business and get a lot of writing done, I don’t need to switch to a new app, leave my familiar tools behind, or go through any extra trouble. It’s just right here, built in.&lt;/p&gt;

&lt;h2 id=&quot;no-going-back&quot;&gt;No Going Back&lt;/h2&gt;

&lt;p&gt;I’ve been writing with Emacs for decades. It is my comfortable writing spot. I honestly cannot see myself abandoning it for another writing tool, because it works for me. I just used a couple of commands to check my three biggest writing repositories, and I have approximately 630,000 words written in org-mode between them. That’s a commitment!&lt;/p&gt;

&lt;p&gt;I am aware that there are a lot of people out there using Emacs for writing, so I am excited to see what others share. I’m very pleased with Greg Newman’s choice for this second writing topic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Edit:&lt;/strong&gt; I realized that what I was calling my second biggest writing repository was actually my third biggest. I updated some numbers to reflect another 130,000 words of writing I found.&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Configuring Orgzly Interaction with Directory Local Variables</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2025/01/configuring-orgzly-with-directory-local-variables" rel="alternate" type="text/html" title="Configuring Orgzly Interaction with Directory Local Variables" />
        <updated>2025-01-28T00:00:00+00:00</updated>
        <id>https://arnesonium.com/2025/01/directory-local-with-orgzly</id>
          <category term="emacs" />
        
          <category term="org-mode" />
        
          <category term="howto" />
        <content type="html" xml:base="https://arnesonium.com/2025/01/configuring-orgzly-with-directory-local-variables">&lt;p&gt;I use &lt;a href=&quot;https://github.com/orgzly-revived/orgzly-android-revived&quot;&gt;Orgzly Revived&lt;/a&gt; on my phone to capture to-do items, tasks, writing ideas, and projects. Its files are then synced with an ownCloud server. Those same files are also constantly open in Emacs on my computer, which means there can be some gnarly issues with things getting out of sync. It took me a while to figure out a good way to manage this, and in this brief blog post, I would like to share my solution.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Setting up a remote storage system is outside the scope of this server. Orgzly Revived works well with Dropbox, ownCloud, and nextCloud, though support for the other two is nicer as it can support automatic syncing in more situations. The &lt;a href=&quot;https://github.com/orgzly-revived/documentation&quot;&gt;Orgzly Revived documentation&lt;/a&gt; has an excellent description of how that configuration works.&lt;/p&gt;

&lt;p&gt;Note that to keep things simple, I keep my Orgzly Revived files and &lt;em&gt;only&lt;/em&gt; those files in a directory on my remote server. On my computer, the location for these files is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/org/orgzly/&lt;/code&gt;, which is how I shall refer to it later on.&lt;/p&gt;

&lt;h2 id=&quot;configuring-orgzly-revived-auto-sync&quot;&gt;Configuring Orgzly Revived Auto-sync&lt;/h2&gt;

&lt;p&gt;To configure the auto-sync capabilities in Orgzly Revived, go to the settings screen in the app and then navigate to &lt;strong&gt;Sync &amp;gt; Auto-sync&lt;/strong&gt;. Ensure that the following options are toggled on:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Auto-sync&lt;/li&gt;
  &lt;li&gt;Note created&lt;/li&gt;
  &lt;li&gt;Note updated or deleted&lt;/li&gt;
  &lt;li&gt;App started or resumed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This ensures that Orgzly Revived is constantly checking your remote storage and both fetching and uploading changes.&lt;/p&gt;

&lt;h2 id=&quot;configuring-emacs-and-org-mode&quot;&gt;Configuring Emacs and Org-mode&lt;/h2&gt;

&lt;p&gt;On my computer, I want any changes that Orgzly Revived has updated to be automatically loaded into Emacs. Since I always leave Emacs running, that means it needs to detect changes on the disk for those particular files. I use two different methods to do this. First, in my init file, I have the following piece of code:&lt;/p&gt;

&lt;div class=&quot;language-lisp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;setq&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;orgzly-directory&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;expand-file-name&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;~/org/orgzly/&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;add-to-list&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;&apos;revert-without-query&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;rx&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;bol&lt;/span&gt; 
                                       &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;eval&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;orgzly-directory&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; 
                                       &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;.org&quot;&lt;/span&gt; 
                                       &lt;span class=&quot;nv&quot;&gt;eol&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This uses the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rx&lt;/code&gt; macro to easily create a regular expression that matches any filename ending in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&quot;.org&quot;&lt;/code&gt; in the directory containing Orgzly Revived files. You may need to play around with the regular expression to get the right match. By adding those files to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;revert-without-query&lt;/code&gt;, Emacs will not bug you with extra questions and confirmations when changes are detected. However, this only works when &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;auto-revert-mode&lt;/code&gt; is enabled!&lt;/p&gt;

&lt;p&gt;At first, I thought there may be a way to enable &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;auto-revert-mode&lt;/code&gt; on a file-by-file basis, but quickly realized that this could cause too many problems with creating new files in the Orgzly Revived app. Eventually, I realized that the solution would be to make a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.dir-locals.el&lt;/code&gt; file in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/org/orgzly/&lt;/code&gt;. Open that file in Emacs, and stick the following in it.&lt;/p&gt;

&lt;div class=&quot;language-lisp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;eval&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;auto-revert-mode&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;That ensures that any file in that directory will have &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;auto-revert-mode&lt;/code&gt; enabled.&lt;/p&gt;

&lt;p&gt;Once you have done this, you can add task files or inbox files in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/org/orgzly&lt;/code&gt; to your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;org-agenda-files&lt;/code&gt; variable, and they will show up in your agenda views as usual.&lt;/p&gt;

&lt;p&gt;Hopefully these instructions work for you. Please let me know if you can see any improvements or problems with the way I have implemented this. Happy task tracking!&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Examining To-Do Lists in Org-mode</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2024/10/todo-lists-in-org-mode" rel="alternate" type="text/html" title="Examining To-Do Lists in Org-mode" />
        <updated>2024-10-22T00:00:00+00:00</updated>
        <id>https://arnesonium.com/2024/10/todo-lists</id>
          <category term="emacs" />
        
          <category term="org-mode" />
        
          <category term="tools" />
        <content type="html" xml:base="https://arnesonium.com/2024/10/todo-lists-in-org-mode">&lt;p&gt;When you are self-employed, you need to be very well organized. There is never anybody looking over your shoulder, reminding you of everything on your to-do list. You don’t have a project manager reminding you of every step in your big projects. I use &lt;a href=&quot;https://orgmode.org/&quot;&gt;Org-mode&lt;/a&gt; in Emacs to manage all of my tasks, to-do lists, and projects.
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;Many people have already &lt;a href=&quot;https://www.badykov.com/emacs/be-productive-with-org-mode/&quot;&gt;written about&lt;/a&gt; &lt;a href=&quot;https://medium.com/emacs/how-i-tackle-projects-with-org-mode-ee5d6b08f41&quot;&gt;why Org-mode&lt;/a&gt; &lt;a href=&quot;https://dl.acm.org/doi/fullHtml/10.5555/1344170.1344179&quot;&gt;is a good choice&lt;/a&gt; &lt;a href=&quot;https://karl-voit.at/orgmode/&quot;&gt;for this&lt;/a&gt;, so I am not going to. I will just mention that many years ago, perhaps around 2007, I read &lt;a href=&quot;https://amzn.to/3YgIo6j&quot;&gt;&lt;em&gt;Getting Things Done&lt;/em&gt; by David Allen&lt;/a&gt; and got inspired to implement something like it in Org-mode. The system has slowly evolved over the years, but it has also become unweildy.&lt;/p&gt;

&lt;p&gt;For the past few years, I had been tagging my tasks with the states &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TODO&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NEXT&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DONE&lt;/code&gt;, primarily. I had some extra states sitting around for things that got canceled or delegated, and at some point I added a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WAITING&lt;/code&gt; tag for when I needed somebody else to finish something, first. But the problem was, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TODO&lt;/code&gt; items really piled up. They became uncomfortable to sort through.&lt;/p&gt;

&lt;p&gt;Inspired by a &lt;a href=&quot;https://sachachua.com/blog/2024/10/shuffling-my-org-mode-unscheduled-tasks/&quot;&gt;blog post by Sacha Chua&lt;/a&gt; earlier this week, I cleaned up my to-do states. I added &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STARTED&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SOMEDAY&lt;/code&gt;, then went through the big list of outstanding items and re-evaluated their proper states. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SOMEDAY&lt;/code&gt; won in 80% of cases, which really cleaned up the list. Now I can begin my day with a custom agenda command that looks for just &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NEXT&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STARTED&lt;/code&gt; tasks, so I know what is most important. And I can end my day looking at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TODO&lt;/code&gt; tasks to see if any should be switched to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NEXT&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Here is what my configuration looks like now. First, I configure &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;org-todo-keywords&lt;/code&gt; to handle the various states that my to-do items need. I am hoping that someday I’ll pare this down, but for now, this works.&lt;/p&gt;

&lt;div class=&quot;language-emacs-lisp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;setq&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;org-todo-keywords&lt;/span&gt; 
      &lt;span class=&quot;o&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;sequence&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;TODO(t)&quot;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;NEXT(n)&quot;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;STARTED(s!)&quot;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;WAITING(w@/!)&quot;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;|&quot;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;DONE(d!)&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;sequence&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;SOMEDAY(o)&quot;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;|&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;sequence&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;|&quot;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;DELEGATED(g@/!)&quot;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;CANCELLED(c!)&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I then added a “daily driver” command to my agenda to let me see the most important tasks today. This would probably be a good place for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;add-to-list&lt;/code&gt; instead of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;setq&lt;/code&gt;, but it’s just an example!&lt;/p&gt;

&lt;div class=&quot;language-emacs-lisp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;setq&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;org-agenda-custom-commands&lt;/span&gt;
      &lt;span class=&quot;o&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;n&quot;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Next tasks&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;todo&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;STARTED&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                           &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;todo&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;NEXT&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Next, after Sacha suggested it in a post on Mastodon, I configured to-do items to automatically switch to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STARTED&lt;/code&gt; state when I clock-in to them.&lt;/p&gt;

&lt;div class=&quot;language-emacs-lisp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;setq&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;org-clock-in-switch-to-state&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;STARTED&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Finally, I have been playing around with configuring &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;org-stuck-projects&lt;/code&gt; to be more useful. I tag all of my projects with a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@project&lt;/code&gt; tag, and then have my to-do entries underneath them as keywords. I do not think that this works as intended yet. I don’t think I will be able to figure out the proper settings here until I have another stuck project; let’s hope that never happens, and I never need this report.&lt;/p&gt;

&lt;div class=&quot;language-emacs-lisp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;setq&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;org-stuck-projects&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;+@project/-DONE-SOMEDAY&quot;&lt;/span&gt;
                          &lt;span class=&quot;c1&quot;&gt;;; Keywords to identify non-stuck projects&lt;/span&gt;
                          &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;TODO&quot;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;NEXT&quot;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;STARTED&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                          &lt;span class=&quot;c1&quot;&gt;;; Keywords to identify stuck projects.&lt;/span&gt;
                          &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;WAITING&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                          &lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The only lesson that I can really hope to share with you, dear reader, is that it is a good idea to examine your task management system regularly to fine-tune it to your needs. What I have noticed is that I can come up with great task management plans, but the implementation rarely survives contact with the real world.&lt;/p&gt;

&lt;p&gt;If, upon reading this, you have questions or suggestions, especially for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;org-stuck-projects&lt;/code&gt;, I would love to hear about it in the comments, or &lt;a href=&quot;https://fosstodon.org/@pymander&quot;&gt;on Mastodon&lt;/a&gt;. Thank you for reading!&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Many Posts of Interest for January 2024</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2024/01/18-many-posts-of-interest.html" rel="alternate" type="text/html" title="Many Posts of Interest for January 2024" />
        <updated>2024-01-18T00:00:00+00:00</updated>
        <id>https://arnesonium.com/2024/01/export</id>
          <category term="emacs" />
        
          <category term="programming" />
        
          <category term="security" />
        
          <category term="portland" />
        
          <category term="history" />
        <content type="html" xml:base="https://arnesonium.com/2024/01/18-many-posts-of-interest.html">&lt;p&gt;Once again, I have collected far too many links over far too long a period of time. Anyhow, here is a collection of blog posts and links from around the web that I found to be good reading over the past couple of months. Is it too late in January to say Happy New Year?
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;2024 has been a pretty weird year for me so far. I spent the first couple weeks of the year in isolation, and then Portland got hit with a Snowpocalypse (I love how that’s a regular thing now), followed by freezing rain. This is the third day in a row that the sidewalk outside my front door is basically an ice skating rink. That means it’s a great time to do some reading!&lt;/p&gt;

&lt;h2 id=&quot;security&quot;&gt;Security&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://signal.org/blog/signal-is-expensive/&quot;&gt;Privacy is Priceless, but Signal is Expensive&lt;/a&gt; &lt;strong&gt;[Security]&lt;/strong&gt;
I really appreciate this incredible breakdown of Signal’s costs and how they use donations. Signal
is cool. You should be using it. For real.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.schneier.com/blog/archives/2023/11/breaking-laptop-fingerprint-sensors.html&quot;&gt;Breaking Laptop Fingerprint Sensors&lt;/a&gt; (Bruce Schneier) &lt;strong&gt;[Security]&lt;/strong&gt;
Do people actually use their laptop fingerprint sensors? I hate mine. I just disable the dang
things and use a password.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.schneier.com/blog/archives/2023/12/surveillance-by-the-us-postal-service.html&quot;&gt;Surveillance by the US Postal Service&lt;/a&gt; (Bruce Schneier) &lt;strong&gt;[Security]&lt;/strong&gt;
To Catch a Thief, starring Cliff from Cheers.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://siliconflorist.com/2023/12/06/senator-ron-wyden-of-oregon-opens-discussion-of-push-notification-surveillance-by-apple-and-google/&quot;&gt;Senator Ron Wyden of Oregon opens discussion of push notification surveillance by Apple and Google&lt;/a&gt; (Rick Turoczy) &lt;strong&gt;[Security]&lt;/strong&gt;
There is some interesting legal stuff going on around the ability of tech companies like Apple and Google to use push
notifications to capture user data that could be used for nefarious purposes. Definitely a story to
keep your eye on!&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://irreal.org/blog/?p=11863&quot;&gt;Holding NSA’s Feet To The Fire&lt;/a&gt; (jcs) &lt;strong&gt;[Security]&lt;/strong&gt;
Here is a second post about Senator Ron Wyden. He appears to be fighting the good fight! Go Senator Wyden!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;emacs&quot;&gt;Emacs&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://tech.toryanderson.com/2023/11/29/transient-for-convenience-with-emms/&quot;&gt;Transient for convenience with emms&lt;/a&gt; &lt;strong&gt;[Emacs]&lt;/strong&gt;
Tory Anderson shares a really convenient EMMS control panel that uses the new version of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;transient&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://arrayfire.com/blog/talk-to-emacs-with-a-gpt4-co-worker/&quot;&gt;Talk to Emacs with a GPT4 Co-Worker&lt;/a&gt; &lt;strong&gt;[Emacs]&lt;/strong&gt; Gallagher Pryor shares a method he has for speaking to Emacs using ChatGPT-4. This is from back in November, so perhaps he has a package now!&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://takeonrules.com/2023/12/03/mentoring-vs-coders-as-an-emacsian/&quot;&gt;Jeremy Friesen: Mentoring VS-Coders as an Emacsian&lt;/a&gt; (Jeremy Friesen) &lt;strong&gt;[Emacs]&lt;/strong&gt;
I really enjoyed this talk about moving people away from VS Code and toward Emacs. The big takeaway
for this talk seemed to be that demonstrating what Emacs could do was going to be more effective
than just arguing. Let Emacs win just by letting it do what it does.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://takeonrules.com/2023/12/09/test-driving-a-campaign-status-document/&quot;&gt;Jeremy Friesen: Test Driving a Campaign Status Document&lt;/a&gt; (Jeremy Friesen) &lt;strong&gt;[Emacs]&lt;/strong&gt;
This post has some superb ideas for running a TTRPG campaign from Emacs. I’ve been doing this
for a while, but my documents get really messy. I need something a bit more structured.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://sachachua.com/blog/2023/12/emacsconf-backstage-using-spookfox-to-publish-youtube-and-toobnix-video-drafts/&quot;&gt;EmacsConf backstage: Using Spookfox to publish YouTube and Toobnix video drafts&lt;/a&gt; (Sacha Chua) &lt;strong&gt;[Emacs]&lt;/strong&gt;
I love how crazy this is: using &lt;a href=&quot;https://bitspook.in/projects/spookfox/&quot;&gt;spookyfox&lt;/a&gt; to work with YouTube’s crappy interface to do things to
videos. Go Sacha!&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://yummymelon.com/devnull/improving-emacs-isearch-usability-with-transient.html&quot;&gt;Charles Choi: Improving Emacs isearch Usability with Transient&lt;/a&gt; (Charles Choi) &lt;strong&gt;[Emacs]&lt;/strong&gt;
This is pretty cool. I recently learned about how rich the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;isearch&lt;/code&gt; feature set is, but I haven’t
played around with it a ton yet. Another thing to add to my Emacs to-do list!&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.miskatonic.org/2024/01/08/org-citations-basic/&quot;&gt;William Denton: Basic citations in Org (Part 1)&lt;/a&gt; (William Denton) &lt;strong&gt;[Emacs]&lt;/strong&gt;
This is an excellent introduction to how citations work in org-mode. There are four parts in the series so far, so keep reading!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;programming&quot;&gt;Programming&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://irreal.org/blog/?p=11796&quot;&gt;Pike’s Rules Of Programming&lt;/a&gt; (jcs) &lt;strong&gt;[Programming]&lt;/strong&gt;
These are some good rules, even if they can make some parts of programming a little less exciting.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.brycewray.com/posts/2023/11/variations-styling-variables-ssgs/?utm_campaign=RSS&amp;amp;utm_source=RSS&amp;amp;utm_medium=RSS&quot;&gt;Variations on styling variables in SSGs&lt;/a&gt; (Bryce Wray) &lt;strong&gt;[Programming]&lt;/strong&gt;
I am still using Sass a lot more than the vanilla CSS stuff that should be replacing it. Also, I am
starting to see that this is a change I’ll need to take in my future WebDev adventures.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.brycewray.com/posts/2023/11/firefox-brink/?utm_campaign=RSS&amp;amp;utm_source=RSS&amp;amp;utm_medium=RSS&quot;&gt;Firefox on the brink?&lt;/a&gt; (Bryce Wray) &lt;strong&gt;[Programming]&lt;/strong&gt;
Bryce Wray is warning (or predicting?) that Firefox may be in a very dangerous spot in its loss of
user share. This is really disappointing, given how evil Chrome continues to be. And it’s only going to
get more evil. Convince your friends to run Firefox!&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://zck.org/numberdle&quot;&gt;Zachary Kanfer: Numberdle!&lt;/a&gt; (Zachary Kanfer) &lt;strong&gt;[Programming]&lt;/strong&gt;
This is a really fun browser game for people who enjoy numbers more than words. Move over, Wordle!!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;history&quot;&gt;History&lt;/h2&gt;

&lt;p&gt;Finally, here’s something fun to share with the kids.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.smithsonianmag.com/history/history-teddy-bear-once-seen-dangerous-influence-young-children-180983234/&quot;&gt;The Teddy Bear Was Once Seen as a Dangerous Influence on Young Children&lt;/a&gt;
Before gifting stuffed animals to the wee ones in your life, consider that &lt;em&gt;bears are dangerous!&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
      </entry>
    
      <entry>
        
        <title>EmacsConf 2023 Retrospective</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2023/12/emacsconf-retrospective" rel="alternate" type="text/html" title="EmacsConf 2023 Retrospective" />
        <updated>2023-12-04T00:00:00+00:00</updated>
        <id>https://arnesonium.com/2023/12/emacsconf</id>
          <category term="emacs" />
        
          <category term="programming" />
        
          <category term="conference" />
        
          <category term="writing" />
        <content type="html" xml:base="https://arnesonium.com/2023/12/emacsconf-retrospective">&lt;p&gt;This past weekend was &lt;a href=&quot;https://emacsconf.org/2023/&quot;&gt;EmacsConf 2023&lt;/a&gt;. It was held entirely online, which was great because I could attend in my pyjamas! Since it happened on Eastern Standard Time and I live on the Pacific coast, I found the pyjama-enablement to be quite conducive to an excellent conference experience. Here are some things I learned by waking up at 5:30 in the morning this weekend!
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;Before getting into the good stuff, I should add that I did not spend a lot of time taking notes during the conference. Instead, I usually jumped straight into my Emacs configuration and started tinkering and fooling around. This means that I’ve probably left out some great stuff.&lt;/p&gt;

&lt;h2 id=&quot;emacs-advocacy&quot;&gt;Emacs Advocacy&lt;/h2&gt;

&lt;p&gt;There were a couple of talks about Emacs advocacy, but the one that I paid the most attention to was &lt;a href=&quot;https://emacsconf.org/2023/talks/mentor/&quot;&gt;Mentoring VS-Coders as an Emacsian&lt;/a&gt; by &lt;a href=&quot;https://takeonrules.com&quot;&gt;Jeremy Friesen&lt;/a&gt;. I think the big takeaway was that he got more mileage out of showing the power of Emacs than he did by trying to argue with users of other editors. Emacs users tend to already understand the power and flexibility of the tool they are using; just show it off, let it do the work.&lt;/p&gt;

&lt;p&gt;However, another topic that was brought up in a number of talks was that having all of your projects available in the same tool seems to enable a better, richer type of thinking. Being able to both write effectively and program efficiently in Emacs helps generate more complete thoughts. It also seems to spur creativity and help people conceptualize projects better. This may be a big part of advocacy, as very few other programming editors are also good at writing and note-taking, which leads me to …&lt;/p&gt;

&lt;h2 id=&quot;writing&quot;&gt;Writing&lt;/h2&gt;

&lt;p&gt;I do &lt;a href=&quot;/tags/writing&quot;&gt;a lot of writing in Emacs&lt;/a&gt;, and I’m not the only one. &lt;a href=&quot;https://emacs.ch/@jameshowell&quot;&gt;James Howell&lt;/a&gt; gave a talk about &lt;a href=&quot;https://emacsconf.org/2023/talks/uni/&quot;&gt;authoring and presenting university courses with Emacs&lt;/a&gt;. I have also written and presented lectures and classes using just Emacs. It has the power to create slides, lecture notes, and even handouts from the same source. There were a few more great talks about writing, including another one by Jeremy Friesen (he seems to do a lot of cool stuff).&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.howardism.org/&quot;&gt;Howard Abrams&lt;/a&gt; talked about &lt;a href=&quot;https://emacsconf.org/2023/talks/solo/&quot;&gt;playing table-top role playing games (TTRPGs) in Emacs&lt;/a&gt;. He focused on how the pandemic had encouraged him to look into solo TTRPGs, which led him to &lt;a href=&quot;https://www.ironswornrpg.com/&quot;&gt;Ironsworn&lt;/a&gt;. Howard then created a full Ironsworn system in Emacs that allows him to play the game on its own. I am including this under the “Writing” section because solo TTRPG play is a lot like writing fiction, it’s just that you use rules and randomness to help you figure out where the story goes. One of the best things about this talk is that the pre-recorded video was produced by &lt;a href=&quot;https://youtu.be/6s1xF-Mya98?si=jbmzgUX9Mx5byV-n&quot;&gt;his son&lt;/a&gt;. It looks great!&lt;/p&gt;

&lt;h2 id=&quot;hyper-things-hyperbole-and-hyperdrive&quot;&gt;Hyper Things (Hyperbole and Hyperdrive)&lt;/h2&gt;

&lt;p&gt;I watched a talk about &lt;a href=&quot;https://www.gnu.org/software/hyperbole/&quot;&gt;Hyperbole&lt;/a&gt; again this year. This is an Emacs package that I would really love to figure out how to use, but it just doesn’t integrate cleanly into my configuration nor my workflow. I tried it last year and got kind of annoyed at it. I gave it another try during &lt;a href=&quot;https://emacsconf.org/2023/talks/hyperamp/&quot;&gt;Rob Weiner’s talk&lt;/a&gt;, but this time I couldn’t even get Hyperbole to properly set itself up. Anyhow, I gave up on it again. Until next year, Hyperbole!&lt;/p&gt;

&lt;p&gt;Now &lt;a href=&quot;https://ushin.org/hyperdrive/hyperdrive-manual.html&quot;&gt;Hyperdrive&lt;/a&gt;, on the other hand, was something new and interesting. Joseph Turner and Protesilaos Stavrou gave a talk on &lt;a href=&quot;https://emacsconf.org/2023/talks/hyperdrive/&quot;&gt;hyperdrive.el: Peer-to-peer filesystem in Emacs&lt;/a&gt;. Set up was extremely simple; &lt;em&gt;it just worked.&lt;/em&gt; I was quickly able to share hyperdrive files and links with others. It remains to be seen what my use-case for Hyperdrive will be, but I look forward to watching this project develop.&lt;/p&gt;

&lt;h2 id=&quot;emms&quot;&gt;EMMS&lt;/h2&gt;

&lt;p&gt;Yoni Rabkin gave &lt;a href=&quot;https://emacsconf.org/2023/talks/emms/&quot;&gt;a talk on the Emacs Multi-Media System (EMMS)&lt;/a&gt;. I like EMMS, but I don’t use it as regularly as I should. However, Rabkin’s talk encouraged me to give it another chance. I am currently listening to Information Society in EMMS while I write this blog post. I suspect that like most people, I don’t really dig into my old MP3 collection as much as I should. This is a good excuse! Rabkin was also happy to remind the audience that EMMS can handle streaming online music sources and playing pretty much every kind of media. It’s worth exploring EMMS again!&lt;/p&gt;

&lt;h2 id=&quot;overall-impression&quot;&gt;Overall Impression&lt;/h2&gt;

&lt;p&gt;I loved EmacsConf this year. I also loved it last year. The organizers and moderators did such a great job running this conference, and it seemed to have a lot of attendees. I followed along on IRC and on Mastodon, and there was a ton of great talk happening. In addition, the Q&amp;amp;A sessions that I saw were filled with enriching conversation. I’m really looking forward to next year. Maybe I’ll find something on which to present!&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Posts of Interest for November 2023</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2023/11/16-posts-of-interest.html" rel="alternate" type="text/html" title="Posts of Interest for November 2023" />
        <updated>2023-11-16T00:00:00+00:00</updated>
        <id>https://arnesonium.com/2023/11/export</id>
          <category term="emacs" />
        
          <category term="games" />
        
          <category term="programming" />
        
          <category term="security" />
        <content type="html" xml:base="https://arnesonium.com/2023/11/16-posts-of-interest.html">&lt;p&gt;I was planning to make posts like this more regularly, but I entered into a period where I was thinking, huh, I am not collecting very many links. But I was wrong, I was collecting links. I collected too many. And now look at everything you have to read! I am sure these links will keep you occupied for a while.
&lt;!--more--&gt;&lt;/p&gt;

&lt;h2 id=&quot;security&quot;&gt;Security&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://krebsonsecurity.com/2023/10/tech-ceo-sentenced-to-5-years-in-ip-address-scheme/&quot;&gt;Tech CEO Sentenced to 5 Years in IP Address Scheme&lt;/a&gt; (BrianKrebs) &lt;strong&gt;[Security]&lt;/strong&gt;
This is an interesting story: five years in prison for stealing IP addresses! I guess you shouldn’t
do that.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://securityintelligence.com/articles/defense-in-depth-layering-your-security-coverage/&quot;&gt;Defense in depth: Layering your security coverage&lt;/a&gt; (Sue Poremba) &lt;strong&gt;[Security]&lt;/strong&gt;
Security isn’t just at the edge. Layers are very important, as this article reminds us.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://irreal.org/blog/?p=11754&quot;&gt;How The Thompson Hack Worked&lt;/a&gt; (jcs) &lt;strong&gt;[Security]&lt;/strong&gt;
Aaaah! This is an amazing look at Ken Thompson’s 1983 Turing Award lecture. How can we trust
software? Do we trust software? You’ll enjoy this one and it will tickle your inner computer nerd.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://securityintelligence.com/articles/pentesting-vs-pentesting-as-a-service/&quot;&gt;Pentesting vs. Pentesting as a Service: Which is better?&lt;/a&gt; (Josh Nadeau) &lt;strong&gt;[Security]&lt;/strong&gt;
What is pentesting and how does it work? Well, now you can know.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;emacs&quot;&gt;Emacs&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://emacs.ch/@crmsnbleyd/111260721575616368&quot;&gt;Whatever happened to Guile-based Emacs?&lt;/a&gt; &lt;strong&gt;[Emacs, Mastodon]&lt;/strong&gt;
This thread on Mastodon has some insights into what ever happened to a Guile-based Emacs.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://andreyor.st/posts/2023-10-27-you-dont-need-a-terminal-emulator/&quot;&gt;Andrey Listopadov: You don’t need a terminal emulator&lt;/a&gt; (Andrey Listopadov) &lt;strong&gt;[Emacs]&lt;/strong&gt;
Andrey Listopadov explains how he stopped using a terminal emulator because he’s all about that
Emacs. Nice!&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://irreal.org/blog/?p=11742&quot;&gt;Emacs Line Wrapping&lt;/a&gt; (jcs) &lt;strong&gt;[Emacs]&lt;/strong&gt;
For several years, I have been dealing with a line-wrapping annoyance in Emacs that I just couldn’t
figure out. It turns out it was &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;filladapt&lt;/code&gt;, a package that apparently isn’t used often anymore, but
I hadn’t noticed. I disabled the package and everything just works the way I want it to. &lt;em&gt;Arrrgh!&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://irreal.org/blog/?p=11751&quot;&gt;Does Working From Home Damage Productivity?&lt;/a&gt; (jcs) &lt;strong&gt;[Emacs]&lt;/strong&gt;
I have mostly worked from wherever-I-want for the last 14 years, and I’d have it no other way.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;games&quot;&gt;Games&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://kmalexander.com/2023/07/13/kensett-a-free-19th-century-urban-cartography-brush-set-for-fantasy-maps/&quot;&gt;Kensett: A Free 19th Century Urban Cartography Brush Set for Fantasy Maps&lt;/a&gt; (K. M. Alexander)
K.M. Alexander shares a lot of cool brush sets for creating maps for fantasy games. I have been
trying to figure out how to use them, and this one really caught my eye. Check out all of their
brush sets!&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://kmalexander.com/2023/11/02/lovats-genesis-city-of-darkness/&quot;&gt;Lovat’s Genesis: City of Darkness&lt;/a&gt; (K. M. Alexander)
I am once again running a D&amp;amp;D game, with a homebrewed campaign, so I think it will be fun to include
a few RPG-related posts every once in a while. Seeing how others get their inspiration is really
helpful when I need to find some of my own.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;history&quot;&gt;History&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://publicdomainreview.org/essay/silent-treatment&quot;&gt;The Silent Treatment: Solitary Confinement’s Unlikely Origins&lt;/a&gt; &lt;strong&gt;[Pub 20231101]&lt;/strong&gt;
A very curious history of solitary confinement and its origins, presented by the Public Domain
Review. This is worth a read.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.smithsonianmag.com/history/what-emojis-tell-us-about-the-history-of-tea-180983128/&quot;&gt;What Emoji Tell Us About the History of Tea&lt;/a&gt;
I love the strange history of tea, and the Smithsonian has managed to tie this history to tea emoji.
So that’s cool.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://publicdomainreview.org/collection/unionization-of-central-europe&quot;&gt;Divide and Concur: A Radical Plan for Peace in Europe (1920)&lt;/a&gt; &lt;strong&gt;[History]&lt;/strong&gt;
This is an amazing and bizarre plan for bringing peace to Europe in the 1920s. It is worth looking
at and puzzling over.&lt;/li&gt;
&lt;/ul&gt;</content>
      </entry>
    
      <entry>
        
        <title>Posts of Interest for 13 October 2023</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2023/10/13-posts-of-interest" rel="alternate" type="text/html" title="Posts of Interest for 13 October 2023" />
        <updated>2023-10-13T00:00:00+00:00</updated>
        <id>https://arnesonium.com/2023/10/of-interest</id>
          <category term="emacs" />
        
          <category term="programming" />
        
          <category term="emacs-lisp" />
        
          <category term="security" />
        <content type="html" xml:base="https://arnesonium.com/2023/10/13-posts-of-interest">&lt;p&gt;This is the second of my “posts of interest” posts. This week, I have also included some interesting Mastodon posts, because the Emacs community on Mastodon is thriving like crazy. It is really a blast to see so much interest in Emacs and so much activity.
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;If Mastodon interests you, &lt;a href=&quot;https://fosstodon.org/@pymander&quot;&gt;find me there&lt;/a&gt;!&lt;/p&gt;

&lt;h2 id=&quot;programming-1&quot;&gt;Programming (1)&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://spritely.institute/news/scheme-wireworld-in-browser.html&quot;&gt;Scheme in the browser: A Hoot of a tale&lt;/a&gt; – Spritely Institute
Yes, SCHEME IN THE BROWSER. This is pretty cool, go check it out.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;emacs-6&quot;&gt;Emacs (6)&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://coredumped.dev/2023/08/09/text-showdown-gap-buffers-vs-ropes/&quot;&gt;Text showdown: Gap Buffers vs Ropes&lt;/a&gt; &lt;strong&gt;[Programming, Rust]&lt;/strong&gt;
Troy Hinckley has been working on building the core of Emacs in Rust. This sounds like a very
difficult project, and it is informative and interesting to follow along. The latest entry in his
saga involves various ways of storing and working with text buffers, along with many benchmarks.
This is an interesting read!&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://amodernist.com/eaez/./sep23.html&quot;&gt;ELPA and Emacs Zine (September 2023)&lt;/a&gt;
The new ELPA and Emacs Zine has released its latest issue, with some pretty interesting stuff about
the current state of tree-sitter and how development is progressing.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://functional.cafe/@PaniczGodek/111187231582720915&quot;&gt;Emacs Macros&lt;/a&gt; &lt;strong&gt;[Mastodon]&lt;/strong&gt;
Emacs macros remain kind of a mystery to me, but they were presented in an interesting way recently:
these are ways to provide a high level of automation in Emacs without learning how to program Emacs
Lisp. Well, they are worth checking out, then!&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://fosstodon.org/@chmouel/111203691941968313&quot;&gt;Taking advantage of tree-sitter&lt;/a&gt; &lt;strong&gt;[Mastodon]&lt;/strong&gt;
This is a really cool Emacs function that takes advantage of tree-sitter to copy the current
function. I think it might need something to detect if tree-sitter is active, and error out if not.
    &lt;div class=&quot;language-emacs-lisp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;defun&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;my-copy-function-name-with-ts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;interactive&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;funcname&lt;/span&gt;
         &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;substring-no-properties&lt;/span&gt;
          &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;treesit-node-text&lt;/span&gt;
           &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;treesit-node-child-by-field-name&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;treesit-defun-at-point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))))&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;kill-new&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;funcname&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Copied name: %s&quot;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;funcname&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://octodon.social/@fabionatali/111210018767997686&quot;&gt;XMPP in Emacs&lt;/a&gt; &lt;strong&gt;[Mastodon]&lt;/strong&gt;
Fabio Natali on Mastodon reports that his XMPP usage would be more consistent if Emacs supported it
better. In particular, he misses E2E encryption support. I’ve also had a lot of difficulty with
moving to XMPP.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://alexschroeder.ch/view/2023-10-11-post-from-emacs&quot;&gt;Alex Schroeder: Posting to Oddµ from Emacs&lt;/a&gt; (Alex Schroeder)
Alex Schroeder provides a simple, straightforward way to use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;url&lt;/code&gt; package in Emacs to post
stuff to another service. In this example, he uses Oddμ.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;security-4&quot;&gt;Security (4)&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://securityintelligence.com/posts/c-suite-weighs-generative-ai-security/&quot;&gt;C-suite weighs in on generative AI and security&lt;/a&gt; (Chris McCurdy)
More on the adoption of generative AI and security risks. 96% of business leaders say adopting generative AI makes a security breach likely in their organization within the next three
years! That’s certainly something to think about.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://securityintelligence.com/articles/cost-of-a-data-breach-10-years-in-review/&quot;&gt;10 years in review: Cost of a Data Breach&lt;/a&gt; (Jonathan Reed)
Data breaches are dang expensive! We all know that. This piece explores some of the most important
factors in preventing and mitigating data breaches. There have been some changes in recent years,
some of which are caused by the rise of importance in AI. That means you should probably read the article.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://newsletter.mollywhite.net/p/the-fraud-was-in-the-code&quot;&gt;The fraud was in the code&lt;/a&gt; (Molly White)
In the SBF court case, they actually used a code review to show fraud.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.schneier.com/blog/archives/2023/10/bounty-to-recover-nists-elliptic-curve-seeds.html&quot;&gt;Bounty to Recover NIST’s Elliptic Curve Seeds&lt;/a&gt; (Bruce Schneier)
Here is a delightful story about the history of NIST elliptic curve cryptography and how things came
to be. Also, a cryptographic puzzle about where they may be going!&lt;/li&gt;
&lt;/ul&gt;</content>
      </entry>
    
      <entry>
        
        <title>Posts of Interest for 6 October 2023</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2023/10/6-posts-of-interest" rel="alternate" type="text/html" title="Posts of Interest for 6 October 2023" />
        <updated>2023-10-06T00:00:00+00:00</updated>
        <id>https://arnesonium.com/2023/10/export</id>
          <category term="emacs" />
        
          <category term="programming" />
        
          <category term="portland" />
        
          <category term="security" />
        
          <category term="pdx" />
        <content type="html" xml:base="https://arnesonium.com/2023/10/6-posts-of-interest">&lt;p&gt;This is my first attempt at using &lt;a href=&quot;https://github.com/rnadler/elfeed-curate&quot;&gt;elfeed-curate&lt;/a&gt; to collect interesting blog posts and share them. I have also attempted to subscribe to the RSS feed for the #Emacs hashtag on Mastodon, but that doesn’t seem to be working correctly yet. I’ve seen other blogs do similar things, but is this useful for my blog? I don’t know! Let me know what you think.&lt;/p&gt;

&lt;!--more--&gt;

&lt;h2 id=&quot;computers-4&quot;&gt;Computers (4)&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.brycewray.com/posts/2023/10/cloudflare-fonts/?utm_campaign=RSS&amp;amp;utm_source=RSS&amp;amp;utm_medium=RSS&quot;&gt;The intriguing announcement of Cloudflare Fonts&lt;/a&gt; (Bryce Wray) &lt;strong&gt;[Programming]&lt;/strong&gt;
Oooh, this is cool. Bryce Wray talks about the introduction of Cloudflare Fonts!&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://securityintelligence.com/articles/what-to-know-about-new-generative-ai-tools-for-criminals/&quot;&gt;What to know about new generative AI tools for criminals&lt;/a&gt; (Mike Elgan) &lt;strong&gt;[Security]&lt;/strong&gt;
Generative AI is still a minor concern for security professionals, but the threat is rising! This is
an interesting look at the state of the art and current means for addressing the threat.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://alexschroeder.ch/view/2022-03-20_Torchbearers_and_bodyguards&quot;&gt;Alex Schroeder: 2022-03-20 Torchbearers and bodyguards&lt;/a&gt; (Alex Schroeder) &lt;strong&gt;[Emacs]&lt;/strong&gt;
Alex Schroeder continues his exploration of running tabletop RPGs using Emacs. Check out the other
blog posts in the series—they are a lot of fun. I have been playing with Emacs for running TTRPGs,
as well. Someday I’ll explain my methods.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://irreal.org/blog/?p=11683&quot;&gt;Elfeed-curate&lt;/a&gt; (jcs) &lt;strong&gt;[Emacs]&lt;/strong&gt;
Elfeed-curate sounds like a really neat package. This is my first annotation using that package,
which I will soon attempt to export.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;portland-1&quot;&gt;Portland (1)&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.friendsoflonefircemetery.org/?p=943&quot;&gt;Tour of Untimely Departures – SOLD OUT!&lt;/a&gt; (lfadmin)
The Tour of Untimely Departures is an annual event at Lone Fir Cemetery in Portland. But guess what?
It’s already sold out! It sold out a while back, but I didn’t notice because my RSS feed for the
Friends of Lone Fir was broken.&lt;/li&gt;
&lt;/ul&gt;</content>
      </entry>
    
      <entry>
        
        <title>Configuring Emacs 29.1 for Go Development</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2023/08/configuring-emacs-29-1-for-golang" rel="alternate" type="text/html" title="Configuring Emacs 29.1 for Go Development" />
        <updated>2023-08-01T00:00:00+00:00</updated>
        <id>https://arnesonium.com/2023/08/golang-emacs</id>
          <category term="emacs" />
        
          <category term="programming" />
        
          <category term="golang" />
        
          <category term="lisp" />
        
          <category term="emacs-lisp" />
        <content type="html" xml:base="https://arnesonium.com/2023/08/configuring-emacs-29-1-for-golang">&lt;p&gt;Now that I have &lt;a href=&quot;https://arnesonium.com/2023/07/emacs-29-1-on-ubuntu-22-04-lts&quot;&gt;installed Emacs 29.1&lt;/a&gt;, I needed to get it set up for Go development for a project. I was interested in taking advantage of both the new Tree-Sitter integration, and the new Eglot language server client. However, they were mildly tricky to set up! Here is what I did.
&lt;!--more--&gt;&lt;/p&gt;

&lt;h2 id=&quot;configuring-tree-sitter-for-go&quot;&gt;Configuring Tree-Sitter for Go&lt;/h2&gt;

&lt;p&gt;If you follow the excellent &lt;a href=&quot;https://www.masteringemacs.org/article/how-to-get-started-tree-sitter&quot;&gt;How to Get Started with Tree-Sitter&lt;/a&gt; instructions from Mickey Peterson, you will have a great head-start on getting Tree-Sitter working for most of your favorite languages (and probably Java, too). However, those instructions didn’t cover everything I needed for Go. When I tried running &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;M-x go-ts-mode&lt;/code&gt;, Emacs complained about a missing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gomod&lt;/code&gt; module. Baffling!&lt;/p&gt;

&lt;p&gt;I couldn’t find any information in the Emacs documentation about where to find this missing module. I looked around on the net and found &lt;a href=&quot;https://github.com/camdencheek/tree-sitter-go-mod&quot;&gt;Camden Cheek’s tree-sitter-go-mod&lt;/a&gt;, and added that to my list of recipes. My &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;treesit-language-source-alist&lt;/code&gt; then looked like this:&lt;/p&gt;

&lt;div class=&quot;language-elisp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;setq&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;treesit-language-source-alist&lt;/span&gt;
 &lt;span class=&quot;o&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;bash&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;https://github.com/tree-sitter/tree-sitter-bash&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;cmake&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;https://github.com/uyha/tree-sitter-cmake&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;css&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;https://github.com/tree-sitter/tree-sitter-css&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;elisp&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;https://github.com/Wilfred/tree-sitter-elisp&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;go&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;https://github.com/tree-sitter/tree-sitter-go&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;gomod&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;https://github.com/camdencheek/tree-sitter-go-mod&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;dockerfile&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;https://github.com/camdencheek/tree-sitter-dockerfile&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;html&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;https://github.com/tree-sitter/tree-sitter-html&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;javascript&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;https://github.com/tree-sitter/tree-sitter-javascript&quot;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;master&quot;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;src&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;json&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;https://github.com/tree-sitter/tree-sitter-json&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;make&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;https://github.com/alemuller/tree-sitter-make&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;markdown&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;https://github.com/ikatyang/tree-sitter-markdown&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;python&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;https://github.com/tree-sitter/tree-sitter-python&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;toml&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;https://github.com/tree-sitter/tree-sitter-toml&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;tsx&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;https://github.com/tree-sitter/tree-sitter-typescript&quot;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;master&quot;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;tsx/src&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;typescript&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;https://github.com/tree-sitter/tree-sitter-typescript&quot;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;master&quot;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;typescript/src&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;yaml&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;https://github.com/ikatyang/tree-sitter-yaml&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note that the package is named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go-mod&lt;/code&gt; but &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go-ts-mode&lt;/code&gt; expects it to be named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gomod&lt;/code&gt;. I wish this were documented somewhere! In any case, I was then able to use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;M-x treesit-install-language-grammar&lt;/code&gt; for both &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gomod&lt;/code&gt;. Finally, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;M-x go-ts-mode&lt;/code&gt; worked!&lt;/p&gt;

&lt;p&gt;After going through this process, I found &lt;a href=&quot;https://robbmann.io/posts/emacs-treesit-auto/&quot;&gt;Robert Enzmann’s post about automatically using Tree-Sitter&lt;/a&gt;. He has created the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;treesit-auto&lt;/code&gt; package, now available on MELPA, that does most of this work for you. It is a much faster way of solving the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gomod&lt;/code&gt; mystery, so give it a shot!&lt;/p&gt;

&lt;h2 id=&quot;configuring-eglot-for-go&quot;&gt;Configuring Eglot for Go&lt;/h2&gt;

&lt;p&gt;I’d been using &lt;a href=&quot;https://github.com/emacs-lsp/lsp-mode&quot;&gt;lsp-mode&lt;/a&gt; for ages, but with Emacs 29.1 including &lt;a href=&quot;https://joaotavora.github.io/eglot/&quot;&gt;Eglot&lt;/a&gt;, I decided to make the switch.&lt;/p&gt;

&lt;p&gt;In my Go project, I ran &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;M-x eglot&lt;/code&gt; and was immediately met with an error:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[eglot] Server reports (type=1): Error loading workspace folders (expected 1, got 0)
failed to load view for file:///path/to/my/project: err: go command required, not found: exec: &quot;go&quot;: executable file not found in $PATH: stderr: 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I’ve got Go installed in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/usr/local/go&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/usr/local/go/bin&lt;/code&gt; is definitely in my &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;exec-path&lt;/code&gt; variable in Emacs. It looked like Eglot wasn’t propagating &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;exec-path&lt;/code&gt; down to its subprocesses. How annoying! I did a quick search through the list of Eglot-related variables and the Eglot documentation and no solution seemed immediately forthcoming.&lt;/p&gt;

&lt;p&gt;So I took the cheap way out and made a symlink. In my shell, I ran:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;sudo ln&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-sf&lt;/span&gt; /usr/local/go/bin/go /usr/local/bin/go
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It is a dumb trick, and I am sure there is a better way to solve it. Do you know of one? Please comment and let me know!&lt;/p&gt;

&lt;h2 id=&quot;what-else&quot;&gt;What Else?&lt;/h2&gt;

&lt;p&gt;My exploration has revealed that there’s a lot of work left to do in the Emacs Tree-Sitter world. There are plenty of languages major modes that don’t yet have a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ts-mode&lt;/code&gt; equivalent, and plenty of others that still need a lot of work.&lt;/p&gt;

&lt;p&gt;It’s too soon for me to say if this setup is preferrable to my previous configuration. But I am really looking forward to playing around with Eglot’s features and exploring the capabilities of Tree-Sitter.&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Installing Emacs 29.1 on Ubuntu 22.04 LTS</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2023/07/emacs-29-1-on-ubuntu-22-04-lts" rel="alternate" type="text/html" title="Installing Emacs 29.1 on Ubuntu 22.04 LTS" />
        <updated>2023-07-31T00:00:00+00:00</updated>
        <id>https://arnesonium.com/2023/07/emacs-291-ubuntu-2204LTS</id>
          <category term="emacs" />
        
          <category term="linux" />
        
          <category term="ubuntu" />
        
          <category term="howto" />
        <content type="html" xml:base="https://arnesonium.com/2023/07/emacs-29-1-on-ubuntu-22-04-lts">&lt;p&gt;You have probably heard by now, but &lt;a href=&quot;https://emacsredux.com/blog/2023/07/30/emacs-29-1-released/&quot;&gt;Emacs 29.1 has been released&lt;/a&gt;! Here are some reasons to upgrade and how to do so right away if you are running Ubuntu 22.04 LTS.
&lt;!--more--&gt;&lt;/p&gt;

&lt;h2 id=&quot;whats-new-with-emacs&quot;&gt;What’s New with Emacs?&lt;/h2&gt;

&lt;p&gt;One of the most exciting new features for me is &lt;a href=&quot;https://tree-sitter.github.io/tree-sitter/&quot;&gt;TreeSitter support&lt;/a&gt;, which provides incremental parsing capabilities for programming languages and other formatted files. This means that programming support will be getting faster, more comprehensive, and even better in future Emacs packages.&lt;/p&gt;

&lt;p&gt;Other new features include native WebP image support, pure GTK support, and the ability to use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;emacs -x&lt;/code&gt; in the first line of a script, which could lead to some fun applications of Emacs Lisp. &lt;a href=&quot;https://git.savannah.gnu.org/cgit/emacs.git/tree/etc/NEWS?h=emacs-29&quot;&gt;Read all of the release notes here!&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;installing-on-ubuntu-2204-lts&quot;&gt;Installing on Ubuntu 22.04 LTS&lt;/h2&gt;

&lt;p&gt;I am too impatient to wait for somebody to release a packaged version, so I installed Emacs 29.1 from source. It is fairly straightforward, though you will need to do a couple of special things to get all of the features you want.&lt;/p&gt;

&lt;h3 id=&quot;installing-the-requirements&quot;&gt;Installing the Requirements&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Note: All of the commands in this post assume you are using bash.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Most of the extra libraries and packages you will need to build Emacs 29.1 are covered in the build dependencies for the stock Emacs package. However, to take advantage of some of the cool extra features now included in Emacs, you’ll need to install a few more things.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt build-dep emacs
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;libgccjit0 libgccjit-10-dev libjansson4 libjansson-dev &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    gnutls-bin libtree-sitter-dev gcc-10 imagemagick libmagick++-dev &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    libwebp-dev webp libxft-dev libxft2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;preparing-to-build&quot;&gt;Preparing to Build&lt;/h3&gt;

&lt;p&gt;In order to get native compilation (a feature added in Emacs 28) working correctly, you will need to make sure your shell instructs the build system to use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gcc-10&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;CC&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/usr/bin/gcc-10
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;CXX&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/usr/bin/gcc-10
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;get-the-source-code-and-lets-compile&quot;&gt;Get the Source Code and Let’s Compile!&lt;/h3&gt;

&lt;p&gt;Download the Emacs 29.1 source code from &lt;a href=&quot;http://ftpmirror.gnu.org/emacs/&quot;&gt;a nearby GNU mirror&lt;/a&gt; and then extract it! Then follow the instructions below. Note that you might want to take a closer look at the options to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;./configure&lt;/code&gt;. If you want native compilation, but don’t want to use the “ahead of time” option because it’s slow, you can remove the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;=aot&lt;/code&gt;. You might also want to stick Emacs in a different location using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--prefix&lt;/code&gt; option. For example, I used &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--prefix=/opt/emacs29&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;emacs-29.1
./autogen.sh
./configure &lt;span class=&quot;nt&quot;&gt;--with-native-compilation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;aot &lt;span class=&quot;nt&quot;&gt;--with-imagemagick&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--with-json&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;--with-tree-sitter&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--with-xft&lt;/span&gt;
make &lt;span class=&quot;nt&quot;&gt;-j&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;nproc&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The build might take a while. With the “ahead of time” compilation, I think my build took ten or fifteen minutes. But once it is complete, try running your new Emacs binary to make sure it works.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;./src/emacs &lt;span class=&quot;nt&quot;&gt;-Q&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If it works, install it!&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;make &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;whats-next&quot;&gt;What’s Next&lt;/h2&gt;

&lt;p&gt;You’ve got Emacs 29.1 installed and running! This is exciting. Which new features do you want to try first?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.masteringemacs.org/article/how-to-get-started-tree-sitter&quot;&gt;Get started with tree-sitter!&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;M-x eglot&lt;/code&gt; and see how cool language servers can be!&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.masteringemacs.org/article/whats-new-in-emacs-29-1&quot;&gt;Read about other new features in Emacs 29.1!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope this article was helpful, and that you are enjoying the latest version of Emacs! I used it to write this blog post, so you know I am.&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Update: Org to DOCX with Citations</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2023/06/org-to-docx-with-citations" rel="alternate" type="text/html" title="Update: Org to DOCX with Citations" />
        <updated>2023-06-20T00:00:00+00:00</updated>
        <id>https://arnesonium.com/2023/06/org-docx-citations</id>
          <category term="org-mode" />
        
          <category term="pandoc" />
        
          <category term="emacs" />
        
          <category term="writing" />
        <content type="html" xml:base="https://arnesonium.com/2023/06/org-to-docx-with-citations">&lt;p&gt;Last year, I wrote about &lt;a href=&quot;/2022/10/org-mode-to-docx-pipeline&quot;&gt;converting Org to DOCX with pandoc&lt;/a&gt;. Well, that particular method has needed some improvements. I needed to also support converting Markdown files, and more vitally, I needed to support the new-ish &lt;a href=&quot;https://orgmode.org/manual/Citation-handling.html&quot;&gt;org-cite citation format&lt;/a&gt;.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;The first thing I did was update to the &lt;a href=&quot;https://pandoc.org/installing.html&quot;&gt;latest version of Pandoc&lt;/a&gt;. Next, I had to learn how &lt;a href=&quot;https://pandoc.org/MANUAL.html#citations&quot;&gt;Pandoc’s citations&lt;/a&gt; work. Note that you have to enable the &lt;a href=&quot;https://pandoc.org/MANUAL.html#org-citations&quot;&gt;citations extension&lt;/a&gt; as well.&lt;/p&gt;

&lt;p&gt;For citations to work, you need to have a &lt;a href=&quot;https://docs.citationstyles.org/en/stable/specification.html&quot;&gt;Citation Style Language&lt;/a&gt; (CSL) file. Zotero comes with a ton of them, so check your Zotero installation for examples.&lt;/p&gt;

&lt;p&gt;In the updated fish shell function below, you will want to update both &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;refdoc&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;csldoc&lt;/code&gt; to point to your reference DOCX file and your CSL file, respectively.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-fish&quot;&gt;function org2docx --description &apos;Generate a DOCX file using a custom reference document&apos;
    set -l refdoc &quot;$PATH_TO_REFERENCE_DOCX&quot;
    set -l csldoc &quot;$PATH_TO_CSL&quot;
    set -l fromfmt (string match -r &apos;(?:org|md)$&apos; $argv)
    set -l base (basename -s .$fromfmt $argv)

    echo Generating $base.docx ...

    pandoc --from &quot;$fromfmt&quot;+citations \
        --citeproc --csl $csldoc \
        --reference-doc $refdoc -o $base.docx $argv
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And there you have it! Now you can convert both Org files and Markdown files to DOCX. And I am sorry that you have to use DOCX!&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Writing and Reviewing Jupyter Notebooks</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2023/05/reviewing-jupyter-process" rel="alternate" type="text/html" title="Writing and Reviewing Jupyter Notebooks" />
        <updated>2023-05-18T00:00:00+00:00</updated>
        <id>https://arnesonium.com/2023/05/reviewing-jupyter-process</id>
          <category term="jupyter" />
        
          <category term="writing" />
        
          <category term="emacs" />
        
          <category term="pandoc" />
        <content type="html" xml:base="https://arnesonium.com/2023/05/reviewing-jupyter-process">&lt;p&gt;A recent project involves delivering a finished product as a collection of &lt;a href=&quot;https://jupyter.org/&quot;&gt;Jupyter Notebooks&lt;/a&gt;. This process involves using Emacs for writing, Git for version control, and a slightly tricky process for enabling non-Jupyter, non-Emacs users to perform document review.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Writing—just like programming—ideally includes a review process before anything is delivered to the client. Even first drafts need at least two readers before delivery. I’ve previously discussed how &lt;a href=&quot;https://arnesonium.com/2022/10/org-mode-to-docx-pipeline&quot;&gt;I use Org Mode and Pandoc to deliver DOCX files&lt;/a&gt;, and DOCX or ODF files unfortunately remain the easiest way to track changes and edits among word processor users.&lt;/p&gt;

&lt;p&gt;Since Jupyter Notebooks are basically JSON documents, the best way to keep track of changes and revisions is using some kind of version control. &lt;a href=&quot;https://towardsdatascience.com/how-to-use-git-github-with-jupyter-notebook-7144d6577b44&quot;&gt;Here is one process using Git and GitHub.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When my notebook files are ready for review, converting them to DOCX files is pretty straightforward.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;First, I use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jupyter&lt;/code&gt; command line tool to convert to Markdown, like this:&lt;/p&gt;

    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;jupyter nbconvert --to markdown *.ipynb
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Next, I use &lt;a href=&quot;https://pandoc.org/&quot;&gt;Pandoc&lt;/a&gt; to convert to DOCX using a reference link.&lt;/p&gt;

    &lt;pre&gt;&lt;code class=&quot;language-fish&quot;&gt;for file in *.md
    pandoc --reference-doc $path_to_refdoc -o $file.docx $file
end
&lt;/code&gt;&lt;/pre&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;renaming-files-with-dired&quot;&gt;Renaming files with Dired&lt;/h2&gt;

&lt;p&gt;At this point, I needed to rename all of the DOCX files and move them to the proper shared folder, so my reviewer could get to them and know what’s going on. We have a &lt;a href=&quot;https://www.computerworld.com/article/2833158/4-rules-for-naming-your-files.html&quot;&gt;naming format for filenames&lt;/a&gt; that helps us track project and versions, so all of the files needed to have at least a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;v1&lt;/code&gt; in them.&lt;/p&gt;

&lt;p&gt;Emacs has a file manager called Dired, which contains powerful features that allow you to modify directory contents just like any other buffer. I now had a bunch of files that ended in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.md.docx&lt;/code&gt; that needed to instead end in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-v1.docx&lt;/code&gt;. Here is the process I used to easily rename them.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;In Emacs, use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;M-x dired&lt;/code&gt; to open the directory.&lt;/li&gt;
  &lt;li&gt;Use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C-x C-q&lt;/code&gt; to run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dired-toggle-read-only&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;M-%&lt;/code&gt; to run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;query-replace&lt;/code&gt;, and replace &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.md.docx&lt;/code&gt; with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-v1.docx&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Finish “writing” the directory with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C-c C-c&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All done! It was nice and simple. The DOCX files were finally properly named and ready for review.&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Pattern Matching and Tail Recursion in Emacs Lisp</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2022/11/pattern-matching-tail-recursion-emacs-lisp" rel="alternate" type="text/html" title="Pattern Matching and Tail Recursion in Emacs Lisp" />
        <updated>2022-11-19T00:00:00+00:00</updated>
        <id>https://arnesonium.com/2022/11/tco-pattern-emacs-lisp</id>
          <category term="emacs" />
        
          <category term="programming" />
        
          <category term="emacs-lisp" />
        
          <category term="lisp" />
        <content type="html" xml:base="https://arnesonium.com/2022/11/pattern-matching-tail-recursion-emacs-lisp">&lt;p&gt;Functional programming offers a bunch of really cool programming patterns. Two that I really enjoy are &lt;a href=&quot;https://stackoverflow.com/questions/310974/what-is-tail-call-optimization&quot;&gt;tail recursion&lt;/a&gt; and &lt;a href=&quot;https://sodocumentation.net/ocaml/topic/2656/pattern-matching&quot;&gt;pattern matching&lt;/a&gt;, especially how they are implemented in OCaml. However, I spend a lot of time writing Emacs Lisp now, and I was wondering if I could find a way to use these patterns in that language.
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;It turns out that it is possible, thanks to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;named-let&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pcase&lt;/code&gt;. It isn’t as pretty and elegant as OCaml, but at least I get to keep excercising those parts of my programming brain. Maybe next I’ll try to figure out currying in Emacs Lisp.&lt;/p&gt;

&lt;p&gt;Note that this blog post includes some &lt;em&gt;really dumb&lt;/em&gt; examples, because that’s usually how I learn these things best.&lt;/p&gt;

&lt;h2 id=&quot;pattern-matching-with-pcase&quot;&gt;Pattern Matching with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pcase&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Most programmers will be familiar with the granddaddy of pattern matching, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;switch/case&lt;/code&gt; construct. This is present in many, many programming languages, especially those in the ALGOL family.&lt;/p&gt;

&lt;p&gt;However, pattern matching can be so much more! Instead of simple equality checks, pattern matching extends the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;switch/case&lt;/code&gt; concept to include testing for all kinds of patterns and conditionals.&lt;/p&gt;

&lt;p&gt;Lisp programmers will already be familiar with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cond&lt;/code&gt;, which can be used to sequentially test for conditionals. However, functional language programmers have probably fallen in love with a more mature and sophisticated form of pattern matching that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cond&lt;/code&gt; doesn’t totally satisfy.&lt;/p&gt;

&lt;p&gt;Fortunately, Emacs Lisp has &lt;a href=&quot;https://www.gnu.org/software/emacs/manual/html_node/elisp/Pattern_002dMatching-Conditional.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pcase&lt;/code&gt;, the pattern-matching conditional&lt;/a&gt;. Here is an example of its use to duplicate &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;car&lt;/code&gt;, which is the dumbest possible example I could think of.&lt;/p&gt;

&lt;div class=&quot;language-elisp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;defun&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;ela/car&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;lst&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;pcase&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;lst&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;head&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
     &lt;span class=&quot;nv&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;_&lt;/span&gt;
     &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can see that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pcase&lt;/code&gt; has a backquote syntax for matching various constructs, such as with the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;`(,head . ,_)&lt;/code&gt; piece. This matches a cons cell and binds the CAR to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;head&lt;/code&gt; while ignoring the CDR.&lt;/p&gt;

&lt;p&gt;The next case is just &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_&lt;/code&gt;, which is a catch-all matching operator.&lt;/p&gt;

&lt;p&gt;In the real world, you’d probably want some type checking and error correction, but I promised very simple examples. Check out the full range of &lt;a href=&quot;https://www.gnu.org/software/emacs/manual/html_node/elisp/pcase-Macro.html&quot;&gt;matching capabilities for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pcase&lt;/code&gt;&lt;/a&gt;, and then &lt;a href=&quot;https://www.gnu.org/software/emacs/manual/html_node/elisp/Backquote-Patterns.html&quot;&gt;read about all of the backquote patterns you can also use&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;tail-call-optimization-with-named-let&quot;&gt;Tail Call Optimization with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;named-let&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Tail call optimization (TCO) is the programming language feature that allows efficient tail recursion without overflowing your stack. It is increasingly common in languages today, though from what I’ve seen, it always involves caveats.&lt;/p&gt;

&lt;p&gt;In Emacs Lisp, the easiest way to use TCO that I’ve come across is the &lt;a href=&quot;https://www.gnu.org/software/emacs/manual/html_node/elisp/Local-Variables.html#index-named_002dlet&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;named-let&lt;/code&gt; macro&lt;/a&gt;. With it, you define a function that can get “unrolled” inside another function. For example, here is a simple function that calculates a factorial using tail recursion.&lt;/p&gt;

&lt;div class=&quot;language-elisp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;defun&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;ela/fact&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;in-num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;named-let&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;rec-fact&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;accu&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                       &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;num&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;in-num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;pcase&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;num&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;guard&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
       &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;rec-fact&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;accu&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;num&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;_&lt;/span&gt;
       &lt;span class=&quot;nv&quot;&gt;accu&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In this example, you will notice that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rec-fact&lt;/code&gt; is the locally named function that gets called at the end of the first &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pcase&lt;/code&gt; pattern. This is a tail call! It will get optimized.&lt;/p&gt;

&lt;p&gt;You can check this out by running something like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(ela/fact 5)&lt;/code&gt; and getting 120 as the result. Try using a ridiculously big number and see if you get a stack overflow! You shouldn’t.&lt;/p&gt;

&lt;h2 id=&quot;another-example-summing-a-list&quot;&gt;Another Example: Summing a List&lt;/h2&gt;

&lt;p&gt;This is just a nostalgic example, since it’s probably the first tail recursive pattern matching function I ever wrote when learning OCaml a zillion years ago. This function will take a list of numbers and then add them all together. There are much better ways to write this in Emacs Lisp, like with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apply&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-elisp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;defun&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;ela/sum&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;numbers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;named-let&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;sum-list&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;accu&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                       &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;lst&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;numbers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;pcase&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;lst&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;head&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;tail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
       &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;sum-list&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;accu&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;tail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;_&lt;/span&gt;
       &lt;span class=&quot;nv&quot;&gt;accu&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can then call it like this:&lt;/p&gt;

&lt;div class=&quot;language-elisp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ela/sum&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And you will end up with exactly the result you expect. I was amused to see that the documentation page for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;named-let&lt;/code&gt; has a different implementation of this function that doesn’t use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pcase&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Oh heck, let’s get fancy and rewrite &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apply&lt;/code&gt; using this approach.&lt;/p&gt;

&lt;div class=&quot;language-elisp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;defun&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;ela/apply&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;&amp;amp;rest&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;arguments&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&quot;Apply FN to each element of ARGUMENTS and return the accumulated result.&quot;&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;;; Set up accumulator to the right type.&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;let*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;arguments-flat&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;flatten-list&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;arguments&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
         &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;initial-value&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;pcase&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;car&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;arguments-flat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                          &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;pred&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;integerp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                          &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;pred&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;stringp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                          &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))))&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;named-let&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;apply-rec&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;accumulator&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;initial-value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                          &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;input-list&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;arguments-flat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;pcase&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;input-list&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;head&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;tail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
         &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;apply-rec&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;funcall&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;accumulator&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;tail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;_&lt;/span&gt;
         &lt;span class=&quot;nv&quot;&gt;accumulator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I am certain this version of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apply&lt;/code&gt; has bugs, but it works for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;+&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;concat&lt;/code&gt;, so that’s good enough for a simple example. And it uses &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pcase&lt;/code&gt; twice!&lt;/p&gt;

&lt;p&gt;Hopefully this has been a useful blog post for somebody out there. Let me know in the comments if there are other fun things you have done with TCO and pattern matching in Emacs Lisp!&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>New MELPA Package: ddate</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2022/11/new-melpa-package-ddate" rel="alternate" type="text/html" title="New MELPA Package: ddate" />
        <updated>2022-11-01T00:00:00+00:00</updated>
        <id>https://arnesonium.com/2022/11/ddate-on-melpa</id>
          <category term="emacs" />
        
          <category term="discordian" />
        
          <category term="melpa" />
        
          <category term="lisp" />
        <content type="html" xml:base="https://arnesonium.com/2022/11/new-melpa-package-ddate">&lt;p&gt;I recently wrote an Emacs Lisp package to support the &lt;a href=&quot;https://github.com/bo0ts/ddate&quot;&gt;ddate&lt;/a&gt; command, a classic
command-line utility to display dates from the &lt;a href=&quot;https://en.wikipedia.org/wiki/Discordian_calendar&quot;&gt;Discordian calendar&lt;/a&gt;.
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;The package is now &lt;a href=&quot;https://melpa.org/#/ddate&quot;&gt;available on MELPA&lt;/a&gt;! That means that if you have &lt;a href=&quot;https://ianyepan.github.io/posts/setting-up-use-package/&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;use-package&lt;/code&gt;
installed&lt;/a&gt;, you can get &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ddate&lt;/code&gt; easily like this:&lt;/p&gt;

&lt;div class=&quot;language-emacs-lisp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;use-package&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;ddate&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:ensure&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Once you have the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ddate&lt;/code&gt; package installed, you can use it to add the Discordian date to your &lt;a href=&quot;https://github.com/emacs-dashboard/emacs-dashboard&quot;&gt;dashboard&lt;/a&gt; with code like
this:&lt;/p&gt;

&lt;div class=&quot;language-emacs-lisp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;defun&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;ela/dashboard-insert-ddate&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;list-size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&quot;Insert the Discordian date into the dashboard.&quot;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ddate-string&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ddate-pretty&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;dashboard-center-line&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;ddate-string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;insert&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;ddate-string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;use-package&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;dashboard&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;:init&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;dashboard-setup-startup-hook&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;:config&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;;; Add the ddate item provider to the list.&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;add-to-list&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;&apos;dashboard-item-generators&lt;/span&gt;
               &lt;span class=&quot;o&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ddate&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;ela/dashboard-insert-ddate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;;; Set up your items with ddate at the top.&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;setq&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;dashboard-items&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ddate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                          &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;recents&lt;/span&gt;   &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                          &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;bookmarks&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                          &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;registers&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can view the &lt;a href=&quot;https://git.sr.ht/~earneson/emacs-ddate&quot;&gt;source code for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ddate&lt;/code&gt; on Sourcehut&lt;/a&gt;.&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>An Org-mode to DOCX Pipeline</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2022/10/org-mode-to-docx-pipeline" rel="alternate" type="text/html" title="An Org-mode to DOCX Pipeline" />
        <updated>2022-10-26T00:00:00+00:00</updated>
        <id>https://arnesonium.com/2022/10/org-to-docx</id>
          <category term="org-mode" />
        
          <category term="pandoc" />
        
          <category term="emacs" />
        
          <category term="writing" />
        <content type="html" xml:base="https://arnesonium.com/2022/10/org-mode-to-docx-pipeline">&lt;p&gt;Freelance writers need to deliver documents in the format requested by clients. However, frequently
the requested format is not the writer’s preferred working format. I like to write in Org Mode, but
many clients prefer delivery in Microsoft Word’s DOCX format.&lt;/p&gt;

&lt;p&gt;This is how I generate DOCX files for my clients.
&lt;!--more--&gt;&lt;/p&gt;

&lt;h2 id=&quot;what-is-org-mode&quot;&gt;What is Org Mode?&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://orgmode.org/&quot;&gt;Org Mode&lt;/a&gt; is an Emacs package for writing and working with Org files. Org
files are highly structured plain text files that may appear to be a text outline, but can do so
much more. Org Mode is incredibly versatile, and can be used to track projects, manage schedules,
write outlines, and even create documents.&lt;/p&gt;

&lt;h2 id=&quot;choosing-between-org-export-and-pandoc&quot;&gt;Choosing between Org Export and Pandoc&lt;/h2&gt;

&lt;p&gt;Org Export runs inside Emacs and is capable of converting Org files to &lt;a href=&quot;https://orgmode.org/guide/Exporting.html&quot;&gt;a variety of other
formats&lt;/a&gt;. While it is very powerful, it also has its
idiosyncrasies. For instance, when converting Org files to DOCX files, it uses its own style names
such as “Org Title” and “Org Heading 1”.&lt;/p&gt;

&lt;p&gt;A second option for converting Org files to DOCX files is &lt;a href=&quot;https://pandoc.org/&quot;&gt;Pandoc&lt;/a&gt;. Pandoc
prides itself on being the Swiss army knife of document format conversion. It handles an impressive
variety of document formats and handles a dizzying collection of configuration options.&lt;/p&gt;

&lt;p&gt;Since the DOCX files that I create need to be shared with other writers, editors, and reviewers, I
need to make sure that they are easy to work with. This influenced my decision. Since Pandoc uses
more &lt;a href=&quot;https://pandoc.org/MANUAL.html#option--reference-doc&quot;&gt;standard style names&lt;/a&gt;, I decided to use
it for Org conversion.&lt;/p&gt;

&lt;h2 id=&quot;setting-up-pandoc&quot;&gt;Setting up Pandoc&lt;/h2&gt;

&lt;p&gt;To use Pandoc to generate nice looking DOCX files, you will need to configure a template
document. The recommended method for doing this is to generate a default template using Pandoc, and
then edit it in Word. I used &lt;a href=&quot;https://www.libreoffice.org/&quot;&gt;LibreOffice Writer&lt;/a&gt; for this, and it
worked just fine.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Install the latest Pandoc &lt;a href=&quot;https://pandoc.org/installing.html&quot;&gt;using these instructions&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Run the following command to generate &lt;strong&gt;reference.docx&lt;/strong&gt;
    &lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pandoc &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; custom-reference.docx &lt;span class=&quot;nt&quot;&gt;--print-default-data-file&lt;/span&gt; reference.docx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;Open &lt;strong&gt;reference.docx&lt;/strong&gt; in your word processor and edit the styles so they meet your needs.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;converting-from-org-to-docx&quot;&gt;Converting from Org to DOCX&lt;/h2&gt;

&lt;p&gt;One option for running the conversion is to take advantage of the
&lt;a href=&quot;https://github.com/emacsorphanage/ox-pandoc&quot;&gt;ox-pandoc&lt;/a&gt; package for Emacs. If you will always be
using the same configuration for your exports, this is a great option.&lt;/p&gt;

&lt;p&gt;However, I need to use a number of different configurations for converting documents, so I tend to
run Pandoc from the command line. Recent versions of ox-pandoc support &lt;a href=&quot;https://github.com/emacsorphanage/ox-pandoc#passing-options-to-pandoc&quot;&gt;passing options via Org
headers&lt;/a&gt;, but I still haven’t
bothered to set that up. It should be very easy to template this using 
&lt;a href=&quot;/2022/09/yasnippet-emacs-writing&quot;&gt;Yasnippet&lt;/a&gt;, though.&lt;/p&gt;

&lt;p&gt;I use a custom &lt;a href=&quot;https://fishshell.com/&quot;&gt;fish shell&lt;/a&gt; function that looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-fish&quot;&gt;function org2docx --description &apos;Generate a DOCX file using a custom reference document&apos;
    set -l refdoc &quot;$PATH_TO_REFERENCE_DOCX&quot;
    set -l base (basename -s .org $argv)
    echo Generating $base.docx ...
    pandoc --reference-doc $refdoc -o $base.docx $argv
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;From my fish shell command line, I can then just run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;org2docx whatever.org&lt;/code&gt; to generate
&lt;strong&gt;whatever.docx&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I have not found a level of automation that makes my converted DOCX files completely perfect,
unfortunately. After conversion, I always open the new file in my word processor to make final
tweaks and fixes.&lt;/p&gt;

&lt;h2 id=&quot;have-fun-converting-files&quot;&gt;Have fun converting files!&lt;/h2&gt;

&lt;p&gt;The method I’ve outline in this blog post is straightforward and fits my needs. There are definitely
improvements to be made, such as using templates to pass the proper options to Pandoc. Switching to
ox-pandoc would mean one fewer reason to leave Emacs, after all.&lt;/p&gt;

&lt;p&gt;In recent years, more and more clients are asking for files to be delivered via Google Docs. So far,
I have yet to find a good conversion pipeline to get Org files into Google Docs easily. My method
right now takes too many manual steps. That’s a problem I would love to solve.&lt;/p&gt;

&lt;p&gt;Do you have a conversion pipeline for documents that works for you? Leave me a comment and let me
know!&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Yasnippet and Emacs for Writing</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2022/09/yasnippet-emacs-writing" rel="alternate" type="text/html" title="Yasnippet and Emacs for Writing" />
        <updated>2022-09-28T00:00:00+00:00</updated>
        <id>https://arnesonium.com/2022/09/yasnippet-emacs-writing</id>
          <category term="emacs" />
        
          <category term="writing" />
        
          <category term="lisp" />
        
          <category term="org-mode" />
        
          <category term="markdown" />
        
          <category term="podcast" />
        <content type="html" xml:base="https://arnesonium.com/2022/09/yasnippet-emacs-writing">&lt;p&gt;As a &lt;a href=&quot;/writing/&quot;&gt;freelance writer&lt;/a&gt;, I need to be ready to deliver high quality copy in a timely fashion. My editor of choice for writing is
Emacs. I have found that &lt;a href=&quot;https://github.com/joaotavora/yasnippet&quot;&gt;Yasnippet&lt;/a&gt; templates have streamlined my writing process.
&lt;!--more--&gt;&lt;/p&gt;

&lt;ul id=&quot;markdown-toc&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;#what-is-yasnippet&quot; id=&quot;markdown-toc-what-is-yasnippet&quot;&gt;What is Yasnippet?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#installing-yasnippet&quot; id=&quot;markdown-toc-installing-yasnippet&quot;&gt;Installing Yasnippet&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#markdown-and-jekyll&quot; id=&quot;markdown-toc-markdown-and-jekyll&quot;&gt;Markdown and Jekyll&lt;/a&gt;    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#bonus-snippets&quot; id=&quot;markdown-toc-bonus-snippets&quot;&gt;Bonus Snippets&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#org-mode-templates&quot; id=&quot;markdown-toc-org-mode-templates&quot;&gt;Org Mode Templates&lt;/a&gt;    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#org2blog-and-podcast-show-notes&quot; id=&quot;markdown-toc-org2blog-and-podcast-show-notes&quot;&gt;org2blog and Podcast Show Notes&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#more-bonus-snippets&quot; id=&quot;markdown-toc-more-bonus-snippets&quot;&gt;More Bonus Snippets&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#writing-faster-is-writing-smarter&quot; id=&quot;markdown-toc-writing-faster-is-writing-smarter&quot;&gt;Writing Faster is Writing Smarter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;what-is-yasnippet&quot;&gt;What is Yasnippet?&lt;/h2&gt;

&lt;p&gt;As a templating system for Emacs, Yasnippet is well known by programmers. It can quickly expand
function definitions, control structures, and other templates into blocks of source code. Source code is just text.&lt;/p&gt;

&lt;p&gt;Since most of my writing originates in text format, templates are great for speeding up document
creation and avoiding common errors and omissions.&lt;/p&gt;

&lt;h2 id=&quot;installing-yasnippet&quot;&gt;Installing Yasnippet&lt;/h2&gt;

&lt;p&gt;With &lt;a href=&quot;https://github.com/jwiegley/use-package&quot;&gt;use-package&lt;/a&gt;, you can get started quickly with Yasnippet by including the following in your
Emacs init file.&lt;/p&gt;

&lt;div class=&quot;language-elisp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;use-package&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;yasnippet&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;:ensure&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;t&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;:config&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;yas-global-mode&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;use-package&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;yasnippet-snippets&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;:ensure&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;t&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;:after&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;yasnippet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For more detailed installation instructions, &lt;a href=&quot;https://joaotavora.github.io/yasnippet/&quot;&gt;check the Yasnippet documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;markdown-and-jekyll&quot;&gt;Markdown and Jekyll&lt;/h2&gt;

&lt;p&gt;This blog is primarily written in Markdown for Jekyll, which means that each file needs a YAML block at the top with specific
information. I have a template that looks like this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# -*- mode: snippet -*-
# name: blogtop
# key: blogtop
# --
---
title: ${1:Title}
author: &quot;Erik L. Arneson&quot;
layout: post
permalink: `(format-time-string &quot;/%Y/%m/&quot;)`$2
comments: ${3:$$(yas-choose-value &apos;(&quot;true&quot; &quot;false&quot;))}
tags:
    - $4
---

$0
&amp;lt;!--more--&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Not only does this template save me from needing to remember the format of the YAML block, but it ensures that frequently forgetten items
are included, such as the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;permalink&lt;/code&gt; setting and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;!--more--&amp;gt;&lt;/code&gt; tag.&lt;/p&gt;

&lt;h3 id=&quot;bonus-snippets&quot;&gt;Bonus Snippets&lt;/h3&gt;

&lt;p&gt;The &lt;a href=&quot;https://github.com/AndreaCrotti/yasnippet-snippets&quot;&gt;official snippet collection&lt;/a&gt; contains a bunch of extra Markdown templates. 
&lt;a href=&quot;https://github.com/AndreaCrotti/yasnippet-snippets/tree/master/snippets/markdown-mode&quot;&gt;Check them out here.&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;org-mode-templates&quot;&gt;Org Mode Templates&lt;/h2&gt;

&lt;p&gt;My &lt;a href=&quot;https://orgmode.org/&quot;&gt;Org Mode&lt;/a&gt; files are more complex. Many writing clients expect deliveries in Microsoft Word files, but
I also frequently find myself needing to produce OpenDocument files, HTML, and even Markdown. The headers for these files need to support
all of these options.&lt;/p&gt;

&lt;p&gt;I use the following template to support all of the Org Mode configuration and options I require.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# -*- mode: snippet -*-
# name: header
# key: header
# --
#+TITLE: $1
#+LANGUAGE: ${2:en}
#+AUTHOR: ${3:$$(yas/choose-value &apos;(&quot;Erik L. Arneson&quot; &quot;Some Other Name&quot;))}
#+EMAIL: ${4:$$(yas/choose-value &apos;(&quot;list-of-email-addresses&quot;))}${5:
#+DESCRIPTION: $6}${7:
#+KEYWORDS: $8}
#+OPTIONS: num:nil toc:nil
#+ODT_STYLES_FILE: ${9:$$(yas/choose-value &apos;(&quot;list-of-template-files&quot;))}
#+bibliography: /path/to/MyLibrary.bib
#+cite_export: csl ${10:$$(yas/choose-value &apos;(&quot;chicago-fullnote-bibliography.csl&quot; &quot;modern-language-association.csl&quot; &quot;apa.csl&quot;))}
#+WWG: ${11:$$(yas/choose-value &apos;(&quot;0&quot; &quot;250&quot; &quot;500&quot; &quot;1000&quot;))}

$0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;org2blog-and-podcast-show-notes&quot;&gt;org2blog and Podcast Show Notes&lt;/h3&gt;

&lt;p&gt;I also use Org Mode to publish to WordPress websites using &lt;a href=&quot;https://github.com/org2blog/org2blog&quot;&gt;org2blog&lt;/a&gt;. For one of these websites, I
write show notes for podcast episodes. I use a template that looks like this.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# -*- mode: snippet -*-
# name: podcast
# key: podcast
# --
* $1
  :PROPERTIES:
  :POST_TAGS: $2
  :BLOG:      arnemancy
  :CATEGORY:  Podcast
  :POST_DATE: `(format-time-string &quot;[%Y-%m-%d %a %H:%M]&quot; nil nil)`
  :END:

$0

** Links

** Credits

#+begin_export html
Support me on Patreon: &amp;lt;a rel=&quot;payment&quot; href=&quot;https://www.patreon.com/arnemancy&quot;&amp;gt;https://www.patreon.com/arnemancy&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;
#+end_export
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This template reminds me of important items I need to include in all show notes, like links, credits, and a Patreon link.&lt;/p&gt;

&lt;h3 id=&quot;more-bonus-snippets&quot;&gt;More Bonus Snippets&lt;/h3&gt;

&lt;p&gt;The official snippet collection also contains a bunch of Org Mode snippets. &lt;a href=&quot;https://github.com/AndreaCrotti/yasnippet-snippets/tree/master/snippets/org-mode&quot;&gt;Here is the whole
list.&lt;/a&gt; Since Org Mode contains so many complicated
structures like source blocks and optional keywords, these are great time savers. There are also snippets for supporting
&lt;a href=&quot;https://github.com/yjwen/org-reveal&quot;&gt;org-reveal&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;writing-faster-is-writing-smarter&quot;&gt;Writing Faster is Writing Smarter&lt;/h2&gt;

&lt;p&gt;Don’t let your tools get in the way of your writing. Frequently, Emacs is portrayed as cumbersome and filled with obscure keybindings and
weird commands. However, I have found that it is an excellent tool for writing. Yasnippet templates let me get started on new documents
quickly without fretting over different syntaxes for configuration.&lt;/p&gt;

&lt;p&gt;And Yasnippet is just one of the tools I use when writing with Emacs. I will discuss more of these tools in the future.&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Some Great Fish Shell Plugins</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2022/09/some-great-fish-shell-plugins/" rel="alternate" type="text/html" title="Some Great Fish Shell Plugins" />
        <updated>2022-09-23T17:44:00+00:00</updated>
        <id>https://arnesonium.com/2022/09/some-great-fish-shell-plugins</id>
          <category term="automation" />
        
          <category term="command-line" />
        
          <category term="emacs" />
        
          <category term="fish-shell" />
        
          <category term="howto" />
        
          <category term="ide" />
        
          <category term="shell" />
        <content type="html" xml:base="https://arnesonium.com/2022/09/some-great-fish-shell-plugins/">&lt;p&gt; As a long-time Linux user, I am pretty comfortable with command line interfaces. However, as I started learning more about automation and how important it is to get your computer to do more work for you, I leaned toward wanting my command line shell to do more. Eventually I switched to &lt;a href=&quot;https://fishshell.com/&quot;&gt;fish shell&lt;/a&gt;, a very user-friendly shell with excellent scripting capabilities that is far more readable and less obscure than bash. &lt;/p&gt;
&lt;!--more--&gt;
&lt;div id=&quot;outline-container-orgbd4e930&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;orgbd4e930&quot;&gt;Plugins for fish&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-orgbd4e930&quot;&gt;
&lt;p&gt; There have been a few plugin managers over the years, but the one that seems to be the best maintained and most usable is &lt;a href=&quot;https://github.com/jorgebucaran/fisher&quot;&gt;fisher&lt;/a&gt;, created by &lt;a href=&quot;https://twitter.com/jorgebucaran&quot;&gt;Jorge Bucaran&lt;/a&gt;. It allows you to easily install plugins straight from GitHub repositories, while updates can be executed with a simple &lt;code&gt;fisher update&lt;/code&gt; on the command line. &lt;/p&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-org0108c85&quot; class=&quot;outline-3&quot;&gt;
&lt;h3 id=&quot;org0108c85&quot;&gt;z&lt;/h3&gt;
&lt;div class=&quot;outline-text-3&quot; id=&quot;text-org0108c85&quot;&gt;
&lt;p&gt; &lt;b&gt;One of the greatest command-line time savers ever&lt;/b&gt; is the &lt;code&gt;z&lt;/code&gt; command. Originally a bash script, it has been ported to fish and, frankly, I love it. &lt;/p&gt;

&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;b&gt;What does it do?&lt;/b&gt; &lt;code&gt;z&lt;/code&gt; provides shorthand for visiting directories based on a combination of frequency and recency&amp;#x2014;or &quot;frecency&quot;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; If you frequently visit the &lt;code&gt;/opt/calibre&lt;/code&gt; directory, a &lt;code&gt;z calib&lt;/code&gt; command will allow you to jump straight there. &lt;/p&gt;

&lt;p&gt; If you already have fisher installed, just use &lt;code&gt;fisher install jethrokuan/z&lt;/code&gt; and start playing around with &lt;code&gt;z&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt; &lt;a href=&quot;https://github.com/jethrokuan/z&quot;&gt;You can read more about &lt;code&gt;z&lt;/code&gt; here.&lt;/a&gt; &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orga78b5fb&quot; class=&quot;outline-3&quot;&gt;
&lt;h3 id=&quot;orga78b5fb&quot;&gt;pisces&lt;/h3&gt;
&lt;div class=&quot;outline-text-3&quot; id=&quot;text-orga78b5fb&quot;&gt;
&lt;p&gt; &lt;b&gt;Your IDE has been handling your parenthesis for ages.&lt;/b&gt; Now your shell can do the same! The &lt;a href=&quot;https://github.com/laughedelic/pisces&quot;&gt;pisces&lt;/a&gt; plugin has automatic matching symbol management for parenthesis, braces, quotes, and others. &lt;/p&gt;

&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;b&gt;Install it with fisher&lt;/b&gt; using the command &lt;code&gt;fisher install laughedelic/pisces&lt;/code&gt; and be matching parens in seconds!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;a href=&quot;https://github.com/laughedelic/pisces&quot;&gt;You can read more about the pisces plugin here.&lt;/a&gt; &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orgc02da30&quot; class=&quot;outline-3&quot;&gt;
&lt;h3 id=&quot;orgc02da30&quot;&gt;plugin-emacs&lt;/h3&gt;
&lt;div class=&quot;outline-text-3&quot; id=&quot;text-orgc02da30&quot;&gt;
&lt;p&gt; &lt;b&gt;Automation can help you interact with your editor&lt;/b&gt; from your shell. The &lt;a href=&quot;https://github.com/pymander/plugin-emacs&quot;&gt;Emacs plugin for fish&lt;/a&gt; was originally written for an unmaintained plugin manager called &lt;a href=&quot;https://github.com/oh-my-fish/oh-my-fish&quot;&gt;Oh My Fish&lt;/a&gt;. However, I wanted the plugin to work with fisher, so I made &lt;a href=&quot;https://github.com/pymander/plugin-emacs&quot;&gt;my own fork&lt;/a&gt;. &lt;/p&gt;

&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;b&gt;How does it work?&lt;/b&gt; This plugin adds easy commands like &lt;code&gt;ef&lt;/code&gt; and &lt;code&gt;ed&lt;/code&gt; that allow you to open files and directories in Emacs quickly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; Install it quickly using the command &lt;code&gt;fisher install pymander/plugin-emacs&lt;/code&gt; and &lt;a href=&quot;https://github.com/pymander/plugin-emacs&quot;&gt;read more about it here&lt;/a&gt;. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orga8ddcd0&quot; class=&quot;outline-3&quot;&gt;
&lt;h3 id=&quot;orga8ddcd0&quot;&gt;vfish&lt;/h3&gt;
&lt;div class=&quot;outline-text-3&quot; id=&quot;text-orga8ddcd0&quot;&gt;
&lt;p&gt; &lt;b&gt;Emacs users have probably heard of vterm,&lt;/b&gt; which is the &lt;a href=&quot;https://github.com/akermu/emacs-libvterm&quot;&gt;Emacs package that interacts with libvterm&lt;/a&gt;. It is a powerful terminal emulator that runs in an Emacs buffer. I wrote &lt;a href=&quot;https://github.com/pymander/vfish&quot;&gt;a fish plugin called vfish&lt;/a&gt; that simplifies using fish in vterm. &lt;/p&gt;

&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;b&gt;How does it work?&lt;/b&gt; Inside a vterm session, this plugin adds fish commands like &lt;code&gt;vf&lt;/code&gt; and &lt;code&gt;vd&lt;/code&gt; to open files and directories quickly. It mirrors the Emacs plugin.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; Install it using the command &lt;code&gt;fisher install pymander/vfish&lt;/code&gt; and &lt;a href=&quot;https://github.com/pymander/vfish&quot;&gt;read more about it here&lt;/a&gt;. Note that &lt;b&gt;it will require some code&lt;/b&gt; to be added to your Emacs startup file.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orgf6c1785&quot; class=&quot;outline-3&quot;&gt;
&lt;h3 id=&quot;orgf6c1785&quot;&gt;apt&lt;/h3&gt;
&lt;div class=&quot;outline-text-3&quot; id=&quot;text-orgf6c1785&quot;&gt;
&lt;p&gt; For Debian and Ubuntu users, the &lt;a href=&quot;https://github.com/oh-my-fish/plugin-apt&quot;&gt;Oh My Fish apt plugin&lt;/a&gt; works seamlessly with fisher. &lt;/p&gt;

&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;b&gt;What does it do?&lt;/b&gt; The apt plugin adds a wrapper around the &lt;code&gt;apt&lt;/code&gt; and &lt;code&gt;apt-get&lt;/code&gt; commands that simplify package management from the command line.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; Install this plugin quickly with &lt;code&gt;fisher install oh-my-fish/plugin-apt&lt;/code&gt; and then &lt;a href=&quot;https://github.com/oh-my-fish/plugin-apt&quot;&gt;read more about it&lt;/a&gt;. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orgef254fe&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;orgef254fe&quot;&gt;What&apos;s your favorite fisher plugin?&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-orgef254fe&quot;&gt;
&lt;p&gt; I love finding plugins that can help me automate more of my everyday tasks and workflows. What&apos;s your favorite fisher plugin? &lt;/p&gt;

&lt;p&gt; Leave a comment below and let me know! Be sure to include a link. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</content>
      </entry>
    
      <entry>
        
        <title>Typing Chinuk Wawa in Emacs</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2021/10/typing-chinuk-wawa-in-emacs/" rel="alternate" type="text/html" title="Typing Chinuk Wawa in Emacs" />
        <updated>2021-10-11T17:01:00+00:00</updated>
        <id>https://arnesonium.com/2021/10/typing-chinuk-wawa-in-emacs</id>
          <category term="chinuk-wawa" />
        
          <category term="emacs" />
        
          <category term="input-methods" />
        
          <category term="keyboard" />
        
          <category term="languages" />
        
          <category term="learning" />
        
          <category term="linux" />
        
          <category term="lisp" />
        
          <category term="emacs" />
        
          <category term="dvorak" />
        <content type="html" xml:base="https://arnesonium.com/2021/10/typing-chinuk-wawa-in-emacs/">&lt;p&gt;Back in 2015, I took a course in being an ally for local Native American communities from the
&lt;a href=&quot;https://www.pugspdx.com/&quot;&gt;Portland Underground Grad School (PUGS)&lt;/a&gt;. One suggested action was
learning the local language, but it proved difficult to find opportunities. When the pandemic forced
school closures, though, Lane Community College began offering classes online. I found out about
this thanks to the &lt;a href=&quot;https://kaltashwawa.ca/2021/09/07/non-credit-enrollment-is-open-for-chinuk-wawa-classes-at-lane-community-college/&quot;&gt;Kaltash Wawa blog&lt;/a&gt;, and this fall I signed up to take a remote &lt;a href=&quot;https://www.lanecc.edu/llc/language/chinuk-wawa&quot;&gt;Chinuk
Wawa class through Lane Community College&lt;/a&gt;.&lt;/p&gt;

&lt;!--more--&gt;

&lt;h2 id=&quot;what-is-chinuk-wawa&quot;&gt;What is Chinuk Wawa?&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Chinook_Jargon&quot;&gt;Chinuk Wawa&lt;/a&gt; originated as a type of creole or pidgin trade language in the Pacific Northwest,
incorporating loan words from more than a dozen indigenous and European languages. Though it has a
small lexicon, it is an interesting language with an impressive array of new phonemes for me to
learn. There are 12 different variations on “k”, for instance! As you can imagine, with this
variety, it is pretty difficult to type Chinuk Wawa using the standard Latin alphabet. I am learning
the &lt;a href=&quot;https://www.grandronde.org/services/education/chinuk-wawa-education-program/&quot;&gt;Grand Ronde dialect&lt;/a&gt;, which uses an IPA-based alphabet.&lt;/p&gt;

&lt;h2 id=&quot;keyman-for-linux&quot;&gt;Keyman for Linux&lt;/h2&gt;

&lt;p&gt;Under Linux, the easiest way to add an IPA-based input method is using the &lt;a href=&quot;https://keyman.com/keyboards/sil_ipa&quot;&gt;IPA (SIL) keyboard for
Keyman&lt;/a&gt;. This integrates nicely under GNOME 3 with Ubuntu 20.04. However, I’m a Dvorak typist,
so having to switch back to a QWERTY-style keyboard is frustrating, and was slowing me
down. Instead, I came up with this method for inputing Chinuk Wawa compatible IPA using Emacs.&lt;/p&gt;

&lt;h2 id=&quot;emacs-input-methods&quot;&gt;Emacs Input Methods&lt;/h2&gt;

&lt;p&gt;Emacs has an easy method for switching between input methods, which you can &lt;a href=&quot;https://www.gnu.org/software/emacs/manual/html_node/emacs/Select-Input-Method.html&quot;&gt;read more about
in the Emacs manual&lt;/a&gt;. It comes with a number of IPA input methods, and after taking a look at all
of them, I chose &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ipa-x-sampa&lt;/code&gt;, as it seemed to have the best coverage of symbols needed by
Chinuk Wawa. However, it was missing a way to input the character “x̣”, which was
needed by one of the first words I learned, “yax̣al”!&lt;/p&gt;

&lt;p&gt;I added the following code to my startup file to remedy this. This adds the ability to type &lt;strong&gt;x_.&lt;/strong&gt;
to get &lt;strong&gt;x̣&lt;/strong&gt; and &lt;strong&gt;?/&lt;/strong&gt; to get &lt;strong&gt;?&lt;/strong&gt;, both of which make typing Chinuk Wawa &lt;em&gt;much&lt;/em&gt; easier for me.&lt;/p&gt;

&lt;div class=&quot;language-elisp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;defun&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;chinuk-wawa-quail-rules&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&quot;Add Chinuk Wawa rules to the `ipa-x-sampa` input map.&quot;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;interactive&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;string-equal&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;ipa-x-sampa&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;quail-name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;quail-define-rules&lt;/span&gt;
       &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;append&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
       &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;_.&quot;&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#x0323&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;   &lt;span class=&quot;c1&quot;&gt;;; allows for x with dot beneath&lt;/span&gt;
       &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;?/&quot;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;?&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;     &lt;span class=&quot;c1&quot;&gt;;; allows for ? character &lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;add-hook&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;&apos;quail-activate-hook&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;&apos;chinuk-wawa-quail-rules&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;As you can see, this method allows plenty of additional characters to be added to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ipa-x-sampa&lt;/code&gt;,
so if it turns out I missed anything, I can expand on it later.&lt;/p&gt;

&lt;p&gt;The biggest downside of this is that I can only input Chinuk Wawa easily in Emacs, but since I do
most of my work there—including writing this blog post—it doesn’t feel that bad to me. It’s
definitely better than typing QWERTY!&lt;/p&gt;

&lt;p&gt;aɬqi!&lt;/p&gt;</content>
      </entry>
    
</feed>
