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

	<title>Planet Emacslife</title>
	<link rel="self" href="https://planet.emacslife.com/atom.xml"/>
	<link href="https://planet.emacslife.com/"/>
	<id>https://planet.emacslife.com/atom.xml</id>
	<updated>2024-12-26T01:34:35+00:00</updated>
	<generator uri="https://www.planetplanet.org/">http://intertwingly.net/code/venus/</generator>

	<entry>
		<title type="html" xml:lang="en-US">Irreal: PSA: Use The Lucid Toolkit</title>
		<link href="https://irreal.org/blog/?p=12672"/>
		<id>https://irreal.org/blog/?p=12672</id>
		<updated>2024-12-25T18:42:02+00:00</updated>
		<published></published>
		<content type="html" xml:lang="en-US">&lt;p&gt;
It’s Christmas, a day that we at the Irreal Bunker celebrate in large part by being slothful. Therefore, today’s offering is a quickie. On the other hand, since it &lt;i&gt;is&lt;/i&gt; Christmas, you can also think of this post as a Christmas gift.
&lt;/p&gt;
&lt;p&gt;
Over at the Emacs subreddit, ArcanistCheshire  tells us that &lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hlj04t/emacs_using_the_lucid_toolkit_is_blazingly_fast/&quot;&gt;building Emacs with the Lucid toolkit resulted in an impressive Emacs speedup&lt;/a&gt;. This is seconded by Karthink, someone who has shown he knows what he’s talking about.
&lt;/p&gt;
&lt;p&gt;
Sadly, if you’re a macOS user this gift is not for you. It’s only for users of X-windows and even then there are some restrictions. Take a look at the post for the details.
&lt;/p&gt;
&lt;p&gt;
Even if you are a macOS Emacs user, you can take heart because being an Emacs user is a gift all by itself. Merry Christmas&lt;/p&gt;</content>
		<author>
			<name>jcs</name>
			<uri>https://irreal.org/blog</uri>
		</author>
		<source>
			<title type="html">Emacs – Irreal</title>
			<subtitle type="html">The minds had long ago come up with a proper name for it; they called it the Irreal, but they thought of it as Infinite Fun. That was what they really knew it as. The Land of Infinite Fun. --Iain M. Banks, Excession</subtitle>
			<link rel="self" href="http://irreal.org/blog/?tag=emacs&amp;feed=rss2"/>
			<id>https://irreal.org/blog</id>
		</source>
	</entry>

	<entry>
		<title type="html">Protesilaos Stavrou: Emacs: sequence notes with new ‘denote-sequence.el’</title>
		<link href="https://protesilaos.com/codelog/2024-12-25-emacs-denote-sequence-notes/"/>
		<id>https://protesilaos.com/codelog/2024-12-25-emacs-denote-sequence-notes/</id>
		<updated>2024-12-25T00:00:00+00:00</updated>
		<published></published>
		<content type="html">&lt;p&gt;Today I wrote the initial version of the new optional extension
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;denote-sequence.el&lt;/code&gt;, which is part of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;denote&lt;/code&gt; package (current
development version is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;3.2.0-dev&lt;/code&gt;). It provides commands to create
“sequence notes”, i.e. notes that have an inherent structure of
parent, child, or sibling. A sequence is expressed numerically, such
as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1&lt;/code&gt; being a parent, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1=1&lt;/code&gt; the first child thereof, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1=2&lt;/code&gt; the
sibling of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1=1&lt;/code&gt; and child of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1&lt;/code&gt;, and so on.&lt;/p&gt;

&lt;p&gt;In technical terms, this new extension leverages the optional
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SIGNATURE&lt;/code&gt; file name component, per the Denote file-naming scheme
(read the manual, which is the source of truth—I write it for you).
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;denote-sequence.el&lt;/code&gt; streamlines the creation of signatures to conform
with the aforementioned sequencing (in general, the signature file
name component is a free-form field that users can employ in any
workflow they want).&lt;/p&gt;

&lt;p&gt;The new code is available on the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sequence-notes-extension&lt;/code&gt; branch:
&lt;a href=&quot;https://github.com/protesilaos/denote/tree/sequence-notes-extension&quot;&gt;https://github.com/protesilaos/denote/tree/sequence-notes-extension&lt;/a&gt;.
Depending on when you read this, the branch may no longer exist as the
code is merged into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Those of you who use Denote for your zettelkasten, please give
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;denote-sequence.el&lt;/code&gt; a try. If it covers your use-case, let me know
what else you want to see as a feature. If it does not conform with
your requirements, please tell me if we can do something to make it
work for you.&lt;/p&gt;

&lt;p&gt;The commands we provide as of this writing:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;denote-sequence&lt;/code&gt;, which creates a new sequence note of type parent,
sibling, or child.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;denote-sequence-new-parent&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;denote-sequence-new-sibling&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;denote-sequence-new-child&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;What is Denote&lt;/h2&gt;

&lt;p&gt;Denote implements an efficient file-naming scheme that makes it easy
to retrieve files by their name. This is done by creating new files
(“notes”), or by renaming existing ones. For new files, Denote
supports any text format, with Org, Markdown, and plain text being
covered out-of-the-box. For renaming files, any file is supported
(e.g. I use Denote for all my videos).&lt;/p&gt;

&lt;p&gt;As such, Denote is open-ended in terms of workflow. It is not just a
note-taking package, let alone one that is limited a specific
methodology, such as zettelkasten. Still, Denote can excel in those
use-cases, among others.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Package name (GNU ELPA): &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;denote&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Official manual: &lt;a href=&quot;https://protesilaos.com/emacs/denote&quot;&gt;https://protesilaos.com/emacs/denote&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Change log: &lt;a href=&quot;https://protesilaos.com/emacs/denote-changelog&quot;&gt;https://protesilaos.com/emacs/denote-changelog&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Git repositories:
    &lt;ul&gt;
      &lt;li&gt;GitHub: &lt;a href=&quot;https://github.com/protesilaos/denote&quot;&gt;https://github.com/protesilaos/denote&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;GitLab: &lt;a href=&quot;https://gitlab.com/protesilaos/denote&quot;&gt;https://gitlab.com/protesilaos/denote&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Video demo: &lt;a href=&quot;https://protesilaos.com/codelog/2022-06-18-denote-demo/&quot;&gt;https://protesilaos.com/codelog/2022-06-18-denote-demo/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Backronyms: Denote Everything Neatly; Omit The Excesses.  Don’t Ever
Note Only The Epiphenomenal.&lt;/li&gt;
&lt;/ul&gt;</content>
		<author>
			<name>Protesilaos Stavrou</name>
			<uri>https://protesilaos.com/codelog</uri>
		</author>
		<source>
			<title type="html">Protesilaos Stavrou: Coding blog</title>
			<subtitle type="html">Coding blog</subtitle>
			<link rel="self" href="https://protesilaos.com/codelog.xml"/>
			<id>https://protesilaos.com/codelog</id>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en-US">Irreal: Why You Want Your Tools To Be Programmable</title>
		<link href="https://irreal.org/blog/?p=12669"/>
		<id>https://irreal.org/blog/?p=12669</id>
		<updated>2024-12-24T17:15:23+00:00</updated>
		<published></published>
		<content type="html" xml:lang="en-US">&lt;p&gt;
A constant theme here at Irreal is that one of Emacs’ virtues is its programmability. Not the ersatz programmability offered by VS Code or even Vim but &lt;i&gt;real&lt;/i&gt; programmability. You can introduce new code or change old code while Emacs is running in a seamless manner.
&lt;/p&gt;
&lt;p&gt;
But why is that so important? Aren’t knobs and check boxes enough? &lt;a href=&quot;https://www.youtube.com/@Positron-gv7do&quot;&gt;Positron&lt;/a&gt; has a &lt;a href=&quot;https://www.youtube.com/watch?v=u7DW78ng9Cg&quot;&gt;nice video&lt;/a&gt; that provides the answer. The TL;DR is that, no, knobs and check boxes are not enough. They’re more complex to implement and maintain, they quickly go out of date, and they simply aren’t as flexible. With programmability, the user is in charge and can evolve the action of Emacs as needs change.
&lt;/p&gt;
&lt;p&gt;
Positron makes a good point about Elisp and its supposed slowness. The code you write for Emacs happens, as Positron puts it, at the other end of the keyboard and therefore at human speed. It doesn’t matter if it’s slower than C or whatever. It’s fast enough for human senses. For those jobs that require more powerful computation, Emacs simply subcontracts them out to an external process for faster processing.
&lt;/p&gt;
&lt;p&gt;
As far as I know, only Lisp Machines and their descendants offer this kind of programmability. Today, the only widely used piece of software that can do this is Emacs. To me it seems not so much an advantage as a necessity.
&lt;/p&gt;
&lt;p&gt;
It’s a short video (4 minutes, 35 seconds) so take a look. Positron makes some good points.&lt;/p&gt;</content>
		<author>
			<name>jcs</name>
			<uri>https://irreal.org/blog</uri>
		</author>
		<source>
			<title type="html">Emacs – Irreal</title>
			<subtitle type="html">The minds had long ago come up with a proper name for it; they called it the Irreal, but they thought of it as Infinite Fun. That was what they really knew it as. The Land of Infinite Fun. --Iain M. Banks, Excession</subtitle>
			<link rel="self" href="http://irreal.org/blog/?tag=emacs&amp;feed=rss2"/>
			<id>https://irreal.org/blog</id>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en">TAONAW - Emacs and Org Mode: How I handled projects in Emacs org-mode in 2024</title>
		<link href="https://taonaw.com/2024/12/24/how-i-handled-projects-in.html"/>
		<id>https://taonaw.com/2024/12/24/how-i-handled-projects-in.html</id>
		<updated>2024-12-24T14:57:28+00:00</updated>
		<published></published>
		<content type="html">&lt;p&gt;&lt;a href=&quot;https://taonaw.com/2024/12/14/my-emacs-projects.html&quot;&gt;I mentioned&lt;/a&gt; my projects file, &lt;code&gt;now.org&lt;/code&gt;, is getting a little bit out of control. I’ve been playing around with a few ways to organize it since.&lt;/p&gt;
