<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Kyou is kyou is kyou is kyou</title><link>https://kyo.iroiro.party/</link><description>&lt;ruby&gt;今日&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;Kyou&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; is &lt;ruby&gt;共&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;Kyou&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; is &lt;ruby&gt;興&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;Kyou&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt; is &lt;ruby&gt;狂&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;Kyou&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt;. A blog about Java, Emacs, Lisp, etc.</description><atom:link href="https://kyo.iroiro.party/en/rss.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2026 &lt;a href="mailto:gudzpoz@live.com"&gt;Kana&lt;/a&gt; CC BY-SA 4.0</copyright><lastBuildDate>Mon, 02 Feb 2026 13:28:29 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>This year, I will write a shitty GUI for my Emacs clone</title><link>https://kyo.iroiro.party/en/posts/this-year-a-shitty-gui/</link><dc:creator>Kana</dc:creator><description>&lt;div&gt;&lt;nav id="table-of-contents" role="doc-toc"&gt;
&lt;h2&gt;Table of Contents&lt;/h2&gt;
&lt;div id="text-table-of-contents" role="doc-toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/this-year-a-shitty-gui/#how-gnu-emacs-renders"&gt;1. How GNU Emacs renders&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/this-year-a-shitty-gui/#glyph-matrix"&gt;1.1. Glyph matrix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/this-year-a-shitty-gui/#bidirectional-text-display"&gt;1.2. Bidirectional text display&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/this-year-a-shitty-gui/#ligatures-are-a-must"&gt;1.3. Ligatures are a must&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/this-year-a-shitty-gui/#composition-function-table"&gt;1.4. &lt;code&gt;composition-function-table&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/this-year-a-shitty-gui/#text-properties"&gt;1.5. Text properties&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/this-year-a-shitty-gui/#lispy-text-properties"&gt;1.6. Lispy text properties&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/this-year-a-shitty-gui/#other-features"&gt;1.7. Other features&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/this-year-a-shitty-gui/#why-cloning-emacs-redisplay-behaviors-is-hard"&gt;2. Why cloning Emacs redisplay behaviors is hard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/this-year-a-shitty-gui/#this-year-i-will"&gt;3. This year, I will …&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/this-year-a-shitty-gui/#things-i-will-not-support"&gt;3.1. Things I will not support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/this-year-a-shitty-gui/#things-that-shitty-gui-might-support"&gt;3.2. Things that shitty GUI might support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/this-year-a-shitty-gui/#things-i-do-plan-to-support"&gt;3.3. Things I do plan to support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/this-year-a-shitty-gui/#that-s-it"&gt;4. That's it&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/nav&gt;
&lt;p&gt;
I've been hoping to write a GUI for &lt;a href="https://github.com/gudzpoz/Juicemacs"&gt;my Emacs clone&lt;/a&gt; for a while now. And I'm
putting together &lt;a href="https://juice.zulipchat.com/#narrow/channel/535506-gui/topic/Tiny.20progress.3A.20GUI.20dev.20log/near/562670849"&gt;a list of Emacs' display features&lt;/a&gt; to keep compatible with when
designing the GUI. Unsurprisingly, this list just keeps growing, and, nah,
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;
&lt;a href="https://www.softwaredesign.ing/blog/doing-the-thing-is-doing-the-thing"&gt;Waiting to feel ready to do the thing is not doing the thing.&lt;/a&gt; &lt;sup&gt;&lt;a id="fnr.blogging-is-not" class="footref" href="https://kyo.iroiro.party/en/posts/this-year-a-shitty-gui/#fn.blogging-is-not" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;
So, I really need to start writing the shittiest Emacs GUI ever.
&lt;/p&gt;

