<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" >

  <title>Erik L. Arneson — Writer and Software Developer</title>
  <subtitle>Erik L. Arneson is a freelance writer and software developer with WordPress experience. He is located in Portland, Oregon.</subtitle>
  <generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator>
  <link href="https://arnesonium.com/feeds/shell.xml" rel="self" type="application/atom+xml" />
  <link href="https://arnesonium.com/" rel="alternate" type="text/html" />
  <updated>2026-06-18T15:03:10+00:00</updated>
  <id>https://arnesonium.com/feeds/shell.xml</id>
  <author>
    <name>Erik L. Arneson</name>
  </author>
      <entry>
        
        <title>An Emacs Application Launcher for Regolith</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2025/11/regolith-emacs-launcher" rel="alternate" type="text/html" title="An Emacs Application Launcher for Regolith" />
        <updated>2025-11-19T00:00:00+00:00</updated>
        <id>https://arnesonium.com/2025/11/regolith-emacs-launcher</id>
          <category term="emacs" />
        
          <category term="shell" />
        
          <category term="bash" />
        
          <category term="lisp" />
        
          <category term="programming" />
        
          <category term="ubuntu" />
        <content type="html" xml:base="https://arnesonium.com/2025/11/regolith-emacs-launcher">&lt;p&gt;I run the &lt;a href=&quot;https://regolith-desktop.com/&quot;&gt;Regolith Desktop Environment&lt;/a&gt; on my laptop, which I love because it provides a convenient GNOME wrapper and interface for the &lt;a href=&quot;https://i3wm.org/&quot;&gt;i3 tiling window manager&lt;/a&gt;. Regolith relies on a program called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ilia&lt;/code&gt; for application launching, and sometimes &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ilia&lt;/code&gt; gets caught in some kind of CPU-churning state that locks up my whole system. I have not been able to figure out what is causing it, so I (of course) turned to Emacs for a solution.&lt;/p&gt;

&lt;!--more--&gt;

&lt;h2 id=&quot;turning-to-consult-omni&quot;&gt;Turning to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;consult-omni&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Armin Darvish has created a powerful Emacs package called &lt;a href=&quot;https://github.com/armindarvish/consult-omni&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;consult-omni&lt;/code&gt;&lt;/a&gt;, which provides a wrapper around &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;consult&lt;/code&gt; for searching through any number of information sources. I believe &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;consult-omni&lt;/code&gt; was originally intended to query web search engines and document databases, but Darvish has also provided a search mode for your local desktop applications, and can act as an application launcher.&lt;/p&gt;

&lt;p&gt;Darvish provides an example application launcher in his &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;consult-omni&lt;/code&gt; YouTube tutorial. The source code is straightforward, but I wanted to tweak it just a little. You can view &lt;a href=&quot;https://github.com/armindarvish/consult-omni/wiki/YouTube-Tutorial#create-a-launcher&quot;&gt;his original on the project’s wiki on GitHub&lt;/a&gt;. You can watch him explain his technique below.&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/wNH2E7iT__c?start=8595&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;After a few tweaks, here is what I came up with.&lt;/p&gt;

&lt;div class=&quot;language-emacs-lisp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;defun&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;consult-launcher&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&quot;A launcher suitable for use from a window manager.&quot;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;interactive&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;let*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;width&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;floor&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.6&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;display-pixel-width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))))&lt;/span&gt;
         &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;height&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;floor&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.6&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;display-pixel-height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))))&lt;/span&gt;
         &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;left&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;floor&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.2&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;display-pixel-width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))))&lt;/span&gt;
         &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;top&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;floor&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.2&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;display-pixel-height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))))&lt;/span&gt;
         &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;params&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;omni-launcher&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;width&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cons&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;&apos;text-pixels&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
                   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;height&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cons&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;&apos;text-pixels&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
                   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;left&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;top&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;top&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;minibuffer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;only&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;
         &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;frame&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;make-frame&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;with-selected-frame&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;frame&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;select-frame-set-input-focus&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;;; If i3 is running and there is a control socket, let&apos;s tell&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;;; it we are a floating frame.&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;getenv&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;I3SOCK&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
          &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;call-process&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;i3-msg&quot;&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;
                        &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;format&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;[id=%s] floating enable&quot;&lt;/span&gt;
                                &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;s-trim&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;shell-command-to-string&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;xdotool getactivewindow&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))))&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;unwind-protect&lt;/span&gt;
          &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;progn&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;consult-omni-apps-static&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;.*&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;propertize&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&amp;gt; &quot;&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;&apos;face&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;&apos;consult-omni-path-face&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
                 &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;progn&lt;/span&gt;
          &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;when&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;frame-live-p&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;delete-frame&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
          &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I made two changes to get this to work nicely with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;i3&lt;/code&gt;. First, I removed the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;yequake&lt;/code&gt; dependency. Second, I added a call to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;i3-msg&lt;/code&gt; that sets the launcher frame as floating, which makes it much nicer to use. Like Darvish’s version, you can run this from the command line:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;emacsclient -e &apos;(consult-launcher)&apos;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;adding-an-ilia-fallback&quot;&gt;Adding an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ilia&lt;/code&gt; fallback&lt;/h2&gt;

