<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Terminal on The Thumbs Up Blog</title><link>https://thumbsup.me/tags/terminal/</link><description>Recent content in Terminal on The Thumbs Up Blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 24 May 2026 12:00:00 +0000</lastBuildDate><atom:link href="https://thumbsup.me/tags/terminal/index.xml" rel="self" type="application/rss+xml"/><item><title>Tinkering with Linux! Part Deux</title><link>https://thumbsup.me/posts/vim-everywhere-on-linux/</link><pubDate>Sun, 24 May 2026 12:00:00 +0000</pubDate><guid>https://thumbsup.me/posts/vim-everywhere-on-linux/</guid><description>&lt;p&gt;Hey friends 👋&lt;/p&gt;
&lt;p&gt;If you read &lt;a href="https://thumbsup.me/posts/i-put-linux-on-a-thinkpad/" target="_blank" rel="noopener noreferrer"&gt;my last blog post&lt;/a&gt;, you&amp;rsquo;ll know that I picked up a used Thinkpad on ebay to experiment with Linux. In that post I talked about my many experiences with Linux through the years and I recounted my distro-hopping adventure, as it relates to this new laptop.&lt;/p&gt;
&lt;p&gt;By the end of that post, I had landed on using &lt;a href="https://projectbluefin.io/" target="_blank" rel="noopener noreferrer"&gt;Bluefin&lt;/a&gt;, an &lt;em&gt;immutable&lt;/em&gt; Linux distribution with a lot of thoughtful modern considerations. But I bought this Thinkpad because I wanted to tinker, and Bluefin presented too many limitations that I didn&amp;rsquo;t know how to overcome. Without a package manager of its own (it relies on a combination of Homebrew and flatpak for almost all software), you lose out on a lot of the more community-driven tools that can enable the kind of tinkering I was looking for.&lt;/p&gt;</description><content:encoded>
<![CDATA[<p>Hey friends 👋</p>
<p>If you read <a href="https://thumbsup.me/posts/i-put-linux-on-a-thinkpad/" target="_blank" rel="noopener noreferrer">my last blog post</a>, you&rsquo;ll know that I picked up a used Thinkpad on ebay to experiment with Linux. In that post I talked about my many experiences with Linux through the years and I recounted my distro-hopping adventure, as it relates to this new laptop.</p>
<p>By the end of that post, I had landed on using <a href="https://projectbluefin.io/" target="_blank" rel="noopener noreferrer">Bluefin</a>, an <em>immutable</em> Linux distribution with a lot of thoughtful modern considerations. But I bought this Thinkpad because I wanted to tinker, and Bluefin presented too many limitations that I didn&rsquo;t know how to overcome. Without a package manager of its own (it relies on a combination of Homebrew and flatpak for almost all software), you lose out on a lot of the more community-driven tools that can enable the kind of tinkering I was looking for.</p>
<p>We&rsquo;ll talk about which distro I ended up on in a bit. But I want to start by talking about the specific tinkering I was trying to do.</p>
<p>First off, my Thinkpad has a fingerprint sensor. It&rsquo;s well supported on Linux and on Gnome—the desktop environment which Bluefin comes with—there&rsquo;s even a nice GUI in the settings menu for enrolling fingerprints. You simply go to <strong>Settings &gt; System &gt; Users &gt; Fingerprint Login</strong> and you should be able to enroll multiple fingerprints for authentication.</p>
<p>However, before you can enroll fingerprints, on certain distros, you may have to install a set of packages called <code>fprintd</code> and/or <code>libfprint</code> in order for the fingerprint sensor to be recognized by the system. This was the case for me on Bluefin, and due to the limitations of Bluefin&rsquo;s package options, there was seemingly no way to install these particular packages.</p>
<p>That wasn&rsquo;t a deal breaker though.</p>
<h2 id="the-vim-ultimatum">The Vim Ultimatum</h2>
<p>A few years ago on my Mac, when I began using the terminal-based text editor <a href="https://neovim.io/" target="_blank" rel="noopener noreferrer">Neovim</a> more and more, I fell in love with home row navigation. For those who are unaware, in the text editors Vim and Neovim, you do absolutely everything with the keyboard. This allows for a lot of unique key commands to move and manipulate your way through code and text; most of which is well beyond the scope of this post. The core functionality though is the use of the home row letters h, j, k, and l as substitutes for the arrow keys.</p>


    <blockquote style="margin:1.25rem 0;padding:0.85rem 1.1rem;border-left:4px solid #8aadf4;border-radius:0 8px 8px 0;background:#1e2a3a;font-family:sans-serif;">
        <p style="margin:0 0 0.4rem 0;font-weight:700;font-size:0.85rem;text-transform:uppercase;letter-spacing:0.06em;opacity:0.8;">Vim Primer</p>
        <p>h = left<br>
j = down<br>
k = up<br>
l = right</p>
    </blockquote><p>This can take a bit of getting used to, but the key benefit is that you never need to move your hands out of the standard home row typing position, making it both more efficient and a lot more comfortable.</p>
<p>In fact, once I got familiar with this approach to cursor movement, I found it really annoying anytime I had to move using the keyboard&rsquo;s actual directional keys, which require one to reposition the right hand down and to the right and then reset to the home row to begin typing again. The more often you alternate between moving and typing the more unpleasant this becomes.</p>
<div class="social-card-final cnt-undo" style="margin: 1.5rem auto; max-width: 550px; border: 1px solid var(--color-neso-deco2); border-radius: 12px; padding: 16px; background: var(--color-neso-bg2); color: var(--color-neso-fg2); font-family: var(--font-sans); position: relative; overflow: hidden;">
  <div style="display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px;">
    <div style="display: flex; align-items: center; gap: 10px; min-width: 0;">
      <img src="/original_10245280551282026412_hu_81f4ab19ec4e089a.webp" style="width: 40px; height: 40px; border-radius: 50%; flex-shrink: 0; object-fit: cover; margin: 0 !important;" />
      <div style="display: flex; align-items: center; gap: 6px; flex-wrap: wrap; min-width: 0;">
        <span style="font-weight: 700; color: var(--color-neso-fg1); font-size: 1rem; white-space: nowrap;">Thumbs Up</span><span style="color: var(--color-neso-fg3); font-size: 0.85rem;">in</span>
        <span style="display: inline-flex; align-items: center; gap: 4px; background: var(--color-neso-deco3); border-radius: 999px; padding: 2px 8px 2px 4px; font-size: 0.85rem; font-weight: 600; color: var(--color-neso-fg2); white-space: nowrap;"><img src="/bafkreigbei45ni5zsliszzeivotgee5auj2ykkh6zrzjwvm4izviidusny_14760476115126135129_hu_c1d9cd1b92e0f9a8.webp" style="width: 16px; height: 16px; border-radius: 50%; object-fit: cover; flex-shrink: 0; margin: 0 !important;" />dev</span></div>
    </div>
    <a href="https://farcaster.xyz/thumbsup.eth/0xb80e5e7d" target="_blank" style="color: #6A3CFF; align-self: flex-start; margin-top: 2px; transition: transform 0.2s; display: flex; flex-shrink: 0; width: 28px; height: 28px;" onmouseover="this.style.transform='scale(1.2)'" onmouseout="this.style.transform='scale(1)'">
      <svg width="28" height="28" viewBox="0 0 200 175" fill="currentColor" xmlns="http://www.w3.org/2000/svg" style="display: block; margin: 0 !important;"><path d="M200 0V23.6302H176.288V47.2404H183.553V47.2483H200V175H160.281L160.256 174.883L139.989 79.3143C138.057 70.2043 133 61.9616 125.751 56.0995C118.502 50.2376 109.371 47.0108 100.041 47.0108H99.9613C90.631 47.0108 81.5 50.2376 74.251 56.0995C67.0023 61.9616 61.9453 70.2073 60.013 79.3143L39.7223 175H0V47.2453H16.4475V47.2404H23.7114V23.6302H0V0H200Z"/></svg>
    </a>
  </div>

  <div style="font-size: 1.05rem; line-height: 1.5; margin-bottom: 12px; color: var(--color-neso-fg1);">I've gotten so used to my caps lock + hjkl = arrow keys that it's super hard for me to use computers when that's not configured. I imagine this is how it is for people who use keyboards with layers.
  </div><div style="border-top: 1px solid var(--color-neso-deco3); padding-top: 12px; margin-top: 16px; display: flex; justify-content: space-between; align-items: center;">
    <time class="social-card-time" datetime="2026-04-12T17:13:12Z" style="color: var(--color-neso-fg3); font-size: 0.9rem;">Apr 12, 2026 at 5:13 PM UTC</time>
    <a href="https://farcaster.xyz/thumbsup.eth/0xb80e5e7d" target="_blank" style="color: #6A3CFF; font-weight: 600; text-decoration: none; font-size: 0.9rem; transition: color 0.2s ease-in-out;" onmouseover="this.style.color='#8C66FF'" onmouseout="this.style.color='#6A3CFF'">View on Farcaster</a>
  </div>
</div><script>
if (!window.__scLb) {
  var _lbImg = document.createElement('img');
  _lbImg.style.cssText = 'max-width:92vw;max-height:92vh;object-fit:contain;border-radius:8px;cursor:default;';
  _lbImg.addEventListener('click', function(e) { e.stopPropagation(); });
  var _lbOv = document.createElement('div');
  _lbOv.style.cssText = 'display:none;position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,0.88);cursor:zoom-out;align-items:center;justify-content:center;';
  _lbOv.appendChild(_lbImg);
  _lbOv.addEventListener('click', function() { _lbOv.style.display = 'none'; document.body.style.overflow = ''; });
  document.addEventListener('keydown', function(e) { if (e.key === 'Escape') { _lbOv.style.display = 'none'; document.body.style.overflow = ''; } });
  document.body.appendChild(_lbOv);
  window.__scLb = function(src) { _lbImg.src = src; _lbOv.style.display = 'flex'; document.body.style.overflow = 'hidden'; };
}
</script>
<p>Fortunately, I&rsquo;m not the only person who loves using Vim navigation, so people have invented a number of ways to integrate this into your workflow. Code editors based on VS Code have extensions to add full Vim command support, and the incredible open-source alternative, <a href="https://zed.dev/" target="_blank" rel="noopener noreferrer">Zed</a> has unparalleled Vim support baked-in. There&rsquo;s also browser extensions like <a href="https://chromewebstore.google.com/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb?pli=1" target="_blank" rel="noopener noreferrer">Vimium</a> that add pretty elaborate keyboard based navigation to any Chromium-based browser. And there are even niche web browsers like <a href="https://qutebrowser.org/index.html" target="_blank" rel="noopener noreferrer">qutebrowser</a> which have vim navigation as the default.</p>
<p>But none of that was enough for me. I wanted system wide Vim navigation. Nothing fancy. Just a way to enable Vim navigation when I want it, without affecting my ability to input text, or making my computer unusable by anyone other than me.</p>
<p>That&rsquo;s where an app called <a href="https://karabiner-elements.pqrs.org/" target="_blank" rel="noopener noreferrer">Karabiner Elements</a> comes in. This Mac-only app gives your computer superpowers. Through a relatively simple GUI, you can enable custom key-mappings from the most simple to the unimaginably elaborate. And what&rsquo;s more, there&rsquo;s a whole community of users sharing their templates, which they call <em>rules</em>.</p>
<p>There&rsquo;s actually several predefined rules that do exactly what I wanted. Originally I used one called <code>Use CAPS LOCK for vi navigation</code> which was
great and I would recommend to most people.</p>
<figure><img src="/posts/vim-everywhere-on-linux/caps-lock-vim.png"
    alt="Karabiner Elements rule: Use CAPS LOCK for vi navigation">
</figure>

<p>But I&rsquo;m a <em>hyper key</em> user. What does that mean? Well, as someone who uses a lot of professional software on Mac (Adobe Suite, Final Cut Pro, Affinity, Ableton), I need to make use of program-specific keyboard shortcuts all the time. So as a result, any custom keyboard shortcuts I create and use on my system need to be free of conflict in all other programs.</p>
<p>The easiest way to avoid conflict is to introduce a hyper key, which is a key that your computer recognizes as a cluster of other keys (most often every other modifier key combined). Since almost no software will make their users press all these keys at once to activate a feature (shortcuts are supposed to be fast under the fingers after all), a hyper key is almost universally ideal for system-wide shortcuts.</p>
<p>Where am I going with this? Well, most people—myself included—map their hyper key to Caps Lock, since that is a basically useless key located in one of the most ideal places on the keyboard: the home row. Karabiner Elements has a number of predefined rules that can enable this functionality, but I actually do it with Raycast, which also allows me to use the hyper key for all my different custom launcher shortcuts, like quickly opening apps, tiling windows, and moving through virtual desktops. Even Raycast&rsquo;s clipboard manager is mapped to hyper + v, so it doesn&rsquo;t cause any issue with the regular paste functionality.</p>
<p>Because of my remapping, my Caps Lock is not actually registering as Caps Lock, but as hyper ( ⌘ + ⌥ + ⌃ + ⇧ ), so I have to use a different Karabiner rule. I found one called <code>Change hyper-(jikl) to (←↑↓→) keys</code> which is close.</p>
<figure><img src="/posts/vim-everywhere-on-linux/hyper-vim.png"
    alt="Karabiner Elements rule: Change hyper-(jikl) to arrow keys">
</figure>

<p>As you can see this one uses JIKL for that standard arrow keys layout. Kind of like the way gamers use WASD. If I had never used Vim, I would probably be using this approach, and if you are happy with that configuration, you could enable that and go on your merry way.</p>
<p>For me though, I needed to edit the configuration to work the Vim way. If you do want to do that, here is my entire edited config that you can copy and paste into Karabiner&rsquo;s rule editor.</p>
<pre tabindex="0"><code>{
    &#34;description&#34;: &#34;Change hyper-(hjkl) to (←↑↓→) keys&#34;,
    &#34;manipulators&#34;: [
        {
            &#34;from&#34;: {
                &#34;key_code&#34;: &#34;h&#34;,
                &#34;modifiers&#34;: {
                    &#34;mandatory&#34;: [&#34;left_command&#34;, &#34;left_option&#34;, &#34;left_control&#34;, &#34;left_shift&#34;],
                    &#34;optional&#34;: [&#34;any&#34;]
                }
            },
            &#34;to&#34;: [{ &#34;key_code&#34;: &#34;left_arrow&#34; }],
            &#34;type&#34;: &#34;basic&#34;
        },
        {
            &#34;from&#34;: {
                &#34;key_code&#34;: &#34;k&#34;,
                &#34;modifiers&#34;: {
                    &#34;mandatory&#34;: [&#34;left_command&#34;, &#34;left_option&#34;, &#34;left_control&#34;, &#34;left_shift&#34;],
                    &#34;optional&#34;: [&#34;any&#34;]
                }
            },
            &#34;to&#34;: [{ &#34;key_code&#34;: &#34;up_arrow&#34; }],
            &#34;type&#34;: &#34;basic&#34;
        },
        {
            &#34;from&#34;: {
                &#34;key_code&#34;: &#34;j&#34;,
                &#34;modifiers&#34;: {
                    &#34;mandatory&#34;: [&#34;left_command&#34;, &#34;left_option&#34;, &#34;left_control&#34;, &#34;left_shift&#34;],
                    &#34;optional&#34;: [&#34;any&#34;]
                }
            },
            &#34;to&#34;: [{ &#34;key_code&#34;: &#34;down_arrow&#34; }],
            &#34;type&#34;: &#34;basic&#34;
        },
        {
            &#34;from&#34;: {
                &#34;key_code&#34;: &#34;l&#34;,
                &#34;modifiers&#34;: {
                    &#34;mandatory&#34;: [&#34;left_command&#34;, &#34;left_option&#34;, &#34;left_control&#34;, &#34;left_shift&#34;],
                    &#34;optional&#34;: [&#34;any&#34;]
                }
            },
            &#34;to&#34;: [{ &#34;key_code&#34;: &#34;right_arrow&#34; }],
            &#34;type&#34;: &#34;basic&#34;
        }
    ]
}</code></pre><p>Now, anywhere on my system, whenever I want to move left, right, up, or down, I&rsquo;m simply moving my left pinky over to the Caps Lock key and using my home row fingers to move with ease.</p>
<h2 id="surely-this-must-be-easy-on-linux">Surely this must be easy on Linux</h2>
<p>Spoiler alert: it wasn&rsquo;t.</p>
<p>Well&hellip; that&rsquo;s not entirely true either. But we&rsquo;ll get there. Let&rsquo;s start one month ago, around the time I released my post about installing Linux on my Thinkpad.</p>
<p>I was looking all over for a way to get the same functionality I had configured on my Mac to work on my new Linux setup. As I was on Bluefin, I decided to reach out to the project lead, Jorge Castro.</p>
<div class="social-card-final cnt-undo" style="margin: 1.5rem auto; max-width: 550px; border: 1px solid var(--color-neso-deco2); border-radius: 12px; padding: 16px; background: var(--color-neso-bg2); color: var(--color-neso-fg2); font-family: var(--font-sans); position: relative; overflow: hidden;">
  <div style="display: flex; align-items: flex-start; justify-content: space-between; margin-bottom: 8px;">
    <div style="display: flex; align-items: center; gap: 12px;">
      <img src="/eaa7ad3827b8d387_7793939885977693570_hu_d1fd0365232b20e2.webp" style="width: 44px; height: 44px; border-radius: 50%; flex-shrink: 0; object-fit: cover;" />
      <div style="display: flex; flex-direction: column; line-height: 1.2;">
        <span style="font-weight: 700; color: var(--color-neso-fg1); font-size: 1rem;">Thumbs Up</span>
        <span style="color: var(--color-neso-fg3); font-size: 0.9rem;">@thumbsup</span>
      </div>
    </div>
    <a href="https://mastodon.online/@thumbsup/116473806808334676" target="_blank" style="color: #6364ff; align-self: flex-start; margin-top: 2px; transition: transform 0.2s ease-in-out; display: flex; flex-shrink: 0;" onmouseover="this.style.transform='scale(1.2)'" onmouseout="this.style.transform='scale(1)'">
      <svg width="28" height="28" viewBox="0 0 79 75" fill="currentColor" style="display: block;"><path d="M63 45.3v-20c0-4.1-1-7.3-3.2-9.7-2.1-2.4-5-3.7-8.5-3.7-4.1 0-7.2 1.6-9.3 4.7l-2 3.3-2-3.3c-2-3.1-5.1-4.7-9.2-4.7-3.5 0-6.4 1.3-8.6 3.7-2.1 2.4-3.1 5.6-3.1 9.7v20h8V25.9c0-4.1 1.7-6.2 5.2-6.2 3.8 0 5.8 2.5 5.8 7.4V37.7H44V27.1c0-4.9 1.9-7.4 5.8-7.4 3.5 0 5.2 2.1 5.2 6.2V45.3h8ZM74.7 16.6c.6 6 .1 15.7.1 17.3 0 .5-.1 4.8-.1 5.3-.7 11.5-8 16-15.6 17.5-.1 0-.2 0-.3 0-4.9 1-10 1.2-14.9 1.4-1.2 0-2.4 0-3.6 0-4.8 0-9.7-.6-14.4-1.7-.1 0-.1 0-.1 0s-.1 0-.1 0 0 .1 0 .1 0 0 0 0c.1 1.6.4 3.1 1 4.5.6 1.7 2.9 5.7 11.4 5.7 5 0 9.9-.6 14.8-1.7 0 0 0 0 0 0 .1 0 .1 0 .1 0 0 .1 0 .1 0 .1.1 0 .1 0 .1.1v5.6s0 .1-.1.1c0 0 0 0 0 .1-1.6 1.1-3.7 1.7-5.6 2.3-.8.3-1.6.5-2.4.7-7.5 1.7-15.4 1.3-22.7-1.2-6.8-2.4-13.8-8.2-15.5-15.2-.9-3.8-1.6-7.6-1.9-11.5-.6-5.8-.6-11.7-.8-17.5C3.9 24.5 4 20 4.9 16 6.7 7.9 14.1 2.2 22.3 1c1.4-.2 4.1-1 16.5-1h.1C51.4 0 56.7.8 58.1 1c8.4 1.2 15.5 7.5 16.6 15.6Z"/></svg>
    </a>
  </div><div style="font-size: 1.05rem; line-height: 1.6; margin-bottom: 12px; color: var(--color-neso-fg1);">
    <p style="margin:0 0 0.9em 0;">Anyone know the answer to this? I’m running <span class="h-card" translate="no"><a style="text-decoration:none;" href="https://fosstodon.org/@UniversalBlue" class="u-url mention">@<span>UniversalBlue</span></a></span> <a style="text-decoration:none;" href="https://mastodon.online/tags/Bluefin" class="mention hashtag" rel="tag">#<span>Bluefin</span></a>, and I want to map Caps Lock + hjkl as directional arrows (#vim style). What’s the best way to do this on <a style="text-decoration:none;" href="https://mastodon.online/tags/Linux" class="mention hashtag" rel="tag">#<span>Linux</span></a>? </p><p style="margin:0 0 0.9em 0;">I do this on Mac with Karabiner Elements and I’ve become pretty accustomed to the home key centric workflow it enables.</p>
  </div><div style="border-top: 1px solid var(--color-neso-deco3); padding-top: 12px; margin-top: 16px; display: flex; justify-content: space-between; align-items: center;">
    <time class="social-card-time" datetime="2026-04-27T00:20:49Z" style="color: var(--color-neso-fg3); font-size: 0.9rem;">Apr 27, 2026 at 12:20 AM UTC</time>
    <a href="https://mastodon.online/@thumbsup/116473806808334676" target="_blank" style="color: #6364ff; font-weight: 600; text-decoration: none; font-size: 0.9rem; transition: color 0.2s ease-in-out;" onmouseover="this.style.color='#8A8BFF'" onmouseout="this.style.color='#6364ff'">View on Mastodon</a>
  </div>
