<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>notes from /dev/null - elisp</title><link href="http://yummymelon.com/devnull/" rel="alternate"/><link href="http://yummymelon.com/devnull/feeds/tags/elisp.atom.xml" rel="self"/><id>http://yummymelon.com/devnull/</id><updated>2023-06-20T11:13:00-07:00</updated><entry><title>Using Emacs to make phone calls and lookup map places on macOS</title><link href="http://yummymelon.com/devnull/using-emacs-to-make-phone-calls-and-lookup-map-places-on-macos.html" rel="alternate"/><published>2023-06-20T11:13:00-07:00</published><updated>2023-06-20T11:13:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2023-06-20:/devnull/using-emacs-to-make-phone-calls-and-lookup-map-places-on-macos.html</id><summary type="html">&lt;p&gt;Selecting text to make a phone call or map a location in a native macOS app is common. You can do this with Emacs too.&lt;/p&gt;</summary><content type="html">&lt;p&gt;I admit, I do take a perverse delight in making phone calls from my computer. On macOS, this can be achieved via the &lt;a href="https://support.apple.com/en-us/HT209456"&gt;iPhone Cellular Calls&lt;/a&gt; feature, which
proxies your computer to your iPhone&amp;rsquo;s calling capability. Tied to this feature is the ability to select a phone number in a native macOS app text field and use it to dial that number direct. An example is shown below from the &lt;strong&gt;Safari&lt;/strong&gt; app.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://yummymelon.com/devnull/images/phone-call-macos-example.png" style='border-style: groove;' width='30%' alt='screenshot of selected phone number in Safari with phone call context menu' /&gt;&lt;/p&gt;
&lt;p&gt;To dial a number, the app translates the human-formatted phone number into a &lt;code&gt;tel:&lt;/code&gt; &lt;a href="https://developer.apple.com/library/archive/featuredarticles/iPhoneURLScheme_Reference/PhoneLinks/PhoneLinks.html#/apple_ref/doc/uid/TP40007899-CH6-SW1"&gt;URL scheme&lt;/a&gt; that is then used to open the &lt;strong&gt;FaceTime&lt;/strong&gt; app to make the call.&lt;/p&gt;
&lt;p&gt;We can emulate this behavior in &lt;strong&gt;Emacs&lt;/strong&gt;. This post will show you how.&lt;/p&gt;
&lt;h1&gt;Making a Phone Call&lt;/h1&gt;
&lt;p&gt;First off is parsing the human-formatted phone number. We can do this by writing some regexps. Since I live in North America, I&amp;rsquo;ve chosen to use regexps that conform to the &lt;a href="https://en.wikipedia.org/wiki/North_American_Numbering_Plan"&gt;North American Numbering Plan&lt;/a&gt; (NANP). NANP  formats phone numbers into the form &lt;code&gt;+1 (xxx) xxx-xxxx&lt;/code&gt;. I've also chosen to make regexps that also accepts spaces and &amp;ldquo;.&amp;rdquo; as separators.&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;/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="k"&gt;defvar&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/pat-nanp-international&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;^+1 \&lt;/span&gt;
&lt;span class="s"&gt;[(]*\\([0-9]\\{3\\}\\)[)]*\&lt;/span&gt;
&lt;span class="s"&gt;[\\. -]\\([0-9]\\{3\\}\\)[\\. -]\\([0-9]\\{4\\}\\)$&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Regexp for North American Numbering Plan phone number including +1.&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/pat-nanp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;^[(]*\\([0-9]\\{3\\}\\)[)]*[\\. -]\&lt;/span&gt;
&lt;span class="s"&gt;\\([0-9]\\{3\\}\\)[\\. -]\\([0-9]\\{4\\}\\)$&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Regexp for North American Numbering Plan phone number without +1.&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;In the above I&amp;rsquo;ve defined two separate regexps with capture groups, one to handle numbers starting with &lt;code&gt;+1&lt;/code&gt; and the other for those without it. &lt;/p&gt;
&lt;p&gt;From these regexps we can write the following function to convert a phone number to a &lt;code&gt;tel:&lt;/code&gt; URL.&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;/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/nanp-phone-number-to-url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;phone&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 PHONE number string to url \&amp;quot;tel:\&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="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;string-match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/pat-nanp-international&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;phone&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;replace-regexp-in-string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/pat-nanp-international&lt;/span&gt;
&lt;span class="w"&gt;                              &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;tel:+1-\\1-\\2-\\3&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;phone&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;string-match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/pat-nanp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;phone&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;replace-regexp-in-string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/pat-nanp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;tel:+1-\\1-\\2-\\3&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;phone&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;It is then straightforward to write an interactive function that takes a phone number as a selected region, converts it to a &lt;code&gt;tel:&lt;/code&gt; URL, and opens it.&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="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/call-nanp-phone-number&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;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;Phone call the selected number (region) bounded between START and END&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="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;phone-buf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;buffer-substring&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="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;browse-url&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/nanp-phone-number-to-url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;phone-buf&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;Putting the above code to work, we can show the following example of selecting the phone number &lt;code&gt;+1 (415) 867-5309&lt;/code&gt; and dialing it from &lt;strong&gt;Emacs&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://yummymelon.com/devnull/images/emacs-phone-example.gif" alt="gif movie of making a phone call from Emacs"/&gt;&lt;/p&gt;
&lt;h1&gt;Looking a place up in Apple Maps&lt;/h1&gt;
&lt;p&gt;A similar exercise can be done with searching for a place in the &lt;strong&gt;Maps&lt;/strong&gt; app, which is accessible via the &lt;code&gt;maps:&lt;/code&gt; &lt;a href="https://developer.apple.com/library/archive/featuredarticles/iPhoneURLScheme_Reference/MapLinks/MapLinks.html#/apple_ref/doc/uid/TP40007899-CH5-SW1"&gt;URL scheme&lt;/a&gt;. Unlike a phone number, we will forego trying to interpret the selected region beforehand and just pass the region as the query to the &lt;code&gt;maps:&lt;/code&gt; URL.&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="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/open-region-in-apple-maps&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;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;Open region from START to END in Apple Maps&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="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;query-buf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;buffer-substring&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="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;mapURL&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;maps://?q=&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;url-encode-url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;query-buf&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;Searching for %s&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;query-buf&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;browse-url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mapURL&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 following function lets you interactively enter an arbitrary place to search in Apple Maps.&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;/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/search-apple-maps&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;search&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;Open SEARCH query in Apple Maps&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;MMap Search: &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;mapURL&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;maps://?q=&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;url-encode-url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;search&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;Searching for %s&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;search&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;browse-url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mapURL&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;Putting the above code to work, we can show the following example of finding "Harlan Records, SF" in the &lt;strong&gt;Maps&lt;/strong&gt; app from &lt;strong&gt;Emacs&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://yummymelon.com/devnull/images/emacs-maps-example.gif" alt="gif movie of finding a place in Apple Maps from Emacs"/&gt;&lt;/p&gt;
&lt;p&gt;Modifying the above to work with Google Maps is left as an exercise to reader.&lt;/p&gt;
&lt;h1&gt;Context Menus&lt;/h1&gt;
&lt;p&gt;Note that all of the above examples are keyboard driven. They are not necessarily so. In fact, driving much of the above work was the desire to be able to perform these actions via a &lt;em&gt;context menu&lt;/em&gt;. And it is very much doable, however I'll elaborate on how I've done this in a forthcoming post. For now, here's some demo screenshots of my context menu implementation that supports making a phone call or searching a location. &lt;/p&gt;
&lt;p&gt;&lt;img src="http://yummymelon.com/devnull/images/emacs-context-menu-phone-r.png" alt="Emacs context menu - search maps example"/&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://yummymelon.com/devnull/images/emacs-context-menu-maps-r.png" alt="Emacs context menu - search maps example"/&gt;&lt;/p&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/North_American_Numbering_Plan"&gt;North American Numbering Plan - Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://datatracker.ietf.org/doc/html/rfc3966"&gt;RFC 3966 - The tel URI for Telephone Numbers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/library/archive/featuredarticles/iPhoneURLScheme_Reference/Introduction/Introduction.html#/apple_ref/doc/uid/TP40007899-CH1-SW1"&gt;About Apple URL Schemes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://support.apple.com/en-us/HT209456"&gt;Make and receive phone calls on Mac or iPad - Apple Support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="emacs"/><category term="elisp"/><category term="macos"/></entry><entry><title>Automatically adjusting Emacs to macOS switches in appearance</title><link href="http://yummymelon.com/devnull/automatically-adjusting-emacs-to-macos-switches-in-appearance.html" rel="alternate"/><published>2023-06-04T11:36:00-07:00</published><updated>2023-06-04T11:36:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2023-06-04:/devnull/automatically-adjusting-emacs-to-macos-switches-in-appearance.html</id><summary type="html">&lt;p&gt;How to support macOS appearance changes automatically.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Count me among those who likes using the &lt;em&gt;Auto&lt;/em&gt; setting when adjusting the appearance in macOS to either light or dark. Native macOS apps that are coded accordingly can automatically adjust as well, and it turns out that the Yamamoto Mitsuharu fork of &lt;a href="https://bitbucket.org/mituharu/emacs-mac/src/master/"&gt;Emacs&lt;/a&gt; (aka emacs-mac-app) can do this too. But with emacs-mac-app, just because it can detect the appearance change doesn&amp;rsquo;t mean that all the themes or faces will adjust accordingly too. As such it is typically up to the user to write a pair of custom light and dark mode functions to invoke when the appearance change happens.&lt;/p&gt;
&lt;p&gt;For quite some time I&amp;rsquo;ve been calling these appearance mode functions manually &lt;em&gt;like an animal&lt;/em&gt;. Then I recently learned that &lt;code&gt;mac-effective-appearance-change-hook&lt;/code&gt; is a thing.&lt;/p&gt;
&lt;p&gt;This hook gets invoked upon a macOS appearance change, so it becomes straightforward to write a hook function that tests for the &lt;code&gt;:appearance&lt;/code&gt; property returned by&lt;br/&gt; &lt;code&gt;(mac-application-state)&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;/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/reconfigure-nsappearance&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;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;appearance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;plist-get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;mac-application-state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;:appearance&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="nf"&gt;string-equal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appearance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;NSAppearanceNameDarkAqua&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/dark-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="nv"&gt;cc/light-mode&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;mac-effective-appearance-change-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;cc/reconfigure-nsappearance&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;A caveat though: the above code will &lt;em&gt;only&lt;/em&gt; work with the Yamamoto fork of Emacs for macOS.  As of now there seems to be no consensus on how to handle OS-level appearance changes by Emacs core. That said, if the above works for you, then no more manual appearance change calls!&lt;/p&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kickingvegas/cclisp/blob/5ace8e5e5759bba01dffad6da899374f3214eac7/cc-appearance.el#L76"&gt;Elisp code for cc/reconfigure-nsappearance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Where to get emacs-mac-app:&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ports.macports.org/port/emacs-mac-app/"&gt;MacPorts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/railwaycat/homebrew-emacsmacport"&gt;Homebrew&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="emacs"/><category term="dev"/><category term="elisp"/><category term="software"/><category term="macos"/></entry><entry><title>Beautifying Org Plot with YASnippet and Context Menus</title><link href="http://yummymelon.com/devnull/beautifying-org-plot-with-yasnippet-and-context-menus.html" rel="alternate"/><published>2023-01-27T20:15:00-08:00</published><updated>2023-01-27T20:15:00-08:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2023-01-27:/devnull/beautifying-org-plot-with-yasnippet-and-context-menus.html</id><summary type="html">&lt;p&gt;Org Plot in Emacs can be made beautiful and easy to use using YASnippet and Context Menu mode. This post shows you how.&lt;/p&gt;</summary><content type="html">&lt;p&gt;In using &lt;a href="https://orgmode.org" title="Org Mode"&gt;Org&lt;/a&gt; tables, it is a natural desire to visualize the data captured in them. Org Plot is a built-in feature in Org to do just that without having to leave &lt;strong&gt;Emacs&lt;/strong&gt;. That said, a couple of caveats with using Org Plot out of the box:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Without configuration, Org Plot output is &lt;em&gt;ugly&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Making Org Plot attractive requires a lot of boilerplate code with unmemorable syntax.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Given the above, it seems easier to punt and export your table data to a spreadsheet to make plots. But why bother with two sources of truth when you can just work with one? This post endeavors to show that you can have beautiful and easy to make plots with Org Plot. &lt;/p&gt;
&lt;p&gt;Unconvinced? Come back after watching the video demo below.&lt;/p&gt;
&lt;div class="video-container"&gt;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/KrQmiSToo7o" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;

