<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>notes from /dev/null - dev</title><link href="http://yummymelon.com/devnull/" rel="alternate"/><link href="http://yummymelon.com/devnull/feeds/tags/dev.atom.xml" rel="self"/><id>http://yummymelon.com/devnull/</id><updated>2023-06-04T11:36:00-07:00</updated><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>My Emacs Config Repo</title><link href="http://yummymelon.com/devnull/my-emacs-config-repo.html" rel="alternate"/><published>2023-05-26T18:06:00-07:00</published><updated>2023-05-26T18:06:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2023-05-26:/devnull/my-emacs-config-repo.html</id><summary type="html">&lt;p&gt;My Emacs config pushed up on GitHub.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Emacs configs are always bespoke to its user, but as so much of what I've got configured I've gotten from other Emacs users, here's my config repo to help pay it forward for others interested in using it. Probably what's most notable in my config is its aggressive usage of &lt;code&gt;context-menu-mode&lt;/code&gt;. Feel free to peruse, crib, or even critique. Such things are always a work-in-progress.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/kickingvegas/cclisp"&gt;kickingvegas/cclisp: Emacs configuration files for Charles Choi&lt;/a&gt;&lt;/p&gt;</content><category term="misc"/><category term="emacs"/><category term="dev"/><category term="software"/></entry><entry><title>Captee 1.1.0 update now available on the App Store</title><link href="http://yummymelon.com/devnull/captee-1.1.0-update-now-available-on-the-app-store.html" rel="alternate"/><published>2023-05-22T13:55:00-07:00</published><updated>2023-05-22T13:55:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2023-05-22:/devnull/captee-1.1.0-update-now-available-on-the-app-store.html</id><summary type="html">&lt;p&gt;Captee v1.1.0 is a major release. Export of formatted text to Markdown and Org is now supported!&lt;/p&gt;</summary><content type="html">&lt;p&gt;There's a big update to &lt;strong&gt;Captee&lt;/strong&gt; (v1.1.0) now available on the &lt;a href="https://apps.apple.com/us/app/captee/id6446053750"&gt;App Store&lt;/a&gt;. This is a major release for the app, with significant improvements to its user interface and support for &lt;em&gt;converting formatted macOS text&lt;/em&gt; to Markdown and Org markup. &lt;/p&gt;
&lt;p&gt;If this is your first time hearing about it, hello and welcome! &lt;strong&gt;Captee&lt;/strong&gt; is an app that makes marking up a link (both URL and title) to Markdown or Org a one-step operation straight from the macOS Share menu. Results are stored in the system clipboard for pasting into your favorite editor. &lt;/p&gt;
&lt;p&gt;Learn more about &lt;strong&gt;Captee&lt;/strong&gt; at &lt;a href="http://yummymelon.com/captee"&gt;http://yummymelon.com/captee&lt;/a&gt;.&lt;/p&gt;</content><category term="misc"/><category term="Captee"/><category term="dev"/><category term="software"/><category term="mobile"/></entry><entry><title>Introducing Captee alpha, looking for testers</title><link href="http://yummymelon.com/devnull/introducing-captee-alpha-looking-for-testers.html" rel="alternate"/><published>2023-03-10T14:31:00-08:00</published><updated>2023-03-10T14:31:00-08:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2023-03-10:/devnull/introducing-captee-alpha-looking-for-testers.html</id><summary type="html">&lt;p&gt;Introducing Captee, a macOS utility app to share links and content via the macOS Share menu. It's in alpha now, but I'm looking for testers.&lt;/p&gt;</summary><content type="html">&lt;p&gt;This past February, I started building a &lt;strong&gt;macOS&lt;/strong&gt; app to help me work with &lt;a href="https://orgmode.org/"&gt;Org mode for Emacs&lt;/a&gt;  It lets you share links and content from another app (typically &lt;strong&gt;Safari&lt;/strong&gt;) via the &lt;strong&gt;macOS&lt;/strong&gt; &lt;em&gt;Share&lt;/em&gt; menu and format it in &lt;strong&gt;Org&lt;/strong&gt; markup. It can also support &lt;a href="https://daringfireball.net/projects/markdown/syntax#link"&gt;Markdown links&lt;/a&gt; so you can work with other editors too. The app is called &lt;strong&gt;Captee&lt;/strong&gt; and here&amp;rsquo;s a video that demonstrates it at work:&lt;/p&gt;
&lt;div class="video-container"&gt;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/OTtfaxxqnWY" 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;Note that &lt;strong&gt;Captee&lt;/strong&gt; is very much in an alpha/proof-of-concept/bleeding-edge state of polish right now. You&amp;rsquo;ll get the best results for &lt;strong&gt;Captee&lt;/strong&gt; if you use the macOS Yamamoto Mitsuharu port of &lt;strong&gt;Emacs&lt;/strong&gt; (&lt;a href="https://ports.macports.org/port/emacs-mac-app/"&gt;MacPorts&lt;/a&gt;, &lt;a href="https://github.com/railwaycat/homebrew-emacsmacport"&gt;Homebrew&lt;/a&gt;). It supports &lt;a href="https://orgmode.org/manual/Protocols.html"&gt;Org Protocol&lt;/a&gt; out of the box, otherwise you will have to use the system clipboard to share content.&lt;/p&gt;
&lt;p&gt;To capture selected text via &lt;code&gt;org-protocol&lt;/code&gt; you&amp;rsquo;ll need to define a capture template on the &lt;strong&gt;Emacs&lt;/strong&gt; side &lt;em&gt;first&lt;/em&gt; before you use &lt;strong&gt;Captee&lt;/strong&gt;. Here&amp;rsquo;s an example capture template that uses the placeholders described in the Org &lt;a href="https://orgmode.org/manual/The-capture-protocol.html"&gt;capture protocol&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;/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;setq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;org-capture-templates&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Captee Capture&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;entry&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;file+headline&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;~/org/captee.org&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Captee Captures&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;* %:description\\n%:annotation\\n%i\n%?&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;:empty-lines&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &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;Okay with all that said, I&amp;rsquo;m looking for testers. If you&amp;rsquo;re interested, you can get an alpha build of &lt;strong&gt;Captee&lt;/strong&gt; via this &lt;a href="https://testflight.apple.com/join/Jq0GuEv8"&gt;TestFlight link&lt;/a&gt;. Please provide feedback via the TestFlight app. Also, I highly recommend you do a deep-read of the release notes before installing or using &lt;strong&gt;Captee&lt;/strong&gt;.&lt;/p&gt;</content><category term="misc"/><category term="emacs"/><category term="dev"/><category term="software"/><category term="macOS"/><category term="org mode"/><category term="captee"/></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>How I Personally Use Mobile Computing in 2023</title><link href="http://yummymelon.com/devnull/how-i-personally-use-mobile-computing-in-2023.html" rel="alternate"/><published>2023-01-23T15:23:00-08:00</published><updated>2023-01-23T15:23:00-08:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2023-01-23:/devnull/how-i-personally-use-mobile-computing-in-2023.html</id><summary type="html">&lt;p&gt;Some musings on how I use mobile computing in 2023.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Not necessarily profound, but some personal thoughts/checkpoints on how I use &amp;ldquo;mobile&amp;rdquo; computing in 2023. Motivated by following up with this &lt;a href="http://yummymelon.com/devnull/slatestabletspads-and-why-they-matter-the-sho.html" title="Slates/Tablets/Pads and Why They Matter: The Short Explanation"&gt;post&lt;/a&gt; I made back in January 2010. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;By far, an iPad with an external keyboard has become my primary and preferred means of communication. &lt;/p&gt;
&lt;p&gt;Text messages, email, video, and even voice calls: I do all these things through my iPad nearly all the time. It has been this way for the past &lt;em&gt;four&lt;/em&gt; years.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;With cloud based messaging services, my bias is to use a mobile phone as a read-only device whenever I'm dealing with text.&lt;/p&gt;
&lt;p&gt;Most of my communication writing is done on the iPad using an external keyboard. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Emotionally, I don&amp;rsquo;t think of a laptop as a &amp;ldquo;mobile&amp;rdquo; device anymore.&lt;/p&gt;
&lt;p&gt;My 90% use case is to run it as a docked system connected to a monitor, keyboard, and mouse. This is the case regardless if I&amp;rsquo;m at home or at work. It&amp;rsquo;s basically a desktop (albeit portable) computer to me now.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;That said, the option to run it &lt;em&gt;as&lt;/em&gt; a laptop is still a great win for the cases when I need to. I&amp;rsquo;d still observe that these are exceptions to my day-to-day behavior.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Related to the above, whenever I need mobile access (via iPad or iPhone) to my laptop&amp;rsquo;s files, I use a terminal emulator.&lt;/p&gt;
&lt;p&gt;I got an iPad 2nd generation on the day of its release in 2011, and for most of its life I found it great for consuming media but not much else. It was far from being a system I could do &lt;em&gt;work&lt;/em&gt; with which entails a lot of writing, both of software and its documentation, journaling, and project planning. After a couple of years it went into the bookcase, unused.&lt;/p&gt;
&lt;p&gt;Around 2018 I refreshed and got a 6th gen iPad. As a media consumption device, it was still great. But I was still concerned that I couldn't use it to &lt;em&gt;create&lt;/em&gt; in the ways I was interested in. Then I learned about &lt;a href="https://blink.sh" title="Blink Shell"&gt;Blink shell&lt;/a&gt;, a terminal emulator that launched in 2017. Running a &lt;em&gt;Blink&lt;/em&gt; on an iPad with an attached external keyboard turned it into the best 80&amp;rsquo;s-style thin client that could &lt;em&gt;never&lt;/em&gt; have existed back in the 80&amp;rsquo;s. Coupled with &lt;code&gt;mosh&lt;/code&gt; and &lt;code&gt;tmux&lt;/code&gt;, as long as I had an internet connection, I could do &lt;em&gt;work&lt;/em&gt;. An aside: I'd also observe that my dependency on &lt;em&gt;Blink shell&lt;/em&gt; is co-mingled with using &lt;em&gt;Emacs&lt;/em&gt; and in particular &lt;code&gt;emacsclient&lt;/code&gt; over the years.&lt;/p&gt;
&lt;p&gt;Since then, it&amp;rsquo;s a rare day that I don&amp;rsquo;t use my iPad.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Noted with chagrin that with the above, I&amp;rsquo;ve turned my laptop into a server.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Outside of some file data, most all the data state that I work with is &amp;ldquo;cloud&amp;rdquo;-based.&lt;/p&gt;
&lt;p&gt;I rarely deal with manual data sync (outside of git repos) across multiple clients (laptops, desktops, tablets, phones). Most all of the data sync I use is automatically managed at the application level.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="mobile"/><category term="tablet"/><category term="software"/><category term="dev"/></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;p&gt;&lt;strong&gt;Addendum - Tuesday March 31, 2026&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Most of the Elisp in this post is now available as a package named Anju. Read more about it in the post "&lt;a href="http://yummymelon.com/devnull/announcing-anju.html"&gt;Announcing Anju&lt;/a&gt;".&lt;/p&gt;
&lt;hr/&gt;

