<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Elsa Gonsiorowski</title>
    <description>The latest articles on Forem by Elsa Gonsiorowski (@gonsie).</description>
    <link>https://forem.com/gonsie</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F52899%2F16c72085-fbcc-49d0-bf42-f91466867a87.jpeg</url>
      <title>Forem: Elsa Gonsiorowski</title>
      <link>https://forem.com/gonsie</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/gonsie"/>
    <language>en</language>
    <item>
      <title>RSS Feeds by Email</title>
      <dc:creator>Elsa Gonsiorowski</dc:creator>
      <pubDate>Tue, 16 Feb 2021 00:00:00 +0000</pubDate>
      <link>https://forem.com/gonsie/rss-feeds-by-email-3pd8</link>
      <guid>https://forem.com/gonsie/rss-feeds-by-email-3pd8</guid>
      <description>&lt;p&gt;While RSS is great, it’s not easy to explain to those who haven’t heard of it before. Plus, it’s hard to get someone started on using RSS since it requires a separate application. TwoBitHistory has an great post on the &lt;a href="https://twobithistory.org/2018/09/16/the-rise-and-demise-of-rss.html"&gt;history of RSS&lt;/a&gt; that covers it’s fall from grace.&lt;/p&gt;

&lt;p&gt;Without RSS, keeping up-to-date on your favorite websites from the independent web becomes a bit more difficult. Most sites now feature a newsletter and email is a great alternative to RSS. Julia Evans &lt;a href="https://jvns.ca/blog/2017/12/28/making-a-weekly-newsletter/"&gt;describes the MailChimp process&lt;/a&gt; to turn an RSS feed into a weekly digest.&lt;/p&gt;

&lt;p&gt;I’ve decided to use something even simpler: the &lt;a href="https://rssby.email"&gt;RSSby.email&lt;/a&gt; service. RSSby.email provides a daily email with posts from this (or any) RSS feed. It is entirely managed by the subscriber via email (see the website for details on how to subscribe and various preferences you can set).&lt;/p&gt;

&lt;p&gt;To facilitate the subscription process, I added an HTML &lt;code&gt;mailto&lt;/code&gt; link to create the subscribe email for this site:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;a href="mailto:add@rssby.email?subject=subscribe&amp;amp;body=https://www.gonsie.com/blorg/feed.xml"&amp;gt;&amp;lt;img src="/images/rss-email.png" id="rss"&amp;gt;&amp;lt;/a&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;RSSby.email will automatically unsubscribe any websites that are not updated within 90 days… which should inspire me to post with some frequency.&lt;/p&gt;

