<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>aborg.dev</title>
    <link rel="self" type="application/atom+xml" href="https://aborg.dev/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://aborg.dev"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-01-03T00:00:00+00:00</updated>
    <id>https://aborg.dev/atom.xml</id>
    <entry xml:lang="en">
        <title>Calculation Solitaire</title>
        <published>2026-01-03T00:00:00+00:00</published>
        <updated>2026-01-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://aborg.dev/blog/calculation-release/"/>
        <id>https://aborg.dev/blog/calculation-release/</id>
        
        <content type="html" xml:base="https://aborg.dev/blog/calculation-release/">&lt;p&gt;TL;DR: I&#x27;ve implemented a mobile-friendly web version of Calculation solitaire.
It is available at &lt;a href=&quot;https:&#x2F;&#x2F;calc.aborg.dev&quot;&gt;https:&#x2F;&#x2F;calc.aborg.dev&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Over the last year I got into the &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Calculation_(card_game)&quot;&gt;Calculation&lt;&#x2F;a&gt; solitaire.
I find it appealing as it is quite strategic and has a high skill ceiling.
Specifically, the numbers on Wikipedia for 20% win-rate for inexperienced play and 80% for skillful play seem about right.
My personal win-rate is around 70% with average play time of 20 minutes.
I also implemented a &lt;a href=&quot;https:&#x2F;&#x2F;git.sr.ht&#x2F;~akashin&#x2F;Calculation&#x2F;tree&#x2F;master&#x2F;item&#x2F;solver&#x2F;src&#x2F;main.rs&quot;&gt;greedy solver&lt;&#x2F;a&gt; and it wins 17% of hands.&lt;&#x2F;p&gt;
&lt;p&gt;To practice, I&#x27;ve implemented a mobile-friendly web version using React+Tailwind (&lt;a href=&quot;https:&#x2F;&#x2F;git.sr.ht&#x2F;~akashin&#x2F;Calculation&quot;&gt;source code&lt;&#x2F;a&gt;).
I also &lt;a href=&quot;https:&#x2F;&#x2F;git.sr.ht&#x2F;~akashin&#x2F;Calculation&#x2F;tree&#x2F;master&#x2F;item&#x2F;calc.p8&quot;&gt;ported it to Pico8&lt;&#x2F;a&gt; to play it on my TrimUI Brick handheld.&lt;&#x2F;p&gt;
&lt;p&gt;I would like to extend the web version with the study mode to help me improve my play.
To get there, I&#x27;ll need to get the Rust solver to a higher win-rate.
Then compile it to WebAssembly and embed it into the Web app to analyze the quality of moves.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Zed: Keymap</title>
        <published>2025-01-13T00:00:00+00:00</published>
        <updated>2025-01-13T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://aborg.dev/blog/2025/zed-keymap/"/>
        <id>https://aborg.dev/blog/2025/zed-keymap/</id>
        
        <content type="html" xml:base="https://aborg.dev/blog/2025/zed-keymap/">&lt;p&gt;&lt;em&gt;This post is a part of my &lt;a href=&quot;&#x2F;blog&#x2F;zed-is-future&#x2F;&quot;&gt;&quot;Zed is the Future?&quot; series&lt;&#x2F;a&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;If your are a keyboard-heavy user, one of the first things you start tweaking in a text editor are keyboard shortcuts.&lt;&#x2F;p&gt;