</div><script>
if (!window.__scLb) {
  var _lbImg = document.createElement('img');
  _lbImg.style.cssText = 'max-width:92vw;max-height:92vh;object-fit:contain;border-radius:8px;cursor:default;';
  _lbImg.addEventListener('click', function(e) { e.stopPropagation(); });
  var _lbOv = document.createElement('div');
  _lbOv.style.cssText = 'display:none;position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,0.88);cursor:zoom-out;align-items:center;justify-content:center;';
  _lbOv.appendChild(_lbImg);
  _lbOv.addEventListener('click', function() { _lbOv.style.display = 'none'; document.body.style.overflow = ''; });
  document.addEventListener('keydown', function(e) { if (e.key === 'Escape') { _lbOv.style.display = 'none'; document.body.style.overflow = ''; } });
  document.body.appendChild(_lbOv);
  window.__scLb = function(src) { _lbImg.src = src; _lbOv.style.display = 'flex'; document.body.style.overflow = 'hidden'; };
}
</script>

<p>Unfortunately, though he was nice enough to respond, he didn&rsquo;t have an answer for me.</p>
<div class="social-card-final cnt-undo" style="margin: 1.5rem auto; max-width: 550px; border: 1px solid var(--color-neso-deco2); border-radius: 12px; padding: 16px; background: var(--color-neso-bg2); color: var(--color-neso-fg2); font-family: var(--font-sans); position: relative; overflow: hidden;">
  <div style="display: flex; align-items: flex-start; justify-content: space-between; margin-bottom: 8px;">
    <div style="display: flex; align-items: center; gap: 12px;">
      <img src="/000d14dba920b516_18207881739220304751_hu_df61b8b23b43a320.webp" style="width: 44px; height: 44px; border-radius: 50%; flex-shrink: 0; object-fit: cover;" />
      <div style="display: flex; flex-direction: column; line-height: 1.2;">
        <span style="font-weight: 700; color: var(--color-neso-fg1); font-size: 1rem;">Jorge Castro</span>
        <span style="color: var(--color-neso-fg3); font-size: 0.9rem;">@jorge</span>
      </div>
    </div>
    <a href="https://hachyderm.io/@jorge/116476934873886166" target="_blank" style="color: #6364ff; align-self: flex-start; margin-top: 2px; transition: transform 0.2s ease-in-out; display: flex; flex-shrink: 0;" onmouseover="this.style.transform='scale(1.2)'" onmouseout="this.style.transform='scale(1)'">
      <svg width="28" height="28" viewBox="0 0 79 75" fill="currentColor" style="display: block;"><path d="M63 45.3v-20c0-4.1-1-7.3-3.2-9.7-2.1-2.4-5-3.7-8.5-3.7-4.1 0-7.2 1.6-9.3 4.7l-2 3.3-2-3.3c-2-3.1-5.1-4.7-9.2-4.7-3.5 0-6.4 1.3-8.6 3.7-2.1 2.4-3.1 5.6-3.1 9.7v20h8V25.9c0-4.1 1.7-6.2 5.2-6.2 3.8 0 5.8 2.5 5.8 7.4V37.7H44V27.1c0-4.9 1.9-7.4 5.8-7.4 3.5 0 5.2 2.1 5.2 6.2V45.3h8ZM74.7 16.6c.6 6 .1 15.7.1 17.3 0 .5-.1 4.8-.1 5.3-.7 11.5-8 16-15.6 17.5-.1 0-.2 0-.3 0-4.9 1-10 1.2-14.9 1.4-1.2 0-2.4 0-3.6 0-4.8 0-9.7-.6-14.4-1.7-.1 0-.1 0-.1 0s-.1 0-.1 0 0 .1 0 .1 0 0 0 0c.1 1.6.4 3.1 1 4.5.6 1.7 2.9 5.7 11.4 5.7 5 0 9.9-.6 14.8-1.7 0 0 0 0 0 0 .1 0 .1 0 .1 0 0 .1 0 .1 0 .1.1 0 .1 0 .1.1v5.6s0 .1-.1.1c0 0 0 0 0 .1-1.6 1.1-3.7 1.7-5.6 2.3-.8.3-1.6.5-2.4.7-7.5 1.7-15.4 1.3-22.7-1.2-6.8-2.4-13.8-8.2-15.5-15.2-.9-3.8-1.6-7.6-1.9-11.5-.6-5.8-.6-11.7-.8-17.5C3.9 24.5 4 20 4.9 16 6.7 7.9 14.1 2.2 22.3 1c1.4-.2 4.1-1 16.5-1h.1C51.4 0 56.7.8 58.1 1c8.4 1.2 15.5 7.5 16.6 15.6Z"/></svg>
    </a>
  </div><div style="font-size: 1.05rem; line-height: 1.6; margin-bottom: 12px; color: var(--color-neso-fg1);">
    <p style="margin:0 0 0.9em 0;"><span class="h-card" translate="no"><a style="text-decoration:none;" href="https://mastodon.online/@thumbsup" class="u-url mention">@<span>thumbsup</span></a></span> No clue on this one. I set caps to ctrl and that&#39;s as advanced as I get.</p>
  </div><div style="border-top: 1px solid var(--color-neso-deco3); padding-top: 12px; margin-top: 16px; display: flex; justify-content: space-between; align-items: center;">
    <time class="social-card-time" datetime="2026-04-27T13:36:19Z" style="color: var(--color-neso-fg3); font-size: 0.9rem;">Apr 27, 2026 at 1:36 PM UTC</time>
    <a href="https://hachyderm.io/@jorge/116476934873886166" target="_blank" style="color: #6364ff; font-weight: 600; text-decoration: none; font-size: 0.9rem; transition: color 0.2s ease-in-out;" onmouseover="this.style.color='#8A8BFF'" onmouseout="this.style.color='#6364ff'">View on Mastodon</a>
  </div>
