<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>notes from /dev/null - software</title><link href="http://yummymelon.com/devnull/" rel="alternate"/><link href="http://yummymelon.com/devnull/feeds/tags/software.atom.xml" rel="self"/><id>http://yummymelon.com/devnull/</id><updated>2025-11-13T17:20:00-08:00</updated><entry><title>Thoughts on Funding Free Software Development</title><link href="http://yummymelon.com/devnull/thoughts-on-funding-free-software-development.html" rel="alternate"/><published>2025-11-13T17:20:00-08:00</published><updated>2025-11-13T17:20:00-08:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2025-11-13:/devnull/thoughts-on-funding-free-software-development.html</id><summary type="html">&lt;p&gt;“I don’t like to dream about getting paid.”&lt;/p&gt;</summary><content type="html">&lt;p&gt;“I have always depended on the kindness of strangers.” — Blanche Dubois from “A Streetcar Named Desire”, Tennessee Williams.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;DISCLAIMER: None of this post should be considered as financial or career advice of any kind. All views and opinions expressed here belong solely to Charles Y. Choi.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Not getting paid for making free software has long been recognized as a conundrum in the early 21st century, where much of its  discourse is trenchantly summarized by the xkcd drawing “Dependency” &lt;a href="#citeproc_bib_item_1"&gt;[1]&lt;/a&gt; shown below.&lt;/p&gt;
&lt;p align='center'&gt;
&lt;img src='http://yummymelon.com/devnull/images/funding-free-software/dependency.png' alt='' /&gt;
&lt;/p&gt;