&lt;p&gt;
&lt;/p&gt;&lt;p&gt;&lt;a href="https://kyo.iroiro.party/en/posts/this-year-a-shitty-gui/"&gt;Read more…&lt;/a&gt; (10 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><category>emacs</category><guid>https://kyo.iroiro.party/en/posts/this-year-a-shitty-gui/</guid><pubDate>Sat, 31 Jan 2026 21:45:00 GMT</pubDate></item><item><title>Extensibility: The "100% Lisp" Fallacy</title><link>https://kyo.iroiro.party/en/posts/100-percent-lisp/</link><dc:creator>Kana</dc:creator><description>&lt;div&gt;&lt;nav id="table-of-contents" role="doc-toc"&gt;
&lt;h2&gt;Table of Contents&lt;/h2&gt;
&lt;div id="text-table-of-contents" role="doc-toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/100-percent-lisp/#the-argument"&gt;1. The argument&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/100-percent-lisp/#there-is-no-100-lisp"&gt;2. There is no "100% Lisp"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/100-percent-lisp/#workaround-ish-extensibility"&gt;3. Workaround-ish extensibility&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/100-percent-lisp/#spacebar-heating-extensibility"&gt;4. "Spacebar heating" extensibility&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/100-percent-lisp/#extensibility-takes-efforts"&gt;5. Extensibility takes efforts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/100-percent-lisp/#footnotes"&gt;6. Footnotes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/nav&gt;
&lt;p&gt;
So, I've seen some articles promoting Emacs-like editors written in Lisp
languages, and one of the most common arguments seems to be: "it's written in
This Lisp and also scriptable in This Lisp, and that gives it great
extensibility." &lt;sup&gt;&lt;a id="fnr.maintain" class="footref" href="https://kyo.iroiro.party/en/posts/100-percent-lisp/#fn.maintain" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt;
&lt;/p&gt;

&lt;p&gt;
It's not wrong, but I think it does overlook a few things.
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;
By the way: Happy New Year!
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;
&lt;/p&gt;&lt;p&gt;&lt;a href="https://kyo.iroiro.party/en/posts/100-percent-lisp/"&gt;Read more…&lt;/a&gt; (7 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><category>emacs</category><guid>https://kyo.iroiro.party/en/posts/100-percent-lisp/</guid><pubDate>Wed, 31 Dec 2025 16:00:00 GMT</pubDate></item><item><title>Exploring Speculative JIT Compilation for Emacs Lisp with Java</title><link>https://kyo.iroiro.party/en/posts/juicemacs-exploring-jit-for-elisp/</link><dc:creator>Kana</dc:creator><description>&lt;div&gt;&lt;blockquote&gt;
&lt;p&gt;
This Org-mode file was used for an &lt;a href="https://github.com/rlister/org-present"&gt;&lt;code&gt;org-present&lt;/code&gt;&lt;/a&gt; presentation at &lt;a href="https://emacsconf.org/2025/talks/juicemacs/"&gt;EmacsConf 2025
– Juicemacs&lt;/a&gt;. This blog post is adapted from that presentation, with added
transcript and explanations for a bunch of things I didn't dig into during the
presentation.
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;figure&gt;

&lt;figure&gt;
&lt;a href="https://emacsconf.org/2025/talks/juicemacs/" width="400"&gt;&lt;img src="https://kyo.iroiro.party/images/juicemacs-exploring-jit/emacsconf-pre.jpg" alt="emacsconf-pre.jpg" width="400"&gt;&lt;/a&gt;

&lt;/figure&gt;
&lt;/figure&gt;

&lt;p width="64"&gt;
&lt;img src="https://kyo.iroiro.party/images/juicemacs-exploring-jit/emacsconf-logo1-256.png" alt="emacsconf-logo1-256.png" width="64"&gt;
For &lt;a href="https://emacsconf.org/2025/"&gt;EmacsConf 2025&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
Project: &lt;a href="https://github.com/gudzpoz/Juicemacs"&gt;https://github.com/gudzpoz/Juicemacs&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
Contact: See &lt;a href="https://kyo.iroiro.party/en/posts/juicemacs-exploring-jit-for-elisp#menu"&gt;the navigation bar&lt;/a&gt; (or join &lt;a href="https://juice.zulipchat.com"&gt;the Zulip chat&lt;/a&gt;)
&lt;/p&gt;






&lt;p&gt;
&lt;/p&gt;&lt;p&gt;&lt;a href="https://kyo.iroiro.party/en/posts/juicemacs-exploring-jit-for-elisp/"&gt;Read more…&lt;/a&gt; (33 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><category>emacs</category><category>java</category><category>perf</category><guid>https://kyo.iroiro.party/en/posts/juicemacs-exploring-jit-for-elisp/</guid><pubDate>Fri, 05 Dec 2025 01:00:00 GMT</pubDate></item><item><title>Configuring Keyboards with Org-mode Babel</title><link>https://kyo.iroiro.party/en/posts/org-mode-maintains-my-keyboard/</link><dc:creator>Kana</dc:creator><description>&lt;div&gt;&lt;nav id="table-of-contents" role="doc-toc"&gt;
&lt;h2&gt;Table of Contents&lt;/h2&gt;
&lt;div id="text-table-of-contents" role="doc-toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/org-mode-maintains-my-keyboard/#quite-a-bit-of-background"&gt;1. Quite a bit of background&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/org-mode-maintains-my-keyboard/#keyboard-layouts"&gt;1.1. Keyboard layouts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/org-mode-maintains-my-keyboard/#qmk-configs"&gt;1.2. QMK configs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/org-mode-maintains-my-keyboard/#when-colemak-meets-apl"&gt;1.3. When Colemak meets APL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/org-mode-maintains-my-keyboard/#gnu-apl-mode"&gt;1.4. GNU APL mode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/org-mode-maintains-my-keyboard/#org-babel-for-keyboards"&gt;2. Org Babel for keyboards&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/org-mode-maintains-my-keyboard/#from-qwerty-to-colemak"&gt;2.1. From Qwerty to Colemak&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/org-mode-maintains-my-keyboard/#from-colemak-to-apl"&gt;2.2. From Colemak to APL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/org-mode-maintains-my-keyboard/#generating-source-files-from-org-babel"&gt;3. Generating source files from Org Babel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/org-mode-maintains-my-keyboard/#is-it-worth-the-time"&gt;4. "Is It Worth the Time?"&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/nav&gt;
&lt;p&gt;
This month's &lt;a href="https://www.emacswiki.org/emacs/Carnival"&gt;Emacs Carnival&lt;/a&gt; features &lt;a href="https://orgmode.org/worg/org-contrib/babel/intro.html"&gt;Org Babel&lt;/a&gt;. Since I submitted last month
about &lt;a href="https://kyo.iroiro.party/en/posts/emacs-maintains-my-arch"&gt;using Org-mode to manage installed Arch packages&lt;/a&gt;, it means—I've got
another chance to show off what Org-mode is capable of! &lt;sup&gt;&lt;a id="fnr.proud" class="footref" href="https://kyo.iroiro.party/en/posts/org-mode-maintains-my-keyboard/#fn.proud" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt;
&lt;/p&gt;

&lt;p&gt;
Today, let's look at a more complex example: how I configure my 60% QMK keyboard
with &lt;b&gt;Colemak&lt;/b&gt; + &lt;b&gt;APL symbols&lt;/b&gt; + &lt;b&gt;Qwerty&lt;/b&gt; + other layers with Org-mode, and in
particular, Org Babel.
&lt;/p&gt;

&lt;p&gt;
&lt;/p&gt;&lt;p&gt;&lt;a href="https://kyo.iroiro.party/en/posts/org-mode-maintains-my-keyboard/"&gt;Read more…&lt;/a&gt; (14 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><category>emacs</category><guid>https://kyo.iroiro.party/en/posts/org-mode-maintains-my-keyboard/</guid><pubDate>Fri, 21 Nov 2025 17:30:27 GMT</pubDate></item><item><title>Hosting On Cloudflare 'Cause I Need To</title><link>https://kyo.iroiro.party/en/posts/cloudflare-when-needed/</link><dc:creator>Kana</dc:creator><description>&lt;div&gt;&lt;p&gt;
So, &lt;a href="https://www.cloudflarestatus.com/incidents/8gmgl950y3h7"&gt;Cloudflare was down&lt;/a&gt; today, again, and this incident brought down a huge part
of the Internet with it. It's actually pretty &lt;i&gt;impressive&lt;/i&gt; how much of the
Internet infrastructure depends on Cloudflare these days.
&lt;/p&gt;

&lt;p&gt;
Should we try to be more decentralized? Probably. But will I migrate my sites
away from Cloudflare? Sadly, maybe not. And here is why.
&lt;/p&gt;

&lt;p&gt;
&lt;/p&gt;&lt;p&gt;&lt;a href="https://kyo.iroiro.party/en/posts/cloudflare-when-needed/"&gt;Read more…&lt;/a&gt; (3 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><guid>https://kyo.iroiro.party/en/posts/cloudflare-when-needed/</guid><pubDate>Tue, 18 Nov 2025 16:23:38 GMT</pubDate></item><item><title>Using Emacs Org-mode As My Package Manager</title><link>https://kyo.iroiro.party/en/posts/emacs-maintains-my-arch/</link><dc:creator>Kana</dc:creator><description>&lt;div&gt;&lt;nav id="table-of-contents" role="doc-toc"&gt;
&lt;h2&gt;Table of Contents&lt;/h2&gt;
&lt;div id="text-table-of-contents" role="doc-toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/emacs-maintains-my-arch/#start-with-a-table"&gt;1. Start with a table&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/emacs-maintains-my-arch/#sync-between-the-table-and-pacman"&gt;2. Sync between the table and pacman&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/emacs-maintains-my-arch/#install-packages-via-org-mode"&gt;3. Install packages via Org-mode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/nav&gt;
&lt;p&gt;
I install random packages from time to time (using &lt;a href="https://archlinux.org/"&gt;Arch Linux&lt;/a&gt;, by the way),
maybe to try out things, to solve an issue at hand or as an implicit dependency
to my Emacs config or other scripts. And it was a pain having to keep in mind
which is for which.
&lt;/p&gt;

&lt;p&gt;
Then, I started keeping notes for them and automated a bunch of note keeping.
And now, I have an Org-mode note file effectively serving as a minimal wrapper
for &lt;a href="https://wiki.archlinux.org/title/Pacman"&gt;the pacman package manager&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
&lt;/p&gt;&lt;p&gt;&lt;a href="https://kyo.iroiro.party/en/posts/emacs-maintains-my-arch/"&gt;Read more…&lt;/a&gt; (5 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><category>emacs</category><category>linux</category><guid>https://kyo.iroiro.party/en/posts/emacs-maintains-my-arch/</guid><pubDate>Thu, 23 Oct 2025 03:04:34 GMT</pubDate></item><item><title>Why I Can't Feel Like Wayland</title><link>https://kyo.iroiro.party/en/posts/cant-feel-like-wayland/</link><dc:creator>Kana</dc:creator><description>&lt;div&gt;&lt;nav id="table-of-contents" role="doc-toc"&gt;
&lt;h2&gt;Table of Contents&lt;/h2&gt;
&lt;div id="text-table-of-contents" role="doc-toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/cant-feel-like-wayland/#peek"&gt;1. Peek 🙈&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/cant-feel-like-wayland/#input-methods"&gt;2. Input Methods&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/cant-feel-like-wayland/#bug-reporting"&gt;3. Bug Reporting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/cant-feel-like-wayland/#wayland-protocol-versus-x11-server"&gt;4. Wayland &lt;i&gt;Protocol&lt;/i&gt; Versus X11 &lt;i&gt;Server&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/cant-feel-like-wayland/#other-cuts"&gt;5. Other Cuts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/cant-feel-like-wayland/#pros"&gt;6. Pros&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/nav&gt;
&lt;p&gt;
So I had been using Wayland (sway) for two years or so, and I finally decided to
ditch it and switch back to X11 (i3). This blog post serves as an explanation
for the decision and a reminder for the future me trying out Wayland the
&lt;del&gt;second&lt;/del&gt; third time.
&lt;/p&gt;

&lt;p&gt;
Please note that the following complaints are from a frustrated user who really
doesn't bother to look under the carpet.
&lt;/p&gt;

&lt;p&gt;
&lt;/p&gt;&lt;p&gt;&lt;a href="https://kyo.iroiro.party/en/posts/cant-feel-like-wayland/"&gt;Read more…&lt;/a&gt; (5 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><category>linux</category><guid>https://kyo.iroiro.party/en/posts/cant-feel-like-wayland/</guid><pubDate>Fri, 20 Jun 2025 02:02:10 GMT</pubDate></item><item><title>ANSI escaping is a mess (or, why Emacs adds [] to my file?)</title><link>https://kyo.iroiro.party/en/posts/ansi-is-a-mess/</link><dc:creator>Kana</dc:creator><description>&lt;div&gt;&lt;nav id="table-of-contents" role="doc-toc"&gt;
&lt;h2&gt;Table of Contents&lt;/h2&gt;
&lt;div id="text-table-of-contents" role="doc-toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/ansi-is-a-mess/#why"&gt;1. Why?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/ansi-is-a-mess/#a-tale-of-two-takes"&gt;2. A Tale of Two Takes&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/ansi-is-a-mess/#emacs-keymaps"&gt;2.1. Emacs Keymaps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/ansi-is-a-mess/#the-evil-approach"&gt;2.2. The Evil Approach&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/ansi-is-a-mess/#menu-item-menus-implemented-as-keymaps"&gt;2.2.1. &lt;code&gt;menu-item&lt;/code&gt;: Menus Implemented As Keymaps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/ansi-is-a-mess/#evil-fixes-to-m-and-m-o"&gt;2.2.2. Evil Fixes To &lt;code&gt;M-[&lt;/code&gt; and &lt;code&gt;M-O&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/ansi-is-a-mess/#the-workaround-approach"&gt;2.3. The Workaround Approach&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/ansi-is-a-mess/#afterwords"&gt;3. Afterwords&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/nav&gt;
&lt;p&gt;
So I've long been puzzled by this behavior of my Emacs config: sometimes when I
open a file in the terminal with Emacs, it adds a pair of square brackets around
the current line/word/expression. After some digging, I've come to the
conclusion that, I absolutely don't want to work with &lt;b&gt;ANSI escape codes&lt;/b&gt;.
&lt;/p&gt;

&lt;p&gt;
&lt;/p&gt;&lt;p&gt;&lt;a href="https://kyo.iroiro.party/en/posts/ansi-is-a-mess/"&gt;Read more…&lt;/a&gt; (6 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><category>emacs</category><guid>https://kyo.iroiro.party/en/posts/ansi-is-a-mess/</guid><pubDate>Tue, 03 Jun 2025 12:57:19 GMT</pubDate></item><item><title>Writing a Lisp JIT Interpreter with GraalVM Truffle</title><link>https://kyo.iroiro.party/en/posts/emacs-lisp-interpreter-with-graalvm-truffle/</link><dc:creator>Kana</dc:creator><description>&lt;div&gt;&lt;nav id="table-of-contents" role="doc-toc"&gt;
&lt;h2&gt;Table of Contents&lt;/h2&gt;
&lt;div id="text-table-of-contents" role="doc-toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/emacs-lisp-interpreter-with-graalvm-truffle/#what-is-graal-and-truffle"&gt;1. What is Graal and Truffle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/emacs-lisp-interpreter-with-graalvm-truffle/#speculation-and-truffle-dsl"&gt;2. Speculation and Truffle DSL&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/emacs-lisp-interpreter-with-graalvm-truffle/#generatenodefactory"&gt;2.1. &lt;code&gt;@GenerateNodeFactory&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/emacs-lisp-interpreter-with-graalvm-truffle/#runtime-macro-expansion"&gt;3. Runtime Macro Expansion&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/emacs-lisp-interpreter-with-graalvm-truffle/#frames-within-frames"&gt;3.1. Frames Within Frames&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/emacs-lisp-interpreter-with-graalvm-truffle/#special-forms"&gt;4. Special Forms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/emacs-lisp-interpreter-with-graalvm-truffle/#built-in-function-inlining"&gt;5. Built-In Function Inlining&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/emacs-lisp-interpreter-with-graalvm-truffle/#lazy-ast-creation"&gt;5.1. Lazy AST Creation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/emacs-lisp-interpreter-with-graalvm-truffle/#function-redefinition-and-assumptions"&gt;5.2. Function Redefinition And Assumptions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/emacs-lisp-interpreter-with-graalvm-truffle/#emacs-lisp-closures"&gt;6. Emacs Lisp Closures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/emacs-lisp-interpreter-with-graalvm-truffle/#creating-closures-in-a-loop"&gt;7. Creating Closures In a Loop&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/emacs-lisp-interpreter-with-graalvm-truffle/#sharing-ast-between-closures"&gt;7.1. Sharing AST Between Closures&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/emacs-lisp-interpreter-with-graalvm-truffle/#anything-more"&gt;8. Anything More?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/nav&gt;
&lt;figure&gt;

&lt;figure&gt;
&lt;img src="https://kyo.iroiro.party/images/emacs-lisp-interpreter-with-graalvm-truffle/mandelbrot-benchmark.svg" alt="mandelbrot-benchmark.svg" class="org-svg"&gt;

&lt;/figure&gt;
&lt;figcaption&gt;
&lt;p&gt;
Mandelbort benchmark: Emacs (native-comp) runs 10x slower than Java or Truffle
implementation &lt;sup&gt;&lt;a id="fnr.benchmark" class="footref" href="https://kyo.iroiro.party/en/posts/emacs-lisp-interpreter-with-graalvm-truffle/#fn.benchmark" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt;
&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;
So I've been working on an interpreter for &lt;a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Introduction.html"&gt;Emacs Lisp&lt;/a&gt; using the &lt;a href="https://github.com/oracle/graal/tree/master/truffle"&gt;GraalVM Truffle&lt;/a&gt;
framework for a while now. As I've just completed its AST interpreter and a
bytecode interpreter, I guess its time to give it a little write-up (or rather,
some random babbling of various tricks).
&lt;/p&gt;

&lt;p&gt;
Although the Truffle interpreter covered here is for Emacs Lisp only, most of
the following should also be applicable to other Lisp dialects and maybe other
Truffle-based language implementations.
&lt;/p&gt;

&lt;p&gt;
&lt;/p&gt;&lt;p&gt;&lt;a href="https://kyo.iroiro.party/en/posts/emacs-lisp-interpreter-with-graalvm-truffle/"&gt;Read more…&lt;/a&gt; (22 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><category>emacs</category><category>java</category><category>perf</category><guid>https://kyo.iroiro.party/en/posts/emacs-lisp-interpreter-with-graalvm-truffle/</guid><pubDate>Thu, 01 May 2025 07:31:36 GMT</pubDate></item><item><title>Why Rewriting Emacs Is Hard</title><link>https://kyo.iroiro.party/en/posts/why-rewriting-emacs-is-hard/</link><dc:creator>Kana</dc:creator><description>&lt;div&gt;&lt;nav id="table-of-contents" role="doc-toc"&gt;
&lt;h2&gt;Table of Contents&lt;/h2&gt;
&lt;div id="text-table-of-contents" role="doc-toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/why-rewriting-emacs-is-hard/#rolling-your-own-string-types"&gt;1. Rolling your own string types&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/why-rewriting-emacs-is-hard/#lossless-file-editing"&gt;1.1. Lossless file editing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/why-rewriting-emacs-is-hard/#more-universal-than-unicode"&gt;1.2. More universal than Unicode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/why-rewriting-emacs-is-hard/#bringing-your-own-string-libraries"&gt;2. Bringing your own string libraries&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/why-rewriting-emacs-is-hard/#case-tables"&gt;2.1. Case tables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/why-rewriting-emacs-is-hard/#regexp"&gt;2.2. Regexp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/why-rewriting-emacs-is-hard/#any-encoding-you-want"&gt;2.3. Any encoding you want&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/why-rewriting-emacs-is-hard/#buffers-are-more-than-buffers"&gt;3. Buffers are more than buffers&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/why-rewriting-emacs-is-hard/#trees-are-everywhere"&gt;3.1. Trees are everywhere&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/why-rewriting-emacs-is-hard/#strings-into-buffers-into-strings"&gt;3.2. Strings into buffers into strings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/why-rewriting-emacs-is-hard/#more-on-gap-buffers"&gt;3.3. More on gap buffers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/why-rewriting-emacs-is-hard/#summarizing"&gt;4. Summarizing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/nav&gt;
&lt;p&gt;
There have been quite a few attempts to re-implement (part of) Emacs'
functionalities in languages other than C, like &lt;a href="https://jemacs.sourceforge.net/"&gt;JEmacs&lt;/a&gt;, &lt;a href="https://github.com/remacs/remacs"&gt;remacs&lt;/a&gt;, and &lt;a href="https://github.com/lem-project/lem/"&gt;lem&lt;/a&gt;. And we
are seeing new efforts in EmacsConf 2024: &lt;a href="https://github.com/CeleritasCelery/rune"&gt;rune&lt;/a&gt; &lt;sup&gt;&lt;a id="fnr.rune" class="footref" href="https://kyo.iroiro.party/en/posts/why-rewriting-emacs-is-hard/#fn.rune" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt;, &lt;a href="https://codeberg.org/ramin_hal9001/schemacs"&gt;schemacs&lt;/a&gt; &lt;sup&gt;&lt;a id="fnr.gypsum" class="footref" href="https://kyo.iroiro.party/en/posts/why-rewriting-emacs-is-hard/#fn.gypsum" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt;,
and the revived &lt;a href="https://codeberg.org/lyrra/guilemacs"&gt;Guilemacs&lt;/a&gt; &lt;sup&gt;&lt;a id="fnr.guilemacs" class="footref" href="https://kyo.iroiro.party/en/posts/why-rewriting-emacs-is-hard/#fn.guilemacs" role="doc-backlink"&gt;3&lt;/a&gt;&lt;/sup&gt;. (Strictly speaking, Guilemacs is more
a fork than a total rewrite, but anyway.)
&lt;/p&gt;

&lt;p&gt;
However, a complete rewrite of (GNU) Emacs &lt;sup&gt;&lt;a id="fnr.gnu-emacs" class="footref" href="https://kyo.iroiro.party/en/posts/why-rewriting-emacs-is-hard/#fn.gnu-emacs" role="doc-backlink"&gt;4&lt;/a&gt;&lt;/sup&gt; has always seemed like
an insurmountable task, not just because writing editors &lt;i&gt;is&lt;/i&gt; hard. This article
aims to look into some of these difficulties and the Emacs designs (that of
course have been exposed in some Emacs Lisp API) that lead to them.
&lt;/p&gt;

&lt;p&gt;
&lt;/p&gt;&lt;p&gt;&lt;a href="https://kyo.iroiro.party/en/posts/why-rewriting-emacs-is-hard/"&gt;Read more…&lt;/a&gt; (15 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><category>emacs</category><guid>https://kyo.iroiro.party/en/posts/why-rewriting-emacs-is-hard/</guid><pubDate>Wed, 08 Jan 2025 16:00:00 GMT</pubDate></item></channel></rss>