&lt;p&gt;This is firstly a conceptional problem, one that has to do with how I organize things mentally before I can go into the technical level of how to tell Emacs to do it: a “what do I want to see?” question before a “how do I do it?” one.&lt;/p&gt;
&lt;p&gt;Let me start by showing you what my project file looks like now:&lt;/p&gt;
&lt;img alt=&quot;A text-based task organizer (Emacs org-mode) displays various projects labeled as active, done, canceled, and deferred, complete with completion percentages.&quot; height=&quot;522&quot; src=&quot;https://cdn.uploads.micro.blog/96826/2024/project-list.png&quot; width=&quot;600&quot; /&gt;
&lt;p&gt;As you can see, a lot is going on.&lt;/p&gt;
&lt;p&gt;One of the issues that are already fixed in this image is having the “DONE” or “CANCELLED” projects at the end of the file. This looks more organized than having them mixed with the “ACTIVE” projects all over, and it also allows me to focus on the things I’m currently working on as soon as I open the file.&lt;/p&gt;
&lt;p&gt;By default, org-mode adds newly created headers at the bottom of the file. This means that every time I add another project or a meeting (an “ACTIVE” or “MEETING” in the image), it goes to the bottom of the list, right under the last header. I have to fix this manually by standing on the header I just created and moving it up with (&lt;code&gt;M+↑&lt;/code&gt;) all the way to the top. However, I recently &lt;a href=&quot;https://fosstodon.org/@jtr/113690507876139147&quot;&gt;looked for a solution&lt;/a&gt; and &lt;a href=&quot;https://stackoverflow.com/questions/11116712/using-properties-in-org-mode-capture-templates#11127795&quot;&gt;found it&lt;/a&gt;: adding &lt;code&gt;prepend: t&lt;/code&gt; to my capture templates. This reverses the order, so this problem will automatically sort itself out.&lt;/p&gt;
&lt;p&gt;In my image, you can also see that some headers start as “Project:” and then the project’s name. This is redundant, and I hope to get rid of this soon because anything that is marked as “ACTIVE” is a project -  which is defined by having sub-tasks (marked as “TODO”) under it; the idea is that a project is a large undertaking that has to be broken first to manageable parts:&lt;/p&gt;
&lt;img alt=&quot;Auto-generated description: An Emacs org-mode screen capture shows a project management interface with tasks, status updates, and some completed and pending items.&quot; height=&quot;424&quot; src=&quot;https://cdn.uploads.micro.blog/96826/2024/project-example.png&quot; width=&quot;600&quot; /&gt;
&lt;p&gt;I write notes under each one of those sub-task headers (as you can see under the first one). I also find it helpful to attach relevant files (in this example, the Reserved IPs header has an Excel sheet containing details). I find that it’s easier to find files through Dired on Emacs than it is looking for them in my work’s OneDrive because they are tied to the project in the right place and arranged by date at the same time by my header’s ID (I changed that from random slugs to date-formatted IDs &lt;a href=&quot;https://taonaw-blog.netlify.app/2022-03-13/&quot;&gt;in the past&lt;/a&gt;). I can also jump directly to the directory with those files with  &lt;code&gt;C-c C-a F&lt;/code&gt;, and then use the open command on macOS (&lt;code&gt;M-x !open&lt;/code&gt;) to open it with the default application.&lt;/p&gt;
&lt;p&gt;Most of the projects in both images have a percent to completion next to them. Since I usually don’t know what a certain project requires to complete when I start it (what subtasks are required or how many), this is more of a general guide, if anything. Still, I like knowing how much of a project is already done. The &lt;a href=&quot;https://orgmode.org/manual/Checkboxes.html&quot;&gt;percent cookie&lt;/a&gt; is an feature built into org-mode&lt;sup&gt;&lt;a class=&quot;footref&quot; href=&quot;https://taonaw.com/categories/emacs-org-mode/feed.xml#fn.1&quot; id=&quot;fnr.1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Not in the images yet are emojis. I’m playing with the idea of including a small person emoji (🙋‍♂️) in “MEETING” headers to make them stand out a bit more. Meetings, as it turns out, are a special kind of project. It’s a place where a lot is going on at once, and I mark a “MEETING” as “DONE” only after all the actionable notes are distributed to tasks. Meetings can include tasks that start a whole new project or fit into existing ones. It’s also possible to meet about a certain project, so the “MEETING” header needs to be refiled under an existing project later as one of the subtasks. Meetings can take a long time to break down and follow up on, making them a project in themselves: this is why I found that giving them a dedicated keyword is a good way to handle them&lt;sup&gt;&lt;a class=&quot;footref&quot; href=&quot;https://taonaw.com/categories/emacs-org-mode/feed.xml#fn.2&quot; id=&quot;fnr.2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Another thing I added to the projects' capture template is clocking in as soon they’re created with &lt;code&gt;:clock-in t&lt;/code&gt;. I often forget to clock out later, but I want to keep trying and build this as a habit. If I create a clock with a project, Emacs creates a &lt;code&gt;:LOGBOOK:&lt;/code&gt; line for me with the time I started working, and I can correct the hours later. This is another area where it’s more of a guide than critical information: it’s often inaccurate (because I forget to clock out and then in again), and also, it doesn’t matter to me if I work half an hour more or half an hour less on something. It’s more of an indication of how much time a certain project took and how often I worked on it during the week.&lt;/p&gt;
&lt;p&gt;Projects are also tagged with people I regularly work with. I know some folks (and I get to know many more) personally. When this happens, it’s helpful to see recognizable projects and tasks tagged with names I know. Since tags are hereditary in Emacs, an entire project can be tagged with a person if it’s required, but usually, I need different people for different subtasks of a certain project, depending on what I do. This is helpful to see how much I am working with a certain person, what on, and what that person does. I also have another file for people I work with, along with their names, their ID, their department, and what they do; it’s my useful “I know a guy” file I can tap into when I need someone to do something or when someone else asks me if I know how to handle a certain thing. I then can say, “I don’t, but I can find someone who can for you.” Helpful.&lt;/p&gt;
&lt;p&gt;I can add a couple more things here, but this is probably a good place to stop. If you have any questions or suggestions, feel free to comment! I’d love to hear from you.&lt;/p&gt;
&lt;h3 id=&quot;footnotes&quot;&gt;Footnotes&lt;/h3&gt;
&lt;p&gt;&lt;sup&gt;&lt;a href=&quot;https://taonaw.com/categories/emacs-org-mode/feed.xml#fnr.1&quot; id=&quot;fn.1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;: It’s also worth noting that half of the time, I need to “re-ACTIVE” a project marked as “DONE” because of a new development or because it would happen again and might become more of a routine. This means new “TODO” tasks are added below, and the percentage goes back down from 100%, so, yes, this is more a visual guide than anything concrete.&lt;/p&gt;
&lt;p&gt;&lt;sup&gt;&lt;a href=&quot;https://taonaw.com/categories/emacs-org-mode/feed.xml#fnr.2&quot; id=&quot;fn.2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;: I use at least two (but sometimes more) datestamps in a “MEETING” project. The first time stamp is usually before the meeting takes place: this is where I write down a list of bullet points I want to bring up and discuss. The second timestamp takes place during the meeting (I type while people talk, and I ask them to slow down or wait if I need to (by the way, this is something that worked horribly for me with a notebook: my attempts and my attempts at something that looks like handwriting in meetings while rushing were laughable at best. I missed critical points that way). The second timestamp then becomes an indication to look for actionable items later. Since I write these notes in bullet points, it’s also easy to copy them back into Outlook with minor editing to leave a summary or meeting minutes later.&lt;/p&gt;</content>
		<author>
			<name>TAONAW - Emacs and Org Mode</name>
			<uri>https://taonaw.com/categories/emacs-org-mode/</uri>
		</author>
		<source>
			<title type="html">emacs org-mode on The Art Of Not Asking Why</title>
			<link rel="self" href="https://taonaw.com/categories/emacs-org-mode/feed.xml"/>
			<id>https://taonaw.com/categories/emacs-org-mode/</id>
		</source>
	</entry>

	<entry>
		<title type="html">Protesilaos Stavrou: Emacs: sxhkdrc-mode version 1.1.0</title>
		<link href="https://protesilaos.com/codelog/2024-12-24-emacs-sxhkdrc-mode-1-1-0/"/>
		<id>https://protesilaos.com/codelog/2024-12-24-emacs-sxhkdrc-mode-1-1-0/</id>
		<updated>2024-12-24T00:00:00+00:00</updated>
		<published></published>
		<content type="html">&lt;p&gt;This is a major mode for editing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sxhkdrc&lt;/code&gt; files. SXHKD is the Simple
X Hot Key Daemon which is commonly used in minimalist desktop sessions
on Xorg (I use it with bspwm, herbstluftwm, and i3wm). The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sxhkdrc&lt;/code&gt;
file configures key chords, binding them to commands. For the
technicalities, read the man page &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sxhkd(1)&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Package name (GNU ELPA): &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sxhkdrc-mode&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Git repositories:
    &lt;ul&gt;
      &lt;li&gt;GitHub: &lt;a href=&quot;https://github.com/protesilaos/sxhkdrc-mode&quot;&gt;https://github.com/protesilaos/sxhkdrc-mode&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;GitLab: &lt;a href=&quot;https://gitlab.com/protesilaos/sxhkdrc-mode&quot;&gt;https://gitlab.com/protesilaos/sxhkdrc-mode&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Backronym: Such Xenotropic Hot Keys Demonstrate Robustness and
Configurability … mode.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;p&gt;This is a small set of changes to an already stable package.&lt;/p&gt;

&lt;h2&gt;The Outline of a file is more refined&lt;/h2&gt;

&lt;p&gt;Each file now has an outline which consists of comment pseudo headings
(starting with three or more &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#&lt;/code&gt; followed by a space) and lines with a
key binding. Before it was just the comment headings.&lt;/p&gt;

&lt;p&gt;Additionally, the heading levels are defined such that key bindings
are inside the comment headings when we do the folding. This is what
we have in, for example, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;elisp-mode&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The built-in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;outline-minor-mode&lt;/code&gt; benefits from this change as do
third-party commands like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;consult-outline&lt;/code&gt; from the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;consult&lt;/code&gt;
package.&lt;/p&gt;

&lt;p&gt;For example, we can get &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;outline-minor-mode&lt;/code&gt; folding of 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;# Focus in the given direction. With Shift move the client in the
# given direction. With Ctrl resize the frame in the given direction.
mod4 + {_, shift +, ctrl +} {h,j,k,l}
    herbstclient {focus,shift,resize} {left,down,up,right} {_,_,0.05}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To 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;# Focus in the given direction. With Shift move the client in the
# given direction. With Ctrl resize the frame in the given direction.
mod4 + {_, shift +, ctrl +} {h,j,k,l}...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And the same idea for all heading levels.&lt;/p&gt;

&lt;h2&gt;Syntax highlighting includes the dot in command names&lt;/h2&gt;

&lt;p&gt;I made it so that when we bind a command to a key, we get its full
name highlighted even if that includes a file name extension. So now
the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;herbstluftwm_load_workspace_layout.sh&lt;/code&gt; in the following sample
will get colourised instead of the name without &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.sh&lt;/code&gt;:&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;mod4 + w ; {f,t,h,m}
    herbstluftwm_load_workspace_layout.sh {full,third,half,middle}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Another benefit of this refinement is that something like the built-in
command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mark-sexp&lt;/code&gt; will recognise the whole name as a syntactic unit.&lt;/p&gt;</content>
		<author>
			<name>Protesilaos Stavrou</name>
			<uri>https://protesilaos.com/codelog</uri>
		</author>
		<source>
			<title type="html">Protesilaos Stavrou: Coding blog</title>
			<subtitle type="html">Coding blog</subtitle>
			<link rel="self" href="https://protesilaos.com/codelog.xml"/>
			<id>https://protesilaos.com/codelog</id>
		</source>
	</entry>

	<entry>
		<title type="html">Alvaro Ramirez: Hello emacs.tv</title>
		<link href="https://lmno.lol/alvaro/hello-emacstv"/>
		<id>https://lmno.lol/alvaro/hello-emacstv</id>
		<updated>2024-12-23T17:39:57+00:00</updated>
		<published></published>
		<content type="html">&lt;div class=&quot;content&quot; id=&quot;content&quot;&gt;

 &lt;div class=&quot;outline-2&quot; id=&quot;outline-container-hello-emacstv&quot;&gt;
 &lt;h2 id=&quot;hello-emacstv&quot;&gt; &lt;span class=&quot;timestamp-wrapper&quot;&gt; &lt;span class=&quot;timestamp&quot;&gt;23 December 2024&lt;/span&gt;&lt;/span&gt; Hello emacs.tv&lt;/h2&gt;
 &lt;div class=&quot;outline-text-2&quot; id=&quot;text-hello-emacstv&quot;&gt;
 &lt;p&gt;
A few days ago,  &lt;a href=&quot;https://sachachua.com/blog/&quot;&gt;Sacha Chua&lt;/a&gt; mentioned how  &lt;a href=&quot;https://social.sachachua.com/@sacha/statuses/01JF94JQQNNRXMTKN3Y1774TFP&quot;&gt;cool it would be to have an Emacs video index&lt;/a&gt; like  &lt;a href=&quot;https://www.rubyvideo.dev/topics&quot;&gt;Ruby Video&lt;/a&gt;. I mentioned how I had similarly considered a low-tech solution, maybe powered by plain text (bonus points for  &lt;a href=&quot;https://orgmode.org/&quot;&gt;org mode&lt;/a&gt; of course).
&lt;/p&gt;

 &lt;p&gt;
A little later, Sacha  &lt;a href=&quot;https://social.sachachua.com/@sacha/statuses/01JFG5T3C6E88362DRDZN9ANA6&quot;&gt;shared a preliminary video feed dump&lt;/a&gt;, in org! With that, I wrote the  &lt;a href=&quot;https://indieweb.social/@xenodium/113682069315989397&quot;&gt;first experiment to render the org feed&lt;/a&gt; and  &lt;a href=&quot;https://emacs.tv/&quot;&gt;emacs.tv&lt;/a&gt; was born.
&lt;/p&gt;


 &lt;div class=&quot;figure&quot; id=&quot;orga8f3760&quot;&gt;
 &lt;p&gt; &lt;img alt=&quot;screenshot.png&quot; src=&quot;https://xenodium.com/images/hello-emacstv/screenshot.png&quot; width=&quot;50%&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;

 &lt;p&gt;
 &lt;a href=&quot;https://emacs.tv/&quot;&gt;emacs.tv&lt;/a&gt; is merely a few days old. Powered by an org feed (rendered client-side), but we can fetch and render in all sorts of ways.  &lt;a href=&quot;https://emacs.tv/&quot;&gt;emacs.tv&lt;/a&gt; brings it to the web, though I'm sure we can come up with all sorts of Emacs integrations. A new major mode? Or maybe convert the org feed to rss and plug into  &lt;a href=&quot;https://github.com/skeeto/elfeed&quot;&gt;elfeed&lt;/a&gt;?
&lt;/p&gt;

 &lt;p&gt;
This is what a feed entry looks like:
&lt;/p&gt;

 &lt;div class=&quot;org-src-container&quot;&gt;
 &lt;pre class=&quot;src src-org&quot;&gt;* EmacsConf.org: How we use Org Mode and TRAMP to organize and run a multi-track conference :emacsconf:emacsconf2023:org:tramp:
:PROPERTIES:
:DATE: 2023-12-03
:URL: https://emacsconf.org/2023/talks/emacsconf
:MEDIA_URL: https://media.emacsconf.org/2023/emacsconf-2023-emacsconf--emacsconforg-how-we-use-org-mode-and-tramp-to-organize-and-run-a-multitrack-conference--sacha-chua--main.webm
:YOUTUBE_URL: https://www.youtube.com/watch?v=uTregv3rNl0
:TOOBNIX_URL: https://toobnix.org/w/eX2dXG3xMtUHuuBz4fssGT
:TRANSCRIPT_URL: https://media.emacsconf.org/2023/emacsconf-2023-emacsconf--emacsconforg-how-we-use-org-mode-and-tramp-to-organize-and-run-a-multitrack-conference--sacha-chua--main.vtt
:SPEAKERS: Sacha Chua
:SERIES: EmacsConf 2023
:END:
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
 &lt;div class=&quot;outline-3&quot; id=&quot;outline-container-orgdc101e2&quot;&gt;
 &lt;h3 id=&quot;orgdc101e2&quot;&gt;We need your help&lt;/h3&gt;
 &lt;div class=&quot;outline-text-3&quot; id=&quot;text-orgdc101e2&quot;&gt;
 &lt;p&gt;
As mentioned, this is a new project. It's a good start, but it can only get better with your help.
&lt;/p&gt;
&lt;/div&gt;
 &lt;div class=&quot;outline-4&quot; id=&quot;outline-container-org93a2217&quot;&gt;
 &lt;h4 id=&quot;org93a2217&quot;&gt;Submit more content&lt;/h4&gt;
 &lt;div class=&quot;outline-text-4&quot; id=&quot;text-org93a2217&quot;&gt;
 &lt;p&gt;
Sacha kickstarted a  &lt;a href=&quot;https://raw.githubusercontent.com/emacstv/emacstv.github.io/refs/heads/main/videos.org&quot;&gt;wonderful video feed,&lt;/a&gt; a collection of 1715 videos as of today. We need more. Are your published videos missing? Reckon other videos should be listed? Please help by  &lt;a href=&quot;https://github.com/emacstv/emacstv.github.io#add-videos&quot;&gt;submitting&lt;/a&gt; new entries.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
 &lt;div class=&quot;outline-4&quot; id=&quot;outline-container-org4db7c41&quot;&gt;
 &lt;h4 id=&quot;org4db7c41&quot;&gt;Improve our tagging&lt;/h4&gt;
 &lt;div class=&quot;outline-text-4&quot; id=&quot;text-org4db7c41&quot;&gt;
 &lt;p&gt;
Many of the listed videos could use more tags. Please help us by tagging content in  &lt;a href=&quot;https://raw.githubusercontent.com/emacstv/emacstv.github.io/refs/heads/main/videos.org&quot;&gt;video.org&lt;/a&gt; and submit a  &lt;a href=&quot;https://github.com/emacstv/emacstv.github.io/pulls&quot;&gt;pull request&lt;/a&gt;.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
 &lt;div class=&quot;outline-4&quot; id=&quot;outline-container-org41cdcf4&quot;&gt;
 &lt;h4 id=&quot;org41cdcf4&quot;&gt;Take it for a spin&lt;/h4&gt;
 &lt;div class=&quot;outline-text-4&quot; id=&quot;text-org41cdcf4&quot;&gt;
 &lt;p&gt;
Or maybe just take  &lt;a href=&quot;https://emacs.tv/&quot;&gt;emacs.tv&lt;/a&gt; for a spin and  &lt;a href=&quot;https://github.com/emacstv/emacstv.github.io/issues&quot;&gt;give us some feedback&lt;/a&gt;.
&lt;/p&gt;

 &lt;p&gt;
Happy holidays! 🎄☃️
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content>
		<author>
			<name>Alvaro Ramirez</name>
			<uri>https://lmno.lol/alvaro</uri>
		</author>
		<source>
			<title type="html">Alvaro Ramirez's Emacs notes</title>
			<subtitle type="html">Alvaro's Emacs notes from a hacked up org HTML export.</subtitle>
			<link rel="self" href="https://xenodium.com/emacs/rss.xml"/>
			<id>https://lmno.lol/alvaro</id>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en-US">Irreal: 24 Emacs Packages To Try During The Holidays</title>
		<link href="https://irreal.org/blog/?p=12667"/>
		<id>https://irreal.org/blog/?p=12667</id>
		<updated>2024-12-23T16:15:28+00:00</updated>
		<published></published>
		<content type="html" xml:lang="en-US">&lt;p&gt;
Marie K. Ekeberg has a holiday gift for Emacs users: &lt;a href=&quot;https://themkat.net/2024/12/17/twenty_four_emacs_packages.html&quot;&gt;a list of 24 Emacs packages that you can try during the holidays&lt;/a&gt;. The list is interesting in that it doesn’t really have a theme other than that they’re packages that Ekeberg finds useful or interesting. Some of them are builtin, some of them are in MELPA / Gnu Elpa, and some of them aren’t in any ELPA repository.
&lt;/p&gt;
&lt;p&gt;
Some like Org-mode, Windmove, Magit, EXWM, Multiple cursors, and vterm will be familiar to most Emacs users but some may be new—at least they are to me. The first on the list is &lt;a href=&quot;https://github.com/larstvei/Try&quot;&gt;Try&lt;/a&gt;. Mike Zamansky often used it in his Emacs videos to try out a package without actually installing it. If you want to sample some of the offerings from the list, installing Try first is a good idea because it lets you experiment with a package without having to commit to it.
&lt;/p&gt;
&lt;p&gt;
Another very useful package is &lt;a href=&quot;https://elpa.gnu.org/packages/undo-tree.html&quot;&gt;undo-tree&lt;/a&gt;. It’s a little hard to get used to but it really will improve those times when you have to undo some text. It also rationalizes “redo”. That alone is worth installing it for.
&lt;/p&gt;
&lt;p&gt;
One package that I haven’t tried but that looks interesting is &lt;a href=&quot;https://github.com/larstvei/Focus&quot;&gt;focus&lt;/a&gt;. The idea is that text outside some configurable region get grayed out. I’m not sure it would work for me but it &lt;i&gt;does&lt;/i&gt; look interesting. It provides a perfect example of why you should install Try: you can experiment with it and if you don’t like what you see, it will disappear the next time you start Emacs.
&lt;/p&gt;
&lt;p&gt;
The list is worth taking a look at You may find something that will fit in with your workflow.&lt;/p&gt;</content>
		<author>
			<name>jcs</name>
			<uri>https://irreal.org/blog</uri>
		</author>
		<source>
			<title type="html">Emacs – Irreal</title>
			<subtitle type="html">The minds had long ago come up with a proper name for it; they called it the Irreal, but they thought of it as Infinite Fun. That was what they really knew it as. The Land of Infinite Fun. --Iain M. Banks, Excession</subtitle>
			<link rel="self" href="http://irreal.org/blog/?tag=emacs&amp;feed=rss2"/>
			<id>https://irreal.org/blog</id>
		</source>
	</entry>

	<entry>
		<title type="html">Marcin Borkowski: Watching variable changes</title>
		<link href="https://mbork.pl/2024-12-23_Watching_variable_changes"/>
		<id>https://mbork.pl/2024-12-23_Watching_variable_changes</id>
		<updated>2024-12-23T15:48:57+00:00</updated>
		<published></published>
		<content type="html">Today I have a short Elisp trick, probably slightly more interesting than useful, but still. A long time ago I wrote about some debugging capabilities of Emacs Lisp. The feature mentioned in the last of these posts, debug-on-variable-change, allows to invoke the debugger whenever some Elisp code changes the value of a variable (with a few minor limitations). What I didn’t mention then is that you can actually do things other than start the Emacs debugger when a variable’s value changes.</content>
		<author>
			<name>Marcin Borkowski</name>
			<uri>https://mbork.pl/Homepage</uri>
		</author>
		<source>
			<title type="html">Marcin Borkowski:  Content AND Presentation</title>
			<subtitle type="html">Strona domowa Marcina Borkowskiego</subtitle>
			<link rel="self" href="https://mbork.pl/?action=rss;rcfilteronly=CategoryEmacs;all=0;showedit=0;title=%20Content%20AND%20Presentation"/>
			<id>https://mbork.pl/Homepage</id>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en-US">Sacha Chua: 2024-12-23 Emacs news</title>
		<link href="https://sachachua.com/blog/2024/12/2024-12-23-emacs-news/"/>
		<id>https://sachachua.com/blog/2024/12/2024-12-23-emacs-news/</id>
		<updated>2024-12-23T15:27:13+00:00</updated>
		<published></published>
		<content type="html">&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;Help wanted:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://list.orgmode.org/87a5cr7dn9.fsf@localhost&quot;&gt;Org Mode requests: [FR] Allow SPC to scroll todo/tag selection menu - for users with huge accessible fonts (was: Transient: accessibility problems for users who need to use large fonts)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Emacs updates:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://lists.gnu.org/archive/html/emacs-devel/2024-12/msg00869.html&quot;&gt;Emacs 30.0.93 pretest is available&lt;/a&gt; (&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hihzl9/emacs_30093_pretest_is_available/&quot;&gt;Reddit&lt;/a&gt;, &lt;a href=&quot;https://irreal.org/blog/?p=12663&quot;&gt;Irreal&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=yDVj75fC2pQ&quot;&gt;Emacs 31 News Stream VOD&lt;/a&gt; (01:26:53)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Upcoming events (&lt;a href=&quot;https://emacslife.com/calendar/emacs-calendar.ics&quot;&gt;iCal file&lt;/a&gt;, &lt;a href=&quot;https://emacslife.com/calendar/&quot;&gt;Org&lt;/a&gt;):
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;Emacs Berlin (virtual, in English) &lt;a href=&quot;https://emacs-berlin.org/&quot;&gt;https://emacs-berlin.org/&lt;/a&gt; Wed Dec 25 0930 America/Vancouver - 1130 America/Chicago - 1230 America/Toronto - 1730 Etc/GMT - 1830 Europe/Berlin - 2300 Asia/Kolkata – Thu Dec 26 0130 Asia/Singapore&lt;/li&gt;
&lt;li&gt;Emacs APAC (virtual) &lt;a href=&quot;https://emacs-apac.gitlab.io/&quot;&gt;https://emacs-apac.gitlab.io/&lt;/a&gt; Sat Dec 28 0030 America/Vancouver - 0230 America/Chicago - 0330 America/Toronto - 0830 Etc/GMT - 0930 Europe/Berlin - 1400 Asia/Kolkata - 1630 Asia/Singapore (&lt;a href=&quot;https://emacs-apac.gitlab.io/announcements/december-2024/&quot;&gt;announcement&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;M-x Research: TBA &lt;a href=&quot;https://m-x-research.github.io/&quot;&gt;https://m-x-research.github.io/&lt;/a&gt; Fri Jan 3 0800 America/Vancouver - 1000 America/Chicago - 1100 America/Toronto - 1600 Etc/GMT - 1700 Europe/Berlin - 2130 Asia/Kolkata – Sat Jan 4 0000 Asia/Singapore&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://events.ccc.de/congress/2024/hub/en/event/emacs-usermeetup/&quot;&gt;🧠💻 Emacs User Meetup - 38C3&lt;/a&gt; (&lt;a href=&quot;https://social.tchncs.de/@cabhan/113680360792934598&quot;&gt;@cabhan@social.tchncs.de&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Emacs configuration:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rahuljuliato.com/posts/multiple-eln-cache&quot;&gt;How to Share Your Emacs Configuration Between Different Machines (and Architectures) with Native Compilation&lt;/a&gt; (&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hgjra6/how_to_share_your_emacs_configuration_between/&quot;&gt;Reddit&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Emacs Lisp:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/elisp/comments/1hhmezr/bringing_emacs_introspection_debugging_to_casual/&quot;&gt;Bringing Emacs Introspection &amp;amp; Debugging to Casual Suite&lt;/a&gt; (&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hhmfab/bringing_emacs_introspection_debugging_to_casual/&quot;&gt;Reddit&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/distichum/callnum&quot;&gt;callnum.el; Sort library call numbers&lt;/a&gt; (&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hfrj8x/callnumel_sort_library_call_numbers/&quot;&gt;Reddit&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kisaragi-hiu.com/emacs-xml-encode/&quot;&gt;Kisaragi Hiu: Emacs: turning parsed XML/HTML nodes back into text (encoding/printing/writing it out)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Appearance:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://techhub.social/@Anoncheg/113688185961229577&quot;&gt;Change theme by sunrise and sunset with circadian package&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/konrad1977/neofusion-emacs&quot;&gt;konrad1977/neofusion-emacs: Emacs port for NeoFusion theme from Neovim&lt;/a&gt; (&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hkp9m9/new_theme_ported_from_neovim/&quot;&gt;Reddit&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://protesilaos.com/codelog/2024-12-17-emacs-standard-themes-tinted/&quot;&gt;Protesilaos Stavrou: Emacs: two new Standard themes (‘standard-light-tinted’ and ‘standard-dark-tinted’)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Navigation:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://takeonrules.com/2024/12/17/extending-built-in-emacs-bookmark-package/&quot;&gt;Extending Built-In Emacs Bookmark Package&lt;/a&gt; (&lt;a href=&quot;https://dice.camp/@takeonrules/113668314143293564&quot;&gt;@takeonrules@dice.camp&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://yummymelon.com/devnull/rethinking-minibuffer-movement.html&quot;&gt;Rethinking Minibuffer Movement&lt;/a&gt; (&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hhj98l/rethinking_minibuffer_movement/&quot;&gt;Reddit&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://breatheoutbreathe.in/blog/2024-12-19-query-regexp-replace-lisp-replacement.html&quot;&gt;Lisp expression replacements with query-regexp-replace&lt;/a&gt; (&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hifeca/lisp_expression_replacements_with/&quot;&gt;Reddit&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Dired:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hfrigu/automatic_fallback_to_sudo_for_local_dired/&quot;&gt;Automatic fallback to /sudo: for local dired commands&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Writing:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://gist.github.com/karthink/7d89df35ee9b7ac0c93d0177b862dadb&quot;&gt;Configuration for super-fast Latex input using AucTeX, CDLatex and a bit of YaSnippet. See karthinks.com/software/latex-input-for-impatient-scholars&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=eSmTN5jynvg&quot;&gt;Using Howm in Emacs for Notes and Tasks - System Crafters Live!&lt;/a&gt; (02:11:21)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Org Mode:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hj9iz2/new_package_orgrankerel_sort_org_headlines_by/&quot;&gt;New Package: org-ranker.el - sort org headlines by custom rules&lt;/a&gt; (&lt;a href=&quot;https://www.reddit.com/r/orgmode/comments/1hjgobm/new_package_orgrankerel_sort_org_headlines_by/&quot;&gt;Reddit&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/yibie/org-supertag&quot;&gt;Org-supertag v0.0.2 released - enhance tag system of org-mode&lt;/a&gt; (&lt;a href=&quot;https://www.reddit.com/r/orgmode/comments/1hif4cr/orgsupertag_v002_released/&quot;&gt;Reddit&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=I5VNszZaOIA&quot;&gt;Emacs Org Attach Various Methods 2024_12_17_14:56:08&lt;/a&gt; (04:04)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/positron-solutions/dslide/releases/tag/v0.6.0&quot;&gt;DSLiDE v0.6.0  Your slides now play keyboard macros&lt;/a&gt; (&lt;a href=&quot;https://www.reddit.com/r/orgmode/comments/1hge9bo/dslide_v060_your_slides_now_play_keyboard_macros/&quot;&gt;Reddit&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thanosapollo.org/posts/org-gnosis-progress-1/&quot;&gt;Thanos Apollo: Progress update on org-gnosis &amp;amp; a graphical interface addition.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hjj09d/what_is_desireable_in_an_org_to_html_framework/&quot;&gt;What is desireable in an Org to HTML framework?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://breatheoutbreathe.in/blog/2024-12-16-mirror-worg-to-a-hyperdrive.html&quot;&gt;How to mirror worg to a hyperdrive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.emacsuser.org/emacs/&quot;&gt;How I use Emacs to publish &quot;food&quot; recipes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Completion:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://rahuljuliato.com/posts/in-buffer-icomplete&quot;&gt;Rahul Juliato: Enhancing icomplete-vertical-mode in Emacs&lt;/a&gt; (&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hhy6n9/enhancing_icompleteverticalmode_in_emacs/&quot;&gt;Reddit&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Coding:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://metaredux.com/posts/2024/12/23/state-of-cider-2024.html&quot;&gt;Meta Redux: State of CIDER Survey (2024)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://archive.casouri.cc/note/2024/emacs-30-tree-sitter&quot;&gt;Tree-sitter Changes in Emacs 30&lt;/a&gt; (&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hiwm8j/treesitter_changes_in_emacs_30/&quot;&gt;Reddit&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gitlab.com/skybert/my-little-friends/-/blob/master/emacs/.emacs#L542&quot;&gt;Run JUnit method or class at point&lt;/a&gt; (&lt;a href=&quot;https://hachyderm.io/@skybert/113679416976496391&quot;&gt;@skybert@hachyderm.io&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=gMb6VTqUE10&quot;&gt;Трошки про Emacs&lt;/a&gt; (21:31) - Clojure&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mclare.blog/posts/using-uv-in-emacs/&quot;&gt;Using uv in Emacs | MClare Blog&lt;/a&gt; - python environment&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=IWyat0bbCss&quot;&gt;Xah Talk Show 2024-12-21 Ep605. Run Code of Python JS Fsharp Etc in Emacs. Are You Based?&lt;/a&gt; (53:31)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://fediverse.tv/w/bCw6xPvs1n8c68jKqFBEgW&quot;&gt;Bases de Datos-SQLite en GNU Emacs - encuentro/taller - FTV&lt;/a&gt; (&lt;a href=&quot;https://fosstodon.org/@hispaemacs/113698030498809368&quot;&gt;@hispaemacs@fosstodon.org&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Math:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://codelearn.me/2024/12/22/emacs-quick-calc.html&quot;&gt;Ruslan Bekenev: Emacs: quick-calc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Web:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://dice.camp/@takeonrules/113668410028513504&quot;&gt;TIL eww-copy-alternate-url&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alphapapa/unpackaged.el/blob/master/unpackaged.el#L1623-L1675&quot;&gt;eww-readable + imenu = quickly jump to different headings in webpage&lt;/a&gt; (&lt;a href=&quot;https://fosstodon.org/@marcc/113678792712925717&quot;&gt;@marcc@fosstodon.org&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://takeonrules.com/2024/12/18/adding-html5-display-block-elements-to-emacs-shr-and-eww-tag-rendering/&quot;&gt;Adding HTML5 Display Block Elements to Emacs’ SHR (and EWW) Tag Rendering // Take on Rules&lt;/a&gt; (&lt;a href=&quot;https://dice.camp/@takeonrules/113674326454421331&quot;&gt;@takeonrules@dice.camp&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Mail, news, and chat:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://todon.nl/@mousebot/113701769399574182&quot;&gt;mastodon.el 1.1.8: adds support for link-hint, bugfixes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://codeberg.org/glenneth/discourse-emacs&quot;&gt;glenneth/discourse-emacs: A modern Emacs package for seamless Discourse forum integration.&lt;/a&gt; (&lt;a href=&quot;https://techhub.social/@barocio/113666382496309705&quot;&gt;@barocio@techhub.social&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Multimedia:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://emacs.tv/&quot;&gt;emacs.tv&lt;/a&gt; (&lt;a href=&quot;https://lmno.lol/alvaro/hello-emacstv&quot;&gt;Hello emacs.tv&lt;/a&gt;, 1700+ videos)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sachachua.com/blog/2024/12/subed-el-tweaking-subtitle-times/&quot;&gt;Sacha Chua: subed.el: Tweaking subtitle times&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;EXWM:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.maketecheasier.com/use-emacs-as-desktop-environment-linux/&quot;&gt;How to Use Emacs as a Desktop Environment in Linux with EXWM - Make Tech Easier&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;AI:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hkex1q/llm_version_020_released_with_structured_json/&quot;&gt;llm version 0.20 released, with structured JSON output&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://indieweb.social/@xenodium/113673438068184091&quot;&gt;chatgpt-shell: LaTeX rendering now turned on by default on LLM shell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/lepisma/onnx.el&quot;&gt;lepisma/onnx.el: ONNX runtime for Emacs Lisp&lt;/a&gt; (&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hg5r5n/onnxel_onnx_runtime_binding_for_emacs_lisp/&quot;&gt;Reddit&lt;/a&gt;) - optimized and portable ML on the edge, also interchange format for neural network models&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Community:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hgx486/weekly_tips_tricks_c_thread_20241218_week_51/&quot;&gt;Weekly Tips, Tricks, &amp;amp;c. Thread — 2024-12-18 / week 51&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=u7DW78ng9Cg&quot;&gt;00: Why You Want Programmable Tools&lt;/a&gt; (04:36, &lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hkk5bn/a_cool_video_about_emacs/&quot;&gt;Reddit&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hhxf8x/what_can_we_learn_from_neovims_rise_in_popularity/&quot;&gt;What can we learn from Neovim’s rise in popularity?&lt;/a&gt; (&lt;a href=&quot;https://news.ycombinator.com/item?id=42465428&quot;&gt;HN&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Other:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://emacs.dyerdwelling.family/emacs/20241219132107-emacs--calculate-number-of-days-between-two-dates/&quot;&gt;James Dyer: Calculate Number Of Days Between Two Dates&lt;/a&gt; - calendar-count-days-region&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/glotlabs/gdrive&quot;&gt;glotlabs/gdrive: Google Drive CLI Client&lt;/a&gt; (&lt;a href=&quot;https://todon.nl/@mousebot/113668699737441680&quot;&gt;@mousebot@todon.nl&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lifeofpenguin.blogspot.com/2024/09/html-renderer.html#masonry&quot;&gt;HTML Renderer (Emacs)&lt;/a&gt; - Masonry (&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hh3xjz/html_renderer_masonry/&quot;&gt;Reddit&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lifeofpenguin.blogspot.com/2024/09/html-renderer.html&quot;&gt;HTML Renderer (Emacs)&lt;/a&gt; - colspan (&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hg4z69/html_renderer_colspan/&quot;&gt;Reddit&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://themkat.net/2024/12/17/twenty_four_emacs_packages.html&quot;&gt;Marie K. Ekeberg: 24 Emacs packages and utilities to try while counting down to Jul/Christmas/Holidays&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/positron-solutions/moc/&quot;&gt;positron-solutions/moc: Master of Ceremonies. Display &amp;amp; presentation utilities to make presentation packages more effective&lt;/a&gt; (&lt;a href=&quot;https://private-user-images.githubusercontent.com/73710933/398084554-69b2d887-be79-440b-92df-cc34994eec20.mp4?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzQ5NDM3MTQsIm5iZiI6MTczNDk0MzQxNCwicGF0aCI6Ii83MzcxMDkzMy8zOTgwODQ1NTQtNjliMmQ4ODctYmU3OS00NDBiLTkyZGYtY2MzNDk5NGVlYzIwLm1wND9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDEyMjMlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQxMjIzVDA4NDMzNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTUwYmE0ODJiZjVhM2U3ZDIwNWJjNDFhNTE1NWEyOGU2ZDE4NzA3YWUxNGIyNzA5Y2FiMTUwZmJkYTdlNDhmZGUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.8_QToA2wx27lRkczLt0UWFstFAHHKD2Hmtm1Ys4f39I&quot;&gt;Video&lt;/a&gt;, &lt;a href=&quot;https://www.reddit.com/r/elisp/comments/1hkjgvw/ann_moc_buffer_text_to_video_presentation_content/&quot;&gt;Reddit&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/elisp/comments/1hg1m5r/the_semantics_and_broad_strokes_of_buffer/&quot;&gt;The Semantics and Broad Strokes of Buffer Parallelism&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://andreyor.st/posts/2024-12-20-extending-emacs-with-fennel/&quot;&gt;Andrey Listopadov: Extending Emacs with Fennel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Emacs development:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;emacs-devel:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://lists.gnu.org/archive/html/emacs-devel/2024-12/msg00980.html&quot;&gt;Re: Some experience with the igc branch&lt;/a&gt; next impediments for IGC branch&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lists.gnu.org/archive/html/emacs-devel/2024-12/msg00687.html&quot;&gt;Merging scratch/no-purespace to remove unexec and purespace&lt;/a&gt; - discussion, preparing to merge&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lists.gnu.org/archive/html/emacs-devel/2024-12/msg00951.html&quot;&gt;Re: Merging scratch/no-purespace to remove unexec and purespace&lt;/a&gt; - ideas
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://lists.gnu.org/archive/html/emacs-devel/2024-12/msg00965.html&quot;&gt;Re: Merging scratch/no-purespace to remove unexec and purespace&lt;/a&gt; - hints/guesses vs promises&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=961cff855a9eccb9c2de31edc7d90ce697ebb65d&quot;&gt;* lisp/vc/smerge-mode.el (smerge-extend): New command (bug#74509)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=fd529bbd076d14087d70c50d94bc9ef231cf1997&quot;&gt;Add support for the ':data' keyword for play-sound in MS-Windows.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=308d5d54737917d449bfc0bf80815537eef69446&quot;&gt;'seconds-to-string': new optional arguments for readable strings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=c19dd8e9d6c54080426623129a824e5bb2fcf7be&quot;&gt;Add more documentation for TTY child frames&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=b156a69eec8af26991ede5c5bc2d7fbcd8dba134&quot;&gt;NEWS entry for the removal of `redisplay-dont-pause'&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=a8c83b496b3f98ad0be835d772a36f75c47d693e&quot;&gt;NEWS entry for tty child frames&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=d930d7f8651897dc3130ff16731751691566d490&quot;&gt;New treesit thing 'sexp-list' (bug#73404)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=4415102b573bb776e7f256633626f798b2ab9f28&quot;&gt;Delete support for the Conkeror web browser&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=14a3dd6a30f7a720f29d51f2df8f8ab8138989a0&quot;&gt;New user option browse-url-transform-alist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=3d3c1094604ceb6133a15226aec9b568f7923ee7&quot;&gt;Make font-lock face variables obsolete&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=69facd33a80bee3f49b0518e75e8ec570978334c&quot;&gt;Rename the property 'repeat-continue-only' to 'repeat-continue'&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=2f4a7f5ec3c75641e2a3c66156c2783c5576b1d7&quot;&gt;; * etc/NEWS: Mention 'eager-display' for 'completion-category-overrides'.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=5a8adaeac81182f080b041a3a3840580c61213d2&quot;&gt;unintern: Drop support for obsolete calling convention&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=80dc431b5a453c8200260969c8e2904e2d353b1e&quot;&gt;all-completions: Drop support for obsolete calling convention&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=78b50603a25d8eb366deab92ce1f475aef497a64&quot;&gt;; * etc/NEWS: Add 'completion-table-with-metadata' to &quot;Lisp Changes&quot;.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=d2986e79b76d442f8620195a54120d8be3e4583c&quot;&gt;* lisp/comint.el (comint-complete-input-ring): New command (bug#74694).&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;New packages:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://melpa.org/#/copilot&quot; target=&quot;_blank&quot;&gt;copilot&lt;/a&gt;: An unofficial Copilot plugin (MELPA)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://elpa.gnu.org/packages/dicom.html&quot; target=&quot;_blank&quot;&gt;dicom&lt;/a&gt;: DICOM viewer - Digital Imaging &amp;amp; Communications in Medicine (GNU ELPA)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://melpa.org/#/kill-dollar-mode&quot; target=&quot;_blank&quot;&gt;kill-dollar-mode&lt;/a&gt;: Remove leading $ from shell-script-like text (MELPA)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://melpa.org/#/moc&quot; target=&quot;_blank&quot;&gt;moc&lt;/a&gt;: Master of Ceremonies (MELPA)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://melpa.org/#/ocaml-eglot&quot; target=&quot;_blank&quot;&gt;ocaml-eglot&lt;/a&gt;: An OCaml companion for Eglot (MELPA)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://melpa.org/#/p4-ts-mode&quot; target=&quot;_blank&quot;&gt;p4-ts-mode&lt;/a&gt;: Major mode for the P4_16 programming language (MELPA)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://melpa.org/#/russian-calendar&quot; target=&quot;_blank&quot;&gt;russian-calendar&lt;/a&gt;: Russian holidays and conferences. Updated 2024-11-22 (MELPA)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://melpa.org/#/symbol-overlay-mc&quot; target=&quot;_blank&quot;&gt;symbol-overlay-mc&lt;/a&gt;: Mark highlighted symbols with multiple cursors (MELPA)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://melpa.org/#/uv-mode&quot; target=&quot;_blank&quot;&gt;uv-mode&lt;/a&gt;: Integrate uv with python-mode (MELPA)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Links from &lt;a href=&quot;https://www.reddit.com/r/emacs&quot;&gt;reddit.com/r/emacs&lt;/a&gt;, &lt;a href=&quot;https://www.reddit.com/r/orgmode&quot;&gt;r/orgmode&lt;/a&gt;, &lt;a href=&quot;https://www.reddit.com/r/spacemacs&quot;&gt;r/spacemacs&lt;/a&gt;, &lt;a href=&quot;https://www.reddit.com/r/planetemacs&quot;&gt;r/planetemacs&lt;/a&gt;, &lt;a href=&quot;https://mastodon.social/tags/emacs&quot;&gt;Mastodon #emacs&lt;/a&gt;, &lt;a href=&quot;https://hn.algolia.com/?query=emacs&amp;amp;sort=byDate&amp;amp;prefix&amp;amp;page=0&amp;amp;dateRange=all&amp;amp;type=story&quot;&gt;Hacker News&lt;/a&gt;, &lt;a href=&quot;https://lobste.rs/search?q=emacs&amp;amp;what=stories&amp;amp;order=newest&quot;&gt;lobste.rs&lt;/a&gt;, &lt;a href=&quot;https://programming.dev/c/emacs?dataType=Post&amp;amp;page=1&amp;amp;sort=New&quot;&gt;programming.dev&lt;/a&gt;, &lt;a href=&quot;https://lemmy.world/c/emacs&quot;&gt;lemmy.world&lt;/a&gt;, &lt;a href=&quot;https://lemmy.ml/c/emacs?dataType=Post&amp;amp;page=1&amp;amp;sort=New&quot;&gt;lemmy.ml&lt;/a&gt;, &lt;a href=&quot;https://communick.news/c/emacs?dataType=Post&amp;amp;page=1&amp;amp;sort=New&quot;&gt;communick.news&lt;/a&gt;, &lt;a href=&quot;https://planet.emacslife.com&quot;&gt;planet.emacslife.com&lt;/a&gt;, &lt;a href=&quot;https://www.youtube.com/playlist?list=PL4th0AZixyREOtvxDpdxC9oMuX7Ar7Sdt&quot;&gt;YouTube&lt;/a&gt;, &lt;a href=&quot;http://git.savannah.gnu.org/cgit/emacs.git/log/etc/NEWS&quot;&gt;the Emacs NEWS file&lt;/a&gt;, &lt;a href=&quot;https://emacslife.com/calendar/&quot;&gt;Emacs Calendar&lt;/a&gt;, and &lt;a href=&quot;https://lists.gnu.org/archive/html/emacs-devel/2024-12&quot;&gt;emacs-devel&lt;/a&gt;. Thanks to Andrés Ramírez for emacs-devel links. Do you have an Emacs-related link or announcement? Please e-mail me at &lt;a href=&quot;mailto:sacha@sachachua.com&quot;&gt;sacha@sachachua.com&lt;/a&gt;. Thank you!&lt;/p&gt;
&lt;div&gt;&lt;a href=&quot;https://sachachua.com/blog/2024/12/2024-12-23-emacs-news/index.org&quot;&gt;View org source for this post&lt;/a&gt;&lt;/div&gt;</content>
		<author>
			<name>Sacha Chua</name>
			<uri>https://sachachua.com/blog/category/emacs/feed/index.xml</uri>
		</author>
		<source>
			<title type="html">Sacha Chua - category - emacs</title>
			<subtitle type="html">Emacs, sketches, and life</subtitle>
			<link rel="self" href="https://sachachua.com/blog/category/emacs/feed/index.xml"/>
			<id>https://sachachua.com/blog/category/emacs/feed/index.xml</id>
		</source>
	</entry>

	<entry>
		<title type="html">Meta Redux: State of CIDER Survey (2024)</title>
		<link href="https://metaredux.com/posts/2024/12/23/state-of-cider-2024.html"/>
		<id>https://metaredux.com/posts/2024/12/23/state-of-cider-2024.html</id>
		<updated>2024-12-23T12:48:00+00:00</updated>
		<published>2024-12-23T12:48:00+00:00</published>
		<content type="html">&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; You’ll find the survey &lt;a href=&quot;https://forms.gle/H24Z1Yk79mGAnAHn8&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It’s been a while since the first and only “State of CIDER” survey.&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a class=&quot;footnote&quot; href=&quot;https://metaredux.com/posts/2024/12/23/state-of-cider-2024.html#fn:1&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; Right
after it happened in the end of 2019, the world went to shit and I kind of
forgot about my intent to do the survey annually.  5 years later, it’s high
time we get back on track!&lt;/p&gt;

&lt;p&gt;CIDER has changed a lot in the past 5 years. nREPL has changed a lot. The development tooling Clojure
ecosystem has changed a lot. Even Emacs has changed a lot. I’m guessing your usage of CIDER has changed a lot as well. If you’re still
using Clojure and CIDER today, that is…&lt;/p&gt;

&lt;p&gt;You can find the new survey &lt;a href=&quot;https://forms.gle/H24Z1Yk79mGAnAHn8&quot;&gt;here&lt;/a&gt;.
We’ve made several updates to the questions - most notably there’s now a question about how frequently are you using certain CIDER features.&lt;/p&gt;

&lt;p&gt;I’ve been thinking a lot lately that perhaps we went overboard with the feature-set in CIDER and that it might be prudent to trim the fat
in CIDER 2.0, but we need data, so we can accurately know what’s being used and what’s not. I’ve also been thinking that mentioning many of
the less known features in the survey might provoke some people to try them out. We’ll see.&lt;/p&gt;

&lt;p&gt;There are other important questions that I like to get answers for, e.g.:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Can we drop support for Emacs 26 (and maybe even Emacs 27)?&lt;/li&gt;
  &lt;li&gt;Can we drop support for Java 8?&lt;sup id=&quot;fnref:2&quot;&gt;&lt;a class=&quot;footnote&quot; href=&quot;https://metaredux.com/posts/2024/12/23/state-of-cider-2024.html#fn:2&quot; rel=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
  &lt;li&gt;Do people think that CIDER improved in the last year?&lt;/li&gt;
  &lt;li&gt;How often are people upgrading their CIDER installation?&lt;/li&gt;
  &lt;li&gt;What problems are users encountering? What would they like to see added/changed/improved?&lt;/li&gt;
  &lt;li&gt;Are people willing to support the project in one way or another?&lt;sup id=&quot;fnref:3&quot;&gt;&lt;a class=&quot;footnote&quot; href=&quot;https://metaredux.com/posts/2024/12/23/state-of-cider-2024.html#fn:3&quot; rel=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
  &lt;li&gt;Is Figwheel still a thing in ClojureScript?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your responses will also be instrumental in shaping up the roadmap for CIDER 2.0.&lt;/p&gt;

&lt;p&gt;Last time around we got 545 responses and I hope this time around we’ll do a bit
better, as more responses mean that the data we got is more accurate. The new
survey is off to a pretty slow start - less than 200 responses in the first
week. It will likely stay open till the end of January, so I hope we are going
to get 500+ responses in total this around time as well.&lt;/p&gt;

&lt;p&gt;Thanks for taking the time to fill in the survey! This means a lot to me and our
team! I’d really appreciate it if you shared the survey on your social media
profiles, so more people see it and take part in it. Let’s make CIDER better together!&lt;/p&gt;

&lt;p&gt;That’s all I have for you today. Keep hacking!&lt;/p&gt;

&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;&lt;a href=&quot;https://metaredux.com/posts/2019/11/02/state-of-cider.html&quot;&gt;https://metaredux.com/posts/2019/11/02/state-of-cider.html&lt;/a&gt; &lt;a class=&quot;reversefootnote&quot; href=&quot;https://metaredux.com/posts/2024/12/23/state-of-cider-2024.html#fnref:1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot;&gt;
      &lt;p&gt;Who am I kidding here… I’m well aware we’ll be stuck supporting it for all eternity… &lt;a class=&quot;reversefootnote&quot; href=&quot;https://metaredux.com/posts/2024/12/23/state-of-cider-2024.html#fnref:2&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:3&quot;&gt;
      &lt;p&gt;The financial support the project has received eroded quite a lot in the last couple of years, which was somewhat disappointing given all the work that went into CIDER and its ecosystem. &lt;a class=&quot;reversefootnote&quot; href=&quot;https://metaredux.com/posts/2024/12/23/state-of-cider-2024.html#fnref:3&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;</content>
		<author>
			<name>Bozhidar Batsov</name>
			<uri>https://metaredux.com/</uri>
		</author>
		<source>
			<title type="html">Meta Redux</title>
			<subtitle type="html">Meta-x meta-redux</subtitle>
			<link rel="self" href="https://metaredux.com/feed.xml"/>
			<id>https://metaredux.com/feed.xml</id>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en-us">Alex Popescu: easysession.el Emacs Package for Handling Sessions</title>
		<link href="https://alpo.gitlab.io/jots/links/2024/12/easysession.el-emacs-package-for-handling-sessions/"/>
		<id>https://alpo.gitlab.io/jots/links/2024/12/easysession.el-emacs-package-for-handling-sessions/</id>
		<updated>2024-12-23T12:36:51+00:00</updated>
		<published></published>
		<content type="html">&lt;blockquote&gt;
&lt;p&gt;The author uses easysession.el by setting up each session to represent a
distinct project or a specific “view” on a particular project, including various
tabs (built-in tab-bar), window splits, dired buffers, and file editing buffers.
This organization allows for the creation of dedicated environments for
different tasks or aspects of a project, such as development, debugging,
specific issue, and documentation. The author switches between projects and
views of the same projects multiple times a day, and easysession.el helps
significantly by allowing quick transitions between them.&lt;/p&gt;&lt;/blockquote&gt;</content>
		<author>
			<name>Alex Popescu</name>
			<uri>https://alpo.gitlab.io/jots/tags/emacs/</uri>
		</author>
		<source>
			<title type="html">Emacs on jots. tl;dr</title>
			<subtitle type="html">Recent content in Emacs on jots. tl;dr</subtitle>
			<link rel="self" href="https://alpo.gitlab.io/jots/tags/emacs/index.xml"/>
			<id>https://alpo.gitlab.io/jots/tags/emacs/</id>
			<rights type="html">2024 jots. tl;dr by Alex Popescu</rights>
		</source>
	</entry>

	<entry>
		<title type="html">Kisaragi Hiu: Emacs: turning parsed XML/HTML nodes back into text (encoding/printing/writing it out)</title>
		<link href="https://kisaragi-hiu.com/emacs-xml-encode/"/>
		<id>https://kisaragi-hiu.com/emacs-xml-encode/</id>
		<updated>2024-12-23T07:47:15+00:00</updated>
		<published></published>
		<content type="html">TL;DR you might want shr-dom-print.
I wanted to write this down because it's kind of non-obvious.
To parse XML / HTML text into nodes, there are libxml-parse-xml-region and libxml-parse-html-region functions which return nodes that can be manipulated with, say, functions from dom.el. But after you got the right parse tree and want to write it out back into a text with XML tags, neither xml.c nor xml.el offer an option for that.</content>
		<author>
			<name>Kisaragi Hiu</name>
			<uri>https://kisaragi-hiu.com/</uri>
		</author>
		<source>
			<title type="html">Home on Kisaragi Hiu</title>
			<subtitle type="html">Recent content on https://kisaragi-hiu.com</subtitle>
			<link rel="self" href="https://kisaragi-hiu.com/index.xml"/>
			<id>https://kisaragi-hiu.com/</id>
		</source>
	</entry>

	<entry>
		<title type="html">Christian Tietze: Fold Search Results Away in rg.el</title>
		<link href="https://christiantietze.de/posts/2024/06/fold-search-results-away-in-rg-el/"/>
		<id>https://christiantietze.de/posts/2024/06/fold-search-results-away-in-rg-el/</id>
		<updated>2024-12-22T11:11:31+00:00</updated>
		<published>2024-06-07T12:44:28+00:00</published>
		<content type="html">&lt;p&gt;With the power of &lt;code&gt;outline-minor-mode&lt;/code&gt; in Emacs, you can turn any text buffer into an outline – with the killer feature of “cycling”, i.e. folding and unfolding outline elements.&lt;/p&gt;

&lt;p&gt;This includes &lt;a href=&quot;https://github.com/dajva/rg.el&quot;&gt;&lt;code&gt;rg.el&lt;/code&gt;-managed buffers&lt;/a&gt;, search results powered by ripgrep.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update 2024-06-07:&lt;/strong&gt; I changed the approach to a more robust regex! The form-feed insertion actually broke result navigation. &lt;code&gt;compilation-next-error&lt;/code&gt; in turn would expect &lt;em&gt;not&lt;/em&gt; to find a form-feed character at the start of a line. Working around that was more trouble.&lt;/p&gt;

&lt;p&gt;To tell &lt;code&gt;rg.el&lt;/code&gt; buffers which line is a ‘heading’ in terms of &lt;code&gt;outline-minor-mode&lt;/code&gt;, change the regular expression to match each line beginning with &lt;code&gt;&quot;File:&quot;&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;ct/rg-enable-folding&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&quot;Configure outline-minor-mode on file entries in rg.el results.&quot;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;setq-local&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;outline-regexp&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;^File: &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;outline-minor-mode&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;nv&quot;&gt;add-hook&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;'rg-filter-hook&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;#'&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ct/rg-enable-folding&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;define-key&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;rg-mode-map&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;kbd&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&amp;lt;tab&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;#'&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;outline-cycle&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;With that, you can run a search and zoom out to all files via &lt;code&gt;M-x outline-hide-sublevels&lt;/code&gt; and then zoom into each with a tab.&lt;/p&gt;

&lt;p&gt;Note that even though &lt;code&gt;outline-regexp&lt;/code&gt;’s documentation says that we can assume we’re at the beginning of a line etc., omitting the &lt;code&gt;^&lt;/code&gt; to denote the start of a line produces wonky results: it will fold, but sometimes, it would fold too much. I had file entries further down the buffer be folded away, too, and &lt;code&gt;outline-hide-sublevels&lt;/code&gt; would hide the complete buffer.&lt;/p&gt;

&lt;h2 id=&quot;my-previous-attempt-that-is-actually-broken-inserting-a-form-feed&quot;&gt;My Previous Attempt That Is Actually Broken: Inserting a Form Feed&lt;/h2&gt;

&lt;p&gt;The default &lt;code&gt;outline-regexp&lt;/code&gt; value contains the form-feed character. That gave me ideas&lt;/p&gt;

&lt;p&gt;I now decorate all &lt;code&gt;&quot;File:&quot;&lt;/code&gt; lines, prepending a form-feed character:&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;c1&quot;&gt;;;; Warning: this breaks navigation in result buffers!&lt;/span&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;ct/rg-add-form-feed&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&quot;Prepend a form feed character to all file match lines.&quot;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;save-excursion&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;goto-char&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;point-max&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;while&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;re-search-backward&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;^File: &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;goto-char&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;match-beginning&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;insert&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;�\n&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))))&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;;; Do not add the hook to a broken function! :) &lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;; (add-hook 'rg-filter-hook #'ct/rg-add-form-feed)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can enter a literal Unicode &lt;code&gt;0x0C FORM FEED (FF)&lt;/code&gt; character in Emacs by typing &lt;kbd&gt;C-q C-l&lt;/kbd&gt;. I did that. But that doesn’t render well on the blog, so the code uses &lt;a href=&quot;http://xahlee.info/emacs/emacs/elisp_unicode_representation_in_string.html&quot;&gt;Unicode escape sequences&lt;/a&gt;. (You could also use &lt;code&gt;&quot;\f&quot;&lt;/code&gt; I learned later!)&lt;/p&gt;

