<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>notes from /dev/null - org mode</title><link href="http://yummymelon.com/devnull/" rel="alternate"/><link href="http://yummymelon.com/devnull/feeds/tags/org-mode.atom.xml" rel="self"/><id>http://yummymelon.com/devnull/</id><updated>2026-05-28T10:00:00-07:00</updated><entry><title>Anju v1.5.0 Update</title><link href="http://yummymelon.com/devnull/anju-v150-update.html" rel="alternate"/><published>2026-05-28T10:00:00-07:00</published><updated>2026-05-28T10:00:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2026-05-28:/devnull/anju-v150-update.html</id><summary type="html">&lt;p&gt;Anju v1.5.0 update out in the wild. Lots of goodies in it.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Heads up for readers of this blog who are using &lt;a href="https://github.com/kickingvegas/anju"&gt;Anju&lt;/a&gt; or are mouse-curious Emacs users. I’ve recently released the &lt;a href="https://github.com/kickingvegas/anju/discussions/121"&gt;v1.5.0 update&lt;/a&gt; for it, now available on &lt;a href="https://melpa.org/#/anju"&gt;MELPA&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Many new features and enhancements are in this update as outlined below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Context Menus&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kickingvegas.github.io/anju/Selected-Text-Commands.html"&gt;Enhancements to selected text&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;Query Replace (Regexp)…&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Enhancements to Org mode support&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kickingvegas.github.io/anju/Org-Headline-Context-Menu.html"&gt;Headline&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;Change to Body&lt;/li&gt;
&lt;li&gt;Sort…&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kickingvegas.github.io/anju/Org-Item-Context-Menu.html"&gt;Item&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;Cycle Bullet…&lt;/li&gt;
&lt;li&gt;Sort…&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kickingvegas.github.io/anju/Org-Table-Context-Menu.html"&gt;Table&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;Sort…&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kickingvegas.github.io/anju/Org-_201cCopy-as_2026_201d-Context-Menu.html"&gt;Copy as…&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kickingvegas.github.io/anju/Org-Insert-Link.html"&gt;Link…&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Added support for &lt;a href="https://kickingvegas.github.io/anju/Makefile-Context-Menu.html"&gt;Makefile mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Added support for &lt;a href="https://kickingvegas.github.io/anju/Info-Context-Menu.html"&gt;Info mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Added support for &lt;a href="https://kickingvegas.github.io/anju/Compilation_002fGrep-Context-Menu.html"&gt;Compilation/Grep mode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Main Menu&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tools menu enhancements&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kickingvegas.github.io/anju/Tools-Menu-Features.html"&gt;Global Org Commands&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kickingvegas.github.io/anju/Macro-Recorder-Menu.html"&gt;Macro Recorder&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Edit › Delete menu enhancement&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kickingvegas.github.io/anju/Edit-Menu-Features.html"&gt;Delete Duplicate Lines&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Users who work with both Org mode and Markdown formatted text should find interest in the &lt;a href="https://kickingvegas.github.io/anju/Org-_201cCopy-as_2026_201d-Context-Menu.html"&gt;Copy as…&lt;/a&gt; capability added to the Org mode context menu. This feature lets one use Org mode as the primary means of authoring text, exporting to Markdown (or another format) using a right-click mouse copy action.&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="images/anju-1-5/anju-context-menu-org-copy-as.png"&gt;&lt;/p&gt;
&lt;p&gt;Thanks to Marcin Borkowski whose post &lt;a href="https://mbork.pl/2021-05-02_Org-mode_to_Markdown_via_the_clipboard"&gt;“Org-mode to Markdown via the clipboard”&lt;/a&gt;, inspired this feature.&lt;/p&gt;
&lt;p&gt;Anju also provides a complementary command “Paste Markdown as Org” for Org mode which lets one paste copied Markdown text into an Org file, doing the conversion of Markdown to Org under the hood using &lt;code&gt;pandoc&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="images/anju-1-5/anju-paste-markdown-as-org.png"&gt;&lt;/p&gt;
&lt;p&gt;In summary, this is a big release with many changes. I invite you to explore all the links above to see what’s available in Anju.&lt;/p&gt;</content><category term="misc"/><category term="emacs"/><category term="org mode"/><category term="anju"/></entry><entry><title>Call for Testing: Scrim v1.1.3 TestFlight on pre-release Emacs 31</title><link href="http://yummymelon.com/devnull/call-for-testing-scrim-113-testflight-on-pre-release-emacs-31.html" rel="alternate"/><published>2026-04-23T14:40:00-07:00</published><updated>2026-04-23T14:40:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2026-04-23:/devnull/call-for-testing-scrim-113-testflight-on-pre-release-emacs-31.html</id><summary type="html">&lt;p&gt;Looking for folks who want to test a new pre-release build of Scrim v1.1.3 which fixes it for Emacs 31.&lt;/p&gt;</summary><content type="html">&lt;p&gt;For folks who like using the development build of Emacs (at the time of this writing Emacs 31.0.5) on macOS, it turns out there is a &lt;a href="https://github.com/kickingvegas/scrim/issues/76"&gt;bug&lt;/a&gt; in how &lt;a href="http://yummymelon.com/scrim/"&gt;Scrim&lt;/a&gt; sends Org protocol requests to it.&lt;/p&gt;
&lt;p&gt;A fix has been identified and so far it works fine for both Emacs 30.2 and 31.0.5 from my testing. That said, it is always better to have more folks trying it out.&lt;/p&gt;
&lt;p&gt;If you use the latest Emacs 31.0.5+ on macOS and use (or are interested in using) Org protocol, I invite you to &lt;a href="https://testflight.apple.com/join/5HNzNtft"&gt;try out a TestFlight build of Scrim v1.1.3&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If this is the first time you’ve heard about Scrim, learn more about it at &lt;a href="http://yummymelon.com/scrim/"&gt;http://yummymelon.com/scrim/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thanks much!&lt;/p&gt;</content><category term="misc"/><category term="emacs"/><category term="org mode"/><category term="scrim"/><category term="macos"/></entry><entry><title>Computing Days Until with Emacs</title><link href="http://yummymelon.com/devnull/computing-days-until-with-emacs.html" rel="alternate"/><published>2026-04-08T16:00:00-07:00</published><updated>2026-04-08T16:00:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2026-04-08:/devnull/computing-days-until-with-emacs.html</id><summary type="html">&lt;p&gt;Countdown clocks are always useful. Here’s one for computing days until in Emacs.&lt;/p&gt;</summary><content type="html">&lt;p&gt;A recent Mastodon post showing the days until the next U.S. election got me to wonder, “how can I compute that in Emacs?” Turns out, this is trivial with the Org mode function &lt;code&gt;org-time-stamp-to-now&lt;/code&gt; doing the timestamp computation for you.&lt;/p&gt;
&lt;p&gt;We can wrap &lt;code&gt;org-time-stamp-to-now&lt;/code&gt; in an internal function &lt;code&gt;cc/--days-until&lt;/code&gt; that generates a formatted string of the days until a target date.&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;/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="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/--days-until&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kp"&gt;&amp;amp;optional&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;template&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Formatted string of days until TARGET.&lt;/span&gt;

&lt;span class="s"&gt;- TARGET: date string that conforms to &lt;/span&gt;&lt;span class="ss"&gt;`parse-time-string&amp;#39;&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;
&lt;span class="s"&gt;- TEMPLATE : format string that includes ‘%d’ specifier.&lt;/span&gt;

&lt;span class="s"&gt;If TEMPLATE is nil, then a predefined format string will be&lt;/span&gt;
&lt;span class="s"&gt;used.&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;template&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;template&lt;/span&gt;
&lt;span class="w"&gt;                       &lt;/span&gt;&lt;span class="nv"&gt;template&lt;/span&gt;
&lt;span class="w"&gt;                     &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;%d days until &amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;target&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;days&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;org-time-stamp-to-now&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;target&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;msg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;template&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;days&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;msg&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;From there we can then start defining commands that use &lt;code&gt;cc/--days-until&lt;/code&gt;. The command cc/days-until shown below will prompt you with a date picker to enter a date. Note that you can enter a date value (e.g. “Dec 25, 2026”) in the mini-buffer prompt for &lt;code&gt;org-read-date&lt;/code&gt;.&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;/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="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/days-until&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Prompt user for date and show days until in the mini-buffer.&lt;/span&gt;

&lt;span class="s"&gt;Use &lt;/span&gt;&lt;span class="ss"&gt;`org-read-date&amp;#39;&lt;/span&gt;&lt;span class="s"&gt; to compute days until to display in the mini-buffer.&lt;/span&gt;

&lt;span class="s"&gt;If prefix ARG is non-nil, then the computed result is stored in the&lt;/span&gt;
&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="ss"&gt;`kill-ring&amp;#39;&lt;/span&gt;&lt;span class="s"&gt;.&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;interactive&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;P&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;org-read-date&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;msg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;cc/--days-until&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;target&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;arg&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kill-new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;msg&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;Going back to the original motivator for this post, here’s an implementation of days until the next two major U.S. election dates with the command &lt;code&gt;cc/days-until-voting&lt;/code&gt;.&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;/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="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/days-until-voting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Days until U.S. elections in 2026 and 2028.&lt;/span&gt;

&lt;span class="s"&gt;If prefix ARG is non-nil, then the computed result is stored in the&lt;/span&gt;
&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="ss"&gt;`kill-ring&amp;#39;&lt;/span&gt;&lt;span class="s"&gt;.&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;interactive&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;P&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;midterms&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;cc/--days-until&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;2026-11-03&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;%d days until 2026 midterms&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;election&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;cc/--days-until&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;2028-11-07&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;%d days until 2028 presidential election&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;msg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;%s, %s&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;midterms&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;election&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;arg&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kill-new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;msg&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;The result of &lt;code&gt;M-x cc/days-until-voting&lt;/code&gt; as of 8 April 2026 is:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;209 days until 2026 midterms, 944 days until 2028 presidential election&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;It’s so human to want to know how long it’s going to take. Feel free to build your own countdown clocks using the code above. May your journey to whatever you plan be a happy one!&lt;/p&gt;</content><category term="misc"/><category term="emacs"/><category term="org mode"/></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>Export Org to Markdown with the Clipboard</title><link href="http://yummymelon.com/devnull/export-org-to-markdown-with-the-clipboard.html" rel="alternate"/><published>2025-12-17T11:30:00-08:00</published><updated>2025-12-17T11:30:00-08:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2025-12-17:/devnull/export-org-to-markdown-with-the-clipboard.html</id><summary type="html">&lt;p&gt;A companion post to my last one on importing Markdown to Org, but the other way around.&lt;/p&gt;</summary><content type="html">&lt;p&gt;In symmetry with my post, &lt;a href="http://yummymelon.com/devnull/import-markdown-to-org-with-the-clipboard-in-emacs.html"&gt;Import Markdown to Org with the Clipboard in Emacs&lt;/a&gt;, exporting Org to Markdown via the system clipboard might be desired instead. Turns out, Marcin Borkowski has already done this as detailed in his post &lt;a href="https://mbork.pl/2021-05-02_Org-mode_to_Markdown_via_the_clipboard"&gt;Org-mode to Markdown via the clipboard&lt;/a&gt; with the function &lt;code&gt;org-copy-region-as-markdown&lt;/code&gt;. In my Emacs initialization, I’ve taken the liberty of prefixing that function name with &lt;code&gt;mb/&lt;/code&gt; to disambiguate it with actual functions from Org.&lt;/p&gt;
&lt;p&gt;If you prefer to write in Org but need to post in Markdown, definitely give Borkowski’s post a look.&lt;/p&gt;</content><category term="misc"/><category term="emacs"/><category term="org mode"/><category term="markdown"/></entry><entry><title>Import Markdown to Org with the Clipboard in Emacs</title><link href="http://yummymelon.com/devnull/import-markdown-to-org-with-the-clipboard-in-emacs.html" rel="alternate"/><published>2025-12-04T13:30:00-08:00</published><updated>2025-12-04T13:30:00-08:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2025-12-04:/devnull/import-markdown-to-org-with-the-clipboard-in-emacs.html</id><summary type="html">&lt;p&gt;Import Markdown from other apps into your Org files easy.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The preponderance of Markdown formatted text in both websites and apps is a blessing and a point of friction for Org users. The content is there, but if you’re an Org user, you really prefer the text to be formatted for Org. If you have &lt;a href="https://pandoc.org/index.html"&gt;Pandoc&lt;/a&gt; installed, converting from Markdown to Org is trivial but laborious as it involves making the right command invocation with temporary files.&lt;/p&gt;
&lt;p&gt;Thankfully, Emacs can automate this conversion as described in the workflow below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;From the source app or website, copy the Markdown into the system clipboard. This step pushes this text into the Emacs &lt;code&gt;kill-ring&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;In Emacs, invoke a command which converts the above Markdown text into Org, then pastes (yanks) converted text into a desired Org file.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that this workflow presumes that the Emacs &lt;code&gt;kill-ring&lt;/code&gt; is integrated with the system clipboard and that &lt;code&gt;pandoc&lt;/code&gt; is installed.&lt;/p&gt;
&lt;p&gt;The following Elisp command &lt;code&gt;cc/yank-markdown-as-org&lt;/code&gt; implements the above workflow:&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;/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="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/yank-markdown-as-org&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="s"&gt;&amp;quot;Yank Markdown text as Org.&lt;/span&gt;