&lt;p&gt;Want to know more? Read on…&lt;/p&gt;
&lt;h1&gt;Background&lt;/h1&gt;
&lt;p&gt;Under the hood, Org Plot uses &lt;strong&gt;gnuplot&lt;/strong&gt; to generate a graphic plot.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;gnuplot&lt;/strong&gt; is, like &lt;strong&gt;Emacs&lt;/strong&gt;, a robust and highly configurable program. But like &lt;strong&gt;Emacs&lt;/strong&gt;, &lt;strong&gt;gnuplot&lt;/strong&gt; has many default settings that are less than desirable. The net result of this is that &lt;strong&gt;gnuplot&lt;/strong&gt; without configuration produces ugly output. Don&amp;rsquo;t take my word for it - others say it &lt;a href="https://www.electricmonk.nl/log/2014/07/12/generating-good-looking-charts-with-gnuplot/"&gt;here&lt;/a&gt;, &lt;a href="http://www.gnuplotting.org/attractive-plots/"&gt;here&lt;/a&gt;, &lt;a href="http://youinfinitesnake.blogspot.com/2011/02/attractive-scientific-plots-with.html"&gt;here&lt;/a&gt;, and &lt;a href="https://edg.uchicago.edu/tutorials/pretty_plots_with_gnuplot/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;That said, &lt;strong&gt;gnuplot&lt;/strong&gt; can be easily configured to have attractive, daresay beautiful, output.&lt;/p&gt;
&lt;p&gt;To generate a plot, the function &lt;code&gt;org-plot/gnuplot&lt;/code&gt; is invoked via either the key binding &lt;code&gt;C-c " g&lt;/code&gt; or calling &lt;code&gt;M-x org-plot/gnuplot&lt;/code&gt;. When &lt;code&gt;org-plot/gnuplot&lt;/code&gt; is first called, the &lt;strong&gt;gnuplot&lt;/strong&gt; program is initialized and communicated to via the &lt;strong&gt;Emacs&lt;/strong&gt; buffer &lt;code&gt;✷gnuplot✷&lt;/code&gt;. From there &lt;code&gt;org-plot/gnuplot&lt;/code&gt; will translate the &lt;code&gt;#+PLOT&lt;/code&gt; options for a table into &lt;strong&gt;gnuplot&lt;/strong&gt; commands. &lt;/p&gt;
&lt;h2&gt;Org Plot Out of the Box&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s an example of a table taken from the Org Plot &lt;a href="https://orgmode.org/manual/Org-Plot.html"&gt;documentation&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;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;/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="nn"&gt;#+PLOT:&lt;/span&gt; title:&amp;quot;Citas&amp;quot; ind:1 deps:(2 3) type:2d with:histograms set:&amp;quot;yrange [0:]&amp;quot;
&lt;span class="s"&gt;| Sede      | Max cites | H-index |&lt;/span&gt;
&lt;span class="s"&gt;|-----------+-----------+---------|&lt;/span&gt;
&lt;span class="s"&gt;| Chile     |    257.72 |   21.39 |&lt;/span&gt;
&lt;span class="s"&gt;| Leeds     |    165.77 |   19.68 |&lt;/span&gt;
&lt;span class="s"&gt;| Sao Paolo |     71.00 |   11.50 |&lt;/span&gt;
&lt;span class="s"&gt;| Stockholm |    134.19 |   14.33 |&lt;/span&gt;
&lt;span class="s"&gt;| Morelia   |    257.56 |   17.67 |&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;Running &lt;code&gt;org-plot/gnuplot&lt;/code&gt; will result in a GUI window plot as shown below:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://yummymelon.com/devnull/images/beautifying-org-plot/citas-plot-default.png" width="800"/&gt;&lt;/p&gt;
&lt;p&gt;A couple of observations at this point:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;All the &lt;code&gt;PLOT&lt;/code&gt; options are put into a single line, but they don&amp;rsquo;t have to be.&lt;/p&gt;
&lt;p&gt;Options can be enumerated over multiple lines for easier comprehension and maintainability.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The key binding for &lt;code&gt;org-plot/gnuplot&lt;/code&gt; is quite difficult to remember.&lt;/p&gt;
&lt;p&gt;YMMV, but I'll likely &lt;em&gt;never&lt;/em&gt; remember &lt;code&gt;C-c " g&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The rendered plot is missing basic elements such as labels for the &lt;em&gt;x&lt;/em&gt; and &lt;em&gt;y&lt;/em&gt; axis.&lt;/p&gt;
&lt;p&gt;There are also no affordances to change the typeface and size for different labels.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;While the resultant plot is functional, thin lines and unfilled shapes is unattractive.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the next section, we&amp;rsquo;ll show how to address these observations to get more attractive output from Org Plot.&lt;/p&gt;
&lt;h1&gt;Objectives&lt;/h1&gt;
&lt;p&gt;Let&amp;rsquo;s sanity check the things we want to achieve with this post:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support quick creation of plots from an Org table that you can use and share with colleagues without embarrassment.&lt;/li&gt;
&lt;li&gt;Support line and column (called histogram in &lt;strong&gt;gnuplot&lt;/strong&gt;) style plots.&lt;/li&gt;
&lt;li&gt;Support configuring basic plot features:&lt;ul&gt;
&lt;li&gt;plot title&lt;/li&gt;
&lt;li&gt;x and y axis labels&lt;/li&gt;
&lt;li&gt;typeface and sizes of the above&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;context-menu-mode&lt;/code&gt; as the primary UI to Org Plot.&lt;/li&gt;
&lt;li&gt;Not require associative recall of &lt;strong&gt;gnuplot&lt;/strong&gt; commands and options to achieve the above.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Prerequisites&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;An understanding of &lt;a href="https://orgmode.org/manual/Org-Plot.html"&gt;Org Plot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A basic understanding of &lt;a href="http://gnuplot.info"&gt;gnuplot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;An understanding of &lt;a href="http://joaotavora.github.io/yasnippet/"&gt;YASnippet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Beautifying Org Plot&lt;/h1&gt;
&lt;h2&gt;Set the typeface, and typeface size&lt;/h2&gt;
&lt;p&gt;Org Plot provides a pass-through interface for the &lt;strong&gt;gnuplot&lt;/strong&gt; command &lt;code&gt;set&lt;/code&gt;, which is used to set a multitude of &lt;strong&gt;gnuplot&lt;/strong&gt; options. The line below shows how the typeface and typeface size can be configured via the &lt;code&gt;&amp;lt;typeface&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;typeface-size&amp;gt;&lt;/code&gt; parameters. Setting these values will apply to all labels used in the plot.&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="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;termoption font &amp;#39;&amp;lt;typeface&amp;gt;,&amp;lt;typeface-size&amp;gt;&amp;#39;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For my taste, I&amp;rsquo;ll use Futura for &lt;code&gt;&amp;lt;typeface&amp;gt;&lt;/code&gt; and 12pt for the &lt;code&gt;&amp;lt;typeface-size&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Alternately, one could configure the &lt;strong&gt;gnuplot&lt;/strong&gt; &lt;code&gt;terminal&lt;/code&gt; and set graphic device, size, and font in a single command. For example on macOS:&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="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;term aqua size 846, 594 font &amp;#39;Futura,12&amp;#39;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Setting the &lt;code&gt;&amp;lt;typeface&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;typeface-size&amp;gt;&lt;/code&gt; for the &lt;em&gt;x&lt;/em&gt; and &lt;em&gt;y&lt;/em&gt; axis labels are done via the &lt;strong&gt;gnuplot&lt;/strong&gt; options &lt;code&gt;xtics&lt;/code&gt; and &lt;code&gt;ytics&lt;/code&gt; respectively.&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;/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="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;xtics font &amp;#39;&amp;lt;typeface&amp;gt;,&amp;lt;typeface-size&amp;gt;&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;ytics font &amp;#39;&amp;lt;typeface&amp;gt;,&amp;lt;typeface-size&amp;gt;&amp;#39;&amp;quot;
&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 &lt;code&gt;&amp;lt;typeface&amp;gt;&lt;/code&gt; is omitted, then the current &lt;code&gt;font&lt;/code&gt; option value will be used.&lt;/p&gt;
&lt;h2&gt;Set the histogram (column) style&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;ll configure the style of the histogram with the following code. Refer to the &lt;strong&gt;gnuplot&lt;/strong&gt; documentation on &lt;a href="http://gnuplot.info/docs_5.5/loc5482.html"&gt;histograms&lt;/a&gt; for more detail on syntax.&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;/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="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;style histogram clustered gap 2&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;style fill solid 1.0 border -1&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;Set the Legend&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;gnuplot&lt;/strong&gt; option &lt;code&gt;key&lt;/code&gt; controls how the legend is rendered. Refer to the &lt;strong&gt;gnuplot&lt;/strong&gt; documentation on &lt;a href="http://gnuplot.info/docs_5.5/loc12549.html"&gt;key placement&lt;/a&gt; and &lt;a href="http://gnuplot.info/docs_5.5/loc12343.html"&gt;key&lt;/a&gt; for more detail on syntax.&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="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;key right top&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;Set the Axis Labels&lt;/h2&gt;
&lt;p&gt;The options &lt;code&gt;xlabel&lt;/code&gt; and &lt;code&gt;ylabel&lt;/code&gt; can be set with the appropriate string values for the plot at hand. Replace &lt;code&gt;&amp;lt;xlabel&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;ylabel&amp;gt;&lt;/code&gt; accordingly.&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;/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="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;xlabel &amp;#39;&amp;lt;xlabel&amp;gt;&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;ylabel &amp;#39;&amp;lt;ylabel&amp;gt;&amp;#39;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;Bring it all together&lt;/h2&gt;
&lt;p&gt;The following code brings all of the above together. The output result from running &lt;code&gt;org-plot/gnuplot&lt;/code&gt; 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;/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="nn"&gt;#+PLOT:&lt;/span&gt; title:&amp;quot;Citas&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;term aqua size 846, 594 font &amp;#39;Futura,12&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; type:2d
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;style histogram clustered gap 1&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;style fill solid 1.0 border -1&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;key right top&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;xlabel &amp;#39;Cities&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;ylabel &amp;#39;Metrics&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;xtics font &amp;#39;,10&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;ytics font &amp;#39;,10&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;yrange [0:]&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; with:histograms
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; ind:1 deps:(2 3)
&lt;span class="s"&gt;| Sede      | Max cites | H-index |&lt;/span&gt;
&lt;span class="s"&gt;|-----------+-----------+---------|&lt;/span&gt;
&lt;span class="s"&gt;| Chile     |    257.72 |   21.39 |&lt;/span&gt;
&lt;span class="s"&gt;| Leeds     |    165.77 |   19.68 |&lt;/span&gt;
&lt;span class="s"&gt;| Sao Paolo |     71.00 |   11.50 |&lt;/span&gt;
&lt;span class="s"&gt;| Stockholm |    134.19 |   14.33 |&lt;/span&gt;
&lt;span class="s"&gt;| Morelia   |    257.56 |   17.67 |&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;img src="http://yummymelon.com/devnull/images/beautifying-org-plot/citas-plot-beauty1.png" width="800"/&gt;&lt;/p&gt;
&lt;h2&gt;Line Plot Example&lt;/h2&gt;
&lt;p&gt;If the plot is using &lt;code&gt;line&lt;/code&gt; style, you can specify the &lt;code&gt;linewidth&lt;/code&gt; to use. Here it is specified the value of 3 px.&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="nn"&gt;#+PLOT:&lt;/span&gt; with:&amp;quot;lines linewidth 3&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Adjusting the &lt;code&gt;PLOT&lt;/code&gt; header accordingly, the source and resultant plot output 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;/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="nn"&gt;#+PLOT:&lt;/span&gt; title:&amp;quot;Line Example&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;term aqua size 846, 594 font &amp;#39;Futura,12&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; type:2d
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;key right top&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;xlabel &amp;#39;Some x metric&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;ylabel &amp;#39;Some y metrics&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;xtics font &amp;#39;,10&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;ytics font &amp;#39;,10&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;yrange [0:]&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; ind:1 deps:(2 3)
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; with:&amp;quot;linespoints linewidth 3 pointsize 2.0&amp;quot;
&lt;span class="s"&gt;| x | y | z |&lt;/span&gt;
&lt;span class="s"&gt;|---+---+---|&lt;/span&gt;
&lt;span class="s"&gt;| 0 | 0 | 8 |&lt;/span&gt;
&lt;span class="s"&gt;| 1 | 3 | 2 |&lt;/span&gt;
&lt;span class="s"&gt;| 2 | 8 | 3 |&lt;/span&gt;
&lt;span class="s"&gt;| 3 | 7 | 9 |&lt;/span&gt;
&lt;span class="s"&gt;| 4 | 2 | 8 |&lt;/span&gt;
&lt;span class="s"&gt;| 5 | 4 | 8 |&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;img src="http://yummymelon.com/devnull/images/beautifying-org-plot/lines-plot-beauty1.png" width="800" /&gt;&lt;/p&gt;
&lt;h1&gt;So much boilerplate to type. Can we do something about that?&lt;/h1&gt;
&lt;p&gt;So at this point we have the desired control and aesthetics but at the cost of a lot of boilerplate &lt;code&gt;PLOT&lt;/code&gt; statements. To alleviate typing, we'll use &lt;a href="http://joaotavora.github.io/yasnippet/"&gt;YASnippet&lt;/a&gt;, a template system that supports dynamic expansion. Among the key features it provides is the ability to prompt the user to choose different values and based on that value dynamically generate the expanded output.&lt;/p&gt;
&lt;p&gt;For the histogram example above, the YASnippet template can be as follows:&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;/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;# -*- mode: snippet -*-&lt;/span&gt;
&lt;span class="c1"&gt;# name: org-plot histogram&lt;/span&gt;
&lt;span class="c1"&gt;# --&lt;/span&gt;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; title:&amp;quot;${1:Line Example}&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;term `(cond ((or (eq (window-system) &amp;#39;mac) (eq (window-system) &amp;#39;ns)) &amp;quot;aqua&amp;quot;) ((eq (window-system) &amp;#39;x) &amp;quot;x11&amp;quot;) ((eq (window-system) &amp;#39;w32) &amp;quot;windows&amp;quot;))` size 846, 594 font &amp;#39;Futura,12&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; type:2d
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;style histogram ${2:$$(yas-choose-value &amp;#39;(&amp;quot;clustered&amp;quot; &amp;quot;rowstacked&amp;quot;))}${2:$(when (equal yas-text &amp;quot;clustered&amp;quot;) &amp;quot; gap 1&amp;quot;)}&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;style fill solid 1.0 border -1&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;key right top&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;xlabel &amp;#39;${3:x label}&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;ylabel &amp;#39;${4:y label}&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;xtics font &amp;#39;,10&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;ytics font &amp;#39;,10&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;yrange [0:]&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; with:histograms
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; ind:${5:1} deps:(${6:2})$0
&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 above snippet has logic to 1) dynamically choose the terminal type (&lt;code&gt;term&lt;/code&gt;), 2) &lt;code&gt;tab&lt;/code&gt; key to different fields to populate the plot&amp;rsquo;s title, axis labels, and histogram style, and 3) define which table column is independent (&lt;code&gt;ind&lt;/code&gt;) and which columns are dependent (&lt;code&gt;deps&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Note that different YASnippet templates can be created for different plot types. For this post we&amp;rsquo;ll only concentrate on variants of lines and histograms.&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;# -*- mode: snippet -*-
# name: org-plot lines
# --
#+PLOT: title:&amp;quot;${1:Line Example}&amp;quot;
#+PLOT: set:&amp;quot;term `(cond ((or (eq (window-system) &amp;#39;mac) (eq (window-system) &amp;#39;ns)) &amp;quot;aqua&amp;quot;) ((eq (window-system) &amp;#39;x) &amp;quot;x11&amp;quot;) ((eq (window-system) &amp;#39;w32) &amp;quot;windows&amp;quot;))` size 846, 594 font &amp;#39;Futura,12&amp;#39;&amp;quot;
#+PLOT: type:2d
#+PLOT: set:&amp;quot;key right top&amp;quot;
#+PLOT: set:&amp;quot;xlabel &amp;#39;${3:x label}&amp;#39;&amp;quot;
#+PLOT: set:&amp;quot;ylabel &amp;#39;${4:y label}&amp;#39;&amp;quot;
#+PLOT: set:&amp;quot;xtics font &amp;#39;,10&amp;#39;&amp;quot;
#+PLOT: set:&amp;quot;ytics font &amp;#39;,10&amp;#39;&amp;quot;
#+PLOT: set:&amp;quot;yrange [0:]&amp;quot;
#+PLOT: ind:${5:1} deps:(${6:2})
#+PLOT: with:&amp;quot;${7:$$(yas-choose-value &amp;#39;(&amp;quot;lines&amp;quot; &amp;quot;linespoints&amp;quot; &amp;quot;impulses&amp;quot;))} linewidth 3${7:$(when (equal yas-text &amp;quot;linespoints&amp;quot;) &amp;quot; pointsize 2.0&amp;quot;)}&amp;quot;$0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At this point we have some snippets but have yet to define a way to invoke them. I don&amp;rsquo;t intend to frequently make plots but for the times that I do I want it to be &lt;em&gt;easy&lt;/em&gt;. Context menus (aka right mouse button menus) offer low cognitive load so let&amp;rsquo;s go with that.&lt;/p&gt;
&lt;h1&gt;Integrating Org Plot with Context Menu Mode&lt;/h1&gt;
&lt;p&gt;Introduced in &lt;strong&gt;Emacs&lt;/strong&gt; 28, &lt;code&gt;context-menu-mode&lt;/code&gt; provides built-in conventions for using and customizing right mouse button menus. For this post, I&amp;rsquo;ll just capture the Elisp that I used to integrate Org Plot into context menus. For further elaboration on how customizing context menus works, please read up my earlier &lt;a href="http://yummymelon.com/devnull/customizing-the-emacs-context-menu.html" title="Customizing the Emacs Context Menu"&gt;post on it&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a screenshot showing my Org Plot context menu at work.&lt;/p&gt;
&lt;p&gt;&lt;img style="border: solid;" src="http://yummymelon.com/devnull/images/beautifying-org-plot/context-menu-org-plot-insert-plot.png" width="500" /&gt;&lt;/p&gt;
&lt;p&gt;At the top level, the menu items are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The cell reference the pointer is in &lt;/p&gt;
&lt;p&gt;Selecting this item will put the cell reference (in this case the string &lt;code&gt;@4$2&lt;/code&gt;) into the kill ring.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A sub-menu labeled &lt;code&gt;Insert Plot&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Run gnuplot&lt;/code&gt; which invokes &lt;code&gt;org-plot/gnuplot&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that the Org Plot context menu is &lt;em&gt;only&lt;/em&gt; shown if the pointer is within the bounds of a table.&lt;/p&gt;
&lt;h2&gt;Make the Keymap for &lt;em&gt;Insert Plot&lt;/em&gt; sub-menu&lt;/h2&gt;
&lt;p&gt;The following code-snippet illustrates how the sub-menu for &lt;code&gt;Insert Plot&lt;/code&gt; is implemented. The keymap variable &lt;code&gt;cc/insert-org-plot-menu&lt;/code&gt; holds the &lt;code&gt;menu-item&lt;/code&gt; instances, each of which holds a reference to the function that inserts the desired snippet.&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;/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="k"&gt;defvar&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/insert-org-plot-menu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;make-sparse-keymap&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Insert Org Plot&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;define-key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/insert-org-plot-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;lines-interactive&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Lines - GUI&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/org-plot-insert-lines-plot&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;Insert lines, linespoints, or impulses style chart for GUI 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="nv"&gt;define-key-after&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/insert-org-plot-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;lines-timestamp-interactive&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Lines Timestamp - GUI&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/org-plot-insert-lines-timestamp-plot&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;Insert lines, linespoints, or impulses style chart with timestamps for GUI 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="nv"&gt;define-key-after&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/insert-org-plot-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;columns-interactive&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Histogram - GUI&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/org-plot-insert-histogram-plot&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;Insert histogram (column) style chart for GUI 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="nv"&gt;define-key-after&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/insert-org-plot-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;org-plot-menu-single-separator&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;--single-line&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;define-key-after&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/insert-org-plot-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;lines-image&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Lines - Image&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/org-plot-insert-lines-plot-image&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;Insert lines, linespoints, or impulses style chart for image creation&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;define-key-after&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/insert-org-plot-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;lines-timestamp-image&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Lines Timestamp - Image&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/org-plot-insert-lines-timestamp-plot-image&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;Insert lines, linespoints, or impulses style chart with timestamps for image creation&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;define-key-after&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/insert-org-plot-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;columns-image&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Histogram - Image&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/org-plot-insert-histogram-plot-image&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;Insert histogram (column) style chart for image creation&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;h2&gt;Attach the &lt;em&gt;Insert Plot&lt;/em&gt; sub-menu to the Context Menu&lt;/h2&gt;
&lt;p&gt;The following code shows how to hook the above menu &lt;code&gt;cc/insert-org-plot-menu&lt;/code&gt; into the top-level context menu via the function &lt;code&gt;cc/context-menu-addons&lt;/code&gt;. The function &lt;code&gt;cc/kill-org-table-reference&lt;/code&gt; is used to copy the table reference into the &lt;strong&gt;Emacs&lt;/strong&gt; kill-ring.&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;/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-addons&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;CC context menu additions&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="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;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;define-key-after&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;org-table-separator&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;--single-line&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;define-key-after&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;org-table-field-info&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&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="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;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="nv"&gt;cc/kill-org-table-reference&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;Table field/cell information&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;define-key-after&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;org-table-insert-plot&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="ss"&gt;&amp;#39;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Insert Plot&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/insert-org-plot-menu&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;define-key-after&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;org-plot-gnuplot&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Run gnuplot&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;org-plot/gnuplot&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;Run gnuplot&amp;quot;&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/kill-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;e&lt;/span&gt;&lt;span class="p"&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;e&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;kill-new&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="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;org-table-current-column&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-addons&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;h2&gt;Functions to Insert Snippets&lt;/h2&gt;
&lt;p&gt;There is a general function &lt;code&gt;cc/org-plot-insert-snippet&lt;/code&gt; which will insert an arbitrarily named snippet into the buffer at the start of an Org table. Its implementation checks to see if the pointer is within a table before inserting the snippet.&lt;/p&gt;
&lt;p&gt;From there a number of helper functions invoking &lt;code&gt;cc/org-plot-insert-snippet&lt;/code&gt; with a specific snippet name are defined. These helper functions are referenced by &lt;code&gt;cc/insert-org-plot-menu&lt;/code&gt; above.&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;/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-plot-insert-snippet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;name&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;Insert NAME snippet at top of the table.&lt;/span&gt;

&lt;span class="s"&gt;If the point is not within an Org table then an error message&lt;/span&gt;
&lt;span class="s"&gt;will be displayed.&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;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="k"&gt;progn&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-backward-paragraph&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;yas-expand-snippet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;yas-lookup-snippet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&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;Error: not in org-table&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-plot-insert-lines-plot&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;Invoke snippet named \&amp;quot;org-plot lines\&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="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="nv"&gt;cc/org-plot-insert-snippet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;org-plot lines&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-plot-insert-lines-timestamp-plot&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;Invoke snippet named \&amp;quot;org-plot lines timestamp\&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="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="nv"&gt;cc/org-plot-insert-snippet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;org-plot lines timestamp&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-plot-insert-histogram-plot&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;Invoke snippet named \&amp;quot;org-plot histogram\&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="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="nv"&gt;cc/org-plot-insert-snippet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;org-plot histogram&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-plot-insert-lines-plot-image&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;Invoke snippet named \&amp;quot;org-plot lines image\&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="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="nv"&gt;cc/org-plot-insert-snippet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;org-plot lines image&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-plot-insert-lines-timestamp-plot-image&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;Invoke snippet named \&amp;quot;org-plot lines timestamp image\&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="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="nv"&gt;cc/org-plot-insert-snippet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;org-plot lines timestamp image&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-plot-insert-histogram-plot-image&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;Invoke snippet named \&amp;quot;org-plot histogram image\&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="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="nv"&gt;cc/org-plot-insert-snippet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;org-plot histogram image&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;h2&gt;What about timestamps?&lt;/h2&gt;
&lt;p&gt;Org Plot has the ability to work with both Org-style and regular timestamps as the independent column. The snippet below shows how this is supported.&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;/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;# -*- mode: snippet -*-&lt;/span&gt;
&lt;span class="c1"&gt;# name: org-plot lines timestamp&lt;/span&gt;
&lt;span class="c1"&gt;# --&lt;/span&gt;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; title:&amp;quot;${1:Line Example}&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;term ${2:`(cond ((or (eq (window-system) &amp;#39;mac) (eq (window-system) &amp;#39;ns)) &amp;quot;aqua&amp;quot;) ((eq (window-system) &amp;#39;x) &amp;quot;x11&amp;quot;) ((eq (window-system) &amp;#39;w32) &amp;quot;windows&amp;quot;))`} size 846, 594 font &amp;#39;Futura,12&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; type:2d
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;key right top&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;xlabel &amp;#39;${3:x label}&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;ylabel &amp;#39;${4:y label}&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;xtics font &amp;#39;,10&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;ytics font &amp;#39;,10&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;xtics format &amp;#39;${5:%Y-%m-%d}&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;yrange [0:]&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; timeind:1
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; ind:${6:1} deps:(${7:2})
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; with:&amp;quot;${8:$$(yas-choose-value &amp;#39;(&amp;quot;lines&amp;quot; &amp;quot;linespoints&amp;quot; &amp;quot;impulses&amp;quot;))} linewidth 3${8:$(when (equal yas-text &amp;quot;linespoints&amp;quot;) &amp;quot; pointsize 2.0&amp;quot;)}&amp;quot;$0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Note that there is a current bug in Org Mode as of 9.6.1 that requires declaring the &lt;code&gt;timeind&lt;/code&gt; option. For timestamps to work, &lt;code&gt;timeind&lt;/code&gt; must be set to &lt;code&gt;1&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;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;/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="nn"&gt;#+PLOT:&lt;/span&gt; title:&amp;quot;Weight&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;term aqua size 846, 594 font &amp;#39;Futura,12&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; type:2d
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;key right top&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;xlabel &amp;#39;Date&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;ylabel &amp;#39;Kg&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;xtics font &amp;#39;,10&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;ytics font &amp;#39;,10&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;xtics format &amp;#39;%Y-%m-%d&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;yrange [0:]&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; timeind:1
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; ind:1 deps:(2)
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; with:&amp;quot;lines linewidth 3&amp;quot;
&lt;span class="s"&gt;| Date             |   Kg |&lt;/span&gt;
&lt;span class="s"&gt;|------------------+------|&lt;/span&gt;
&lt;span class="s"&gt;| &amp;lt;2010-02-21 Sun&amp;gt; | 95.0 |&lt;/span&gt;
&lt;span class="s"&gt;| &amp;lt;2010-02-22 Mon&amp;gt; | 93.0 |&lt;/span&gt;
&lt;span class="s"&gt;| &amp;lt;2010-02-23 Tue&amp;gt; | 92.0 |&lt;/span&gt;
&lt;span class="s"&gt;| &amp;lt;2010-02-24 Wed&amp;gt; | 91.5 |&lt;/span&gt;
&lt;span class="s"&gt;| &amp;lt;2010-02-27 Sat&amp;gt; | 91.0 |&lt;/span&gt;
&lt;span class="s"&gt;| &amp;lt;2010-03-01 Mon&amp;gt; | 92.0 |&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;Here&amp;rsquo;s the resultant plot:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://yummymelon.com/devnull/images/beautifying-org-plot/weight-over-time.png" width="800" /&gt;&lt;/p&gt;
&lt;h2&gt;Writing to SVG, JPEG, or PNG&lt;/h2&gt;
&lt;p&gt;The above snippets are configured to output to a &lt;strong&gt;gnuplot&lt;/strong&gt; GUI terminal. The snippet below is tuned to write a file to either a SVG, JPEG, or PNG format.&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="c1"&gt;# -*- mode: snippet -*-&lt;/span&gt;
&lt;span class="c1"&gt;# name: org-plot histogram image&lt;/span&gt;
&lt;span class="c1"&gt;# --&lt;/span&gt;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; title:&amp;quot;${1:Line Example}&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;term ${2:$$(yas-choose-value &amp;#39;(&amp;quot;svg&amp;quot; &amp;quot;jpeg&amp;quot; &amp;quot;png&amp;quot;))} size 846, 594 font &amp;#39;Futura,12&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; type:2d
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;style histogram ${3:$$(yas-choose-value &amp;#39;(&amp;quot;clustered&amp;quot; &amp;quot;rowstacked&amp;quot;))}${3:$(when (equal yas-text &amp;quot;clustered&amp;quot;) &amp;quot; gap 1&amp;quot;)}&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;style fill solid 1.0 border -1&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;key right top&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;xlabel &amp;#39;${4:x label}&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;ylabel &amp;#39;${5:y label}&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;xtics font &amp;#39;,10&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;ytics font &amp;#39;,10&amp;#39;&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; set:&amp;quot;yrange [0:]&amp;quot;
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; with:histograms
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; ind:${6:1} deps:(${7:2})
&lt;span class="nn"&gt;#+PLOT:&lt;/span&gt; file:&amp;quot;${8:image}.${2:$(cond ((equal yas-text &amp;quot;svg&amp;quot;) &amp;quot;svg&amp;quot;) ((equal yas-text &amp;quot;jpeg&amp;quot;) &amp;quot;jpg&amp;quot;) ((equal yas-text &amp;quot;png&amp;quot;) &amp;quot;png&amp;quot;))}&amp;quot;$0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;h1&gt;Concluding Thoughts&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Org Plot can be made much more attractive and usable with YASnippet and context menus. &lt;/li&gt;
&lt;li&gt;The code examples (particularly the snippets) above can be refined to be both more generalized and richer in capability.&lt;/li&gt;
&lt;li&gt;For Org Table users, one less reason to leave &lt;strong&gt;Emacs&lt;/strong&gt; for a spreadsheet program. 😏&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Acknowledgments&lt;/h1&gt;
&lt;p&gt;Thanks to &lt;code&gt;yantar92Orgcontr&lt;/code&gt; on the &lt;code&gt;#org-mode&lt;/code&gt; IRC channel for the assistance in identifying the issue with &lt;code&gt;timeind&lt;/code&gt;.&lt;/p&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://orgmode.org/manual/Org-Plot.html"&gt;Org Plot Manual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://joaotavora.github.io/yasnippet/"&gt;YASnippet Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.electricmonk.nl/log/2014/07/12/generating-good-looking-charts-with-gnuplot/"&gt;https://www.electricmonk.nl/log/2014/07/12/generating-good-looking-charts-with-gnuplot/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.gnuplotting.org/attractive-plots/"&gt;http://www.gnuplotting.org/attractive-plots/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://edg.uchicago.edu/tutorials/pretty_plots_with_gnuplot/"&gt;https://edg.uchicago.edu/tutorials/pretty_plots_with_gnuplot/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sourceforge.net/p/gnuplot/bugs/430/"&gt;https://sourceforge.net/p/gnuplot/bugs/430/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="emacs"/><category term="software"/><category term="dev"/><category term="elisp"/><category term="org mode"/></entry><entry><title>Customizing the Emacs Context Menu</title><link href="http://yummymelon.com/devnull/customizing-the-emacs-context-menu.html" rel="alternate"/><published>2023-01-03T00:53:00-08:00</published><updated>2023-01-03T00:53:00-08:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2023-01-03:/devnull/customizing-the-emacs-context-menu.html</id><summary type="html">&lt;p&gt;Novice Elisp programmer (me) succeeds in customizing &lt;em&gt;Emacs&lt;/em&gt; right mouse button menu behavior. Uses this knowledge to copy common actions seen in native (in particular macOS) applications.&lt;/p&gt;</summary><content type="html">&lt;h1 class="articleTitle"&gt;Summary&lt;/h1&gt;

&lt;div class="video-container"&gt;&lt;iframe width="800" height="450" src="https://www.youtube.com/embed/AX8VhKNmi7s" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;(best played full screen, no audio)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Novice Elisp programmer (me) succeeds in customizing &lt;em&gt;Emacs&lt;/em&gt; right mouse button menu behavior. Uses this knowledge to copy common actions seen in native (in particular macOS) applications.&lt;/p&gt;
&lt;p&gt;This post captures how I got here.&lt;/p&gt;
&lt;h2&gt;Background&lt;/h2&gt;
&lt;p&gt;Context menus triggered by a right mouse button event are a commonly used GUI pattern. &lt;em&gt;&lt;a href="https://www.gnu.org/software/emacs/" title="Emacs website"&gt;Emacs&lt;/a&gt;&lt;/em&gt; provides support for this via &lt;code&gt;context-menu-mode&lt;/code&gt; which was introduced in version 28. Customizing &lt;code&gt;context-menu-mode&lt;/code&gt; requires some understanding how menus are structured. I won&amp;rsquo;t go into too much detail describing how Emacs menus work here, but hopefully will impart enough about it to get you going.&lt;/p&gt;
&lt;h2&gt;What I Did&lt;/h2&gt;
&lt;h3&gt;Requirements&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Context menu should only show menu actions based on &lt;em&gt;context&lt;/em&gt;. Different criteria for context are enumerated below and can be used in combinatorial fashion for a particular action.&lt;ul&gt;
&lt;li&gt;buffer mode (major and minor)&lt;/li&gt;
&lt;li&gt;region is selected (active) or not&lt;/li&gt;
&lt;li&gt;&lt;code&gt;buffer-file-name&lt;/code&gt; is version controlled&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Preconditions&lt;/h3&gt;
&lt;p&gt;My customized context menu relies on these packages being installed. YMMV. Also, you must use &lt;em&gt;Emacs&lt;/em&gt; version ≧ 28.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/xuchunyang/osx-dictionary.el"&gt;osx-dictionary&lt;/a&gt; - Dictionary lookup using the macOS-installed dictionary&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/Malabarba/emacs-google-this"&gt;google-this&lt;/a&gt; - Search for term in Google&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jcs-elpa/reveal-in-folder"&gt;reveal-in-folder&lt;/a&gt; - Reveal current file in native OS folder.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/danielmartin/3c5d3a3a8cd24a3556379c5251651748"&gt;Export an Org Region to RTF&lt;/a&gt; - Elisp snippet for using macOS command line utility &lt;code&gt;textutil&lt;/code&gt; to convert Org markup to rich text format&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/titaniumbones/ox-slack"&gt;ox-slack&lt;/a&gt; - Exports Org markup to Slack markup&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/larstvei/ox-gfm"&gt;ox-gfm&lt;/a&gt; - dependency required by ox-slack&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Turn on &lt;code&gt;context-menu-mode&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;ve got &lt;code&gt;context-menu-mode&lt;/code&gt; turned on in both &lt;code&gt;prog-mode-hook&lt;/code&gt; and &lt;code&gt;text-mode-hook&lt;/code&gt; which should cover most all my programming (Python, ObjC, Swift, Elisp, C, etc.) and text (Org, Markdown) modes via inheritance. It is also turned on for &lt;strong&gt;dired&lt;/strong&gt; and &lt;strong&gt;shell&lt;/strong&gt; modes.&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="nv"&gt;add-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;text-mode-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;context-menu-mode&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;prog-mode-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;context-menu-mode&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;shell-mode-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;context-menu-mode&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;dired-mode-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;context-menu-mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At this point, you should be able to right mouse button click anywhere on a buffer see a menu. &lt;em&gt;But&lt;/em&gt; that menu is quite unexciting. We&amp;rsquo;ll address this next.&lt;/p&gt;
&lt;h3&gt;Let&amp;rsquo;s Make a Menu&lt;/h3&gt;
&lt;p&gt;A common context menu action is to take selected text and either capitalize, upper, or lower case it, as illustrated below. &lt;/p&gt;
&lt;p&gt;&lt;img alt="Transform" src="http://yummymelon.com/devnull/images/2023-01-02/cc-transform-context-menu.png" title="Transform Sub Menu"&gt;&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll implement the above as a sub-menu with the user-defined variable &lt;code&gt;cc/transform-text-menu&lt;/code&gt; whose value is a sparse keymap. The code below illustrates how this is implemented.&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="c1"&gt;;; Transform Text&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/transform-text-menu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;make-sparse-keymap&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Transform Text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;define-key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/transform-text-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;tranform-text-uppercase&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Make Upper Case&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;upcase-region&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;Upper case region&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;define-key-after&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/transform-text-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;tranform-text-lowercase&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Make Lower Case&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;downcase-region&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;Lower case region&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;define-key-after&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/transform-text-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;tranform-text-capitalize&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Capitalize&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;capitalize-region&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;Capitalize region&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;Note that the actual commands to execute the transformations (&lt;code&gt;upcase-region&lt;/code&gt;, &lt;code&gt;downcase-region&lt;/code&gt;, &lt;code&gt;capitalize-region&lt;/code&gt;) are invoked in each &lt;code&gt;menu-item&lt;/code&gt; call.&lt;/p&gt;
&lt;p&gt;Note that at this point &lt;code&gt;cc/transform-text-menu&lt;/code&gt; only defines the sub-menu but it is not attached to anything yet.&lt;/p&gt;
&lt;h2&gt;Let&amp;rsquo;s Make a Menu, Part 2&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s make another sub-menu with the user-defined variable &lt;code&gt;cc/org-emphasize-menu&lt;/code&gt;, this time to format (emphasize) selected text in &lt;em&gt;Org-mode&lt;/em&gt; as shown below.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Emphasize-Menu" src="./images/2023-01-02/cc-emphasize-context-menu.png" title="Emphasize Menu"&gt;&lt;/p&gt;
&lt;p&gt;The source to achieve this is described below. Note that the actual emphasis commands (&lt;code&gt;cc/org-emphasize-bold|italic|code|…&lt;/code&gt;) in this menu are built on-top of &lt;code&gt;org-emphasize&lt;/code&gt;, which generalizes what type of emphasis (bold, italic, code, etc.) to use as a function argument.&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;/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 Emphasize&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-emphasize-menu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;make-sparse-keymap&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Org Emphasize&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;define-key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/org-emphasize-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;org-emphasize-bold&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Bold&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/org-emphasize-bold&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;Bold&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;define-key-after&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/org-emphasize-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;org-emphasize-italic&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Italic&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/org-emphasize-italic&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;Italic&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;define-key-after&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/org-emphasize-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;org-emphasize-code&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&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;cc/org-emphasize-code&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;Code&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;define-key-after&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/org-emphasize-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;org-emphasize-underline&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Underline&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/org-emphasize-underline&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;Underline&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;define-key-after&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/org-emphasize-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;org-emphasize-verbatim&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Verbatim&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/org-emphasize-verbatim&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;Verbatim&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;define-key-after&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/org-emphasize-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;org-emphasize-strike-through&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Strike Through&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/org-emphasize-strike-through&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;Strike through&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;define-key-after&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/org-emphasize-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;org-emphasize-reset&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Reset&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/org-emphasize-reset&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;Remove emphasis&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;;; Convenience functions to emphasize by type&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-emphasize-bold&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;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="nv"&gt;org-emphasize&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;?*&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-emphasize-italic&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;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="nv"&gt;org-emphasize&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;?/&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-emphasize-code&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;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="nv"&gt;org-emphasize&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;?~&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-emphasize-underline&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;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="nv"&gt;org-emphasize&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;?_&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-emphasize-verbatim&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;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="nv"&gt;org-emphasize&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;?=&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-emphasize-strike-through&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;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="nv"&gt;org-emphasize&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;?+&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-emphasize-reset&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="c1"&gt;;; org bug: this won&amp;#39;t work when org-hide-emphasis-markers is turned on.&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="nv"&gt;org-emphasize&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;?\s&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;With the above source, we now have a variable &lt;code&gt;cc/org-emphasis-menu&lt;/code&gt; that holds the emphasis sub-menu. We are ready to hook this into the context menu!&lt;/p&gt;
&lt;h2&gt;Customizing the Context Menu&lt;/h2&gt;
&lt;p&gt;Customizing the context menu requires:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Defining a new function (in this case &lt;code&gt;cc/context-menu-addons&lt;/code&gt;) to capture the customized context menu behavior.&lt;/li&gt;
&lt;li&gt;Hooking that new function (&lt;code&gt;cc/context-menu-addons&lt;/code&gt;) into the variable &lt;code&gt;context-menu-functions&lt;/code&gt; via the &lt;code&gt;add-hook&lt;/code&gt; function.&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;/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-addons&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;CC context menu additions&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;define-key-after&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;open-in-finder&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Open in Finder&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;reveal-in-folder-this-buffer&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;Open file (buffer) in Finder&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="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;region-active-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;define-key-after&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;osx-dictionary-lookup&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Look up&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;osx-dictionary-search-word-at-point&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;Look up in dictionary&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;define-key-after&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;occur-word-at-mouse&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Occur&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;occur-word-at-mouse&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;Occur&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="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;bound-and-true-p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;buffer-file-name&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;vc-registered&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;buffer-file-name&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;define-key-after&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;vc-separator&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;--single-line&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;define-key-after&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;magit-status&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Magit Status&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;magit-status&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;Magit Status&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;define-key-after&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;ediff-revision&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Ediff revision…&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/ediff-revision&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;Ediff this file with revision&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="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;region-active-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;define-key-after&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;transform-text-separator&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;--single-line&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;define-key-after&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;tranform-text&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="ss"&gt;&amp;#39;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Transform&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/transform-text-menu&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="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;derived-mode-p&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="nv"&gt;region-active-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;define-key-after&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;org-emphasize&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="ss"&gt;&amp;#39;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Org Emphasize&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/org-emphasize-menu&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;define-key-after&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;org-export-to-slack&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Copy as Slack&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;org-slack-export-to-clipboard-as-slack&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 as Slack to clipboard&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;define-key-after&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;copy-as-rtf&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Copy as RTF&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dm/copy-as-rtf&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 as RTF to clipboard&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="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;region-active-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;define-key-after&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;google-search&lt;/span&gt;&lt;span class="p"&gt;]&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="nv"&gt;menu-item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Search with Google&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;google-this-noconfirm&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;Search Google with region&amp;quot;&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="c1"&gt;;; hook into context menu&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-addons&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;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Note that the implementation of &lt;code&gt;cc/context-menu-addons&lt;/code&gt; has logic to query context information such as buffer mode, whether text is selected (&lt;code&gt;region-active-p&lt;/code&gt;), and source control (&lt;code&gt;vc-registered&lt;/code&gt;) to determine if a &lt;code&gt;menu-item&lt;/code&gt; is to be rendered.&lt;/p&gt;
&lt;h2&gt;Extras: Clean up Ediff UX&lt;/h2&gt;
&lt;p&gt;IMHO, &lt;em&gt;Ediff&lt;/em&gt; has terrible UX out of the box, especially when quitting where it leaves a bunch of buffers strewn about. The code below helps mitigate some of that behavior thanks to this &lt;a href="https://emacs.stackexchange.com/a/17089"&gt;posted comment&lt;/a&gt; in StackExchange.&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="c1"&gt;;; Pass buffer-file-name into Ediff&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/ediff-revision&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;e&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;Invoke ediff-revision with buffer-file-name.&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;e&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;ediff-revision&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;buffer-file-name&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;;; Fix Ediff quit UX behavior by closing all buffers&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;my-ediff-last-windows&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;nil&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;my-store-pre-ediff-winconfig&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;setq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;my-ediff-last-windows&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;current-window-configuration&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;my-restore-pre-ediff-winconfig&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="nf"&gt;set-window-configuration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;my-ediff-last-windows&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;ediff-before-setup-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;my-store-pre-ediff-winconfig&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;ediff-quit-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;my-restore-pre-ediff-winconfig&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;Also note that my &lt;em&gt;Ediff&lt;/em&gt; variables are set as follows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ediff-keep-variants&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&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="nv"&gt;ediff-split-window-function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;split-window-horizontally&lt;/span&gt;&lt;span class="p"&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="nv"&gt;ediff-window-setup-function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;ediff-setup-windows-plain&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;h2&gt;Observations&lt;/h2&gt;
&lt;p&gt;Going through this exercise, a couple of observations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Customizing an Emacs menu requires a &lt;em&gt;lot&lt;/em&gt; of boilerplate. Maybe because I&amp;rsquo;m naive to Elisp and Emacs conventions, there might be a cleaner implementation, but it seems like I gotta work too hard (both learning and implementing) to customize a menu.&lt;/li&gt;
&lt;li&gt;I &lt;em&gt;tried&lt;/em&gt; to implement context-dependent logic in the &lt;code&gt;:visible&lt;/code&gt; property documented in &lt;a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Extended-Menu-Items.html"&gt;Extended Menu Items&lt;/a&gt; in the function &lt;code&gt;cc/context-menu-addons&lt;/code&gt;. Didn&amp;rsquo;t work. Elisp experts, definitely would like your feedback.&lt;/li&gt;
&lt;li&gt;Having the function &lt;code&gt;cc/context-menu-addons&lt;/code&gt; hooking into a global variable &lt;code&gt;content-menu-functions&lt;/code&gt; seems like a very monolithic design. Maybe there&amp;rsquo;s a cleaner pattern here?&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oantolin/embark"&gt;Embark&lt;/a&gt; looks awesome, but sometimes you just want a mouse.&lt;/li&gt;
&lt;li&gt;Beyond thrilled to have gotten here. Hope you feel likewise!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Acknowledgments&lt;/h2&gt;
&lt;p&gt;Thanks to Philip Kaludercic&amp;rsquo;s &lt;a href="https://ruzkuku.com/texts/emacs-mouse.html"&gt;post&lt;/a&gt; that helped considerably in my understanding of how to customize a context menu.&lt;/p&gt;
&lt;p&gt;Thanks to deaddyfreaddy for providing informal code review on &lt;a href="https://www.reddit.com/r/emacs/comments/1023g27/comment/j2tcaso/?utm_source=share&amp;amp;utm_medium=web2x&amp;amp;context=3"&gt;Reddit&lt;/a&gt; for an earlier version of this post. This current post has been amended to reflect his feedback. &lt;/p&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Menu-Mouse-Clicks.html"&gt;https://www.gnu.org/software/emacs/manual/html_node/emacs/Menu-Mouse-Clicks.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ruzkuku.com/texts/emacs-mouse.html"&gt;https://ruzkuku.com/texts/emacs-mouse.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://emacs.stackexchange.com/a/17089"&gt;https://emacs.stackexchange.com/a/17089&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Extended-Menu-Items.html"&gt;https://www.gnu.org/software/emacs/manual/html_node/elisp/Extended-Menu-Items.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oantolin/embark"&gt;https://github.com/oantolin/embark&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/danielmartin/3c5d3a3a8cd24a3556379c5251651748"&gt;https://gist.github.com/danielmartin/3c5d3a3a8cd24a3556379c5251651748&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="dev"/><category term="emacs"/><category term="software"/><category term="elisp"/></entry></feed>