&lt;p&gt;Don’t tell all the other Emacs users, but I don’t have Emacs set up to launch automatically when I start my computer and log into X11. I probably should, huh? Also, there are times when I (gasp!) shut down Emacs, usually to restart it or fix something that I have broken. When those times happen, I want to be able to launch applications, so I need a failsafe in case &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;consult-launcher&lt;/code&gt; isn’t available!&lt;/p&gt;

&lt;p&gt;To solve this, I created a simple shell wrapper script, which looks like this:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/bash&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Check if Emacs server is running by looking for the server socket&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# Default server name is &quot;server&quot;, but you can change this if needed&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;SERVER_NAME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;EMACS_SERVER_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:-&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;server&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;SERVER_FILE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;XDG_RUNTIME_DIR&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:-&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/tmp&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/emacs/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SERVER_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-S&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$SERVER_FILE&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;# Emacs is running, use emacsclient to launch your application&lt;/span&gt;
    emacsclient &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;(consult-launcher)&apos;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;# Emacs is not running, fall back to ilia&lt;/span&gt;
    ilia &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; apps
&lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If you want to use this, the important part is that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SERVER_FILE&lt;/code&gt; points to the socket that your Emacs server uses. Make sure that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;emacsclient&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ilia&lt;/code&gt; are both in a reasonable location so your shell can find them, then bind this command to whatever you usually use to launch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ilia&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;By the way, if you are using Regolith’s normal method of launching &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ilia&lt;/code&gt;, you can add your shell script to your Regolith configuration pretty easily. Open &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$HOME/.config/regolith3/Xresources&lt;/code&gt; in your text editor, and add the line:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;wm.program.launcher.app: /path/to/your/launcher.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can then run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xrdb -override $HOME/.config/regolith3/Xresources&lt;/code&gt; and it should work! Good luck.&lt;/p&gt;

&lt;h2 id=&quot;drawbacks&quot;&gt;Drawbacks&lt;/h2&gt;

&lt;p&gt;One of the nice things about &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ilia&lt;/code&gt; is that it keeps track of applications your run frequently, so they tend to bubble up to the top of its application listing. The Emacs method doesn’t do that. I don’t mind so much, I always end up typing in application names. It is fun to use Emacs as an application launcher, and I hope that it helps me avoid the CPU-churn problem that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ilia&lt;/code&gt; has been experiencing far too often.&lt;/p&gt;

&lt;p&gt;Have I come up with a clever solution, or a lazy workaround? I’m looking forward to hearing your thoughts.&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Some Great Fish Shell Plugins</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2022/09/some-great-fish-shell-plugins/" rel="alternate" type="text/html" title="Some Great Fish Shell Plugins" />
        <updated>2022-09-23T17:44:00+00:00</updated>
        <id>https://arnesonium.com/2022/09/some-great-fish-shell-plugins</id>
          <category term="automation" />
        
          <category term="command-line" />
        
          <category term="emacs" />
        
          <category term="fish-shell" />
        
          <category term="howto" />
        
          <category term="ide" />
        
          <category term="shell" />
        <content type="html" xml:base="https://arnesonium.com/2022/09/some-great-fish-shell-plugins/">&lt;p&gt; As a long-time Linux user, I am pretty comfortable with command line interfaces. However, as I started learning more about automation and how important it is to get your computer to do more work for you, I leaned toward wanting my command line shell to do more. Eventually I switched to &lt;a href=&quot;https://fishshell.com/&quot;&gt;fish shell&lt;/a&gt;, a very user-friendly shell with excellent scripting capabilities that is far more readable and less obscure than bash. &lt;/p&gt;
&lt;!--more--&gt;
&lt;div id=&quot;outline-container-orgbd4e930&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;orgbd4e930&quot;&gt;Plugins for fish&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-orgbd4e930&quot;&gt;
&lt;p&gt; There have been a few plugin managers over the years, but the one that seems to be the best maintained and most usable is &lt;a href=&quot;https://github.com/jorgebucaran/fisher&quot;&gt;fisher&lt;/a&gt;, created by &lt;a href=&quot;https://twitter.com/jorgebucaran&quot;&gt;Jorge Bucaran&lt;/a&gt;. It allows you to easily install plugins straight from GitHub repositories, while updates can be executed with a simple &lt;code&gt;fisher update&lt;/code&gt; on the command line. &lt;/p&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-org0108c85&quot; class=&quot;outline-3&quot;&gt;
&lt;h3 id=&quot;org0108c85&quot;&gt;z&lt;/h3&gt;
&lt;div class=&quot;outline-text-3&quot; id=&quot;text-org0108c85&quot;&gt;
&lt;p&gt; &lt;b&gt;One of the greatest command-line time savers ever&lt;/b&gt; is the &lt;code&gt;z&lt;/code&gt; command. Originally a bash script, it has been ported to fish and, frankly, I love it. &lt;/p&gt;