</div><script>
if (!window.__scLb) {
  var _lbImg = document.createElement('img');
  _lbImg.style.cssText = 'max-width:92vw;max-height:92vh;object-fit:contain;border-radius:8px;cursor:default;';
  _lbImg.addEventListener('click', function(e) { e.stopPropagation(); });
  var _lbOv = document.createElement('div');
  _lbOv.style.cssText = 'display:none;position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,0.88);cursor:zoom-out;align-items:center;justify-content:center;';
  _lbOv.appendChild(_lbImg);
  _lbOv.addEventListener('click', function() { _lbOv.style.display = 'none'; document.body.style.overflow = ''; });
  document.addEventListener('keydown', function(e) { if (e.key === 'Escape') { _lbOv.style.display = 'none'; document.body.style.overflow = ''; } });
  document.body.appendChild(_lbOv);
  window.__scLb = function(src) { _lbImg.src = src; _lbOv.style.display = 'flex'; document.body.style.overflow = 'hidden'; };
}
</script>

<p>I tried googling for an answer but everything I found was wrong. I turned to AI, and it dug up the same wrong content and fed it to me in instruction form. One thing did seem clear to me though: just like my issue with the fingerprint sensor, this would be much harder than it needed to be if I were to stay on an immutable system.</p>
<p>So I jumped ship from Bluefin over to Fedora, where I was easily able to get my fingerprint sensor working and likely would have had no issue getting my Vim hack working if I knew then what I know now.</p>
<h2 id="intermission">Intermission</h2>
<p>Around that time, I had a lot on the go so I put down my Thinkpad for a few weeks. I was too busy with other projects and I didn&rsquo;t have any time to tinker. And, using my Mac, which is carefully configured how I want it, had me even less interested in pulling out the Thinkpad, knowing that I still couldn&rsquo;t use my preferred workflow. I would come back to it when I was ready.</p>
<p>When I finally picked up the Laptop again I was in a different headspace entirely. Having watched <a href="https://www.youtube.com/watch?v=TqIQtOfwgfA" target="_blank" rel="noopener noreferrer">a video by foci</a> about installing CachyOS with Niri, I decided to try installing it again. Unfortunately I had a similar issue to <a href="https://thumbsup.me/posts/i-put-linux-on-a-thinkpad/" target="_blank" rel="noopener noreferrer">last time</a> where once it was all set up and should have worked, it just crashed and I couldn&rsquo;t get it to boot again. Not sure why I&rsquo;m so unlucky with this particular distro.</p>
<p>As I was still in the mood to experiment with tiling window managers, I installed PikaOS again and I played with their Niri version for a bit. It&rsquo;s quite cool, but the more I use these tiling window managers, the more I missed Gnome. I know, I know, unpopular opinion or whatever.</p>
<p>It&rsquo;s just that coming from Mac, Gnome feels like an upgrade to a familiar experience, while everything else feels so different it&rsquo;s hard to relate. The workflow feels foreign, and the supposed efficiency gains feel superficial in the face of the time wasted on the immense learning curve. I imagine this is why Windows users gravitate towards KDE. It&rsquo;s a more polished version of a familiar paradigm.</p>
<p>While I&rsquo;m a Fedora stan, I&rsquo;ve really been impressed with the ethos, community, and aesthetic of PikaOS, so, rather than going back to my faithful Fedora Workstation, I decided to use Pika&rsquo;s Gnome version, and set to work getting it configured for daily use. First, I installed Bazaar to manage my flatpaks (it&rsquo;s the best), then I set up my fingerprint sensor for authentication (easy peasy), and finally, I set out to slay the dragon that is this Vim navigation issue.</p>
<p>It took a lot of trial and error, and a little help from Brave&rsquo;s Leo AI, but I finally got it figured out. Below is a little step by step for how to configure Caps Lock + hjkl to map to directional keys, so that if you want this functionality, you don&rsquo;t need to waste any energy with AI or otherwise rip out all your hair trying to figure this out.</p>
<h2 id="how-to-map-caps-lock--hjkl-to-vim-keys-on-linux">How to map Caps Lock + hjkl to Vim keys on Linux</h2>
<p>Here&rsquo;s a little step by step you can follow if you&rsquo;re using any Linux distribution with Gnome.</p>
<ol>
<li>Install the <code>xremap</code> GNOME Shell Extension. This is required. You can install it in Firefox at <table width="100%" cellpadding="0" cellspacing="0" border="0" style="margin:1.25rem 0;border-collapse:collapse;"><tr><td style="display:block;border:1px solid #363a4f;border-radius:10px;padding:0.75rem 1rem;background:#24273a;font-family:sans-serif;text-decoration:none;"><a href="https://extensions.gnome.org/extension/5428/xremap/" target="_blank" rel="noopener noreferrer" style="text-decoration:none;color:inherit;display:block;"><strong style="display:block;font-size:1rem;font-weight:700;color:#cad3f5;margin-bottom:0.2rem;">https://extensions.gnome.org/extension/5428/xremap/</strong><span style="display:block;font-size:0.75rem;color:#939ab7;font-style:italic;">https://extensions.gnome.org/extension/5428/xremap/</span></a></td></tr></table> or simply open the Gnome Extensions Manager, click Browse and search for it.</li>
</ol>
<figure><img src="/posts/vim-everywhere-on-linux/xremap.png"
    alt="xremap GNOME Shell Extension">