&lt;span class="s"&gt;This command will convert Markdown text in the top of the &lt;/span&gt;&lt;span class="ss"&gt;`kill-ring&amp;#39;&lt;/span&gt;
&lt;span class="s"&gt;and convert it to Org using the pandoc utility.&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;save-excursion&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;with-temp-buffer&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;yank&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;shell-command-on-region&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;point-min&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;point-max&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;pandoc -f markdown -t org --wrap=preserve&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;t&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;kill-region&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;point-min&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;point-max&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;yank&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;This command can be invoked in numerous ways including by key binding, context menu, Transient menu, and directly via &lt;code&gt;M-x&lt;/code&gt;. My preference is using the context menu as illustrated in the screenshot below to optimize for mouse copy/paste interactions between different apps.&lt;/p&gt;
&lt;p align='center'&gt;
&lt;img src='http://yummymelon.com/devnull/images/import-markdown-to-org/paste-markdown-as-org.png' alt='' /&gt;
&lt;/p&gt;

&lt;p&gt;Users interested in seeing how I’ve configured my context menu can &lt;a href="https://github.com/kickingvegas/cclisp/blob/98aad8329bc5788448fc9dde23b6e56bd4a3014c/cc-context-menu.el#L104"&gt;read the source here&lt;/a&gt;. Users unfamiliar with Emacs context menus can learn more about it in my post &lt;a href="http://yummymelon.com/devnull/customizing-the-emacs-context-menu.html"&gt;Customizing the Emacs Context Menu&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;Closing Thoughts&lt;/h1&gt;
&lt;p&gt;Implementing &lt;code&gt;cc/yank-markdown-as-org&lt;/code&gt; turned out to be a lot more simpler than expected, as the command &lt;code&gt;shell-command-on-region&lt;/code&gt; does the heavy lifting in abstracting away the &lt;code&gt;pandoc&lt;/code&gt; command invocation and its handling of temporary files. This implementation can serve as a example for other conversions using the &lt;code&gt;kill-ring&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;A word of thanks to mekeor on IRC for reminding me that &lt;code&gt;(point-min)&lt;/code&gt; and &lt;code&gt;(point-max)&lt;/code&gt; exist.&lt;/p&gt;</content><category term="misc"/><category term="emacs"/><category term="org mode"/><category term="markdown"/></entry><entry><title>Storing a Link from your Web Browser to BibTeX using Org protocol</title><link href="http://yummymelon.com/devnull/storing-a-link-from-your-web-browser-to-bibtex-using-org-protocol.html" rel="alternate"/><published>2025-09-25T16:15:00-07:00</published><updated>2025-09-25T16:15:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2025-09-25:/devnull/storing-a-link-from-your-web-browser-to-bibtex-using-org-protocol.html</id><summary type="html">&lt;p&gt;Automate writing a BibTeX Online entry to Emacs from your web browser using Org protocol.&lt;/p&gt;</summary><content type="html">&lt;p&gt;If you’re familiar with this blog, you’ll know that I’m a fan of &lt;a href="https://orgmode.org/worg/org-contrib/org-protocol.html"&gt;Org protocol&lt;/a&gt;, a means of sending data such as web links and content to an Org file from outside of Emacs. Following up on my last &lt;a href="http://yummymelon.com/devnull/announcing-casual-bibtex.html"&gt;post on Casual BibTeX&lt;/a&gt;, this post will show how to re-purpose Org protocol to send a link from your preferred web browser to a BibTeX file.&lt;/p&gt;
&lt;p&gt;This is achieved by adding the following template (named “bib”) to the variable &lt;code&gt;org-capture-templates&lt;/code&gt; as shown below:&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;/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;add-to-list&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;org-capture-templates&lt;/span&gt;
&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;bib&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;BibTex Online Entry&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="nv"&gt;plain&lt;/span&gt;
&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;~/org/bib/references.bib&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&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;string-join&lt;/span&gt;
&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;@Online {,&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                                  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;author = {%^{Author(s)}},&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                                  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;organization = {%^{Organization}},&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                                  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;title = {%:description},&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                                  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;url = {%:link},&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                                  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;date = {%&amp;lt;%Y-%m-%d&amp;gt;%?},&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                                  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;notes = {&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                                  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;%i&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                                  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;}&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                                  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="nb"&gt;:prepend&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;t&lt;/span&gt;
&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="nb"&gt;:empty-lines-after&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The web link is treated as an BibTeX &lt;code&gt;Online&lt;/code&gt; entry type whose fields are populated as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;url&lt;/code&gt; field holds the web page link.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;title&lt;/code&gt; field holds the web page title.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;date&lt;/code&gt; is populated with the current day (this should be edited to the actual date).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;notes&lt;/code&gt; is populated with the body value according to the &lt;a href="https://orgmode.org/manual/The-capture-protocol.html"&gt;capture protocol&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;author&lt;/code&gt; is populated with the value entered via mini-buffer prompt.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;organization&lt;/code&gt; is populated with the value entered via mini-buffer prompt, typically the name of the website.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The template is configured to prepend (via the &lt;code&gt;:prepend&lt;/code&gt; property) the captured &lt;code&gt;Online&lt;/code&gt; entry to the file “~/org/bib/references.bib”. These values can be adjusted to taste.&lt;/p&gt;
&lt;p&gt;When invoking this template via Org protocol, a temporary capture window holding the populated template is created. This entry will not have a citation key, so it is recommended to run &lt;code&gt;M-x&lt;/code&gt; &lt;code&gt;bibtex-clean-entry&lt;/code&gt; to generate it before committing the capture via &lt;code&gt;C-c C-c&lt;/code&gt;. If you have &lt;a href="https://kickingvegas.github.io/casual/BibTeX.html"&gt;Casual BibTeX&lt;/a&gt; installed, you can invoke the Transient menu &lt;code&gt;casual-bibtex-tmenu&lt;/code&gt; with the binding &lt;code&gt;M-m&lt;/code&gt; and invoke the clean command from there.&lt;/p&gt;
&lt;h1&gt;Closing Thoughts&lt;/h1&gt;
&lt;p&gt;Arguably, Org protocol was not designed to support files other than those using Org markup, so the above practice skirts its design intent by sending the capture to a BibTeX file. But as of Emacs 30.2 and Org 9.7.34, this works fine, so YOLO. Users intent on customizing the above “bib” template should be advised that many &lt;a href="https://orgmode.org/manual/Template-elements.html"&gt;template properties&lt;/a&gt; are not supported, so be advised.&lt;/p&gt;
&lt;p&gt;That all said, it’s a nice win to automate the task of writing a BibTeX &lt;code&gt;Online&lt;/code&gt; entry.&lt;/p&gt;</content><category term="misc"/><category term="emacs"/><category term="org mode"/></entry><entry><title>Capturing Org Source Blocks</title><link href="http://yummymelon.com/devnull/capturing-org-source-blocks.html" rel="alternate"/><published>2025-07-08T17:00:00-07:00</published><updated>2025-07-08T17:00:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2025-07-08:/devnull/capturing-org-source-blocks.html</id><summary type="html">&lt;p&gt;Clip source code from your web browser elegantly with Org capture.&lt;/p&gt;</summary><content type="html">&lt;p&gt;A commonplace activity is to copy source code from a web page into an Org file. Ideally such code is kept structurally intact by wrapping it in an &lt;a href="https://orgmode.org/manual/Working-with-Source-Code.html"&gt;Org source block&lt;/a&gt;. This is typically done as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select source code text in web page.&lt;/li&gt;
&lt;li&gt;Copy source code text.&lt;/li&gt;
&lt;li&gt;Paste source code into Org file.&lt;/li&gt;
&lt;li&gt;Annotate the pasted source code with an Org source block, specifying language. (&lt;code&gt;#+BEGIN_SRC {language}&lt;/code&gt;, &lt;code&gt;#+END_SRC&lt;/code&gt;)&lt;ul&gt;
&lt;li&gt;Either done manually or using the command &lt;code&gt;org-insert-structure-template&lt;/code&gt; (&lt;code&gt;C-c C-,&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;While the above is not complicated, it can get onerous if done frequently. Thankfully Org provides you with the means to automate this. For example with Org protocol, the above steps can be reduced to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select source code text in web page (no need to copy!).&lt;/li&gt;
&lt;li&gt;Run web bookmark to capture selected text to Emacs.&lt;/li&gt;
&lt;li&gt;Select source code language via mini-buffer completion in Emacs and commit capture (&lt;code&gt;C-c C-c&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Interested? Read on. Some Elisp ahead, but hopefully not too challenging.&lt;/p&gt;
&lt;h1&gt;Capturing code with Org protocol&lt;/h1&gt;
&lt;p&gt;A convenient way to capture content from a web page is through &lt;a href="https://orgmode.org/manual/Protocols.html"&gt;Org protocol&lt;/a&gt; which builds on top of &lt;a href="https://orgmode.org/manual/Capture.html"&gt;Org capture&lt;/a&gt;. &lt;a href="https://orgmode.org/worg/org-contrib/org-protocol.html"&gt;Some setup is required&lt;/a&gt; before using it, but the effort is rewarded in saved time for a future you.&lt;/p&gt;
&lt;p&gt;Shown below is a capture template with key name “code”.&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;/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="s"&gt;&amp;quot;code&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Source Code (Org Protocol)&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;entry&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;~/org/notes.org&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&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;string-join&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;* Source: %:description&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;:PROPERTIES:&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;:CREATED: %U&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;:END:&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;%:link&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;#+BEGIN_SRC &amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;cc-org-capture--code-choices&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;elisp&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;%i&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;#+END_SRC&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;%?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;:empty-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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The Elisp function &lt;code&gt;cc-org-capture--code-choices&lt;/code&gt; will generate capture expansion markup to choose a language with mini-buffer completion. It is configured here to use “elisp” as the default language. The set of languages to choose from via completion is defined in &lt;code&gt;cc-org-capture--src-languages&lt;/code&gt;. Both their definitions are shown below:&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;/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="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc-org-capture--code-choices&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Create selection of programming language choices with default LANG.&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;%^{Language|&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nv"&gt;lang&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;|&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;string-join&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc-org-capture--src-languages&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;|&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defvar&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc-org-capture--src-languages&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;F90&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;R&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;awk&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;clojure&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;cpp&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;css&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ditaa&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;dot&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;elisp&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;eshell&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;forth&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;gnuplot&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;haskell&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;java&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;js&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;julia&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;kotlin&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;latex&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;lisp&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;lua&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;makefile&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;matlab&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;max&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ocaml&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;octave&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;org&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;perl&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;plantuml&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;processing&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;python&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ruby&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;sass&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;scheme&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;sed&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;shell&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;sql&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;sqlite&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;swift&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;swiftui&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;tcl&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;List of supported Org capture languages.&amp;quot;&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;To exercise the capture template named “code” from your JavaScript enabled web-browser, create a bookmark with the following JavaScript code as its location. When you find code you want to capture, select the code and run this bookmark.&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;/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="nx"&gt;javascript&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;org-protocol://capture?&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="ow"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;code&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getSelection&lt;/span&gt;&lt;span class="p"&gt;()});&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="ow"&gt;void&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0&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;Aside: if you use Emacs for macOS, you’ll want &lt;a href="http://yummymelon.com/scrim"&gt;Scrim&lt;/a&gt; to get Org protocol to work.&lt;/p&gt;
&lt;h1&gt;Capturing source code by copying&lt;/h1&gt;
&lt;p&gt;Often it is desirable to just copy the source code (putting it in the &lt;code&gt;kill-ring&lt;/code&gt;) and paste (or rather capture) it direct into an Org (or Markdown) file of one’s choosing. The following capture template named “cc” can accomplish 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;/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="s"&gt;&amp;quot;cc&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Code&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;plain&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;here&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc-org-capture--code-select-body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;:empty-lines&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;:immediate-finish&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In the above template, the target &lt;code&gt;(here)&lt;/code&gt; is used to insert the captured source code at the current point. The template type is set to &lt;code&gt;plain&lt;/code&gt; to not give the captured source code any special treatment with respect to Org structure. The &lt;code&gt;:immediate-finish&lt;/code&gt; key is set to non-nil to not create a separate capture window.&lt;/p&gt;
&lt;p&gt;The “cc” template is intended to be invoked with a multiple-key sequence starting with ’c’, so the following entry in &lt;code&gt;org-capture-templates&lt;/code&gt; is expected.&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;/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="s"&gt;&amp;quot;c&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Code&amp;quot;&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;The work of constructing the wrapped source code (in this case, presumed to be in the &lt;code&gt;kill-ring&lt;/code&gt; via system copy) is done in &lt;code&gt;cc-org-capture--code-select-body&lt;/code&gt;. Its source is shown below.&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;span class="normal"&gt;26&lt;/span&gt;
&lt;span class="normal"&gt;27&lt;/span&gt;
&lt;span class="normal"&gt;28&lt;/span&gt;
&lt;span class="normal"&gt;29&lt;/span&gt;
&lt;span class="normal"&gt;30&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="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc-org-capture--code-select-body&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="s"&gt;&amp;quot;Body capture code in &lt;/span&gt;&lt;span class="ss"&gt;`kill-ring&amp;#39;&lt;/span&gt;&lt;span class="s"&gt; head with language prompt.&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;cc-org-capture--code-body-from-kill-ring&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;cc-org-capture--code-choices&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;elisp&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc-org-capture--code-body-from-kill-ring&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Generate capture body for LANG code at head of the &lt;/span&gt;&lt;span class="ss"&gt;`kill-ring&amp;#39;&lt;/span&gt;&lt;span class="s"&gt;.&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;string-join&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;cc-org-capture--src-block-begin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;kill-ring&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;%c&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;cc-org-capture--src-block-end&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc-org-capture--src-block-begin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kp"&gt;&amp;amp;optional&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lang&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Annotate begin of source code block for given LANG and MODE.&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;lang&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lang&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lang&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;elisp&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;mode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;major-mode&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;cond&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;derived-mode-p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;org-mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;#+BEGIN_SRC&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;derived-mode-p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;markdown-mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;```&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lang&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="no"&gt;t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;#+BEGIN_SRC&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc-org-capture--src-block-end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kp"&gt;&amp;amp;optional&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Annotate end of source code block for given MODE.&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;mode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;major-mode&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;cond&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;derived-mode-p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;org-mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;#+END_SRC&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;derived-mode-p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;markdown-mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;```&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;#+END_SRC&amp;quot;&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;The implementation of &lt;code&gt;cc-org-capture--code-select-body&lt;/code&gt; will check the current major mode (&lt;code&gt;major-mode&lt;/code&gt;) and depending if it is Org or Markdown, wrap the copied source code in the &lt;code&gt;kill-ring&lt;/code&gt; (expanded by the term “%c”) accordingly.&lt;/p&gt;
&lt;p&gt;The following code shows how the “cc” template can be added to &lt;code&gt;org-capture-templates&lt;/code&gt;.&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;/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;add-hook&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;org-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;add-to-list&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;org-capture-templates&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;cc&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Code&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="nv"&gt;plain&lt;/span&gt;
&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;here&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc-org-capture--code-select-body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="nb"&gt;:empty-lines&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="nb"&gt;:immediate-finish&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="no"&gt;t&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;If you have &lt;code&gt;C-c c&lt;/code&gt; bound to &lt;code&gt;org-capture&lt;/code&gt; then you should see the “cc” template in the ’c’ sub-menu.&lt;/p&gt;
&lt;h1&gt;Caveats&lt;/h1&gt;
&lt;p&gt;If the source code to be captured contains any text that matches a &lt;a href="https://orgmode.org/manual/Template-expansion.html"&gt;capture template expansion&lt;/a&gt; then it will be processed, likely resulting in unintended behavior. Look out for text that starts with ’%’.&lt;/p&gt;
&lt;h1&gt;Closing Thoughts&lt;/h1&gt;
&lt;p&gt;If you’re still here thanks for your attention! This post required a fair amount of Elisp understanding, but the reward for knowing it is the ability to build very bespoke Org capture workflows. Motivated readers are encouraged to take these examples and run with them. To this end I’ve deliberately left out a capture template example of “hard-coding” a language as an exercise to the reader.&lt;/p&gt;
&lt;p&gt;If you end up making a template that you think others would find useful, please share it!&lt;/p&gt;
&lt;h1&gt;Links&lt;/h1&gt;
&lt;p&gt;If you're on macOS and have Org protocol setup, you might be interested in this post "&lt;a href="http://yummymelon.com/devnull/capturing-an-org-note-via-macos-shortcuts.html"&gt;Capturing an Org note via macOS Shortcuts&lt;/a&gt;".&lt;/p&gt;</content><category term="misc"/><category term="emacs"/><category term="org mode"/><category term="scrim"/></entry><entry><title>Capturing an Org note via macOS Shortcuts</title><link href="http://yummymelon.com/devnull/capturing-an-org-note-via-macos-shortcuts.html" rel="alternate"/><published>2025-07-02T14:30:00-07:00</published><updated>2025-07-02T14:30:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2025-07-02:/devnull/capturing-an-org-note-via-macos-shortcuts.html</id><summary type="html">&lt;p&gt;Fun with macOS Shortcuts and Org protocol capture.&lt;/p&gt;</summary><content type="html">&lt;p&gt;With a new update of &lt;a href="https://github.com/kickingvegas/scrim/releases/tag/scrim_1.1.0.23"&gt;Scrim v1.1.0&lt;/a&gt; on the &lt;a href="https://apps.apple.com/us/app/scrim/id6744040981"&gt;App Store&lt;/a&gt;, it seems an opportune time to show a nice macOS Shortcut integration with it.&lt;/p&gt;
&lt;p&gt;The use case is this: You're on your Mac, working on something else &lt;em&gt;other&lt;/em&gt; than Emacs (it happens!) and you want to make a quick note in an Org file without having to context switch to Emacs.&lt;/p&gt;
&lt;p&gt;You can accomplish this with a &lt;a href="https://support.apple.com/guide/shortcuts-mac/intro-to-shortcuts-apdf22b0444c/mac"&gt;macOS Shortcut&lt;/a&gt;. Shortcuts is an Apple tool that lets you orchestrate different apps to achieve a custom workflow.&lt;/p&gt;
&lt;p&gt;Shown below is the shortcut named “Make Note Entry” to accomplish the above use case. It will:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Prompt the user to enter text.&lt;/li&gt;
&lt;li&gt;Run a Python script on that text and construct an Org protocol capture request with it using the template named "note".&lt;/li&gt;
&lt;li&gt;Issue (open) the Org protocol request.&lt;/li&gt;
&lt;/ol&gt;
&lt;p align="center"&gt;
&lt;img src="http://yummymelon.com/devnull/images/capture-org-note-shortcuts/org-note-shortcut_resize_1280x.png" width="60%"/&gt;
&lt;/p&gt;