&lt;figure&gt;&lt;a href=&quot;https://christiantietze.de/posts/2024/06/fold-search-results-away-in-rg-el/outline-minor-mode-form-feed.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://christiantietze.de/posts/2024/06/fold-search-results-away-in-rg-el/outline-minor-mode-form-feed.png&quot; /&gt;&lt;/a&gt;&lt;figcaption&gt;Form-feed lines between results, with the topmost ones folded away&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;I do render my form-feeds as lines, by the way. &lt;a href=&quot;https://depp.brause.cc/form-feed/&quot;&gt;Check out &lt;code&gt;form-feed-mode&lt;/code&gt;&lt;/a&gt;; the code from my init file is:&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;form-feed&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;:ensure&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;:delight&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;custom-set-variables&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;form-feed-include-modes&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;prog-mode&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;text-mode&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;help-mode&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;compilation-mode&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;org-mode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&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;global-form-feed-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;hr /&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;https://christiantietze.de/hire-me/&quot;&gt;Hire me&lt;/a&gt; for freelance macOS/iOS work and consulting.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;https://christiantietze.de/apps/&quot;&gt;Buy&lt;/a&gt; my apps.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;https://christiantietze.de/newsletter/&quot;&gt;Receive&lt;/a&gt; new posts via email.&lt;/small&gt;&lt;/p&gt;</content>
		<author>
			<name>Christian Tietze</name>
			<uri>https://christiantietze.de/</uri>
		</author>
		<source>
			<title type="html">Posts tagged 'emacs' by Christian Tietze</title>
			<link rel="self" href="https://christiantietze.de/posts/tags/emacs/feed.atom"/>
			<id>https://christiantietze.de/</id>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en">whatacold: Getting Started with Cider for Clojure Programming</title>
		<link href="https://whatacold.io/blog/2024-12-22-getting-started-with-cider/"/>
		<id>https://whatacold.io/blog/2024-12-22-getting-started-with-cider/</id>
		<updated>2024-12-22T09:17:15+00:00</updated>
		<published></published>
		<content type="html">Here is the outline for my cider tutorial on YouTube, covering basic things you need to know to get started with cider, and starting exploring the fun of clojure programming with the REPL-driven programming approach.
Jack In to a REPL C-c M-j (cider-jack-in-clj) start a nREPL and jack in. It works in a project or with a sole .clj file. M-x cider-connect-clj run the command and then fill in hostname and port.</content>
		<author>
			<name>Ken Huang</name>
			<email>whatacold@gmail.com</email>
			<uri>https://whatacold.io/tags/emacs/</uri>
		</author>
		<source>
			<title type="html">Emacs on Ken Huang</title>
			<subtitle type="html">Recent content in Emacs on Ken Huang</subtitle>
			<link rel="self" href="https://whatacold.io/tags/emacs/rss.xml"/>
			<id>https://whatacold.io/tags/emacs/</id>
		</source>
	</entry>

	<entry>
		<title type="html">Ruslan Bekenev: Emacs: quick-calc</title>
		<link href="https://codelearn.me/2024/12/22/emacs-quick-calc.html"/>
		<id>https://codelearn.me/2024/12/22/emacs-quick-calc.html</id>
		<updated>2024-12-22T00:00:00+00:00</updated>
		<published>2024-12-22T00:00:00+00:00</published>
		<content type="html">&lt;p&gt;You probably have heard about famous emacs &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;M-x calc&lt;/code&gt;.
I always wanted to become a poweruser of it but never could. My needs are too simple for it, I just want to quickly add/subtract numbers.&lt;/p&gt;

&lt;p&gt;Recently I’ve discovered built-in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;M-x quick-calc&lt;/code&gt; which is perfect for what I need. It is already bound to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C-x * q&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can quickly calculate what’s needed
and the result is going to be saved to the kill-ring. You can paste the result in place if you want by prefixing the command with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C-u&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://codelearn.me/assets/img/emacs-quick-calc-1.png&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;emacs quick calc expression&quot; src=&quot;https://codelearn.me/assets/img/emacs-quick-calc-1.png&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;https://codelearn.me/assets/img/emacs-quick-calc-2.png&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;emacs quick calc result&quot; src=&quot;https://codelearn.me/assets/img/emacs-quick-calc-2.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Emacs has everything :)&lt;/p&gt;</content>
		<author>
			<name>Ruslan Bekenev</name>
			<uri>https://codelearn.me/</uri>
		</author>
		<source>
			<title type="html">Ruslan’s tech blog</title>
			<subtitle type="html">Software development related stuff</subtitle>
			<link rel="self" href="https://codelearn.me/feed/by_tag/emacs.xml"/>
			<id>https://codelearn.me/feed/by_tag/emacs.xml</id>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en-us">Arne Bahlo: My favorite things of 2024</title>
		<link href="https://arne.me/blog/favorites-2024"/>
		<id>https://arne.me/blog/favorites-2024</id>
		<updated>2024-12-22T00:00:00+00:00</updated>
		<published></published>
		<content type="html" xml:lang="en-us">&lt;p&gt;Here are my favorite things, digital and physical, of 2024!&lt;/p&gt;
&lt;h2&gt;&lt;a class=&quot;anchor&quot; href=&quot;https://arne.me/blog/feed.xml#music&quot; id=&quot;music&quot;&gt;&lt;/a&gt;Music&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PL8tkzXKlhGxltN2yyQwjlkd6jZVknhj9l&quot;&gt;I Love You So F***ing Much by Glass Animals&lt;/a&gt;:
One of my favorite bands, every single album is amazing. and this is no
exception.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PL3roRV3JHZzbatp5PvE-88ApmVishqGHN&quot;&gt;Clancy by Twenty One Pilots&lt;/a&gt;:
There’s artists with unique story telling and then there’s Twenty One Pilots.
I really like this album.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PLlqZM4covn1HF92FlF7W5nUI_Ixh2m3Rk&quot;&gt;From Zero by Linkin Park&lt;/a&gt;:
This sounds like Hybrid Theory reloaded—which is a good thing—and I love that they’re back.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PLgpybwCcUnBV9ydEM2ReIB1ycE3BxAX_4&quot;&gt;Older (and Wiser)&lt;/a&gt;:
This is the music you want to hear on long train rides through the country
side and on long winter evenings.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a class=&quot;anchor&quot; href=&quot;https://arne.me/blog/feed.xml#books&quot; id=&quot;books&quot;&gt;&lt;/a&gt;Books&lt;/h2&gt;
&lt;p&gt;These links go to my reviews (no spoilers):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://arne.me/library/piranesi&quot;&gt;Piranesi by Susanna Clarke&lt;/a&gt;: One of the best books I’ve
ever read.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arne.me/library/project-hail-mary&quot;&gt;Project Hail Mary by Andy Weir&lt;/a&gt;: Loved the book
and told everyone about it after reading it.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arne.me/library/leviathan-wakes&quot;&gt;The Expanse series by James S. A. Corey&lt;/a&gt;: 7 books
plus a few novellas. Couldn’t stop reading!&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arne.me/library/useful-not-true&quot;&gt;Useful Not True by Derek Sivers&lt;/a&gt;: One of the books
that change how you think about the world, incredible read.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a class=&quot;anchor&quot; href=&quot;https://arne.me/blog/feed.xml#apps&quot; id=&quot;apps&quot;&gt;&lt;/a&gt;Apps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://tilo.dev/manet/&quot;&gt;Manet&lt;/a&gt;: I’ve started buying my music and hosting it
myself this year&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a data-footnote-ref=&quot;data-footnote-ref&quot; href=&quot;https://arne.me/blog/feed.xml#fn-1&quot; id=&quot;fnref-1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;, this app makes it a joy to listen to music.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://couchtim.es&quot;&gt;CouchTimes&lt;/a&gt;: The best TV show tracker in the App
Store, period. It doesn’t have feature bloat and it respects your privacy.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mitchellh.com/ghostty&quot;&gt;Ghostty&lt;/a&gt;: A super fast, new Terminal emulator
for the Mac.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://halide.cam&quot;&gt;Halide&lt;/a&gt;: This camera app has been around for a while, but
this year they released &lt;em&gt;Process Zero&lt;/em&gt;, a mode that applies minimal
corrections and makes photos look more like digital camera photos.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a class=&quot;anchor&quot; href=&quot;https://arne.me/blog/feed.xml#goods&quot; id=&quot;goods&quot;&gt;&lt;/a&gt;Goods&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://aranet.com/en/home/products/aranet4-home&quot;&gt;aranet4&lt;/a&gt;: There are cheaper
options, but a CO&lt;sub&gt;2&lt;/sub&gt; monitor for my home office has helped me
keep the air at good levels.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://heat-it.com&quot;&gt;heat-it&lt;/a&gt;: This tiny tool draws power from your phone
to relieve itch &amp;amp; pain from insect bites.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.leatherman.com/de_DE/2h-wave-638.html&quot;&gt;Leatherman 2H Wave+&lt;/a&gt;:
The only big Leatherman that’s legal to carry in Germany, super versatile and
handy to have around.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What were your favorites?&lt;/p&gt;
&lt;section class=&quot;footnotes&quot; data-footnotes=&quot;data-footnotes&quot;&gt;
&lt;ol&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;I even wrote &lt;a href=&quot;https://arne.me/blog/diy-music-streaming-with-nixos-and-jellyfin&quot;&gt;a blogpost&lt;/a&gt;
about it. &lt;a class=&quot;footnote-backref&quot; data-footnote-backref=&quot;data-footnote-backref&quot; data-footnote-backref-idx=&quot;1&quot; href=&quot;https://arne.me/blog/feed.xml#fnref-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content>
		<author>
			<name>Arne Bahlo</name>
			<uri>https://arne.me</uri>
		</author>
		<source>
			<title type="html">Arne Bahlo</title>
			<subtitle type="html">Arne Bahlo's personal website</subtitle>
			<link rel="self" href="https://arne.me/blog/feed.xml"/>
			<id>https://arne.me</id>
			<rights type="html">2021 – 2024 Arne Bahlo</rights>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en-US">Irreal: Emacs 30.0.93</title>
		<link href="https://irreal.org/blog/?p=12663"/>
		<id>https://irreal.org/blog/?p=12663</id>
		<updated>2024-12-21T16:20:27+00:00</updated>
		<published></published>
		<content type="html" xml:lang="en-US">&lt;p&gt;
Andrea Corallo writes with some good news: &lt;a href=&quot;https://lists.gnu.org/archive/html/emacs-devel/2024-12/msg00869.html&quot;&gt;Emacs 30.0.93, the third pretest for Emacs 30.1&lt;/a&gt; is now available for download and testing. The developers are hoping that this is the last pretest before the final release procedure begins.
&lt;/p&gt;
&lt;p&gt;
This should serve as a definitive answer to those who keep insisting that Emacs is dead technology. The update cycle is robust and ongoing. Indeed, I would claim that it’s optimal. The project is not releasing updates every month as a new, incomplete project would, but neither is the project moribund. Rather, it makes fairly consistent yearly major updates as well as bug fix releases in between.
&lt;/p&gt;
&lt;p&gt;
If you don’t mind living on the edge, download and test the new pretest. It will help move the release process forward and get us to Emacs 30 sooner. Even if you can’t help test the new release, raise a glass to the developers who work so hard for nothing besides the love of their work that makes all our lives better.&lt;/p&gt;</content>
		<author>
			<name>jcs</name>
			<uri>https://irreal.org/blog</uri>
		</author>
		<source>
			<title type="html">Emacs – Irreal</title>
			<subtitle type="html">The minds had long ago come up with a proper name for it; they called it the Irreal, but they thought of it as Infinite Fun. That was what they really knew it as. The Land of Infinite Fun. --Iain M. Banks, Excession</subtitle>
			<link rel="self" href="http://irreal.org/blog/?tag=emacs&amp;feed=rss2"/>
			<id>https://irreal.org/blog</id>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en-US">Irreal: Don’t Leave Home Without It</title>
		<link href="https://irreal.org/blog/?p=12661"/>
		<id>https://irreal.org/blog/?p=12661</id>
		<updated>2024-12-20T17:25:27+00:00</updated>
		<published></published>
		<content type="html" xml:lang="en-US">&lt;p&gt;
&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hhw3kz/never_leave_home_without_it/&quot;&gt;This post&lt;/a&gt; doesn’t rise to the Red Meat Friday level but it did amuse me. Like all such memes, it captures an essential truth. The “essential truth” here is that Elisp is the glue that you can use to bind together various Emacs functions—including those you write yourself—to enable bespoke functionality specifically tailored to your workflow.
&lt;/p&gt;
&lt;p&gt;
I often see n00bs saying that they don’t know Elisp and that it’s too much of a chore to learn it. I don’t understand that. Elisp is relatively easy to learn, enables you to make the most of Emacs, and also opens the world of Lisp and all its wonders to you. Why &lt;i&gt;wouldn’t&lt;/i&gt; you want to learn it?
&lt;/p&gt;
&lt;p&gt;
I sometimes hear that Elisp is currently the most used Lisp. I don’t know if that’s true but I’d certainly have no trouble believing it. In addition to enabling custom Emacs functionality, I often use it for one-off calculations because it’s easy, Lisp, and built into my editor. More and more, I use Elisp as my go to language for one-offs.
&lt;/p&gt;
&lt;p&gt;
If you’re an Emacs user and don’t already know Elisp, I urge you to consider learning it.  It will pay you dividends.&lt;/p&gt;</content>
		<author>
			<name>jcs</name>
			<uri>https://irreal.org/blog</uri>
		</author>
		<source>
			<title type="html">Emacs – Irreal</title>
			<subtitle type="html">The minds had long ago come up with a proper name for it; they called it the Irreal, but they thought of it as Infinite Fun. That was what they really knew it as. The Land of Infinite Fun. --Iain M. Banks, Excession</subtitle>
			<link rel="self" href="http://irreal.org/blog/?tag=emacs&amp;feed=rss2"/>
			<id>https://irreal.org/blog</id>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en-us">Andrey Listopadov: Extending Emacs with Fennel</title>
		<link href="https://andreyor.st/posts/2024-12-20-extending-emacs-with-fennel/"/>
		<id>https://andreyor.st/posts/2024-12-20-extending-emacs-with-fennel/</id>
		<updated>2024-12-20T00:23:00+00:00</updated>
		<published></published>
		<content type="html">&lt;p&gt;After watching this year’s EmacsConf and seeing Guile Emacs being resurrected I thought to myself - why limit ourselves to Guile?