&lt;p&gt;Coming from Neovim, I came to expect full programmability of my key mappings.
However, Zed takes a different approach that steers more towards the zero-configuration philosophy that has become popular lately.
Zed&#x27;s keymap is configured through a collection of JSON files with the list of &lt;strong&gt;bindings&lt;&#x2F;strong&gt; and &lt;strong&gt;contexts&lt;&#x2F;strong&gt; where they are active:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#212733;color:#ccc9c2;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span&gt;[
&lt;&#x2F;span&gt;&lt;span&gt;  {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;context&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;Dock || Terminal || VimControl&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;bindings&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;ctrl-h&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;workspace::ActivatePaneInDirection&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;Left&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;ctrl-j&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;workspace::ActivatePaneInDirection&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;Down&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;ctrl-k&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;workspace::ActivatePaneInDirection&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;Up&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;ctrl-l&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;workspace::ActivatePaneInDirection&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;Right&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;  {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;context&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;Editor &amp;amp;&amp;amp; VimControl &amp;amp;&amp;amp; !VimWaiting &amp;amp;&amp;amp; !menu&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;bindings&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;, q&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;pane::CloseActiveItem&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;n&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;search::SelectNextMatch&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;shift-n&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;search::SelectPrevMatch&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;]
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The JSON-based approach offers several advantages:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Auto-completion and validation tools can provide instant feedback while editing the config&lt;&#x2F;li&gt;
&lt;li&gt;Keybindings are easily shareable as simple JSON snippets&lt;&#x2F;li&gt;
&lt;li&gt;Finding specific mappings is straightforward with basic text search&lt;&#x2F;li&gt;
&lt;li&gt;Future format migrations can be handled smoothly with automated tooling&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;However, this comes with several drawbacks:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;The JSON format can be verbose and repetitive, making keybindings more cumbersome to define&lt;&#x2F;li&gt;
&lt;li&gt;As everything is defined in a single file with little organization, it becomes hard to explore and maintain the mappings&lt;&#x2F;li&gt;
&lt;li&gt;Customizing default bindings requires copying the existing ones, as there&#x27;s no native way to extend them systematically&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;alternatives&quot;&gt;Alternatives&lt;&#x2F;h2&gt;
&lt;p&gt;I&#x27;ve been wondering if there are alternatives that would be a middle-ground between the full Turing-complete configuration and the plain JSON files.&lt;&#x2F;p&gt;
&lt;p&gt;So I&#x27;ve built a &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;aborg-dev&#x2F;dotfiles&#x2F;tree&#x2F;master&#x2F;zed&quot;&gt;tool&lt;&#x2F;a&gt; to generate the keymap from a more structured and concise definition written in &lt;a href=&quot;https:&#x2F;&#x2F;jsonnet.org&#x2F;&quot;&gt;Jsonnet&lt;&#x2F;a&gt; configuration language.&lt;&#x2F;p&gt;
&lt;p&gt;Here is the excerpt from my keymap:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;js&quot; style=&quot;background-color:#212733;color:#ccc9c2;&quot; class=&quot;language-js &quot;&gt;&lt;code class=&quot;language-js&quot; data-lang=&quot;js&quot;&gt;&lt;span&gt;local lib &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29e74;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffa759;&quot;&gt;import &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;keymap.lib.jsonnet&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;local ctx &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29e74;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;lib&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29e74;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;ctx&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;local map &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29e74;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;lib&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29e74;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;local leader &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29e74;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;space&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;local local_leader &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29e74;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;,&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;std&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29e74;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffd580;&quot;&gt;flattenArrays&lt;&#x2F;span&gt;&lt;span&gt;([
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#5c6773;&quot;&gt;&#x2F;&#x2F; You can split the keymap into multiple files.
&lt;&#x2F;span&gt;&lt;span&gt;  (import &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;window.lib.jsonnet&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)(prefix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29e74;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;space w&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#5c6773;&quot;&gt;&#x2F;&#x2F; Definitions can take parameters for customization.
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#5c6773;&quot;&gt;&#x2F;&#x2F; For example, I copied default Zed Vim &amp;#39;g&amp;#39; bindings and
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#5c6773;&quot;&gt;&#x2F;&#x2F; added ability to replace prefix `g` with any other key.
&lt;&#x2F;span&gt;&lt;span&gt;  (import &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;actions.lib.jsonnet&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)(prefix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29e74;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;g&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;  [
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#5c6773;&quot;&gt;&#x2F;&#x2F; Commonly used contexts can be defined in a single place
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#5c6773;&quot;&gt;&#x2F;&#x2F; as the library functions.
&lt;&#x2F;span&gt;&lt;span&gt;    ctx&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29e74;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffd580;&quot;&gt;hub&lt;&#x2F;span&gt;&lt;span&gt;({
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;ctrl-h&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;workspace::ActivatePaneInDirection&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;Left&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;ctrl-l&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;workspace::ActivatePaneInDirection&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;Right&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;ctrl-k&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;workspace::ActivatePaneInDirection&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;Up&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;ctrl-j&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;workspace::ActivatePaneInDirection&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;Down&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;    })&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;    ctx&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29e74;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffd580;&quot;&gt;vim_normal&lt;&#x2F;span&gt;&lt;span&gt;({
&lt;&#x2F;span&gt;&lt;span&gt;      n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;search::SelectNextMatch&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;shift-n&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;search::SelectPrevMatch&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;      [local_leader &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29e74;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39; q&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;pane::CloseActiveItem&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;    })&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#5c6773;&quot;&gt;&#x2F;&#x2F; When multiple bindings start with the same key,
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#5c6773;&quot;&gt;&#x2F;&#x2F; they can be grouped together with `map.hydra`.
&lt;&#x2F;span&gt;&lt;span&gt;    ctx&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29e74;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffd580;&quot;&gt;vim_normal&lt;&#x2F;span&gt;&lt;span&gt;(map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29e74;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffd580;&quot;&gt;hydra&lt;&#x2F;span&gt;&lt;span&gt;(leader&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;&#x2F;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;workspace::NewSearch&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;,&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;tab_switcher::Toggle&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;    }))&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;  ]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#5c6773;&quot;&gt;&#x2F;&#x2F; You can still use the standard keymap definition syntax.
&lt;&#x2F;span&gt;&lt;span&gt;  {
&lt;&#x2F;span&gt;&lt;span&gt;    context&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;Workspace&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;    bindings&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;shift-ctrl-r&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;task::Spawn&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span&gt;{ task_name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;#39;Update keymap&amp;#39; &lt;&#x2F;span&gt;&lt;span&gt;}]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;])
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This config can be fed into &lt;code&gt;jsonnet&lt;&#x2F;code&gt; tool to generate your familiar &lt;code&gt;keymap.json&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; style=&quot;background-color:#212733;color:#ccc9c2;&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span style=&quot;color:#ffd580;&quot;&gt;jsonnet&lt;&#x2F;span&gt;&lt;span&gt; keymap.jsonnet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffcc66;&quot;&gt; -o&lt;&#x2F;span&gt;&lt;span&gt; keymap.json
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I&#x27;m still exploring the ergonomics of this approach, but it does address my configuration needs for now.
The tooling for using it still has a few rough edges though - you need to manually invoke the keymap update after you change the Jsonnet file.
Also, error reporting could be improved to provide more context when something goes wrong.&lt;&#x2F;p&gt;
&lt;p&gt;I plan to polish it further and share it with the community to gather some feedback.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Zed: Navigation</title>
        <published>2025-01-09T00:00:00+00:00</published>
        <updated>2025-01-09T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://aborg.dev/blog/2025/zed-navigation/"/>
        <id>https://aborg.dev/blog/2025/zed-navigation/</id>
        
        <content type="html" xml:base="https://aborg.dev/blog/2025/zed-navigation/">&lt;p&gt;&lt;em&gt;This post is a part of my &lt;a href=&quot;&#x2F;blog&#x2F;zed-is-future&#x2F;&quot;&gt;&quot;Zed is the Future?&quot; series&lt;&#x2F;a&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Despite its name, I would argue that most time in a text editor is actually not spent editing.
