<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>notes from /dev/null - casual</title><link href="http://yummymelon.com/devnull/" rel="alternate"/><link href="http://yummymelon.com/devnull/feeds/tags/casual.atom.xml" rel="self"/><id>http://yummymelon.com/devnull/</id><updated>2026-03-03T13:10:00-08:00</updated><entry><title>Casual now available on NonGNU ELPA</title><link href="http://yummymelon.com/devnull/casual-now-available-on-nongnu-elpa.html" rel="alternate"/><published>2026-03-03T13:10:00-08:00</published><updated>2026-03-03T13:10:00-08:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2026-03-03:/devnull/casual-now-available-on-nongnu-elpa.html</id><summary type="html">&lt;p&gt;Casual is now available on NonGNU ELPA.&lt;/p&gt;</summary><content type="html">&lt;p&gt;If you are an Emacs user who only uses 3rd party packages from ELPA or NonGNU ELPA, I’m happy to announce that &lt;a href="https://elpa.nongnu.org/nongnu/casual.html"&gt;Casual is now available on NonGNU ELPA&lt;/a&gt;. 🎉&lt;/p&gt;
&lt;p&gt;If this is the first time you’ve heard of Casual, it is a project to re-imagine the primary user interface for Emacs using keyboard-driven menus. Casual’s design intent is to make the vast feature set of Emacs easier to discover and use in &lt;em&gt;casual&lt;/em&gt; fashion. It does so by providing bespoke hand-crafted menus for different modes provided by Emacs. These menus are opinionated in that the design of what goes into those menus are editorially determined by yours truly. To understand more about what Casual has to offer, &lt;a href="https://kickingvegas.github.io/casual/"&gt;please peruse its User Guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In terms of implementation, Casual is built using the &lt;a href="https://docs.magit.vc/transient/"&gt;Transient library&lt;/a&gt; made by Jonas Bernoulli. This is the same library that powers the UI for &lt;a href="https://magit.vc/"&gt;Magit&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Development of Casual has been on-going for nearly &lt;em&gt;two years&lt;/em&gt; now. Interested readers can read about Casual’s progress over that time &lt;a href="http://yummymelon.com/devnull/tag/casual.html"&gt;from my blog posts here&lt;/a&gt;. Throughout it all I’ve learned a lot about Emacs, its ecosystem of modes, and the powerful features they bring. It has only reinforced my conviction that Casual makes these powerful features more &lt;em&gt;usable&lt;/em&gt; beyond what is offered by default in Emacs.&lt;/p&gt;
&lt;p&gt;To clarify, if you still get Casual from &lt;a href="https://melpa.org/#/casual"&gt;MELPA&lt;/a&gt; (or MELPA Stable), &lt;em&gt;you do not have to change anything&lt;/em&gt;. The only difference is that users can now choose to install Casual from either MELPA or NonGNU ELPA. Updates to Casual will be distributed on both equally.&lt;/p&gt;
&lt;p&gt;My thanks goes out to the NonGNU ELPA reviewers who have provided guidance in helping get Casual on there. Additional thanks goes out to all the Casual users whose input and support have kept me going at this since 2024.&lt;/p&gt;</content><category term="misc"/><category term="emacs"/><category term="casual"/></entry><entry><title>Announcing Casual Org</title><link href="http://yummymelon.com/devnull/announcing-casual-org.html" rel="alternate"/><published>2026-02-19T15:00:00-08:00</published><updated>2026-02-19T15:00:00-08:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2026-02-19:/devnull/announcing-casual-org.html</id><summary type="html">&lt;p&gt;At long last, announcing Casual support for Org Mode.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Most Emacs Org users would concur that &lt;strong&gt;Org mode&lt;/strong&gt; is a magnificent tool for capturing and communicating thought. That said, Org mode’s &lt;a href="https://orgmode.org/features.html"&gt;vast set of features&lt;/a&gt; can be daunting to master. A common guidance for new users is to take it slow: incrementally learn a subset of Org’s features as you need them.&lt;/p&gt;
&lt;p&gt;A big reason for Org mode’s steep learning curve is that it adopts Emacs’ unfortunate culture of compelling users to memorize keybindings. Learning a distinct keybinding for each Org command (remember I said &lt;em&gt;vast&lt;/em&gt; feature set?) is onerous, so a different tack is made: reuse the same keybinding but have it possess different behavior based on context. This context is usually tied to the type of structure the point (aka cursor) is in. For example, if the point is in a source block, the binding &lt;code&gt;C-c C-c&lt;/code&gt; would execute it, but if the point is on a checkbox item, then &lt;code&gt;C-c C-c&lt;/code&gt; would toggle its checked state. Taking this approach lowers the effort to recall a keybinding at the cost of recalling what its contextual behavior would be. In practice, using such overloaded keybindings is…okay. But I’d argue that we could have a more usable interface, leading to the point of this post:&lt;/p&gt;
&lt;p&gt;Announcing support for &lt;a href="https://kickingvegas.github.io/casual/Org.html"&gt;Org mode&lt;/a&gt; in the &lt;a href="https://github.com/kickingvegas/casual/discussions/397"&gt;v2.14.0 update for Casual&lt;/a&gt;, now available on &lt;a href="https://melpa.org/#/casual"&gt;MELPA&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Readers of this blog will know that &lt;a href="https://kickingvegas.github.io/casual/"&gt;Casual&lt;/a&gt; is my project to re-imagine the primary user interface for Emacs using keyboard-driven menus. If this is new to you, I highly recommend reading this &lt;a href="https://github.com/kickingvegas/casual"&gt;introduction&lt;/a&gt; to it.&lt;/p&gt;
&lt;p&gt;Primary to the design of the Casual Org menus is to be context-sensitive, only showing a subset of Org mode commands that are relevant. This set of context-sensitive commands is opinionated, but seeks to provide utility to users both new and experienced with Org.&lt;/p&gt;
&lt;p&gt;Shown below is a demo of Casual Org at work:&lt;/p&gt;
&lt;video controls  muted=true poster="http://yummymelon.com/devnull/images/announcing-casual-org/casual-org-demo-poster.png" width="75%"&gt;
&lt;source src="http://yummymelon.com/devnull/images/videos/casual-org-demo.mp4" type="video/mp4" /&gt;
&lt;p&gt;
Your browser does not support HTML video. &lt;a href="http://yummymelon.com/devnull/images/videos/casual-org-demo.mp4" download="{static}images/videos/casual-org-demo.mp4"&gt;Link to video&lt;/a&gt;.
&lt;/p&gt;
&lt;/video&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;While the design of this UI has been months in the making, there is nothing like real-world use and feedback. &lt;a href="https://github.com/kickingvegas/casual/discussions/397"&gt;Constructive input is appreciated&lt;/a&gt;, especially if you are relatively new to using Org.&lt;/p&gt;
&lt;p&gt;A great deal of thanks goes out to the maintainers of and contributors to Org mode and to the community that uses it. If you are able, &lt;a href="https://liberapay.com/org-mode"&gt;please support it&lt;/a&gt;. Also, if you find Casual useful, I’d &lt;a href="https://buymeacoffee.com/kickingvegas"&gt;appreciate a coffee&lt;/a&gt; as well.&lt;/p&gt;
&lt;p&gt;&amp;#x2014;&lt;/p&gt;
&lt;p&gt;Video music: &lt;a href="https://jonreyes.bandcamp.com/track/burna-boy-last-last-jon-reyes-findaway-blend"&gt;Burna Boy - Last Last (JON REYES FINDAWAY BLEND) | Jon Reyes&lt;/a&gt;&lt;/p&gt;</content><category term="misc"/><category term="emacs"/><category term="org mode"/><category term="casual"/></entry><entry><title>Using Casual to work with Emacs Registers, Rectangles, and Windows</title><link href="http://yummymelon.com/devnull/using-casual-to-work-with-emacs-registers-rectangles-and-windows.html" rel="alternate"/><published>2026-02-07T10:00:00-08:00</published><updated>2026-02-07T10:00:00-08:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2026-02-07:/devnull/using-casual-to-work-with-emacs-registers-rectangles-and-windows.html</id><summary type="html">&lt;p&gt;Use Casual to effectively use Emacs registers, rectangles, and windows on the regular.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The features of &lt;a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Registers.html"&gt;registers&lt;/a&gt;, &lt;a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Rectangles.html"&gt;rectangles&lt;/a&gt;, and &lt;a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Windows.html"&gt;window management&lt;/a&gt; in Emacs are quite powerful yet prior to building &lt;a href="https://kickingvegas.github.io/casual/"&gt;Casual&lt;/a&gt;, I rarely used them because of the cognitive load of remembering each feature’s command sets, much less their bindings. Using keyboard-driven menus tailored for these three features changed that. Now I only have to recall &lt;em&gt;three&lt;/em&gt; key bindings to get easy access to registers, rectangles, and window management. This post demonstrates how you can as well.&lt;/p&gt;
&lt;p&gt;Provided you have &lt;a href="https://melpa.org/#/casual"&gt;Casual installed from MELPA&lt;/a&gt;, consider making the following global key bindings to your Emacs setup:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;keymap-global-set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;C-c r&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;casual-editkit-rectangle-tmenu&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;keymap-global-set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;C-c g&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;casual-editkit-registers-tmenu&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;keymap-global-set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;C-c w&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;casual-editkit-windows-tmenu&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;As always, you can adjust these bindings to your preference.&lt;/p&gt;
&lt;p&gt;Each of these menus are detailed further below.&lt;/p&gt;
&lt;h1&gt;Rectangle Menu (&lt;a href="https://kickingvegas.github.io/casual/Edit-commands.html#Rectangle_203a-_0028casual_002deditkit_002drectangle_002dtmenu_0029"&gt;casual-editkit-rectangle-tmenu&lt;/a&gt;)&lt;/h1&gt;
&lt;p&gt;The rectangle feature gives you the ability to mark (select) an arbitrary rectangle region in an Emacs buffer. There are many times where if the text is shaped like a rectangle, making transformations on them is exceptionally convenient. This menu provides you this.&lt;/p&gt;
&lt;p align='left'&gt;
&lt;img src='http://yummymelon.com/devnull/images/casual-registers-rectangles-windows/casual-editkit-rectangle-screenshot.png' alt='Screenshot of Casual rectangle menu' /&gt;
&lt;/p&gt;