&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;b&gt;What does it do?&lt;/b&gt; &lt;code&gt;z&lt;/code&gt; provides shorthand for visiting directories based on a combination of frequency and recency&amp;#x2014;or &quot;frecency&quot;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; If you frequently visit the &lt;code&gt;/opt/calibre&lt;/code&gt; directory, a &lt;code&gt;z calib&lt;/code&gt; command will allow you to jump straight there. &lt;/p&gt;

&lt;p&gt; If you already have fisher installed, just use &lt;code&gt;fisher install jethrokuan/z&lt;/code&gt; and start playing around with &lt;code&gt;z&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt; &lt;a href=&quot;https://github.com/jethrokuan/z&quot;&gt;You can read more about &lt;code&gt;z&lt;/code&gt; here.&lt;/a&gt; &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orga78b5fb&quot; class=&quot;outline-3&quot;&gt;
&lt;h3 id=&quot;orga78b5fb&quot;&gt;pisces&lt;/h3&gt;
&lt;div class=&quot;outline-text-3&quot; id=&quot;text-orga78b5fb&quot;&gt;
&lt;p&gt; &lt;b&gt;Your IDE has been handling your parenthesis for ages.&lt;/b&gt; Now your shell can do the same! The &lt;a href=&quot;https://github.com/laughedelic/pisces&quot;&gt;pisces&lt;/a&gt; plugin has automatic matching symbol management for parenthesis, braces, quotes, and others. &lt;/p&gt;

&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;b&gt;Install it with fisher&lt;/b&gt; using the command &lt;code&gt;fisher install laughedelic/pisces&lt;/code&gt; and be matching parens in seconds!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;a href=&quot;https://github.com/laughedelic/pisces&quot;&gt;You can read more about the pisces plugin here.&lt;/a&gt; &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orgc02da30&quot; class=&quot;outline-3&quot;&gt;
&lt;h3 id=&quot;orgc02da30&quot;&gt;plugin-emacs&lt;/h3&gt;
&lt;div class=&quot;outline-text-3&quot; id=&quot;text-orgc02da30&quot;&gt;
&lt;p&gt; &lt;b&gt;Automation can help you interact with your editor&lt;/b&gt; from your shell. The &lt;a href=&quot;https://github.com/pymander/plugin-emacs&quot;&gt;Emacs plugin for fish&lt;/a&gt; was originally written for an unmaintained plugin manager called &lt;a href=&quot;https://github.com/oh-my-fish/oh-my-fish&quot;&gt;Oh My Fish&lt;/a&gt;. However, I wanted the plugin to work with fisher, so I made &lt;a href=&quot;https://github.com/pymander/plugin-emacs&quot;&gt;my own fork&lt;/a&gt;. &lt;/p&gt;

&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;b&gt;How does it work?&lt;/b&gt; This plugin adds easy commands like &lt;code&gt;ef&lt;/code&gt; and &lt;code&gt;ed&lt;/code&gt; that allow you to open files and directories in Emacs quickly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; Install it quickly using the command &lt;code&gt;fisher install pymander/plugin-emacs&lt;/code&gt; and &lt;a href=&quot;https://github.com/pymander/plugin-emacs&quot;&gt;read more about it here&lt;/a&gt;. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orga8ddcd0&quot; class=&quot;outline-3&quot;&gt;
&lt;h3 id=&quot;orga8ddcd0&quot;&gt;vfish&lt;/h3&gt;
&lt;div class=&quot;outline-text-3&quot; id=&quot;text-orga8ddcd0&quot;&gt;
&lt;p&gt; &lt;b&gt;Emacs users have probably heard of vterm,&lt;/b&gt; which is the &lt;a href=&quot;https://github.com/akermu/emacs-libvterm&quot;&gt;Emacs package that interacts with libvterm&lt;/a&gt;. It is a powerful terminal emulator that runs in an Emacs buffer. I wrote &lt;a href=&quot;https://github.com/pymander/vfish&quot;&gt;a fish plugin called vfish&lt;/a&gt; that simplifies using fish in vterm. &lt;/p&gt;