</description>
      <category>blog</category>
      <category>rss</category>
    </item>
    <item>
      <title>Automatic Dark Mode for Your Website</title>
      <dc:creator>Elsa Gonsiorowski</dc:creator>
      <pubDate>Fri, 22 Jan 2021 00:00:00 +0000</pubDate>
      <link>https://forem.com/gonsie/automatic-dark-mode-for-your-website-5aal</link>
      <guid>https://forem.com/gonsie/automatic-dark-mode-for-your-website-5aal</guid>
      <description>&lt;p&gt;With HTML5 filters and media quieries, it’s simple to enable an automatic dark mode on your website. Use the following CSS snippet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@media (prefers-color-scheme: dark) {
  html {
    filter: invert(1) hue-rotate(180deg);
  }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It’s not perfect, but rather a quick and dirty way to stop blinding yourself when you’re editing your website at 2 am.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>My iPad Setup</title>
      <dc:creator>Elsa Gonsiorowski</dc:creator>
      <pubDate>Thu, 29 Aug 2019 00:00:00 +0000</pubDate>
      <link>https://forem.com/gonsie/my-ipad-setup-295f</link>
      <guid>https://forem.com/gonsie/my-ipad-setup-295f</guid>
      <description>&lt;p&gt;For almost a year now, my iPad has been my main computing device while traveling (the only other device being my phone). Making the switch has been relatively easy, once I decided to buy any (and every) app I thought would make my life easier.Any downsides I’ve come across have been more than compensated by not having to carry around 5 extra pounds of laptop. In this post I’ll detail some challenges and highlight the best apps that I’ve found.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Recommendations
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rou3HyxU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://gonsie.com/images/ipad-best-apps.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rou3HyxU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://gonsie.com/images/ipad-best-apps.jpeg" alt="img"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before I get too into the weeds, here is the bottom line up front. These are my must-have apps. The prices may be higher than most apps, but I guarantee that they are worth every dollar.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.texpad.com"&gt;Texpad&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$19.99&lt;/td&gt;
&lt;td&gt;TeX and LaTeX editing and compiling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.goodnotes.com"&gt;GoodNotes 5&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$7.99&lt;/td&gt;
&lt;td&gt;Digital notebook, for the Apple pencil&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://workingcopy.app"&gt;Working Copy&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Pro $15.99&lt;/td&gt;
&lt;td&gt;Git &amp;amp; GitHub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://www.blink.sh"&gt;Blink Shell&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$19.99&lt;/td&gt;
&lt;td&gt;SSH terminal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://www.panic.com/prompt/"&gt;Prompt&lt;/a&gt; by &lt;a href="https://panic.com"&gt;Panic&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;$19.99&lt;/td&gt;
&lt;td&gt;SSH terminal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ia.net"&gt;iA Writer&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$8.99&lt;/td&gt;
&lt;td&gt;Plain text writing app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.pcalc.com"&gt;PCalc&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$9.99&lt;/td&gt;
&lt;td&gt;Calculator with &lt;em&gt;all&lt;/em&gt; the bells and whistles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://agiletortoise.com/terminology/"&gt;Terminology&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$1.99&lt;/td&gt;
&lt;td&gt;Dictionary &amp;amp; Thesaurus&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Hardware Setup
&lt;/h2&gt;

&lt;p&gt;Of course, it all starts with an iPad.I have a 9.7-inch iPad Pro (generation 1), with 32 GB of space. It’s small and light. The small screen means that it’s not great for multitasking / split-screen, but it’s usable when I need it. I also have the Apple keyboard cover (approximately 1 pound). I also have an Apple Pencil, but I don’t usually carry that with me. I would consider the next generation iPad just for the Pencil magnets.&lt;/p&gt;

&lt;h3&gt;
  
  
  Some thoughts on the Apple Pencil
&lt;/h3&gt;

&lt;p&gt;I often take handwritten notes, but digital notes just aren’t quite the same. That said, I did give it a shot and found &lt;a href="https://www.goodnotes.com"&gt;GoodNotes&lt;/a&gt; to be an absolutely stunning app. It allows you to create different notebooks and comes equipped with great page templates. As a bonus, users of GoodNotes 4 (which I purchased back in 2016 when I first got my iPad) were given a free or subsidized upgrade to GoodNotes 5 when it was released earlier this year.&lt;/p&gt;

&lt;p&gt;Some other fun apps, just to use the pencil:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amaziograph.com"&gt;Amaziograph&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://science-to-touch.com/en/iOrnament.html"&gt;iOrnament&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://paper.bywetransfer.com"&gt;Paper&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Holy Grail
&lt;/h2&gt;

&lt;p&gt;I already told &lt;a href="https://www.gonsie.com/blorg/texpad-story.html"&gt;my story&lt;/a&gt; of compiling slides at 30,000 feet and I cannot recommend &lt;a href="https://www.texpad.com"&gt;Texpad&lt;/a&gt; enough. If you need to do any TeX at all, get Texpad, &lt;strong&gt;it works&lt;/strong&gt;. The TeX/LaTeX suite is such a beast, with tons of packages, and archaic flags. I’m a CLI person, but I still use MacTex’s provided TexShop GUI app to actually compile my tex files. What even is the comiple command, &lt;code&gt;pdflatex --some --flag&lt;/code&gt;? I don’t actually know the magical incantation. But Texpad knows. And Texpad works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Coding
&lt;/h2&gt;

&lt;p&gt;The technical aspects of my day job are coding. Heck, with Emacs and Org-mode, even writing, text editing, building a poster, making slides, etc. is coding. Coding on an iPad can happen in two ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;SSH into a remote machine (say, a desktop sitting back in your office)&lt;/li&gt;
&lt;li&gt;Download source to the iPad and edit it directly.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;My preferred method is (1) SSH-ing back to my office desktop machine. This means that any work I do is waiting for me when I return from my trip, plus I have access to emacs, compilers, Unix, the office intranet… There are two very good apps for this: &lt;a href="https://www.panic.com/prompt/"&gt;Panic’s Prompt&lt;/a&gt; and &lt;a href="http://www.blink.sh"&gt;Blink&lt;/a&gt;. While I love and support the folks over at Panic, my go to is Blink. Blink allows key remapping, meaning caps-lock is control and ` is Esc. Thank goodness because typing on a plane is RSI-inducing enough. Blink also supports MOSH, which I haven’t yet tried.&lt;/p&gt;

&lt;p&gt;Sometimes, I don’t want to SSH anywhere, or I want to do some git work without internet access. For that there is &lt;a href="https://workingcopy.app"&gt;Working Copy&lt;/a&gt; (unlock all the features with an in-app-purchase). This app is a dream. It has fully functioning support for git, with built in code editing and diff viewing (including an image diff viewer). The built-in text editor is great and did I mention it does all of git!? Pushing to GitHub does require some set up: you have to request permission for the app from any organizations that you want to push to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Plain Text Editing
&lt;/h2&gt;

&lt;p&gt;It’s taken me a long time to figure out a good text editing app, one that works great for plain text, not necessarily code. Of course, org-mode has spoiled me.I really want plain text… but with some syntax highlighting. I’d also really like the readline shortcuts to work (C-a, C-e, C-f, C-b, etc.). And a dark mode with fixed width fonts (Inconsolata or Fira Code please). With these “simple” requirements, it’s taken me quite a while to find a text editing app that I like.&lt;/p&gt;

&lt;p&gt;The best plain app I’ve found is &lt;a href="https://ia.net"&gt;iA Writer&lt;/a&gt;. I’ve heard good things about this app for a long time, but with emacs on my Mac I’ve never had a good reason to invest. These folks really understand &lt;em&gt;plain&lt;/em&gt; text. Doesn’t get in the way or force markdown on me, smooth to use, and files are stored as .txt (or even .org) which are easily accessed by the File browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Missing Essentials
&lt;/h2&gt;

&lt;p&gt;There are two basics that are completely missing on the iPad: a calculator and a stand-alone dictionary/thesaurus app.&lt;/p&gt;

&lt;p&gt;For a calculator I use PCalc, based on &lt;a href="https://daringfireball.net/linked/2008/07/10/pcalc"&gt;recommendation from Daring Fireball&lt;/a&gt;. PCalc is great and has every feature you’d ever need: unit conversions, paper tape, hexadecimal/octal/binary conversions, color themes, and more. Plus, it gives you a chance to practice your &lt;a href="https://en.wikipedia.org/wiki/Reverse_Polish_notation"&gt;reverse Polish notation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I frequently use the built-in MacOS dictionary when writing, mostly for the thesaurus. On the iPad, I’ve found &lt;a href="http://agiletortoise.com/terminology/"&gt;Terminology&lt;/a&gt;. It has great support for keyboard shortcuts, works offline, and provides tons of related words (from the Princeton &lt;a href="https://wordnet.princeton.edu"&gt;WordNet lexical database&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  The Rest
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kAE9NuKu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://gonsie.com/images/ipad-suite-apps.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kAE9NuKu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://gonsie.com/images/ipad-suite-apps.jpeg" alt="img"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If your are gearing up to use your iPad as a main computing device, there are a bunch of apps you should have &lt;em&gt;just in case&lt;/em&gt;. Mostly, they are the typical suites of office software and video conferencing platforms. Personally, I wouldn’t choose to use any of these, but no one asks me. That said, when I have had to use these office-suite apps, I have been surprised at how seamlessly they work. It is completely possible to edit a budget spreadsheet (full of advanced macros) while waiting for your flight.&lt;/p&gt;

</description>
      <category>ipad</category>
      <category>code</category>
      <category>ssh</category>
    </item>
    <item>
      <title>Don’t be afraid of eshell</title>
      <dc:creator>Elsa Gonsiorowski</dc:creator>
      <pubDate>Wed, 31 Jul 2019 00:00:00 +0000</pubDate>
      <link>https://forem.com/gonsie/don-t-be-afraid-of-eshell-3p3d</link>
      <guid>https://forem.com/gonsie/don-t-be-afraid-of-eshell-3p3d</guid>
      <description>&lt;p&gt;One of the reasons I decided to switch to emacs was the ability to embed a terminal window directly within my editor. Before last week, I never got the embedded terminal working and never really gave eshell much of a try. Initially, I tried to setup my regular shell (&lt;a href="https://fishshell.com"&gt;fish&lt;/a&gt;), but that never quite worked correctly.I also learned the power of dired and haven’t had the need to use the command line quite as much. Then, last week, I found myself editing and re-compiling code in a tight loop. I wanted access to the terminal, to trigger compilation, without leaving emacs. I created a quick-and-dirty eshell setup… and then wondered why I hadn’t done this sooner.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is eshell?
&lt;/h2&gt;

&lt;p&gt;Emacs shell, or eshell, presents bash-like command line interface built directly on emacs. It tries to be the best of two worlds:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An elisp REPL wherein elisp commands can be directly executed&lt;/li&gt;
&lt;li&gt;A command line interface similar to &lt;code&gt;bash&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By understanding that eshell is presenting emacs in a terminal/shell sort of way, I can choose if I want to execute a command the elisp or bash way. More details can be found on the &lt;a href="https://www.gnu.org/software/emacs/manual/html_mono/eshell.html"&gt;eshell page in the emacs manual&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bare Minimum
&lt;/h2&gt;

&lt;p&gt;First things first: to launch an eshell terminal, run &lt;code&gt;M-x eshell&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Next, there are 2 things I need to have a basic, functioning shell environment:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Have the correct PATH&lt;/li&gt;
&lt;li&gt;Have my most used aliases&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Path
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;PATH&lt;/code&gt; variable used by eshell is exposed through the &lt;code&gt;addpath&lt;/code&gt; command.Without any arguments, &lt;code&gt;addpath&lt;/code&gt; simply prints out the directories currently in &lt;code&gt;PATH&lt;/code&gt;. When called with one or more arguments, &lt;code&gt;addpath&lt;/code&gt; will append these paths to your &lt;code&gt;PATH&lt;/code&gt;. There is no need to include the current &lt;code&gt;PATH&lt;/code&gt; contents, as &lt;code&gt;addpath&lt;/code&gt; always appends.&lt;/p&gt;

&lt;h3&gt;
  
  
  Aliases
&lt;/h3&gt;

&lt;p&gt;Eshell has a number of built in commands, which are similar to the &lt;a href="https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Shell-Builtin-Commands"&gt;bash builtins&lt;/a&gt;. The most useful command is &lt;code&gt;alias&lt;/code&gt;, which can be used to create any commands that you are used to using in your regular shell. The first step for me was to figure out which aliases I use most often and add them to eshell.&lt;/p&gt;

&lt;p&gt;First, I needed the &lt;code&gt;ls&lt;/code&gt; alternative that I use. Luckily, there is an &lt;code&gt;ls&lt;/code&gt; provided by eshell (shown by running &lt;code&gt;which ls&lt;/code&gt;). It takes the same arguments as my Mac’s builtin version.&lt;/p&gt;

&lt;p&gt;Next, I needed a way to open an emacs buffer with a specific file. I use the command &lt;code&gt;em&lt;/code&gt; to launch a new emacs session within my terminal window (&lt;code&gt;emacs -nw&lt;/code&gt;). The alias for eshell is slightly different, since I am &lt;em&gt;already&lt;/em&gt; running an emacs session. I simply want to start editing a particular file. Thus, the alias makes a call to the emacs function &lt;code&gt;find-file&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;My alias file (&lt;code&gt;~/.emacs.d/eshell/alias&lt;/code&gt;) looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;alias la ls -AFGhl $1
alias em find-file $1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;The bare minimum takes care of my most frequent use case. Now, I can compile code without switching away from emacs!&lt;/p&gt;

&lt;p&gt;The next step for me is to add the aliases to &lt;a href="https://github.com/gonsie/dotfiles"&gt;dotfiles&lt;/a&gt; and continue to improve my eshell setup. A quick web search lead me to a literate config for eshell in &lt;a href="https://github.com/howardabrams/dot-files/blob/master/emacs-eshell.org"&gt;howardabrams/dot-files&lt;/a&gt;. There are several settings here that I will have to add for myself.&lt;/p&gt;

</description>
      <category>emacs</category>
      <category>eshell</category>
    </item>
    <item>
      <title>Highlighting in Org-Mode</title>
      <dc:creator>Elsa Gonsiorowski</dc:creator>
      <pubDate>Sun, 09 Jun 2019 00:00:00 +0000</pubDate>
      <link>https://forem.com/gonsie/highlighting-in-org-mode-291h</link>
      <guid>https://forem.com/gonsie/highlighting-in-org-mode-291h</guid>
      <description>&lt;p&gt;I use org-mode to take a lot of notes and I frequently want to highlight some terms that I’m defining or a key sentence. Overall, I want two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I would like to add some markup syntax which will highlight a word or phrase, using ':' to mark the start and end of the phrase (similar to bold or italic markup).&lt;/li&gt;
&lt;li&gt;When I export this markup through HTML (or markdown) it the markup should get converted to the HTML5 &lt;code&gt;&amp;lt;mark&amp;gt;&lt;/code&gt; tag.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Extending Org Syntax
&lt;/h2&gt;

&lt;p&gt;Extending the org syntax isn’t the most straightforward. At first, I tried to modify the &lt;code&gt;org-emphasis-alist&lt;/code&gt; variable, but that didn’t seem to work. Instead, I was able to extend &lt;code&gt;org-font-lock&lt;/code&gt; with an extra regex.&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(defun org-add-my-extra-markup ()
  "Add highlight emphasis."
  (add-to-list 'org-font-lock-extra-keywords
               '("[^\\w]\\(:\\[^\n\r\t]+:\\)[^\\w]"
                 (1 '(face highlight invisible nil)))))

(add-hook 'org-font-lock-set-keywords-hook #'org-add-my-extra-markup)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The elisp regular expression isn’t the easiest to understand, but this is what it matches:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Regex&lt;/th&gt;
&lt;th&gt;Explanation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;[^\\w]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;something that’s not a word&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\\(&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;start of a capture group (not matching)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;a colon&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;[^\n\r\t]+&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;a string of 1 or more characters that doesn’t contain new-lines or tabs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;a colon&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\\)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;end of the capture group (not matching)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;[^\\w]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;something that’s not a word&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The start-and-end matching of something that’s not a word means that colons in the middle of a URL are not matched and that the highlighted text can be followed by punctuation. The parenthesis create a capture group, which is used later to define what has the highlight face.Here is a diagram to try and explain the different pieces:&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;'("[^\\w]\\(:\\[^\n\r\t]+:\\)[^\\w]" (1 '(face highlight invisible nil)))
  |      '--capture group---'      |  | '--face definition-----------'
  '--regular expression to match---'  '--capture group number

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Exporting HTML
&lt;/h2&gt;

&lt;p&gt;The next step is to extend the org-exporter. This is easily done and a working example is even provided by &lt;a href="https://orgmode.org/manual/Advanced-Export-Configuration.html#Advanced-Export-Configuration"&gt;export engine manual&lt;/a&gt;. I simply create a filter for any backend built on top of html (which should include my markdown and jekyll-md exporters).&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(defun my-html-mark-tag (text backend info)
  "Transcode :blah: into &amp;lt;mark&amp;gt;blah&amp;lt;/mark&amp;gt; in body text."
  (when (org-export-derived-backend-p backend 'html)
    (let ((text (replace-regexp-in-string "[^\\w]\\(:\\)[^\n\t\r]+\\(:\\)[^\\w]" "&amp;lt;mark&amp;gt;" text nil nil 1 nil)))
      (replace-regexp-in-string "[^\\w]\\(&amp;lt;mark&amp;gt;\\)[^\n\t\r]+\\(:\\)[^\\w]" "&amp;lt;/mark&amp;gt;" text nil nil 2 nil))))

(add-to-list 'org-export-filter-plain-text-fucntions 'my-html-mark-tag)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;I add this to my &lt;code&gt;org-config.el&lt;/code&gt; file and success!&lt;/p&gt;

&lt;h2&gt;
  
  
  Alternatives
&lt;/h2&gt;

&lt;p&gt;Of course, org-mode already ships with some built-in highlighting functionality; namely, the syntax for defining a description list (which is a native HTML concept). The following org formatting can be used to create a description list:&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Emacs :: an extensible ,customizable, free/libre text editor
- Org mode :: keeping notes, maintaining TODO lists, planning projects, and authoring documents with a fast and effective plain-text system
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Which becomes the following HTML:&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;dl&amp;gt;
&amp;lt;dt&amp;gt;Emacs&amp;lt;/dt&amp;gt;&amp;lt;dd&amp;gt;an extensible ,customizable, free/libre text editor&amp;lt;/dd&amp;gt;
&amp;lt;dt&amp;gt;Org mode&amp;lt;/dt&amp;gt;&amp;lt;dd&amp;gt;keeping notes, maintaining TODO lists, planning projects, and authoring documents with a fast and effective plain-text system&amp;lt;/dd&amp;gt;
&amp;lt;/dl&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;While this is a common use-case for highlighting, I don’t always want my highlights to be in a list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Example
&lt;/h2&gt;

&lt;p&gt;Here is a very brief example of a highlighted phrase which was exported properly. I can also use this method to highlight a longer sentence, such as: Should I implement this highlighting syntax and export functionality into Orgmode itself?&lt;/p&gt;

</description>
      <category>emacs</category>
      <category>orgmode</category>
      <category>html</category>
    </item>
    <item>
      <title>Sending Email from Org Mode</title>
      <dc:creator>Elsa Gonsiorowski</dc:creator>
      <pubDate>Wed, 01 May 2019 00:00:00 +0000</pubDate>
      <link>https://forem.com/gonsie/sending-email-from-org-mode-22ga</link>
      <guid>https://forem.com/gonsie/sending-email-from-org-mode-22ga</guid>
      <description>&lt;p&gt;Every so often, I need to generate a bunch of form emails. Often, I’m sending the same email to multiple groups of people and I want use variables, such as &lt;code&gt;$first_name&lt;/code&gt;, in the text. While I’m sure there a number of online services which could achieve this for me, I really don’t need to set up a fancy campaign or use tracking. Plus, I’m wary of submitting others’ emails to a third party.&lt;/p&gt;

&lt;p&gt;Of course, I’ve used Emacs to do this, using org mode and AppleScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;To approach this task I start with a single org file. Getting AppleScript executing from an org block is trickier than I would like. Instead, I write the script whole cloth in my org file and tangle it out to a separate &lt;code&gt;.scpt&lt;/code&gt; file. I store the data in my file as a table. I then use a bash block, which takes the data through &lt;code&gt;:var&lt;/code&gt;, to loop over running the script.&lt;/p&gt;

&lt;h2&gt;
  
  
  AppleScript for Email
&lt;/h2&gt;

&lt;p&gt;I’ve never formally learned AppleScript, but some searching on StackOverFlow and trial-and-error can get you pretty far. Mac OS X has a built in editor found in &lt;code&gt;/Applications/Utilities/Script Editor&lt;/code&gt;. Once you’ve opened the editor, you can browse the dictionary with &lt;code&gt;File &amp;gt; Open Dictionary...&lt;/code&gt;. This dictionary lists all the classes and commands for different applications. The AppleScript language itself looks like natural language and is relatively easy to understand… especially once someone else has properly constructed the program.&lt;/p&gt;

&lt;p&gt;For my email-sender script, I store the AppleScript source is as a block. This block is tangled (&lt;code&gt;C-c C-v C-t&lt;/code&gt;) to a &lt;code&gt;.scpt&lt;/code&gt; file. The first half of this script sets some variables, including the body of the email message. The second half creates the message and sets a “to” recipient (could also set a “cc” recipient).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#+NAME: script
#+BEGIN_SRC apples :tangle email.scpt
on run argv
   set varName to item 1 of argv
   set varEmail to item 2 of argv
   set varBody to "Hello " &amp;amp; varName &amp;amp; ",

Blah blah blah. Lor ipsum, etc.

Sincerely,
Elsa"

   tell application "Mail"
        set theMessage to make new outgoing message with properties {subject: "Email", content: varBody, visible:true}
        tell theMessage
             make new to recipient with properties {name:varName, address:varEmail}
             #send
        end tell
   end tell
end run
#+END_SRC
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Note that I’ve commented out the &lt;code&gt;send&lt;/code&gt; command and set the message property &lt;code&gt;visible: true&lt;/code&gt;. This means that the draft emails appear in the Mail GUI, but do not get automatically sent. This allows me to do trial runs before spamming my recipients.&lt;/p&gt;

&lt;h2&gt;
  
  
  Filling the Variables
&lt;/h2&gt;

&lt;p&gt;Once I have the script and email body written, I know what variables I’ll need to fill in. The next step is to put all the data into a named org table. I usually do this data formatting by hand since I’m bringing together data items from many different sources.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#+NAME: data
|    Name    |      Email      |
|------------|-----------------|
| Mx. Person | person@test.com |
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Since I tangle the email sending AppleScript program, I need to run it from the command line. I call the script once for each row in the data table using a bash loop and variable arrays. Then, I use &lt;code&gt;C-c C-c&lt;/code&gt; to run the bash loop and generate the emails.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#+BEGIN_SRC bash :var name=data[,0] email=data[,1]
for i in `seq 0 0`; do
osascript email.scpt "${name[$i]}" "${email[$i]}"
done
#+END_SRC
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Note that I do not calculate the total number of data items / rows. That would take way too much bash magic for this simple example. Also, if you want to test the variables with an &lt;code&gt;echo&lt;/code&gt; statement, use &lt;code&gt;:results output&lt;/code&gt; as an argument to the org block.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hitting Send
&lt;/h2&gt;

&lt;p&gt;I usually choose to manually hit send on each individual email once I’m satisfied with the script.&lt;/p&gt;

&lt;p&gt;I keep all of these org commands in a single &lt;code&gt;notes.org&lt;/code&gt; file so that I can remember how to recreate the emails (usually a year later when it’s time to send them again). For example, this &lt;a href="https://github.com/womeninhpc/mentoring/blob/master/notes.org"&gt;notes.org&lt;/a&gt; file sends introduction emails for a mentoring program I organized with Women in HPC.&lt;/p&gt;

</description>
      <category>emacs</category>
      <category>orgmode</category>
      <category>mac</category>
      <category>applescript</category>
    </item>
    <item>
      <title>Verify git sign-off with TravisCI</title>
      <dc:creator>Elsa Gonsiorowski</dc:creator>
      <pubDate>Mon, 15 Apr 2019 00:00:00 +0000</pubDate>
      <link>https://forem.com/gonsie/verify-git-sign-off-with-travisci-ec</link>
      <guid>https://forem.com/gonsie/verify-git-sign-off-with-travisci-ec</guid>
      <description>&lt;p&gt;I don’t know how to explain my role as a contributor to the &lt;a href="https://github.com/hpc/mpifileutils"&gt;mpiFileUtils&lt;/a&gt; project. I joined because these tools are so incredibly useful and just plain cool! I also wanted to represent HPC users and contribute documentation to get more people using them. While I haven’t touched the “core” code, I have &lt;a href="https://github.com/hpc/mpifileutils/pull/208"&gt;converted the build system to CMake&lt;/a&gt;, created distinct &lt;a href="https://mpifileutils.readthedocs.io/"&gt;user&lt;/a&gt; and &lt;a href="https://github.com/hpc/mpifileutils/wiki"&gt;developer&lt;/a&gt; documentation, and begun acting as &lt;a href="https://en.wikipedia.org/wiki/Scrum_(software_development)"&gt;scrum master&lt;/a&gt; for the team’s development process.&lt;/p&gt;

&lt;p&gt;One thing I noticed recently is that our documented &lt;a href="https://github.com/hpc/mpifileutils/blob/master/.github/CONTRIBUTING.md"&gt;contributing requirements&lt;/a&gt; did not match what we were doing in practice. Namely, our team had agreed to use ‘signed-off’ commits as part of our project (inspired by &lt;a href="https://www.open-mpi.org/faq/?category=contributing#contribute-code"&gt;OpenMPI&lt;/a&gt;). But, since we hadn’t automated the check for it, the sign-off wasn’t always happening.&lt;/p&gt;

&lt;p&gt;So, today I set about remedying the situation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verifying a git sign-off
&lt;/h2&gt;

&lt;p&gt;We use a less strict form of git signatures, simply a “Signed-off-by” line in the commit message (rather than a full-blown gpg key signature). This can/should be automatically added to a commit message with the &lt;code&gt;git commit -s&lt;/code&gt; flag. The check to see if the latest commit has the sign-off is simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git show --summary HEAD | grep -q "Signed-off-by:"

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Integration with TravisCI
&lt;/h2&gt;

&lt;p&gt;We already run some automated tests with &lt;a href="https://travis-CI.org"&gt;TravisCI&lt;/a&gt;. Travis offers a &lt;code&gt;before_script&lt;/code&gt; step which triggers before the build of our project. This is the perfect place for the git-show + grep one liner! Everything seemed to work… until I actually created the pull request for this change. Strange.&lt;/p&gt;

&lt;p&gt;Turns out, TravisCI not only checks that a branch passes the tests, but it also checks that a branch &lt;em&gt;merged with master&lt;/em&gt; passes the tests. Travis was doing a merge, thus changing the &lt;code&gt;HEAD&lt;/code&gt;, before running the verify line. So, the verify should only trigger for testing the branch. Luckily, Travis provides an environment variable set to if the tests are running on a PR or not.&lt;/p&gt;

&lt;p&gt;Thus, the one-liner becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;'if ["$TRAVIS_PULL_REQUEST" = "false"]; then git show --summary HEAD | grep -q "Signed-off-by:"; fi'

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;With this small change it is now easy and automatic for our team to hold ourselves to the standards we’ve set.&lt;/p&gt;

&lt;h2&gt;
  
  
  Caveats
&lt;/h2&gt;

&lt;p&gt;The mpifileutils team has agreed that we won’t enforce a sign-off on every commit, just the final commit of a pull request. Therefore, this check only looks at &lt;code&gt;HEAD&lt;/code&gt;, the last commit that was made.&lt;/p&gt;

</description>
      <category>coding</category>
    </item>
    <item>
      <title>Beautifying the Mode Line</title>
      <dc:creator>Elsa Gonsiorowski</dc:creator>
      <pubDate>Sun, 17 Feb 2019 00:00:00 +0000</pubDate>
      <link>https://forem.com/gonsie/beautifying-the-mode-line-3k10</link>
      <guid>https://forem.com/gonsie/beautifying-the-mode-line-3k10</guid>
      <description>&lt;p&gt;There are some beautiful Emacs mode line packages out there, including the gorgeous &lt;a href="https://github.com/seagle0128/doom-modeline" rel="noopener noreferrer"&gt;doom-modeline&lt;/a&gt;. Since I don’t want my themeing to depend on any external packages, I’ve implemented some of features that I like. The results of all this can be found &lt;a href="https://github.com/gonsie/dotfiles/blob/master/emacs/theme.el#L75" rel="noopener noreferrer"&gt;in my dotfiles&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwi3gnobdtqe9qmiwtt8r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwi3gnobdtqe9qmiwtt8r.png" alt="dusk mode line"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Size
&lt;/h2&gt;

&lt;p&gt;One of the great things about the doom-modeline is its size. This can be approximated by forming a box around the mode line face (be sure to set it for both the active and inactive mode line). I used an &lt;a href="https://www.colorhexa.com/" rel="noopener noreferrer"&gt;online gradient generator&lt;/a&gt; to pick colors close to what I use as the background.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight common_lisp"&gt;&lt;code&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;set-face-attribute&lt;/span&gt; &lt;span class="ss"&gt;'mode-line&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
                    &lt;span class="ss"&gt;:background&lt;/span&gt; &lt;span class="s"&gt;"#353644"&lt;/span&gt;
                    &lt;span class="ss"&gt;:foreground&lt;/span&gt; &lt;span class="s"&gt;"white"&lt;/span&gt;
                    &lt;span class="ss"&gt;:box&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:line-width&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="ss"&gt;:color&lt;/span&gt; &lt;span class="s"&gt;"#353644"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="ss"&gt;:overline&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
                    &lt;span class="ss"&gt;:underline&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="nv"&gt;set-face-attribute&lt;/span&gt; &lt;span class="ss"&gt;'mode-line-inactive&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
                    &lt;span class="ss"&gt;:background&lt;/span&gt; &lt;span class="s"&gt;"#565063"&lt;/span&gt;
                    &lt;span class="ss"&gt;:foreground&lt;/span&gt; &lt;span class="s"&gt;"white"&lt;/span&gt;
                    &lt;span class="ss"&gt;:box&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:line-width&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="ss"&gt;:color&lt;/span&gt; &lt;span class="s"&gt;"#565063"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="ss"&gt;:overline&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
                    &lt;span class="ss"&gt;:underline&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Git Information
&lt;/h2&gt;

&lt;p&gt;Getting the git branch in the mode line was harder than it should have been. There are a bunch of emacs built-in version control variables and functions, but none that directly get the branch information. The main problem is that the &lt;code&gt;vcs-hooks.el&lt;/code&gt; package overloads functions and variable names. This means that you have to get the elisp syntax exactly correct for calling a funciton or returning a variable.&lt;/p&gt;

&lt;p&gt;This is a function call which does the wrong thing:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight common_lisp"&gt;&lt;code&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;vc-mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nv"&gt;Version&lt;/span&gt; &lt;span class="nv"&gt;Control&lt;/span&gt; &lt;span class="nv"&gt;minor&lt;/span&gt; &lt;span class="nv"&gt;mode.&lt;/span&gt;
&lt;span class="nv"&gt;This&lt;/span&gt; &lt;span class="nv"&gt;minor&lt;/span&gt; &lt;span class="nv"&gt;mode&lt;/span&gt; &lt;span class="nv"&gt;is&lt;/span&gt; &lt;span class="nv"&gt;automatically&lt;/span&gt; &lt;span class="nv"&gt;activated&lt;/span&gt; &lt;span class="nv"&gt;whenever&lt;/span&gt; &lt;span class="nv"&gt;you&lt;/span&gt; &lt;span class="nv"&gt;visit&lt;/span&gt; &lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="nv"&gt;file&lt;/span&gt; &lt;span class="nv"&gt;under&lt;/span&gt;
&lt;span class="nv"&gt;control&lt;/span&gt; &lt;span class="nv"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;one&lt;/span&gt; &lt;span class="nv"&gt;of&lt;/span&gt; &lt;span class="k"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;revision&lt;/span&gt; &lt;span class="nv"&gt;control&lt;/span&gt; &lt;span class="nv"&gt;systems&lt;/span&gt; &lt;span class="nv"&gt;in&lt;/span&gt; &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="nv"&gt;vc-handled-backends&lt;/span&gt;&lt;span class="ss"&gt;'.&lt;/span&gt;
&lt;span class="nv"&gt;VC&lt;/span&gt; &lt;span class="nv"&gt;commands&lt;/span&gt; &lt;span class="nv"&gt;are&lt;/span&gt; &lt;span class="nv"&gt;globally&lt;/span&gt; &lt;span class="nv"&gt;reachable&lt;/span&gt; &lt;span class="nv"&gt;under&lt;/span&gt; &lt;span class="k"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;prefix&lt;/span&gt; &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="nv"&gt;\[vc-prefix-map]&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
&lt;span class="nv"&gt;\{vc-prefix-map}&lt;/span&gt;



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This returns the value of the variable instead:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight common_lisp"&gt;&lt;code&gt;

&lt;span class="nv"&gt;vc-mode&lt;/span&gt;

&lt;span class="nv"&gt;Git:develop&lt;/span&gt;



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Luckily, the &lt;code&gt;doom-modeline&lt;/code&gt; package gets it right.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight common_lisp"&gt;&lt;code&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt; &lt;span class="nv"&gt;vc-branch&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;backend&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;vc-backend&lt;/span&gt; &lt;span class="nv"&gt;buffer-file-name&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;substring&lt;/span&gt; &lt;span class="nv"&gt;vc-mode&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;eq&lt;/span&gt; &lt;span class="nv"&gt;backend&lt;/span&gt; &lt;span class="ss"&gt;'Hg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;vc-branch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nv"&gt;develop&lt;/span&gt;



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This function cuts off the version control prefix (such as “Git:” or “Hg:”).&lt;/p&gt;

&lt;h2&gt;
  
  
  Right-Justified Text
&lt;/h2&gt;

&lt;p&gt;I also like that some of the information is right-justified. This snippet fills in spaces for the same effect. Note that I only put the major mode name on the right&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight common_lisp"&gt;&lt;code&gt;

&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:eval&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;propertize&lt;/span&gt;
         &lt;span class="s"&gt;" "&lt;/span&gt; &lt;span class="ss"&gt;'display&lt;/span&gt;
         &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;space&lt;/span&gt; &lt;span class="ss"&gt;:align-to&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;right&lt;/span&gt; &lt;span class="nv"&gt;right-fringe&lt;/span&gt; &lt;span class="nv"&gt;right-margin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                               &lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;string-width&lt;/span&gt; &lt;span class="nv"&gt;mode-name&lt;/span&gt;&lt;span class="p"&gt;)))))))&lt;/span&gt;
&lt;span class="o"&gt;```&lt;/span&gt;

&lt;span class="nv"&gt;Be&lt;/span&gt; &lt;span class="nv"&gt;sure&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;wrap&lt;/span&gt; &lt;span class="nv"&gt;with&lt;/span&gt; &lt;span class="o"&gt;`'&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:eval&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;ensure&lt;/span&gt; &lt;span class="nv"&gt;that&lt;/span&gt; &lt;span class="nv"&gt;this&lt;/span&gt; &lt;span class="nv"&gt;spacing&lt;/span&gt; &lt;span class="nv"&gt;is&lt;/span&gt; &lt;span class="nv"&gt;re-evaluated&lt;/span&gt; &lt;span class="nb"&gt;when&lt;/span&gt; &lt;span class="nv"&gt;mode-name&lt;/span&gt; &lt;span class="nv"&gt;changes.&lt;/span&gt;

&lt;span class="err"&gt;##&lt;/span&gt; &lt;span class="nv"&gt;Summary&lt;/span&gt;

&lt;span class="nv"&gt;Overall,&lt;/span&gt; &lt;span class="nv"&gt;I&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="nv"&gt;m&lt;/span&gt; &lt;span class="nv"&gt;very&lt;/span&gt; &lt;span class="nv"&gt;happy&lt;/span&gt; &lt;span class="nv"&gt;with&lt;/span&gt; &lt;span class="nv"&gt;this&lt;/span&gt; &lt;span class="nv"&gt;mode&lt;/span&gt; &lt;span class="nv"&gt;line.&lt;/span&gt; &lt;span class="nv"&gt;The&lt;/span&gt; &lt;span class="nv"&gt;implementation&lt;/span&gt; &lt;span class="nv"&gt;is&lt;/span&gt; &lt;span class="nv"&gt;simple,&lt;/span&gt; &lt;span class="nv"&gt;yet&lt;/span&gt; &lt;span class="nv"&gt;it&lt;/span&gt; &lt;span class="nv"&gt;looks&lt;/span&gt; &lt;span class="nv"&gt;decent&lt;/span&gt; &lt;span class="nv"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;terminal&lt;/span&gt; &lt;span class="nv"&gt;Emacs&lt;/span&gt; &lt;span class="nb"&gt;and&lt;/span&gt; &lt;span class="nv"&gt;absolutely&lt;/span&gt; &lt;span class="nv"&gt;fabulous&lt;/span&gt; &lt;span class="nv"&gt;in&lt;/span&gt; &lt;span class="k"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;GUI.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>emacs</category>
    </item>
    <item>
      <title>A One-Webpage, Printable Resume</title>
      <dc:creator>Elsa Gonsiorowski</dc:creator>
      <pubDate>Sat, 25 Aug 2018 00:00:00 +0000</pubDate>
      <link>https://forem.com/gonsie/a-one-webpage-printable-resume-41k7</link>
      <guid>https://forem.com/gonsie/a-one-webpage-printable-resume-41k7</guid>
      <description>&lt;p&gt;I’ve had my resume as single, printable webpage for over 5 years (&lt;a href="https://github.com/gonsie/gonsie.github.io/commit/c3b13b29035b6692d324b36d9e42ebf0db780361"&gt;initial git commit&lt;/a&gt; in 2012). Since all of the styling and content is self contained, it is very easy to used.&lt;/p&gt;

&lt;p&gt;I’ve made a template of the resume available &lt;a href="https://github.com/gonsie/Cthulu-Resume"&gt;on GitHub&lt;/a&gt;. It is based on &lt;a href="https://css-tricks.com/one-page-resume-site/"&gt;this one page CSS tricks resume&lt;/a&gt; which was originally developed by &lt;a href="http://github.com/chriscoyier"&gt;Chris Coyier&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why HTML and CSS
&lt;/h2&gt;

&lt;p&gt;I’m a firm believer in the separation of style and content. Here, resume content is separated from the style that is applied (as with all well-structured HTML and CSS pages). While I do think that GUI tools are more useful for viusal design, CSS does allow the expression of visual design through programatic means. Unlike LaTeX, which hides much of the fine-grained layout control, CSS is a fully featured layout controller. Even better, it understands the difference of the media by which the content is presented, allowing this resume template to take advantage of non-printing items.&lt;/p&gt;

&lt;p&gt;One basic improvement for this project would be to refactor the CSS and abstract some concepts. This would make it easier to change the fonts and overall proportions (rather than messing with strict pixel values).&lt;/p&gt;

&lt;h2&gt;
  
  
  Usefullness in Teaching Git
&lt;/h2&gt;

&lt;p&gt;I use the template as an easy way to teach git to students. After a basic introduction to git concepts and command, I have the students fork the template repo and create resumes of their own. Each student can add as litte or as much information, and they can play around with the HTML formatting. Indeed, this has the added bonus of getting them on GitHub and using GitHub pages.&lt;/p&gt;

</description>
      <category>css</category>
      <category>html</category>
      <category>git</category>
    </item>
    <item>
      <title>Emacs Delete vs. Kill</title>
      <dc:creator>Elsa Gonsiorowski</dc:creator>
      <pubDate>Wed, 04 Jul 2018 00:00:00 +0000</pubDate>
      <link>https://forem.com/gonsie/emacs-delete-vs-kill-541h</link>
      <guid>https://forem.com/gonsie/emacs-delete-vs-kill-541h</guid>
      <description>&lt;p&gt;One thing that has always vexed me is the Emacs kill ring. It’s great that it makes a list of things you’ve killed, but often I just want delete things quickly without saving it. So I need to change the default settings to enable both killing and deleting words and lines.&lt;/p&gt;

&lt;p&gt;Basic nomenclature (for this blog post at least);&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;kill means removing text and putting it in the kill ring&lt;/li&gt;
&lt;li&gt;delete means removing text and not putting it in the kill ring&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Understanding Key Bindings
&lt;/h2&gt;

&lt;p&gt;The default behavior of Emacs can depend on the underlying operating system. This is because key presses are first translated by the OS, then passed (if they don’t trigger an OS function) to the application, e.g., Emacs. This can be further complicated by the keyboard setup and, further still, by an Emacs instance running inside of a Terminal.&lt;/p&gt;

&lt;p&gt;To figure out the name that Emacs itself has for each key, use &lt;code&gt;C-h k KEY&lt;/code&gt; or &lt;code&gt;M-x describe-key KEY&lt;/code&gt;. This internal name will come in handy when rebinding these keys.&lt;/p&gt;

&lt;p&gt;For extended keyboards, there are often two “delete” keys, one which performs a backspace and one which does a forward delete. The forward delete is often found on the “keypad” or number pad and is thus called &lt;code&gt;kp-delete&lt;/code&gt; by Emacs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mac Keyboards
&lt;/h3&gt;

&lt;p&gt;Mac keyboards have the following modifier keys: Shift, Control, Option (Alt), and Command. While Shift and Control are already mapped for Emacs (known as &lt;code&gt;S&lt;/code&gt; and &lt;code&gt;C&lt;/code&gt; respectively), the Option and Command keys are not mapped. I use Option/Alt as a meta (&lt;code&gt;M&lt;/code&gt;) key and Command as a super (&lt;code&gt;s&lt;/code&gt;) key.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(setq mac-command-modifier 'super) ;; command -&amp;gt; s
(setq mac-option-modifier 'meta) ;; option/alt -&amp;gt; M
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Default Commands
&lt;/h2&gt;

&lt;p&gt;By default, the &lt;code&gt;delete&lt;/code&gt; key removes a single letter (backwards). In Emacs keybindings, this is sometimes denoted as &lt;code&gt;backspace&lt;/code&gt; (in addition to sometimes being called &lt;code&gt;delete&lt;/code&gt;). &lt;code&gt;M-delete&lt;/code&gt; (&lt;code&gt;ALT-delete&lt;/code&gt; on a Mac keyboard) will remove a whole word, but place it in the kill ring. Killing a line is simple: &lt;code&gt;C-k&lt;/code&gt;, but this kills a line forwards.&lt;/p&gt;

&lt;p&gt;Putting the most recently killed word or line back is &lt;code&gt;C-y&lt;/code&gt;, called yanking. Yanking previous items in the ring is achieved with &lt;code&gt;M-y&lt;/code&gt;, which will cycle through the ring.&lt;/p&gt;

&lt;h2&gt;
  
  
  Combinations
&lt;/h2&gt;

&lt;p&gt;There is a 3 dimensional problem to solve here, with 16 possible combinations (14 unique operations):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Removal direction (backwards or forwards)&lt;/li&gt;
&lt;li&gt;Removal type (kill or delete)&lt;/li&gt;
&lt;li&gt;Removal size (character, word, visual line, whole line)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Direction
&lt;/h3&gt;

&lt;p&gt;I use the Mac internal for marking the direction as backwards or forwards. Even on laptop keyboards, I can use &lt;code&gt;Fn-delete&lt;/code&gt; to get the forwards deletion.&lt;/p&gt;

&lt;p&gt;The whole line removal does not have a direction, but must be bound to both &lt;code&gt;delete&lt;/code&gt; and &lt;code&gt;kp-delete&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Removal Type
&lt;/h3&gt;

&lt;p&gt;The un-modified delete key-press should trigger a character delete. Using the meta (&lt;code&gt;M&lt;/code&gt;) modifier triggers a word removal. Using the control (&lt;code&gt;C&lt;/code&gt;) modifier triggers a line removal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Saving Items to the Kill Ring
&lt;/h3&gt;

&lt;p&gt;I use the Shift (&lt;code&gt;S&lt;/code&gt;) modifier to explicitly trigger adding the removed text to the kill ring.&lt;/p&gt;

&lt;h2&gt;
  
  
  Binding the Keys
&lt;/h2&gt;

&lt;p&gt;The following table tracks all the combinations which must be implemented. The implementation looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(global-set-key (kbd "&amp;lt;&amp;lt;keybinding&amp;gt;&amp;gt;") '&amp;lt;&amp;lt;function&amp;gt;&amp;gt;)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Direction&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Save&lt;/th&gt;
&lt;th&gt;Key Binding&lt;/th&gt;
&lt;th&gt;Function&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Backwards&lt;/td&gt;
&lt;td&gt;Char&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;delete&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;None needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;del&gt;Char&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;&lt;del&gt;Yes&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Not implemented&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Word&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;M-delete&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;backward-delete-word&lt;/code&gt; *&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Word&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;M-S-backspace&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;backward-kill-word&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Line&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;C-backspace&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;backward-delete-line&lt;/code&gt; *&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Line&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;C-S-backspace&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;backward-kill-line&lt;/code&gt; *&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forwards&lt;/td&gt;
&lt;td&gt;Char&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;kp-delete&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;delete-forward-char&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;del&gt;Char&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;&lt;del&gt;Yes&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Not implemented&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Word&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;M-kp-delete&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;delete-word&lt;/code&gt; *&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Word&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;M-S-kp-delete&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;kill-word&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Line&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;C-kp-delete&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;delete-line&lt;/code&gt; *&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Line&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;C-S-kp-delete&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;kill-line&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Both&lt;/td&gt;
&lt;td&gt;Line&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;&amp;lt;s-backspace&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;s-kp-delete&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;delete-current-line&lt;/code&gt; *&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Both&lt;/td&gt;
&lt;td&gt;Line&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;&amp;lt;s-S-backspace&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;s-S-kp-delete&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;kill-whole-line&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The functions marked with a * must be implemented, as such:&lt;/p&gt;



&lt;pre&gt;&lt;code data-lang="elisp"&gt;&lt;span&gt;;; from https://stackoverflow.com/a/12990359/1160876&lt;/span&gt;
&lt;span&gt;(&lt;/span&gt;&lt;span&gt;defun&lt;/span&gt; &lt;span&gt;backward-delete-word&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;arg&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
  &lt;span&gt;"Delete characters backward until encountering the beginning of a word.
With argument ARG, do this that many times."&lt;/span&gt;
  &lt;span&gt;(&lt;/span&gt;&lt;span&gt;interactive&lt;/span&gt; &lt;span&gt;"p"&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
  &lt;span&gt;(&lt;/span&gt;&lt;span&gt;delete-region&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;point&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;progn&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;backward-word&lt;/span&gt; &lt;span&gt;arg&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;point&lt;/span&gt;&lt;span&gt;))))&lt;/span&gt;

&lt;span&gt;(&lt;/span&gt;&lt;span&gt;defun&lt;/span&gt; &lt;span&gt;delete-word&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;arg&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
  &lt;span&gt;"Delete characters forwards until encountering the beginning of a word.
With argument ARG, do this that many times."&lt;/span&gt;
  &lt;span&gt;(&lt;/span&gt;&lt;span&gt;interactive&lt;/span&gt; &lt;span&gt;"p"&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
  &lt;span&gt;(&lt;/span&gt;&lt;span&gt;delete-region&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;point&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;progn&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;forward-word&lt;/span&gt; &lt;span&gt;arg&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;point&lt;/span&gt;&lt;span&gt;))))&lt;/span&gt;

&lt;span&gt;(&lt;/span&gt;&lt;span&gt;defun&lt;/span&gt; &lt;span&gt;backward-delete-line&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;arg&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
  &lt;span&gt;"Delete (not kill) the current line, backwards from cursor.
With argument ARG, do this that many times."&lt;/span&gt;
  &lt;span&gt;(&lt;/span&gt;&lt;span&gt;interactive&lt;/span&gt; &lt;span&gt;"p"&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
  &lt;span&gt;(&lt;/span&gt;&lt;span&gt;delete-region&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;point&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;progn&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;beginning-of-visual-line&lt;/span&gt; &lt;span&gt;arg&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;point&lt;/span&gt;&lt;span&gt;))))&lt;/span&gt;

&lt;span&gt;(&lt;/span&gt;&lt;span&gt;defun&lt;/span&gt; &lt;span&gt;delete-line&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;arg&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
  &lt;span&gt;"Delete (not kill) the current line, forwards from cursor.
With argument ARG, do this that many times."&lt;/span&gt;
  &lt;span&gt;(&lt;/span&gt;&lt;span&gt;interactive&lt;/span&gt; &lt;span&gt;"p"&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
  &lt;span&gt;(&lt;/span&gt;&lt;span&gt;delete-region&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;point&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;progn&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;end-of-visual-line&lt;/span&gt; &lt;span&gt;arg&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;point&lt;/span&gt;&lt;span&gt;))))&lt;/span&gt;

&lt;span&gt;(&lt;/span&gt;&lt;span&gt;defun&lt;/span&gt; &lt;span&gt;backward-kill-line&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;arg&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
  &lt;span&gt;"Kill the current line, backwards from cursor.
With argument ARG, do this that many times."&lt;/span&gt;
  &lt;span&gt;(&lt;/span&gt;&lt;span&gt;interactive&lt;/span&gt; &lt;span&gt;"p"&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
  &lt;span&gt;(&lt;/span&gt;&lt;span&gt;kill-region&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;point&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;progn&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;beginning-of-visual-line&lt;/span&gt; &lt;span&gt;arg&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;point&lt;/span&gt;&lt;span&gt;))))&lt;/span&gt;

&lt;span&gt;;; from https://stackoverflow.com/a/35711240/1160876&lt;/span&gt;
&lt;span&gt;(&lt;/span&gt;&lt;span&gt;defun&lt;/span&gt; &lt;span&gt;delete-current-line&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;arg&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
  &lt;span&gt;"Delete (not kill) the current line."&lt;/span&gt;
  &lt;span&gt;(&lt;/span&gt;&lt;span&gt;interactive&lt;/span&gt; &lt;span&gt;"p"&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
  &lt;span&gt;(&lt;/span&gt;&lt;span&gt;save-excursion&lt;/span&gt;
    &lt;span&gt;(&lt;/span&gt;&lt;span&gt;delete-region&lt;/span&gt;
     &lt;span&gt;(&lt;/span&gt;&lt;span&gt;progn&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;forward-visible-line&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;point&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;
     &lt;span&gt;(&lt;/span&gt;&lt;span&gt;progn&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;forward-visible-line&lt;/span&gt; &lt;span&gt;arg&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;point&lt;/span&gt;&lt;span&gt;)))))&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;I am very happy with how cleanly these keybindings map to functionality.&lt;br&gt;
Let's see if I can actually put these to use!&lt;/p&gt;

</description>
      <category>emacs</category>
    </item>
    <item>
      <title>Developing ox-jekyll</title>
      <dc:creator>Elsa Gonsiorowski</dc:creator>
      <pubDate>Sat, 12 May 2018 00:00:00 +0000</pubDate>
      <link>https://forem.com/gonsie/developing-ox-jekyll-hn6</link>
      <guid>https://forem.com/gonsie/developing-ox-jekyll-hn6</guid>
      <description>&lt;p&gt;In a previous post, I &lt;a href="//./survey-org-jekyll.md"&gt;surveyed existing org and jekyll&lt;/a&gt; integration workflows. This survey found two common approaches, one that is Jekyll-centric and one that uses Org-publish (Emacs-centric). Unfortunately, neither fit with my workflow and I decided to develop my own Org exporter.&lt;/p&gt;

&lt;p&gt;I finally have some functioning code, so I figured I should share details about the project and the development process. You can find the project &lt;a href="https://github.com/gonsie/ox-jekyll"&gt;on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting Point
&lt;/h2&gt;

&lt;p&gt;In &lt;a href="http://www.gonsie.com/blorg/survey-org-jekyll.html"&gt;my survey&lt;/a&gt; I found some useful resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Worg Documentation on &lt;a href="https://orgmode.org/worg/dev/org-export-reference.html"&gt;Org Export Engine&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;An existing ox-jekyll in &lt;a href="https://github.com/yoshinari-nomura/org-octopress"&gt;org-octopress&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Great artists steal.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I want everything that org-octopress is doing with it’s jekyll exporter, I just want it built on markdown instead of HTML.&lt;/p&gt;

&lt;p&gt;So, I’ve copied &lt;code&gt;ox-jekyll.el&lt;/code&gt; and replaced “html” with “md”. After fixing a few function names, it works!&lt;/p&gt;

&lt;p&gt;Most importantly, the front matter is in the right spot (with and without a table of contents). The next step is to make this work with the particulars of my publishing workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Publishing Workflow Details
&lt;/h2&gt;

&lt;p&gt;There are a number of things I want my exporter to accomplish. Many of which are particular to my workflow.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I use a single org file per post.&lt;/li&gt;
&lt;li&gt;Upon export, the date (YYYY-MM-DD) should get added to the file name.&lt;/li&gt;
&lt;li&gt;Subtree level matches export heading level (this is just how I design my site’s CSS)&lt;/li&gt;
&lt;li&gt;Code snippets should be easy to export with appropriate syntax. This is where many markdown converters differ, but jekyll currently wraps code blocks with &lt;code&gt;{ % highlight LANG %}&lt;/code&gt; / &lt;code&gt;{ % endhighlight %}&lt;/code&gt;. [Ignore the space before the first %].&lt;/li&gt;
&lt;li&gt;Jekyll front matter should be added above org-inserted table of contents. The manual HTML source block is just hideous.&lt;/li&gt;
&lt;li&gt;It should be easy to move the generated file to a separate location (I think this addressed in the org-publish workflow).&lt;/li&gt;
&lt;li&gt;Org-y way to add tags to the post.&lt;/li&gt;
&lt;li&gt;Safe export of title (colon character mucks things up for Jekyll).&lt;/li&gt;
&lt;li&gt;Fix up links and export connected images. This one is really a nice to have, not necessary.&lt;/li&gt;
&lt;li&gt;TOC should be an ordered list (with the option to make it unordered) WTF is the HTML exporter doing making it an unordered list with numbers in the text.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many of these are solved with code from org-octopress, particularly the yaml front matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementing Features
&lt;/h2&gt;

&lt;p&gt;Here are some notes on my implementation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Thinking about the Table of Contents
&lt;/h3&gt;

&lt;p&gt;I had been including a table of contents at the top of each of my posts. I didn’t actually label it with “table of contents” and I prefer an un-numbered list. This seems to be very contrary to what the org-exporter likes to do. It pretty much does not allow for any fine-grained control of how the table of contents appears.&lt;/p&gt;

&lt;p&gt;While I was able to get the code to do what I wanted, it ended up being way too much of a hack. In the end, I’ve decided that I don’t want a table of contents at all. Really, it will be up to the markdown / jekyll / liquid parser to create a TOC if necessary. This makes it easy to apply separate HTML styles to the TOC (to put it in a sidebar or something).&lt;/p&gt;

&lt;h3&gt;
  
  
  Preserving the Headline Level
&lt;/h3&gt;

&lt;p&gt;I would like &lt;code&gt;:headline-offset&lt;/code&gt; (as described &lt;a href="https://orgmode.org/worg/dev/org-export-reference.html"&gt;here&lt;/a&gt;) to work on a file level. This allows me to make sure the contents of my post match up the CSS on the web site (the content’s final destination). This is definitely a more markdown-y way to do things rather than the org way.&lt;/p&gt;

&lt;p&gt;Unfortunately, the &lt;code&gt;:headline-offset&lt;/code&gt; option is only supported per subtree. I can hack it with a simple function that adds an “offset by 0” property to each subtree:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(defun org-jekyll-headline-offset (headline contents info)
  "proper headline offset"
  (let* ((info (plist-put info :headline-offset 0)))
    (org-md-headline headline contents info)))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I add it to the derived backend &lt;code&gt;:translate-alist&lt;/code&gt; like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(org-export-define-derived-backend 'jekyll 'md
  ;; ...
  :translate-alist
  '((headline . org-jekyll-headline-offset)
  ;; ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, this function is called each time a headline is translated by the export engine and my headline level is directly translated to markdown.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting the Date
&lt;/h3&gt;

&lt;p&gt;I have a strange workflow where I want the &lt;code&gt;#+DATE:&lt;/code&gt; tag to be the day I started working on a post and the date in the filename to be the day I hit publish. For my exporter, I can use the option &lt;code&gt;date:&lt;/code&gt; to trigger this behavior. The &lt;code&gt;date:&lt;/code&gt; option takes precedence over the variable &lt;code&gt;org-export-with-date&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;While I would like my code to support putting the &lt;code&gt;#+DATE:&lt;/code&gt; property into the filename, this seems impossible with the export engine. The date property is stored in the info plist which I don’t have access to at file naming time.&lt;/p&gt;

&lt;p&gt;Instead, I’ve implemented this functionality:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;date:&lt;/code&gt; option controls if the value of the &lt;code&gt;#+DATE&lt;/code&gt; property is put into the Jekyll front matter.&lt;/li&gt;
&lt;li&gt;I’ve added a new option to the exporter: &lt;code&gt;org-jekyll-use-today-date&lt;/code&gt;. If &lt;code&gt;t&lt;/code&gt;, the exporter will prepend the filename with today’s date.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;I’m quite happy with my exporter, I even used it to export this post! I still need to figure out how to use the org-publish workflow, but for now I can successfully export my blog posts.&lt;/p&gt;

&lt;p&gt;As with most of my projects, you can find it &lt;a href="http://github.com/gonsie/ox-jekyll"&gt;on GitHub&lt;/a&gt;. Please feel free to file an issue and share any feed back you have.&lt;/p&gt;

</description>
      <category>emacs</category>
      <category>org</category>
      <category>blog</category>
      <category>jekyll</category>
    </item>
    <item>
      <title>Blog Roll</title>
      <dc:creator>Elsa Gonsiorowski</dc:creator>
      <pubDate>Wed, 18 Apr 2018 00:00:00 +0000</pubDate>
      <link>https://forem.com/gonsie/blog-roll-3pj4</link>
      <guid>https://forem.com/gonsie/blog-roll-3pj4</guid>
      <description>&lt;p&gt;There has been a lot of talk about blogs in my sphere recently. First, Digg Reader was shut down and I was forced to transition the 40+ blogs that I follow to a new service. Around the same time Jason Kottke (of &lt;a href="https://kottke.org"&gt;kottke.org&lt;/a&gt;) asked his sustaining members about their favorite blogs. He recently posted the results and included my response (&lt;a href="https://kottke.org/18/04/blogging-is-most-certainly-not-dead"&gt;link here so I can treasure this moment&lt;/a&gt;)!!&lt;/p&gt;

&lt;p&gt;Let me take some more time to list of some of my favorite blogs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best of All time
&lt;/h2&gt;

&lt;p&gt;Obviously, &lt;a href="http://kottke.org"&gt;Jason Kottke&lt;/a&gt; is the best. I have been following him for probably 15 years and I enjoy his blog so much that I am a &lt;a href="https://kottke.org/members/"&gt;sustaining member&lt;/a&gt;. His blog covers the best of the internet and talks about life, technology, design, and the intersection of it all.&lt;/p&gt;

&lt;p&gt;If you have ever been and Apple fan (and are old enough to remember when they actually were the underdogs), then you should already know about &lt;a href="https://daringfireball.net"&gt;Daring Fireball&lt;/a&gt;. John Gruber is a prolific blogger and well know for insightful commentary on the Apple news of the day. Also, he invented &lt;a href="https://daringfireball.net/projects/markdown/"&gt;Markdown&lt;/a&gt;. The term ‘fireballed’ refers to a website that is essentially DDOS’d when DF shares a link to it.&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://www.swiss-miss.com"&gt;Swiss-Miss blog&lt;/a&gt; by Tina Roth Eisenberg is another favorite. It is focused around design and creative work. She shares a ton of inspirational videos and cool products that I wish I could buy.&lt;/p&gt;

&lt;p&gt;The last in this category is the &lt;a href="https://m.signalvnoise.com"&gt;Signal-v-Noise&lt;/a&gt; blog by 37signals. This is group that develops Basecamp. They are a 100% remote company and a huge inspiration for working in tech and loving your job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Niche Favorites
&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://sachachua.com"&gt;Sacha Chua&lt;/a&gt; is an amazing blogger. Her style of writing is stream-of-thought, but she goes straight for the deep thoughts about how to improve her (and her family’s) life. She is a prolific contributor the Emacs community and includes a weekly roundup of Emacs news.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.autostraddle.com"&gt;Autostraddle&lt;/a&gt; is a website for the LGBTQ community. This blog includes a ton of helpful resources for allies and helps me understand the community and important issues better.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://thestonesoup.com/blog"&gt;The Stone Soup&lt;/a&gt; is the only blog on food that I follow. Jules teaches you how to cook with the ingredients you have, so that you understand how to assemble a meal rather than just follow a recipe. Plus, everything I have ever made from her is delicious.&lt;/p&gt;

&lt;p&gt;My favorite tech-life blogger is &lt;a href="http://cate.blog"&gt;Cate&lt;/a&gt;. Her style is incredibly intimate and &lt;em&gt;real&lt;/em&gt;; I connect with so much that she writes about. My favorite project of hers are the &lt;a href="https://cate.blog/2017/08/15/i-send-love-letters-from-airports/"&gt;love letters from airports&lt;/a&gt; (with the &lt;a href="https://techspeak.email"&gt;Technically Speaking&lt;/a&gt; newsletter as a close second).&lt;/p&gt;

&lt;h2&gt;
  
  
  A Few More
&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://penelopetrunk.com"&gt;Penelope Trunk&lt;/a&gt; covers career management.&lt;a href="https://kate.io"&gt;Kate Murphy&lt;/a&gt;, &lt;a href="http://natashatherobot.com"&gt;Natasha the Robot&lt;/a&gt;, &lt;a href="http://jvns.ca"&gt;Julia Evans&lt;/a&gt; (also featured by Kottke), &lt;a href="http://blog.bethcodes.com"&gt;Beth Andres-Beck&lt;/a&gt;, &lt;a href="http://www.domesticated-engineer.com"&gt;Domesticated Engineer&lt;/a&gt;, and &lt;a href="https://www.kaeheddleston.com"&gt;Kate Heddleston&lt;/a&gt; all blog about working in technology (software). And the &lt;a href="http://www.fancybeans.com"&gt;Fancy Beans&lt;/a&gt; blog has left the tech industry behind and is FIRE. The &lt;a href="http://programmingisterrible.com"&gt;Programming is Terrible&lt;/a&gt; blog has one of my favorite posts of all time: &lt;em&gt;&lt;a href="https://programmingisterrible.com/post/139222674273/write-code-that-is-easy-to-delete-not-easy-to"&gt;Write code that easy to delete&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://thekidshouldseethis.com"&gt;The Kid Should See This&lt;/a&gt;: links to great youtube videos.&lt;a href="http://toolsandtoys.net"&gt;Tools and Toys&lt;/a&gt; links to some interesting products and includes interesting links in their Friday roundup. On the more reflective side of things, &lt;a href="http://zenhabits.net"&gt;zenhabits&lt;/a&gt; is quite popular and &lt;a href="http://patrickrhone.com"&gt;PatrickRhone&lt;/a&gt; is very personal.&lt;a href="http://irreal.org/blog"&gt;Irreal&lt;/a&gt; is an Emacs blog which posts daily, usually short snippets about Emacs or what is going on the community.&lt;a href="http://www.loopinsight.com"&gt;The Loop&lt;/a&gt; and &lt;a href="http://pxlnv.com"&gt;Pixel Envy&lt;/a&gt; are good tech and Apple blogs (see also &lt;a href="http://mattgemmell.com"&gt;Matt Gemmell&lt;/a&gt;, &lt;a href="http://sivers.org"&gt;Derek Sivers&lt;/a&gt;, &lt;a href="http://dcurt.is"&gt;Dustin Curtis&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  RSS App
&lt;/h2&gt;

&lt;p&gt;The final piece of the puzzle is actually reading the feeds. In the very early days I would manually click on bookmarks (that was well before the iPhone). Then, I was a huge fan of Safari’s built in RSS reader. When that shut down I moved to Digg. I loved Digg reader since it synced across both an iPhone app and a website.&lt;/p&gt;

&lt;p&gt;Currently, I’m using &lt;a href="https://www.inoreader.com"&gt;Inoreader&lt;/a&gt;. They just released a major update to the iOS app and I am really liking the new design.&lt;/p&gt;

&lt;p&gt;While I do like the built-in ability to bookmark or save an article for later, that really backfires when the service shut down. I had about 400 saved articles in Digg, of which 300 or so made it to my &lt;a href="https://pinboard.in/u:gonsie"&gt;pinboard.in&lt;/a&gt; account.&lt;/p&gt;

</description>
      <category>blog</category>
    </item>
  </channel>
</rss>