&lt;p&gt;If the shortcut is configured so that “Pin in Menu Bar” is turned on, you will see some variant of its entry in the Shortcuts bar icon menu.&lt;/p&gt;
&lt;p align="center"&gt;
&lt;img src="http://yummymelon.com/devnull/images/capture-org-note-shortcuts/org-note-shortcut-menu_resize_320x.png" /&gt;
&lt;/p&gt;

&lt;p&gt;Running the shortcut “Make Note Entry” will prompt you with a dialog where you can enter your note:&lt;/p&gt;
&lt;p align="center"&gt;
&lt;img src="http://yummymelon.com/devnull/images/capture-org-note-shortcuts/org-note-shortcut-window_resize_500x.png" /&gt;
&lt;/p&gt;

&lt;p&gt;Pressing the “Done” button will result in the entry being inserted at the top of the file “~/org/notes.org” as shown below. Note however that Emacs is not raised with this shortcut. The screenshot below is only shown to illustrate that the entry is there.&lt;/p&gt;
&lt;p align="center"&gt;
&lt;img src="http://yummymelon.com/devnull/images/capture-org-note-shortcuts/org-note-shortcut-emacs_resize_1280x.png" width="60%" /&gt;
&lt;/p&gt;

&lt;h1&gt;Installation&lt;/h1&gt;
&lt;p&gt;Want to try this out? Here’s what to do:&lt;/p&gt;
&lt;h2&gt;1. Understand Org protocol&lt;/h2&gt;
&lt;p&gt;If you don’t already then read up about it at &lt;a href="https://orgmode.org/worg/org-contrib/org-protocol.html"&gt;org-protocol.el – Trigger actions in Emacs via a custom URL scheme&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;2. Have Scrim installed and configured&lt;/h2&gt;
&lt;p&gt;Learn more about Scrim at &lt;a href="http://yummymelon.com/scrim"&gt;http://yummymelon.com/scrim&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;3. Add the capture template “note”&lt;/h2&gt;
&lt;p&gt;On the Emacs side, add the following template entry to &lt;code&gt;org-capture-templates&lt;/code&gt;. This template named “note” defines an entry with a heading that has an inactive Org timestamp (“%U”) and the body containing the entered text (“%i”). The destination of this note entry is in the file “~/org/notes.org”&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;/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="s"&gt;&amp;quot;note&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Note (Org Protocol)&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;entry&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;~/org/notes.org&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&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;string-join&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;* %U&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;%i&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;:prepend&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;t&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;:immediate-finish&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;t&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;:empty-lines-after&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Observe that this template uses the keys &lt;code&gt;:immediate-finish&lt;/code&gt; to not make the entry interactive and &lt;code&gt;:prepend&lt;/code&gt; to insert the entry at the top of the file.&lt;/p&gt;
&lt;h2&gt;4. Add the Shortcut “Make Note Entry”&lt;/h2&gt;
&lt;p&gt;Download the shortcut file &lt;a href="http://yummymelon.com/devnull/images/capture-org-note-shortcuts/Make Note Entry.shortcut"&gt;Make Note Entry.shortcut&lt;/a&gt; and double-click on it to install. It should now be in your Shortcuts collection.&lt;/p&gt;
&lt;h2&gt;5. Run “Make Note Entry”&lt;/h2&gt;
&lt;p&gt;On the first run of this shortcut, you will be prompted twice to give it permissions: 1) to run the shortcut and 2) to open Scrim. Inspect that its contents correspond with its screenshot above and grant them.&lt;/p&gt;
&lt;h1&gt;Closing Thoughts&lt;/h1&gt;
&lt;p&gt;Readers are invited to take these ideas and customize them for their own purposes.&lt;/p&gt;</content><category term="misc"/><category term="emacs"/><category term="org mode"/><category term="macos"/></entry><entry><title>Announcing Scrim - An Org Protocol Proxy for Emacs on macOS</title><link href="http://yummymelon.com/devnull/announcing-scrim--an-org-protocol-proxy-for-emacs-on-macos.html" rel="alternate"/><published>2025-04-28T05:00:00-07:00</published><updated>2025-04-28T05:00:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2025-04-28:/devnull/announcing-scrim--an-org-protocol-proxy-for-emacs-on-macos.html</id><summary type="html">&lt;p&gt;Announcing Scrim, an Org Protocol proxy for Emacs on macOS.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="http://yummymelon.com/scrim"&gt;&lt;img src="http://yummymelon.com/devnull/images/announcing-scrim/scrim_resize_128x.png"  /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://orgmode.org/"&gt;Org mode&lt;/a&gt; celebrates its ability to &lt;em&gt;export&lt;/em&gt; to a multitude of formats. However, lesser known is its ability to &lt;em&gt;import&lt;/em&gt; content. One of the ways to import into Org is through a custom URL scheme. This scheme is referred to as &lt;a href="https://orgmode.org/manual/Protocols.html"&gt;Org Protocol&lt;/a&gt; (scheme name: &lt;code&gt;org‑protocol://&lt;/code&gt;). The motivating idea for using a URL scheme was this: &lt;em&gt;any&lt;/em&gt; app outside of Emacs could construct and make an &lt;code&gt;org‑protocol://&lt;/code&gt; URL request without needing any security permissions.&lt;/p&gt;
&lt;p&gt;Regrettably, the original implementation of Org Protocol presumed that &lt;code&gt;emacsclient&lt;/code&gt; would do the work of making the actual URL request to Emacs. This thinking did not consider the notion that &lt;a href="https://en.wikipedia.org/wiki/Sandbox_(computer_security)"&gt;app sandboxing&lt;/a&gt; would become widespread practice, preventing other programs from calling &lt;code&gt;emacsclient&lt;/code&gt;. So it is with recent releases of macOS: its default policy is to only allow an app to access programs within its prescribed sandbox.&lt;/p&gt;
&lt;p&gt;That said, I ❤️ Org Protocol, so much so that I provided support for it in a utility called &lt;a href="http://yummymelon.com/captee"&gt;Captee&lt;/a&gt; that lets you share links and text clippings from the macOS Share Menu. I wanted Org Protocol to work on macOS, but for years it was broken due to its dependence on &lt;code&gt;emacsclient&lt;/code&gt;. The only workaround was to use the &lt;a href="https://bitbucket.org/mituharu/emacs-mac/src/master/"&gt;Mitsuharu Yamamoto fork of Emacs&lt;/a&gt; which implemented native support for &lt;code&gt;org-protocol://&lt;/code&gt; URL requests. For a number of years, the Yamamoto fork was my daily driver. Unfortunately though, it seems to have succumbed to bit-rot as it has not kept track with recent releases of GNU Emacs (in particular 30.1). I made the switch over to GNU Emacs 30.1, but in doing so I had to give up Org Protocol support.&lt;/p&gt;
&lt;p&gt;I missed Org Protocol, so I decided to do something about it. I wrote an app.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scrim&lt;/strong&gt; is a macOS utility to act as a proxy to take an Org Protocol request from any app and relay that to Emacs. In effect, &lt;strong&gt;Scrim&lt;/strong&gt; is a native macOS client for Emacs server.&lt;/p&gt;
&lt;p&gt;Learn more about &lt;a href="http://yummymelon.com/scrim"&gt;Scrim at its website&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scrim&lt;/strong&gt; is &lt;a href="https://apps.apple.com/us/app/scrim/id6744040981"&gt;now available for purchase on the Mac App Store&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As &lt;strong&gt;Scrim&lt;/strong&gt; and &lt;strong&gt;Captee&lt;/strong&gt; compliment each other so well, you can get them both at a &lt;a href="https://itunes.apple.com/us/app-bundle/id1810494622?mt=12"&gt;discounted price&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;Links&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://yummymelon.com/scrim"&gt;Scrim Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://yummymelon.com/captee"&gt;Captee Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://itunes.apple.com/us/app-bundle/id1810494622?mt=12"&gt;Scrim + Captee App Bundle&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="emacs"/><category term="org mode"/><category term="scrim"/><category term="captee"/></entry><entry><title>Making an App, Looking for Beta Testers</title><link href="http://yummymelon.com/devnull/making-an-app-looking-for-beta-testers.html" rel="alternate"/><published>2025-04-14T14:50:00-07:00</published><updated>2025-04-14T14:50:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2025-04-14:/devnull/making-an-app-looking-for-beta-testers.html</id><summary type="html">&lt;p&gt;Scrim is a macOS utility I've written to act as a proxy for Org Protocol requests. It is in BETA test and I’m looking for testers.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img src='http://yummymelon.com/devnull/images/looking-for-scrim-beta-testers/scrim-original_resize_64x.png' /&gt;&lt;/p&gt;
&lt;p&gt;Nearly two years back I wrote a utility called &lt;a href="http://yummymelon.com/captee/"&gt;Captee&lt;/a&gt; that uses the native macOS Share Menu ( &lt;img src='http://yummymelon.com/devnull/images/looking-for-scrim-beta-testers/share-icon_resize_x64.png' width='14pt' style='margin-bottom: -3pt;' /&gt; ) to share a link or text clipping in either Markdown or &lt;a href="https://orgmode.org/"&gt;Org&lt;/a&gt; format. The idea was that any macOS app that supported the Share Menu could take advantage of this. Among the features that Captee supported was the ability to share content via &lt;a href="https://orgmode.org/manual/Protocols.html"&gt;Org Protocol&lt;/a&gt;, a custom URL scheme devised to import content into Emacs.&lt;/p&gt;
&lt;p&gt;However, for Org Protocol to work, it required that there be a way to transport the &lt;code&gt;org-protocol://&lt;/code&gt; URL request to Emacs on macOS. Org Protocol’s original implementation presumed that &lt;code&gt;emacsclient&lt;/code&gt; would do the lifting here, where the sharing app would be able to call &lt;code&gt;emacsclient&lt;/code&gt; with the &lt;code&gt;org-protocol//&lt;/code&gt; request as its argument. This was however a regrettable design decision made over a decade ago as recent versions of macOS now have a default sandbox policy that prevents an app from calling an executable like &lt;code&gt;emacsclient&lt;/code&gt; outside of its sandbox.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://bitbucket.org/mituharu/emacs-mac/src/master/"&gt;Mitsuharu Yamamoto fork of Emacs&lt;/a&gt; got around this restriction by supporting the Org Protocol custom URL scheme natively, where it would directly accept the URL request, bypassing &lt;code&gt;emacsclient&lt;/code&gt;. Unfortunately for users of GNU FSF-published Emacs, Org Protocol was viable only if &lt;code&gt;emacsclient&lt;/code&gt; was enabled, typically by relaxing macOS security permissions.&lt;/p&gt;
&lt;p&gt;To address the above for GNU FSF-published Emacs, I set out to build a proxy utility that would accept the &lt;code&gt;org-protocol://&lt;/code&gt; URL request and transport it to Emacs in a way that conforms to macOS security policies. In effect, I made a macOS client app for Emacs server.&lt;/p&gt;
&lt;p&gt;This app is named &lt;strong&gt;Scrim&lt;/strong&gt; and is now in BETA test. I’m looking for testers, especially for those of you who already have Captee. If you’re interested and &lt;em&gt;willing&lt;/em&gt; to provide feedback, &lt;a href="https://testflight.apple.com/join/Ssm1P3Su"&gt;please add yourself to the Beta test group on TestFlight&lt;/a&gt;, an Apple tool for distributing code-signed apps. At current I’m most interested in the following feedback:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sanity check - Does the app work as advertised?&lt;/li&gt;
&lt;li&gt;Were the instructions to setup Emacs server easy to follow? If not, then what was missing?&lt;/li&gt;
&lt;li&gt;Are you a user of Captee?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you do sign yourself up for this, please provide answers to the above via the mail feedback in the &lt;strong&gt;Scrim&lt;/strong&gt; app.&lt;/p&gt;
&lt;p&gt;Thanks!&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;
&lt;a href='https://testflight.apple.com/join/Ssm1P3Su'&gt;&lt;b&gt;YES, I WANT TO BETA TEST SCRIM&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;</content><category term="misc"/><category term="emacs"/><category term="org mode"/><category term="scrim"/><category term="captee"/></entry><entry><title>Converting a Markdown Region to Org Revisited</title><link href="http://yummymelon.com/devnull/converting-a-markdown-region-to-org-revisited.html" rel="alternate"/><published>2025-01-10T13:00:00-08:00</published><updated>2025-01-10T13:00:00-08:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2025-01-10:/devnull/converting-a-markdown-region-to-org-revisited.html</id><summary type="html">&lt;p&gt;If you find yourself needing to convert Markdown text to Org, this post might be of interest.&lt;/p&gt;</summary><content type="html">&lt;p&gt;On more than one occasion I’ve found myself needing to convert Markdown formatted text to Org using this workflow:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Copy Markdown formatted text (usually from a web browser) into the kill ring.&lt;/li&gt;
&lt;li&gt;Paste above text into an Org buffer.&lt;/li&gt;
&lt;li&gt;Manually reformat said text to Org.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Folks who have &lt;code&gt;pandoc&lt;/code&gt; installed can automate step 3 above with the Elisp function quoted below from the Stack Exchange post “&lt;a href="https://emacs.stackexchange.com/questions/60723/convert-region-subtree-from-markdown-to-org"&gt;Convert region/subtree from Markdown to org&lt;/a&gt;”.&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;/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="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;my-md-to-org-region&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Convert region from markdown to org&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;interactive&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;r&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;shell-command-on-region&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;pandoc -f markdown -t org&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;t&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;So just copy the above function into your config and call it a day, no?&lt;/p&gt;
&lt;p&gt;Not quite. If left unspecified, &lt;code&gt;pandoc&lt;/code&gt; will automatically wrap long lines 😞. I prefer keeping a paragraph as a single long line in Org.&lt;/p&gt;
&lt;p&gt;To keep a paragraph as a long line, use the &lt;code&gt;pandoc&lt;/code&gt; argument &lt;code&gt;--wrap=preserve&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Listed below is an amended version of the above routine.&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;/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="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/markdown-to-org-region&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Convert Markdown formatted text in region (START, END) to Org.&lt;/span&gt;