&lt;p&gt;For some time I’ve been gathering my thoughts on this matter, with stances that I’ll share in this post today.&lt;/p&gt;
&lt;h1&gt;Fundamentals on Bringing a Product to Market&lt;/h1&gt;
&lt;p&gt;Before talking about software, let’s review the basic steps needed to bring a physical product to market.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Design &amp;amp; Development&lt;/p&gt;
&lt;p&gt;In this step, the intellectual construction of the product is defined.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Manufacture&lt;/p&gt;
&lt;p&gt;In this step the product is mass produced. This step must occur after step 1.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Distribution&lt;/p&gt;
&lt;p&gt;In this step the manufactured product is delivered. This step must occur after step 2.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Marketing&lt;/p&gt;
&lt;p&gt;In this step, awareness of the product to its target market is raised to induce demand for it. Ideally this step is taken when there is high confidence in delivering the product to the market.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support&lt;/p&gt;
&lt;p&gt;In this step, the producers provide support for the product after it has shipped. This step must occur after step 3.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For a physical product, each step has a monetary cost associated with it. If the producer wishes to make a profit by selling the product, the price of the product must be greater than the cost to produce it. This leads to the incentive to manufacture and distribute as many copies as possible to maximize profit. At scale, the dominant costs are manufacturing and distribution for a physical product.&lt;/p&gt;
&lt;h1&gt;Software is Different&lt;/h1&gt;
&lt;p&gt;If the product is software using internet distribution, then its costs for manufacture and distribution become effectively zero. For a software provider, the dominant costs to bring a product to market are design &amp;amp; development, marketing, and support. Such costs are largely fixed with respect to demand. Since software has no intrinsic manufacturing nor distribution cost, for-profit software must resort to creating artificial scarcity to justify (and protect) profit that scales with meeting demand. Tactics to create scarcity include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Constraining code to be closed-source.&lt;/li&gt;
&lt;li&gt;Distributing only executables, typically code-signed to a model of computer.&lt;/li&gt;
&lt;li&gt;Compilation-enforced licensing, typically tied to a subscription model.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;What about Free Software?&lt;/h1&gt;
&lt;p&gt;With that background in place, let’s talk about &lt;em&gt;free&lt;/em&gt; (both in speech and beer) software. In this post, I make no distinction between free (libre) and open source licensed software &lt;a href="#citeproc_bib_item_2"&gt;[2]&lt;/a&gt; as their differences fixate on the user’s ability to modify and redistribute received software. In contrast, this post views &lt;em&gt;free&lt;/em&gt; software through the lens of the costs required to deliver said software to the market as described above.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Free software requires that its distribution be zero-cost to users&lt;/strong&gt;. In contrast with for-profit software, free software evades the creation of artificial scarcity. In light of this, what options are available for developers who want to get paid for making free software? Here are three:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ask users to voluntarily give money after the software has been produced.&lt;/li&gt;
&lt;li&gt;Attach the developed software to a service or hardware-based business model.&lt;/li&gt;
&lt;li&gt;Get money upfront from users (or organizations) who have an interest in realizing some specific software, &lt;em&gt;before&lt;/em&gt; its design and development are completed.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The first option offers providers no financial incentive to make free software, nor offers a reliable path to cover the cost to make it.&lt;/p&gt;
&lt;p&gt;The second option relies on indirect compensation where the service or hardware revenue is expected to cover the cost of software development. Scarcity is imposed by restricting access to the service or hardware based on payment. This option is often taken by startups funded with venture capital.&lt;/p&gt;
&lt;p&gt;The third option offers direct financial incentive for the developer to create free software, as money is taken by the developer with the expectation that said software is delivered at a future date. With this option, the design &amp;amp; development step is what is considered scarce. Upfront funding can come in a variety of forms, but largely fall into the following patterns:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Institutional funding, where an organization puts up the funding.&lt;/li&gt;
&lt;li&gt;Angel funding, where a small group (&amp;lt; 5) of people contribute the funding.&lt;/li&gt;
&lt;li&gt;Crowdfunding, where a pool of small contributions from individuals (&amp;gt; 1,000) is gathered, typically with a target funding goal.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Which approach is taken can vary widely depending on the functionality of the software and the relationship (or lack thereof) between the developer and their benefactors. Note that getting money upfront to develop software &lt;em&gt;precludes gaining profit from it based on demand after it is made&lt;/em&gt;, as free software insists its distribution be zero-cost to users. The only avenue for developer profit in this case is to demand funding that exceeds the baseline cost of producing the software.&lt;/p&gt;
&lt;p&gt;Getting money upfront implies negotiation, which gives the developer agency to choose whether to commit to building the desired software. It also significantly raises risk to all involved parties if the software fails to be built.&lt;/p&gt;
&lt;p&gt;Upfront funding aligns the incentives for producers and consumers of software by having agreement on a future deliverable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Consumers pay to get the future software deliverable.&lt;/li&gt;
&lt;li&gt;Producers work to build the future software deliverable.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While the exact number is unknown, I think a safe presumption is that single developers have built the vast majority of free software packages as evidenced by the Linux, Emacs, Python, and Node ecosystems. Most all of them resort to appeals to user gratuity, which is not enough to actually cover the market cost of designing &amp;amp; developing that software.&lt;/p&gt;
&lt;p&gt;Given the above options for upfront funding, I’ll further make the assumption that most single developers do not have access to institutional nor angel funding. So, let's talk about crowdfunding.&lt;/p&gt;
&lt;h1&gt;Crowdfunding&lt;/h1&gt;
&lt;p&gt;The dominant cost to producing software is labor. A common project scope is a three month schedule with a single developer. Estimating a market rate salary of $10K/month, this results in a budget of $30K to deliver software at cost.&lt;/p&gt;
&lt;p&gt;Crowdfunding has proven to be successful in raising that level of funding, by mitigating risk to all participants by defining a funding goal. Typically a funding goal is set within a window of time. If the goal is not met, then patrons who already put money down will have their money returned and the producer is not committed to work on the software. With high demand, the goal can be met with potentially low financial risk to an individual patron. For example, if 30,000 people gave $1, the above budget could be met.&lt;/p&gt;
&lt;p&gt;Reaching those 30,000 people is another thing altogether, as crowdfunding is an exercise in &lt;em&gt;marketing&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;To have a successful crowdfunding campaign, the producer must deliver a message about a future software product that is compelling enough to create demand for it. Common tasks undertaken to make a crowdfunding campaign include producing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A video describing the envisioned product.&lt;/li&gt;
&lt;li&gt;Marketing copy for said envisioned product published on web, possibly print.&lt;/li&gt;
&lt;li&gt;Brand merchandise for patrons.&lt;ul&gt;
&lt;li&gt;Order taking&lt;/li&gt;
&lt;li&gt;Fulfillment&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Press campaign.&lt;/li&gt;
&lt;li&gt;Social media campaign.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that the success of the crowdfunding campaign will depend on how effective its message is to the target audience. Each audience is bespoke, meaning that not all things successful for one crowdfunding campaign can be applied to another. Invariably, the software producer must know their audience.&lt;/p&gt;
&lt;p&gt;Single developers producing free software might look at the above and say “nope.” Most certainly it is a lot of work, much of which is perhaps outside the comfort level of persons whose focus has only been on coding. It is also not a common practice to use crowdfunding to support free (libre) or open source development. Regardless, if a developer wishes to be paid to work on free software, they will need to get comfortable with pitching their work beforehand to get the funding to do it. Wider-scale use of crowdfunding could bring better agency to the developer and enable the development of larger scope free software projects that would be untenable with volunteer time.&lt;/p&gt;
&lt;h1&gt;Observations and Closing Thoughts&lt;/h1&gt;
&lt;p&gt;This post has been a distillation of my thinking about free software and how it can be sustainably funded. From this exercise are some of my personal observations:&lt;/p&gt;
&lt;p&gt;If you have a software idea that you want to distribute for free, determine as soon as possible if you want to get paid to make it.&lt;/p&gt;
&lt;p&gt;If you don’t care about getting paid, ever, for that work, then GO MAKE IT! Be thankful for whatever gratuity you get from it.&lt;/p&gt;
&lt;p&gt;If you do care about getting paid to make the idea, then explore what funding model fits best for the idea. At this point, DO NOT MAKE THE IDEA AND PUBLISH IT.&lt;/p&gt;
&lt;p&gt;If you get funding, GO MAKE THE THING. MAKE PEOPLE HAPPY.&lt;/p&gt;
&lt;p&gt;If you don’t get funding, let it rest. Move on to the next idea.&lt;/p&gt;
&lt;p&gt;If you already produced free software that was built without funding, accept that you will never recover your development cost.&lt;/p&gt;
&lt;p&gt;To reiterate, free software requires that its distribution be zero-cost to users. This is excellent for user freedom but comes at the expense of agency for developers: Users can not be compelled to pay developers for their already published work. Developers can however make new features and fixes contingent on funding. I think this position is fair and defensible for the obvious reason that software developers must pay for the costs of living in a material world.&lt;/p&gt;
&lt;p&gt;If you’ve made to here, thanks for reading! Feel free to share your thoughts about this post on &lt;a href="https://sfba.social/@kickingvegas/115545442516504660"&gt;Mastodon&lt;/a&gt; or &lt;a href="https://www.reddit.com/r/emacs/comments/1owj8zo/thoughts_on_funding_free_software_development/?utm_source=share&amp;amp;utm_medium=web3x&amp;amp;utm_name=web3xcss&amp;amp;utm_term=1&amp;amp;utm_content=share_button"&gt;Reddit&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;style&gt;.csl-left-margin{float: left; padding-right: 0em;}
 .csl-right-inline{margin: 0 0 0 1em;}&lt;/style&gt;