Sure, Guile isn’t just a Scheme implementation, thanks to its compiler-tower-based design.
Other languages exist for Guile VM, such as Emacs Lisp, and Guile manual lists the following languages with various stages of completeness:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ECMAScript&lt;/li&gt;
&lt;li&gt;Brainfuck&lt;/li&gt;
&lt;li&gt;Lua&lt;/li&gt;
&lt;li&gt;Ruby&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sure, it would be nice, if Emacs could natively run all of these, but we have to understand, that Guile Lua is not PUC Lua.
Even LuaJIT has difficulties maintaining full compatibility with modern releases of Lua, having us stuck in the realm somewhere between Lua 5.1 and 5.2, while PUC Lua is already 5.4.
Future releases would bring more differences, making PUC Lua and Luajit diverge even more.&lt;/p&gt;
&lt;p&gt;And Lua is a &lt;em&gt;simple&lt;/em&gt; language, unlike something like JS, Ruby, or Python.
So I wouldn’t bet on the fact that Guile Ruby would be exactly the same as Ruby.
Maybe it will, but it’ll probably take years.&lt;/p&gt;
&lt;p&gt;So I thought, why not just use Lua as is?
The only thing we can’t do is to run Fennel functions from Emacs Lisp.
There were &lt;a href=&quot;https://github.com/edrx/emlua&quot; target=&quot;_blank&quot;&gt;attempts at bringing Lua VM into Emacs&lt;/a&gt;, running in the same process, however, as I know, it isn’t stable enough.&lt;/p&gt;
&lt;p&gt;However, Emacs can connect to a Fennel REPL, like it does for many other languages, such as Common Lisp or Clojure.
Sure, the language is running in a separate process, and this comes with a lot of nuances, but it’s still a possible route.&lt;/p&gt;
&lt;p&gt;So I made a small package: &lt;a href=&quot;https://github.com/andreyorst/require-fennel.el&quot; target=&quot;_blank&quot;&gt;require-fennel.el&lt;/a&gt;.
It’s capable of loading Fennel (or Lua) modules, and defining a set of functions on the Emacs side for every Fennel function in the module.&lt;/p&gt;
&lt;h2 id=&quot;running-fennel-from-emacs-lisp&quot;&gt;Running Fennel from Emacs Lisp&lt;/h2&gt;
&lt;p&gt;For example, we can load Fennel itself into Emacs like this:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-emacs-lisp&quot; data-lang=&quot;emacs-lisp&quot;&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;require-fennel&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;fennel&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we have all sorts of functions available, for example, here’s &lt;code&gt;fennel.eval&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-emacs-lisp&quot; data-lang=&quot;emacs-lisp&quot;&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;fennel.eval&lt;/span&gt; &lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;&quot;(fcollect [i 1 10] (* i i))&quot;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;; =&amp;gt; [1 4 9 16 25 36 49 64 81 100]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Or, we can create a file &lt;code&gt;greet.fnl&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-fennel&quot; data-lang=&quot;fennel&quot;&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;fn &lt;/span&gt;&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;greet&lt;/span&gt; [&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;name&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;  &lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;&quot;Greets NAME with a message.&quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;  (&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;print &lt;/span&gt;(&lt;span style=&quot;font-weight: bold;&quot;&gt;.. &lt;/span&gt;&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;&quot;Hello, &quot;&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;name&lt;/span&gt; &lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;&quot; from Fennel!&quot;&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and load it:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-emacs-lisp&quot; data-lang=&quot;emacs-lisp&quot;&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;require-fennel&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;greet&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;greet&lt;/span&gt; &lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;&quot;Andrey&quot;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;require-fennel&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;foo&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;require-fennel&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;vec-add&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;src-block-caption&quot;&gt;
  &lt;span class=&quot;src-block-number&quot;&gt;Code Snippet 1:&lt;/span&gt;
  &quot;Hello, Andrey from Fennel!&quot; will be displayed in the echo area of Emacs
&lt;/div&gt;
&lt;p&gt;Let’s ask Emacs to describe the &lt;code&gt;greet&lt;/code&gt; function:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;greet is a interpreted-function.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(greet NAME)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;Greets NAME with a message.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As can be seen, Emacs can show us the function signature and its documentation string obtained from Fennel.&lt;/p&gt;
&lt;p&gt;Unlike Emacs Lisp, Fennel functions support destructuring with special syntax based on how data literals are written in Fennel.
For example, let’s create a function that accepts a map, and destructures its keys:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-fennel&quot; data-lang=&quot;fennel&quot;&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;fn &lt;/span&gt;&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;foo&lt;/span&gt; [{&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:x&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;x&lt;/span&gt; &lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:y&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;y&lt;/span&gt;}]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;  &lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;&quot;Accepts a map with the X and Y keys, and adds them together.&quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;  (&lt;span style=&quot;font-weight: bold;&quot;&gt;+ &lt;/span&gt;&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;x&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;y&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After loading it in Emacs we’ll see the following documentation:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;foo is a interpreted-function.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(foo ((:y . y) (:x . x)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;Accepts a map with the X and Y keys, and adds them together.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I took some creative liberties and made it so Fennel hash tables are represented as association lists in Emacs Lisp.
So the &lt;code&gt;((:x . 1) (:y . 2))&lt;/code&gt; in Elisp is equal to &lt;code&gt;{:x 1 :y 2}&lt;/code&gt; in Fennel.
The argument list on the Emacs Lisp side is a bit unconventional, but I think that’s OK.&lt;/p&gt;
&lt;p&gt;The same goes for vector destructuring:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-fennel&quot; data-lang=&quot;fennel&quot;&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;fn &lt;/span&gt;&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;vec-add&lt;/span&gt; [[&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;x0&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;y0&lt;/span&gt;] [&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;x1&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;y1&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;  &lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;&quot;Adds two 2D vectors.&quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;  [(&lt;span style=&quot;font-weight: bold;&quot;&gt;+ &lt;/span&gt;&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;x0&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;x1&lt;/span&gt;) (&lt;span style=&quot;font-weight: bold;&quot;&gt;+ &lt;/span&gt;&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;y0&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;y1&lt;/span&gt;)])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Emacs’ documentation uses lists:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;vec-add is a interpreted-function.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(vec-add (X0 y0) (X1 y1))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;Adds two 2D vectors.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I couldn’t make it work with vectors for some reason, and as can be seen, Emacs tries to upcase parameters, but it doesn’t recognize that &lt;code&gt;y0&lt;/code&gt; is also a parameter.
Probably fine, as such documentation would never be generated for Emacs Lisp functions.&lt;/p&gt;
&lt;p&gt;We can call such a function with both vectors and lists:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-emacs-lisp&quot; data-lang=&quot;emacs-lisp&quot;&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;vec-add&lt;/span&gt; [1 2] [1 2])   &lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;=&amp;gt; [2 4]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;vec-add&lt;/span&gt; '(1 2) '(1 2)) &lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;=&amp;gt; [2 4]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That’s because Fennel doesn’t have a list datatype, it only has associative and sequential tables.
Thus I’m using Elisp vectors as the result type.&lt;/p&gt;
&lt;h3 id=&quot;data-conversion&quot;&gt;Data conversion&lt;/h3&gt;
&lt;p&gt;Here’s how conversion table when passing data from Elisp to Fennel:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Elisp&lt;/th&gt;
&lt;th&gt;Fennel&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;[1 2 3]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[1 2 3]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;(1 2 3)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[1 2 3]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;((:foo . 1) (:bar . 2))&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{:foo 1 :bar 2}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;#s(hash-table test equal data (&quot;foo&quot; 1 &quot;bar&quot; 2))&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{:foo 1 :bar 2}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:foo&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&quot;foo&quot;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;'false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&quot;foo&quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&quot;foo&quot;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;And here’s the conversion table when receiving data from Fennel in Emacs:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fennel&lt;/th&gt;
&lt;th&gt;Elisp&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;[1 2 3]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[1 2 3]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{:foo 1 :bar 2}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;((:foo . 1) (:bar . 2))&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;(values 1 2 3)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;(1 2 3)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;(fn [])&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;(lambda (&amp;amp;rest args) ...)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;userdata&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;#&amp;lt;udata: 0x55b66bd6ac28&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;t&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nil&lt;/code&gt;, &lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nil&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A small note about hash tables and multiple value returns.
As can be seen, both are returned as lists.
I specifically chose the cons notation for association lists, i.e. &lt;code&gt;(a . b)&lt;/code&gt; because this way we can tell apart hash tables and mustivalues.
There are no cons cells in Fennel, so no other data structure will be represented like that.&lt;/p&gt;
&lt;p&gt;Because multiple values are returned as lists, we have to call apply, if we wish to compose two Fennel functions.
In other words, in Fennel we can do this:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-fennel&quot; data-lang=&quot;fennel&quot;&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;fn &lt;/span&gt;&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;rest&lt;/span&gt; [&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;_&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;...&lt;/span&gt;] &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;...&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;fn &lt;/span&gt;&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;first&lt;/span&gt; [&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;x&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;_&lt;/span&gt;] &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;x&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;first&lt;/span&gt; (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;rest&lt;/span&gt; 1 2 3)) &lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;=&amp;gt; 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;{&lt;span style=&quot;font-weight: bold;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;first&lt;/span&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;rest&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;src-block-caption&quot;&gt;
  &lt;span class=&quot;src-block-number&quot;&gt;Code Snippet 2:&lt;/span&gt;
  &lt;code&gt;fr.fnl&lt;/code&gt;
&lt;/div&gt;
&lt;p&gt;In Elisp, however, we would have to do:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-emacs-lisp&quot; data-lang=&quot;emacs-lisp&quot;&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;require-fennel&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;fr&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;apply&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;#'&lt;/span&gt;&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;fr.first&lt;/span&gt; (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;fr.rest&lt;/span&gt; 1 2 3)) &lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;=&amp;gt; 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If we were to call it as &lt;code&gt;(fr.first (fr.rest 1 2 3))&lt;/code&gt; the result would be &lt;code&gt;[2 3]&lt;/code&gt;, because &lt;code&gt;fr.rest&lt;/code&gt; returned a list of return values, and lists are converted to vectors or hash maps depending on their structure.&lt;/p&gt;
&lt;p&gt;That’s the basic gist of this package.&lt;/p&gt;
&lt;h3 id=&quot;more-examples&quot;&gt;More examples&lt;/h3&gt;
&lt;p&gt;After implementing it I was like a kid in a toy store.
With a childish grin, I started loading all my crazy Fennel libraries that I made over the years.&lt;/p&gt;
&lt;p&gt;For example, here’s &lt;code&gt;cljlib&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-emacs-lisp&quot; data-lang=&quot;emacs-lisp&quot;&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;require-fennel&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;cljlib&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;cljlib.conj&lt;/span&gt; [1] 2) &lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;=&amp;gt; [1 2]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Or, here’s a JSON parser I made:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-emacs-lisp&quot; data-lang=&quot;emacs-lisp&quot;&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;require&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;fennel&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;json&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;json.decode&lt;/span&gt; &lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;&quot;{\&quot;foo\&quot;: [1, 2, 3]}&quot;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;; ((&quot;foo&quot; . [1 2 3]))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;json.encode&lt;/span&gt; '((&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;&quot;foo&quot;&lt;/span&gt; . [1 2 3])))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;; &quot;{\&quot;foo\&quot;: [1, 2, 3]}&quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here’s a crazy one - I’m loading my Fennel port of a Clojure library clj-http into Emacs, and calling it from Elisp:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-emacs-lisp&quot; data-lang=&quot;emacs-lisp&quot;&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;require-fennel&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;io.gitlab.andreyorst.fnl-http&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;require-fennel&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;io.gitlab.andreyorst.fnl-http.client&lt;/span&gt; &lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;:as&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;client&lt;/span&gt;) &lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;; nested module&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;client.get&lt;/span&gt; &lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;&quot;http://httpbin.org/get&quot;&lt;/span&gt; '((&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;:as&lt;/span&gt; . &lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;:json&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;; =&amp;gt; ((&quot;headers&quot; . ((&quot;Content-Length&quot; . &quot;198&quot;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;;                   (&quot;Access-Control-Allow-Credentials&quot; . t)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;;                   (&quot;Access-Control-Allow-Origin&quot; . &quot;*&quot;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;;                   (&quot;Content-Type&quot; . &quot;application/json&quot;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;;                   (&quot;Connection&quot; . &quot;keep-alive&quot;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;;                   (&quot;Server&quot; . &quot;gunicorn/19.9.0&quot;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;;                   (&quot;Date&quot; . &quot;Mon, 16 Dec 2024 22:56:35 GMT&quot;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;;     (&quot;reason-phrase&quot; . &quot;OK&quot;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;;     (&quot;length&quot; . 198)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;;     (&quot;protocol-version&quot; . ((&quot;name&quot; . &quot;HTTP&quot;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;;                            (&quot;minor&quot; . 1)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;;                            (&quot;major&quot; . 1)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;;     (&quot;request-time&quot; . 214)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;;     (&quot;trace-redirects&quot; . [])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;;     (&quot;status&quot; . 200)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;;     (&quot;body&quot; . ((&quot;args&quot; . [])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;;                (&quot;headers&quot; . ((&quot;Host&quot; . &quot;httpbin.org&quot;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;;                              (&quot;X-Amzn-Trace-Id&quot; . &quot;Root=1-6760b023-39ca8e413573df5d14d09486&quot;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;;                (&quot;url&quot; . &quot;http://httpbin.org/get&quot;))))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;src-block-caption&quot;&gt;
  &lt;span class=&quot;src-block-number&quot;&gt;Code Snippet 3:&lt;/span&gt;
  I've formatted nested alists to use dot notation for better reading clarity. In other words changed &lt;code&gt;(a (b . c) (d . e))&lt;/code&gt; into &lt;code&gt;(a . ((b . c) (d . e)))&lt;/code&gt; which are the same thing.
&lt;/div&gt;
&lt;p&gt;The client made an HTTP request from the Fennel side and passed the response back to Emacs.
The response body was in JSON, but specifying &lt;code&gt;((:as . :json))&lt;/code&gt; as options map forced parsing the response body into Fennel tables.
Which, upon arriving in Emacs Lisp were converted into association lists.&lt;/p&gt;
&lt;p&gt;So now we can call Fennel from Elisp.
But why stop there?
Let’s call Emacs Lisp from Fennel!&lt;/p&gt;
&lt;h2 id=&quot;running-elisp-from-fennel-dot-dot&quot;&gt;Running ELisp from Fennel?..&lt;/h2&gt;
&lt;p&gt;Since this package uses the &lt;a href=&quot;https://andreyor.st/posts/2023-03-25-implementing-a-protocol-based-fennel-repl-and-emacs-client/&quot;&gt;Fennel Proto REPL&lt;/a&gt;, which is a custom protocol that can be extended at runtime, we can create a set of functions that will allow us to call back to Elisp.
Here’s how we extend the protocol:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-fennel&quot; data-lang=&quot;fennel&quot;&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;font-weight: bold;&quot;&gt;let &lt;/span&gt;[&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;format-elisp&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;_G.___repl___.pp&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;  (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;protocol.env-set!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;   &lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:emacs&lt;/span&gt; {&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:call&lt;/span&gt; (&lt;span style=&quot;font-weight: bold;&quot;&gt;-&amp;gt;&amp;gt; &lt;/span&gt;{&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:__index&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;                       (&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;fn &lt;/span&gt;[&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;_&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;k&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;                         (&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;fn &lt;/span&gt;[&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;...&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;                           (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;protocol.message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;                            [[&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:id&lt;/span&gt; {&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:sym&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;protocol.id&lt;/span&gt;}]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;                             [&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:op&lt;/span&gt; {&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:string&lt;/span&gt; &lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:require-fennel/call&lt;/span&gt;}]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;                             [&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:fun&lt;/span&gt; {&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:sym&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;k&lt;/span&gt;}]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;                             [&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:arguments&lt;/span&gt; {&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:list&lt;/span&gt; (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;fcollect&lt;/span&gt; [&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;n&lt;/span&gt; 1 (&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;select &lt;/span&gt;&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;&quot;#&quot;&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;...&lt;/span&gt;)]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;                                                  (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;format-elisp&lt;/span&gt; (&lt;span style=&quot;font-weight: bold;&quot;&gt;pick-values &lt;/span&gt;1 (&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;select &lt;/span&gt;&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;n&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;...&lt;/span&gt;))))}]])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;                           (&lt;span style=&quot;font-weight: bold;&quot;&gt;. &lt;/span&gt;(&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;protocol.receive&lt;/span&gt;) &lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:data&lt;/span&gt;)))}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;                      (&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;setmetatable &lt;/span&gt;{}))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;           &lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:var&lt;/span&gt; (&lt;span style=&quot;font-weight: bold;&quot;&gt;-&amp;gt;&amp;gt; &lt;/span&gt;{&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:__index&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;                      (&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;fn &lt;/span&gt;[&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;_&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;k&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;                        (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;protocol.message&lt;/span&gt; [[&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:id&lt;/span&gt; {&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:sym&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;protocol.id&lt;/span&gt;}]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;                                           [&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:op&lt;/span&gt; {&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:string&lt;/span&gt; &lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:require-fennel/var&lt;/span&gt;}]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;                                           [&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:var&lt;/span&gt; {&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:sym&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;k&lt;/span&gt;}]])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;                        (&lt;span style=&quot;font-weight: bold;&quot;&gt;. &lt;/span&gt;(&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;protocol.receive&lt;/span&gt;) &lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:data&lt;/span&gt;))}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;                     (&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;setmetatable &lt;/span&gt;{}))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;           &lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:eval&lt;/span&gt; (&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;fn &lt;/span&gt;[&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;expr&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;                   (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;protocol.message&lt;/span&gt; [[&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:id&lt;/span&gt; {&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:sym&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;protocol.id&lt;/span&gt;}]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;                                      [&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:op&lt;/span&gt; {&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:string&lt;/span&gt; &lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:require-fennel/eval&lt;/span&gt;}]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;                                      [&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:expr&lt;/span&gt; {&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:sym&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;expr&lt;/span&gt;}]])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;                   (&lt;span style=&quot;font-weight: bold;&quot;&gt;. &lt;/span&gt;(&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;protocol.receive&lt;/span&gt;) &lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:data&lt;/span&gt;))})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;  {&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:id&lt;/span&gt; 1000 &lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;:nop&lt;/span&gt; &lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;&quot;&quot;&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I had to update the protocol core a bit, adding the &lt;code&gt;protocol.env-set!&lt;/code&gt; and &lt;code&gt;protocol.receive&lt;/code&gt; functions.
The &lt;code&gt;env-set!&lt;/code&gt; allows us to create user-visible definitions.
So we add the &lt;code&gt;emacs&lt;/code&gt; table that holds three fields.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;call&lt;/code&gt; field is a table with some metatable trickery.
Since it’s an empty table, any key would trigger the &lt;code&gt;__index&lt;/code&gt; metamethod.
This metamethod can be another table or a function - in our case, it is the latter.
This function returns a handler that calls into &lt;code&gt;protocol.message&lt;/code&gt; that sends a custom OP &lt;code&gt;require-fennel/call&lt;/code&gt; that we can handle in our package.&lt;/p&gt;
&lt;p&gt;The same goes for the &lt;code&gt;var&lt;/code&gt; field, except it doesn’t return a function, it just returns a value.&lt;/p&gt;
&lt;p&gt;The last field, &lt;code&gt;eval&lt;/code&gt;, is a combination of both, kinda.
It is a function, not a table, and it accepts one argument - an expression to evaluate in Emacs.&lt;/p&gt;
&lt;p&gt;However, we can’t use these just yet.
The second part of the trick comes from the new ability to extend the main protocol handler with custom handlers:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-emacs-lisp&quot; data-lang=&quot;emacs-lisp&quot;&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;cl-defgeneric&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;fennel-proto-repl-handle-custom-op&lt;/span&gt; (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;_op&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;_message&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;_callbacks&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;  &lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;&quot;Handler for a custom protocol OP.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;The first argument OP is used for dispatching.  Accepts the whole
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;MESSAGE, and its CALLBACKS.  The default implementation of unknown OP is
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;a nop.&quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;  &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;nil&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With this generic function, we can define new handlers in separate packages.
These are the methods I’ve added in &lt;code&gt;require-fennel.el&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-emacs-lisp&quot; data-lang=&quot;emacs-lisp&quot;&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;cl-defmethod&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;fennel-proto-repl-handle-custom-op&lt;/span&gt; ((&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;op&lt;/span&gt; (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;eql&lt;/span&gt; &lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;:require-fennel/call&lt;/span&gt;)) &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;message&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;callbacks&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;  &lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;&quot;Custom handler for the require-fennel/call OP.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;Accepts a MESSAGE and its CALLBACKS.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;The MESSAGE contains a function to evaluate and its arguments.&quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;  (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;fennel-proto-repl-send-message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;   &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;   (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;format&lt;/span&gt; &lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;&quot;{:id %s :data %s}&quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;           (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;plist-get&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;message&lt;/span&gt; &lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;:id&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;           (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;apply&lt;/span&gt; (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;plist-get&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;message&lt;/span&gt; &lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;:fun&lt;/span&gt;) (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;plist-get&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;message&lt;/span&gt; &lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;:arguments&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;   &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;nil&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;cl-defmethod&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;fennel-proto-repl-handle-custom-op&lt;/span&gt; ((&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;op&lt;/span&gt; (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;eql&lt;/span&gt; &lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;:require-fennel/var&lt;/span&gt;)) &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;message&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;callbacks&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;  &lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;&quot;Custom handler for the require-fennel/var OP.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;Accepts a MESSAGE and its CALLBACKS.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;The MESSAGE contains a var which value is then returned to Fennel.&quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;  (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;fennel-proto-repl-send-message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;   &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;   (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;format&lt;/span&gt; &lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;&quot;{:id %s :data %s}&quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;           (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;plist-get&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;message&lt;/span&gt; &lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;:id&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;           (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;require-fennel--elisp-to-fennel&lt;/span&gt; (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;eval&lt;/span&gt; (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;plist-get&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;message&lt;/span&gt; &lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;:var&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;   &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;nil&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;(&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;cl-defmethod&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;fennel-proto-repl-handle-custom-op&lt;/span&gt; ((&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;op&lt;/span&gt; (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;eql&lt;/span&gt; &lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;:require-fennel/eval&lt;/span&gt;)) &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;message&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;callbacks&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;  &lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;&quot;Custom handler for the require-fennel/var OP.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;Accepts a MESSAGE and its CALLBACKS.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;The MESSAGE contains an expression which is evaluated and its result is returned to Fennel.&quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;  (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;fennel-proto-repl-send-message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;   &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;   (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;format&lt;/span&gt; &lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;&quot;{:id %s :data %s}&quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;           (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;plist-get&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;message&lt;/span&gt; &lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;:id&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;           (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;require-fennel--elisp-to-fennel&lt;/span&gt; (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;eval&lt;/span&gt; (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;plist-get&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;message&lt;/span&gt; &lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;:expr&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;   &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;nil&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;These three fields and methods allow us to do anything with Emacs, and it happens in the same process, so we can access the full Emacs state.
For example:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-fennel&quot; data-lang=&quot;fennel&quot;&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;; Welcome to Fennel Proto REPL 0.6.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;; Fennel version: 1.5.1-dev&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #888; font-style: italic;&quot;&gt;;; Lua version: PUC Lua 5.4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;emacs.call.emacs-uptime&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;&quot;19 minutes, 17 seconds&quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;emacs.var.emacs-version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;&quot;31.0.50&quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; (&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;emacs.eval&lt;/span&gt; &lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;&quot;(with-current-buffer \&quot; *fennel-elisp*\&quot; (buffer-substring-no-properties (point-min) (point-max)))&quot;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;&quot;;; Welcome to Fennel Proto REPL 0.6.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;;; Fennel version: 1.5.1-dev
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;;; Lua version: PUC Lua 5.4
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;&amp;gt;&amp;gt; (emacs.call.emacs-uptime)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;\&quot;19 minutes, 17 seconds\&quot;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;&amp;gt;&amp;gt; emacs.var.emacs-version
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;\&quot;31.0.50\&quot;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;&amp;gt;&amp;gt; (emacs.eval \&quot;(with-current-buffer \\\&quot; *fennel-elisp*\\\&quot; (buffer-substring-no-properties (point-min) (point-max)))\&quot;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666; font-style: italic;&quot;&gt;&amp;gt;&amp;gt; &quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666; font-weight: bold; font-style: italic;&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Crazy!&lt;/p&gt;
&lt;h2 id=&quot;fennelmacs&quot;&gt;Fennelmacs&lt;/h2&gt;
&lt;p&gt;So now we can write Fennel scripts that can obtain data from Emacs, process it, and pass back the results.
Thus, our goal is achieved - we’ve added a second language to Emacs!&lt;/p&gt;
&lt;p&gt;Of course, it’s not the same as what Guile Emacs does.
We’re still running code in a separate process, adding communication between the two via some protocol.
It’s a neat trick, nothing more.
Guile Emacs, if it ever becomes the thing, will be more powerful, as we would be able to leverage all these different languages in the same process, possibly sharing the memory, calling functions interchangeably, etc.
Some may even write Emacs packages in Brainfuck, who knows.&lt;/p&gt;
&lt;p&gt;Still, this is really cool, in my opinion, and shows the power of Emacs pretty well.
If you’re into Fennel, like me, I hope you’ll enjoy using this package as I enjoyed making it.
See you at &lt;a href=&quot;https://conf.fennel-lang.org/2024&quot; target=&quot;_blank&quot;&gt;Fennel Conf&lt;/a&gt;!&lt;/p&gt;
&lt;div class=&quot;comment-link&quot;&gt; &lt;a href=&quot;mailto:%61%6e%64%72%65%79%6f%72%73%74%2b%62%6c%6f%67%40%67%6d%61%69%6c%2e%63%6f%6d?subject=Comment: Extending Emacs with Fennel&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Comment via email&lt;/a&gt;&lt;/div&gt;</content>
		<author>
			<name>Andrey Listopadov</name>
			<uri>https://andreyor.st/categories/emacs/</uri>
		</author>
		<source>
			<title type="html">Andrey Listopadov</title>
			<subtitle type="html">Posts from the 'emacs' category by Andrey Listopadov</subtitle>
			<link rel="self" href="https://andreyor.st/categories/emacs/feed.xml"/>
			<id>https://andreyor.st/categories/emacs/</id>
			<rights type="html">Andrey Listopadov 2020-2024 - This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License</rights>
		</source>
	</entry>

	<entry>
		<title type="html">Org Mode requests: [FR] Allow SPC to scroll todo/tag selection menu - for users with huge accessible fonts (was: Transient: accessibility problems for users who need to use large fonts (was: [RFC] The best way to choose an &quot;action&quot; at point: context-menu-mode, transient, which-key or embark? (was: Fwd: Org-cite: Replace basic follow-processor with transient menu?)))</title>
		<link href="https://list.orgmode.org/87a5cr7dn9.fsf@localhost"/>
		<id>https://list.orgmode.org/87a5cr7dn9.fsf@localhost</id>
		<updated>2024-12-19T18:04:52+00:00</updated>
		<published></published>
		<content type="html">[FR] Allow SPC to scroll todo/tag selection menu - for users with huge accessible fonts (was: Transient: accessibility problems for users who need to use large fonts (was: [RFC] The best way to choose an &quot;action&quot; at point: context-menu-mode, transient, which-key or embark? (was: Fwd: Org-cite: Replace basic follow-processor with transient menu?)))</content>
		<author>
			<name>Ihor Radchenko</name>
			<email>yantar92@posteo.net</email>
			<uri>https://orgmode.org/</uri>
		</author>
		<source>
			<title type="html">Org</title>
			<subtitle type="html">Org-Mode Woof! tracker</subtitle>
			<link rel="self" href="https://orgmode.org/"/>
			<id>https://orgmode.org/</id>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en-US">Irreal: A Bit More On Guile Emacs</title>
		<link href="https://irreal.org/blog/?p=12659"/>
		<id>https://irreal.org/blog/?p=12659</id>
		<updated>2024-12-19T16:26:23+00:00</updated>
		<published></published>
		<content type="html" xml:lang="en-US">&lt;p&gt;
A week ago, I wrote about the recent &lt;a href=&quot;https://irreal.org/blog/?p=12635&quot;&gt;restoration of the Guile Emacs project&lt;/a&gt;. Despite my enthusiasm for the original project, I just couldn’t get excited about its resurrection. You can take a look at that post for my reasons why.
&lt;/p&gt;
&lt;p&gt;
To be clear, I believe that if Emacs were being written today, Guile would be the natural choice and a great one. But that ship has long since sailed. Emacs is 40 years old and there are plenty of technical and political reasons arguing against trying to retrofit it now.
&lt;/p&gt;
&lt;p&gt;
Still, it’s an interesting project. If you’d like to know about more about it, &lt;a href=&quot;https://lwn.net&quot;&gt;LWN&lt;/a&gt; has a nice summary of &lt;a href=&quot;https://lwn.net/SubscriberLink/1001645/b1e4453a8c6c16d7/&quot;&gt;the project and the talk that its leader, Robin Templeton, gave at this year’s EmacsConf&lt;/a&gt;. The article lays out the rationale for the project as well as some of the problems—technical and political that it’s apt to encounter.The project is actually pretty far along but there are still performance and other problems to resolve. There’s also the issue of whether the basically conservative user base would accept such a change. As hard as it is to believe, not everyone is as fond as Scheme as some of us and others just hate change, especially in something as essential as their editor.&lt;/p&gt;</content>
		<author>
			<name>jcs</name>
			<uri>https://irreal.org/blog</uri>
		</author>
		<source>
			<title type="html">Emacs – Irreal</title>
			<subtitle type="html">The minds had long ago come up with a proper name for it; they called it the Irreal, but they thought of it as Infinite Fun. That was what they really knew it as. The Land of Infinite Fun. --Iain M. Banks, Excession</subtitle>
			<link rel="self" href="http://irreal.org/blog/?tag=emacs&amp;feed=rss2"/>
			<id>https://irreal.org/blog</id>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en-US">Sacha Chua: subed.el: Tweaking subtitle times</title>
		<link href="https://sachachua.com/blog/2024/12/subed-el-tweaking-subtitle-times/"/>
		<id>https://sachachua.com/blog/2024/12/subed-el-tweaking-subtitle-times/</id>
		<updated>2024-12-19T14:51:17+00:00</updated>
		<published></published>
		<content type="html">&lt;p&gt;
When subtitle times are too far off from the video
or audio, people start worrying if their video has
frozen or jumped ahead. It's good to keep
subtitles roughly in time with the audio.
&lt;/p&gt;

&lt;p&gt;
For EmacsConf, we can get timing information from
two places. &lt;a href=&quot;https://github.com/m-bain/whisperX&quot;&gt;WhisperX&lt;/a&gt; produces a JSON file with
word data in the process of doing the speech
recognition, and the &lt;a href=&quot;https://www.readbeyond.it/aeneas/&quot;&gt;aeneas forced alignment tool&lt;/a&gt;
can use synthesized text-to-speech to figure out
the timestamps for each line of text compared to a
media file.
&lt;/p&gt;

&lt;p&gt;
Aeneas timestamps are more helpful once we start
editing, but it can be confused by long silences,
extraneous noises, multiple speakers, and
inaccurate transcripts (words added or removed).
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;https://sachachua.com/blog/2024/11/yay-emacs-7-using-word-timing-in-caption-editing-with-subed-word-data/&quot;&gt;When I combine the WhisperX word data with
subtitles&lt;/a&gt;, I can see where the times might need a
closer look because matching words weren't found.
&lt;/p&gt;


&lt;figure id=&quot;org4b1534a&quot;&gt;
&lt;img alt=&quot;2024-12-18_12-27-37.png&quot; src=&quot;https://sachachua.com/blog/2024/12/subed-el-tweaking-subtitle-times/2024-12-18_12-27-37.png&quot; /&gt;

&lt;figcaption&gt;&lt;span class=&quot;figure-number&quot;&gt;Figure 1: &lt;/span&gt;Screenshot with word data loaded&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;
Loading word data requires a pretty close match at
the moment, but since we change only about 4% of
the subtitle text when editing, those cues are
still helpful. (I measured this by the Levenshtein
distance between the combined cue texts of edited
subtitles versus the original WhisperX
transcripts, using &lt;code&gt;string-distance&lt;/code&gt; to
approximate the editing percentage.)
&lt;/p&gt;

&lt;details&gt;Calculating how much we edited
&lt;div class=&quot;org-src-container&quot;&gt;
&lt;pre class=&quot;src src-emacs-lisp&quot;&gt;(&lt;span class=&quot;org-keyword&quot;&gt;let&lt;/span&gt; ((sum-original 0)
      (sum-dist 0))
  (append
   (seq-keep
    (&lt;span class=&quot;org-keyword&quot;&gt;lambda&lt;/span&gt; (talk)
      (&lt;span class=&quot;org-keyword&quot;&gt;when&lt;/span&gt; (&lt;span class=&quot;org-keyword&quot;&gt;and&lt;/span&gt; (emacsconf-talk-file talk &lt;span class=&quot;org-string&quot;&gt;&quot;--main.vtt&quot;&lt;/span&gt;)
                 (emacsconf-talk-file talk &lt;span class=&quot;org-string&quot;&gt;&quot;--reencoded.json&quot;&lt;/span&gt;))
        (&lt;span class=&quot;org-keyword&quot;&gt;let*&lt;/span&gt; ((json-object-type &lt;span class=&quot;org-highlight-quoted-quote&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;org-highlight-quoted-symbol&quot;&gt;alist&lt;/span&gt;)
               (json-array-type &lt;span class=&quot;org-highlight-quoted-quote&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;org-highlight-quoted-symbol&quot;&gt;list&lt;/span&gt;)
               (edited-text
                (mapconcat (&lt;span class=&quot;org-keyword&quot;&gt;lambda&lt;/span&gt; (sub) (elt sub 3))
                           (subed-parse-file (emacsconf-talk-file talk &lt;span class=&quot;org-string&quot;&gt;&quot;--main.vtt&quot;&lt;/span&gt;))
                           &lt;span class=&quot;org-string&quot;&gt;&quot; &quot;&lt;/span&gt;))
               (original-text
                (mapconcat
                 (&lt;span class=&quot;org-keyword&quot;&gt;lambda&lt;/span&gt; (word)
                   (assoc-default &lt;span class=&quot;org-highlight-quoted-quote&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;org-highlight-quoted-symbol&quot;&gt;word&lt;/span&gt; word))
                 (assoc-default
                  &lt;span class=&quot;org-highlight-quoted-quote&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;org-highlight-quoted-symbol&quot;&gt;word_segments&lt;/span&gt;
                  (json-read-file (emacsconf-talk-file talk &lt;span class=&quot;org-string&quot;&gt;&quot;--reencoded.json&quot;&lt;/span&gt;)))
                 &lt;span class=&quot;org-string&quot;&gt;&quot; &quot;&lt;/span&gt;))
               (dist (string-distance original-text edited-text)))
          (&lt;span class=&quot;org-keyword&quot;&gt;setq&lt;/span&gt; sum-original (+ sum-original (length original-text)))
          (&lt;span class=&quot;org-keyword&quot;&gt;setq&lt;/span&gt; sum-dist (+ sum-dist dist))
          (list
           (length original-text)
           (length edited-text)
           dist))))
    (emacsconf-get-talk-info))
   &lt;span class=&quot;org-highlight-quoted-quote&quot;&gt;'&lt;/span&gt;(hline)
   (list
    (list
     sum-original
     (format &lt;span class=&quot;org-string&quot;&gt;&quot;%d%%&quot;&lt;/span&gt; (/ (* 100.0 sum-dist) sum-original))
     sum-dist))))
&lt;/pre&gt;
&lt;/div&gt;

&lt;/details&gt;

&lt;p&gt;
To make it easier to correct subtitle timing, I
added a few ways to tweak subtitle timing for a
region of subtitles.
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;WhisperX:&lt;/b&gt; &lt;code&gt;subed-word-data-fix-subtitle-timing&lt;/code&gt; in
&lt;a href=&quot;https://github.com/sachac/subed/blob/main/subed/subed-word-data.el&quot;&gt;subed-word-data.el&lt;/a&gt; tries to match the word
data from WhisperX against the text of the current
subtitle, using &lt;code&gt;string-distance&lt;/code&gt; for approximate
matches. I start at about two words shorter than
what's in the subtitle, and then increase the
number of words taken from the data while the
string distance decreases. I skip the data for
words before the beginning of the first
subtitle in the region.
&lt;/p&gt;

&lt;p&gt;
&lt;/p&gt;&lt;figure&gt;&lt;video controls=&quot;1&quot; src=&quot;https://sachachua.com/blog/2024/12/subed-el-tweaking-subtitle-times/2024-12-18_12.44.23.webm&quot; type=&quot;video/webm&quot;&gt;&lt;a href=&quot;https://sachachua.com/blog/2024/12/subed-el-tweaking-subtitle-times/2024-12-18_12.44.23.webm&quot;&gt;Download the video&lt;/a&gt;&lt;/video&gt;&lt;figcaption&gt;&lt;div&gt;Screencast of subed-word-data-fix-subtitle-timing&lt;/div&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;Aeneas:&lt;/b&gt; &lt;code&gt;subed-align-region&lt;/code&gt; uses Aeneas to realign the
subtitles from the region using the section of the
media file between the start of the first subtitle
and the end of the last subtitle in the region.
When I notice that the times are off, I &lt;a href=&quot;https://sachachua.com/blog/2024/11/checking-caption-timing-by-skimming-with-emacs-lisp-or-js/&quot;&gt;skim the
subtitles&lt;/a&gt; (or just skim them visually) to find the
last well-timed subtitle. Then I pick a subtitle
that's in the incorrectly-timed section. I use
&lt;code&gt;subed-mpv-jump-to-current-subtitle&lt;/code&gt; (&lt;code&gt;M-j&lt;/code&gt;) to
jump to that position, and I play back that
subtitle. It usually belongs to some text further
down, so I reset to that position with &lt;code&gt;M-j&lt;/code&gt;, set
my mark before the previous correctly-timed
subtitle with &lt;code&gt;C-SPC&lt;/code&gt;, go to the subtitle that
matches that time, and use
&lt;code&gt;subed-copy-player-pos-to-start-time&lt;/code&gt; (&lt;code&gt;C-c [&lt;/code&gt;) to
set the proper timestamp. Then I can go to the
previous incorrectly-timed subtitle and use &lt;code&gt;M-x
subed-align-region&lt;/code&gt;. This runs the Aeneas forced
alignment tool using just the subtitle text in the
region, the starting timestamp of the first
subtitle, and the ending timestamp of the last
subtitle, making it easy to adjust that section.
&lt;code&gt;subed-align-region&lt;/code&gt; is in &lt;a href=&quot;https://github.com/sachac/subed/blob/main/subed/subed-align.el&quot;&gt;subed-align.el&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;Retiming by pressing SPC after each subtitle:&lt;/b&gt; As
an experiment, I've also added a
&lt;code&gt;subed-retime-subtitles&lt;/code&gt; command that plays
through the subtitles so that I can press &lt;code&gt;SPC&lt;/code&gt;
when the next subtitle starts. It begins with the
current subtitle and stops when you press a key
that's not in its keymap.
&lt;/p&gt;

&lt;p&gt;
&lt;/p&gt;&lt;figure&gt;&lt;video controls=&quot;1&quot; src=&quot;https://sachachua.com/blog/2024/12/subed-el-tweaking-subtitle-times/2024-12-18_13.06.47.webm&quot; type=&quot;video/webm&quot;&gt;&lt;a href=&quot;https://sachachua.com/blog/2024/12/subed-el-tweaking-subtitle-times/2024-12-18_13.06.47.webm&quot;&gt;Download the video&lt;/a&gt;&lt;/video&gt;&lt;figcaption&gt;&lt;div&gt;Screencast with audio: subed-retime-subtitles&lt;/div&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;Manual adjustments&lt;/b&gt;: For fine-tuning timestamps,
I usually turn on &lt;code&gt;subed-waveform-show-all&lt;/code&gt; and
shift-left-click
(&lt;code&gt;subed-waveform-set-start-and-copy-to-previous&lt;/code&gt;)
or shift-right-click
(&lt;code&gt;subed-waveform-set-stop-and-copy-to-next&lt;/code&gt;) on
the waveforms because it's easy to see where the
words and pauses are. When I'm not sure, I can use
middle-click (&lt;code&gt;subed-waveform-play-sample&lt;/code&gt;) to
play part of the file without changing the
subtitle start/stop or the MPV playback position.
&lt;/p&gt;

&lt;p&gt;
&lt;/p&gt;&lt;figure&gt;&lt;video controls=&quot;1&quot; src=&quot;https://sachachua.com/blog/2024/12/subed-el-tweaking-subtitle-times/2024-12-18_12.54.08.webm&quot; type=&quot;video/webm&quot;&gt;&lt;a href=&quot;https://sachachua.com/blog/2024/12/subed-el-tweaking-subtitle-times/2024-12-18_12.54.08.webm&quot;&gt;Download the video&lt;/a&gt;&lt;/video&gt;&lt;figcaption&gt;&lt;div&gt;Screencast with audio of using the waveforms&lt;/div&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;/p&gt;

&lt;p&gt;
I'm experimenting with adding repeating
keybindings. There was a
&lt;code&gt;subed-mpv-frame-step-map&lt;/code&gt; that was bound to &lt;code&gt;C-c
C-f&lt;/code&gt;, so I've renamed it to &lt;code&gt;subed-mpv-control&lt;/code&gt;,
added a whole bunch of keybindings to the
&lt;code&gt;subed-mpv-control-map&lt;/code&gt; based on MPV and Aegisub
shortcuts, and made it a repeating transient map.
&lt;/p&gt;

&lt;p&gt;
&lt;/p&gt;&lt;figure&gt;&lt;video controls=&quot;1&quot; src=&quot;https://sachachua.com/blog/2024/12/subed-el-tweaking-subtitle-times/2024-12-18_13.02.52.webm&quot; type=&quot;video/webm&quot;&gt;&lt;a href=&quot;https://sachachua.com/blog/2024/12/subed-el-tweaking-subtitle-times/2024-12-18_13.02.52.webm&quot;&gt;Download the video&lt;/a&gt;&lt;/video&gt;&lt;figcaption&gt;&lt;div&gt;Screencast with audio, experimenting with the mpv control map&lt;/div&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;Ideas for next steps&lt;/b&gt;:
&lt;/p&gt;

&lt;p&gt;
Gotta get the hang of all these new capabilities
through practice! =)
&lt;/p&gt;

&lt;p&gt;
To make my &lt;code&gt;subed-align-region&lt;/code&gt; workflow even more
convenient, I could use &lt;code&gt;completing-read&lt;/code&gt; to let
me select a future subtitle with completion, and
then Emacs could automatically fix the subtitle
start time, go to the previous subtitle, and
realign the region.
&lt;/p&gt;

&lt;p&gt;
Also, I think switching the waveforms from overlays to
text properties could be a good idea. When I cut
text, the overlays get left behind, but I want the
waveforms to go away too.
&lt;/p&gt;

&lt;p&gt;
While writing this post and fiddling with &lt;a href=&quot;https://github.com/sachac/subed&quot;&gt;subed&lt;/a&gt;, I
ended up adding a bunch of keybindings and a menu.
I figured this was as good a time as any to stop
tweaking it and finally publish. (But it's fun!
Just one more idea…)
&lt;/p&gt;
&lt;div&gt;&lt;a href=&quot;https://sachachua.com/blog/2024/12/subed-el-tweaking-subtitle-times/index.org&quot;&gt;View org source for this post&lt;/a&gt;&lt;/div&gt;</content>
		<author>
			<name>Sacha Chua</name>
			<uri>https://sachachua.com/blog/category/emacs/feed/index.xml</uri>
		</author>
		<source>
			<title type="html">Sacha Chua - category - emacs</title>
			<subtitle type="html">Emacs, sketches, and life</subtitle>
			<link rel="self" href="https://sachachua.com/blog/category/emacs/feed/index.xml"/>
			<id>https://sachachua.com/blog/category/emacs/feed/index.xml</id>
		</source>
	</entry>

	<entry>
		<title type="html">Rahul Juliato: Enhancing icomplete-vertical-mode in Emacs</title>
		<link href="https://rahuljuliato.com/posts/in-buffer-icomplete"/>
		<id>https://rahuljuliato.com/posts/in-buffer-icomplete</id>
		<updated>2024-12-19T14:00:00+00:00</updated>
		<published></published>
		<content type="html">&lt;p&gt;&lt;code&gt;icomplete-vertical-mode&lt;/code&gt; is a popular built-in option for Emacs users
who prefer a vertical display of completions, offering a more modern
feel similar to packages like Vertico or Ivy. Beyond its default use,
it can also handle in-buffer completions. However, its behavior in
this context may feel counterintuitive if you're not familiar with it
or if you're accustomed to more modern in-buffer completion systems
like Company, Corfu, or Auto-Complete.&lt;/p&gt;
&lt;p&gt;In this post, I’d like to revisit a discussion I initiated back in
April 2024, which led to a quick patch you can apply to make
&lt;code&gt;icomplete-vertical&lt;/code&gt; work more seamlessly for in-buffer
completions, bringing it closer to the style of &lt;code&gt;company&lt;/code&gt; or &lt;code&gt;corfu&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;The issue&lt;/h2&gt;
&lt;p&gt;Specifically regarding &lt;em&gt;in buffer&lt;/em&gt; behaviour of icomplete, let's
explore some variations.&lt;/p&gt;
&lt;p&gt;Let's supose this minimal config:&lt;/p&gt;
&lt;div class=&quot;remark-highlight&quot;&gt;&lt;pre class=&quot;language-emacs-lisp&quot;&gt;&lt;code class=&quot;language-emacs-lisp&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;use-package&lt;/span&gt; icomplete
  &lt;span class=&quot;token lisp-property property&quot;&gt;:bind&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token lisp-property property&quot;&gt;:map&lt;/span&gt; icomplete-minibuffer-map
              &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;C-n&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; icomplete-forward-completions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;C-p&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; icomplete-backward-completions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;C-v&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; icomplete-vertical-toggle&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;RET&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; icomplete-force-complete-and-exit&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token lisp-property property&quot;&gt;:hook&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;after-init&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token lambda&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token arguments&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
                  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;fido-mode&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;-1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;icomplete-mode&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                  &lt;span class=&quot;token comment&quot;&gt;;; (icomplete-vertical-mode 1)&lt;/span&gt;
                  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token lisp-property property&quot;&gt;:config&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; tab-always-indent &lt;span class=&quot;token quoted-symbol variable symbol&quot;&gt;'complete&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;;; Starts completion with TAB&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; icomplete-delay-completions-threshold &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; icomplete-compute-delay &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; icomplete-show-matches-on-no-input &lt;span class=&quot;token boolean&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; icomplete-hide-common-prefix &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; icomplete-prospects-height &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; icomplete-separator &lt;span class=&quot;token string&quot;&gt;&quot; . &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; icomplete-with-completion-tables &lt;span class=&quot;token boolean&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; icomplete-in-buffer &lt;span class=&quot;token boolean&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; icomplete-max-delay-chars &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; icomplete-scroll &lt;span class=&quot;token boolean&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;advice-add&lt;/span&gt; &lt;span class=&quot;token quoted-symbol variable symbol&quot;&gt;'completion-at-point&lt;/span&gt;
              &lt;span class=&quot;token lisp-property property&quot;&gt;:after&lt;/span&gt; &lt;span class=&quot;token quoted-symbol variable symbol&quot;&gt;#'minibuffer-hide-completions&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In this example I'll be searching for completions to &lt;code&gt;(setq...&lt;/code&gt; and
hit TAB for completion.&lt;/p&gt;
&lt;p&gt;With &lt;code&gt;icomplete-mode&lt;/code&gt; the beginning of the line:
&lt;img alt=&quot;icomplete&quot; src=&quot;https://www.rahuljuliato.com/_next/image?url=%2Fassets%2Fblog%2Fposts%2Ficomplete-01.png&amp;amp;w=3840&amp;amp;q=75&quot; /&gt;&lt;/p&gt;
&lt;p&gt;With &lt;code&gt;icomplete-mode&lt;/code&gt; on some advanced column:
&lt;img alt=&quot;icomplete&quot; src=&quot;https://www.rahuljuliato.com/_next/image?url=%2Fassets%2Fblog%2Fposts%2Ficomplete-02.png&amp;amp;w=3840&amp;amp;q=75&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Now lets toggle comments in our configuration:&lt;/p&gt;
&lt;div class=&quot;remark-highlight&quot;&gt;&lt;pre class=&quot;language-emacs-lisp&quot;&gt;&lt;code class=&quot;language-emacs-lisp&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;;; (icomplete-mode 1)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;icomplete-vertical-mode&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;With &lt;code&gt;icomplete-vertical-mode&lt;/code&gt; the beginning of the line:
&lt;img alt=&quot;icomplete&quot; src=&quot;https://www.rahuljuliato.com/_next/image?url=%2Fassets%2Fblog%2Fposts%2Ficomplete-03.png&amp;amp;w=3840&amp;amp;q=75&quot; /&gt;&lt;/p&gt;
&lt;p&gt;With &lt;code&gt;icomplete-vertical-mode&lt;/code&gt; on some advanced column:
&lt;img alt=&quot;icomplete&quot; src=&quot;https://www.rahuljuliato.com/_next/image?url=%2Fassets%2Fblog%2Fposts%2Ficomplete-04.png&amp;amp;w=3840&amp;amp;q=75&quot; /&gt;&lt;/p&gt;
&lt;p&gt;As you can see, the &lt;code&gt;icomplete-vertical-mode&lt;/code&gt; completion won't respect
the cursor position, as it happens with its classic horizontal counterpart.
It always starts at the beginning of the next line.&lt;/p&gt;
&lt;h2&gt;A Proposed Solution&lt;/h2&gt;
&lt;p&gt;Messaging the Emacs help mail list
&lt;a href=&quot;https://mail.gnu.org/archive/html/help-gnu-emacs/2024-04/msg00121.html&quot;&gt;here&lt;/a&gt;,
quickly got me some answers to this issue.&lt;/p&gt;
&lt;p&gt;Zhengyi Fu suggested a patch to address this issue. The patch modifies
&lt;code&gt;icomplete.el&lt;/code&gt; to prepend spaces to the completion lines, aligning
them with the cursor’s column. Here’s the patch:&lt;/p&gt;
&lt;div class=&quot;remark-highlight&quot;&gt;&lt;pre class=&quot;language-diff&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;Index: emacs/lisp/icomplete.el
===================================================================
&lt;span class=&quot;token coord&quot;&gt;--- emacs.orig/lisp/icomplete.el&lt;/span&gt;
&lt;span class=&quot;token coord&quot;&gt;+++ emacs/lisp/icomplete.el&lt;/span&gt;
@@ -913,6 +913,16 @@ icomplete--render-vertical
&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;                ((&amp;gt; (length scroll-above) (length scroll-below)) nsections)&lt;/span&gt;
&lt;span class=&quot;token line&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;                (t (min (ceiling nsections 2) (length scroll-above))))&lt;/span&gt;
&lt;span class=&quot;token line&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;          lines))&lt;/span&gt;
&lt;span class=&quot;token line&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;    (when icomplete--in-region-buffer&lt;/span&gt;
&lt;span class=&quot;token line&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;      (let ((column&lt;/span&gt;
&lt;span class=&quot;token line&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;            (with-current-buffer icomplete--in-region-buffer&lt;/span&gt;
&lt;span class=&quot;token line&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;              (save-excursion&lt;/span&gt;
&lt;span class=&quot;token line&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;                (goto-char (car completion-in-region--data))&lt;/span&gt;
&lt;span class=&quot;token line&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;                (current-column)))))&lt;/span&gt;
&lt;span class=&quot;token line&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;       (dolist (l lines)&lt;/span&gt;
&lt;span class=&quot;token line&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;         (add-text-properties&lt;/span&gt;
&lt;span class=&quot;token line&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;           0 1 `(display ,(concat (make-string column ?\s) (substring l 0 1)))&lt;/span&gt;
&lt;span class=&quot;token line&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;           l))))&lt;/span&gt;
&lt;span class=&quot;token line&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;    ;; At long last, render final string return value.  This may still&lt;/span&gt;
&lt;span class=&quot;token line&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;    ;; kick out lines at the end.&lt;/span&gt;
&lt;span class=&quot;token line&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;    (concat &quot; \n&quot;&lt;/span&gt;
&lt;span class=&quot;token line&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As noted by Eli Zaretskii, contrary to initial impressions, applying
this patch does not require rebuilding Emacs from source. Instead:&lt;/p&gt;
&lt;p&gt;• Locate &lt;code&gt;icomplete.el&lt;/code&gt; in your Emacs installation.&lt;/p&gt;
&lt;p&gt;• Apply the patch.&lt;/p&gt;
&lt;p&gt;• Byte-compile the updated file using &lt;code&gt;M-x byte-compile-file&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;• Restart Emacs to load the updated behavior.&lt;/p&gt;
&lt;p&gt;And as magic, we get:
&lt;img alt=&quot;icomplete&quot; src=&quot;https://www.rahuljuliato.com/_next/image?url=%2Fassets%2Fblog%2Fposts%2Ficomplete-05.png&amp;amp;w=3840&amp;amp;q=75&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Another example in a buffer that provides completions with &lt;code&gt;eglot&lt;/code&gt; (Typescript LSP Server):
&lt;img alt=&quot;icomplete-eglot&quot; src=&quot;https://www.rahuljuliato.com/_next/image?url=%2Fassets%2Fblog%2Fposts%2Ficomplete-demo.gif&amp;amp;w=3840&amp;amp;q=75&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;A hacky copy/paste &amp;amp; try it&lt;/h2&gt;
&lt;p&gt;Of course you can just go &lt;em&gt;hacky&lt;/em&gt; and override this function with the
applied patch, it is ugly, it is not recommended to do, but if you'd
like to quickly try this behavior you could.&lt;/p&gt;
&lt;p&gt;Here's a version that may work with Emacs 30.0.92, shh try it and delete, don't tell anyone ;)&lt;/p&gt;
&lt;div class=&quot;remark-highlight&quot;&gt;&lt;pre class=&quot;language-emacs-lisp&quot;&gt;&lt;code class=&quot;language-emacs-lisp&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;use-package&lt;/span&gt; icomplete
  &lt;span class=&quot;token lisp-property property&quot;&gt;:bind&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token lisp-property property&quot;&gt;:map&lt;/span&gt; icomplete-minibuffer-map
              &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;C-n&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; icomplete-forward-completions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;C-p&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; icomplete-backward-completions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;C-v&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; icomplete-vertical-toggle&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;RET&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; icomplete-force-complete-and-exit&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token lisp-property property&quot;&gt;:hook&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;after-init&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token lambda&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token arguments&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
                  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;fido-mode&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;-1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                  &lt;span class=&quot;token comment&quot;&gt;;; (icomplete-mode 1)&lt;/span&gt;
                  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;icomplete-vertical-mode&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token lisp-property property&quot;&gt;:config&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; tab-always-indent &lt;span class=&quot;token quoted-symbol variable symbol&quot;&gt;'complete&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;;; Starts completion with TAB&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; icomplete-delay-completions-threshold &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; icomplete-compute-delay &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; icomplete-show-matches-on-no-input &lt;span class=&quot;token boolean&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; icomplete-hide-common-prefix &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; icomplete-prospects-height &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; icomplete-separator &lt;span class=&quot;token string&quot;&gt;&quot; . &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; icomplete-with-completion-tables &lt;span class=&quot;token boolean&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; icomplete-in-buffer &lt;span class=&quot;token boolean&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; icomplete-max-delay-chars &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; icomplete-scroll &lt;span class=&quot;token boolean&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;advice-add&lt;/span&gt; &lt;span class=&quot;token quoted-symbol variable symbol&quot;&gt;'completion-at-point&lt;/span&gt;
              &lt;span class=&quot;token lisp-property property&quot;&gt;:after&lt;/span&gt; &lt;span class=&quot;token quoted-symbol variable symbol&quot;&gt;#'minibuffer-hide-completions&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;;; FIXME - this is actually an override of internal icomplete to provide&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;;;         in buffer on column completion&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;;; As first suggested by Zhengyi Fu:&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;;; https://mail.gnu.org/archive/html/help-gnu-emacs/2024-04/msg00126.html&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token defun&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;cl-defun&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;icomplete--render-vertical&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token arguments&quot;&gt;&lt;span class=&quot;token argument variable&quot;&gt;comps&lt;/span&gt; &lt;span class=&quot;token argument variable&quot;&gt;md&lt;/span&gt; &lt;span class=&quot;token other-marker-vars&quot;&gt;&lt;span class=&quot;token lisp-marker&quot;&gt;&amp;amp;aux&lt;/span&gt; &lt;span class=&quot;token argument variable&quot;&gt;scroll-above&lt;/span&gt; &lt;span class=&quot;token argument variable&quot;&gt;scroll-below&lt;/span&gt;
             &lt;span class=&quot;token varform&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;total-space&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;; number of mini-window lines available&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;1- &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;min&lt;/span&gt;
                   icomplete-prospects-height
                   &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;truncate&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;max-mini-window-lines&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;;; Welcome to loopapalooza!&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;;; First, be mindful of `icomplete-scroll' and manual scrolls.  If&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;;; `icomplete--scrolled-completions' and `icomplete--scrolled-past'&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;;; are:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;;; - both nil, there is no manual scroll;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;;; - both non-nil, there is a healthy manual scroll that doesn't need&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;;;   to be readjusted (user just moved around the minibuffer, for&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;;;   example)l&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;;; - non-nil and nil, respectively, a refiltering took place and we&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;;;   may need to readjust them to the new filtered `comps'.&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;when&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; icomplete-scroll
               icomplete--scrolled-completions
               &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt; icomplete--scrolled-past&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;cl-loop&lt;/span&gt; with preds
               for &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;comp&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; rest&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; on comps
               when &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;equal&lt;/span&gt; comp &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;car&lt;/span&gt; icomplete--scrolled-completions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
               do
               &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; icomplete--scrolled-past preds
                     comps &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;cons&lt;/span&gt; comp rest&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
               &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;completion--cache-all-sorted-completions&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;icomplete--field-beg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;icomplete--field-end&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                comps&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
               and return &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt;
               do &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;push&lt;/span&gt; comp preds&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
               finally &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; icomplete--scrolled-completions &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;;; Then, in this pretty ugly loop, collect completions to display&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;;; above and below the selected one, considering scrolling&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;;; positions.&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;cl-loop&lt;/span&gt; with preds = icomplete--scrolled-past
             with succs = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;cdr&lt;/span&gt; comps&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
             with space-above = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;-&lt;/span&gt; total-space
                                   &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
                                   &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;cl-loop&lt;/span&gt; for &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; r&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; on comps
                                            repeat &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;truncate&lt;/span&gt; total-space &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                                            while &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;listp&lt;/span&gt; r&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                                            count &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
             repeat total-space
             for neighbor = &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt;
             if &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; preds &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;&amp;gt;&lt;/span&gt; space-above &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; do
             &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;push&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; neighbor &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;pop&lt;/span&gt; preds&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; scroll-above&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
             &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;cl-decf&lt;/span&gt; space-above&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
             else if &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;consp&lt;/span&gt; succs&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; collect
             &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; neighbor &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;pop&lt;/span&gt; succs&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; into scroll-below-aux
             while neighbor
             finally &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; scroll-below scroll-below-aux&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;;; Halfway there...&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;let*&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;selected&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;propertize&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;car&lt;/span&gt; comps&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token quoted-symbol variable symbol&quot;&gt;'icomplete-selected&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
           &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;chosen&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;append&lt;/span&gt; scroll-above &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;list&lt;/span&gt; selected&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; scroll-below&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
           &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;tuples&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;icomplete--augment&lt;/span&gt; md chosen&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
           max-prefix-len max-comp-len lines nsections&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;add-face-text-property&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;length&lt;/span&gt; selected&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                              &lt;span class=&quot;token quoted-symbol variable symbol&quot;&gt;'icomplete-selected-match&lt;/span&gt; &lt;span class=&quot;token quoted-symbol variable symbol&quot;&gt;'append&lt;/span&gt; selected&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;;; Figure out parameters for horizontal spacing&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;cl-loop&lt;/span&gt;
       for &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;comp&lt;/span&gt; prefix&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; in tuples
       maximizing &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;length&lt;/span&gt; prefix&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; into max-prefix-len-aux
       maximizing &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;length&lt;/span&gt; comp&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; into max-comp-len-aux
       finally &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; max-prefix-len max-prefix-len-aux
                     max-comp-len max-comp-len-aux&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;;; Serialize completions and section titles into a list&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;;; of lines to render&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;cl-loop&lt;/span&gt;
       for &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;comp&lt;/span&gt; prefix suffix section&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; in tuples
       when section
       collect &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;propertize&lt;/span&gt; section &lt;span class=&quot;token quoted-symbol variable symbol&quot;&gt;'face&lt;/span&gt; &lt;span class=&quot;token quoted-symbol variable symbol&quot;&gt;'icomplete-section&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; into lines-aux
       and count &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; into nsections-aux
       when &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;get-text-property&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token quoted-symbol variable symbol&quot;&gt;'icomplete-selected&lt;/span&gt; comp&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
       do &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;add-face-text-property&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;length&lt;/span&gt; comp&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                                  &lt;span class=&quot;token quoted-symbol variable symbol&quot;&gt;'icomplete-selected-match&lt;/span&gt; &lt;span class=&quot;token quoted-symbol variable symbol&quot;&gt;'append&lt;/span&gt; comp&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
       collect &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;concat&lt;/span&gt; prefix
                       &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;make-string&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;-&lt;/span&gt; max-prefix-len &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;length&lt;/span&gt; prefix&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; ? &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                       &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;completion-lazy-hilit&lt;/span&gt; comp&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                       &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;make-string&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;-&lt;/span&gt; max-comp-len &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;length&lt;/span&gt; comp&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; ? &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                       suffix&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
       into lines-aux
       finally &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; lines lines-aux
                     nsections nsections-aux&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;;; Kick out some lines from the beginning due to extra sections.&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;;; This hopes to keep the selected entry more or less in the&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;;; middle of the dropdown-like widget when `icomplete-scroll' is&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;;; t.  Funky, but at least I didn't use `cl-loop'&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;setq&lt;/span&gt; lines
            &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;nthcdr&lt;/span&gt;
             &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;cond&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;length&lt;/span&gt; lines&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; total-space&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                   &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;length&lt;/span&gt; scroll-above&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;length&lt;/span&gt; scroll-below&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; nsections&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                   &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;min&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;ceiling&lt;/span&gt; nsections &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;length&lt;/span&gt; scroll-above&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
             lines&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token heading comment title&quot;&gt;;;; ------- NON ORIGINAL HERE...&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;when&lt;/span&gt; icomplete--in-region-buffer
        &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;column&lt;/span&gt;
               &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;with-current-buffer&lt;/span&gt; icomplete--in-region-buffer
                 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;save-excursion&lt;/span&gt;
                   &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;goto-char&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;car&lt;/span&gt; completion-in-region--data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                   &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;current-column&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;dolist&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;l&lt;/span&gt; lines&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;add-text-properties&lt;/span&gt;
             &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;display&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;,(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;concat&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;make-string&lt;/span&gt; column ?\s&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;substring&lt;/span&gt; l &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
             l&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token heading comment title&quot;&gt;;;; -------- NON ORIGINAL ENDS HERE...&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;;; At long last, render final string return value.  This may still&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;;; kick out lines at the end.&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;concat&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; \n&quot;&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;cl-loop&lt;/span&gt; for l in lines repeat total-space concat l concat &lt;span class=&quot;token string&quot;&gt;&quot;\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Is this patch the new default?&lt;/h2&gt;
&lt;p&gt;Not at all. As you might know, an initial &quot;it works&quot; does not mean it
is fully tested and free of bugs, right?&lt;/p&gt;
&lt;p&gt;I ended up not having the time to properly suggest some new features
to &lt;code&gt;icomplete&lt;/code&gt;, such as:&lt;/p&gt;
&lt;p&gt;• Turning this &quot;follow the cursor&quot; feature on/off&lt;/p&gt;
&lt;p&gt;• Providing a &quot;callback&quot; function where the user could customize what
function is wanted to perform this action&lt;/p&gt;
&lt;p&gt;• Providing a way to add markings, such as arrow indicators, prefixes,
suffixes, or maybe icons&lt;/p&gt;
&lt;p&gt;I thought I’d have the time, but it has been a while since April, and
other projects with already delayed statuses took priority. I figured
it might be a good idea to share with the community that this sort of
in-buffer completion is already possible with no external
packages, especially for those trying to keep their configurations more
purist.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The enhancements to &lt;code&gt;icomplete-vertical-mode&lt;/code&gt; presented in this post
demonstrate how a small patch can significantly improve the in-buffer
completion experience, making it more intuitive and aligned with
modern expectations. While this solution isn't yet part of the default
Emacs distribution, it shows the potential of leveraging existing
tools and a bit of customization to achieve powerful results.&lt;/p&gt;
&lt;p&gt;If you're an Emacs purist or just someone looking to simplify your
configuration without relying on external packages, this approach is
worth exploring. And who knows? With enough community interest, we
might see such improvements integrated into Emacs in the future.&lt;/p&gt;
&lt;p&gt;As always, feel free to share your thoughts, improvements, or
challenges in implementing this solution. Collaboration is what makes
the Emacs community thrive!&lt;/p&gt;
&lt;h3&gt;Edit&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;2024-12-25:&lt;/strong&gt; full code included the &lt;code&gt;icomplete--augment&lt;/code&gt; function, which we
did not change. Since it was mistakenly pasted there, I removed it.&lt;/p&gt;</content>
		<author>
			<name>Rahul Juliato</name>
			<uri>https://rahuljuliato.com</uri>
		</author>
		<source>
			<title type="html">Rahul's Blog | Emacs | RSS Feed</title>
			<subtitle type="html">Welcome to Rahul's Blog Emacs posts!</subtitle>
			<link rel="self" href="https://rahuljuliato.com/rss-emacs.xml"/>
			<id>https://rahuljuliato.com</id>
			<rights type="html">All rights reserved 2024</rights>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en">James Dyer: Calculate Number Of Days Between Two Dates</title>
		<link href="https://emacs.dyerdwelling.family/emacs/20241219132107-emacs--calculate-number-of-days-between-two-dates/"/>
		<id>https://emacs.dyerdwelling.family/emacs/20241219132107-emacs--calculate-number-of-days-between-two-dates/</id>
		<updated>2024-12-19T13:21:00+00:00</updated>
		<published></published>
		<content type="html">&lt;p&gt;Just a very quick one today.&lt;/p&gt;
&lt;p&gt;I recently needed to find the number of days between two dates. I thought this would be easy in Emacs, and indeed it was, but as with most things in Emacs, you need to know exactly what you’re doing. Here is the method I used:&lt;/p&gt;
&lt;pre tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-nil&quot; data-lang=&quot;nil&quot;&gt;  M-x =calendar=

  Navigate to the start date

  Set mark

  Navigate to the end date

  M-x =calendar-count-days-region=

  OR

  M-=
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Note that the count is inclusive of the mark, the documentation says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It is bound to M-=.&lt;/p&gt;
&lt;p&gt;Count the number of days (inclusive) between point and the mark.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure&gt;&lt;img src=&quot;https://emacs.dyerdwelling.family/ox-hugo/20241219132107-emacs--Calculate-Number-Of-Days-Between-Two-Dates.jpg&quot; width=&quot;100%&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;That is all. 🙂&lt;/p&gt;</content>
		<author>
			<name>James Dyer</name>
			<uri>https://emacs.dyerdwelling.family/tags/emacs/</uri>
		</author>
		<source>
			<title type="html">Emacs on Emacs@ Dyerdwelling</title>
			<subtitle type="html">Recent content in Emacs on Emacs@ Dyerdwelling</subtitle>
			<link rel="self" href="https://emacs.dyerdwelling.family/tags/emacs/index.xml"/>
			<id>https://emacs.dyerdwelling.family/tags/emacs/</id>
		</source>
	</entry>

	<entry>
		<title type="html">Charles Choi: Rethinking Minibuffer Movement</title>
		<link href="http://yummymelon.com/devnull/rethinking-minibuffer-movement.html"/>
		<id>http://yummymelon.com/devnull/rethinking-minibuffer-movement.html</id>
		<updated>2024-12-19T02:30:00+00:00</updated>
		<published>2024-12-19T02:30:00+00:00</published>
		<content type="html">&lt;p&gt;For your consideration, a possible quality of life improvement in using Emacs. Typically the next-to-the-smallest unit of point movement is by &lt;em&gt;word&lt;/em&gt;. This is reinforced by binding &lt;code&gt;M-f&lt;/code&gt; and &lt;code&gt;M-b&lt;/code&gt; to forward and backwards word movement respectively.&lt;/p&gt;
&lt;p&gt;When editing prose, this is sensible. For editing code and commands, I would argue this is &lt;em&gt;less&lt;/em&gt; so. This is because the unit of text I most want to move by is via &lt;em&gt;symbol&lt;/em&gt;. Common examples of symbols include variable/function/class names, command line options &amp;amp; arguments, and Makefile targets. Symbols frequently embed non-alphabetic characters (e.g. ‘foo-bar’, ‘bar_foo’, ‘foo/bar’) which are treated as word-separators by the commands &lt;code&gt;forward-word&lt;/code&gt; and &lt;code&gt;backward-word&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Movement by symbol is what I want whenever I’m editing in the &lt;strong&gt;minibuffer&lt;/strong&gt;. Muscle memory wants me to type &lt;code&gt;M-f&lt;/code&gt; or &lt;code&gt;M-b&lt;/code&gt;, which does the “wrong” thing here. But there are movement commands for a unit of text that handles symbols gracefully: that unit of text is called a &lt;em&gt;balanced expression&lt;/em&gt; (aka sexp). By default, moving by balanced expression is bound to &lt;code&gt;C-M-f&lt;/code&gt; for forwards movement, &lt;code&gt;C-M-b&lt;/code&gt; for backwards.&lt;/p&gt;
&lt;p&gt;Personally, I’m loathe to use keybindings involving more than two keys, so I’ve taken this tack: Swap (&lt;code&gt;M-f&lt;/code&gt;, &lt;code&gt;M-b&lt;/code&gt;) for balanced expression movement and (&lt;code&gt;C-M-f&lt;/code&gt;, &lt;code&gt;C-M-b&lt;/code&gt;) for word movement in modes that involve a lot of symbols.&lt;/p&gt;
&lt;p&gt;Another detail to consider is moving the point so that it is at the start of a unit of text. Both &lt;code&gt;forward-word&lt;/code&gt; and &lt;code&gt;forward-sexp&lt;/code&gt; are implemented so that the point is set at the end of a text unit. In many cases this adds editing friction for me because what I really want is for the point to be at the start of a text unit. To allow for this, I’ve implemented a function for moving forward a balanced expression that places the point at the start of the next sexp (&lt;code&gt;cc/next-sexp&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Code showing the implementation of &lt;code&gt;cc/next-sexp&lt;/code&gt; and configuring the minibuffer to swap the bindings for word and sexp movement is shown below:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;table class=&quot;highlighttable&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;linenos&quot;&gt;&lt;div class=&quot;linenodiv&quot;&gt;&lt;pre&gt;&lt;span class=&quot;normal&quot;&gt; 1&lt;/span&gt;
&lt;span class=&quot;normal&quot;&gt; 2&lt;/span&gt;
&lt;span class=&quot;normal&quot;&gt; 3&lt;/span&gt;
&lt;span class=&quot;normal&quot;&gt; 4&lt;/span&gt;
&lt;span class=&quot;normal&quot;&gt; 5&lt;/span&gt;
&lt;span class=&quot;normal&quot;&gt; 6&lt;/span&gt;
&lt;span class=&quot;normal&quot;&gt; 7&lt;/span&gt;
&lt;span class=&quot;normal&quot;&gt; 8&lt;/span&gt;
&lt;span class=&quot;normal&quot;&gt; 9&lt;/span&gt;
&lt;span class=&quot;normal&quot;&gt;10&lt;/span&gt;
&lt;span class=&quot;normal&quot;&gt;11&lt;/span&gt;
&lt;span class=&quot;normal&quot;&gt;12&lt;/span&gt;
&lt;span class=&quot;normal&quot;&gt;13&lt;/span&gt;
&lt;span class=&quot;normal&quot;&gt;14&lt;/span&gt;
&lt;span class=&quot;normal&quot;&gt;15&lt;/span&gt;
&lt;span class=&quot;normal&quot;&gt;16&lt;/span&gt;
&lt;span class=&quot;normal&quot;&gt;17&lt;/span&gt;
&lt;span class=&quot;normal&quot;&gt;18&lt;/span&gt;
&lt;span class=&quot;normal&quot;&gt;19&lt;/span&gt;
&lt;span class=&quot;normal&quot;&gt;20&lt;/span&gt;
&lt;span class=&quot;normal&quot;&gt;21&lt;/span&gt;
&lt;span class=&quot;normal&quot;&gt;22&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;keymap-set&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;minibuffer-mode-map&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;M-b&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;#'&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;backward-sexp&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;keymap-set&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;minibuffer-mode-map&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;M-f&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;#'&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;cc/next-sexp&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;keymap-set&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;minibuffer-mode-map&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;C-M-b&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;#'&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;backward-word&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;keymap-set&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;minibuffer-mode-map&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;C-M-f&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;#'forward-word&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;defun&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;cc/--next-sexp-raw&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Raw implementation to move point to the beginning of the next sexp.&lt;/span&gt;

&lt;span class=&quot;s&quot;&gt;This function has no error checking.&quot;&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;forward-sexp&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;backward-sexp&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;defun&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;cc/next-sexp&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Move point to beginning of the next balanced expression (sexp).&quot;&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;interactive&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;condition-case&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;cc/--next-sexp-raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ne&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;condition-case&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;               &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;forward-sexp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;             &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ne&quot;&gt;error&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;              &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;message&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;               &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Unable to move point to next balanced expression (sexp).&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The same swap can be applied when calling &lt;code&gt;eval-expression&lt;/code&gt; (&lt;code&gt;M-:&lt;/code&gt;). The keymap to configure here is &lt;code&gt;minibuffer-local-shell-command-map&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;table class=&quot;highlighttable&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;linenos&quot;&gt;&lt;div class=&quot;linenodiv&quot;&gt;&lt;pre&gt;&lt;span class=&quot;normal&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;normal&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;normal&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;normal&quot;&gt;4&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;keymap-set&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;minibuffer-local-shell-command-map&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;M-b&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;#'&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;backward-sexp&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;keymap-set&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;minibuffer-local-shell-command-map&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;M-f&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;#'&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;cc/next-sexp&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;keymap-set&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;minibuffer-local-shell-command-map&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;C-M-b&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;#'&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;backward-word&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;keymap-set&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;minibuffer-local-shell-command-map&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;C-M-f&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;#'forward-word&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Why stop there? Let’s change it for Elisp mode:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;table class=&quot;highlighttable&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;linenos&quot;&gt;&lt;div class=&quot;linenodiv&quot;&gt;&lt;pre&gt;&lt;span class=&quot;normal&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;normal&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;normal&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;normal&quot;&gt;4&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;keymap-set&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;emacs-lisp-mode-map&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;M-b&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;#'&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;backward-sexp&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;keymap-set&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;emacs-lisp-mode-map&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;M-f&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;#'&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;cc/next-sexp&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;keymap-set&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;emacs-lisp-mode-map&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;C-M-b&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;#'&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;backward-word&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;keymap-set&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;emacs-lisp-mode-map&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;C-M-f&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;#'forward-word&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This idea can be extended to other modes such as Eshell.&lt;/p&gt;
&lt;h1&gt;Closing Thoughts&lt;/h1&gt;
&lt;p&gt;I’ve been living with this setup for a month now and anecdotally I’ve found this to feel “right” enough to merit making a post. For those readers who do not consider this post’s suggestion heretical, I’d encourage to give these changes a try. Perhaps you’ll find yourself pleasantly surprised.&lt;/p&gt;</content>
		<author>
			<name>Charles Choi</name>
			<uri>http://yummymelon.com/devnull/</uri>
		</author>
		<source>
			<title type="html">notes from /dev/null - emacs</title>
			<link rel="self" href="http://yummymelon.com/devnull/feeds/tags/emacs.atom.xml"/>
			<id>http://yummymelon.com/devnull/</id>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en-us">Tim Heaney: Linen Layout</title>
		<link href="https://oylenshpeegul.gitlab.io/blog/posts/20241219/"/>
		<id>https://oylenshpeegul.gitlab.io/blog/posts/20241219/</id>
		<updated>2024-12-19T00:00:00+00:00</updated>
		<published></published>
		<content type="html">Today's Advent of Code was so fun, I couldn't stop re-implementing it! (spoiler alert: if you haven't done the 2024-12-19 puzzle yet, stop reading now!) Here it is in Perl
#!/usr/bin/env perl use v5.40; use List::Util qw(sum); use Path::Tiny; my $filename = shift @ARGV // 'example'; my $contents = path($filename)-&amp;gt;slurp; my @paragraphs = split /\n\n/, $contents; my @towels = split /, /, $paragraphs[0]; my @designs = split ' ', $paragraphs[1]; my @ways = map { ways($_, @towels) } @designs; my $part1 = grep { $_ &amp;gt; 0 } @ways; say $part1; my $part2 = sum @ways; say $part2; sub ways($design, @towels) { my @v = (0) x length $design; push @v, 1; for (my $i = length $design; $i &amp;gt;= 0; $i--) { for my $towel (@towels) { my $tail = substr $design, $i; $v[$i] += $v[$i + length $towel] if $tail =~/^$towel/; } } return $v[0]; }   Python</content>
		<author>
			<name>Tim Heaney</name>
			<uri>https://oylenshpeegul.gitlab.io/blog/tags/emacs/</uri>
		</author>
		<source>
			<title type="html">emacs on oylenshpeegul</title>
			<subtitle type="html">Recent content in emacs on oylenshpeegul</subtitle>
			<link rel="self" href="https://oylenshpeegul.gitlab.io/blog/tags/emacs/index.xml"/>
			<id>https://oylenshpeegul.gitlab.io/blog/tags/emacs/</id>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en-US">Irreal: Building Emacs Configurations</title>
		<link href="https://irreal.org/blog/?p=12657"/>
		<id>https://irreal.org/blog/?p=12657</id>
		<updated>2024-12-18T16:06:46+00:00</updated>
		<published></published>
		<content type="html" xml:lang="en-US">&lt;p&gt;
Jack Baty has a post that considers &lt;a href=&quot;https://baty.net/2024/12/emacs-from-scratch-once-again/&quot;&gt;the best way of building an Emacs configuration&lt;/a&gt;. On the one hand, something like &lt;a href=&quot;https://github.com/doomemacs/doomemacs&quot;&gt;Doom Emacs&lt;/a&gt; provides a complete, no-brainer configuration that requires little effort on the part of the user. On the other hand, some people want to build their own and while they may accept some help basically want to be in complete control.
&lt;/p&gt;
&lt;p&gt;
A curmudgeon might suggest that those in the former class consider moving to something like VS Code. After all, that’s the strength of editors like VS Code: no thought configuration that works out of the box. But that’s not really fair. Emacs is, for sure, a DYI editor kit but some folks just want to enjoy its superior editing environment without having to build it for themselves. One of the glories of Emacs is that you can have it either way.
&lt;/p&gt;
&lt;p&gt;
For my part, I would never want to use a prepackaged configuration. From the beginning of  my career—from my n00biest of n00b days—I have hated black boxes. Every time I found one—usually in the form of a library routine—I had to peek inside to see what was really happening. My Emacs configuration is the same: I want to understand everything that’s going on.
&lt;/p&gt;
&lt;p&gt;
I could, of course, use something like doom and figure what was going on but why? An Emacs configuration is—or should be—highly personal, sculpted to precisely fit your workflow. It’s true that building it piece-by-piece will take longer but in the end you will have something that fits your needs exactly and that you understand completely.&lt;/p&gt;</content>
		<author>
			<name>jcs</name>
			<uri>https://irreal.org/blog</uri>
		</author>
		<source>
			<title type="html">Emacs – Irreal</title>
			<subtitle type="html">The minds had long ago come up with a proper name for it; they called it the Irreal, but they thought of it as Infinite Fun. That was what they really knew it as. The Land of Infinite Fun. --Iain M. Banks, Excession</subtitle>
			<link rel="self" href="http://irreal.org/blog/?tag=emacs&amp;feed=rss2"/>
			<id>https://irreal.org/blog</id>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en">Thanos Apollo: Progress update on org-gnosis &amp;amp; a graphical interface addition.</title>
		<link href="https://thanosapollo.org/posts/org-gnosis-progress-1/"/>
		<id>https://thanosapollo.org/posts/org-gnosis-progress-1/</id>
		<updated>2024-12-18T00:00:00+00:00</updated>
		<published></published>
		<content type="html" xml:lang="en">&lt;p&gt;&lt;img alt=&quot;Org Gnosis With UI&quot; src=&quot;https://thanosapollo.org/images/org-gnosis-ui-01.png&quot; /&gt;
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;org-gnosis node &amp;amp; my &lt;a href=&quot;https://git.thanosapollo.org/org-roam-ui/&quot;&gt;fork&lt;/a&gt; of org-roam-ui&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Project Name&lt;/strong&gt;: &lt;code&gt;org-gnosis&lt;/code&gt; | &lt;strong&gt;Org&lt;/strong&gt;anization of &lt;strong&gt;Gnosis&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I’ve been working on a “roam-like” note taking system, to replace &amp;amp;
update my current &lt;code&gt;org-roam&lt;/code&gt; workflow.  This post is a minor update on
the current state of it’s development.&lt;/p&gt;
&lt;h2 id=&quot;goals&quot;&gt;Goals&lt;/h2&gt;
&lt;p&gt;The goals of &lt;code&gt;org-gnosis&lt;/code&gt; are as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Keep it minimal, only implement parsing &amp;amp; input data to a database.
&lt;ul&gt;
&lt;li&gt;Do not want to exceed 700 lines of code, &lt;em&gt;currently it’s at 490&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Incorporate nodes as sources for &lt;a href=&quot;http://localhost:1313/projects/gnosis/&quot;&gt;gnosis&lt;/a&gt; notes.
&lt;ul&gt;
&lt;li&gt;Having nodes as sources can replace my &lt;em&gt;extras&lt;/em&gt; section.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Make it easily extensible
&lt;ul&gt;
&lt;li&gt;Parsing functionality of &lt;code&gt;org-gnosis&lt;/code&gt; should be easily customized to
work with other note taking tools.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Separate journals from note taking&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;how-things-are-going&quot;&gt;How things are going&lt;/h2&gt;
&lt;p&gt;The goals above have been achieved, except for the incorporation with
my SRS system &amp;amp; it’s customization to parse non &lt;code&gt;org-mode&lt;/code&gt; buffers can
be kinda tricky.  Despite that, it has been a drop-in replacement for
my previous &lt;code&gt;org-roam&lt;/code&gt; workflow.&lt;/p&gt;
&lt;p&gt;I’ve also created a fork of
&lt;a href=&quot;https://git.thanosapollo.org/org-roam-ui/&quot;&gt;org-roam-ui&lt;/a&gt; that I’ve
been using to visualize my notes.  I will be testing this package and
&lt;em&gt;hopefully&lt;/em&gt; publishing on either nongnu elpa or melpa &lt;em&gt;soon&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;If you are interested, try it out from this repo
&lt;a href=&quot;https://git.thanosapollo.org/org-gnosis/&quot;&gt;here&lt;/a&gt;.  If you find any
issues or got any questions feel free to email me.&lt;/p&gt;</content>
		<author>
			<name>Thanos Apollo</name>
			<uri>https://thanosapollo.org/categories/emacs/</uri>
		</author>
		<source>
			<title type="html">Emacs on Thanos Apollo</title>
			<subtitle type="html">Recent content in Emacs on Thanos Apollo</subtitle>
			<link rel="self" href="https://thanosapollo.org/categories/emacs/index.xml"/>
			<id>https://thanosapollo.org/categories/emacs/</id>
		</source>
	</entry>

	<entry>
		<title type="html">Rahul Juliato: How to Share Your Emacs Configuration Between Different Machines (and Architectures) with Native Compilation</title>
		<link href="https://rahuljuliato.com/posts/multiple-eln-cache"/>
		<id>https://rahuljuliato.com/posts/multiple-eln-cache</id>
		<updated>2024-12-17T17:00:00+00:00</updated>
		<published></published>
		<content type="html">&lt;h1&gt;How to Share Your Emacs Configuration Between Different Machines (and Architectures) with Native Compilation&lt;/h1&gt;
&lt;p&gt;If you use Emacs on multiple machines, especially ones running
different architectures or operating systems, sharing your Emacs
configuration across those machines can become tricky. Add native
compilation (introduced in Emacs 28) to the mix, and you might run
into conflicts when Emacs tries to reuse compiled &lt;code&gt;.eln&lt;/code&gt; files between
machines.&lt;/p&gt;
&lt;p&gt;Fortunately, with a bit of smart configuration, you can make Emacs
share your configuration while keeping native compilation
enabled for each machine. In this post, I'll show you how to set up
your Emacs so that native compilation caches (&lt;code&gt;.eln&lt;/code&gt; files) are kept
separate for each machine. We'll also discuss why this is important
and what your directory structure will look like.&lt;/p&gt;
&lt;h2&gt;Why Is This Important?&lt;/h2&gt;
&lt;p&gt;Emacs uses native compilation to compile Elisp files into optimized
&lt;code&gt;.eln&lt;/code&gt; binaries, which are architecture and system-dependent. If you
share your Emacs configuration across machines without accounting for
this, you may encounter issues:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Conflicting &lt;code&gt;.eln&lt;/code&gt; files&lt;/strong&gt;: A &lt;code&gt;.eln&lt;/code&gt; file compiled for a Linux
machine might not work on a macOS machine.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Unnecessary recompilations&lt;/strong&gt;: Emacs may attempt to recompile
packages on each startup, which can slow things down and clutter your
&lt;code&gt;eln-cache&lt;/code&gt; directory.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;By separating the native compilation cache for each machine, you ensure:&lt;/p&gt;
&lt;p&gt;• Faster startup times since Emacs doesn't recompile already-compiled
code.&lt;/p&gt;
&lt;p&gt;• A cleaner and more predictable setup across machines.&lt;/p&gt;
&lt;h2&gt;The Solution: Machine-Specific &lt;code&gt;eln-cache&lt;/code&gt; Directories&lt;/h2&gt;
&lt;p&gt;To keep &lt;code&gt;.eln&lt;/code&gt; files organized and avoid conflicts, you can configure
Emacs to use a machine-specific &lt;code&gt;eln-cache&lt;/code&gt; directory. Here's the
configuration snippet to add into your &lt;code&gt;early-init.el&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;remark-highlight&quot;&gt;&lt;pre class=&quot;language-emacs-lisp&quot;&gt;&lt;code class=&quot;language-emacs-lisp&quot;&gt;&lt;span class=&quot;token heading comment title&quot;&gt;;;; Native Compile Settings&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;;; I use a &amp;lt;emacs-default-dir&amp;gt;/eln-cache-&amp;lt;machine-hostname&amp;gt;/ dir to store&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;;; my different machines' eln compiled code. This allows the same config&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;;; to be used on several machines without conflicts.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;;; This is added in early-init.el to prevent unwanted recompilations.&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;when&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;featurep&lt;/span&gt; &lt;span class=&quot;token quoted-symbol variable symbol&quot;&gt;'native-compile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;;; Set the right directory to store the native compilation cache&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;path&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;expand-file-name&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;concat&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;eln-cache-&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;system-name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; user-emacs-directory&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;setq-default&lt;/span&gt; native-comp-eln-load-path       &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;list&lt;/span&gt; path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
				  native-compile-target-directory path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;startup-redirect-eln-cache&lt;/span&gt; path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token car&quot;&gt;setq-default&lt;/span&gt; native-comp-async-report-warnings-errors &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;;; Silence compiler warnings as they can be disruptive&lt;/span&gt;
				native-comp-jit-compilation              &lt;span class=&quot;token boolean&quot;&gt;t&lt;/span&gt;    &lt;span class=&quot;token comment&quot;&gt;;; Enable async native compilation&lt;/span&gt;
				package-native-compile                   &lt;span class=&quot;token boolean&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;;; Compile installed packages&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;What Does This Code Do?&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;(system-name):&lt;/code&gt; Retrieves the hostname of the machine. This is
used to create a unique directory for each machine's eln-cache.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;expand-file-name:&lt;/code&gt; Combines the Emacs configuration directory
(user-emacs-directory) with the machine-specific
&lt;code&gt;eln-cache-&amp;lt;hostname&amp;gt;&lt;/code&gt; folder.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;native-comp-eln-load-path&lt;/code&gt; and &lt;code&gt;native-compile-target-directory:&lt;/code&gt;
Set the paths for Emacs to store and load the compiled &lt;code&gt;.eln&lt;/code&gt; files.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;startup-redirect-eln-cache:&lt;/code&gt; Ensures Emacs uses the specified
eln-cache directory right from startup.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Optional settings:&lt;/p&gt;
&lt;p&gt;• &lt;code&gt;native-comp-async-report-warnings-errors:&lt;/code&gt; Silences disruptive compiler warnings.&lt;/p&gt;
&lt;p&gt;• &lt;code&gt;native-comp-jit-compilation:&lt;/code&gt; Enables Just-In-Time (JIT) native
compilation for faster execution.&lt;/p&gt;
&lt;p&gt;• &lt;code&gt;package-native-compile:&lt;/code&gt; Ensures all installed packages are
natively compiled.&lt;/p&gt;
&lt;p&gt;By placing this in your &lt;code&gt;early-init.el&lt;/code&gt;, you make sure Emacs sets up
the &lt;code&gt;eln-cache&lt;/code&gt; directory &lt;em&gt;before&lt;/em&gt; it starts loading packages or
recompiling files.&lt;/p&gt;
&lt;h2&gt;Folder Structure Example&lt;/h2&gt;
&lt;p&gt;Let's say you have two machines, with the following hostnames:&lt;/p&gt;
&lt;p&gt;• &lt;code&gt;debian:&lt;/code&gt; A Linux workstation.&lt;/p&gt;
&lt;p&gt;• &lt;code&gt;macbook:&lt;/code&gt; A macOS laptop.&lt;/p&gt;
&lt;p&gt;With the above configuration, your Emacs directory structure will look like this:&lt;/p&gt;
&lt;div class=&quot;remark-highlight&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;~/.emacs.d/
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;-- early-init.el
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;-- init.el
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;-- eln-cache-debian/          &lt;span class=&quot;token comment&quot;&gt;# Cache for 'debian'&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;-- abcdef01-abcdefgh01.eln
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;-- xyz12345-xyzabc123.eln
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;-- eln-cache-macbook/         &lt;span class=&quot;token comment&quot;&gt;# Cache for 'macbook'&lt;/span&gt;
	&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;-- abcdef01-abcdefgh01.eln
	&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;-- pqr67890-pqrxyz678.eln
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Setting Up for a New Machine&lt;/h2&gt;
&lt;p&gt;If you're setting up Emacs on a new machine:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Clone or copy your shared Emacs configuration (e.g., from GitHub).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make sure the above snippet is in your early-init.el.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start Emacs. It will automatically create a new
&lt;code&gt;eln-cache-&amp;lt;hostname&amp;gt;&lt;/code&gt; directory and begin compiling packages natively
for the current machine.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Sharing Emacs configurations across machines doesn't have to be a
hassle, even when using native compilation. By directing Emacs to use
machine-specific eln-cache directories, you can:&lt;/p&gt;
&lt;p&gt;• Avoid conflicts caused by incompatible .eln files.&lt;/p&gt;
&lt;p&gt;• Speed up startup times by preventing unnecessary recompilations.&lt;/p&gt;
&lt;p&gt;• Maintain a clean and organized Emacs setup.&lt;/p&gt;
&lt;p&gt;I hope with the provided configuration, you can easily manage Emacs on
multiple machines—whether you're switching between Linux, macOS, or
different hardware architectures.&lt;/p&gt;
&lt;p&gt;Happy hacking!&lt;/p&gt;</content>
		<author>
			<name>Rahul Juliato</name>
			<uri>https://rahuljuliato.com</uri>
		</author>
		<source>
			<title type="html">Rahul's Blog | Emacs | RSS Feed</title>
			<subtitle type="html">Welcome to Rahul's Blog Emacs posts!</subtitle>
			<link rel="self" href="https://rahuljuliato.com/rss-emacs.xml"/>
			<id>https://rahuljuliato.com</id>
			<rights type="html">All rights reserved 2024</rights>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en-US">Irreal: What’s New In Emacs</title>
		<link href="https://irreal.org/blog/?p=12655"/>
		<id>https://irreal.org/blog/?p=12655</id>
		<updated>2024-12-17T16:41:45+00:00</updated>
		<published></published>
		<content type="html" xml:lang="en-US">&lt;p&gt;
There are lots of different types of Emacs users, of course, but two distinct classes are those, like me, who stay pretty much up-to-date and those who are stilling running old versions of Emacs and are not familiar with what the latest releases have to offer.
&lt;/p&gt;
&lt;p&gt;
It’s easy to dismiss the latter class as a small, insignificant group of users but I’d guess that there are more of them than many of us suspect. Over at &lt;a href=&quot;https://lambdaland.org&quot;&gt;Lambda Land&lt;/a&gt;, Ashton Wiersdorf has an interesting post &lt;a href=&quot;https://lambdaland.org/posts/2024-12-14_emacs_catchup/&quot;&gt;on what’s new in Emacs in the last decade&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Even if you stay up to date, it’s interesting to see how Emacs has progressed in the last decade. Wiersdorf’s lists several broad groups of improvement:
&lt;/p&gt;
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;Completions&lt;/li&gt;
&lt;li&gt;Eglot&lt;/li&gt;
&lt;li&gt;Projects&lt;/li&gt;
&lt;li&gt;Tree-sitter&lt;/li&gt;
&lt;li&gt;Dictionary lookup
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;Flyspell&lt;/li&gt;
&lt;li&gt;Diictionary definition lookup&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Visual Line Mode&lt;/li&gt;
&lt;li&gt;Themes&lt;/li&gt;
&lt;li&gt;Package Manager&lt;/li&gt;
&lt;li&gt;Emacs Ecosystem
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;Magit&lt;/li&gt;
&lt;li&gt;Vertico&lt;/li&gt;
&lt;li&gt;Consult&lt;/li&gt;
&lt;li&gt;Corfu&lt;/li&gt;
&lt;li&gt;Citar&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Wiersdorf also has a starter kit, &lt;a href=&quot;https://github.com/ashton314/emacs-bedrock&quot;&gt;emacs-bedrock&lt;/a&gt; that provides some of these improvements for those who would like to move up. If you’d like to update your Emacs experience, take a look at Wiersdorf’s post.&lt;/p&gt;</content>
		<author>
			<name>jcs</name>
			<uri>https://irreal.org/blog</uri>
		</author>
		<source>
			<title type="html">Emacs – Irreal</title>
			<subtitle type="html">The minds had long ago come up with a proper name for it; they called it the Irreal, but they thought of it as Infinite Fun. That was what they really knew it as. The Land of Infinite Fun. --Iain M. Banks, Excession</subtitle>
			<link rel="self" href="http://irreal.org/blog/?tag=emacs&amp;feed=rss2"/>
			<id>https://irreal.org/blog</id>
		</source>
	</entry>

	<entry>
		<title type="html">Marie K. Ekeberg: 24 Emacs packages and utilities to try while counting down to Jul/Christmas/Holidays</title>
		<link href="https://themkat.net/2024/12/17/twenty_four_emacs_packages.html"/>
		<id>https://themkat.net/2024/12/17/twenty_four_emacs_packages.html</id>
		<updated>2024-12-17T00:00:00+00:00</updated>
		<published>2024-12-17T00:00:00+00:00</published>
		<content type="html">There are many good Emacs packages and utilities out there. Why not pick 24 of them to count down to Jul/Christmas? That is exactly what I have done here. Maybe you can find a new package or feature to play with if you have some holidays coming up?</content>
		<author>
			<name>Marie K. Ekeberg</name>
			<uri>https://themkat.net/</uri>
		</author>
		<source>
			<title type="html">TheMKat’s blog</title>
			<link rel="self" href="https://themkat.net/feed/by_tag/emacs.xml"/>
			<id>https://themkat.net/feed/by_tag/emacs.xml</id>
		</source>
	</entry>

	<entry>
		<title type="html">Protesilaos Stavrou: Emacs: two new Standard themes (‘standard-light-tinted’ and ‘standard-dark-tinted’)</title>
		<link href="https://protesilaos.com/codelog/2024-12-17-emacs-standard-themes-tinted/"/>
		<id>https://protesilaos.com/codelog/2024-12-17-emacs-standard-themes-tinted/</id>
		<updated>2024-12-17T00:00:00+00:00</updated>
		<published></published>
		<content type="html">&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;standard-themes&lt;/code&gt; is my third theme-related project. Unlike the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;modus-themes&lt;/code&gt; and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ef-themes&lt;/code&gt;, I try to remain in line with the
out-of-the-box looks of Emacs, even though I personally dislike them.
The purpose of the Standard themes is to provide the missing theme
framework of that default aesthetic, so that users can enjoy the
customisability and stylistic consistency it brings.&lt;/p&gt;

&lt;p&gt;The themes provide lots of customisation options, including the
ability to override their palette (always check the manual). While
this is a powerful feature, it only yields good results when the
selection of colour values is done methodically. To make it easier for
users to have a style that is like the default, but a bit more
opinionated, I developed the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;standard-light-tinted&lt;/code&gt; and
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;standard-dark-tinted&lt;/code&gt; themes. The former has an earthly feel to it.
The latter draws inspiration from the night sky.&lt;/p&gt;

&lt;p&gt;Both of those themes are consistent with their &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;standard-light&lt;/code&gt; and
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;standard-dark&lt;/code&gt; counterparts, though they deviate from them in many
important details.&lt;/p&gt;

&lt;p&gt;Below are the samples of all the themes (click to enlarge).&lt;/p&gt;

&lt;h2&gt;Standard light&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://protesilaos.com/assets/images/standard/standard-light.png&quot;&gt;&lt;img alt=&quot;standard-light theme code sample&quot; src=&quot;https://protesilaos.com/assets/images/standard/standard-light.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Standard light tinted&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://protesilaos.com/assets/images/standard/standard-light-tinted.png&quot;&gt;&lt;img alt=&quot;standard-light-tinted theme code sample&quot; src=&quot;https://protesilaos.com/assets/images/standard/standard-light-tinted.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Standard dark&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://protesilaos.com/assets/images/standard/standard-dark.png&quot;&gt;&lt;img alt=&quot;standard-dark theme code sample&quot; src=&quot;https://protesilaos.com/assets/images/standard/standard-dark.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Standard dark tinted&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://protesilaos.com/assets/images/standard/standard-dark-tinted.png&quot;&gt;&lt;img alt=&quot;standard-dark-tinted theme code sample&quot; src=&quot;https://protesilaos.com/assets/images/standard/standard-dark-tinted.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Part of 2.2.0-dev&lt;/h2&gt;

&lt;p&gt;I am still refining the package before publishing version &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2.2.0&lt;/code&gt;.
There are lots of other features included, such as the command that
goes through all the Standard themes in rotation (plus the relevant
user option).&lt;/p&gt;

&lt;p&gt;If you do try the development version and notice any issues, please
let me know.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Package name (GNU ELPA): &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;standard-themes&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Official manual: &lt;a href=&quot;https://protesilaos.com/emacs/standard-themes&quot;&gt;https://protesilaos.com/emacs/standard-themes&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Change log: &lt;a href=&quot;https://protesilaos.com/emacs/standard-themes-changelog&quot;&gt;https://protesilaos.com/emacs/standard-themes-changelog&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Sample pictures: &lt;a href=&quot;https://protesilaos.com/emacs/standard-themes-pictures&quot;&gt;https://protesilaos.com/emacs/standard-themes-pictures&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Git repositories:
    &lt;ul&gt;
      &lt;li&gt;GitHub: &lt;a href=&quot;https://github.com/protesilaos/standard-themes&quot;&gt;https://github.com/protesilaos/standard-themes&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;GitLab: &lt;a href=&quot;https://gitlab.com/protesilaos/standard-themes&quot;&gt;https://gitlab.com/protesilaos/standard-themes&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Backronym: Standard Themes Are Not Derivatives but the
Affectionately Reimagined Default … themes.&lt;/li&gt;
&lt;/ul&gt;</content>
		<author>
			<name>Protesilaos Stavrou</name>
			<uri>https://protesilaos.com/codelog</uri>
		</author>
		<source>
			<title type="html">Protesilaos Stavrou: Coding blog</title>
			<subtitle type="html">Coding blog</subtitle>
			<link rel="self" href="https://protesilaos.com/codelog.xml"/>
			<id>https://protesilaos.com/codelog</id>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en-us">Emacs APAC: Announcing Emacs Asia-Pacific (APAC) virtual meetup, Saturday, December 28, 2024</title>
		<link href="https://emacs-apac.gitlab.io/announcements/december-2024/"/>
		<id>https://emacs-apac.gitlab.io/announcements/december-2024/</id>
		<updated>2024-12-16T18:39:40+00:00</updated>
		<published></published>
		<content type="html">&lt;p&gt;This month’s &lt;a href=&quot;https://emacs-apac.gitlab.io&quot;&gt;Emacs Asia-Pacific (APAC)&lt;/a&gt;
virtual meetup is scheduled for Saturday, December
28, 2024 with BigBlueButton and &lt;code&gt;#emacs&lt;/code&gt;
on Libera Chat IRC. The timing will be &lt;a href=&quot;https://emacs-apac.gitlab.io/categories/event/index.xml&quot; title=&quot;02:00 PM Indian Standard Time. UTC+05:30&quot;&gt;1400 to 1500 IST&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The meetup might get extended by 30 minutes if there is any talk, this
page will be updated accordingly.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;If you would like to give a demo or talk (maximum 20 minutes) on GNU
Emacs or any variant, please contact &lt;code&gt;bhavin192&lt;/code&gt; on Libera Chat with
your talk details:&lt;/p&gt;</content>
		<author>
			<name>Emacs APAC</name>
			<uri>https://emacs-apac.gitlab.io/categories/event/</uri>
		</author>
		<source>
			<title type="html">Event on Emacs APAC</title>
			<subtitle type="html">Recent content in Event on Emacs APAC</subtitle>
			<link rel="self" href="https://emacs-apac.gitlab.io/categories/event/index.xml"/>
			<id>https://emacs-apac.gitlab.io/categories/event/</id>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en-US">Sacha Chua: 2024-12-16 Emacs news</title>
		<link href="https://sachachua.com/blog/2024/12/2024-12-16-emacs-news/"/>
		<id>https://sachachua.com/blog/2024/12/2024-12-16-emacs-news/</id>
		<updated>2024-12-16T17:34:21+00:00</updated>
		<published></published>
		<content type="html">&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;Help wanted:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://list.orgmode.org/87msgzh1dh.fsf@localhost&quot;&gt;Org Mode requests: [RFC] The best way to choose an &quot;action&quot; at point: context-menu-mode, transient, which-key or embark? (was: Fwd: Org-cite: Replace basic follow-processor with transient menu?)&lt;/a&gt;
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://lists.gnu.org/archive/html/emacs-devel/2024-12/msg00559.html&quot;&gt;also on emacs-devel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://list.orgmode.org/87seqqg38b.fsf@localhost&quot;&gt;Org Mode requests: [TASK] Documenting ob-fortran, ob-forth, ob-sed, ob-ocaml, ob-ruby, and ob-sass (was: [TASK] Move babel backend docs from WORG to Org manual)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lists.gnu.org/archive/html/emacs-devel/2024-12/msg00359.html&quot;&gt;Merging MPS a.k.a. scratch/igc, yet again&lt;/a&gt; - documentation help wanted for README-IGC, build instructions for Debian etc.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Upcoming events (&lt;a href=&quot;https://emacslife.com/calendar/emacs-calendar.ics&quot;&gt;iCal file&lt;/a&gt;, &lt;a href=&quot;https://emacslife.com/calendar/&quot;&gt;Org&lt;/a&gt;):
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;M-x Research: TBA &lt;a href=&quot;https://m-x-research.github.io/&quot;&gt;https://m-x-research.github.io/&lt;/a&gt; Wed Dec 18 0800 America/Vancouver - 1000 America/Chicago - 1100 America/Toronto - 1600 Etc/GMT - 1700 Europe/Berlin - 2130 Asia/Kolkata – Thu Dec 19 0000 Asia/Singapore&lt;/li&gt;
&lt;li&gt;Emacs Berlin (virtual, in English) &lt;a href=&quot;https://emacs-berlin.org/&quot;&gt;https://emacs-berlin.org/&lt;/a&gt; Wed Dec 25 0930 America/Vancouver - 1130 America/Chicago - 1230 America/Toronto - 1730 Etc/GMT - 1830 Europe/Berlin - 2300 Asia/Kolkata – Thu Dec 26 0130 Asia/Singapore&lt;/li&gt;
&lt;li&gt;Emacs APAC (virtual) &lt;a href=&quot;https://emacs-apac.gitlab.io/&quot;&gt;https://emacs-apac.gitlab.io/&lt;/a&gt; Sat Dec 28 0030 America/Vancouver - 0230 America/Chicago - 0330 America/Toronto - 0830 Etc/GMT - 0930 Europe/Berlin - 1400 Asia/Kolkata - 1630 Asia/Singapore&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Emacs configuration:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1he7ghg/recommendations_of_emacs_config/&quot;&gt;Recommendations of emacs config&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://baty.net/2024/12/emacs-from-scratch-once-again/&quot;&gt;Jack Baty: Emacs from scratch once again&lt;/a&gt; (&lt;a href=&quot;https://irreal.org/blog/?p=12657&quot;&gt;Irreal&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://news.ycombinator.com/item?id=42428762&quot;&gt;Show HN: Small Collection of Emacs Packages | Hacker News&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1heejxn/release_emacskick_013_for_vimneovim_users_ready/&quot;&gt;[Release] Emacs-Kick 0.1.3 – For Vim/Neovim Users Ready to Explore Emacs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://fediverse.tv/videos/watch/c70d6802-7c48-4e0c-8578-fb32cc26d357&quot;&gt;Configurar Emacs usando emacs-lisp (0x0005) - FTV&lt;/a&gt; (&lt;a href=&quot;https://techhub.social/@barocio/113651007187044891&quot;&gt;@barocio@techhub.social&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Emacs Lisp:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://codeberg.org/pkal/do-at-point&quot;&gt;do-at-point: A generic action dispatcher for Emacs&lt;/a&gt; - simpler than Embark, uses thing-at-point&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://flandrew.srht.site/listful/map-vs-other-libraries-through-hundreds-of-examples.html&quot;&gt;Listful Andrew: map.el vs. other libraries through hundreds of examples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://flandrew.srht.site/listful/seq-vs-other-libraries-through-hundreds-of-examples.html&quot;&gt;Listful Andrew: seq.el vs. other libraries through hundreds of examples&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Appearance:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://files.mastodon.social/cache/media_attachments/files/113/636/526/704/442/800/original/b6e749c63e775d26.png&quot;&gt;Highlight selected window by measuring and increasing contrast&lt;/a&gt; (&lt;a href=&quot;https://techhub.social/@Anoncheg/113636526684529242&quot;&gt;@Anoncheg@techhub.social&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://protesilaos.com/codelog/2024-12-12-emacs-pulsar-1-2-0/&quot;&gt;Protesilaos Stavrou: Emacs: pulsar version 1.2.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Navigation:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://emacs.dyerdwelling.family/emacs/20241213115239-emacs--emacs-core-window-jumping-between-two-windows/&quot;&gt;James Dyer: Emacs Quick Window Pt 3 - jumping between two windows&lt;/a&gt;
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;Improvement: &lt;a href=&quot;https://emacs.dyerdwelling.family/emacs/20241209085935-emacs--emacs-core-window-jumping-visual-feedback/&quot;&gt;James Dyer: Emacs Core Window Jumping With Visual Feedback&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Hyperbole:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1haz1rf/android_emacs_fingerstylus_support_for_hyperbole/&quot;&gt;Android emacs: finger/stylus support for hyperbole buttons&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Writing:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=ZkKKuvVUWkE&quot;&gt;litdb and Emacs&lt;/a&gt; (11:03)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Org Mode:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://liron.tilde.team/blog/skipping-weekends-when-scheduling-items-with-org-mode20758.html&quot;&gt;Skipping weekends when scheduling items with org-mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mbork.pl/2024-12-16_Changing_the_TODO_state_of_an_Org_entry_when_refiling&quot;&gt;Marcin Borkowski: Changing the TODO state of an Org entry when refiling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://protesilaos.com/codelog/2024-12-15-emacs-org-coaching-clock/&quot;&gt;Protesilaos Stavrou: Emacs: custom Org clock report for my coaching&lt;/a&gt; (&lt;a href=&quot;https://www.youtube.com/watch?v=FMutOCOoFSQ&quot;&gt;YouTube&lt;/a&gt; 13:08)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/bohonghuang/org-srs&quot;&gt;Org-srs: A feature-rich and flexible spaced repetition system inside Org-mode with FSRS support&lt;/a&gt; (&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hb5cnz/orgsrs_a_featurerich_and_flexible_spaced/&quot;&gt;Reddit&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Import, export, and integration:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hbjq6n/package_niceorghtml/&quot;&gt;[package] nice-org-html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mahmoodsh36/org-xopp&quot;&gt;new package: org-xopp (org+xournalpp)&lt;/a&gt; (&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1habnh2/new_package_orgxopp_orgxournalpp/&quot;&gt;Reddit&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://list.orgmode.org/87zfl3uxhb.fsf@localhost&quot;&gt;Org Mode requests: [TASK] Move babel backend docs from WORG to Org manual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hbi751/passing_data_between_org_source_blocks_a/&quot;&gt;Passing data between org source blocks (a practical example)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://breatheoutbreathe.in/blog/2024-12-10-sourcehut-org-mode-readme.html&quot;&gt;Render README.org as HTML on Sourcehut&lt;/a&gt; (&lt;a href=&quot;https://lobste.rs/s/edzywh/render_readme_org_as_html_on_sourcehut&quot;&gt;lobste.rs&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Completion:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://thanosapollo.org/posts/emacs-built-in-completions-video/&quot;&gt;Thanos Apollo: Emacs 30 Built-in Completion UI &amp;amp; Styles [Video]​&lt;/a&gt; (&lt;a href=&quot;https://www.reddit.com/r/planetemacs/comments/1hcx1l0/thanos_apollo_emacs_30_builtin_completion_ui/&quot;&gt;Reddit&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Coding:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.serghei.pl/posts/emacs-python-ide/&quot;&gt;Advanced Python Development Workflow in Emacs&lt;/a&gt; (&lt;a href=&quot;https://www.reddit.com/r/planetemacs/comments/1hcxe1d/advanced_python_development_workflow_in_emacs/&quot;&gt;Reddit&lt;/a&gt;, &lt;a href=&quot;https://news.ycombinator.com/item?id=42395329&quot;&gt;HN&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=evmRpr_DEBQ&quot;&gt;Get Started with Clojure Programming with Cider | Emacs Tutorial&lt;/a&gt; (12:41)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=9dMYSrstrLk&quot;&gt;The Definitive EMACS + GO Setup #emacs #golang&lt;/a&gt; (01:07:18)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/chmouel/gotest-ts.el&quot;&gt;[new package] gotest-ts - run go tests with gotest.el and tree-sitter&lt;/a&gt; (&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1haa3zx/new_package_gotestts_run_go_tests_with_gotestel/&quot;&gt;Reddit&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://codeberg.org/alexjgriffith/love2d-fennel.el&quot;&gt;alexjgriffith/love2d-fennel.el - Codeberg.org&lt;/a&gt; (&lt;a href=&quot;https://mastodon.gamedev.place/@Alexjgriffith/113657784568312489&quot;&gt;@Alexjgriffith@mastodon.gamedev.place&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gist.github.com/dhruvasagar/6d1cf62d772a35bbc9b0326e370d4f63&quot;&gt;Minor Mode for Advent Of Code&lt;/a&gt; (&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hawbsn/minor_mode_for_advent_of_code/&quot;&gt;Reddit&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=wEbHCg6XGRU&quot;&gt;[video] Using emacs dape-mode to debug software with DAP protocol&lt;/a&gt; (&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1ha903r/video_using_emacs_dapemode_to_debug_software_with/&quot;&gt;Reddit&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://fosstodon.org/@chmouel/113646312567316722&quot;&gt;my-copy-function-name-with-ts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hbmpub/package_jujutsushi_a_package_for_jujutsu/&quot;&gt;[package] Jujutsushi a package for Jujutsu&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Shells:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://lmno.lol/alvaro/an-experimental-e-shell-pager&quot;&gt;Alvaro Ramirez: An experimental (e)shell pager&lt;/a&gt; (&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1halllx/en_experimental_eshell_pager/&quot;&gt;Reddit&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Mail, news, and chat:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://glenneth.org/content/posts/2024-12-12-discourse-emacs.html&quot;&gt;I'm attempting to write a discourse forum package for Emacs&lt;/a&gt; (&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hckaln/im_attempting_to_write_a_discourse_forum_package/&quot;&gt;Reddit&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Fun:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=0f9Rvk6dulM&quot;&gt;EmacsGME - Solo Roleplaying inside the Emacs Text Editor&lt;/a&gt; (15:37)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.scannedinavian.com/programmers-want-flow-when-programming-light-turns-red.html&quot;&gt;Shae Erisson's blog - Programmers want flow. when programming, light turns RED&lt;/a&gt; (&lt;a href=&quot;https://irreal.org/blog/?p=12650&quot;&gt;Irreal&lt;/a&gt;, &lt;a href=&quot;https://lobste.rs/s/3rybyx/programmers_want_flow_when_programming&quot;&gt;lobste.rs&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://i.redd.it/99mmcnzw177e1.gif&quot;&gt;May the shadows shield you and the light lead you to Emacsia&lt;/a&gt; (&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hfgutm/may_the_shadows_shield_you_and_the_light_lead_you/&quot;&gt;Reddit&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Community:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hbov34/weekly_tips_tricks_c_thread_20241211_week_50/&quot;&gt;Weekly Tips, Tricks, &amp;amp;c. Thread — 2024-12-11 / week 50&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://functional.cafe/@PaniczGodek/113630055034870975&quot;&gt;The concept of Emacs - history&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hcipqi/best_emacs_package_you_tried_and_stuck_with_in/&quot;&gt;Best emacs package you tried and stuck with in 2024?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Other:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://lambdaland.org/posts/2024-12-14_emacs_catchup/&quot;&gt;Lambda Land: What's New in Emacs: Last Decade Edition&lt;/a&gt; (&lt;a href=&quot;https://irreal.org/blog/?p=12655&quot;&gt;Irreal&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://discuss.systems/@jfdm/113640001250256154&quot;&gt;Tip about using keycast-header-line-mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hbls9u/so_happy_to_have_discovered_markdowndndimages/&quot;&gt;So happy to have discovered markdown-dnd-images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hawd0f/hyperdriveel_v050_explore_the_interactive_peer/&quot;&gt;hyperdrive.el v0.5.0: Explore the interactive peer graph&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/KeyWeeUsr/emacs-syncthing&quot;&gt;KeyWeeUsr/emacs-syncthing: Emacs client for Syncthing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hackerpublicradio.org/eps/hpr4268/index.html&quot;&gt;Hacker Public Radio: @enistello talks about Mastering Emacs by Mickey Peterson&lt;/a&gt; (&lt;a href=&quot;https://infosec.exchange/@hpr/113636111399505665&quot;&gt;@hpr@infosec.exchange&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=8dWPDJ4ShFc&quot;&gt;Building Emacs 30 from git on openSUSE Tumbleweed&lt;/a&gt; (21:08)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kisaragi-hiu.com/find-han-character-with-cangjie/&quot;&gt;Kisaragi Hiu: 不會倉頡也能利用倉頡找打不出來的漢字&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://picandocodigo.net/2024/macros-de-teclado-en-emacs/&quot;&gt;Macros de teclado en Emacs | Picando Código&lt;/a&gt; (&lt;a href=&quot;https://mastodon.online/@picandocodigo/113646854111714700&quot;&gt;@picandocodigo@mastodon.online&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://emacsconf.org/2024/talks/guile/&quot;&gt;Guile Emacs development has started again after a decade&lt;/a&gt; (&lt;a href=&quot;https://www.reddit.com/r/emacs/comments/1hb4om4/guile_emacs_development_has_started_again_after_a/&quot;&gt;Reddit&lt;/a&gt;, &lt;a href=&quot;https://irreal.org/blog/?p=12635&quot;&gt;Irreal&lt;/a&gt;, &lt;a href=&quot;https://lwn.net/SubscriberLink/1001645/b1e4453a8c6c16d7/&quot;&gt;LWN&lt;/a&gt;, &lt;a href=&quot;https://news.ycombinator.com/item?id=42432004&quot;&gt;HN&lt;/a&gt;, &lt;a href=&quot;https://lobste.rs/s/clyk9b/using_guile_for_emacs&quot;&gt;lobste.rs&lt;/a&gt;,  &lt;a href=&quot;https://irreal.org/blog/?p=12659&quot;&gt;Irreal&lt;/a&gt;, &lt;a href=&quot;https://lemmy.ml/post/23656526?scrollToComments=true&quot;&gt;lemmy.ml&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Emacs development:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;emacs-devel:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://lists.gnu.org/archive/html/emacs-devel/2024-12/msg00355.html&quot;&gt;Improve access to documentation in Info format (was: Proposal: Include C&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lists.gnu.org/archive/html/emacs-devel/2024-12/msg00630.html&quot;&gt;Re: pdumper on Solaris 10&lt;/a&gt; - mixed news for 32-bit MPS builds on sparc&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lists.gnu.org/archive/html/emacs-devel/2024-12/msg00455.html&quot;&gt;Background information on concurrent redisplay Re: Gap buffer problem?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lists.gnu.org/archive/html/emacs-devel/2024-12/msg00390.html&quot;&gt;challenges of garbage collection pauses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lists.gnu.org/archive/html/emacs-devel/2024-12/msg00552.html&quot;&gt;Cluffer vs gap buffer&lt;/a&gt;
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://lists.gnu.org/archive/html/emacs-devel/2024-12/msg00488.html&quot;&gt;related post about gap buffers vs ropes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=fd021c07606264a73cd4c1f6fa6fe80a756defe0&quot;&gt;New customization variable `completion-eager-display'&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=ed1f3b8488e18143d658e4f1aca8d21a3b84e2b2&quot;&gt;Add `browse-url-qutebrowser'&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=9ccd459e8452cc9e6e81e53f26bbeef20d2d5bb7&quot;&gt;Enable xterm-mouse-mode by default in xterm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=eb9ba4830e4c7853150eaed93f89225c00d6e52a&quot;&gt;Revert Dired buffer when clicking on basename of directory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git.savannah.gnu.org/cgit/emacs.git/commit/etc/NEWS?id=3959ea66448fb371cdc67bd963cd539a90f99ee5&quot;&gt;Rework history Isearch for Eshell&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;New packages:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://melpa.org/#/consult-vc-modified-files&quot; target=&quot;_blank&quot;&gt;consult-vc-modified-files&lt;/a&gt;: Show git modified files in a vc project with consult (MELPA)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://melpa.org/#/current-window-only&quot; target=&quot;_blank&quot;&gt;current-window-only&lt;/a&gt;: Open things only in the current window (MELPA)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://elpa.nongnu.org/nongnu/eldoc-diffstat.html&quot; target=&quot;_blank&quot;&gt;eldoc-diffstat&lt;/a&gt;: Make VCS diffstat available via eldoc (NonGNU ELPA)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://melpa.org/#/hindu-calendar&quot; target=&quot;_blank&quot;&gt;hindu-calendar&lt;/a&gt;: Arithmetical traditional Hindu calendar (panchanga) (MELPA)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://melpa.org/#/js-pkg-mode&quot; target=&quot;_blank&quot;&gt;js-pkg-mode&lt;/a&gt;: Minor mode for working with javascript projects (MELPA)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://melpa.org/#/le-gpt&quot; target=&quot;_blank&quot;&gt;le-gpt&lt;/a&gt;: Emacs on steroids with GPT (MELPA)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://melpa.org/#/terraform-docs&quot; target=&quot;_blank&quot;&gt;terraform-docs&lt;/a&gt;: Generate Terraform modules documentation with terraform-docs (MELPA)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Links from &lt;a href=&quot;https://www.reddit.com/r/emacs&quot;&gt;reddit.com/r/emacs&lt;/a&gt;, &lt;a href=&quot;https://www.reddit.com/r/orgmode&quot;&gt;r/orgmode&lt;/a&gt;, &lt;a href=&quot;https://www.reddit.com/r/spacemacs&quot;&gt;r/spacemacs&lt;/a&gt;, &lt;a href=&quot;https://www.reddit.com/r/planetemacs&quot;&gt;r/planetemacs&lt;/a&gt;, &lt;a href=&quot;https://mastodon.social/tags/emacs&quot;&gt;Mastodon #emacs&lt;/a&gt;, &lt;a href=&quot;https://hn.algolia.com/?query=emacs&amp;amp;sort=byDate&amp;amp;prefix&amp;amp;page=0&amp;amp;dateRange=all&amp;amp;type=story&quot;&gt;Hacker News&lt;/a&gt;, &lt;a href=&quot;https://lobste.rs/search?q=emacs&amp;amp;what=stories&amp;amp;order=newest&quot;&gt;lobste.rs&lt;/a&gt;, &lt;a href=&quot;https://programming.dev/c/emacs?dataType=Post&amp;amp;page=1&amp;amp;sort=New&quot;&gt;programming.dev&lt;/a&gt;, &lt;a href=&quot;https://lemmy.world/c/emacs&quot;&gt;lemmy.world&lt;/a&gt;, &lt;a href=&quot;https://lemmy.ml/c/emacs?dataType=Post&amp;amp;page=1&amp;amp;sort=New&quot;&gt;lemmy.ml&lt;/a&gt;, &lt;a href=&quot;https://communick.news/c/emacs?dataType=Post&amp;amp;page=1&amp;amp;sort=New&quot;&gt;communick.news&lt;/a&gt;, &lt;a href=&quot;https://planet.emacslife.com&quot;&gt;planet.emacslife.com&lt;/a&gt;, &lt;a href=&quot;https://www.youtube.com/playlist?list=PL4th0AZixyREOtvxDpdxC9oMuX7Ar7Sdt&quot;&gt;YouTube&lt;/a&gt;, &lt;a href=&quot;http://git.savannah.gnu.org/cgit/emacs.git/log/etc/NEWS&quot;&gt;the Emacs NEWS file&lt;/a&gt;, &lt;a href=&quot;https://emacslife.com/calendar/&quot;&gt;Emacs Calendar&lt;/a&gt;, and &lt;a href=&quot;https://lists.gnu.org/archive/html/emacs-devel/2024-12&quot;&gt;emacs-devel&lt;/a&gt;. Thanks to Andrés Ramírez for emacs-devel links. Do you have an Emacs-related link or announcement? Please e-mail me at &lt;a href=&quot;mailto:sacha@sachachua.com&quot;&gt;sacha@sachachua.com&lt;/a&gt;. Thank you!
&lt;/p&gt;
&lt;div&gt;&lt;a href=&quot;https://sachachua.com/blog/2024/12/2024-12-16-emacs-news/index.org&quot;&gt;View org source for this post&lt;/a&gt;&lt;/div&gt;</content>
		<author>
			<name>Sacha Chua</name>
			<uri>https://sachachua.com/blog/category/emacs/feed/index.xml</uri>
		</author>
		<source>
			<title type="html">Sacha Chua - category - emacs</title>
			<subtitle type="html">Emacs, sketches, and life</subtitle>
			<link rel="self" href="https://sachachua.com/blog/category/emacs/feed/index.xml"/>
			<id>https://sachachua.com/blog/category/emacs/feed/index.xml</id>
		</source>
	</entry>

	<entry>
		<title type="html">Marcin Borkowski: Changing the TODO state of an Org entry when refiling</title>
		<link href="https://mbork.pl/2024-12-16_Changing_the_TODO_state_of_an_Org_entry_when_refiling"/>
		<id>https://mbork.pl/2024-12-16_Changing_the_TODO_state_of_an_Org_entry_when_refiling</id>
		<updated>2024-12-16T05:21:58+00:00</updated>
		<published></published>
		<content type="html">Preview: One of the things I do quite often is refiling Org entries to my “archive” file and marking them as DONE or CANCELED. (For some reason I can’t even remember now, I don’t use the archiving feature of Org.) It occurred to me that having Emacs change the todo state automatically would be very convenient.</content>
		<author>
			<name>Marcin Borkowski</name>
			<uri>https://mbork.pl/Homepage</uri>
		</author>
		<source>
			<title type="html">Marcin Borkowski:  Content AND Presentation</title>
			<subtitle type="html">Strona domowa Marcina Borkowskiego</subtitle>
			<link rel="self" href="https://mbork.pl/?action=rss;rcfilteronly=CategoryEmacs;all=0;showedit=0;title=%20Content%20AND%20Presentation"/>
			<id>https://mbork.pl/Homepage</id>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en-US">Irreal: Flowmeter</title>
		<link href="https://irreal.org/blog/?p=12650"/>
		<id>https://irreal.org/blog/?p=12650</id>
		<updated>2024-12-15T17:03:12+00:00</updated>
		<published></published>
		<content type="html" xml:lang="en-US">&lt;p&gt;
Every programmer—at least every programmer who actually programs—is familiar with the concept of flow. It’s a well established concept with lots of research to back it up even if &lt;a href=&quot;https://www.reddit.com/r/programming/comments/1fujtga/comment/lpzxhu4/&quot;&gt;some&lt;/a&gt; don’t believe in it.
&lt;/p&gt;
&lt;p&gt;
The trouble is, there are lots of people who are completely unfamiliar with the idea and think nothing of interrupting a programmer for the most trivial of reasons. What to do? Some programmers have the convention that they’re not to be interrupted if they have earphones on. Others put up signs or other indications that they’re working and should not be bothered. The problem with these schemes is that the programmer has to remember to invoke them and then disable them when done.
&lt;/p&gt;
&lt;p&gt;
Enter Shae Erisson. He’s developed an &lt;a href=&quot;https://www.scannedinavian.com/programmers-want-flow-when-programming-light-turns-red.html&quot;&gt;automatic signaling system that turns on a “Busy” sign when he’s typing into Emacs&lt;/a&gt;. When he stops typing, the sign changes to “Free”. It’s not foolproof, of course, because some psychopaths just won’t care and will interrupt you anyway believing that their needs, however inconsequential, take precedence over your need for focus. Still, it’s a good beginning.
&lt;/p&gt;
&lt;p&gt;
The only special part of this is a &lt;a href=&quot;https://www.adafruit.com/product/4800&quot;&gt;magtag from Adafruit&lt;/a&gt;. It’s a cheap bit of kit that’s easy to program. You can see the code that Erisson used at his post. There’s code for Emacs—to detect typing—and code for the magtag to display the results.
&lt;/p&gt;
&lt;p&gt;
If you work in an environment where people feel free to interrupt you for the most trivial of reasons, perhaps this will help. Take a look at Erisson’s post to see if his ideas will help you.&lt;/p&gt;</content>
		<author>
			<name>jcs</name>
			<uri>https://irreal.org/blog</uri>
		</author>
		<source>
			<title type="html">Emacs – Irreal</title>
			<subtitle type="html">The minds had long ago come up with a proper name for it; they called it the Irreal, but they thought of it as Infinite Fun. That was what they really knew it as. The Land of Infinite Fun. --Iain M. Banks, Excession</subtitle>
			<link rel="self" href="http://irreal.org/blog/?tag=emacs&amp;feed=rss2"/>
			<id>https://irreal.org/blog</id>
		</source>
	</entry>

	<entry>
		<title type="html">Protesilaos Stavrou: Emacs: custom Org clock report for my coaching</title>
		<link href="https://protesilaos.com/codelog/2024-12-15-emacs-org-coaching-clock/"/>
		<id>https://protesilaos.com/codelog/2024-12-15-emacs-org-coaching-clock/</id>
		<updated>2024-12-15T00:00:00+00:00</updated>
		<published></published>
		<content type="html">&lt;p&gt;Raw link: &lt;a href=&quot;https://www.youtube.com/watch?v=FMutOCOoFSQ&quot;&gt;https://www.youtube.com/watch?v=FMutOCOoFSQ&lt;/a&gt;&lt;/p&gt;
         
         &lt;p&gt;In this video, I demonstrate the custom code I have to generate Org
clock reports for my coaching sessions. The idea is to use the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DEADLINE&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CLOSED&lt;/code&gt; timestamps of each task to calculate their
elapsed time. This way, I do not need to manually clock in to the task
and then clock out of it. It is easier to not have that overhead and
not to duplicate the data that is already embedded in the
aforementioned timestamps.&lt;/p&gt;

&lt;p&gt;The custom command I use will prompt me for the name of a person and
the date since when to collect meetings. It will then put all the
retrieved data in a new buffer and calcucate the results in a neat
time table. This new buffer is not related to the underlying file I
used to gather the data from: it is strictly used for reporting. My
file stays free from all the extra noise.&lt;/p&gt;

&lt;p&gt;I thus use this method to do my billing and accounting.&lt;/p&gt;

&lt;p&gt;As I show in the video, my &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;coach.org&lt;/code&gt; file is simple. Each meeting is
a top-level heading. The text of the heading includes the name of the
person and a description on what the meeting is about. It looks like
this:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-org&quot;&gt;#+todo: COACH(k) | DONE(d!) CANCEL(c@)

* DONE Protesilaos Emacs deep dive
CLOSED: [2024-12-10 Tue 14:45] DEADLINE: &amp;lt;2024-12-10 Tue 13:00&amp;gt;

* COACH Protesilaos Org custom clock report
DEADLINE: &amp;lt;2024-12-15 Sun 17:00&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;My actual file has some more data, such as a link to the email I
received for scheduling the given meeting, as well as relevant quotes,
and the like. All that is irrelevant for the purposes of the clock
reporting though. What I show in the above code block is enough.&lt;/p&gt;

&lt;h2&gt;My custom code (part of my dotfiles)&lt;/h2&gt;

&lt;p&gt;Below is the code I am using as of this writing (2024-12-15 16:38
+0200). It is an excerpt from my Emacs configuration. Note that if I
make any changes to it, I will not put them back here. Check my
dotemacs for the up-to-date setup (it also includes links to the Git
sources): &lt;a href=&quot;https://protesilaos.com/emacs/dotemacs&quot;&gt;https://protesilaos.com/emacs/dotemacs&lt;/a&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;defvar&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;prot-org-clock--template-no-effort&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&quot;#+BEGIN: clocktable :formula % :timestamp t :sort (1 . ?a) :link nil :scope nil :hidefiles t :maxlevel 8 :stepskip0 t
#+END:&quot;&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&quot;Clock table to use for custom clock reports.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;;; TODO 2024-12-15: This sort of thing must exist in Org, but I did&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;;; not find it.&lt;/span&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;prot-org--timestamp-to-time&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&quot;Return time object of STRING timestamp.&quot;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;org-timestamp-to-time&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;org-timestamp-from-string&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;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;defun&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;prot-org-coach--get-entries&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;todo-keyword&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;since&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&quot;Get Org entries matching TODO-KEYWORD followed by STRING in the heading.
Limit entries to those whole deadline/scheduled is equal or greater to
SINCE date.

Each entry is a plist of :heading, :contents, :started, :closed.&quot;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;delq&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;nv&quot;&gt;org-map-entries&lt;/span&gt;
             &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;lambda&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;when-let*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;case-fold-search&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;nv&quot;&gt;started&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;prot-org--timestamp-to-time&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;org-entry-get&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;DEADLINE&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;org-entry-get&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;SCHEDULED&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;closed&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;prot-org--timestamp-to-time&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;org-entry-get&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;CLOSED&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;re-search-forward&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;\\&amp;lt;%s\\&amp;gt;.*\\&amp;lt;%s\\&amp;gt;&quot;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;todo-keyword&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;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;line-end-position&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;t&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;org-time-less-p&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;since&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;started&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;list&lt;/span&gt;
                  &lt;span class=&quot;ss&quot;&gt;:heading&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;org-get-heading&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:no-tags&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:no-todo&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:no-priority&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:no-comment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                  &lt;span class=&quot;ss&quot;&gt;:contents&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;org-get-entry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                  &lt;span class=&quot;ss&quot;&gt;:started&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;started&lt;/span&gt;
                  &lt;span class=&quot;ss&quot;&gt;:closed&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;closed&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;user-error&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;No entries with heading matching `\\&amp;lt;%s\\&amp;gt;.*\\&amp;lt;%s\\&amp;gt;'&quot;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;todo-keyword&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;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;defvar&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;prot-org-coach--name-history&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&quot;Minibuffer history of `prot-org-coach--name-prompt'.&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;nb&quot;&gt;defun&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;prot-org-coach--name-prompt&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&quot;Prompt for name of person.&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;default&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;prot-org-coach--name-history&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;read-string&lt;/span&gt;
     &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;format-prompt&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Name of person&quot;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;default&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;ss&quot;&gt;'prot-org-coach--name-history&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;;;;###autoload&lt;/span&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;prot-org-coach-report&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;nv&quot;&gt;since&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&quot;Produce clock report for coaching with person of NAME.
SINCE is the date (of time 00:00) to count from until now.&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;nb&quot;&gt;list&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;prot-org-coach--name-prompt&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;format&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;[%s]&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;org-read-date&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;if-let*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;since-object&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;prot-org--timestamp-to-time&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;since&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;entries&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;prot-org-coach--get-entries&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;done&quot;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;since-object&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;buffer&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;get-buffer-create&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;*prot-org-coach-entries*&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;with-current-buffer&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;pop-to-buffer&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;buffer&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;erase-buffer&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;org-mode&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;dolist&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;entry&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;entries&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;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;* %s\n%s\n\n&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;plist-get&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;entry&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:heading&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;plist-get&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;entry&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:contents&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;org-clock-in&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;nv&quot;&gt;plist-get&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;entry&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:started&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;org-clock-out&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&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;nv&quot;&gt;plist-get&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;entry&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:closed&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;goto-char&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;point-min&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;save-excursion&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;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;%s\n\n&quot;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;prot-org-clock--template-no-effort&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;save-excursion&lt;/span&gt;
          &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;goto-char&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;line-end-position&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;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; :tstart %S&quot;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;since&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;org-dblock-update&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;user-error&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;No entries for name `%s'&quot;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;name&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;</content>
		<author>
			<name>Protesilaos Stavrou</name>
			<uri>https://protesilaos.com/codelog</uri>
		</author>
		<source>
			<title type="html">Protesilaos Stavrou: Coding blog</title>
			<subtitle type="html">Coding blog</subtitle>
			<link rel="self" href="https://protesilaos.com/codelog.xml"/>
			<id>https://protesilaos.com/codelog</id>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en">TAONAW - Emacs and Org Mode: </title>
		<link href="https://taonaw.com/2024/12/14/my-emacs-projects.html"/>
		<id>https://taonaw.com/2024/12/14/my-emacs-projects.html</id>
		<updated>2024-12-14T23:36:13+00:00</updated>
		<published></published>
		<content type="html">&lt;p&gt;my Emacs projects file (which I call now.org) is becoming too big. The agenda is still snappy, and I can work with it, but it just looks like a pile of “stuff” that I need to do or did. I want to organize it better somehow…&lt;/p&gt;
&lt;p&gt;#emacs #orgmode&lt;/p&gt;</content>
		<author>
			<name>TAONAW - Emacs and Org Mode</name>
			<uri>https://taonaw.com/categories/emacs-org-mode/</uri>
		</author>
		<source>
			<title type="html">emacs org-mode on The Art Of Not Asking Why</title>
			<link rel="self" href="https://taonaw.com/categories/emacs-org-mode/feed.xml"/>
			<id>https://taonaw.com/categories/emacs-org-mode/</id>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en">Jack Baty: Emacs from scratch once again</title>
		<link href="https://baty.net/2024/12/emacs-from-scratch-once-again/"/>
		<id>https://baty.net/2024/12/emacs-from-scratch-once-again/</id>
		<updated>2024-12-14T16:04:39+00:00</updated>
		<published></published>
		<content type="html" xml:lang="en">&lt;img src=&quot;https://baty.net/img/small/emacs.png#floatright&quot; /&gt;
&lt;p&gt;I’ve been happily using &lt;a href=&quot;https://github.com/doomemacs/doomemacs&quot;&gt;Doom Emacs&lt;/a&gt; again, but I missed the feeling of having built things myself. I mean, if I wanted everything done for me, I could just use Obsidian, right?&lt;/p&gt;
&lt;p&gt;There’s a certain level of geek pride in building one’s own config, although I don’t always feel it’s worth the trouble, knowing Doom exists. Other times, however, I miss feeling the satisfaction of being in complete control of my environment. I spent the day starting over.&lt;/p&gt;
&lt;p&gt;When I say “from scratch” I don’t mean without any help from anyone. There are things that have become defacto standards when making Emacs “nicer”, so I went hunting for a leg up.&lt;/p&gt;
&lt;p&gt;The first option I considered was to start with &lt;a href=&quot;https://github.com/jamescherti/minimal-emacs.d&quot;&gt;minimal-emacs.d&lt;/a&gt; from James Cherti. I’d used this for my previous vanilla setup. It’s quite fast and the defaults are sensible. This time, though, I was hoping for a little less magic in my config. I decided to look for something else.&lt;/p&gt;
&lt;p&gt;I ended up taking the best bits from Protesilaos’ &lt;a href=&quot;https://protesilaos.com/codelog/2024-11-28-basic-emacs-configuration/&quot;&gt;basic and capable configuration&lt;/a&gt;. Prot is so pragmatic and thoughtful that it’s always valuable to look at how he does things.&lt;/p&gt;
&lt;p&gt;Something Doom is very good at is fast startup. With all my crap included, Doom would start in about 1.5 seconds. It’s one reason I moved back to Doom in the first place, as my config had blown up to around 8 seconds and I didn’t have the energy to optimize it. My unofficial target for the new config was under 4 seconds. I don’t launch Emacs that often. A few seconds once or twice a day won’t kill me.&lt;/p&gt;
&lt;p&gt;I brought over the particulars from my earlier configs (for Org-mode, LaTeX, org-journal, etc.) and, long story short, I have a leaner, newer configuration that I (sort of) built myself. Startup is around 3 seconds, so I have a bit of room if I need it. Or maybe I’ll learn about garbage collection and compilation and see if I can improve things.&lt;/p&gt;
&lt;p&gt;One thing I didn’t bring along was Evil mode. I don’t know if I want to run Emacs without it, but I’m going to try living with stock Emacs bindings with some tweaks. We’ll see how it goes.&lt;/p&gt;
&lt;p&gt;There’s no public repo for this yet. I worry that my cobbled together stuff would do more harm than good if someone started copying things from it. Maybe later.&lt;/p&gt;</content>
		<author>
			<name>Jack Baty</name>
			<uri>https://baty.net/tags/emacs/</uri>
		</author>
		<source>
			<title type="html">Emacs on Baty.net</title>
			<subtitle type="html">Recent content in Emacs on Baty.net</subtitle>
			<link rel="self" href="https://baty.net/tags/emacs/index.xml"/>
			<id>https://baty.net/tags/emacs/</id>
			<rights type="html">Jack Baty |</rights>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en-US">Irreal: Analog Vs. Digital Again</title>
		<link href="https://irreal.org/blog/?p=12648"/>
		<id>https://irreal.org/blog/?p=12648</id>
		<updated>2024-12-14T15:53:49+00:00</updated>
		<published></published>
		<content type="html" xml:lang="en-US">&lt;p&gt;
Every time I think I’m done with the subject of analog versus digital notes, JTR &lt;a href=&quot;https://taonaw.com/2024/12/13/i-just-typed.html&quot;&gt;makes another interesting post on the subject&lt;/a&gt;. His latest offering says he’s capitulated to the inevitable and is writing his notes digitally. Still, he says, he has a yearning for the physical. He wonders if perhaps he should print it out.
&lt;/p&gt;
&lt;p&gt;
In the comments &lt;a href=&quot;https://taonaw.com/2024/12/13/i-just-typed.html&quot;&gt;Jack Baty&lt;/a&gt; says he prints out his journal every month. That’s not too interesting but Baty goes much further. He prints out his journal every month and once a year he binds them into a perfect binding booklet.
&lt;/p&gt;
&lt;p&gt;
The result is basically a book. He exports his journal to LaTeX and adds lots of pictures. The result is very nice: a yearly physical journal that he or anyone else can read and enjoy. Baty’s comments includes some pictures if you’re interested.
&lt;/p&gt;
&lt;p&gt;
It’s a nice solution if you feel that you need a physical copy of your notes but I remain unconvinced. I know lots of people, including Sacha Chua, like to have a physical copy of their work but I just don’t see the advantage. The digital copy is right there to read and enjoy and you can also search it and add links to and from it if the need arises.
&lt;/p&gt;
&lt;p&gt;
I love writing my notes in Org and having them available for future reference. If I want to share them, it’s easy to export them to HTML, PDF, or even—ugh—docx. I see no reason for filling up my home with reams of paper that, truth to tell, I will hardly ever read. But they’re great for collecting dust.&lt;/p&gt;</content>
		<author>
			<name>jcs</name>
			<uri>https://irreal.org/blog</uri>
		</author>
		<source>
			<title type="html">Emacs – Irreal</title>
			<subtitle type="html">The minds had long ago come up with a proper name for it; they called it the Irreal, but they thought of it as Infinite Fun. That was what they really knew it as. The Land of Infinite Fun. --Iain M. Banks, Excession</subtitle>
			<link rel="self" href="http://irreal.org/blog/?tag=emacs&amp;feed=rss2"/>
			<id>https://irreal.org/blog</id>
		</source>
	</entry>

</feed>