&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;b&gt;How does it work?&lt;/b&gt; Inside a vterm session, this plugin adds fish commands like &lt;code&gt;vf&lt;/code&gt; and &lt;code&gt;vd&lt;/code&gt; to open files and directories quickly. It mirrors the Emacs plugin.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; Install it using the command &lt;code&gt;fisher install pymander/vfish&lt;/code&gt; and &lt;a href=&quot;https://github.com/pymander/vfish&quot;&gt;read more about it here&lt;/a&gt;. Note that &lt;b&gt;it will require some code&lt;/b&gt; to be added to your Emacs startup file.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orgf6c1785&quot; class=&quot;outline-3&quot;&gt;
&lt;h3 id=&quot;orgf6c1785&quot;&gt;apt&lt;/h3&gt;
&lt;div class=&quot;outline-text-3&quot; id=&quot;text-orgf6c1785&quot;&gt;
&lt;p&gt; For Debian and Ubuntu users, the &lt;a href=&quot;https://github.com/oh-my-fish/plugin-apt&quot;&gt;Oh My Fish apt plugin&lt;/a&gt; works seamlessly with fisher. &lt;/p&gt;

&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;b&gt;What does it do?&lt;/b&gt; The apt plugin adds a wrapper around the &lt;code&gt;apt&lt;/code&gt; and &lt;code&gt;apt-get&lt;/code&gt; commands that simplify package management from the command line.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; Install this plugin quickly with &lt;code&gt;fisher install oh-my-fish/plugin-apt&lt;/code&gt; and then &lt;a href=&quot;https://github.com/oh-my-fish/plugin-apt&quot;&gt;read more about it&lt;/a&gt;. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orgef254fe&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;orgef254fe&quot;&gt;What&apos;s your favorite fisher plugin?&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-orgef254fe&quot;&gt;
&lt;p&gt; I love finding plugins that can help me automate more of my everyday tasks and workflows. What&apos;s your favorite fisher plugin? &lt;/p&gt;

&lt;p&gt; Leave a comment below and let me know! Be sure to include a link. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</content>
      </entry>
    
      <entry>
        
        <title>Handy Tools for the Bourne Again Shell</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2014/12/handy-tools-for-the-bourne-again-shell/" rel="alternate" type="text/html" title="Handy Tools for the Bourne Again Shell" />
        <updated>2014-12-01T16:38:30+00:00</updated>
        <id>https://arnesonium.com/2014/12/handy-tools-for-the-bourne-again-shell</id>
          <category term="bash" />
        
          <category term="programming" />
        
          <category term="shell" />
        <content type="html" xml:base="https://arnesonium.com/2014/12/handy-tools-for-the-bourne-again-shell/">&lt;p&gt;If you’re a Unix geek, you’ve probably used bash, the Bourne-Again Shell. If you’ve been around a while, you’ve probably spent a lot of time customizing bash.
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;Back when I worked for Yahoo!, my friend Bryan gave me a great directory stack for bash. I loved it, so I rewrote it and have been hacking on it and using it ever since. Observe.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[user@host:~]$ cd /tmp
[user@host:/tmp]$ cd /var/log
[user@host:/var/log]$ dl
1   ~
2   /tmp
3 * /var/log
[user@host:/var/log]$ go 1
1   /home/user
[user@host:~]$ go log
3   /var/log
[user@host:/var/log]$ 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In addition to the handy new &lt;code&gt;go&lt;/code&gt; command, it also includes &lt;code&gt;b&lt;/code&gt; and &lt;code&gt;f&lt;/code&gt; for moving backwards and forwards on the stack. It was inspired by &lt;code&gt;pushd&lt;/code&gt; and &lt;code&gt;popd&lt;/code&gt;, but it’s so much more.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://arnesonium.com/wp-content/uploads/2014/11/sea_shell.jpg&quot;&gt;&lt;img src=&quot;https://arnesonium.com/wp-content/uploads/2014/11/sea_shell-300x211.jpg#left&quot; alt=&quot;Not this kind of shell.&quot; width=&quot;300&quot; height=&quot;211&quot; class=&quot;size-medium wp-image-65&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’d like to check it out, take a look at my &lt;a href=&quot;https://github.com/pymander/bashtools&quot;&gt;bashtools repository on GitHub&lt;/a&gt; or just &lt;a href=&quot;https://github.com/pymander/bashtools/archive/v1.0.tar.gz&quot; title=&quot;bashtools 1.0&quot;&gt;download version 1.0&lt;/a&gt;. I don’t change it very often, but I’m thinking of hammering out a long-standing bug in the directory stack code.&lt;/p&gt;

&lt;p&gt;N.B. If you use all of my scripts, you’ll get some great prompts for your xterms. You’re welcome!&lt;/p&gt;</content>
      </entry>
    
</feed>