&lt;div class="csl-bib-body"&gt;
  &lt;div class="csl-entry"&gt;&lt;a id="citeproc_bib_item_1"&gt;&lt;/a&gt;
    &lt;div class="csl-left-margin"&gt;[1]&lt;/div&gt;&lt;div class="csl-right-inline"&gt;R. Munroe, “Dependency,” Aug. 17, 2020. Available: &lt;a href="https://xkcd.com/2347/"&gt;https://xkcd.com/2347/&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="csl-entry"&gt;&lt;a id="citeproc_bib_item_2"&gt;&lt;/a&gt;
    &lt;div class="csl-left-margin"&gt;[2]&lt;/div&gt;&lt;div class="csl-right-inline"&gt;R. Stallman, “Why open source misses the point of free software - gnu project - free software foundation,” 2024. Available: &lt;a href="https://www.gnu.org/philosophy/open-source-misses-the-point.en.html"&gt;https://www.gnu.org/philosophy/open-source-misses-the-point.en.html&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;</content><category term="misc"/><category term="emacs"/><category term="software"/><category term="musings"/></entry><entry><title>Elisp Cheatsheet for Python Programmers</title><link href="http://yummymelon.com/devnull/elisp-cheatsheet-for-python-programmers.html" rel="alternate"/><published>2025-02-05T11:50:00-08:00</published><updated>2025-02-05T11:50:00-08:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2025-02-05:/devnull/elisp-cheatsheet-for-python-programmers.html</id><summary type="html">&lt;p&gt;Started a WIP cheatsheet showing translations of Python code to Emacs Lisp. Pushing this out in the wild.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Late last December (although given events of late it feels like a decade ago) I asked on Mastodon the following question:&lt;/p&gt;