&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><entry><title>Introducing regfmt</title><link href="http://yummymelon.com/devnull/introducing-regfmt.html" rel="alternate"/><published>2022-10-25T11:31:00-07:00</published><updated>2022-10-25T11:31:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2022-10-25:/devnull/introducing-regfmt.html</id><summary type="html">&lt;p&gt;Introducing regfmt - a command line utility to generate SVG diagrams for control register-style data formats&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="img" src="http://yummymelon.com/images/example_0001-github.svg"&gt;&lt;/p&gt;
&lt;p&gt;Sometimes a project you've had in the mental back burner for decades calls to you again, but this time you pay attention. So it is with &lt;strong&gt;regfmt&lt;/strong&gt;, a command line utility that I spent this past month working on.&lt;/p&gt;
&lt;h2&gt;Backstory&lt;/h2&gt;
&lt;p&gt;While I was in grad school back in the early 1990's the department had prescribed using the AT&amp;amp;T &lt;a href="https://www.troff.org"&gt;troff&lt;/a&gt; tools for writing papers. Among those tools was one called &lt;a href="https://github.com/arnoldrobbins/dformat"&gt;dformat&lt;/a&gt;, which enabled you to easily draw out control register-style data formats using a domain specific language (DSL).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;dformat&lt;/strong&gt; was a great tool for its time but over the years got consigned to bit rot and ultimately forgotten by many. Among the reasons for it being forgotten was that it only supported the &lt;strong&gt;troff&lt;/strong&gt; specific &lt;strong&gt;pic&lt;/strong&gt; drawing language and used a make-shift DSL for its input.&lt;/p&gt;
&lt;h2&gt;Today&lt;/h2&gt;
&lt;p&gt;The world moved on and settled on other tools for writing and drawing. That said, the fundamentals of computer design haven't changed and control registers are still a thing, so the need to draw them out is still a thing, and drawing them by hand is still painful.&lt;/p&gt;
&lt;p&gt;In the intervening time from the early '90s to 2022, I've run into times when I wished I had something like &lt;strong&gt;dformat&lt;/strong&gt; but &lt;em&gt;modern&lt;/em&gt; to use for writing technical documentation. What's modern you say? How about having:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a common vector graphics file format output such as &lt;code&gt;SVG&lt;/code&gt; which can then be easily converted to a raster format (&lt;code&gt;png&lt;/code&gt;, &lt;code&gt;jpg&lt;/code&gt;, etc.).&lt;/li&gt;
&lt;li&gt;an input specification that is based on a common data serialization language.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the early summer of 2022, I got to thinking about &lt;strong&gt;dformat&lt;/strong&gt; and how it could be re-imagined for today and realized wow, all the pieces I needed were there:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use &lt;a href="https://en.wikipedia.org/wiki/Scalable_Vector_Graphics"&gt;SVG&lt;/a&gt; for the output format&lt;/li&gt;
&lt;li&gt;Use &lt;a href="https://en.wikipedia.org/wiki/YAML"&gt;YAML&lt;/a&gt; for the input format&lt;/li&gt;
&lt;li&gt;Use &lt;a href="https://en.wikipedia.org/wiki/CSS"&gt;CSS&lt;/a&gt; to style the output&lt;/li&gt;
&lt;li&gt;Implement in &lt;a href="https://www.python.org"&gt;Python&lt;/a&gt; which has support for all of the above.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In October 2022, I found the cycles to go to work on this.&lt;/p&gt;
&lt;h2&gt;Announcing &lt;strong&gt;regfmt&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;regfmt&lt;/strong&gt; is a Python command line utility to generate SVG diagrams for control register-style data formats. It is inspired by the &lt;em&gt;dformat&lt;/em&gt; command from the &lt;em&gt;troff&lt;/em&gt; family of tools, however re-imagined using contemporary (circa 2022) file formats.&lt;/p&gt;
&lt;p&gt;Python installation:
PyPI:  &lt;a href="https://pypi.org/project/regfmt/"&gt;https://pypi.org/project/regfmt/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Source Repository:
GitHub: &lt;a href="https://github.com/kickingvegas/regfmt"&gt;https://github.com/kickingvegas/regfmt&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Example output of &lt;strong&gt;regfmt&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img alt="img" src="http://yummymelon.com/images/register-stair-left.svg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="http://yummymelon.com/images/register.svg"&gt;&lt;/p&gt;
&lt;h3&gt;Features&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;SVG output&lt;/li&gt;
&lt;li&gt;Modern configuration input file formats&lt;ul&gt;
&lt;li&gt;YAML for register configuration&lt;/li&gt;
&lt;li&gt;CSS for styling SVG output&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Try it out!&lt;/h2&gt;
&lt;p&gt;If you need a tool like this, please take the time to try it out. Any &lt;a href="https://github.com/kickingvegas/regfmt/issues" title="regfmt issue tracker"&gt;feedback&lt;/a&gt; would be appreciated!&lt;/p&gt;
&lt;h3&gt;Requirements&lt;/h3&gt;
&lt;p&gt;Python: ≧ 3.9 &lt;/p&gt;
&lt;h3&gt;Installation&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;regfmt&lt;/strong&gt; supports installation via &lt;a href="https://pypi.org/project/regfmt/"&gt;PyPI&lt;/a&gt;. Is is recommend that you do this in a Python virtual environment. &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="w"&gt; &lt;/span&gt;python3&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;venv&lt;span class="w"&gt; &lt;/span&gt;.venv
$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;.venv/bin/activate
&lt;span class="o"&gt;(&lt;/span&gt;.venv&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;regfmt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</content><category term="misc"/><category term="dev"/><category term="regfmt"/><category term="writing"/><category term="software"/><category term="computer"/><category term="unix"/></entry><entry><title>Sweeping dust and cobwebs</title><link href="http://yummymelon.com/devnull/sweeping-dust-and-cobwebs.html" rel="alternate"/><published>2022-09-22T15:18:00-07:00</published><updated>2022-09-22T15:18:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2022-09-22:/devnull/sweeping-dust-and-cobwebs.html</id><summary type="html">&lt;p&gt;Time passes.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Dang, time passes - it's been over &lt;em&gt;two&lt;/em&gt; years since I posted to this blog. Thinking about being more active here, but making no promises. That said, took the better part of today updating the blog software (&lt;a href="https://getpelican.com"&gt;https://getpelican.com&lt;/a&gt;) to be current. Surprisingly easy. &lt;/p&gt;</content><category term="misc"/><category term="maintenance"/><category term="dev"/></entry></feed>