&lt;h1&gt;Registers Menu (&lt;a href="https://kickingvegas.github.io/casual/Register-commands.html"&gt;casual-editkit-registers-tmenu&lt;/a&gt;)&lt;/h1&gt;
&lt;p&gt;Registers provide users a way to temporarily keep track of Emacs run-time state like text clippings, cursor (point) positions, macros, and arrangement of windows.&lt;/p&gt;
&lt;p align='left'&gt;
&lt;img src='http://yummymelon.com/devnull/images/casual-registers-rectangles-windows/casual-editkit-registers-screenshot.png' alt='Screenshot of Casual registers menu' /&gt;
&lt;/p&gt;

&lt;p&gt;Registers are a distinguishing feature of Emacs from other applications that support writing. It’s definitely a feature I miss when working outside of Emacs.&lt;/p&gt;
&lt;h1&gt;Windows Menu (&lt;a href="https://kickingvegas.github.io/casual/Window-management.html"&gt;casual-editkit-windows-tmenu&lt;/a&gt;)&lt;/h1&gt;
&lt;p&gt;In Emacs vernacular, a &lt;em&gt;window&lt;/em&gt; is a visual organization of how a buffer is displayed. Emacs windows are &lt;em&gt;not&lt;/em&gt; the same as what conventional GUIs (e.g. Wayland/X11, Apple macOS, Microsoft Windows) refer to as windows. In Emacs, GUI windows are referred to as &lt;em&gt;frames&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Emacs provides a number of commands to manage windows throughout their entire life-cycle which Casual organizes into the menu shown below:&lt;/p&gt;
&lt;p align='left'&gt;
&lt;img src='http://yummymelon.com/devnull/images/casual-registers-rectangles-windows/casual-editkit-window-screenshot.png' alt='Screenshot of Casual window management menu' /&gt;
&lt;/p&gt;

&lt;p&gt;In practice, I’ve found this menu to be most useful when using a compact/laptop-style keyboard or accessing Emacs via TTY. But if you are using GUI Emacs with a keyboard that has a number-pad, consider making the following number-pad bindings, particularly for selecting focus and swapping windows.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;
&lt;span class="normal"&gt;25&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;;; Number pad bindings for window management.&lt;/span&gt;
&lt;span class="c1"&gt;;; Requires GUI Emacs.&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;keymap-global-set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;C-&amp;lt;kp-add&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;enlarge-window&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;keymap-global-set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;C-&amp;lt;kp-subtract&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;shrink-window&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;keymap-global-set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;M-&amp;lt;kp-add&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;enlarge-window-horizontally&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;keymap-global-set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;M-&amp;lt;kp-subtract&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;shrink-window-horizontally&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;keymap-global-set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;C-&amp;lt;kp-enter&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;other-window&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;keymap-global-set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;M-&amp;lt;kp-enter&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;switch-to-buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;keymap-global-set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;C-&amp;lt;return&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;other-window&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;keymap-global-set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;C-&amp;lt;kp-8&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;windmove-up&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;keymap-global-set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;C-&amp;lt;kp-5&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;windmove-down&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;keymap-global-set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;C-&amp;lt;kp-2&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;windmove-down&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;keymap-global-set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;C-&amp;lt;kp-4&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;windmove-left&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;keymap-global-set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;C-&amp;lt;kp-6&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;windmove-right&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;keymap-global-set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;M-&amp;lt;kp-8&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;windmove-swap-states-up&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;keymap-global-set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;M-&amp;lt;kp-5&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;windmove-swap-states-down&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;keymap-global-set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;M-&amp;lt;kp-2&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;windmove-swap-states-down&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;keymap-global-set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;M-&amp;lt;kp-4&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;windmove-swap-states-left&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;keymap-global-set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;M-&amp;lt;kp-6&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;windmove-swap-states-right&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;;; These require the `ace-window&amp;#39; and `transpose-frame&amp;#39; packages.&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;keymap-global-set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;C-&amp;lt;kp-0&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;ace-select-window&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;keymap-global-set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;C-&amp;lt;kp-divide&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;transpose-frame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Note that the bindings for &lt;code&gt;ace-select-window&lt;/code&gt; and &lt;code&gt;transpose-frame&lt;/code&gt; require that you have the &lt;a href="https://melpa.org/#/ace-window"&gt;ace-window&lt;/a&gt; and &lt;a href="https://melpa.org/#/transpose-frame"&gt;transpose-frame&lt;/a&gt; packages installed.&lt;/p&gt;
&lt;h1&gt;Closing Thoughts&lt;/h1&gt;
&lt;p&gt;Registers, rectangles, and managing windows in Emacs are powerful features that are made easier to use with Casual. If you haven’t explored them, consider trying them out. I think you’ll be pleasantly surprised by what they offer and over time will consider them essential to your Emacs experience.&lt;/p&gt;</content><category term="misc"/><category term="emacs"/><category term="casual"/></entry><entry><title>Announcing Casual EWW</title><link href="http://yummymelon.com/devnull/announcing-casual-eww.html" rel="alternate"/><published>2026-01-22T14:20:00-08:00</published><updated>2026-01-22T14:20:00-08:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2026-01-22:/devnull/announcing-casual-eww.html</id><summary type="html">&lt;p&gt;Announcing Casual support for EWW, a web browser within Emacs.&lt;/p&gt;</summary><content type="html">&lt;p&gt;I confess to taking a perverse delight in browsing the web from within Emacs. The &lt;a href="https://www.gnu.org/software/emacs/manual/html_mono/eww.html"&gt;EWW&lt;/a&gt; package that comes with the standard distribution of Emacs makes this possible. On paper, Emacs really has no business trying to support web browsing with its laughably threadbare support for layout and typography, much less its lack of support for multi-threaded operation. In practice though, I’ve found browsing the web from Emacs to be surprisingly useful. To enhance my usage of EWW, I wanted easy discovery of its features via Transient menus. With that motivation, I set out to build &lt;a href="https://kickingvegas.github.io/casual/EWW.html"&gt;Casual EWW&lt;/a&gt;, now available on &lt;a href="https://melpa.org/#/casual"&gt;MELPA&lt;/a&gt; in the &lt;a href="https://github.com/kickingvegas/casual/releases/tag/2.13.0"&gt;Casual v2.13.0 update&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;EWW is a minimal browser in that no CSS nor JavaScript is supported. As such, EWW is best suited for websites that treat HTML as a document specification and not as a sub-system to a web application.&lt;/p&gt;
&lt;p align='center'&gt;
&lt;img src='http://yummymelon.com/devnull/images/announcing-casual-eww/casual-eww-screenshot.png' alt='' /&gt;
&lt;/p&gt;