&lt;blockquote class="mastodon-embed" data-embed-url="https://sfba.social/@kickingvegas/113723373781728507/embed" style="background: #FCF8FF; border-radius: 8px; border: 1px solid #C9C4DA; margin: 0; max-width: 540px; min-width: 270px; overflow: hidden; padding: 0;"&gt; &lt;a href="https://sfba.social/@kickingvegas/113723373781728507" target="_blank" style="align-items: center; color: #1C1A25; display: flex; flex-direction: column; font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', Roboto, sans-serif; font-size: 14px; justify-content: center; letter-spacing: 0.25px; line-height: 20px; padding: 24px; text-decoration: none;"&gt; &lt;svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 79 75"&gt;&lt;path d="M74.7135 16.6043C73.6199 8.54587 66.5351 2.19527 58.1366 0.964691C56.7196 0.756754 51.351 0 38.9148 0H38.822C26.3824 0 23.7135 0.756754 22.2966 0.964691C14.1319 2.16118 6.67571 7.86752 4.86669 16.0214C3.99657 20.0369 3.90371 24.4888 4.06535 28.5726C4.29578 34.4289 4.34049 40.275 4.877 46.1075C5.24791 49.9817 5.89495 53.8251 6.81328 57.6088C8.53288 64.5968 15.4938 70.4122 22.3138 72.7848C29.6155 75.259 37.468 75.6697 44.9919 73.971C45.8196 73.7801 46.6381 73.5586 47.4475 73.3063C49.2737 72.7302 51.4164 72.086 52.9915 70.9542C53.0131 70.9384 53.0308 70.9178 53.0433 70.8942C53.0558 70.8706 53.0628 70.8445 53.0637 70.8179V65.1661C53.0634 65.1412 53.0574 65.1167 53.0462 65.0944C53.035 65.0721 53.0189 65.0525 52.9992 65.0371C52.9794 65.0218 52.9564 65.011 52.9318 65.0056C52.9073 65.0002 52.8819 65.0003 52.8574 65.0059C48.0369 66.1472 43.0971 66.7193 38.141 66.7103C29.6118 66.7103 27.3178 62.6981 26.6609 61.0278C26.1329 59.5842 25.7976 58.0784 25.6636 56.5486C25.6622 56.5229 25.667 56.4973 25.6775 56.4738C25.688 56.4502 25.7039 56.4295 25.724 56.4132C25.7441 56.397 25.7678 56.3856 25.7931 56.3801C25.8185 56.3746 25.8448 56.3751 25.8699 56.3816C30.6101 57.5151 35.4693 58.0873 40.3455 58.086C41.5183 58.086 42.6876 58.086 43.8604 58.0553C48.7647 57.919 53.9339 57.6701 58.7591 56.7361C58.8794 56.7123 58.9998 56.6918 59.103 56.6611C66.7139 55.2124 73.9569 50.665 74.6929 39.1501C74.7204 38.6967 74.7892 34.4016 74.7892 33.9312C74.7926 32.3325 75.3085 22.5901 74.7135 16.6043ZM62.9996 45.3371H54.9966V25.9069C54.9966 21.8163 53.277 19.7302 49.7793 19.7302C45.9343 19.7302 44.0083 22.1981 44.0083 27.0727V37.7082H36.0534V27.0727C36.0534 22.1981 34.124 19.7302 30.279 19.7302C26.8019 19.7302 25.0651 21.8163 25.0617 25.9069V45.3371H17.0656V25.3172C17.0656 21.2266 18.1191 17.9769 20.2262 15.568C22.3998 13.1648 25.2509 11.9308 28.7898 11.9308C32.8859 11.9308 35.9812 13.492 38.0447 16.6111L40.036 19.9245L42.0308 16.6111C44.0943 13.492 47.1896 11.9308 51.2788 11.9308C54.8143 11.9308 57.6654 13.1648 59.8459 15.568C61.9529 17.9746 63.0065 21.2243 63.0065 25.3172L62.9996 45.3371Z" fill="currentColor"/&gt;&lt;/svg&gt; &lt;div style="color: #787588; margin-top: 16px;"&gt;Post by @kickingvegas@sfba.social&lt;/div&gt; &lt;div style="font-weight: 500;"&gt;View on Mastodon&lt;/div&gt; &lt;/a&gt; &lt;/blockquote&gt;
&lt;script data-allowed-prefixes="https://sfba.social/" async src="https://sfba.social/embed.js"&gt;&lt;/script&gt;