</figure>

<ol start="2">
<li>
<p>In order to install xremap, we need to first make sure we have rust and some other tools installed. You can try to do step 3 and if it fails come back here. If you are certain that you have everything you need already, you can proceed to step 3 anyway.</p>


    <blockquote style="margin:1.25rem 0;padding:0.85rem 1.1rem;border-left:4px solid #eed49f;border-radius:0 8px 8px 0;background:#2a2518;font-family:sans-serif;">
        <p style="margin:0 0 0.4rem 0;font-weight:700;font-size:0.85rem;text-transform:uppercase;letter-spacing:0.06em;opacity:0.8;">Warning</p>
        <p>Below I list a number of terminal commands, including some which automatically run scripts. You should never enter terminal commands you find on the internet unless you understand what they do and are sure that it is not harmful.</p>
    </blockquote><ol>
<li>
<p>Install rustup (the Rust installer):</p>
<pre tabindex="0"><code>curl --proto &#39;=https&#39; --tlsv1.2 -sSf https://sh.rustup.rs | sh</code></pre><p>Follow the prompts. This installs rustc, cargo, and rustup.</p>
</li>
<li>
<p>Restart your shell or source the environment:</p>
<pre tabindex="0"><code>source $HOME/.cargo/env</code></pre><p>This adds <code>$HOME/.cargo/bin</code> to your PATH.</p>
</li>
<li>
<p>Verify the installation:</p>
<pre tabindex="0"><code>cargo --version</code></pre><p>If you see an output, you should be good to go.</p>
</li>
</ol>
</li>
<li>
<p>Now we&rsquo;re ready to proceed with the installation</p>
<ol>
<li>
<p>Use cargo to install xremap:</p>
<pre tabindex="0"><code>cargo install xremap --features gnome</code></pre></li>
<li>
<p>Create the configuration file:</p>
<pre tabindex="0"><code>mkdir -p ~/.config/xremap</code></pre></li>
<li>
<p>Add the configuration.</p>
<p>I use Neovim. For which we enter this command.</p>
<pre tabindex="0"><code>nvim ~/.config/xremap/config.yml</code></pre><p>But you can use Nano which comes preinstalled on every Linux distro. That would mean typing this command instead.</p>
<pre tabindex="0"><code>nano ~/.config/xremap/config.yml</code></pre><p>You can use any editor you like. These are just two options.</p>
</li>
<li>
<p>Enter this into the file and then save out.</p>
<pre tabindex="0"><code>virtual_modifiers:
  - CapsLock