&lt;p&gt;Features of Casual EWW include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Support for in-page paragraph and link navigation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Key bindings that match Safari and Chrome on macOS.&lt;/p&gt;
&lt;p&gt;In particular &lt;code&gt;M-[&lt;/code&gt; and &lt;code&gt;M-]&lt;/code&gt; for historical navigation and &lt;code&gt;M-l&lt;/code&gt; for entering a URL to open are supported.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Menus for toggling and configuring the display of a web page (font, colors, images).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support for document navigation.&lt;/p&gt;
&lt;p&gt;This feature distinguishes EWW from other conventional web browsers for navigating websites that support the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/rel"&gt;rel&lt;/a&gt; attribute. For example, Texinfo uses the &lt;code&gt;rel&lt;/code&gt; attribute in generating HTML output.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Observations and Closing Thoughts&lt;/h1&gt;
&lt;p&gt;Some observations in using EWW:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The implementation of bookmarks in EWW is… underwhelming.&lt;/p&gt;
&lt;p&gt;Note that EWW bookmarks are a different implementation from a regular &lt;a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Bookmarks.html"&gt;Emacs bookmark&lt;/a&gt;. The EWW bookmark list does not provide a means for ordering a bookmark, much less for sorting and editing them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;code&gt;eww-readable&lt;/code&gt; command (bound to &lt;code&gt;R&lt;/code&gt;) is your friend (when it works).&lt;/p&gt;
&lt;p&gt;EWW provides a “reader” mode via the command &lt;code&gt;eww-readable&lt;/code&gt; which attempts to display only the main content of a web page. If successful, I’ve found it to vastly improve EWW’s utility.&lt;/p&gt;
&lt;p&gt;Setting the variable &lt;code&gt;eww-readable-urls&lt;/code&gt; to include documentation from &lt;a href="https://developer.mozilla.org"&gt;https://developer.mozilla.org&lt;/a&gt; will break the command &lt;code&gt;css-lookup-symbol&lt;/code&gt; (accessible via &lt;a href="https://kickingvegas.github.io/casual/CSS-Usage.html"&gt;Casual CSS&lt;/a&gt;) as that command expects the web page to &lt;em&gt;not&lt;/em&gt; be in reader mode.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For Emacs users, the utility of EWW is very much a YMMV thing as it can overlap the features of other packages like the Info reader and Elfeed. Regardless of what is preferred, it is assuring to know that web browsing (however limited) is supported within Emacs.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://kickingvegas.github.io/casual/EWW.html"&gt;Casual EWW&lt;/a&gt; is now available on &lt;a href="https://melpa.org/#/casual"&gt;MELPA&lt;/a&gt; in the &lt;a href="https://github.com/kickingvegas/casual/releases/tag/2.13.0"&gt;Casual v2.13.0 update&lt;/a&gt;.&lt;/p&gt;</content><category term="misc"/><category term="emacs"/><category term="casual"/></entry><entry><title>Announcing Casual HTML &amp; CSS</title><link href="http://yummymelon.com/devnull/announcing-casual-html-css.html" rel="alternate"/><published>2026-01-06T17:40:00-08:00</published><updated>2026-01-06T17:40:00-08:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2026-01-06:/devnull/announcing-casual-html-css.html</id><summary type="html">&lt;p&gt;Announcing Casual support for the HTML and CSS editing modes in Emacs.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Although I rarely code up HTML and CSS these days, knowing their basics have brought me compounding rewards time and time again. If you use Emacs, you’re in luck as it provides built-in editing modes for both. These modes can make short work of sculpting your web pages to be presentable to the world at large.&lt;/p&gt;
&lt;p&gt;Improving the discoverability of the features in these modes is what the latest &lt;a href="https://github.com/kickingvegas/casual/releases/tag/2.12.0"&gt;v2.12.0 update&lt;/a&gt; of Casual is all about. Announcing Casual menus for &lt;a href="https://kickingvegas.github.io/casual/HTML.html"&gt;HTML&lt;/a&gt; and &lt;a href="https://kickingvegas.github.io/casual/CSS.html"&gt;CSS&lt;/a&gt;, new for 2026, now available on &lt;a href="https://melpa.org/#/casual"&gt;MELPA&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;Casual HTML&lt;/h1&gt;
&lt;p&gt;The main menu for HTML mode is shown below. Tag (&amp;lt;/&amp;gt;) operations for inserting, adding an attribute, closing, and deleting are supported.&lt;/p&gt;
&lt;p align='center'&gt;
&lt;img src='http://yummymelon.com/devnull/images/announcing-casual-html-css/casual-html-screenshot.png' alt='' /&gt;
&lt;/p&gt;

&lt;p&gt;HTML-specific tags are given their own menu.&lt;/p&gt;
&lt;p align='center'&gt;
&lt;img src='http://yummymelon.com/devnull/images/announcing-casual-html-css/casual-html-tags-screenshot.png' alt='' /&gt;
&lt;/p&gt;

&lt;h1&gt;Casual CSS&lt;/h1&gt;
&lt;p&gt;The main menu for CSS mode is shown below. A notable feature is the ability to lookup a CSS symbol from the Mozilla Developer Network (MDN) website using the built-in Emacs browser &lt;a href="https://www.gnu.org/software/emacs/manual/html_mono/eww.html"&gt;EWW&lt;/a&gt;.&lt;/p&gt;
&lt;p align='center'&gt;
&lt;img src='http://yummymelon.com/devnull/images/announcing-casual-html-css/casual-css-screenshot.png' alt='' /&gt;
&lt;/p&gt;

&lt;h1&gt;Closing Thoughts&lt;/h1&gt;
&lt;p&gt;Both HTML and CSS modes support Tree-sitter which offers nice structural navigation features. Although at the time of this writing (Emacs 30.2), using &lt;code&gt;html-ts-mode&lt;/code&gt; will break tag deletion (&lt;code&gt;sgml-tag-delete&lt;/code&gt;). On the other hand, I use &lt;code&gt;css-ts-mode&lt;/code&gt; without issue.&lt;/p&gt;
&lt;p&gt;If you haven't used either HTML or CSS modes yet, definitely give them a try using my Casual menus. I think you'll find them to be quite usable.&lt;/p&gt;</content><category term="misc"/><category term="emacs"/><category term="casual"/></entry><entry><title>Announcing Casual CSV</title><link href="http://yummymelon.com/devnull/announcing-casual-csv.html" rel="alternate"/><published>2025-11-24T09:00:00-08:00</published><updated>2025-11-24T09:00:00-08:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2025-11-24:/devnull/announcing-casual-csv.html</id><summary type="html">&lt;p&gt;If you need to work with CSV files in Emacs, Casual with &lt;code&gt;csv-mode&lt;/code&gt; can help. Announcing Casual CSV, now available in the Casual v2.11.1 update.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Like &lt;a href="http://yummymelon.com/devnull/announcing-casual-make.html"&gt;Make&lt;/a&gt;, the CSV file format will outlive us all. That said, editing a CSV file is a precarious task, as it can be easy to violate its separator and escape rules. Thankfully, the Emacs ecosystem has got you covered, with the 3rd party ELPA package &lt;a href="https://elpa.gnu.org/packages/csv-mode.html"&gt;csv-mode&lt;/a&gt;. This mode provides all kinds of conveniences including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;spreadsheet-like visualizing and editing of fields (field alignment)&lt;/li&gt;
&lt;li&gt;separator auto-detection (comma, tab, space, etc.)&lt;/li&gt;
&lt;li&gt;support for quoted fields&lt;/li&gt;
&lt;li&gt;sorting by fields&lt;/li&gt;
&lt;li&gt;killing and yanking fields&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To aid in the discovery and usage of these features, I’m happy to announce &lt;a href="https://kickingvegas.github.io/casual/CSV.html"&gt;Casual CSV&lt;/a&gt;, a Transient menu for &lt;code&gt;csv-mode&lt;/code&gt;, now available in the &lt;a href="https://github.com/kickingvegas/casual/releases/tag/2.11.0"&gt;Casual v2.11.1 update&lt;/a&gt; on MELPA.&lt;/p&gt;
&lt;p align='center'&gt;
&lt;img src='http://yummymelon.com/devnull/images/announcing-casual-csv/casual-csv-edit-screenshot.png' alt='Screenshot of Casual CSV' /&gt;
&lt;/p&gt;