&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;It seemed like such a thing didn't exist. So I set about trying to remedy this situation and started writing an &lt;a href="https://github.com/kickingvegas/elisp-for-python"&gt;Elisp Cheatsheet for Python Programmers&lt;/a&gt;. It's published as a README.org on GitHub. It's very much a work in progress, but there's enough there to help me translate my working knowledge of Python (as well as Swift and Objective-C) to Elisp. I'm putting this out in the wild because perhaps others will find this similarly useful.&lt;/p&gt;</content><category term="misc"/><category term="emacs"/><category term="python"/><category term="software"/></entry><entry><title>Automatically adjusting Emacs to macOS switches in appearance</title><link href="http://yummymelon.com/devnull/automatically-adjusting-emacs-to-macos-switches-in-appearance.html" rel="alternate"/><published>2023-06-04T11:36:00-07:00</published><updated>2023-06-04T11:36:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2023-06-04:/devnull/automatically-adjusting-emacs-to-macos-switches-in-appearance.html</id><summary type="html">&lt;p&gt;How to support macOS appearance changes automatically.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Count me among those who likes using the &lt;em&gt;Auto&lt;/em&gt; setting when adjusting the appearance in macOS to either light or dark. Native macOS apps that are coded accordingly can automatically adjust as well, and it turns out that the Yamamoto Mitsuharu fork of &lt;a href="https://bitbucket.org/mituharu/emacs-mac/src/master/"&gt;Emacs&lt;/a&gt; (aka emacs-mac-app) can do this too. But with emacs-mac-app, just because it can detect the appearance change doesn&amp;rsquo;t mean that all the themes or faces will adjust accordingly too. As such it is typically up to the user to write a pair of custom light and dark mode functions to invoke when the appearance change happens.&lt;/p&gt;
&lt;p&gt;For quite some time I&amp;rsquo;ve been calling these appearance mode functions manually &lt;em&gt;like an animal&lt;/em&gt;. Then I recently learned that &lt;code&gt;mac-effective-appearance-change-hook&lt;/code&gt; is a thing.&lt;/p&gt;
&lt;p&gt;This hook gets invoked upon a macOS appearance change, so it becomes straightforward to write a hook function that tests for the &lt;code&gt;:appearance&lt;/code&gt; property returned by&lt;br/&gt; &lt;code&gt;(mac-application-state)&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;
&lt;span class="normal"&gt;7&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cc/reconfigure-nsappearance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;appearance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;plist-get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;mac-application-state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;:appearance&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;string-equal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;appearance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;NSAppearanceNameDarkAqua&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;cc/dark-mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;cc/light-mode&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;add-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;mac-effective-appearance-change-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;cc/reconfigure-nsappearance&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A caveat though: the above code will &lt;em&gt;only&lt;/em&gt; work with the Yamamoto fork of Emacs for macOS.  As of now there seems to be no consensus on how to handle OS-level appearance changes by Emacs core. That said, if the above works for you, then no more manual appearance change calls!&lt;/p&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kickingvegas/cclisp/blob/5ace8e5e5759bba01dffad6da899374f3214eac7/cc-appearance.el#L76"&gt;Elisp code for cc/reconfigure-nsappearance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Where to get emacs-mac-app:&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ports.macports.org/port/emacs-mac-app/"&gt;MacPorts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/railwaycat/homebrew-emacsmacport"&gt;Homebrew&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="emacs"/><category term="dev"/><category term="elisp"/><category term="software"/><category term="macos"/></entry><entry><title>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>The sad state of the Twitch app on Apple TV</title><link href="http://yummymelon.com/devnull/the-sad-state-of-the-twitch-app-on-apple-tv.html" rel="alternate"/><published>2023-05-21T15:28:00-07:00</published><updated>2023-05-21T15:28:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2023-05-21:/devnull/the-sad-state-of-the-twitch-app-on-apple-tv.html</id><summary type="html">&lt;p&gt;Twitch could do better. They won't.&lt;/p&gt;</summary><content type="html">&lt;p&gt;It's stunning to me how much contempt the most relatively recent Twitch Apple TV app update/rewrite has for the platform it runs on and somehow still passes App Store review. Can't follow raids, terrible latency, broken network synchronization, no AirPlay support to other devices like HomePod, and no support for keyboard entry (either software or hardware) for chats. Such wasted potential.&lt;/p&gt;</content><category term="misc"/><category term="software"/><category term="client-server"/><category term="pwa"/></entry><entry><title>Captee available on the Mac App Store</title><link href="http://yummymelon.com/devnull/captee-available-on-the-mac-app-store.html" rel="alternate"/><published>2023-04-10T15:04:00-07:00</published><updated>2023-04-10T15:04:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2023-04-10:/devnull/captee-available-on-the-mac-app-store.html</id><summary type="html">&lt;p&gt;Captee available on the Mac App Store. Go get it.&lt;/p&gt;</summary><content type="html">&lt;p&gt;At long last, &lt;strong&gt;Captee&lt;/strong&gt; is available on the &lt;a href="https://apps.apple.com/us/app/captee/id6446053750" title="Buy Captee on the App Store"&gt;Mac App Store&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Learn more about it 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="software"/><category term="macOS"/><category term="org mode"/><category term="markdown"/><category term="emacs"/></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;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>Odds and Ends</title><link href="http://yummymelon.com/devnull/odds-and-ends.html" rel="alternate"/><published>2022-09-23T13:19:00-07:00</published><updated>2022-09-23T13:19:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2022-09-23:/devnull/odds-and-ends.html</id><summary type="html">&lt;p&gt;Dang, &lt;em&gt;nine&lt;/em&gt; years? Some random news about me, maybe I'll delve deeper in future posts.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Wow, so much to call out over the past &lt;em&gt;nine&lt;/em&gt; years that I have &lt;em&gt;not&lt;/em&gt; posted here. It's a bit overwhelming to think on much less capture so I'll make some quick bullet points. Thinking I'll elaborate more on these points in future posts, but we'll see. 😏&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I officially left the employ of &lt;a href="https://tile.com"&gt;Tile&lt;/a&gt; on August 1, 2022. I started there as employee 2 in the summer of 2013 and was their first engineering &lt;a href="http://yummymelon.com/devnull/what-i-did-in-the-summer-of-2013.html"&gt;hire&lt;/a&gt;. I was brought on to architect and write the &lt;a href="https://apps.apple.com/app/id664939913"&gt;Tile app for iOS&lt;/a&gt; which was achieved to successful effect.&lt;/li&gt;
&lt;li&gt;Wow we had a GLOBAL PANDEMIC. It was and still is awful.&lt;/li&gt;
&lt;li&gt;Bicycling is my primary mode of transportation now.&lt;/li&gt;
&lt;li&gt;Combining pandemic living and bicycling, I started routinely posting photos of San Francisco from my bike rides on &lt;a href="https://www.instagram.com/kickingvegas/"&gt;Instagram/Facebook (Meta)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;I use &lt;a href="https://www.gnu.org/software/emacs/"&gt;Emacs&lt;/a&gt; and in particular &lt;a href="https://orgmode.org/features.html"&gt;Org Mode&lt;/a&gt; daily. Profoundly life-changing, and that's understating their impact.&lt;/li&gt;
&lt;li&gt;In late 2017, I let &lt;a href="https://konmari.com" title="KonMari"&gt;Marie Kondō&lt;/a&gt; in my life and combined with &lt;em&gt;Org Mode&lt;/em&gt;, they markedly improved it.&lt;/li&gt;
&lt;li&gt;Immersed in DJ culture again (especially thanks to &lt;a href="https://www.twitch.tv"&gt;Twitch&lt;/a&gt;), especially over the past two years. So grateful for my years DJing at &lt;a href="https://www.wtju.net"&gt;WTJU&lt;/a&gt; that started it all.&lt;/li&gt;
&lt;li&gt;My French-style omelet game now is undefeated.&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Life"/><category term="Work"/><category term="Music"/><category term="DJ"/><category term="Software"/></entry><entry><title>Quick Update</title><link href="http://yummymelon.com/devnull/quick-update.html" rel="alternate"/><published>2013-05-08T10:48:00-07:00</published><updated>2013-05-08T10:48:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2013-05-08:/devnull/quick-update.html</id><summary type="html">&lt;p&gt;Quick Update - May 8, 2013&lt;/p&gt;</summary><content type="html">&lt;p&gt;Quick update on yours truly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Been working quite a bit on &lt;a href="http://kickingvegas.github.io/YmsCoreBluetooth/"&gt;YmsCoreBluetooth&lt;/a&gt;. If you're an iOS dev and want to play with Bluetooth Low Energy, check it out. Contributions are welcome as well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Got a WWDC 2013 ticket. See you in San Francisco this June. &lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Ephemera"/><category term="iOS"/><category term="Software"/></entry><entry><title>Static Blog Generation: 9 Weeks In</title><link href="http://yummymelon.com/devnull/static-blog-generation-9-weeks-in.html" rel="alternate"/><published>2013-04-28T16:49:00-07:00</published><updated>2013-04-28T16:49:00-07:00</updated><author><name>Charles Choi</name></author><id>tag:yummymelon.com,2013-04-28:/devnull/static-blog-generation-9-weeks-in.html</id><summary type="html">&lt;p&gt;Thoughts after 9 weeks of using Pelican to statically generate a blog.&lt;/p&gt;</summary><content type="html">&lt;p&gt;9 weeks in using &lt;a href="http://getpelican.com"&gt;Pelican&lt;/a&gt; to generate my blog and so far I dig it: I've been able to write more and write better with it.&lt;/p&gt;
&lt;p&gt;Thinking about why, the reasons come down to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Being able to define and automate your own workflows.&lt;/li&gt;
&lt;li&gt;Being able to use Markdown to format your source files.&lt;/li&gt;
&lt;li&gt;Easy customization (especially if you have a background in Python, templating and web development).&lt;/li&gt;
&lt;li&gt;Using source code control (git in my case) to manage/sanity check what you post.&lt;/li&gt;
&lt;li&gt;It's fast. Having worked with Python web frameworks like Zope (and Plone later on), TurboGears, and Django, it's easy to get stuff initially up and running but the price you pay is slow run-time performance, especially for content that doesn't need to be dynamic in the first place. Not all content needs to be stashed in a database.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Static blog generation with a tool like Pelican is not for everybody: you really need to be comfortable with working like a software developer. But if you're already there then you'll likely find yourself pleased with it.&lt;/p&gt;</content><category term="misc"/><category term="Software"/><category term="Blog"/><category term="Pelican"/></entry></feed>