keymap:
  - name: CapsLock + hjkl to Arrows
    remap:
      CapsLock-h: Left
      CapsLock-j: Down
      CapsLock-k: Up
      CapsLock-l: Right
      CapsLock-space: Super-space</code></pre>

    <blockquote style="margin:1.25rem 0;padding:0.85rem 1.1rem;border-left:4px solid #8aadf4;border-radius:0 8px 8px 0;background:#1e2a3a;font-family:sans-serif;">
        <p style="margin:0 0 0.4rem 0;font-weight:700;font-size:0.85rem;text-transform:uppercase;letter-spacing:0.06em;opacity:0.8;">Tip</p>
        <p>On Neovim, you save by pressing the colon key and then w to save, q to quit. In other words, you hit escape to stop inputting text and type <code>:wq</code></p>
    </blockquote></li>
</ol>
</li>
<li>
<p>Start xremap:</p>
<pre tabindex="0"><code>xremap ~/.config/xremap/config.yml</code></pre><p>Now you should be able to use the feature, so long as you leave the terminal open and the command active. This is fine for testing, but it&rsquo;s not the functionality we want.</p>
</li>
<li>
<p>Set up autostart</p>
<ol>
<li>
<p>I do this by simply &ldquo;opening&rdquo; the non-existent file with Neovim.</p>
<pre tabindex="0"><code>nvim ~/.config/autostart/xremap.desktop</code></pre></li>
<li>
<p>Enter the following into the new file and save.</p>
<pre tabindex="0"><code>[Desktop Entry]
Type=Application
Name=xremap
Exec=/home/user/.cargo/bin/xremap /home/user/.config/xremap/config.yml
Comment=Remap Caps+hjkl to arrow keys
X-GNOME-Autostart-enabled=true</code></pre>

    <blockquote style="margin:1.25rem 0;padding:0.85rem 1.1rem;border-left:4px solid #8aadf4;border-radius:0 8px 8px 0;background:#1e2a3a;font-family:sans-serif;">
        <p style="margin:0 0 0.4rem 0;font-weight:700;font-size:0.85rem;text-transform:uppercase;letter-spacing:0.06em;opacity:0.8;">Note</p>
        <p>Replace <em>user</em> with your username.</p>
    </blockquote></li>