&lt;span class="s"&gt;This command requires that pandoc (man page `pandoc(1)&amp;#39;) be&lt;/span&gt;
&lt;span class="s"&gt;installed.&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;interactive&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;r&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;shell-command-on-region&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nv"&gt;start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;end&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;pandoc -f markdown -t org --wrap=preserve&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;t&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;Regardless of your preference, if this is news to you and seems useful, give it a try.&lt;/p&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://emacs.stackexchange.com/questions/60723/convert-region-subtree-from-markdown-to-org"&gt;org mode - Convert region/subtree from Markdown to org - Emacs Stack Exchange&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="emacs"/><category term="org mode"/><category term="markdown"/></entry><entry><title>Styling Text via Keyboard in Org and Markdown</title><link href="http://yummymelon.com/devnull/styling-text-via-keyboard-in-org-and-markdown.html" rel="alternate"/><published>2024-11-13T17:00:00-08:00</published><updated>2024-11-13T17:00:00-08:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2024-11-13:/devnull/styling-text-via-keyboard-in-org-and-markdown.html</id><summary type="html">&lt;p&gt;Revisiting how I style text in Org and Markdown via a keyboard-driven command.&lt;/p&gt;</summary><content type="html">&lt;p&gt;A recent &lt;a href="https://mastodon.social/@ctietze/113470647091364186"&gt;Mastodon post&lt;/a&gt; by Christian Tietze asked for how one could style text in Org with a keyboard. There is an existing command &lt;code&gt;org-emphasize&lt;/code&gt; that can do this but it has a user interface design flaw: It requires the user to know ahead of time the markup character used to style the text. For many, recalling this Org-specific character is a chore. A friendlier command design would let the user specify the style (e.g. bold, italic, code, etc.) to markup the text.&lt;/p&gt;
&lt;p&gt;A while back, I wrote a &lt;a href="http://yummymelon.com/devnull/tuning-emacs-to-write-prose-in-org-and-markdown.html#:~:text=select text and style"&gt;post&lt;/a&gt; describing how to style text in Org and Markdown using mouse-driven menus. Thinking about Tietze’s ask, I realized I had done most of the work towards building a keyboard-driven command to style text. So I set about to followup with making that command. This post details that effort.&lt;/p&gt;
&lt;p&gt;In thinking about keyboard-driven text styling, I wanted to achieve two things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Style text using logical names (e.g. bold, italic, code, …)&lt;/li&gt;
&lt;li&gt;Minimize the work required to select the text to be styled.&lt;ul&gt;
&lt;li&gt;Infer from the point what the text region to be styled should be.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A nice feature of the Markdown styling commands is that they will try to infer from the point (cursor position) what region of text to apply the style to. No such facility that I know of exists in Org. But it’s not all gravy for Markdown. The same Markdown styling commands will only work on what Emacs defines to be a &lt;em&gt;word&lt;/em&gt;. This makes it a hassle to deal with continuous text (that is, no spaces or linebreaks) that embeds dashes (-) or underscores (_). This is because Emacs navigation by word consider the dash and underscore characters to be word separators.&lt;/p&gt;
&lt;p&gt;No worries though as this is Emacs: There’s always a better way.&lt;/p&gt;
&lt;p&gt;In building Casual EditKit, I became familiar with commands that operated on balanced expressions (aka sexp). Using them, I observed that they treated continuous alphanumeric text with dashes and underscores as a single entity. With this knowledge I set out to build the command &lt;code&gt;cc/emphasize-dwim&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Here’s a video of it in action.&lt;/p&gt;
&lt;video controls width="720" poster='http://yummymelon.com/devnull/images/styling-text-in-org/cc-emphasize-dwim-screenshot.png' preload="none"&gt;
&lt;source src='http://yummymelon.com/devnull/images/styling-text-in-org/cc-emphasize-dwim-540.mp4' type="video/mp4" /&gt;
&lt;/video&gt;

&lt;h1&gt;Closing Thoughts&lt;/h1&gt;
&lt;p&gt;NGL, I’ve been pleasantly surprised at how well this has worked out, so much so that it’s motivated me to write this post. Interested readers are encouraged to &lt;a href="https://github.com/kickingvegas/cclisp/blob/632ba9fa1d904ac5a88891cfc1b271b9dc2d02b0/cc-style-text-menu.el#L86"&gt;try this code out&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As far as what keybinding to use for &lt;code&gt;cc/emphasize-dwim&lt;/code&gt;, I’ve landed on using &lt;code&gt;C-/&lt;/code&gt; for now, which by default is bound to &lt;code&gt;undo&lt;/code&gt;. Since my daily driver is macOS, I assign &lt;code&gt;M-z&lt;/code&gt; for that job. As always, it’s left to the reader to choose a keybinding of their preference.&lt;/p&gt;</content><category term="misc"/><category term="emacs"/><category term="org mode"/></entry><entry><title>Referencing Org Table Cells with Text Regions</title><link href="http://yummymelon.com/devnull/referencing-org-table-cells-with-text-regions.html" rel="alternate"/><published>2024-10-08T11:00:00-07:00</published><updated>2024-10-08T11:00:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2024-10-08:/devnull/referencing-org-table-cells-with-text-regions.html</id><summary type="html">&lt;p&gt;Manually dealing with Org table references is not fun. This post proposes a better way using a text region to generate an Org table reference.&lt;/p&gt;</summary><content type="html">&lt;p&gt;In a typical spreadsheet app, a common user interface practice is to avoid forcing the user to keep track of cell references as much as possible. This is usually seen in selecting a range of cells to construct a formula, where the user only needs to control the range of selection; the app keeps track of which cell references to pass into the formula.&lt;/p&gt;
&lt;p&gt;Sadly, this feature is not available by default in Org tables. But no need to fret; Emacs and Org give you the mechanisms to build a reasonable emulation of spreadsheet-style cell range selection. This post shows you how.&lt;/p&gt;
&lt;p&gt;Before going into details, here’s a demo of selecting a row of values and using that selection to compute its sum.&lt;/p&gt;
&lt;video width="720" controls poster='http://yummymelon.com/devnull/images/referencing-org-table-cells/org-table-range-select.png' width='720px' preload="none" style="border-style: groove;" &gt;
 &lt;source src="http://yummymelon.com/devnull/images/referencing-org-table-cells/org-table-reference.mov" type="video/mp4" /&gt;
&lt;/video&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;/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;| a | b | c | Total |
|---+---+---+-------|
| 1 | 5 | 2 |       |
| 3 | 4 | 1 |     8 |
| 8 | 1 | 2 |       |
#+TBLFM: $4=vsum(@3$1..@3$3)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In the example above the following steps are taken:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Place the point in the cell to enter a &lt;a href="https://orgmode.org/manual/Formula-syntax-for-Calc.html"&gt;Calc formula&lt;/a&gt;, in this case &lt;code&gt;vsum()&lt;/code&gt;.&lt;ul&gt;
&lt;li&gt;Note that &lt;code&gt;vsum&lt;/code&gt; here stands for &lt;em&gt;vector sum&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Select a range of cells, typically with a mouse by pointing and dragging.&lt;ul&gt;
&lt;li&gt;The selection can be either be a region or a &lt;a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Rectangles.html"&gt;region-rectangle&lt;/a&gt;.&lt;ul&gt;
&lt;li&gt;Did you know that &lt;code&gt;C-M-mouse-1&lt;/code&gt; lets you mouse select a rectangle? I didn't until recently 🤯.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Raise a context menu pressing the right mouse button over the selected region.&lt;/li&gt;
&lt;li&gt;In the context menu, a menu item showing the selected cell region is displayed (in this case &lt;code&gt;@3$1..@3$3&lt;/code&gt;).&lt;ol&gt;
&lt;li&gt;Select this menu item to copy the cell references into the &lt;code&gt;kill-ring&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Move the point back to the initial cell in step 1 and yank the cell reference as an argument for &lt;code&gt;vsum()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;TAB&lt;/code&gt; or &lt;code&gt;RET&lt;/code&gt; to compute the formula.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Some observations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Throughout this workflow, the user did not need to keep track of cell references.&lt;/li&gt;
&lt;li&gt;The resultant table formula &lt;code&gt;#+TBLFM:&lt;/code&gt; left-hand-side (lhs) is populated with only the column after step 6.&lt;ul&gt;
&lt;li&gt;The user must amend the lhs to be &lt;code&gt;@3$4&lt;/code&gt; to specify that the formula should only apply to that cell.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;AMENDED 2024-10-10:&lt;/em&gt; A workaround for this leveraging &lt;code&gt;org-table-edit-formulas&lt;/code&gt; has been made. Details at end of this post.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The table formula can be modified to use relative references at the cost of requiring the user to truly understand &lt;a href="https://orgmode.org/manual/References.html"&gt;Org table reference  syntax&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Keyboard enthusiasts can use the command &lt;code&gt;cc/copy-org-table-reference-dwim&lt;/code&gt; to convert a text region into an Org table reference.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Intrigued? Okay, let’s do this.&lt;/p&gt;
&lt;h1&gt;Org Table Reference Background&lt;/h1&gt;
&lt;p&gt;First off, let’s understand how Org tables address cells. A table cell is addressed using the following representation:&lt;/p&gt;
&lt;p style="text-align:center"&gt;
&lt;code&gt;@ROW$COLUMN&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;A row is prefixed with &lt;code&gt;@&lt;/code&gt; whereas a column is prefixed with &lt;code&gt;$&lt;/code&gt;. The row specification is placed before the column specification which is opposite of what's seen in conventional spreadsheets and Cartesian coordinates that specify the column first, then the row. Anyways, water under the bridge. With Org tables, it is always row first, column second.&lt;/p&gt;
&lt;p&gt;A reference to an individual cell is called a &lt;em&gt;field reference&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;A reference to a set of cells is called a &lt;em&gt;range reference&lt;/em&gt;. A range reference is constructed from two field references, where &lt;em&gt;a&lt;/em&gt; and &lt;em&gt;c&lt;/em&gt; are row values, &lt;em&gt;b&lt;/em&gt; and &lt;em&gt;d&lt;/em&gt; are column values.&lt;/p&gt;
&lt;p style="text-align:center"&gt;
&lt;code&gt;@&lt;i&gt;a&lt;/i&gt;$&lt;i&gt;b&lt;/i&gt;..@&lt;i&gt;c&lt;/i&gt;$&lt;i&gt;d&lt;/i&gt;&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;Range references are translated into a vector of values that can be fed into Calc vector functions. Typically the two field references in a range reference are either in the same row or column. If not, then the vector of values is constructed using the two field references as a &lt;a href="https://en.wikipedia.org/wiki/Minimum_bounding_box"&gt;bounding box&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Most importantly, a range reference specifies values in a &lt;em&gt;single&lt;/em&gt; vector. The orientation (row or column) of a range reference matters. To clarify, this is best illustrated by example.&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;/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;#+NAME: vector-example
| a | b | c |
|---+---+---|
| 1 | 2 | 3 |
| 4 | 5 | 6 |
| 7 | 8 | 9 |

| Range      | Vector       | Notes                                                  |
|------------+--------------+--------------------------------------------------------|
| @2$1..@2$3 | [1, 2, 3]    | Cell values taken left to right.                       |
| @2$2..@4$2 | [2, 5, 8]    | Cell values &amp;quot;sliced&amp;quot; wrt column specification.         |
| @3$2..@4$3 | [5, 6, 8, 9] | Cell values taken using the extents as a bounding box. |
#+TBLFM: @2$2=remote(vector-example, @2$1..@2$3)
#+TBLFM: @3$2=remote(vector-example, @2$2..@4$2)
#+TBLFM: @4$2=remote(vector-example, @3$2..@4$3)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;h1&gt;Design Requirements&lt;/h1&gt;
&lt;p&gt;With the background out of the way, let’s put down some requirements.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Given an active region within an Org table, translate it to a range reference with the following specifics:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;If the selected region is a single column or row, return a range reference using the mark and point of the region.&lt;/li&gt;
&lt;li&gt;If the selected region crosses has multiple rows and columns, then treat the mark and point of the region as the bounding box specification for a matrix represented as a Calc vector of vectors.&lt;/li&gt;
&lt;li&gt;If the selected region is a in a single cell, only return the field reference for that cell.&lt;/li&gt;
&lt;li&gt;The bounding box calculation is the same regardless if the mark is before or after the point.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support both a mouse menu and mini-buffer command interface for obtaining an Org table region reference from a selected text region.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As a table is a convenient representation of a matrix, the above requirements makes the design decision to reflect that in mapping a text region having multiple rows and columns to a vector of vectors instead of a single vector.&lt;/p&gt;
&lt;h1&gt;Show Code&lt;/h1&gt;
&lt;p&gt;Here’s code that meets the requirements described above. Commands of note:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;cc/copy-org-table-reference-dwim&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cc/mouse-copy-org-table-reference-dwim&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Given a point or region (text or rectangle) in an Org table, either of the two commands will create an Org table reference and push it in the &lt;code&gt;kill-ring&lt;/code&gt;. The first command is intended to be called from the keyboard, the second from a mouse menu.&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;span class="normal"&gt; 26&lt;/span&gt;
&lt;span class="normal"&gt; 27&lt;/span&gt;
&lt;span class="normal"&gt; 28&lt;/span&gt;
&lt;span class="normal"&gt; 29&lt;/span&gt;
&lt;span class="normal"&gt; 30&lt;/span&gt;
&lt;span class="normal"&gt; 31&lt;/span&gt;
&lt;span class="normal"&gt; 32&lt;/span&gt;
&lt;span class="normal"&gt; 33&lt;/span&gt;
&lt;span class="normal"&gt; 34&lt;/span&gt;
&lt;span class="normal"&gt; 35&lt;/span&gt;
&lt;span class="normal"&gt; 36&lt;/span&gt;
&lt;span class="normal"&gt; 37&lt;/span&gt;
&lt;span class="normal"&gt; 38&lt;/span&gt;
&lt;span class="normal"&gt; 39&lt;/span&gt;
&lt;span class="normal"&gt; 40&lt;/span&gt;
&lt;span class="normal"&gt; 41&lt;/span&gt;
&lt;span class="normal"&gt; 42&lt;/span&gt;
&lt;span class="normal"&gt; 43&lt;/span&gt;
&lt;span class="normal"&gt; 44&lt;/span&gt;
&lt;span class="normal"&gt; 45&lt;/span&gt;
&lt;span class="normal"&gt; 46&lt;/span&gt;
&lt;span class="normal"&gt; 47&lt;/span&gt;
&lt;span class="normal"&gt; 48&lt;/span&gt;
&lt;span class="normal"&gt; 49&lt;/span&gt;
&lt;span class="normal"&gt; 50&lt;/span&gt;
&lt;span class="normal"&gt; 51&lt;/span&gt;
&lt;span class="normal"&gt; 52&lt;/span&gt;
&lt;span class="normal"&gt; 53&lt;/span&gt;
&lt;span class="normal"&gt; 54&lt;/span&gt;
&lt;span class="normal"&gt; 55&lt;/span&gt;
&lt;span class="normal"&gt; 56&lt;/span&gt;
&lt;span class="normal"&gt; 57&lt;/span&gt;
&lt;span class="normal"&gt; 58&lt;/span&gt;
&lt;span class="normal"&gt; 59&lt;/span&gt;
&lt;span class="normal"&gt; 60&lt;/span&gt;
&lt;span class="normal"&gt; 61&lt;/span&gt;
&lt;span class="normal"&gt; 62&lt;/span&gt;
&lt;span class="normal"&gt; 63&lt;/span&gt;
&lt;span class="normal"&gt; 64&lt;/span&gt;
&lt;span class="normal"&gt; 65&lt;/span&gt;
&lt;span class="normal"&gt; 66&lt;/span&gt;
&lt;span class="normal"&gt; 67&lt;/span&gt;
&lt;span class="normal"&gt; 68&lt;/span&gt;
&lt;span class="normal"&gt; 69&lt;/span&gt;
&lt;span class="normal"&gt; 70&lt;/span&gt;
&lt;span class="normal"&gt; 71&lt;/span&gt;
&lt;span class="normal"&gt; 72&lt;/span&gt;
&lt;span class="normal"&gt; 73&lt;/span&gt;
&lt;span class="normal"&gt; 74&lt;/span&gt;
&lt;span class="normal"&gt; 75&lt;/span&gt;
&lt;span class="normal"&gt; 76&lt;/span&gt;
&lt;span class="normal"&gt; 77&lt;/span&gt;
&lt;span class="normal"&gt; 78&lt;/span&gt;
&lt;span class="normal"&gt; 79&lt;/span&gt;
&lt;span class="normal"&gt; 80&lt;/span&gt;
&lt;span class="normal"&gt; 81&lt;/span&gt;
&lt;span class="normal"&gt; 82&lt;/span&gt;
&lt;span class="normal"&gt; 83&lt;/span&gt;
&lt;span class="normal"&gt; 84&lt;/span&gt;
&lt;span class="normal"&gt; 85&lt;/span&gt;
&lt;span class="normal"&gt; 86&lt;/span&gt;
&lt;span class="normal"&gt; 87&lt;/span&gt;
&lt;span class="normal"&gt; 88&lt;/span&gt;
&lt;span class="normal"&gt; 89&lt;/span&gt;
&lt;span class="normal"&gt; 90&lt;/span&gt;
&lt;span class="normal"&gt; 91&lt;/span&gt;
&lt;span class="normal"&gt; 92&lt;/span&gt;
&lt;span class="normal"&gt; 93&lt;/span&gt;
&lt;span class="normal"&gt; 94&lt;/span&gt;
&lt;span class="normal"&gt; 95&lt;/span&gt;
&lt;span class="normal"&gt; 96&lt;/span&gt;
&lt;span class="normal"&gt; 97&lt;/span&gt;
&lt;span class="normal"&gt; 98&lt;/span&gt;
&lt;span class="normal"&gt; 99&lt;/span&gt;
&lt;span class="normal"&gt;100&lt;/span&gt;
&lt;span class="normal"&gt;101&lt;/span&gt;
&lt;span class="normal"&gt;102&lt;/span&gt;
&lt;span class="normal"&gt;103&lt;/span&gt;
&lt;span class="normal"&gt;104&lt;/span&gt;
&lt;span class="normal"&gt;105&lt;/span&gt;
&lt;span class="normal"&gt;106&lt;/span&gt;
&lt;span class="normal"&gt;107&lt;/span&gt;
&lt;span class="normal"&gt;108&lt;/span&gt;
&lt;span class="normal"&gt;109&lt;/span&gt;
&lt;span class="normal"&gt;110&lt;/span&gt;
&lt;span class="normal"&gt;111&lt;/span&gt;
&lt;span class="normal"&gt;112&lt;/span&gt;
&lt;span class="normal"&gt;113&lt;/span&gt;
&lt;span class="normal"&gt;114&lt;/span&gt;
&lt;span class="normal"&gt;115&lt;/span&gt;
&lt;span class="normal"&gt;116&lt;/span&gt;
&lt;span class="normal"&gt;117&lt;/span&gt;
&lt;span class="normal"&gt;118&lt;/span&gt;
&lt;span class="normal"&gt;119&lt;/span&gt;
&lt;span class="normal"&gt;120&lt;/span&gt;
&lt;span class="normal"&gt;121&lt;/span&gt;
&lt;span class="normal"&gt;122&lt;/span&gt;
&lt;span class="normal"&gt;123&lt;/span&gt;
&lt;span class="normal"&gt;124&lt;/span&gt;
&lt;span class="normal"&gt;125&lt;/span&gt;
&lt;span class="normal"&gt;126&lt;/span&gt;
&lt;span class="normal"&gt;127&lt;/span&gt;
&lt;span class="normal"&gt;128&lt;/span&gt;
&lt;span class="normal"&gt;129&lt;/span&gt;
&lt;span class="normal"&gt;130&lt;/span&gt;
&lt;span class="normal"&gt;131&lt;/span&gt;
&lt;span class="normal"&gt;132&lt;/span&gt;
&lt;span class="normal"&gt;133&lt;/span&gt;
&lt;span class="normal"&gt;134&lt;/span&gt;
&lt;span class="normal"&gt;135&lt;/span&gt;
&lt;span class="normal"&gt;136&lt;/span&gt;
&lt;span class="normal"&gt;137&lt;/span&gt;
&lt;span class="normal"&gt;138&lt;/span&gt;
&lt;span class="normal"&gt;139&lt;/span&gt;
&lt;span class="normal"&gt;140&lt;/span&gt;
&lt;span class="normal"&gt;141&lt;/span&gt;
&lt;span class="normal"&gt;142&lt;/span&gt;
&lt;span class="normal"&gt;143&lt;/span&gt;
&lt;span class="normal"&gt;144&lt;/span&gt;
&lt;span class="normal"&gt;145&lt;/span&gt;
&lt;span class="normal"&gt;146&lt;/span&gt;
&lt;span class="normal"&gt;147&lt;/span&gt;
&lt;span class="normal"&gt;148&lt;/span&gt;
&lt;span class="normal"&gt;149&lt;/span&gt;
&lt;span class="normal"&gt;150&lt;/span&gt;
&lt;span class="normal"&gt;151&lt;/span&gt;
&lt;span class="normal"&gt;152&lt;/span&gt;
&lt;span class="normal"&gt;153&lt;/span&gt;
&lt;span class="normal"&gt;154&lt;/span&gt;
&lt;span class="normal"&gt;155&lt;/span&gt;
&lt;span class="normal"&gt;156&lt;/span&gt;
&lt;span class="normal"&gt;157&lt;/span&gt;
&lt;span class="normal"&gt;158&lt;/span&gt;
&lt;span class="normal"&gt;159&lt;/span&gt;
&lt;span class="normal"&gt;160&lt;/span&gt;
&lt;span class="normal"&gt;161&lt;/span&gt;
&lt;span class="normal"&gt;162&lt;/span&gt;
&lt;span class="normal"&gt;163&lt;/span&gt;
&lt;span class="normal"&gt;164&lt;/span&gt;
&lt;span class="normal"&gt;165&lt;/span&gt;
&lt;span class="normal"&gt;166&lt;/span&gt;
&lt;span class="normal"&gt;167&lt;/span&gt;
&lt;span class="normal"&gt;168&lt;/span&gt;
&lt;span class="normal"&gt;169&lt;/span&gt;
&lt;span class="normal"&gt;170&lt;/span&gt;
&lt;span class="normal"&gt;171&lt;/span&gt;
&lt;span class="normal"&gt;172&lt;/span&gt;
&lt;span class="normal"&gt;173&lt;/span&gt;
&lt;span class="normal"&gt;174&lt;/span&gt;
&lt;span class="normal"&gt;175&lt;/span&gt;
&lt;span class="normal"&gt;176&lt;/span&gt;
&lt;span class="normal"&gt;177&lt;/span&gt;
&lt;span class="normal"&gt;178&lt;/span&gt;
&lt;span class="normal"&gt;179&lt;/span&gt;
&lt;span class="normal"&gt;180&lt;/span&gt;
&lt;span class="normal"&gt;181&lt;/span&gt;
&lt;span class="normal"&gt;182&lt;/span&gt;
&lt;span class="normal"&gt;183&lt;/span&gt;
&lt;span class="normal"&gt;184&lt;/span&gt;
&lt;span class="normal"&gt;185&lt;/span&gt;
&lt;span class="normal"&gt;186&lt;/span&gt;
&lt;span class="normal"&gt;187&lt;/span&gt;
&lt;span class="normal"&gt;188&lt;/span&gt;
&lt;span class="normal"&gt;189&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;;; Org Table Cell Reference Functions&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/org-table-cell-at-point&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="s"&gt;&amp;quot;At point, return the cell object from an Org table.&lt;/span&gt;

&lt;span class="s"&gt;A cell object is defined to be a list containing the row and the&lt;/span&gt;
&lt;span class="s"&gt;column, successively.&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;org-at-table-p&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="ne"&gt;error&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Not in a table&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;row&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;org-table-current-dline&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;col&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;org-table-current-column&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;row&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;col&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/format-org-table-field-reference&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Format CELL object into @r$c format.&lt;/span&gt;

&lt;span class="s"&gt;CELL object obtained via &lt;/span&gt;&lt;span class="ss"&gt;`cc/org-table-cell-at-point&amp;#39;&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;

&lt;span class="s"&gt;See Info node `(org) References&amp;#39; for more on Org table field&lt;/span&gt;
&lt;span class="s"&gt;reference format.&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;row&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;nth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cell&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;col&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;nth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;@%d$%d&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;row&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;col&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/org-table-range&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="s"&gt;&amp;quot;Return range object from a region defined within an Org table.&lt;/span&gt;

&lt;span class="s"&gt;A range object is a list of two cells computed via&lt;/span&gt;
&lt;span class="ss"&gt;`cc/org-table-cell-at-point&amp;#39;&lt;/span&gt;&lt;span class="s"&gt;, the first being the cell at the&lt;/span&gt;
&lt;span class="s"&gt;start of the region and the last being the cell at the end of the&lt;/span&gt;
&lt;span class="s"&gt;region.&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;org-at-table-p&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;use-region-p&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="ne"&gt;error&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Not in an Org table&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;save-excursion&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;cc/org-table-cell-at-point&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;exchange-point-and-mark&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;cc/org-table-cell-at-point&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defvar&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/last-org-table-reference&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Last stored Org table reference.&lt;/span&gt;

&lt;span class="s"&gt;State variable to store an Org table reference (field or range)&lt;/span&gt;
&lt;span class="s"&gt;to be used in an Org table formula. This variable is set via&lt;/span&gt;
&lt;span class="ss"&gt;`cc/org-table-reference-dwim&amp;#39;&lt;/span&gt;

&lt;span class="s"&gt;NOTE: This state variable to work-around my lack of clarity on&lt;/span&gt;
&lt;span class="s"&gt;region and mouse menu interaction.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/org-table-reference-dwim&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="s"&gt;&amp;quot;Org table reference given point or region is defined.&lt;/span&gt;

&lt;span class="s"&gt;Return Org table reference (field or range) depending on whether&lt;/span&gt;
&lt;span class="s"&gt;a point or region is defined in an Org table.&lt;/span&gt;

&lt;span class="s"&gt;If the region is defined over multiple columns, then a Calc&lt;/span&gt;
&lt;span class="s"&gt;vector matrix is returned. See Info node `(org) Formula syntax&lt;/span&gt;
&lt;span class="s"&gt;for Calc&amp;#39; for more.&lt;/span&gt;

&lt;span class="s"&gt;Calling this function will set &lt;/span&gt;&lt;span class="ss"&gt;`cc/last-org-table-reference&amp;#39;&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;

&lt;span class="s"&gt;See Info node `(org) References&amp;#39; for more on Org table field&lt;/span&gt;
&lt;span class="s"&gt;reference format.&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;org-at-table-p&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="ne"&gt;error&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Not in an Org table&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;cond&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;use-region-p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;range&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;cc/org-table-range&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;start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;nth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;range&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;end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;nth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;range&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;msg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;%s..%s&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;cc/format-org-table-field-reference&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;start&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;cc/format-org-table-field-reference&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;end&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;setq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/last-org-table-reference&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;cc/org-table-range-to-reference&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;range&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nv"&gt;msg&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="no"&gt;t&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;msg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;cc/format-org-table-field-reference&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;cc/org-table-cell-at-point&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;setq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/last-org-table-reference&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nv"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/copy-org-table-reference-dwim&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="s"&gt;&amp;quot;Copy Org table reference (field or range) into kill ring.&lt;/span&gt;

&lt;span class="s"&gt;Given a point or region defined in an Org table, add to the&lt;/span&gt;
&lt;span class="ss"&gt;`kill-ring&amp;#39;&lt;/span&gt;&lt;span class="s"&gt; an Org table field or range reference.&lt;/span&gt;

&lt;span class="s"&gt;If the region is defined over multiple columns, then a Calc&lt;/span&gt;
&lt;span class="s"&gt;vector matrix is returned. See Info node `(org) Formula syntax&lt;/span&gt;
&lt;span class="s"&gt;for Calc&amp;#39; for more.&lt;/span&gt;

&lt;span class="s"&gt;If the buffer *Edit Formulas* is available (usually via&lt;/span&gt;
&lt;span class="ss"&gt;`org-table-edit-formulas&amp;#39;&lt;/span&gt;&lt;span class="s"&gt;), the reference will be inserted into&lt;/span&gt;
&lt;span class="s"&gt;it.&lt;/span&gt;

&lt;span class="s"&gt;See Info node `(org) References&amp;#39; for more on Org table field&lt;/span&gt;
&lt;span class="s"&gt;reference format.&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;org-at-table-p&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="ne"&gt;error&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Not in an Org table&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;msg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;cc/org-table-reference-dwim&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;formulas-buffer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;get-buffer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;*Edit Formulas*&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;formulas-buffer&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;with-current-buffer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;formulas-buffer&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/last-org-table-reference&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Range: %s, Copied %s&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;msg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/last-org-table-reference&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;kill-new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/last-org-table-reference&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/mouse-copy-org-table-reference-dwim&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="s"&gt;&amp;quot;Copy Org table reference (field or range) into kill ring via mouse.&lt;/span&gt;

&lt;span class="s"&gt;Given a point or region defined in an Org table, add to the&lt;/span&gt;
&lt;span class="ss"&gt;`kill-ring&amp;#39;&lt;/span&gt;&lt;span class="s"&gt; an Org table field or range reference.&lt;/span&gt;

&lt;span class="s"&gt;NOTE: This function is intended to be called from a mouse menu&lt;/span&gt;
&lt;span class="s"&gt;after &lt;/span&gt;&lt;span class="ss"&gt;`cc/copy-org-table-reference-dwim&amp;#39;&lt;/span&gt;&lt;span class="s"&gt; is called which will set&lt;/span&gt;
&lt;span class="ss"&gt;`cc/last-org-table-reference&amp;#39;&lt;/span&gt;&lt;span class="s"&gt;. This is to work-around my lack of&lt;/span&gt;
&lt;span class="s"&gt;clarity on region and mouse menu interaction.&lt;/span&gt;

&lt;span class="s"&gt;If the region is defined over multiple columns, then a Calc&lt;/span&gt;
&lt;span class="s"&gt;vector matrix is returned. See Info node `(org) Formula syntax&lt;/span&gt;
&lt;span class="s"&gt;for Calc&amp;#39; for more.&lt;/span&gt;

&lt;span class="s"&gt;If the buffer *Edit Formulas* is available (usually via&lt;/span&gt;
&lt;span class="ss"&gt;`org-table-edit-formulas&amp;#39;&lt;/span&gt;&lt;span class="s"&gt;), the reference will be inserted into&lt;/span&gt;
&lt;span class="s"&gt;it. If the point in *Edit Formulas* is at the beginning of line,&lt;/span&gt;
&lt;span class="s"&gt;it will treat the reference as a left hand side (lhs) assignment.&lt;/span&gt;

&lt;span class="s"&gt;See Info node `(org) References&amp;#39; for more on Org table field&lt;/span&gt;
&lt;span class="s"&gt;reference format.&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;org-at-table-p&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="ne"&gt;error&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Not in an Org table&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;when&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/last-org-table-reference&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;msg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/last-org-table-reference&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;formulas-buffer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;get-buffer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;*Edit Formulas*&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;formulas-buffer&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;with-current-buffer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;formulas-buffer&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;bolp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;%s = &amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;; treat reference as lhs assignment&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Copied %s&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;msg&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;kill-new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/org-table-range-to-reference&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;range&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Convert RANGE object to Org table reference (field or range).&lt;/span&gt;

&lt;span class="s"&gt;If the region is defined over multiple columns, then a Calc&lt;/span&gt;
&lt;span class="s"&gt;vector matrix is returned. See Info node `(org) Formula syntax&lt;/span&gt;
&lt;span class="s"&gt;for Calc&amp;#39; for more.&lt;/span&gt;

&lt;span class="s"&gt;See &lt;/span&gt;&lt;span class="ss"&gt;`cc/org-table-range&amp;#39;&lt;/span&gt;&lt;span class="s"&gt; for more on RANGE object.&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;nth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;range&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;end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;nth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;range&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;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;nth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;start&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;b&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;nth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;start&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;c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;nth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;end&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;d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;nth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;end&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;r1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;min&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;c&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;c1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;min&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;b&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;d&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;r2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;max&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;c&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;c2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;max&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;b&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;d&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;rowrange&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;number-sequence&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;r1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;r2&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;buflist&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;


&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;cond&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="k"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;r1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;r2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;c1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;c2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;@%d$%d&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;r1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;c1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="k"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;c1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;c2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;r1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;r2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;@%d$%d..@%d$%d&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;r1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;c1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;r2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;c2&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="no"&gt;t&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;mapc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;lambda&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;push&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;@%d$%d..@%d$%d&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;c1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;c2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;buflist&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nv"&gt;rowrange&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;vec(%s)&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;string-join&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;reverse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;buflist&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;, &amp;quot;&lt;/span&gt;&lt;span class="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;&lt;a href="https://github.com/kickingvegas/cclisp/blob/9cdb9a650fcb408f8553eba7659368b9165a1189/cclisp.el#L674"&gt;Original Source&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;AMENDED 2024-10-10:&lt;/em&gt; &lt;code&gt;cc/copy-org-table-reference-dwim&lt;/code&gt; and &lt;code&gt;cc/mouse-copy-org-table-reference-dwim&lt;/code&gt; modified to insert content into table formula buffer when &lt;code&gt;org-table-edit-formulas&lt;/code&gt; is called.&lt;/p&gt;
&lt;p&gt;The following abridged code illustrates how one could configure their context menu to show the current Org table reference and copy it into the &lt;code&gt;kill-ring&lt;/code&gt; if selected. See &lt;a href="http://yummymelon.com/devnull/customizing-the-emacs-context-menu.html"&gt;Customizing the Emacs Context Menu&lt;/a&gt; for more on Emacs context menus.&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;/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="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/context-menu-addon-items&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;menu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;click&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Context menu hook function using MENU and CLICK event.&lt;/span&gt;

&lt;span class="s"&gt;MENU - menu to be configured.&lt;/span&gt;
&lt;span class="s"&gt;CLICK - event&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;save-excursion&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;mouse-set-point&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;click&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;cc/context-menu-org-table-items&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;menu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;org-at-table-p&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;menu&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/context-menu-org-table-items&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;menu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kp"&gt;&amp;amp;optional&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;inapt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Menu items to populate MENU for Org table section if INAPT nil.&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;when&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;inapt&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;easy-menu-add-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;menu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="w"&gt;                        &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Table Cell Info&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                         &lt;/span&gt;&lt;span class="nv"&gt;cc/mouse-copy-org-table-reference-dwim&lt;/span&gt;
&lt;span class="w"&gt;                         &lt;/span&gt;&lt;span class="nb"&gt;:label&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;cc/org-table-reference-dwim&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;                         &lt;/span&gt;&lt;span class="nb"&gt;:help&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Copy Org table reference (field or range) into kill ring via mouse&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;add-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;context-menu-functions&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;cc/context-menu-addon-items&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;&lt;a href="https://github.com/kickingvegas/cclisp/blob/ec00b6b75413ad176ebe0dd6fbe17049a1d4271d/cc-context-menu.el#L41"&gt;Original Source&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;All code running on Emacs 29.4.&lt;/p&gt;
&lt;h1&gt;Examples&lt;/h1&gt;
&lt;p&gt;The following table illustrates the result of selecting the text region between the cell with value &lt;code&gt;2&lt;/code&gt; (&lt;code&gt;@2$2&lt;/code&gt;) and the cell with value &lt;code&gt;12&lt;/code&gt; (&lt;code&gt;@4$4&lt;/code&gt;) and inserting its translated Org table reference into different formulas.&lt;/p&gt;
&lt;p&gt;The first formula in &lt;code&gt;@2$5&lt;/code&gt; is just the matrix representation between &lt;code&gt;2&lt;/code&gt; and &lt;code&gt;12&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The second formula takes the transpose (&lt;code&gt;trn&lt;/code&gt;) of the first formula.&lt;/p&gt;
&lt;p&gt;The third formula uses some matrix arithmetic to get the sum of each row of the matrix in &lt;code&gt;@2$5&lt;/code&gt;.&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;/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;#+NAME: matrix-example
| a |  b |  c |  d | result                               |
|---+----+----+----+--------------------------------------|
| 1 |  2 |  3 |  4 | [[2, 3, 4], [6, 7, 8], [10, 11, 12]] |
| 5 |  6 |  7 |  8 | [[2, 6, 10], [3, 7, 11], [4, 8, 12]] |
| 9 | 10 | 11 | 12 | [9, 21, 33]                          |
#+TBLFM: @2$5=vec(@2$2..@2$4, @3$2..@3$4, @4$2..@4$4)
#+TBLFM: @3$5=trn(vec(@2$2..@2$4, @3$2..@3$4, @4$2..@4$4))
#+TBLFM: @4$5=@2$5 * [1 1 1]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;h1&gt;Closing Thoughts&lt;/h1&gt;
&lt;p&gt;Manually dealing with Org table references is both tedious and error-prone. Automating their generation using text range selection seems like a good way to make this more bearable. If you're comfortable with Elisp, I recommend you give this code a try.&lt;/p&gt;
&lt;p&gt;I’m considering publishing this code as a package on MELPA but I think the utility of it is high enough to merit being in Org itself. For next steps, I look forward to finding out if that is true.&lt;/p&gt;
&lt;h1&gt;Amendment 2024-10-10&lt;/h1&gt;
&lt;p&gt;In sharing this post at the 2024-10-09 Org Meetup, I was made aware by Ihor Radchenko that the point position in the special buffer (named &lt;code&gt;*Edit Formulas*&lt;/code&gt;) created by the &lt;code&gt;org-table-edit-formulas&lt;/code&gt; command (binding &lt;code&gt;C-c '&lt;/code&gt;) will highlight any field or range reference. This special buffer provides context from which we can enhance the commands &lt;code&gt;cc/copy-org-table-reference-dwim&lt;/code&gt; and &lt;code&gt;cc/mouse-copy-org-table-reference-dwim&lt;/code&gt; to insert their results directly into it, removing the step to yank. &lt;code&gt;cc/mouse-copy-org-table-reference-dwim&lt;/code&gt; is further enhanced to check if the point in &lt;code&gt;*Edit Formulas*&lt;/code&gt; is also at the beginning of a line. If so, then the inserted field reference will be treated as the lhs argument of a formula. This approach can be viewed as a workaround the direct entry of a formula in a cell with the "=" character, which will only insert in the lhs a column reference.&lt;/p&gt;</content><category term="misc"/><category term="emacs"/><category term="org mode"/></entry><entry><title>Announcing Casual Agenda</title><link href="http://yummymelon.com/devnull/announcing-casual-agenda.html" rel="alternate"/><published>2024-09-03T11:00:00-07:00</published><updated>2024-09-03T11:00:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2024-09-03:/devnull/announcing-casual-agenda.html</id><summary type="html">&lt;p&gt;Announcing Casual Agenda&lt;/p&gt;</summary><content type="html">&lt;p&gt;Use Org mode long enough and invariably you'll get around to using &lt;a href="https://orgmode.org/manual/Agenda-Views.html"&gt;Agenda views&lt;/a&gt; to manage your defined tasks. Agenda views have become core to my Emacs experience and I'm certain that I'm not alone in saying this. As with other packages, there's a steep learning curve to using Agenda views, largely because Org adopts the Emacs convention of using keybindings and the mini-buffer prompt as its primary user interface with an added twist of frequently making this behavior conditional on where the point is.&lt;/p&gt;
&lt;p&gt;To help ease using Agenda views, I'm happy to announce &lt;a href="https://github.com/kickingvegas/casual-agenda"&gt;Casual Agenda&lt;/a&gt;, a Transient user interface for Org Agenda available on &lt;a href="https://melpa.org/#/casual-agenda"&gt;MELPA&lt;/a&gt; today.&lt;/p&gt;
&lt;p&gt;&lt;img src='http://yummymelon.com/devnull/images/announcing-casual-agenda/casual-agenda-screenshot.png' width='800px' /&gt;&lt;/p&gt;
&lt;p&gt;Casual Agenda organizes the Agenda view commands into the following sections:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Agenda&lt;/strong&gt; - Modify the view duration (day, week, month, year).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filter&lt;/strong&gt; - Filter displayed headlines with different criteria.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Actions&lt;/strong&gt; - Perform an activity on a headline, create/capture a headline, or even generate a different agenda view.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Navigation&lt;/strong&gt; - move the point to where you want it to be.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Utils&lt;/strong&gt; - Set a timer, get almanac info.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that all the menus in Casual Agenda are contextual so as one navigates the Agenda view, the menu items will be enabled as appropriate.&lt;/p&gt;
&lt;h1&gt;Operating on Headlines&lt;/h1&gt;
&lt;p&gt;Use the &lt;em&gt;Operations&lt;/em&gt; menu to alter attributes about it such as TODO state, scheduling, tags, and priority. To use it, move the point to the line of a heading you wish to change and from the main menu select “(o) Operations”. The following menu will be displayed.&lt;/p&gt;
&lt;p&gt;&lt;img src='http://yummymelon.com/devnull/images/announcing-casual-agenda/casual-agenda-operations-screenshot.png' width='800px' /&gt;&lt;/p&gt;
&lt;h1&gt;Marking Headlines&lt;/h1&gt;
&lt;p&gt;User the &lt;em&gt;Mark&lt;/em&gt; menu to mark different headlines and perform a bulk action on them. From the main menu, select “(m) Mark” to display the following menu:&lt;/p&gt;
&lt;p&gt;&lt;img src='http://yummymelon.com/devnull/images/announcing-casual-agenda/casual-agenda-mark-screenshot.png' width='800px' /&gt;&lt;/p&gt;
&lt;h1&gt;Changing Modes and Settings&lt;/h1&gt;
&lt;p&gt;Agenda views have different display modes and behavior that can be modified from the &lt;em&gt;Settings&lt;/em&gt; menu. From the main menu, select “(,) Settings” to display the following menu:&lt;/p&gt;
&lt;p&gt;&lt;img src='http://yummymelon.com/devnull/images/announcing-casual-agenda/casual-agenda-settings-screenshot.png' width='800px' /&gt;&lt;/p&gt;
&lt;h1&gt;Almanac&lt;/h1&gt;
&lt;p&gt;Get sunrise/sunset times, lunar cycle dates, and holidays with respect to a date via the &lt;em&gt;Almanac&lt;/em&gt; menu. From the main menu, select “(l) Almanac” to display the following menu.&lt;/p&gt;
&lt;p&gt;&lt;img src='http://yummymelon.com/devnull/images/announcing-casual-agenda/casual-agenda-almanac-screenshot.png' width='800px' /&gt;&lt;/p&gt;
&lt;h1&gt;Unicode Symbol Support&lt;/h1&gt;
&lt;p&gt;By enabling “(u) Use Unicode Symbols” from the Settings menu, Casual Agenda will use Unicode symbols as appropriate in its menus.&lt;/p&gt;
&lt;p&gt;&lt;img src='http://yummymelon.com/devnull/images/announcing-casual-agenda/casual-agenda-unicode-screenshot.png' width='800px' /&gt;&lt;/p&gt;
&lt;h1&gt;Installation Notes&lt;/h1&gt;
&lt;p&gt;Casual Agenda requires that you have a relatively recent version of Org (≥ 9.7.1) and Transient, both built-in packages to Emacs 29.1+. To update those packages you will need to take into consideration Emacs' default policy of not upgrading built-in packages unless configuring it to explicitly do so. My &lt;a href="http://yummymelon.com/devnull/updating-built-in-emacs-packages.html"&gt;last blog post&lt;/a&gt; provides more detail on this.&lt;/p&gt;
&lt;h1&gt;Closing Thoughts&lt;/h1&gt;
&lt;p&gt;As with the other &lt;a href="https://github.com/kickingvegas/casual-suite"&gt;Casual Suite&lt;/a&gt; packages, Casual Agenda is intended to lower the cognitive load of using Agenda views. Even as I’ve already committed to memory many of these commands, it’s often that I mess up by issuing the wrong binding at the wrong place or just plain failing to recall a command. Since building and using Casual Agenda, this has happened less so. You might perhaps share the same experience.&lt;/p&gt;</content><category term="misc"/><category term="emacs"/><category term="org mode"/><category term="casual"/></entry></feed>