<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>hi, it&#39;s mike</title>
    <link>https://mike.puddingtime.org/tags/plaintext/</link>
    <description>Recent content on hi, it&#39;s mike</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <managingEditor>mike@puddingtime.org (mike)</managingEditor>
    <webMaster>mike@puddingtime.org (mike)</webMaster>
    <copyright>© 2026, mike</copyright>
    <lastBuildDate>Mon, 22 May 2023 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://mike.puddingtime.org/tags/plaintext/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>More plaintext primitivism with Denote</title>
      <link>https://mike.puddingtime.org/posts/2023-05-22-more-plaintext-primitivism-with-denote/</link>
      <pubDate>Mon, 22 May 2023 00:00:00 +0000</pubDate><author>mike@puddingtime.org (mike)</author>
      <guid>https://mike.puddingtime.org/posts/2023-05-22-more-plaintext-primitivism-with-denote/</guid>
      <description>Denote wants you to stick with the native tools you already have for a stripped-down PKM system.</description>
      <content:encoded><![CDATA[<p><a href="https://github.com/protesilaos/denote">Denote</a> is a note-taking package for Emacs I find sort of interesting because its creator is trying very hard to make something that is structured and can provide some of the affordances we&rsquo;re all coming to expect from <a href="https://www.reddit.com/r/PKMS/comments/nfef59/list_of_personal_knowledge_management_systems/">PKMs</a> without requiring a bunch of extra overhead: At the content level he wants you to use existing file types and markup languages (org, Markdown), and at the management/search level he wants you to use existing Emacs tools, like <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html">dired</a> in combination with a file naming scheme that incorporates title, date, and tags into the filename.</p>
<p>It doesn&rsquo;t toss you into the plaintext-n-filesystem primitivist deep end on your own. It comes with a dired mode that fontifies based on its own filenaming convention, so what seems like it could be super ungainly is actually pretty easy to scan in practice:</p>
<figure><img src="/img/denote_dired.jpg"
    alt="Screenshot of files colorized by their datestamp, title, and tags in Emacs dired"><figcaption>
      <h4>dired in denote-dired-mode</h4>
    </figcaption>
</figure>

<p>&hellip; and it has a collection of functions that let you add/remove keywords, rename files using its naming convention, etc.  There are even a few next-level sorts of things, such as the ability to create content &ldquo;silos,&rdquo; so you can set up a note directory for personal stuff, work stuff, etc. without clashing label namespaces and other things that come up when you have to manage a few discrete areas with the same tool.</p>
<p>As &ldquo;what would my exit plan be&rdquo; tools go, this one is pretty good, given It&rsquo;s All Just Text with no particularly difficult conventions.</p>
<p>It was trivial to move a bunch of notes into a directory, use Denote&rsquo;s built-in tools to convert them to the proper naming convention, and start using it. It took under a minute to convert a function I cribbed from org-roam&rsquo;s forums to use ripgrep to provide fulltext search:</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span class="line"><span class="cl"><span class="p">(</span><span class="nb">defun</span> <span class="nv">mph/denote-rg-search</span> <span class="p">()</span>
</span></span><span class="line"><span class="cl">  <span class="s">&#34;Search denote directory using consult-ripgrep. With live-preview.&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">(</span><span class="nb">interactive</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="p">(</span><span class="nb">let</span> <span class="p">((</span><span class="nv">consult-ripgrep-command</span> <span class="s">&#34;rg --null --smart-case --type org --line-buffered --color=always --max-columns=500 --no-heading --line-number . -e ARG OPTS&#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    <span class="p">(</span><span class="nv">consult-ripgrep</span> <span class="nv">denote-directory</span><span class="p">)))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nv">map!</span> <span class="nb">:leader</span>
</span></span><span class="line"><span class="cl">      <span class="p">(</span><span class="nb">:prefix-map</span> <span class="p">(</span><span class="s">&#34;n&#34;</span> <span class="o">.</span> <span class="s">&#34;notes&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">      <span class="p">(</span><span class="nb">:prefix</span> <span class="p">(</span><span class="s">&#34;D&#34;</span> <span class="o">.</span> <span class="s">&#34;Denote&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">       <span class="nb">:desc</span> <span class="s">&#34;ripgrep&#34;</span> <span class="s">&#34;/&#34;</span> <span class="nf">#&#39;</span><span class="nv">mph/denote-rg-search</span><span class="p">)))</span></span></span></code></pre></div>
<p>The obvious comparisons in the Emacs ecosystem are <a href="https://github.com/jrblevin/deft">Deft</a> and <a href="https://www.orgroam.com">org-roam</a>. I haven&rsquo;t given Deft much time. I&rsquo;ve used org-roam more. I like Denote&rsquo;s lack of a dependency on a database. I don&rsquo;t know how Denote will compare in terms of scale if it&rsquo;s all filesystem-and-native-tools.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Daily Notes for 2023-05-19</title>
      <link>https://mike.puddingtime.org/posts/2023-05-19-daily-notes/</link>
      <pubDate>Fri, 19 May 2023 00:00:00 +0000</pubDate><author>mike@puddingtime.org (mike)</author>
      <guid>https://mike.puddingtime.org/posts/2023-05-19-daily-notes/</guid>
      <description>Helping org-edna out when you&amp;rsquo;re using BeOrg and the limits of hyper-automated plaintext primitivism.</description>
      <content:encoded><![CDATA[<h2 id="using-beorg-with-org-gtd-org-edna">Using BeOrg with org-gtd/org-edna</h2>
<p>So, org-gtd makes heavy use of org-edna:</p>
<p>When you&rsquo;re working down a project&rsquo;s todos, each time one flips to <code>DONE</code> it triggers org-edna to move the next task into a <code>NEXT</code> state. So far so good and awesome if you&rsquo;re just using Emacs.</p>
<p>If you&rsquo;re out and about with your iPhone (or Orgzly, or whatever) and do not have a full Emacs environment, any state changes to a todo item won&rsquo;t have org-edna there to monitor and make the needed state changes for the next item.</p>
<p>Today, for instance, I am going to be out and about running a few errands that include picking some things up that I need to complete a few projects. I have a custom view set up in BeOrg to show me my <code>@errands</code> items in <code>NEXT</code> state. When I stop by the motorcycle shop to pick up a battery for my Grom, I&rsquo;ll want to tick that errand off as <code>DONE</code>. Because org-edna isn&rsquo;t there, the next item in the &ldquo;Get the Grom ready for summer&rdquo; project won&rsquo;t flip into a <code>NEXT</code> state, and org-gtd&rsquo;s handy &ldquo;next actions&rdquo; agenda list will lose track of the project (unless I explicitly check for stuck projects &ndash; projects with no item in a <code>NEXT</code> state.)</p>
<p><a href="https://appsonthemove.freshdesk.com/support/discussions/topics/14000019608?page=1">David Masterson on the BeOrg user forum</a> was grappling with the same problem and suggested a pretty good idea: Adding a transitional TODO state to BeOrg that you&rsquo;d then manually flip to <code>DONE</code> once sitting in front of Emacs on a real computer. That&rsquo;d then trigger org-edna and your list automation would be back on track. He proposed <code>PRE-DONE</code>, I just went with <code>BEDONE</code>:</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span class="line"><span class="cl"><span class="p">(</span><span class="nb">defun</span> <span class="nv">mph/org-change-bedone-to-done</span> <span class="p">()</span>
</span></span><span class="line"><span class="cl">  <span class="s">&#34;Change all &#39;BEDONE&#39; states to &#39;DONE&#39; in current buffer.&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">(</span><span class="nb">interactive</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="p">(</span><span class="nb">save-excursion</span>
</span></span><span class="line"><span class="cl">    <span class="p">(</span><span class="nf">goto-char</span> <span class="p">(</span><span class="nf">point-min</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    <span class="p">(</span><span class="nb">while</span> <span class="p">(</span><span class="nf">re-search-forward</span> <span class="nv">org-heading-regexp</span> <span class="no">nil</span> <span class="no">t</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">      <span class="p">(</span><span class="nb">when</span> <span class="p">(</span><span class="nv">string=</span> <span class="p">(</span><span class="nv">org-get-todo-state</span><span class="p">)</span> <span class="s">&#34;BEDONE&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">(</span><span class="nv">org-todo</span> <span class="s">&#34;DONE&#34;</span><span class="p">)))))</span></span></span></code></pre></div>
<p>Then you&rsquo;d just want to automate <em>that</em>:</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span class="line"><span class="cl"><span class="p">(</span><span class="nv">add-hook</span> <span class="ss">&#39;org-mode-hook</span> <span class="ss">&#39;mph/org-change-bedone-to-done</span><span class="p">)</span></span></span></code></pre></div>
<p>The two additional bits of setup: Adding &ldquo;BEDONE&rdquo; to BeOrg&rsquo;s list of todo states, and making sure it is also in the TODO state list in  your Emacs config, or in the file you&rsquo;re going to operate on. If you just try to use &ldquo;BEDONE&rdquo; instead of &ldquo;DONE&rdquo; without blessing it as an actual TODO state, the function will treat it like arbitrary text and ignore it.</p>
<p>My Grom example is pretty simplistic: I&rsquo;m not going to forget I am trying to get the Grom ready for summer, and will eventually go looking for the rest of the project if I accidentally move it into a stuck, next-actionless state.  But the whole point of org-gtd &ndash; GTD generally &ndash; is that you want to remove as much &ldquo;holding stuff in your head&rdquo; as possible.</p>
<h2 id="the-limits-of-hyper-automated-plaintext-primtivism">The limits of hyper-automated plaintext primtivism</h2>
<p>For the record, yes, this is pushing things. All sorts of things. The limits of hyper-automated plaintext primitivism. The willful naivete of GTD as a method. My own laziness, because the other option is to just write this stuff down and stick it in my pocket on the way out the door, or to not use BeOrg interactively if I&rsquo;m going to have a bunch of desktop-only automation.</p>
<p>The only real defense I have right now is, &ldquo;it&rsquo;s fun.&rdquo;</p>
<p>The only way to keep having this kind of fun will eventually be to either become a primitivist hyper-automation plaintext fetishism influencer with no need to do things like &ldquo;direct corporate IT operations&rdquo; or &ldquo;lead product engineering groups;&rdquo; or to crowd out other things in my life that matter much, much more than relieving myself of the drudgery of manually changing TODO states in a plaintext file.</p>
<p>A friend asked, &ldquo;are you ready to go back?&rdquo;</p>
<p>Yeah &hellip; seven months in, three of which were very deliberate rest, the rest of which have involved a state of relaxed calm but the stochastic cadence of screenings, interviews, and panels &hellip; I am ready: Rested, as clear on my purpose in the workplace as I have been in a long time, and as clear on what I am getting for my time as I have ever been. Uncle Tupelo for the rest.</p>
<div style="text-align:center;">
<iframe width="560" height="315" src="https://www.youtube.com/embed/wQ9TxwlRoEU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Daily Notes for 2023-05-05</title>
      <link>https://mike.puddingtime.org/posts/2023-05-05-daily-notes/</link>
      <pubDate>Fri, 05 May 2023 00:00:00 +0000</pubDate><author>mike@puddingtime.org (mike)</author>
      <guid>https://mike.puddingtime.org/posts/2023-05-05-daily-notes/</guid>
      <description>Mac plainttext primitivism, Superkey, Bladerunner 2049 criticism, the end of Brydge.</description>
      <content:encoded><![CDATA[<h2 id="the-good-easy-desktop">The Good Easy desktop</h2>
<p>Years ago I came across a curious point of view about how to set up a Mac called &ldquo;<a href="https://web.archive.org/web/20011222123016/http:/www.winterspeak.com/columns/goodeasy.txt">The Good Easy</a>.&rdquo; It would be completely unacceptable to anyone I know working in tech, not because of its underlying principles, which are interesting, but because it presumes that it&rsquo;s okay to tell a new hire &ldquo;this is how you will use your computer.&rdquo; No, not &ldquo;this is how our team works together, figure out how to interface with it with your preferred toolkit,&rdquo; but &ldquo;do these exact things to your computer:&rdquo;</p>
<p>Stuff like:</p>
<blockquote>
<p>&hellip; in BBEdit, make sure it&rsquo;s set to softwrap, window width, start up with nothing, searches wrap around, don&rsquo;t print headers or date stamp, don&rsquo;t show any toolbars and make veggie the default font.</p>
</blockquote>
<p>and</p>
<blockquote>
<p>&hellip; keyboard control panel make the repeat rate as fast as possible and the delay as short as possible. Under options, assign f keys (7 netscape, 8 emailer, 9 bbedit, 10 now up to date)</p>
</blockquote>
<p>and</p>
<blockquote>
<p>&hellip; trash should be viewed as a list</p>
</blockquote>
<p>I think it burbled into my view during The Great Lifehack Explosion of the early aughts when WIRED did a little writeup, and I&rsquo;d guess it sparked interest because it was an OS9-era attempt to steer the Mac experience toward something more plaintext and keyboard-centric than was considered &ldquo;normal&rdquo; to people at the turn of the century. A Mac wasn&rsquo;t a thing, at that point, with a BSD userland or thousands of classic UNIX apps all tuned toward processing text.</p>
<p>Anyhow, as I think about my note-taking and <a href="https://mike.puddingtime.org/posts/2023-05-02-daily-notes/#my-org-contacts-file-and-things">what things belong where in it</a>, I think about that particular period in nerd culture: UNIX primitivists had Linux, but it was a hard thing to love when the answer to having both a working printer <em>and</em> the ability to burn CDs, <em>and</em> a working sound card was probably one custom kernel build to put the missing thing in, another custom build to put the thing back in you forget was &ldquo;just working&rdquo; for a reason, and maybe a third build just because you didn&rsquo;t follow the recipe.</p>
<p>OS X was interesting because you could listen to music, burn CDs, <em>and</em> send things to your printer without thinking about it too hard. (Well, for some reason printing to shared printers on  early OS X didn&rsquo;t work well when I had <a href="https://en.wikipedia.org/wiki/Wired_Equivalent_Privacy">WEP</a> enabled on my 802.11b network.) But there was also that interesting layer underneath &hellip; <a href="https://mike.puddingtime.org/posts/2023-04-27-were-you-to-attempt-this-with-applescript/">plaintext land</a>.</p>
<h2 id="superkey">Superkey</h2>
<p>Yesterday I wrote a little about <a href="/posts/2023-05-04-daily-notes/#charmstone">Charmstone</a>, a task switching alternative by <a href="https://ryanhanson.dev">Ryan Hanson</a>, who makes a lot of interesting little UI enhancers with a focus that&rsquo;s a little on keyboard centricity but also just generally reducing motion. He also makes <a href="https://superkey.app">Superkey</a>, which is adjacent to things like <a href="https://github.com/philc/vimium">Vimium</a>, which try to bring the &ldquo;stay on the home row as much as possible&rdquo; paradigm to the UI beyond your text editor. I&rsquo;ve been using <a href="https://github.com/televator-apps/vimari">Vimari</a>, a Vimium port for Safari;  and also <a href="https://www.homerow.app">Homerow</a>, which does the same thing for the entire Mac UI: Decorates every link or UI element with a tag of one or two letters you can type to jump to a given  element without using a mouse.</p>
<p>Superkey is the same idea: You have a screen full of menus, links, and buttons and you&rsquo;d rather not take your hands off the keyboard to get around, so you tap a hotkey (I mapped it to my right option key) and get a search field. Unlike Vimium et all, it doesn&rsquo;t label all the UI elements, but rather begins to select the names of things as you type them. You can use the tab or semicolon key to go to the next match. Once you&rsquo;re on the element you want to be on, you tap return to activate it.</p>
<p>The drawback of this approach compared to Vimium or other UI labeling solutions is that you probably have to type more. The advantage is that the UI isn&rsquo;t completely covered with labels. For instance, here&rsquo;s the front page of reddit with Vimari&rsquo;s find mode activated:</p>
<figure><img src="/img/vimari_reddit.jpg"
    alt="A browser screenshot with all the many links on reddit&#39;s front page tagged for navigation"><figcaption>
      <h4>Vimari on reddit&#39;s front page</h4>
    </figcaption>
</figure>

<p>On the other hand, here&rsquo;s Superkey (searching for &ldquo;hledger.&rdquo;)</p>
<figure><img src="/img/superkey_screen.jpg"
    alt="A screenshot of the reddit front page with a floating search field and a green line pointing to matching text"><figcaption>
      <h4>Superkey searching for &#34;hledger&#34;</h4>
    </figcaption>
</figure>

<p>On a less cluttered page, the difference isn&rsquo;t huge. On a page like reddit, with a ton of little controls masquerading as &ldquo;links&rdquo; all crowded in around each other, the &ldquo;label everything, let the user sort it out&rdquo; is pretty disorienting and sometimes simply gets in the way: Do I want <code>va</code> or <code>vz</code>? I can&rsquo;t always tell.</p>
<p>Maybe more interesting (but I&rsquo;m nowhere near using it enough at this point to know if it&rsquo;s a good idea) is the possibility with Superkey that I could use it for things besides alighting on a UI control of some kind:</p>
<figure><img src="/img/superkey-superkey.jpg"
    alt="Superkey searching for the word &#34;superkey&#34; in Emacs"><figcaption>
      <h4>Superkey searching in Emacs</h4>
    </figcaption>
</figure>

<h2 id="ryan-gosling-and-the-baseline-scene-in-bladerunner-2049">Ryan Gosling and the &ldquo;baseline&rdquo; scene in Bladerunner 2049</h2>
<p>I really loved this   <a href="https://cohost.org/mcc/post/178201-the-baseline-scene">deep read of <em>Bladerunner 2049</em> and the baseline scene</a>, and how Ryan Gosling brought an acting exercise to his characterization of K.</p>
<blockquote>
<p>The point of the baseline test is not to fail inhumans. The culture has already decided that K is subhuman. The baseline is testing to see if someone marked as inhuman is becoming human. The baseline text, like the questions, has heavy emotional content. The environment of the baseline test is designed to maximize stress; alone in a cold white cell, the interrogator harshly barking the questions, the testee unsettled by the alien noises and unblinking eye of the monitoring equipment. It would be nearly impossible to be in that environment and not have an emotional response. But the culture has decided that replicants do not have emotional responses. The state wants dispassionate murderers for its executioners, the economy demands uncomplaining workers. The perceived emotional shortcomings of the replicants have become part of their assigned social function. So a replicant which responds to circumstances like a human is declared defective and destroyed. The culture does not even think of it as a punishment. A part is malfunctioning and it gets replaced.</p>
</blockquote>
<p>Some really good thoughts about how Ridley Scott&rsquo;s <em>Bladerunner</em> understood and misunderstood Philip K. Dick&rsquo;s preoccupations, and how Villeneuve brings the story back to the source.</p>
<p>Made me want to go back and rewatch both, and re-read the source material, which is a mark of engaging criticism.</p>
<h2 id="the-downfall-of-brydge">The downfall of Brydge</h2>
<p>I was a relatively early Brydge customer, and felt there was no way the reviewers who had early units were being thorough. The keyboards were mushy and missed keystrokes because something was wrong with the Bluetooth, and they were physically uncomfortable devices to use when transitioning from keyboard to touch.</p>
<p>So I don&rsquo;t feel surprised to <a href="https://9to5mac.com/2023/05/04/brydge-keyboards-out-of-business-update/">read that they&rsquo;re done.</a> I wouldn&rsquo;t have even before Apple decided to get into the &ldquo;make an iPad a quasi-laptop&rdquo; game for itself.</p>
<p>I&rsquo;m not sure why I&rsquo;m linking to this, except to say Brydge always felt to me like it was emblematic of  a sort of superficiality in tech product reviews. It looked cool, and for a certain kind of gadget person it was a potential solution to a thing mostly Gadget People want, which is some Grand Unified Device That Does It All With No Tradeoffs.  But end user reviews were not good.  The Verge&rsquo;s <a href="https://www.theverge.com/2020/4/3/21206568/brydge-pro-plus-review-ipad-pro-keyboard-trackpad">7/10 review</a> was inexplicable to me, especially since it missed things others were complaining about, and because one of its dings was merely that Apple had a competing product coming out.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Were you to attempt something like this in AppleScript</title>
      <link>https://mike.puddingtime.org/posts/2023-04-27-were-you-to-attempt-this-with-applescript/</link>
      <pubDate>Thu, 27 Apr 2023 00:00:00 +0000</pubDate><author>mike@puddingtime.org (mike)</author>
      <guid>https://mike.puddingtime.org/posts/2023-04-27-were-you-to-attempt-this-with-applescript/</guid>
      <description>&lt;p&gt;I started down the path of &lt;a href=&#34;https://mike.puddingtime.org/posts/20230413-making-a-plaintext-personal-crm-with-org-contacts/&#34;&gt;building some sort of PRM in org-mode&lt;/a&gt; because I couldn&amp;rsquo;t find anything that worked the way I wanted. I did briefly look at Apple&amp;rsquo;s Contacts app, and also at &lt;a href=&#34;https://flexibits.com/cardhop&#34;&gt;Cardhop&lt;/a&gt;, which builds on top of your Contacts database but still makes some assumptions about how good you are at all at remembering to reach out to people.&lt;/p&gt;
&lt;p&gt;I also looked at &lt;a href=&#34;https://monicahq.com&#34;&gt;Monica&lt;/a&gt;, an open source PRM. The promising part of Monica is its API. The web UI itself shows comprehensive data for each contact, but does not do anything in the way of bulk editing and has no automation at all. It&amp;rsquo;s laborious to bootstrap.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I started down the path of <a href="https://mike.puddingtime.org/posts/20230413-making-a-plaintext-personal-crm-with-org-contacts/">building some sort of PRM in org-mode</a> because I couldn&rsquo;t find anything that worked the way I wanted. I did briefly look at Apple&rsquo;s Contacts app, and also at <a href="https://flexibits.com/cardhop">Cardhop</a>, which builds on top of your Contacts database but still makes some assumptions about how good you are at all at remembering to reach out to people.</p>
<p>I also looked at <a href="https://monicahq.com">Monica</a>, an open source PRM. The promising part of Monica is its API. The web UI itself shows comprehensive data for each contact, but does not do anything in the way of bulk editing and has no automation at all. It&rsquo;s laborious to bootstrap.</p>
<p>In the process of trying to figure out how I could write some automation to move Contacts information beyond the basic vCard fields into Monica I did end up having to learn about how macOS Contacts work and realized you can create custom labels for date fields then add them to your card editing template in Contacts&rsquo; preferences.</p>
<p>The data entry widget for these fields expects a date and is tolerant of not entering a year (which helps it support, er, &ldquo;polite&rdquo; birthdays). You can, in turn, use it somewhat opaquely in a Contacts smart list: There&rsquo;s a generic &ldquo;Date&rdquo; field you can filter on that looks at date fields in the card.  Paired with a &ldquo;within/not within,&rdquo; or &ldquo;in the next&rdquo; parameter, you can make a smart list of &ldquo;people not contacted in the past 30 days,&rdquo; etc.</p>
<p>If Contacts smart lists could also use groups, you could do a lot by just setting a &ldquo;last contacted&rdquo; date field and making a set of smart lists based on group membership. Contacts smart lists <em>can&rsquo;t</em> use groups, though, which is a strange oversight.</p>
<p>As I was trying to figure out, though, how to get my contacts uploaded to Monica in a way that would let me use its API to add tags to them once they were imported, I worked out some AppleScript that let me prepend a contact&rsquo;s group into its note as a hashtag. Contacts smart lists <em>can</em> filter on the contents of notes.</p>
<p>As a solution goes, it&rsquo;s in the category of &ldquo;cheap and cheerful.&rdquo; If you wanted to use macOS Contacts to keep track of your most recent touchpoint with someone, and drive a little automation to surface contacts you haven&rsquo;t reached out to in a while, you could do it with one custom field and adopting a simple convention for notes. You&rsquo;re also well into the territory of things AppleScript can do to help out, too: It is trivial to write scripts that automate logging, etc. or even write reminders or make events in a contacts calendar. In fact, here&rsquo;s a script that operates on the selected contact and lets you log activity in its note:</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-applescript" data-lang="applescript"><span class="line"><span class="cl"><span class="k">set</span> <span class="nv">theDate</span> <span class="k">to</span> <span class="nb">current date</span>
</span></span><span class="line"><span class="cl"><span class="k">set</span> <span class="nv">noteDate</span> <span class="k">to</span> <span class="nb">do shell script</span> <span class="s2">&#34;date &#39;+%Y-%m-%d&#39;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">tell</span> <span class="nb">application</span> <span class="s2">&#34;Contacts&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="k">set</span> <span class="nv">selectedPeople</span> <span class="k">to</span> <span class="nv">selection</span>
</span></span><span class="line"><span class="cl">	<span class="k">repeat</span> <span class="k">with</span> <span class="nv">thePerson</span> <span class="k">in</span> <span class="nv">selectedPeople</span>
</span></span><span class="line"><span class="cl">		<span class="k">set</span> <span class="nv">customDates</span> <span class="k">to</span> <span class="nv">custom</span> <span class="nv">dates</span> <span class="k">of</span> <span class="nv">thePerson</span>
</span></span><span class="line"><span class="cl">		<span class="k">set</span> <span class="nv">lastContactedExists</span> <span class="k">to</span> <span class="no">false</span>
</span></span><span class="line"><span class="cl">		<span class="k">repeat</span> <span class="k">with</span> <span class="nv">aCustomDate</span> <span class="k">in</span> <span class="nv">customDates</span>
</span></span><span class="line"><span class="cl">			<span class="k">if</span> <span class="na">label</span> <span class="k">of</span> <span class="nv">aCustomDate</span> <span class="ow">is</span> <span class="s2">&#34;last contacted&#34;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">				<span class="k">set</span> <span class="nv">value</span> <span class="k">of</span> <span class="nv">aCustomDate</span> <span class="k">to</span> <span class="nv">theDate</span>
</span></span><span class="line"><span class="cl">				<span class="k">set</span> <span class="nv">lastContactedExists</span> <span class="k">to</span> <span class="no">true</span>
</span></span><span class="line"><span class="cl">			<span class="k">end</span> <span class="k">if</span>
</span></span><span class="line"><span class="cl">		<span class="k">end</span> <span class="k">repeat</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span> <span class="ow">not</span> <span class="nv">lastContactedExists</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">			<span class="k">if</span> <span class="nv">length</span> <span class="k">of</span> <span class="nv">customDates</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">				<span class="k">set</span> <span class="nv">firstCustomDate</span> <span class="k">to</span> <span class="nb">first</span> <span class="nb">item</span> <span class="k">of</span> <span class="nv">customDates</span>
</span></span><span class="line"><span class="cl">				<span class="k">set</span> <span class="nv">newCustomDate</span> <span class="k">to</span> <span class="nb">make</span> <span class="nb">new</span> <span class="nv">custom</span> <span class="nv">date</span> <span class="nb">at</span> <span class="nb">after</span> <span class="nv">firstCustomDate</span>
</span></span><span class="line"><span class="cl">			<span class="k">else</span>
</span></span><span class="line"><span class="cl">				<span class="nb">make</span> <span class="nb">new</span> <span class="nv">custom</span> <span class="nv">date</span> <span class="nb">at</span> <span class="k">end</span> <span class="k">of</span> <span class="nv">custom</span> <span class="nv">dates</span> <span class="k">of</span> <span class="nv">thePerson</span> <span class="k">with</span> <span class="na">properties</span> <span class="p">{</span><span class="na">label</span><span class="p">:</span><span class="s2">&#34;last contacted&#34;</span><span class="p">,</span> <span class="nv">value</span><span class="p">:</span><span class="nv">theDate</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">			<span class="k">end</span> <span class="k">if</span>
</span></span><span class="line"><span class="cl">		<span class="k">end</span> <span class="k">if</span>
</span></span><span class="line"><span class="cl">		<span class="k">set</span> <span class="nv">theNote</span> <span class="k">to</span> <span class="nv">note</span> <span class="k">of</span> <span class="nv">thePerson</span> <span class="k">as </span><span class="nc">string</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span> <span class="nv">theNote</span> <span class="ow">is</span> <span class="s2">&#34;missing value&#34;</span> <span class="k">then</span> <span class="k">set</span> <span class="nv">theNote</span> <span class="k">to</span> <span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl">		<span class="k">set</span> <span class="nv">prependText</span> <span class="k">to</span> <span class="na">text returned</span> <span class="k">of</span> <span class="p">(</span><span class="nb">display dialog</span> <span class="s2">&#34;Enter text to prepend to the note of &#34;</span> <span class="o">&amp;</span> <span class="na">name</span> <span class="k">of</span> <span class="nv">thePerson</span> <span class="o">&amp;</span> <span class="s2">&#34;:&#34;</span> <span class="nv">default</span> <span class="nv">answer</span> <span class="s2">&#34;&#34;</span> <span class="nb">buttons</span> <span class="p">{</span><span class="s2">&#34;Cancel&#34;</span><span class="p">,</span> <span class="s2">&#34;OK&#34;</span><span class="p">}</span> <span class="nv">default</span> <span class="nb">button</span> <span class="s2">&#34;OK&#34;</span> <span class="nv">cancel</span> <span class="nb">button</span> <span class="s2">&#34;Cancel&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">set</span> <span class="nv">noteUpdated</span> <span class="k">to</span> <span class="s2">&#34;[&#34;</span> <span class="o">&amp;</span> <span class="nv">noteDate</span> <span class="o">&amp;</span> <span class="s2">&#34;] &#34;</span> <span class="o">&amp;</span> <span class="nv">prependText</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span> <span class="nv">theNote</span> <span class="ow">is not</span> <span class="s2">&#34;&#34;</span> <span class="k">then</span> <span class="k">set</span> <span class="nv">noteUpdated</span> <span class="k">to</span> <span class="nv">noteUpdated</span> <span class="o">&amp;</span> <span class="no">return</span> <span class="o">&amp;</span> <span class="nv">theNote</span> <span class="o">&amp;</span> <span class="no">return</span> <span class="o">&amp;</span> <span class="s2">&#34; &#34;</span> <span class="o">&amp;</span> <span class="no">return</span>
</span></span><span class="line"><span class="cl">		<span class="k">set</span> <span class="nv">note</span> <span class="k">of</span> <span class="nv">thePerson</span> <span class="k">to</span> <span class="nv">noteUpdated</span>
</span></span><span class="line"><span class="cl">		<span class="nv">save</span> <span class="nv">thePerson</span>
</span></span><span class="line"><span class="cl">	<span class="k">end</span> <span class="k">repeat</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span> <span class="k">tell</span></span></span></code></pre></div>
<p>So, looking at that, would you <em>want</em> to glue all this together with Applescript?</p>
<p>I don&rsquo;t think so. I don&rsquo;t, anyhow. It just took me a morning to figure that out.</p>
<p>In the process of roughing out automation for creating reminders, for instance, I managed to get Reminders.app to beachball on every run with a simple five-liner. Why? I don&rsquo;t know. Stack Overflow didn&rsquo;t know. But after a good 15 years of using AppleScript for jobs large and small, I know that sometimes you find its weird little corner cases and that&rsquo;s all there is to it. I&rsquo;d rather <a href="https://www.jwz.org/blog/2003/05/no-good-deed-goes-unpunished/">tell Jamie Zawinski that I don&rsquo;t know who the author of XScreensaver is</a> than ask Apple to fix it.</p>
<p>When I ask myself &ldquo;would I want to build something on top of this ecosystem that I mean to use forever?&rdquo; I can&rsquo;t even figure out three scripts I would need to write then get to the end of debugging the second one before I know the answer is &ldquo;no.&rdquo;</p>
<p>I mean, what does <em>forever</em> mean? Because my personal belief is that we have to assess the foreverness of the competing candidates, and probably think about how amenable data kept in the least forever of those formats is to being migrated to a more forever format/system:</p>
<ul>
<li>macOS Contacts</li>
<li>org-mode</li>
<li>vCard</li>
<li>plain text with moderately elaborate markup amenable to some automated processing</li>
</ul>
<p>(I put that list in ascending order of longevity/permanence, feeling very appreciative that org-mode allowed me to reorder it with <code>opt arrow</code>).</p>
<p>I trust macOS Contacts a bit. I don&rsquo;t how much money I would be willing to risk on a series of bets about it working as it does today in 2, 5, or 10 years. While trying to understand my AppleScript options with it I was brought face-to-face with changes to the underlying scripting model several times. In all fairness, those changes played out over decades and it&rsquo;s only because I&rsquo;m at a point in life where I can still think &ldquo;OS X is new&rdquo; that they even seem mentionable. It&rsquo;s also completely possible to get Contacts info out into some other format. There&rsquo;s also just the whole &ldquo;ramming your head against AppleScript&rdquo; aspect of the problem.</p>
<p>Moving up the Pyramid of Forever, I trust org-mode to be around for a very long time, but can also see how the API is still subject to change. Functions come and go so automation can break and make it hard to keep a contacts list maintained. On the other hand, I&rsquo;m not doing much now that couldn&rsquo;t be done by hand until I figured it out, and the things I&rsquo;ve bumped into are pretty small so far: changes in the namespace, functional replacements, etc.</p>
<p>Moving on:</p>
<p>I trust the vCard standard to stay how it is a bit more. It&rsquo;s on &hellip; version 3 or 4? &hellip; of the spec? There&rsquo;s a spec. There are a lot of stakeholders interested in that spec. Even Apple quietly crams a whole vCard property into each contact, even if it has its own version of each property you&rsquo;d find in a vCard anyhow.</p>
<p>So, moving on to the top of the pyramid:</p>
<p>I trust structured plain text to be useful for the rest of my life.</p>
<p>So something built on org-mode seems like the smart play for data longevity? Even if all my automation broke, core org-mode makes it easy to do the things I do: change todo states, add values to the <code>PROPERTIES</code> drawer, add tags, log changes, etc.</p>
<p>The one thing that I&rsquo;ve <em>mostly</em> decided not to worry about is the disconnect between my contacts list and my org-contacts file.</p>
<p>One useful feature of contacts via Fastmail is the dynamic &ldquo;Autosaved&rdquo; group. If I write someone, they go into that group. Periodically moving contacts that surface there into one of my permanent groups then removing them from &ldquo;Autosaved&rdquo; provides a simple, organic workflow for keeping up with new people. There is also a bunch of useful automation present in macOS/iOS for surfacing things about contacts from other apps, so you&rsquo;re constantly being offered the opportunity to pull in new information. This morning, for instance, going through my Contacts list, I noticed that something somewhere in the bowels of macOS or iOS was beginning to notice connections between my contacts and Ivory, the Mastodon client. That&rsquo;s pretty cool.</p>
<p>On the other hand, <em>this</em> is well within AppleScript&rsquo;s wheelhouse:</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-applescript" data-lang="applescript"><span class="line"><span class="cl"><span class="k">tell</span> <span class="nb">application</span> <span class="s2">&#34;Contacts&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="k">set</span> <span class="nv">selectedContacts</span> <span class="k">to</span> <span class="nv">selection</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nv">length</span> <span class="k">of</span> <span class="nv">selectedContacts</span> <span class="ow">is not</span> <span class="mi">1</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">		<span class="nb">display alert</span> <span class="s2">&#34;Please select exactly one contact.&#34;</span>
</span></span><span class="line"><span class="cl">		<span class="no">return</span>
</span></span><span class="line"><span class="cl">	<span class="k">end</span> <span class="k">if</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">set</span> <span class="nv">theContact</span> <span class="k">to</span> <span class="nb">first</span> <span class="nb">item</span> <span class="k">of</span> <span class="nv">selectedContacts</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">set</span> <span class="nv">theName</span> <span class="k">to</span> <span class="na">name</span> <span class="k">of</span> <span class="nv">theContact</span> <span class="k">as </span><span class="nc">text</span>
</span></span><span class="line"><span class="cl">	<span class="k">set</span> <span class="nv">theEmails</span> <span class="k">to</span> <span class="nv">value</span> <span class="k">of</span> <span class="nv">emails</span> <span class="k">of</span> <span class="nv">theContact</span> <span class="k">as </span><span class="nc">text</span>
</span></span><span class="line"><span class="cl">	<span class="k">set</span> <span class="nv">thePhones</span> <span class="k">to</span> <span class="nv">value</span> <span class="k">of</span> <span class="nv">phones</span> <span class="k">of</span> <span class="nv">theContact</span> <span class="k">as </span><span class="nc">text</span>
</span></span><span class="line"><span class="cl">	<span class="k">set</span> <span class="nv">theNote</span> <span class="k">to</span> <span class="nv">note</span> <span class="k">of</span> <span class="nv">theContact</span> <span class="k">as </span><span class="nc">text</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c">-- Format the contact data as an org contacts string</span>
</span></span><span class="line"><span class="cl">	<span class="k">set</span> <span class="nv">theContactString</span> <span class="k">to</span> <span class="s2">&#34;** &#34;</span> <span class="o">&amp;</span> <span class="nv">theName</span> <span class="o">&amp;</span> <span class="s2">&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">:PROPERTIES:
</span></span></span><span class="line"><span class="cl"><span class="s2">:EMAIL: &#34;</span> <span class="o">&amp;</span> <span class="nv">theEmails</span> <span class="o">&amp;</span> <span class="s2">&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">:PHONE: &#34;</span> <span class="o">&amp;</span> <span class="nv">thePhones</span> <span class="o">&amp;</span> <span class="s2">&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">:NOTE: &#34;</span> <span class="o">&amp;</span> <span class="nv">theNote</span> <span class="o">&amp;</span> <span class="s2">&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">:NAME: &#34;</span> <span class="o">&amp;</span> <span class="nv">theName</span> <span class="o">&amp;</span> <span class="s2">&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">:END:&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c">-- Copy the contact string to the clipboard</span>
</span></span><span class="line"><span class="cl">	<span class="nb">set the clipboard to</span> <span class="nv">theContactString</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span> <span class="k">tell</span></span></span></code></pre></div>
<p>&ldquo;Look through new contacts, run that script from a keyboard shortcut, paste the new contact into my <code>contacts.org</code> file.&rdquo;</p>
<p>I could go one step further and <em>append</em> the text to my <code>contacts.org</code> file, but I don&rsquo;t like operating on busy files like that.</p>
<p>AppleScript was plainly built to do little things like that. You have to learn its sort of crabbed, verbose way of doing things, but it&rsquo;s not too hard (and Shortcuts is getting pretty good if you can deal with the sudden drop in functionality that can appear out of nowhere when you hit the limits of some Apple engineer&rsquo;s imagination or time).</p>
<p>Anyhow, it all just comes down to aesthetics and preferences, right?</p>
<p>I&rsquo;ve got a draft heading sitting in my blog.org file with a title of &ldquo;Plain text is calming.&rdquo; I&rsquo;m not sure where that little essay is going, but I know where it started: When I&rsquo;m staring at a text editor I feel much better than when I&rsquo;m staring at a web or app UI. I might have some challenges with discoverability, or a lack of forgiveness for little slips of the finger, or whatever. But I still feel better because I&rsquo;ve been a happy citizen of Plaintext Land for over 30 years, and there is a governing mentality there that does not exist in other parts of the technology world. I&rsquo;m not saying the <a href="https://www.puppet.com/docs/puppet/8/http_api/pson.html">occasional wheel doesn&rsquo;t get reinvented,</a> but I am saying that with most plaintext stuff you get to choose your tools, or make them for yourself if there are no good choices. So it&rsquo;s calming because I don&rsquo;t have that feeling of always looking for the exit when I encounter a plaintext system. I know it&rsquo;s there.  That&rsquo;s the preference, anyhow. I made money for a few years being really, really good at turning CMS databases into plaintext and massaging them into other CMSes, so my patience for finding the structure and working with it is high. I don&rsquo;t worry about where the exit is because in my 40-year history with computers, it has never eluded me in the plaintext world.</p>
<p>The aesthetics are another kettle of fish, and plaintext people run a weird gamut from &ldquo;text editors are like samurai swords&rdquo; to &ldquo;mastery of a plaintext interface is a kind of performance art.&rdquo; Right now I&rsquo;m sort of luxuriating in Evil mode, because I finally get the emphasis on ruthless elimination of motion vi engenders. I&rsquo;ve  <a href="/img/Joy04.pdf">made terrible fun of people over this in the distant past</a> and feel a little bad about that, but less than two months into this particular experiment, I don&rsquo;t want to go back. Evil mode is like the end of the first Star Trek movie as far as I&rsquo;m concerned.</p>
<figure><img src="/img/decker_ilia.gif"
    alt="Will Decker and Ilia merging into some sort of computer overmind in Star Trek: TMP">
</figure>

<p>Anyhow, I do want to get back to the whole &ldquo;plaintext is calming&rdquo; idea and do some more writing about it. Today&rsquo;s jaunt into &ldquo;what if I could make what I wanted in the macOS ecosystem?&rdquo; was one of those processes I go through when I&rsquo;ve gone so far with an idea and wonder if I really want to commit &ndash; if I&rsquo;m not making life a little harder on myself than I need to, or if there&rsquo;s not some simpler way to do it (even if still in the DIY mode,) and the answer came back &ldquo;don&rsquo;t think there is.&rdquo; I&rsquo;m at home in what I made.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Daily notes for 2023-04-08</title>
      <link>https://mike.puddingtime.org/posts/2023-04-08-daily-notes-for-2023-04-08/</link>
      <pubDate>Sat, 08 Apr 2023 10:26:49 -0700</pubDate><author>mike@puddingtime.org (mike)</author>
      <guid>https://mike.puddingtime.org/posts/2023-04-08-daily-notes-for-2023-04-08/</guid>
      <description>As always, a plaintext revival means a mutt revival.</description>
      <content:encoded><![CDATA[<h3 id="these-things-come-in-waves">These things come in waves</h3>
<p>In the past, when I&rsquo;ve gone through a plaintext or Emacs kick of some kind, I&rsquo;ve blown past what I&rsquo;ve come to think of as a common sense limit: Eventually I&rsquo;m looking at Wanderlust, GNUS, or mu4e and thinking about the whole email in Emacs thing. Inevitably, then, you&rsquo;re looking at some sort of way to sync your IMAP account down to your local machine, and a whole layer goes in to make that work.</p>
<p>I walked up to the line this time around, asked myself what problem I&rsquo;m trying to solve, and remembered that part of what is making Doom Emacs work for me right now is how much I&rsquo;ve been keeping things limited to stuff that has to do with writing and stuff that has to do with personal organization. Those are things that don&rsquo;t stress Emacs&rsquo; single-threaded nature the way I do them, and that don&rsquo;t take me into the murky space between Emacs and the OS.</p>
<p>The problem I am trying to solve whenever I go on these kicks, is the pain of getting parts of the macOS experience into a more keyboard-centric place. Mail always sticks out because I don&rsquo;t like doing Mac Mail from the keyboard. There&rsquo;s <a href="https://smallcubed.com/">Mail Act-On</a>, but at $45 a renewal it&rsquo;s just more than I can see paying, and it doesn&rsquo;t really do much for visualization &ndash; it just makes it easy to move things into folders.</p>
<p>So my mind always goes to <a href="http://www.mutt.org">mutt</a>. It&rsquo;s not perfect &ndash; search is a challenge without something external augmenting it &ndash; but I&rsquo;m not sure it matters in the end: I use Fastmail for IMAP, and I don&rsquo;t mind punting to its web interface if I need to go dig for something.</p>
<p>I thought about mutt this time because my long-standing config has always sort of <em>felt</em> similar to the way Spacemacs and Doom put a modal UI over Emacs.  My mutt macros &ndash; here&rsquo;s a sample &ndash; use <code>.</code> as a leader and are written mnemonically:</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">macro index .sn &#34;l ^a^k~N\n&#34; # Show unread/new only
</span></span><span class="line"><span class="cl">macro index .sa &#34;l ^a^kall\n&#34; # show all
</span></span><span class="line"><span class="cl">macro index .C &#34;&lt;esc&gt;V&#34; # toggle threads
</span></span><span class="line"><span class="cl">macro index .si &#34;l (~n5-100|~N)\n&#34; # show interesting 
</span></span><span class="line"><span class="cl">macro index .rs &#34;&lt;enter-command&gt;source ~/.mutt/scores&lt;enter&gt;&#34; # reprocess scores
</span></span><span class="line"><span class="cl">macro index .sf &#34;l ~F\n&#34; # show flagged
</span></span><span class="line"><span class="cl">macro index .hl &#34;l ^a^k!~l\n&#34; # hide lists
</span></span><span class="line"><span class="cl">macro index .to &#34;T ~d&gt;7d\n&#34; # &#34;tag old&#34; -- messages older than 7 days
</span></span><span class="line"><span class="cl">macro index .ab    &#34;&lt;pipe-entry&gt;/opt/homebrew/bin/lbdb-fetchaddr\n&#34;                # Store address details in lbdb.</span></span></code></pre></div>
<p>The value of mutt is less as my everything email client &ndash; I still keep up with mail from my phone or tablet &ndash; and more because over the years I&rsquo;ve tuned it to visualize and process mail from the keyboard. I still read mail with my phone or tablet every day, but don&rsquo;t like to do anything more than flag messages when I&rsquo;m out.</p>
<h3 id="html-mail-and-mutt">HTML mail and mutt</h3>
<p>mutt is sometimes hard to stick with because we lost the plaintext email battle. I know one designer who formats his email with monotype faces in what I&rsquo;d describe as a sort of problematic aesthetic revolt, but otherwise &hellip; we lost and we&rsquo;ll never be able to unsee Calibri.</p>
<p>Sticking <code>elinks</code>, <code>lynx</code> or <code>w3m</code> in your <code>~/.mailcap</code> to show HTML was best practice for a long while, provided you didn&rsquo;t mind also using <code>urlview</code> to display the links in a message once you&rsquo;d read it. I was involved in email marketing during the era when that approach worked, partially because to do HTML mail &ldquo;right&rdquo; back then meant you had someone doing it painstakingly by hand, then reviewing across a multitude of clients and platforms &ndash; you were heavily incentivized to keep it simple.  I bear the scars from a spat with a division of Siemens that was still using an old Lotus Notes and Win2000 in its marketing department. They were the customer, and the mail didn&rsquo;t look good to them, so it didn&rsquo;t look good. That was all, and we were forced to buy the next tier of service from our mail provider so we could add Lotus Notes on Win 2000 to our testing.</p>
<p>Anyhow, &ldquo;<code>elinks</code> in your mailcap and call it a day&rdquo; doesn&rsquo;t work anymore: image text, dozens of links, complex positional markup, etc. etc. etc. and it makes a lot of HTML mail a hash in a plaintext browser. There are a few ways to solve this on a Mac: One is punting to an actual browser, and the other is using the Mac Quicklook service:</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">text/html;  open -a firefox %s; nametemplate=%s.html text/html; open -a firefox %s; nametemplate=%s.html; copiousoutput
</span></span><span class="line"><span class="cl">text/html; qlmanage -p %s; nametemplate=%s.html</span></span></code></pre></div>
<p>The former does about what you&rsquo;d expect from looking at it: It uses Firefox (or whatever browser you&rsquo;d care to invoke) to open the HTML part of the message, at which point you can click links, etc.</p>
<p>The latter is a little more obscure, but basically recreates what happens when you select a file and tap the spacebar to preview it on a Mac, popping up a modal window with the contents. This often works well for other kinds of attachments. With HTML mail it is enough to let you read the mail but not really interact with it (e.g. follow a link). The <code>[DEBUG]</code> label at the front of the modal&rsquo;s title suggests that nobody at Apple really took the &ldquo;plain text zealots using this to browse HTML email&rdquo; use case into account when they wrote <code>qlmanage</code>, and the man page makes clear it&rsquo;s just a debugging tool. It&rsquo;ll do if you never intend to interact with a mail.</p>
<p>I&rsquo;m sticking to the Firefox approach. It&rsquo;s super fast if Firefox is already running (it always is), and you can follow links.</p>
<h3 id="these-things-leave-in-waves-too">These things leave in waves, too</h3>
<p>At some point mutt is going to do something to annoy me. I don&rsquo;t know what it&rsquo;s going to be this time. For now, I&rsquo;m just enjoying the periodic dustoff of my config and pleasures of zipping through my inbox. If I had to guess, it&rsquo;ll have something to do with getting email messages into org-mode or calendaring, somehow. There are a few shell-based CalDav clients out there, but they&rsquo;re very sync-and-cache oriented and I just don&rsquo;t like adding services. Had mutt never added IMAP caching and built-in SMTP support, I would have a harder time justifying it.</p>
<p>But I feel more protective of my Emacs and org-mode experience than anything. This run with Doom has yielded the most stable Emacs experience I&rsquo;ve had since switching to Macs mooostly full-time ca. 2004. No mystery segfaults. No hard-locking the UI because I have IMAP, RSS, IRC, and Twitter clients running in my text editor.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