&lt;p&gt;One notable feature Casual CSV adds is the ability to select a region of rows to copy to the &lt;code&gt;kill-ring&lt;/code&gt; as an Org table. This is also usable in Markdown flavors that support tables.&lt;/p&gt;
&lt;h1&gt;Closing Thoughts and Caveats&lt;/h1&gt;
&lt;p&gt;YMMV on how well &lt;code&gt;csv-mode&lt;/code&gt; works for you as its performance is tied to the size of CSV file you are working with. If you are trying to edit a CSV file that is hundreds of megabytes in size or greater, you might want to think twice before doing this in Emacs with &lt;code&gt;csv-mode&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;As a general rule, I try to avoid editing CSV files in the first place, as I prefer to think of them as files for data exchange. My ideal use-case for &lt;code&gt;csv-mode&lt;/code&gt; is really for viewing. That said, if you really need to edit a CSV file, it is best to copy it first. Casual CSV reflects this sensibility by offering a command to duplicate a file.&lt;/p&gt;
&lt;p&gt;To get the best results out of &lt;code&gt;csv-mode&lt;/code&gt;, I highly recommend turning on field alignment and separator auto-detection. In addition, turning off line-wrapping will aid in both visualization and navigation. The following Elisp configuration shows how to do this.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;;; disable line wrap&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;add-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;csv-mode-hook&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;lambda&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;visual-line-mode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;-1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;toggle-truncate-lines&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;

&lt;span class="c1"&gt;;; auto detect separator&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;add-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;csv-mode-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;csv-guess-set-separator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;;; turn on field alignment&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;add-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;csv-mode-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;csv-align-mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</content><category term="misc"/><category term="emacs"/><category term="casual"/></entry><entry><title>Announcing Casual Ediff</title><link href="http://yummymelon.com/devnull/announcing-casual-ediff.html" rel="alternate"/><published>2025-10-30T07:00:00-07:00</published><updated>2025-10-30T07:00:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2025-10-30:/devnull/announcing-casual-ediff.html</id><summary type="html">&lt;p&gt;Where an earnest attempt is made to improve the usability of Ediff for sensibilities in 2025.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Truth be told, I find default Ediff to be weird and intimidating compared to other tools that do the same thing, which is to find differences between two files. Like other modes, Ediff is reliant on the user knowing beforehand its commands and respective keybindings, which means it has a steep learning curve. Many of these commands are context specific. While Ediff tries to be helpful by displaying a cheat sheet, I find this feature to be so information dense and context-free (in a bad way) that it usually results in upping my anxiety. I mean, look at this table!&lt;/p&gt;
&lt;p align="center"&gt;
&lt;img src="http://yummymelon.com/devnull/images/announcing-casual-ediff/ediff-interface.png" / &gt;
&lt;/p&gt;

&lt;p&gt;That said, I’m not here to bury Ediff, but to praise it. Ediff is embarrassingly rich in functionality and time-tested. It just needs a better UI, which brings us to today’s post topic: Announcing Casual support for Ediff.&lt;/p&gt;
&lt;p&gt;The approach Casual takes is to provide a Transient menu for the Ediff control panel, which is configured to be in the same frame as the windows holding the compared files. This menu organizes relevant commands in sections that map to the files being compared and does its best to be context-sensitive (e.g. determine if the buffer is writable or read-only, know if its a file comparision or a merge, etc.).&lt;/p&gt;
&lt;p&gt;The result is an interface that is calmer to my eyes, as shown below.&lt;/p&gt;
&lt;p align="center"&gt;
&lt;img src="http://yummymelon.com/devnull/images/announcing-casual-ediff/casual-ediff-basic-screenshot.png" /&gt;
&lt;/p&gt;

&lt;p&gt;Casual Ediff builds on the work described in my earlier blog post &lt;a href="http://yummymelon.com/devnull/using-ediff-in-2023.html"&gt;Using Ediff in 2023&lt;/a&gt;, in providing a streamlined way to diff a modified version-controlled file. This way, if you already have the file loaded in a window, you can call &lt;code&gt;casual-ediff-revision&lt;/code&gt; to immediately see what changes you’ve made to it and to selectively be able to revert each change.&lt;/p&gt;
&lt;p align="center"&gt;
&lt;img src="http://yummymelon.com/devnull/images/announcing-casual-ediff/casual-ediff-screenshot.png" /&gt;
&lt;/p&gt;

&lt;p&gt;Casual Ediff also lets you resolve merge conflicts (typically from Magit). Added to Ediff is the ability to merge &lt;em&gt;both&lt;/em&gt; conflicting differences in the order of choice by the user (the menu items “Merge A,B to C”, “Merge B,A to C”).&lt;/p&gt;
&lt;p align="center"&gt;
&lt;img src="http://yummymelon.com/devnull/images/announcing-casual-ediff/casual-ediff-merge-conflict.png" /&gt;
&lt;/p&gt;