</ol>
</li>
</ol>
<h2 id="what-did-we-learn">What did we learn?</h2>
<p>Nothing is impossible on Linux. But it is sometimes more complicated than you might expect. Karabiner Elements has existed for Mac for a long time, and with it, I was able to configure a rather niche workflow in minutes. On Linux, I had to understand the nature of the problem itself and how it interrelated to my specific setup. I had to rule out certain distributions which would make it harder or even impossible to do this kind of customization. And of course, I had to get comfortable with using the terminal.</p>
<p>In the end though, it wasn&rsquo;t very hard and it satisfied my compulsive need to tinker for another day. In the next post, I&rsquo;ll tell you about other system tweaks and software choices I&rsquo;ve made to make Linux feel more like home.</p>
<p>If you like this kind of content, don&rsquo;t forget to like and share it on social media and if you&rsquo;re comfortable with cryptocurrency, consider dropping a little tip with the buttons below to show that you value this kind of content. More about why I chose crypto over other tip options <a href="https://thumbsup.me/posts/why-the-heck-would-i-want-crypto-tips/" target="_blank" rel="noopener noreferrer">here</a>.</p>
<p>I do really want to replace this little 1080p Thinkpad with a Framework 13 Pro at some point. That&rsquo;s not something I can justify when I have limited funds and a perfectly working Macbook to daily drive, but it&rsquo;s one of my plans for the money I receive as tips. Just putting that out there.</p>
<p>I hope you found this entertaining, interesting, helpful, or all of the above.</p>
]]></content:encoded></item></channel></rss>