Instead, it is spent navigating between and within files that you are working with.
Let&#x27;s explore how to efficiently navigate with Zed!&lt;&#x2F;p&gt;
&lt;p&gt;As a quick aside, I intend this post to be a living &lt;a href=&quot;https:&#x2F;&#x2F;blog.nelhage.com&#x2F;2010&#x2F;05&#x2F;software-and-lab-notebooks&#x2F;&quot;&gt;lab notebook&lt;&#x2F;a&gt; that I use to share my progress on the topic.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;setup&quot;&gt;Setup&lt;&#x2F;h2&gt;
&lt;p&gt;I will mostly focus on the keyboard-centric navigation, as this is my preferred setup.
I use Zed &lt;a href=&quot;https:&#x2F;&#x2F;zed.dev&#x2F;docs&#x2F;vim&quot;&gt;Vim mode&lt;&#x2F;a&gt; and shortcuts below rely on it
(by the way, you can find all available shortcuts in Vim mode by opening a &lt;a href=&quot;https:&#x2F;&#x2F;zed.dev&#x2F;docs&#x2F;#command-palette&quot;&gt;Command Palette&lt;&#x2F;a&gt; and typing &lt;code&gt;vim: open default keymap&lt;&#x2F;code&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;To add a bit of structure, I will distinguish between two different types of navigation:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Local navigation: Moving and jumping within a single buffer to specific lines, words or characters&lt;&#x2F;li&gt;
&lt;li&gt;Global navigation: Moving between different files and searching across an entire project workspace&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;local-navigation&quot;&gt;Local navigation&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;vim-motions&quot;&gt;Vim motions&lt;&#x2F;h3&gt;
&lt;p&gt;Local navigation is a bread and butter of &lt;a href=&quot;https:&#x2F;&#x2F;neovim.io&#x2F;doc&#x2F;user&#x2F;motion.html&quot;&gt;Vim Motions&lt;&#x2F;a&gt; - the key shortcuts in Vim Normal mode that move the cursor to specific locations in the text.&lt;&#x2F;p&gt;
&lt;p&gt;I won&#x27;t describe them in detail, but there is an &lt;a href=&quot;https:&#x2F;&#x2F;www.barbarianmeetscoding.com&#x2F;boost-your-coding-fu-with-vscode-and-vim&#x2F;moving-blazingly-fast-with-the-core-vim-motions&#x2F;&quot;&gt;excellent guided tour&lt;&#x2F;a&gt; and a &lt;a href=&quot;https:&#x2F;&#x2F;www.barbarianmeetscoding.com&#x2F;boost-your-coding-fu-with-vscode-and-vim&#x2F;cheatsheet&quot;&gt;cheatsheet&lt;&#x2F;a&gt; that lists the most useful ones.
Suffice to say that Zed implements them quite faithfully.
There are also motions specific to &lt;a href=&quot;https:&#x2F;&#x2F;zed.dev&#x2F;docs&#x2F;vim#treesitter&quot;&gt;Zed Treesitter integration&lt;&#x2F;a&gt; that are useful for navigating structured file formats, e.g., code or JSON.&lt;&#x2F;p&gt;
&lt;p&gt;Here are the ones that I find most useful:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;w&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;b&lt;&#x2F;code&gt;: move to the beginning of the next&#x2F;previous word&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;CTRL + g&lt;&#x2F;code&gt;: move to a specific line number&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;&#x2F;&lt;&#x2F;code&gt;, then &lt;code&gt;n&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;N&lt;&#x2F;code&gt;: search for a specific text in the buffer and cycle through the results forwards&#x2F;backwards&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;gg&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;G&lt;&#x2F;code&gt;: move to the beginning&#x2F;end of the file&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;When I&#x27;m using Vim, I feel there is a gap that needs to be filled between very efficient navigation within a single line with &lt;code&gt;f&lt;&#x2F;code&gt; motion and a bit more clumsy general search with &lt;code&gt;&#x2F;&lt;&#x2F;code&gt;.
This gap is usually filled for me by &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;easymotion&#x2F;vim-easymotion&quot;&gt;EasyMotion&lt;&#x2F;a&gt;-style movement (specifically &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;folke&#x2F;flash.nvim&quot;&gt;flash.nvim&lt;&#x2F;a&gt;) that allows to move to any visible character with just a few letter keypresses.
Unfortunately, Zed does not have a built-in equivalent yet, but this is a very popular &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;zed-industries&#x2F;zed&#x2F;issues&#x2F;4930&quot;&gt;feature request&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;symbol-outline&quot;&gt;Symbol outline&lt;&#x2F;h3&gt;
&lt;p&gt;Given the native Treesitter and LSP integration, symbol navigation feels quite reliable.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CTRL + SHIFT + o&lt;&#x2F;code&gt; (or &lt;code&gt;g s&lt;&#x2F;code&gt; in Vim): list and search symbols in the buffer&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;CTRL + SHIFT + b&lt;&#x2F;code&gt;: open and focus the symbol outline panel&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;global-navigation&quot;&gt;Global navigation&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;workspace-search&quot;&gt;Workspace search&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CTRL + SHIFT + f&lt;&#x2F;code&gt;: opens a workspace-wide text search panel where you can type any text to find its occurrences across all files&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;g &#x2F;&lt;&#x2F;code&gt;: automatically searches for the currently selected text across all files in the workspace&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;file-search&quot;&gt;File search&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CTRL + p&lt;&#x2F;code&gt;: opens a fuzzy search dialog that lets you quickly find and open any file by name in the workspace&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;symbol-search&quot;&gt;Symbol search&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;g d&lt;&#x2F;code&gt;: go to definition of the symbol under cursor (e.g. a function name or variable)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;g S&lt;&#x2F;code&gt;: search for any symbol (functions, classes, etc.) across all files in the workspace&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Zed is the Future?</title>
        <published>2025-01-06T00:00:00+00:00</published>
        <updated>2025-01-06T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://aborg.dev/blog/zed-is-future/"/>
        <id>https://aborg.dev/blog/zed-is-future/</id>
        
        <content type="html" xml:base="https://aborg.dev/blog/zed-is-future/">&lt;p&gt;&quot;&lt;a href=&quot;https:&#x2F;&#x2F;zed.dev&#x2F;&quot;&gt;Zed&lt;&#x2F;a&gt; is a next-generation code editor designed for high-performance collaboration with humans and AI.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;I find this description from Zed&#x27;s front-page very appealing and have been trying out the editor on and off for a few months now.&lt;&#x2F;p&gt;
&lt;p&gt;So far, collaboration features have made it a tool of choice for mentoring and pair programming within my team.
However, every time I considered a full switch for all my other editor use-cases, I lacked some critical features (see below) from my &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;aborg-dev&#x2F;dotfiles&quot;&gt;Neovim+Tmux setup&lt;&#x2F;a&gt; polished over the last 15 years.&lt;&#x2F;p&gt;
&lt;p&gt;This time around, I have a good chunk of spare time between projects for sharpening my proverbial axe and I&#x27;m ready to sacrifice some productivity in the short-term to &lt;a href=&quot;..&#x2F;blog&#x2F;bad-muscle-memory&#x2F;&quot;&gt;improve my habits&lt;&#x2F;a&gt;.
So I decided to give Zed another try and this time learn to do things &#x27;The Zed Way&#x27;.&lt;&#x2F;p&gt;
&lt;p&gt;Moreover, I acknowledge that Zed is still under very active development and it will likely be that way for quite some time.
So rather than evaluating it at this point in time, I&#x27;m interested to understand its long-term potential by learning more about foundations it is built upon, third-party extension tooling and the team and community behind it.&lt;&#x2F;p&gt;
&lt;p&gt;I also just want to play around with Zed&#x27;s codebase and try to implement the features I need myself, as I have never worked on an editor before :)&lt;&#x2F;p&gt;
&lt;p&gt;To start off, here are some features that I currently miss:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Faster navigation within a buffer page - I use EasyMotion&#x2F;flash.nvim heavily to navigate within a single screen&lt;&#x2F;li&gt;
&lt;li&gt;Navigation between buffers - I use Telescope to switch between buffers and am still trying to get used to the mental model of Zed&#x27;s tabs&lt;&#x2F;li&gt;
&lt;li&gt;More interactive search - I regularly search through hundreds of files with Telescope&#x2F;FZF when I explore a new codebase&lt;&#x2F;li&gt;
&lt;li&gt;Persistent terminal sessions - I often develop on a remote server and rely on Tmux to have my workspace in the always-ready state&lt;&#x2F;li&gt;
&lt;li&gt;Keybinding discoverability - I struggle to find the necessary Zed keybindings (something like which-key.nvim could help?)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I plan to document my experience tweaking and hacking on Zed over the next few months in this blog.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Bad muscle memory</title>
        <published>2025-01-01T00:00:00+00:00</published>
        <updated>2025-01-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://aborg.dev/blog/bad-muscle-memory/"/>
        <id>https://aborg.dev/blog/bad-muscle-memory/</id>
        
        <content type="html" xml:base="https://aborg.dev/blog/bad-muscle-memory/">&lt;p&gt;When we say &quot;muscle memory&quot;, we usually mean it in a positive way - something that you&#x27;ve learned to do so well, you don&#x27;t need to think about it.
Today, though, I want to talk about the bad muscle memory - habits that are automatic, but actually are unproductive and prevent further improvement.
The scary part about bad muscle memory is that it can be very hard to notice and correct.&lt;&#x2F;p&gt;
&lt;p&gt;I recently switched to a new keyboard, first to Keyboardio Atreus and now to ZSA Voyager.
Because these keyboards are much smaller, often only with 40% of the keys of a regular keyboard, I had to learn new positions for many keys.
Moreover, these keyboards are fully programmable and encourage you to change the layout for your comfort.
As I embraced the idea of tweaking the key positions on a whim, I came to a shocking realization that my most used keys are in &lt;strong&gt;terrible&lt;&#x2F;strong&gt; positions and I&#x27;m completely oblivious of this.&lt;&#x2F;p&gt;
&lt;p&gt;Take for example the &lt;code&gt;Enter&lt;&#x2F;code&gt; and &lt;code&gt;Backspace&lt;&#x2F;code&gt; keys.
They are used all the time in the regular typing, yet pressing them requires a really uncomfortable stretching hand movement.
Similarly, I rely on many keyboard shortcuts that use  modifier keys such as &lt;code&gt;Shift&lt;&#x2F;code&gt;, &lt;code&gt;Ctrl&lt;&#x2F;code&gt; or &lt;code&gt;Alt&lt;&#x2F;code&gt;, and they are pressed with the weakest finger - the pinky.&lt;&#x2F;p&gt;
&lt;p&gt;Once I moved these keys to more comfortable positions and to stronger fingers, it was a strict improvement and I can&#x27;t imagine going back.
Moreover, I was able to replicate most of the gains of the new layout on my laptop with &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;kmonad&#x2F;kmonad&quot;&gt;&lt;code&gt;kmonad&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; without any additional hardware.
So the problem was really in my head and habits.&lt;&#x2F;p&gt;
&lt;p&gt;This got me thinking, how many other things in my workflow and life are like this, and how do I go about discovering and correcting such bad muscle memory?&lt;&#x2F;p&gt;
&lt;p&gt;The approach that have been working for me so far is to regularly try new things and get out of the comfort zone, for example:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Write Advent of Code in the unfamiliar programming language like Zig&lt;&#x2F;li&gt;
&lt;li&gt;Try using a new code editor Zed instead of the familiar Neovim&lt;&#x2F;li&gt;
&lt;li&gt;Learn a new &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rdavison&#x2F;graphite-layout&quot;&gt;Graphite&lt;&#x2F;a&gt; keyboard layout instead of QWERTY&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;These exercises slow me down enough to start noticing my bad habits and motivate me to find ways to correct them.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m sure there are many more ways to achieve the same effect, &lt;a href=&quot;https:&#x2F;&#x2F;bsky.app&#x2F;profile&#x2F;aborg.dev&quot;&gt;let me know&lt;&#x2F;a&gt; what works for you!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Project Euler Streak</title>
        <published>2024-11-18T00:00:00+00:00</published>
        <updated>2024-11-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://aborg.dev/blog/euler/"/>
        <id>https://aborg.dev/blog/euler/</id>
        
        <content type="html" xml:base="https://aborg.dev/blog/euler/">&lt;p&gt;I&#x27;ve just reached a 100 day streak solving a problem from &lt;a href=&quot;https:&#x2F;&#x2F;projecteuler.net&#x2F;&quot;&gt;Project Euler&lt;&#x2F;a&gt; every day.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;projecteuler.net&#x2F;profile&#x2F;aborg.dev.png&quot; alt=&quot;image&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ve been a little worried that the difficulty will ramp up too quickly, but it happened to be just right - challenging enough to tickle my brain, but still manageable to solve within a day.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m solving the problems exclusively in Rust, as this is my main working language right now.
I implement all solutions from scratch without relying on external crates (e.g. for BigInts), as my main goal is to build the feel&#x2F;muscle memory for elegant Rust code.
To achieve this, I usually iterate on a solution for some time after solving the problem to make it as simple as possible.&lt;&#x2F;p&gt;
&lt;p&gt;I plan to continue this streak until the end of November and then switch to solving &lt;a href=&quot;https:&#x2F;&#x2F;adventofcode.com&#x2F;&quot;&gt;Advent of Code&lt;&#x2F;a&gt;.
I will likely use Zig for Advent of Code as I&#x27;ve been looking for an excuse to learn the language for some time now.&lt;&#x2F;p&gt;
&lt;p&gt;You can find my solutions on &lt;a href=&quot;https:&#x2F;&#x2F;git.sr.ht&#x2F;~akashin&#x2F;algo_problems&#x2F;log&#x2F;master&#x2F;item&#x2F;project_euler&quot;&gt;Sourcehut&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Ludum Dare 56</title>
        <published>2024-10-10T00:00:00+00:00</published>
        <updated>2024-10-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://aborg.dev/blog/ld56-reflections/"/>
        <id>https://aborg.dev/blog/ld56-reflections/</id>
        
        <content type="html" xml:base="https://aborg.dev/blog/ld56-reflections/">&lt;p&gt;I recently participated in my 6th &lt;a href=&quot;https:&#x2F;&#x2F;ldjam.com&#x2F;events&#x2F;ludum-dare&#x2F;56&quot;&gt;Ludum Dare game jam&lt;&#x2F;a&gt; and I want to share some reflections.&lt;&#x2F;p&gt;
&lt;p&gt;This time around we&#x27;ve built a simple dexterity-based game called &lt;a href=&quot;https:&#x2F;&#x2F;aborg.itch.io&#x2F;animal-arcade&quot;&gt;Animal Arcade&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;prefer-simpler-ideas&quot;&gt;Prefer simpler ideas&lt;&#x2F;h2&gt;
&lt;p&gt;During the initial brainstorming we came up with a list of three ideas and ended up choosing the one that was simplest to implement and iterate on.
With games, there is a high chance that you will throw out the first few versions as unplayable garbage.
And then you need to leave plenty of time to polish the final result.
So I think going for simpler ideas is a good strategy if you want to ship something playable on a Game Jam with tight time constraints (72 hours).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;iterate-without-fear&quot;&gt;Iterate without fear&lt;&#x2F;h2&gt;
&lt;p&gt;It&#x27;s surprising how easy it is to get attached to what you have already implemented and place yourself in the imaginary box preventing you from moving forward.
You have to recognize this and be ready to discard what you&#x27;ve built and try a different path.&lt;&#x2F;p&gt;
&lt;p&gt;In our game, the animals were shrinking over time and that was a core mechanic to make the game difficult.
It was also a tied to the jam theme &quot;Tiny Creatures&quot;, which is why we felt that we can&#x27;t remove it.&lt;&#x2F;p&gt;
&lt;p&gt;But there were a number of problems with this mechanic:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Hard to come up with an explanation why the creatures were shrinking&lt;&#x2F;li&gt;
&lt;li&gt;Creature sprites looked ineligible at small scale&lt;&#x2F;li&gt;
&lt;li&gt;Past some size it was nearly impossible to hit the creature&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;We ended up removing the shrinking altogether and making the game difficult through other means (shooting delay, interesting movement patterns), but it took us some time to actually realize that this was an option.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;leverage-human-perception&quot;&gt;Leverage human perception&lt;&#x2F;h2&gt;
&lt;p&gt;Finally, some game mechanics really benefit or even work only with visual and sound support.&lt;&#x2F;p&gt;
&lt;p&gt;When we introduced the delay between the user click and the shot landing on the screen, I was really surprised how disorienting even a seemingly small 0.3s delay felt.
The game became too difficult but also didn&#x27;t feel fun as my brain was really confused.&lt;&#x2F;p&gt;
&lt;p&gt;Before abandoning the idea, I decided to add simple sound and visual cues - it suddenly became both easier and much more fun to time the shots.
We ended up investing a lot more effort into the feel of this mechanic and I think it is one of the main reasons I enjoy the game.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;final-words&quot;&gt;Final words&lt;&#x2F;h2&gt;
&lt;p&gt;I&#x27;m sure these ideas are not new, but sometimes you can only really feel them through experience - that&#x27;s one of the reasons I love game jams, they always present this concentrated learning opportunity.&lt;&#x2F;p&gt;
&lt;p&gt;If you have any similar reflections or comments, let me know on &lt;a href=&quot;https:&#x2F;&#x2F;mastodon.gamedev.place&#x2F;@akashin&quot;&gt;Mastodon&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Resistance Is Futile</title>
        <published>2024-09-08T00:00:00+00:00</published>
        <updated>2024-09-08T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://aborg.dev/blog/aborg-migration/"/>
        <id>https://aborg.dev/blog/aborg-migration/</id>
        
        <content type="html" xml:base="https://aborg.dev/blog/aborg-migration/">&lt;p&gt;I have recently changed my name to Andrew Borg (from Kashin), so my personal page now lives at a new address - &lt;a href=&quot;https:&#x2F;&#x2F;aborg.dev&quot;&gt;aborg.dev&lt;&#x2F;a&gt;.
The previous address &lt;a href=&quot;https:&#x2F;&#x2F;akashin.me&quot;&gt;akashin.me&lt;&#x2F;a&gt; is still serving, but is now deprecated.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m gradually migrating my other accounts, e.g. &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;aborg-dev&quot;&gt;aborg-dev on GitHub&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Grid Game Toolkit</title>
        <published>2023-12-27T00:00:00+00:00</published>
        <updated>2023-12-27T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://aborg.dev/blog/game-grid/"/>
        <id>https://aborg.dev/blog/game-grid/</id>
        
        <content type="html" xml:base="https://aborg.dev/blog/game-grid/">&lt;p&gt;I&#x27;ve always wanted to have a tool to quickly prototype various grid-based puzzle games like
Crosswords, Sudoku, Hashiwokakero, etc. Sure, pen-and-paper can get you pretty far, and we used it
extensively for our last Ludum Dare entry &lt;a href=&quot;https:&#x2F;&#x2F;ldjam.com&#x2F;events&#x2F;ludum-dare&#x2F;54&#x2F;skyland&quot;&gt;Skyland&lt;&#x2F;a&gt;,
but it is a bit clunky to share when your playtesters are located remotely.&lt;&#x2F;p&gt;
&lt;p&gt;After looking at many examples of such games (&lt;a href=&quot;https:&#x2F;&#x2F;krazydad.com&#x2F;&quot;&gt;krazydad&lt;&#x2F;a&gt; has been an amazing
resource), I think they all use a very similar vocabulary:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;A grid of fixed size (but possibly with irregular shape)&lt;&#x2F;li&gt;
&lt;li&gt;A fixed set cell types (with numbers, symbols, lines)&lt;&#x2F;li&gt;
&lt;li&gt;On-the-border or around-the-border hint system (using numbers or colors)&lt;&#x2F;li&gt;
&lt;li&gt;Solution can be fully expressed on the grid as a static snapshot (unlike many videogames like
Sokoban or Snakebird where you need to record a sequence of actions)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;So I decided to build the &lt;a href=&quot;https:&#x2F;&#x2F;git.sr.ht&#x2F;~akashin&#x2F;grid_game&quot;&gt;&lt;strong&gt;Grid Game Toolkit&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt;, a framework
for building such games with the following goals:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Adding new games should be easy with minimal programming skills (e.g. with scripting or Rust trait
implementation)&lt;&#x2F;li&gt;
&lt;li&gt;Should work well both on desktops and on touch-based devices (I really want it to work on my
Android-based e-reader)&lt;&#x2F;li&gt;
&lt;li&gt;Can import puzzles from major providers like crossword newsletters and sites like
https:&#x2F;&#x2F;www.nonograms.org&#x2F; as well as from PDF-based sources&lt;&#x2F;li&gt;
&lt;li&gt;Have built-in puzzle editor with a programmatic solution finder&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;It&#x27;s a perfect opportunity to learn Rust better, so I will be using &lt;a href=&quot;https:&#x2F;&#x2F;bevyengine.org&#x2F;&quot;&gt;Bevy&lt;&#x2F;a&gt;
game engine that worked well for our previous game jam.&lt;&#x2F;p&gt;
&lt;p&gt;The MVP will support Japanese Crosswords, Sudoku and one more puzzle type. I hope this will be
diverse enough to expose important design decisions, but also small enough to implement over the
winter holidays.&lt;&#x2F;p&gt;
&lt;p&gt;If you want to stay in the loop, I will be posting regular development updates on
&lt;a href=&quot;https:&#x2F;&#x2F;mastodon.gamedev.place&#x2F;@akashin&quot;&gt;Mastodon&lt;&#x2F;a&gt; and will be using this blog for longer posts.&lt;&#x2F;p&gt;
&lt;p&gt;Till the next time!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Rebooting the blog</title>
        <published>2022-09-07T00:00:00+00:00</published>
        <updated>2022-09-07T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://aborg.dev/blog/rebooting-the-blog/"/>
        <id>https://aborg.dev/blog/rebooting-the-blog/</id>
        
        <content type="html" xml:base="https://aborg.dev/blog/rebooting-the-blog/">&lt;p&gt;It&#x27;s time to dust off this blog and give it move love! As a first step I revamped the
infrastructure behind it to get more comfortable with editing and deploying the blog.&lt;&#x2F;p&gt;
&lt;p&gt;Previously, the blog was built with Jekyll, hosted in Google Cloud Storage Bucket and served with
Cloudflare CDN. It had the benefit of fast load times and simple https certificate management, but
the deployment process was far from ideal and involved manual rebuild and synchronization of folders
to the cloud bucket.&lt;&#x2F;p&gt;
&lt;p&gt;Since I&#x27;ve relocated most of my git repos to Sourcehut, I decided to try &lt;a href=&quot;https:&#x2F;&#x2F;srht.site&#x2F;&quot;&gt;sourcehut
pages&lt;&#x2F;a&gt; for hosting. This turned out to be extremely easy to set up thanks to an
excellent &lt;a href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;documentation&#x2F;deployment&#x2F;sourcehut&#x2F;&quot;&gt;guide&lt;&#x2F;a&gt; in Zola
documentation.&lt;&#x2F;p&gt;
&lt;p&gt;Overall, I&#x27;m quite happy with the new solution. It&#x27;s easier and faster to deploy and also looks
simpler from development perspective as I don&#x27;t need to worry about version of Ruby and various
plugins necessary in Jekyll.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Building a compiler</title>
        <published>2020-02-23T00:00:00+00:00</published>
        <updated>2020-02-23T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://aborg.dev/blog/building-a-compiler/"/>
        <id>https://aborg.dev/blog/building-a-compiler/</id>
        
        <content type="html" xml:base="https://aborg.dev/blog/building-a-compiler/">&lt;p&gt;I finally decided to embark on the journey of building a real compiler to better understand
how various pieces work under the hood. I&#x27;m particularly interested in error reporting,
intermediate representation and code optimization.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ll be following the guidance from &lt;a href=&quot;http:&#x2F;&#x2F;craftinginterpreters.com&quot;&gt;Crafting Interpreters&lt;&#x2F;a&gt;
online book which so far proved to be quite easy to follow and full of fascinating facts from
programming history.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m planning not to follow the steps in the book too closely but rather pick the way that I
feel makes most sense to optimize my learning and venture deeper into the topics I consider
interesting. The first such change is using Python instead of Java for the interpreter
implementation. As far as I can tell, this shouldn&#x27;t be a big deal, but I hope it will help me
to get a bit more familiar with Py3 and modern tooling like static type checking.&lt;&#x2F;p&gt;
&lt;p&gt;As I go through it, I want to share some of the detours I&#x27;ll be taking on this blog, so stay tuned!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Neat tmux alias</title>
        <published>2017-06-25T00:00:00+00:00</published>
        <updated>2017-06-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://aborg.dev/blog/useful-tmux-alias/"/>
        <id>https://aborg.dev/blog/useful-tmux-alias/</id>
        
        <content type="html" xml:base="https://aborg.dev/blog/useful-tmux-alias/">&lt;p&gt;Trying to streamline my workflow with &lt;a href=&quot;https:&#x2F;&#x2F;danielmiessler.com&#x2F;study&#x2F;tmux&#x2F;&quot;&gt;tmux&lt;&#x2F;a&gt;
I&#x27;ve built a useful bash alias &lt;strong&gt;&lt;code&gt;tmx&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt;.
This alias takes a single argument - name of the session, and connects to the session if it already
exists, or creates a new session with this name. The motivation behind it is that it is shorter
(no need to remember and type &lt;code&gt;attach -t&lt;&#x2F;code&gt; or &lt;code&gt;new-session -s&lt;&#x2F;code&gt;), and also involves less cognitive
overhead (no conditional thinking).&lt;&#x2F;p&gt;
&lt;p&gt;Here is a snippet of shell code that you can add to your &lt;code&gt;.bashrc&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;.zshrc&lt;&#x2F;code&gt;&#x2F;etc:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; style=&quot;background-color:#212733;color:#ccc9c2;&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span style=&quot;color:#ffa759;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffd580;&quot;&gt;tmx &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;    name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29e74;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span&gt;1
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffa759;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffd580;&quot;&gt;tmux&lt;&#x2F;span&gt;&lt;span&gt; list-sessions &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29e74;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffd580;&quot;&gt;grep&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffcc66;&quot;&gt; -q &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;^$&lt;&#x2F;span&gt;&lt;span&gt;{name}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;:&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29e74;&quot;&gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffa759;&quot;&gt;then
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffd580;&quot;&gt;tmux&lt;&#x2F;span&gt;&lt;span&gt; attach&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffcc66;&quot;&gt; -t &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;{name}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffa759;&quot;&gt;else
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffd580;&quot;&gt;tmux&lt;&#x2F;span&gt;&lt;span&gt; new-session&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffcc66;&quot;&gt; -s &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;{name}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bae67e;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffa759;&quot;&gt;fi
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;First, we list all available tmux sessions and then use &lt;code&gt;grep&lt;&#x2F;code&gt; to look for the one, that has provided name.
If this search succeeds, the return code of &lt;code&gt;grep&lt;&#x2F;code&gt; is zero and we go to the first branch of the &lt;code&gt;if&lt;&#x2F;code&gt;
statement and connect to the existing session.
Otherwise, the return code is non-zero and we go to the second branch that creates a new session.&lt;&#x2F;p&gt;
&lt;p&gt;There is one tricky corner-case that needs to be considered, and I leave it to readers to
discover it :) (what happens if there are currently no sessions?)&lt;&#x2F;p&gt;
&lt;p&gt;With this alias, connecting to a tmux session &lt;em&gt;Blog&lt;&#x2F;em&gt; is as easy as:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; style=&quot;background-color:#212733;color:#ccc9c2;&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span style=&quot;color:#ffd580;&quot;&gt;tmx&lt;&#x2F;span&gt;&lt;span&gt; Blog
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;One additional big plus of this alias comes if you&#x27;re using tmux over ssh connection (and who doesn&#x27;t? :)).
To connect or create a tmux session &lt;em&gt;Blog&lt;&#x2F;em&gt; on the remote machine you can use:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; style=&quot;background-color:#212733;color:#ccc9c2;&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span style=&quot;color:#ffd580;&quot;&gt;ssh &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29e74;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;hostname&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29e74;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ccc9c2cc;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;t tmx Blog
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For this to work don&#x27;t forget to put &lt;code&gt;tmx&lt;&#x2F;code&gt; alias to the top of &lt;code&gt;.bashrc&lt;&#x2F;code&gt; if you&#x27;re using bash or to &lt;code&gt;.zshenv&lt;&#x2F;code&gt; if you&#x27;re using zsh.&lt;&#x2F;p&gt;
&lt;p&gt;Next step would be to extend &lt;code&gt;tmx&lt;&#x2F;code&gt; to take arbitrary number of arguments, but honestly, I haven&#x27;t yet encountered situation when I need it.&lt;&#x2F;p&gt;
&lt;p&gt;This and other useful aliases that I&#x27;m using everyday can be found in my &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;aborg-dev&#x2F;dotfiles&#x2F;blob&#x2F;master&#x2F;zsh&#x2F;zshrc.symlink&quot;&gt;dotfiles&lt;&#x2F;a&gt; repository on Github.&lt;&#x2F;p&gt;
&lt;p&gt;Thank you for reading, stay tuned!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Let&#x27;s start!</title>
        <published>2017-06-17T00:00:00+00:00</published>
        <updated>2017-06-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://aborg.dev/blog/lets-start/"/>
        <id>https://aborg.dev/blog/lets-start/</id>
        
        <content type="html" xml:base="https://aborg.dev/blog/lets-start/">&lt;p&gt;After quite some time I finally decided to build a personal page and blog.
I&#x27;m planning to post technical tutorials, fun facts, and other interesting discoveries that I&#x27;m
encountering in my day-to-day life.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m thankful to the maintainer of &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;clayh53&#x2F;tufte-jekyll&quot;&gt;tufte-jekyll&lt;&#x2F;a&gt;
for the awesome theme that is used to create this website.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