&lt;p&gt;Read more about Casual Ediff at &lt;a href="https://kickingvegas.github.io/casual/Ediff.html"&gt;Ediff (Casual User Guide)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Casual Ediff is now available on MELPA as part of the &lt;a href="https://github.com/kickingvegas/casual/releases/tag/2.10.0"&gt;v2.10.0 update for Casual&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It costs money to make, enhance, and maintain Casual as ideologically free software. If you enjoy using Casual, please consider a &lt;a href="https://buymeacoffee.com/kickingvegas"&gt;financial contribution&lt;/a&gt; to help support its development and maintenance. Thanks!&lt;/p&gt;</content><category term="misc"/><category term="emacs"/><category term="casual"/></entry><entry><title>Announcing Casual BibTeX</title><link href="http://yummymelon.com/devnull/announcing-casual-bibtex.html" rel="alternate"/><published>2025-09-24T16:00:00-07:00</published><updated>2025-09-24T16:00:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2025-09-24:/devnull/announcing-casual-bibtex.html</id><summary type="html">&lt;p&gt;Announcing Casual support for BibTeX, a bibilography database.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Given current events, the importance of having a shared and testable truth is arguably the only thing that matters these days. A time-honored practice to reaching such truth is to write and distribute documentation with good references.&lt;/p&gt;
&lt;p&gt;Emacs has long had support for BibTeX, &lt;a href="https://www2.eecs.berkeley.edu/Pubs/TechRpts/1987/6006.html#:~:text=http://www2.eecs.berkeley,and%20a%20draft%20making%20facility."&gt;going as far back as 1987&lt;/a&gt;. &lt;a href="https://bibtex.eu"&gt;BibTeX&lt;/a&gt; is both a bibliography processor for &lt;a href="https://www.latex-project.org"&gt;LaTeX&lt;/a&gt; documents and more importantly, a database schema for bibliographic data. The significance of the latter allows for using a BibTeX database for contexts outside of LaTeX.&lt;/p&gt;
&lt;p&gt;BibTeX organizes bibliographic data into a collection of records (or entries) that are stored in a plain-text file (multiple files are also supported). This plain-text file is identified using a “.bib” suffix and is treated as a database. Any plain-text editor can edit a BibTeX file. This can be seen, especially with 2025 eyes, as a virtue or an anathema. Because the BibTeX database is just a plain-text file, schema enforcement ultimately rests upon the user editing the file.&lt;/p&gt;
&lt;p&gt;The Emacs built-in package &lt;code&gt;bibtex&lt;/code&gt; tries to help shoulder this schema enforcement by providing commands for both navigating and editing BibTeX data structures (entries and the fields within an entry). In this way, &lt;code&gt;bibtex&lt;/code&gt; tries to provide the user a quasi-“form-based” interface to editing a BibTeX file.&lt;/p&gt;
&lt;p&gt;Like many other Emacs modes, I find the commands for &lt;code&gt;bibtex-mode&lt;/code&gt; to be difficult to both discover and recall. I also find &lt;code&gt;bibtex-mode&lt;/code&gt; to not be opinionated enough in trying to provide a form-based experience.&lt;/p&gt;
&lt;p&gt;To address this, I’m happy to announce the latest &lt;a href="https://melpa.org/#/casual"&gt;Casual&lt;/a&gt; addition: support for &lt;a href="https://kickingvegas.github.io/casual/BibTeX.html"&gt;BibTeX&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://yummymelon.com/devnull/images/announcing-casual-bibtex/casual-bibtex-screenshot.png" /&gt;&lt;/p&gt;
&lt;p&gt;Casual BibTeX organizes &lt;code&gt;bibtex&lt;/code&gt; commands into a Transient menu. The bindings remap conventional Emacs navigation bindings for field or entry navigation. Casual BibTeX holds the strong opinion that creation, update, or deletion of either an entry or a field should be done via commands dedicated for those respective operations. Using manual editing of the BibTeX file to achieve the same end is discouraged.&lt;/p&gt;
&lt;p&gt;If you are invested in Org, knowing how to work with BibTeX has great benefit as Org has &lt;a href="https://www.gnu.org/software/emacs/manual/html_node/org/Citation-handling.html#Citation-handling"&gt;extensive citation support&lt;/a&gt; for it.&lt;/p&gt;
&lt;p&gt;Casual BibTeX is now available in the &lt;a href="https://github.com/kickingvegas/casual/releases/tag/2.9.0"&gt;v2.9.0 update of Casual&lt;/a&gt; on &lt;a href="https://melpa.org/#/casual"&gt;MELPA&lt;/a&gt;. Learn more about Casual BibTeX in its &lt;a href="https://kickingvegas.github.io/casual/BibTeX.html"&gt;documentation&lt;/a&gt;.&lt;/p&gt;</content><category term="misc"/><category term="emacs"/><category term="casual"/></entry><entry><title>Announcing Casual Compile, Elisp, and Eshell</title><link href="http://yummymelon.com/devnull/announcing-casual-compile-elisp-and-eshell.html" rel="alternate"/><published>2025-07-28T09:00:00-07:00</published><updated>2025-07-28T09:00:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2025-07-28:/devnull/announcing-casual-compile-elisp-and-eshell.html</id><summary type="html">&lt;p&gt;Casual v2.8.0 update is a big one. Compile, Elisp, Eshell and revamped documentation.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Another update to Casual has been recently made (&lt;a href="https://github.com/kickingvegas/casual/releases/tag/2.8.0"&gt;v2.8.0&lt;/a&gt;) which adds two new interfaces:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Compile for &lt;code&gt;compilation-mode&lt;/code&gt; and &lt;code&gt;grep-mode&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Elisp for &lt;code&gt;emacs-lisp-mode&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Belatedly, this post also announces an interface for Eshell which was released in &lt;a href="https://github.com/kickingvegas/casual/releases/tag/2.7.0"&gt;v2.7.0&lt;/a&gt; without much fanfare. We’ll remedy this here.&lt;/p&gt;
&lt;p&gt;The v2.8.0 update also does an overhaul of the documentation for &lt;a href="https://kickingvegas.github.io/casual/"&gt;Casual&lt;/a&gt;, emphasizing the usage of &lt;a href="https://www.gnu.org/software/texinfo/manual/texinfo/html_node/index.html"&gt;Texinfo&lt;/a&gt; (by way of &lt;a href="https://orgmode.org/manual/Texinfo-Export.html"&gt;Org&lt;/a&gt;) to author it. A benefit for doing so is the ability to export its output to both Info and HTML.&lt;/p&gt;
&lt;h1&gt;Casual Compile&lt;/h1&gt;
&lt;p&gt;A common workflow is to use the &lt;code&gt;compile&lt;/code&gt; command to run a command line tool, typically &lt;code&gt;make&lt;/code&gt; (see also &lt;a href="https://kickingvegas.github.io/casual/Make.html"&gt;Casual User Guide (make)&lt;/a&gt;). If errors occur, then they are listed in a buffer named &lt;code&gt;✳︎compilation✳︎&lt;/code&gt; which can be navigated upon. The major mode of this buffer is &lt;code&gt;compilation-mode&lt;/code&gt; and it offers two ways to navigate this list:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Moving the current selection while simultaneously showing the selected error at its source in another window (aka “following” the selection.)&lt;/li&gt;
&lt;li&gt;Moving the current selection only.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By default, the keymap &lt;code&gt;compilation-mode-map&lt;/code&gt; binds a number of its commands to use a modifier key (&lt;code&gt;M-&lt;/code&gt; or &lt;code&gt;C-&lt;/code&gt;) which is too much work for my taste. I prefer a single key binding when possible, so have made the following changes for Casual Compile:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: center;"&gt;Default Binding&lt;/th&gt;
&lt;th style="text-align: center;"&gt;Casual Binding&lt;/th&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Note&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;M-p&lt;/td&gt;
&lt;td style="text-align: center;"&gt;k&lt;/td&gt;
&lt;td&gt;compilation-previous-error&lt;/td&gt;
&lt;td&gt;Use vi convention.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;M-n&lt;/td&gt;
&lt;td style="text-align: center;"&gt;j&lt;/td&gt;
&lt;td&gt;compilation-next-error&lt;/td&gt;
&lt;td&gt;Use vi convention.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;M-{&lt;/td&gt;
&lt;td style="text-align: center;"&gt;[&lt;/td&gt;
&lt;td&gt;compilation-previous-file&lt;/td&gt;
&lt;td&gt;Single key on &lt;code&gt;en&lt;/code&gt; keyboard.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;M-}&lt;/td&gt;
&lt;td style="text-align: center;"&gt;]&lt;/td&gt;
&lt;td&gt;compilation-next-file&lt;/td&gt;
&lt;td&gt;Single key on &lt;code&gt;en&lt;/code&gt; keyboard.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center;"&gt;C-o&lt;/td&gt;
&lt;td style="text-align: center;"&gt;o&lt;/td&gt;
&lt;td&gt;compilation-display-error&lt;/td&gt;
&lt;td&gt;Single key on &lt;code&gt;en&lt;/code&gt; keyboard.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The menu for Casual Compile (&lt;code&gt;casual-compile-tmenu&lt;/code&gt;) is shown below:&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="http://yummymelon.com/devnull/images/announcing-casual-compile/casual-compile-screenshot.png"&gt;&lt;/p&gt;
&lt;p&gt;This same menu also applies to Grep results when called from Emacs. This is because Grep output uses a major mode (&lt;code&gt;grep-mode&lt;/code&gt;) that is derived from &lt;code&gt;compilation-mode&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Learn more about Casual Compile in the &lt;a href="https://kickingvegas.github.io/casual/Compile.html"&gt;Casual User Guide (Compile)&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;Casual Elisp&lt;/h1&gt;
&lt;p&gt;While I’ve been an Emacs user for decades, I’ve only been writing Emacs Lisp (Elisp) for about a year and half now. The menu I’ve created for Elisp is largely a collection of commands that I’ve found useful to have around when developing for it.&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="http://yummymelon.com/devnull/images/announcing-casual-compile/casual-elisp-screenshot.png"&gt;&lt;/p&gt;
&lt;p&gt;This includes functions for evaluation, cross-referencing, byte-compiling, and balanced expression (sexp) navigation.&lt;/p&gt;
&lt;p&gt;Learn more about Casual Elisp in the &lt;a href="https://kickingvegas.github.io/casual/Elisp.html"&gt;Casual User Guide (Elisp)&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;Casual Eshell&lt;/h1&gt;
&lt;p&gt;Eshell has a number of commands to help save you from typing too much. Probably my most favorite command is &lt;code&gt;eshell-insert-buffer-name&lt;/code&gt; which will let you choose a buffer via completion. This command is mapped to the binding &lt;code&gt;B&lt;/code&gt; in &lt;code&gt;casual-eshell-tmenu&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="http://yummymelon.com/devnull/images/announcing-casual-compile/casual-eshell-screenshot.png"&gt;&lt;/p&gt;
&lt;p&gt;Learn more about Casual Eshell in the &lt;a href="https://kickingvegas.github.io/casual/Eshell.html"&gt;Casual User Guide (Eshell)&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;Casual User Guide&lt;/h1&gt;
&lt;p&gt;The User Guide for Casual has been revamped in v2.8.0. Notable features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Menu screenshots are now included in the Info file. They can be seen in the Emacs Info reader.&lt;/li&gt;
&lt;li&gt;The HTML generated from the same source as the Info file is now published at &lt;a href="https://kickingvegas.github.io/casual"&gt;https://kickingvegas.github.io/casual&lt;/a&gt;.&lt;ul&gt;
&lt;li&gt;Supports appearance changes (light/dark mode).&lt;/li&gt;
&lt;li&gt;Responsive for both mobile and desktop screens.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Closing Thoughts&lt;/h1&gt;
&lt;p&gt;Casual v2.8.0 was a big push, particularly with regards to the documentation. Please provide any feedback on any of the new features in the &lt;a href="https://github.com/kickingvegas/casual/discussions"&gt;discussions section&lt;/a&gt; for it.&lt;/p&gt;
&lt;p&gt;If you enjoy using Casual, please consider making a modest financial contribution to help support its development and maintenance. Thanks!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/kickingvegas"&gt;https://www.buymeacoffee.com/kickingvegas&lt;/a&gt;&lt;/p&gt;</content><category term="misc"/><category term="emacs"/><category term="casual"/></entry><entry><title>Announcing Casual Man &amp; Help</title><link href="http://yummymelon.com/devnull/announcing-casual-man-and-help.html" rel="alternate"/><published>2025-06-24T15:00:00-07:00</published><updated>2025-06-24T15:00:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2025-06-24:/devnull/announcing-casual-man-and-help.html</id><summary type="html">&lt;p&gt;Announcing Casual Man &amp;amp; Help, now available in Casual v2.6.0.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The penchant for contemporary software today to rely on cloud services becomes a malady whenever said services fail. The recent &lt;a href="https://www.cnet.com/news-live/google-cloud-stumbled-and-unplugged-the-internet-heres-how-the-crash-loop-began/"&gt;Google Cloud Platform failure&lt;/a&gt; two weeks ago was just one such event whose impact was widespread. By no means is this a novel thing as computer historians would rightfully attest. Complex, changing systems will inevitably fail. Sadly, much of the software in production today is &lt;em&gt;not&lt;/em&gt; designed to fail gracefully.&lt;/p&gt;
&lt;p&gt;Because the web, an overwhelming amount of computer documentation (reference manuals, user guides, tutorials, etc.) is now read from the Internet. This is great until it’s not. Software that packages documentation “local-first” relaxes having to be on-line to read it. So it is with Emacs and Unix-based systems with Man pages.&lt;/p&gt;
&lt;p&gt;Observing the above, I announce two more Transient menus for Casual, one for the &lt;em&gt;Unix Man page reader&lt;/em&gt; and the other for the built-in Emacs &lt;em&gt;Help&lt;/em&gt; system.&lt;/p&gt;
&lt;p&gt;&lt;img src='http://yummymelon.com/devnull/images/announcing-casual-man-help/casual-man-screenshot.png' width='60%' /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src='http://yummymelon.com/devnull/images/announcing-casual-man-help/casual-help-screenshot.png' width='60%' /&gt;&lt;/p&gt;
&lt;p&gt;By and large these menus are for navigation features but delving into both &lt;code&gt;Man-mode&lt;/code&gt; and &lt;code&gt;help-mode&lt;/code&gt;, I’ve come across some TILs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Setting the variable &lt;code&gt;Man-switches&lt;/code&gt; to the value “-a” will display all the man pages for a specified topic.&lt;ul&gt;
&lt;li&gt;This is useful if you have multiple variants of the same utility installed. An example is &lt;code&gt;ls&lt;/code&gt; where one variant could be GNU and the other BSD.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;In &lt;code&gt;Man-mode&lt;/code&gt;, if the point is on another command with a man page, pressing &lt;code&gt;RET&lt;/code&gt; (&lt;code&gt;man-follow&lt;/code&gt;) will open its man page in another window, regardless if it is a link.&lt;/li&gt;
&lt;li&gt;From &lt;code&gt;help-mode&lt;/code&gt;, the commands &lt;code&gt;help-goto-info&lt;/code&gt; (binding ’i’) and &lt;code&gt;help-goto-lispref-info&lt;/code&gt; (binding ’I’, Elisp only) will send you to an Info manual on the current help topic if it is available. (&lt;em&gt;the missing link!&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For &lt;code&gt;Man-mode&lt;/code&gt;, I’ve taken the liberty of making an &lt;code&gt;occur&lt;/code&gt;-style command using a regexp that looks for a ’-’ or ’+’ command line option. It is bound to ’o’ in the menu &lt;code&gt;casual-man-tmenu&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Both Casual &lt;a href="https://github.com/kickingvegas/casual?tab=readme-ov-file#man-elisp-library-casual-man"&gt;Man&lt;/a&gt; &amp;amp; &lt;a href="https://github.com/kickingvegas/casual?tab=readme-ov-file#help-elisp-library-casual-help"&gt;Help&lt;/a&gt; are part of the &lt;a href="https://github.com/kickingvegas/casual/releases/tag/2.6.0"&gt;Casual v2.6.0 release &lt;/a&gt;on &lt;a href="https://melpa.org/#/casual"&gt;MELPA&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;Links&lt;/h1&gt;
&lt;p&gt;Some earlier posts related to Emacs documentation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://yummymelon.com/devnull/announcing-casual-info.html"&gt;nfdn: Announcing Casual Info&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://yummymelon.com/devnull/personalizing-emacs-doc-navigation.html"&gt;nfdn: Personalizing Emacs Doc Navigation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="emacs"/><category term="casual"/></entry><entry><title>Announcing Casual Timezone</title><link href="http://yummymelon.com/devnull/announcing-casual-timezone.html" rel="alternate"/><published>2025-06-02T06:00:00-07:00</published><updated>2025-06-02T06:00:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2025-06-02:/devnull/announcing-casual-timezone.html</id><summary type="html">&lt;p&gt;Always know what the time is, anywhere. Announcing Casual Timezone.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Because the Internet, it is a blessing of our time that interacting with people in different time zones is commonplace. In this, the question is often raised: “what time is it there?” This is routinely answered using a clock app or a &lt;a href="https://www.timeanddate.com/worldclock/"&gt;website&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;While Emacs has long had the ability to make time zone calculations, it seemed overdue to have tooling that takes advantage of it.&lt;/p&gt;
&lt;p&gt;Announcing &lt;a href="https://github.com/kickingvegas/casual/blob/main/docs/timezone.org"&gt;Casual Timezone&lt;/a&gt;, now available as part of the &lt;a href="https://github.com/kickingvegas/casual/releases/tag/2.5.0"&gt;Casual v2.5.0 update&lt;/a&gt; on &lt;a href="https://melpa.org/#/casual"&gt;MELPA&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The following screencast shows Casual Timezone in action, in this case a meeting planner (command: &lt;code&gt;casual-timezone-planner&lt;/code&gt;) that compares the hours with your local time zone with that of another.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://yummymelon.com/devnull/images/announcing-casual-timezone/casual-timezone-demo.gif"/&gt;&lt;/p&gt;
&lt;p&gt;Casual Timezone also lets you directly ask:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“What time is it over there?” (command: &lt;code&gt;casual-timezone-local-time-to-remote&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;“That time over there, what is it here?” (command: &lt;code&gt;casual-timezone-remote-time-to-local&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that at current, Casual Timezone only supports Unix-variant systems as it relies on the &lt;a href="https://en.wikipedia.org/wiki/Tz_database"&gt;tz database&lt;/a&gt;. It has been tested on macOS 15.5 and Ubuntu Linux 22.04. Sorry Windows users, but I’m open for a PR for Windows support if a workaround for zoneinfo is available.&lt;/p&gt;
&lt;h1&gt;Closing Thoughts&lt;/h1&gt;
&lt;p&gt;With experience, I’ve learned to be humble about working with time APIs. While I’ve done much to ensure the results are accurate, I would not be surprised if there are bugs, especially for a first release. Let me know &lt;a href="https://github.com/kickingvegas/casual/issues"&gt;if you find any&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On reflection, putting Casual Timezone together was relatively easy as it was largely an exercise in integrating different Elisp packages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;From Org, the command &lt;code&gt;org-read-date&lt;/code&gt; provided the date picker UI.&lt;/li&gt;
&lt;li&gt;Built-in completion provided the UI for selecting a time zone.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vtable&lt;/code&gt; provided the table interface for &lt;code&gt;casual-timezone-planner&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The table interface was configured as a derived mode to provide mode-specific behavior.&lt;/li&gt;
&lt;li&gt;The built-in time functions were used for time zone calculations and formatting.&lt;/li&gt;
&lt;li&gt;Transient provided support for menus.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Gonna call this an Elisp code-reuse success story.&lt;/p&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Time-Zone-Rules.html"&gt;Time Zone Rules (GNU Emacs Lisp Reference Manual)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.gnu.org/software/emacs/manual/html_node/vtable/"&gt;vtable (Variable Pitch Tables)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Derived-Modes.html"&gt;Derived Modes (GNU Emacs Lisp Reference Manual)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="emacs"/><category term="casual"/></entry><entry><title>Announcing Casual Make</title><link href="http://yummymelon.com/devnull/announcing-casual-make.html" rel="alternate"/><published>2025-03-13T10:00:00-07:00</published><updated>2025-03-13T10:00:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2025-03-13:/devnull/announcing-casual-make.html</id><summary type="html">&lt;p&gt;Announcing Casual Make, an interface for editing Makefiles.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img src="http://yummymelon.com/devnull/images/announcing-casual-make/casual-make-screenshot.png" width="800"  /&gt;&lt;/p&gt;
&lt;p&gt;Back in the 90’s, I did not hold in high regard the &lt;strong&gt;Make&lt;/strong&gt; command with its cryptic syntax, insistence on making a tab space semantically significant, and platform/vendor-specific idiosyncrasies. Surely, I thought then, &lt;strong&gt;Make&lt;/strong&gt; will get replaced by a better tool any day now.&lt;/p&gt;
&lt;p&gt;Today it is March 13, 2025. &lt;strong&gt;Make&lt;/strong&gt; is still here and isn't going anywhere. With every fiber of my being I &lt;em&gt;know&lt;/em&gt; that &lt;strong&gt;Make&lt;/strong&gt; will outlive all of us. It is now too deeply rooted in our computing infrastructure to go away.&lt;/p&gt;
&lt;p&gt;Somewhere in the 2010’s I accepted the above observation and to paraphrase Kubrick, just stopped worrying and learned to love &lt;strong&gt;Make&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That said, for all of &lt;strong&gt;Make&lt;/strong&gt;’s ubiquity, there aren't that many tools around to help you edit makefiles.&lt;/p&gt;
&lt;p&gt;Emacs supports makefile editing with &lt;code&gt;make-mode&lt;/code&gt; which has a mix of useful and half-baked (though thankfully obsoleted in 30.1) commands. It is from this substrate that I'm happy to announce the next Casual user interface: &lt;a href="https://github.com/kickingvegas/casual/blob/main/docs/make-mode.org"&gt;Casual Make&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Of particular note to Casual Make is its attention to authoring and identifying automatic variables whose arcane syntax is un-memorizable. Want to know what &lt;code&gt;$&amp;lt;&lt;/code&gt;  means? Just select it in the makefile and use the &lt;code&gt;.&lt;/code&gt; binding in the Casual Make menu to identify what it does in the mini-buffer.&lt;/p&gt;
&lt;p&gt;Casual Make is now available with the latest update of &lt;a href="https://github.com/kickingvegas/casual/releases/tag/2.4.0"&gt;Casual v2.4.0&lt;/a&gt; on &lt;a href="https://melpa.org/#/casual"&gt;MELPA&lt;/a&gt;. This is a big update that also includes Info documentation for Casual for the first time.&lt;/p&gt;
&lt;h1&gt;Closing Thoughts&lt;/h1&gt;
&lt;p&gt;If your vocation involves programming computers, learn &lt;strong&gt;Make&lt;/strong&gt;. The rewards will pay off handsomely as you will find utility in using &lt;strong&gt;Make&lt;/strong&gt; for tasks both big and small. This is especially so for Emacs users who can take advantage of the &lt;code&gt;compile&lt;/code&gt; command which by default invokes &lt;strong&gt;Make&lt;/strong&gt;. The combination of Emacs compilation mode, make mode, command completion &amp;amp; history makes for a compelling IDE for task running.&lt;/p&gt;
&lt;p&gt;If you appreciate the Casual project, please support its development and maintenance by &lt;a href="https://www.buymeacoffee.com/kickingvegas"&gt;buying me a coffee&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Make_(software)"&gt;Make (software) - Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.gnu.org/software/make/manual/html_node/index.html"&gt;GNU Make Manual&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="emacs"/><category term="casual"/></entry><entry><title>Announcing Casual Image</title><link href="http://yummymelon.com/devnull/announcing-casual-image.html" rel="alternate"/><published>2025-01-30T14:45:00-08:00</published><updated>2025-01-30T14:45:00-08:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2025-01-30:/devnull/announcing-casual-image.html</id><summary type="html">&lt;p&gt;Announcing Casual Image, a re-imagined user interface for Emacs image-mode.&lt;/p&gt;</summary><content type="html">&lt;p&gt;There’s a certain folly to working on images with Emacs. Certainly there are far better tools designed to do this. However the compelling use case for viewing and editing an image in Emacs is &lt;em&gt;flow&lt;/em&gt;, particularly if the editing is relatively simple. More often than not, you already have access to an image file in Emacs. Why not make simple edits to it and stay in Emacs?&lt;/p&gt;
&lt;p&gt;To accomplish the above, Emacs provides the built-in package &lt;a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Image-Mode.html#Image-Mode"&gt;image-mode&lt;/a&gt;. I’ll be blunt - I think &lt;code&gt;image-mode&lt;/code&gt; has terrible naming of commands and variables, confusing documentation, and arcane bindings. Mouse operations with it are crude. The point must be on the image itself or commands will not work making for a brittle user experience. But if flow is important enough to compel you to using it, I figure you might as well get comfortable.&lt;/p&gt;
&lt;p&gt;Announcing &lt;a href="https://github.com/kickingvegas/casual/blob/main/docs/image.org"&gt;Casual Image&lt;/a&gt;, a re-imagining of the user interface for &lt;code&gt;image-mode&lt;/code&gt;, now available as part of the &lt;a href="https://melpa.org/#/casual"&gt;Casual user interfaces on MELPA&lt;/a&gt;. This interface deviates significantly with naming conventions used by &lt;code&gt;image-mode&lt;/code&gt; to be more in alignment with conventional image editing tools. It also adds the ability to &lt;em&gt;resize&lt;/em&gt; an image file as opposed to resizing a view of it.&lt;/p&gt;
&lt;p&gt;Here’s a screenshot:&lt;/p&gt;
&lt;p&gt;&lt;img src='http://yummymelon.com/devnull/images/announcing-casual-image/casual-image-main-screenshot.png' width='70%' /&gt;&lt;/p&gt;
&lt;p&gt;Casual Image requires that you have &lt;a href="https://imagemagick.org/"&gt;ImageMagick&lt;/a&gt; installed (either version 6.x or 7.x) to support the resize feature.&lt;/p&gt;
&lt;p&gt;Of all the Casual interfaces, this is arguably the most opinionated one due to the name changes. That said, these opinions are hopefully much less surprising. I invite you to give Casual Image a try.&lt;/p&gt;</content><category term="misc"/><category term="emacs"/><category term="casual"/></entry><entry><title>Announcement: Casual talk at EmacsConf 2024</title><link href="http://yummymelon.com/devnull/announcement-casual-talk-at-emacsconf-2024.html" rel="alternate"/><published>2024-12-02T11:45:00-08:00</published><updated>2024-12-02T11:45:00-08:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2024-12-02:/devnull/announcement-casual-talk-at-emacsconf-2024.html</id><summary type="html">&lt;p&gt;I’m giving a talk on Casual at EmacsConf 2024. Here’s some info on getting to see it.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Just a heads up that I’ll be presenting at this year’s EmacsConf 2024 with the talk &lt;a href="https://emacsconf.org/2024/talks/casual/"&gt;Re-imagining the Emacs User Experience with Casual Suite&lt;/a&gt; this Saturday, December 7 at 2:45 pm EST (US/Eastern).&lt;/p&gt;
&lt;p&gt;As Emacs users are world-wide, here’s when my talk will happen at different time-zones. If you're interested, please attend! The presentation is prerecorded but I will be there in the chats. EmacsConf is an online conference and is open to all.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;America/Los_Angeles&lt;/th&gt;
&lt;th style="text-align: left;"&gt;America/New_York&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Europe/Berlin&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Asia/Seoul&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;2024-12-07 11:45:00 -0800&lt;/td&gt;
&lt;td style="text-align: left;"&gt;2024-12-07 14:45:00 -0500&lt;/td&gt;
&lt;td style="text-align: left;"&gt;2024-12-07 20:45:00 +0100&lt;/td&gt;
&lt;td style="text-align: left;"&gt;2024-12-08 04:45:00 +0900&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;See you then!&lt;/p&gt;</content><category term="misc"/><category term="emacs"/><category term="casual"/></entry><entry><title>Announcing Casual Calendar</title><link href="http://yummymelon.com/devnull/announcing-casual-calendar.html" rel="alternate"/><published>2024-11-25T09:00:00-08:00</published><updated>2024-11-25T09:00:00-08:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2024-11-25:/devnull/announcing-casual-calendar.html</id><summary type="html">&lt;p&gt;The Emacs built-in calendar &amp;amp; diary gets the Casual treatment.&lt;/p&gt;</summary><content type="html">&lt;p&gt;On first impression, it’s a mixed bag using the Emacs built-in &lt;code&gt;calendar&lt;/code&gt; &amp;amp; &lt;code&gt;diary&lt;/code&gt;, as they both under and over-deliver on features. Users more familiar with GUI-based calendar and journal apps are underwhelmed, as capturing and displaying daily activity with it seem rudimentary at best. Hidden though in &lt;code&gt;calendar&lt;/code&gt; is its support for non-Gregorian calendar systems whose inclusion and &lt;a href="https://en.wikipedia.org/wiki/Calendrical_Calculations"&gt;history&lt;/a&gt; are both amazing and idiosyncratic. As common with Emacs modes, &lt;code&gt;calendar&lt;/code&gt; &amp;amp; &lt;code&gt;diary&lt;/code&gt; rely on user knowledge of its arcane commands and keybindings to make effective use of them. I think such reliance impedes more widespread usage of them, particularly with regards to calendar system conversion and anniversary entry. Given this, I decided to make a Transient-based user interface for &lt;code&gt;calendar&lt;/code&gt; &amp;amp; &lt;code&gt;diary&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Announcing &lt;a href="https://github.com/kickingvegas/casual/blob/main/docs/calendar.org"&gt;Casual Calendar&lt;/a&gt;, now available in the Casual v2.2 update distributed on &lt;a href="https://melpa.org/#/casual"&gt;MELPA&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src='http://yummymelon.com/devnull/images/announcing-casual-calendar/casual-calendar-screenshot.png' width="60%" style="border-style: groove;"/&gt;&lt;/p&gt;
&lt;p&gt;In this interface, emphasis has been given to the following workflows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Navigation&lt;/li&gt;
&lt;li&gt;Conversion of Gregorian dates to non-Gregorian calendar systems&lt;/li&gt;
&lt;li&gt;Visualizing holidays&lt;/li&gt;
&lt;li&gt;Viewing and creating diary events&lt;/li&gt;
&lt;li&gt;Viewing almanac information (lunar phases, sunrise/sunset times)&lt;/li&gt;
&lt;li&gt;Configuration of &lt;code&gt;calendar&lt;/code&gt; &amp;amp; &lt;code&gt;diary&lt;/code&gt; settings&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Why Use Calendar &amp;amp; Diary?&lt;/h1&gt;
&lt;p&gt;Though I have initially described &lt;code&gt;calendar&lt;/code&gt; &amp;amp; &lt;code&gt;diary&lt;/code&gt; with faint praise, I &lt;strong&gt;do&lt;/strong&gt; strongly recommend getting to know them better. Their utility shows up in many (often surprising) situations where you need to work with dates. Also, their integration into Org Mode alone makes it worth the effort.&lt;/p&gt;
&lt;p&gt;My most common use cases for &lt;code&gt;calendar&lt;/code&gt; &amp;amp; &lt;code&gt;diary&lt;/code&gt; are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lightweight visualization of months within Emacs (no need to leave Emacs to see a basic calendar!)&lt;/li&gt;
&lt;li&gt;Keeping track of periodic events that do not require notes (e.g. birthdays, anniversaries) in Org Agenda&lt;/li&gt;
&lt;li&gt;Org mode timestamp selection&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you share any of these use cases, consider bringing &lt;code&gt;calendar&lt;/code&gt; &amp;amp; &lt;code&gt;diary&lt;/code&gt; into your Emacs journey.&lt;/p&gt;
&lt;p&gt;A notable feature of &lt;code&gt;diary&lt;/code&gt; is that it can &lt;a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Non_002dGregorian-Diary.html"&gt;track periodic events for some non-Gregorian calendars&lt;/a&gt;, in particular Bahá’í, Hebrew, Islamic, and Lunar (Chinese). If you find cause to need this feature, you’ll be thankful that you are an Emacs user.&lt;/p&gt;
&lt;h1&gt;Customizing Calendar &amp;amp; Diary&lt;/h1&gt;
&lt;p&gt;Both &lt;code&gt;calendar&lt;/code&gt; &amp;amp; &lt;code&gt;diary&lt;/code&gt; have taken a austere aesthetic when it comes to default settings, where they show the strong influence of the Unix &lt;code&gt;cal&lt;/code&gt; command line utility by not visually highlighting holidays or days with diary entries. Users who prefer a richer presentation can follow the following customizations.&lt;/p&gt;
&lt;p&gt;To highlight holidays, go to the Settings menu “(,) Settings” and enable “(H) Mark Holidays”.&lt;/p&gt;
&lt;p&gt;To highlight diary entries, enable “(E) Mark Diary Entries”.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://yummymelon.com/devnull/images/announcing-casual-calendar/casual-calendar-settings-menu.png" width="60%" style="border-style: groove;" /&gt;&lt;/p&gt;
&lt;p&gt;As sunrise/sunset and lunar phase information is based on location, configuring all the settings in the &lt;strong&gt;Location&lt;/strong&gt; section is advised to enable those features.&lt;/p&gt;
&lt;p&gt;Org Agenda users will likely want to include &lt;code&gt;diary&lt;/code&gt; integration. Turn this on using the “(d) Include Diary” setting.&lt;/p&gt;
&lt;p&gt;An interactive enhancement when navigating (moving) in the &lt;code&gt;calendar&lt;/code&gt; window is to add the function call &lt;code&gt;(diary-view-entries 1)&lt;/code&gt; to the “(v) Move Hook” setting. This should be called as a lambda expression. In the customize window, it should look like this:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://yummymelon.com/devnull/images/announcing-casual-calendar/casual-calendar-customize-move-hook.png" width="60%" style="border-style: groove;" /&gt;&lt;/p&gt;
&lt;p&gt;To turn on support for non-Gregorian calendar system diary entries, the two settings “(L) List” and “(M) Mark” must be configured in the section &lt;strong&gt;Non-Gregorian Hooks&lt;/strong&gt;. Note that if you are working with Emacs 29.4 or earlier, you will only see checkboxes for the Bahá’í, Hebrew, and Islamic calendar systems. To get Lunar (Chinese) support requires manual entry of the values &lt;code&gt;diary-chinese-list-entries&lt;/code&gt; and &lt;code&gt;diary-chinese-mark-entries&lt;/code&gt; for “(L) List” and “(M) Mark” respectfully. Thankfully, the upcoming official &lt;a href="https://debbugs.gnu.org/cgi/bugreport.cgi?bug=74498"&gt;Emacs 30 release will fix this&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://yummymelon.com/devnull/images/announcing-casual-calendar/casual-calendar-customize-chinese-list.png" width="60%" style="border-style: groove;" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://yummymelon.com/devnull/images/announcing-casual-calendar/casual-calendar-customize-chinese-mark.png" width="60%" style="border-style: groove;" /&gt;&lt;/p&gt;
&lt;h1&gt;Closing Thoughts&lt;/h1&gt;
&lt;p&gt;Suffice to say, it is fundamentally human to mark the passage of time. Emacs, by including &lt;code&gt;calendar&lt;/code&gt; &amp;amp; &lt;code&gt;diary&lt;/code&gt; acknowledges this obvious fact. Incorporating &lt;code&gt;calendar&lt;/code&gt; &amp;amp; &lt;code&gt;diary&lt;/code&gt; into my Emacs workflows has yielded considerable benefits, sometimes surprisingly so. My motivation for building Casual Calendar was to make &lt;code&gt;calendar&lt;/code&gt; &amp;amp; &lt;code&gt;diary&lt;/code&gt; easier to use. Perhaps you’ll share the same sentiment.&lt;/p&gt;
&lt;h1&gt;Some Self-Promotion&lt;/h1&gt;
&lt;p&gt;If you enjoy using any of the Casual packages I’ve published over the past year (Agenda, Bookmarks, Calc, Calendar, Dired, EditKit, IBuffer, Info, I-Search, Re-Builder), please consider “starring” the &lt;a href="https://github.com/kickingvegas/casual"&gt;project on GitHub&lt;/a&gt; if you already haven’t done so. Financial support is also welcome as it helps the development and maintenance of Casual. Please consider &lt;a href="https://buymeacoffee.com/kickingvegas"&gt;buying me a coffee&lt;/a&gt; to provide it. Thank you.&lt;/p&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Calendar_002fDiary.html"&gt;Calendar/Diary (GNU Emacs Manual)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Calendrical_Calculations"&gt;Calendrical Calculations - Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="emacs"/><category term="casual"/></entry></feed>