<?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>Nushell on MoskitoHero</title><link>/tags/Nushell/</link><description>Recent content in Nushell on MoskitoHero</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Tue, 23 Jun 2026 06:40:13 +0200</lastBuildDate><atom:link href="/tags/Nushell/index.xml" rel="self" type="application/rss+xml"/><item><title>Nujutsu Custom Jujutsu Commands in Nushell (With a Neovim Twist)</title><link>/post/2026-06-23-nujutsu-custom-jujutsu-commands-in-nushell-with-a-neovim-twist/</link><pubDate>Tue, 23 Jun 2026 06:40:13 +0200</pubDate><guid>/post/2026-06-23-nujutsu-custom-jujutsu-commands-in-nushell-with-a-neovim-twist/</guid><description>A couple of small Nu functions I use daily at work to make my life easier with JuJutsu and Nushell.</description><content:encoded><![CDATA[<div class="paragraph">
<p>I use <a href="https://www.nushell.sh">Nushell</a> as my main shell. I love it for the UX, the UI, and the syntax. I do sometimes hate it for not being POSIX, but since that’s the whole point of the thing, I cannot really complain.</p>
</div>
<div class="paragraph">
<p>I also use <a href="https://www.jj-vcs.dev/latest/">JuJutsu</a> as my main VCS. I love it for the UX, the UI, and the commands.</p>
</div>
<div class="paragraph">
<p>Say what you want, I’m a tech romantic.</p>
</div>
<div class="paragraph">
<p>So let me share a little bit of <strong>NuJutsu</strong> love with those two small Nu functions I use daily at work:</p>
</div>
<div class="sect1">
<h2 id="jj-desc"><a class="anchor" href="#jj-desc"></a>jj-desc</h2>
<div class="sectionbody">
<div class="paragraph">
<p>This one interactively asks me for the JIRA ticket number, and the title of issue. It builds a formatted description out of it.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="ruby"> <span class="k">def</span> <span class="nf">jj</span><span class="o">-</span><span class="n">desc</span> <span class="p">[]</span> <span class="p">{</span>
    <span class="n">let</span> <span class="n">ticket</span> <span class="o">=</span> <span class="n">input</span> <span class="s2">&#34;Ticket number: &#34;</span>
    <span class="n">let</span> <span class="n">title</span> <span class="o">=</span> <span class="n">input</span> <span class="s2">&#34;Title: &#34;</span>
    <span class="n">jj</span> <span class="n">desc</span> <span class="o">-</span><span class="n">m</span> <span class="vg">$&#34;</span><span class="p">[(</span><span class="vg">$ticket</span><span class="p">)]</span> <span class="p">(</span><span class="vg">$title</span><span class="p">)</span><span class="s2">&#34;
  }
</span></code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="jj-bookmark-from-desc"><a class="anchor" href="#jj-bookmark-from-desc"></a>jj-bookmark-from-desc</h2>
<div class="sectionbody">
<div class="paragraph">
<p>This one creates a bookmark from the current JJ description — provided it uses the correct format specified above, so <code>[PROJ-12345] Add feature A to project C</code> will yield a bookmark like <code>feature/proj-12345-add-feature-a-to-project-c</code>.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="ruby"><span class="k">def</span> <span class="nf">jj</span><span class="o">-</span><span class="n">bookmark</span><span class="o">-</span><span class="n">from</span><span class="o">-</span><span class="n">desc</span> <span class="p">[]</span> <span class="p">{</span>
      <span class="n">let</span> <span class="n">desc</span> <span class="o">=</span> <span class="p">(</span><span class="n">jj</span> <span class="n">log</span> <span class="o">-</span><span class="n">r</span> <span class="err">@</span> <span class="o">--</span><span class="n">no</span><span class="o">-</span><span class="n">graph</span> <span class="o">-</span><span class="no">T</span> <span class="s1">&#39;description.first_line()&#39;</span><span class="p">)</span>
      <span class="n">let</span> <span class="n">bookmark</span> <span class="o">=</span> <span class="p">(</span><span class="vg">$desc</span>
        <span class="o">|</span> <span class="n">str</span> <span class="n">downcase</span>
        <span class="o">|</span> <span class="n">str</span> <span class="n">replace</span> <span class="o">--</span><span class="n">all</span> <span class="o">--</span><span class="n">regex</span> <span class="s1">&#39;[^a-z0-9\s-]&#39;</span> <span class="s1">&#39;&#39;</span>
        <span class="o">|</span> <span class="n">str</span> <span class="n">replace</span> <span class="o">--</span><span class="n">all</span> <span class="o">--</span><span class="n">regex</span> <span class="s1">&#39;\s+&#39;</span> <span class="s1">&#39;-&#39;</span>
        <span class="o">|</span> <span class="n">str</span> <span class="n">replace</span> <span class="o">--</span><span class="n">all</span> <span class="o">--</span><span class="n">regex</span> <span class="s1">&#39;-+&#39;</span> <span class="s1">&#39;-&#39;</span>
        <span class="o">|</span> <span class="n">str</span> <span class="n">trim</span> <span class="o">--</span><span class="n">right</span> <span class="o">--</span><span class="n">char</span> <span class="s1">&#39;-&#39;</span><span class="p">)</span>
      <span class="n">jj</span> <span class="n">bookmark</span> <span class="n">create</span> <span class="vg">$&#34;</span><span class="n">feature</span><span class="o">/</span><span class="p">(</span><span class="vg">$bookmark</span><span class="p">)</span><span class="s2">&#34;
    }</span></code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="the-icing-on-the-cake-neovim-counterparts"><a class="anchor" href="#the-icing-on-the-cake-neovim-counterparts"></a>The icing on the cake: Neovim counterparts</h2>
<div class="sectionbody">
<div class="paragraph">
<p>I use [jj.nvim] to manage my JJ log in Neovim.</p>
</div>
<div class="paragraph">
<p>Here is part of my LazyVim plugin definition:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="lua"><span class="k">return</span> <span class="p">{</span>
  <span class="s2">&#34;nicolasgb/jj.nvim&#34;</span><span class="p">,</span>
  <span class="n">branch</span> <span class="o">=</span> <span class="s2">&#34;main&#34;</span><span class="p">,</span>
  <span class="n">lazy</span> <span class="o">=</span> <span class="kc">false</span><span class="p">,</span>
  <span class="n">config</span> <span class="o">=</span> <span class="k">function</span><span class="p">()</span>
    <span class="nb">require</span><span class="p">(</span><span class="s2">&#34;jj&#34;</span><span class="p">).</span><span class="n">setup</span><span class="p">({})</span>
    <span class="kd">local</span> <span class="n">cmd</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="s2">&#34;jj.cmd&#34;</span><span class="p">)</span>
    <span class="n">vim</span><span class="p">.</span><span class="n">keymap</span><span class="p">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&#34;n&#34;</span><span class="p">,</span> <span class="s2">&#34;&lt;leader&gt;ji&#34;</span><span class="p">,</span> <span class="k">function</span><span class="p">()</span>
      <span class="k">if</span> <span class="ow">not</span> <span class="n">utils</span><span class="p">.</span><span class="n">is_jj_repo</span><span class="p">()</span> <span class="k">then</span>
        <span class="n">vim</span><span class="p">.</span><span class="n">notify</span><span class="p">(</span><span class="s2">&#34;Not in a jj repository&#34;</span><span class="p">,</span> <span class="n">vim</span><span class="p">.</span><span class="n">log</span><span class="p">.</span><span class="n">levels</span><span class="p">.</span><span class="n">WARN</span><span class="p">)</span>
        <span class="k">return</span>
      <span class="k">end</span>
      <span class="n">vim</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">input</span><span class="p">({</span> <span class="n">prompt</span> <span class="o">=</span> <span class="s2">&#34;Jira ticket: &#34;</span> <span class="p">},</span> <span class="k">function</span><span class="p">(</span><span class="n">ticket</span><span class="p">)</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">ticket</span> <span class="k">then</span> <span class="k">return</span> <span class="k">end</span>
        <span class="n">vim</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">input</span><span class="p">({</span> <span class="n">prompt</span> <span class="o">=</span> <span class="s2">&#34;Title: &#34;</span> <span class="p">},</span> <span class="k">function</span><span class="p">(</span><span class="n">title</span><span class="p">)</span>
          <span class="k">if</span> <span class="ow">not</span> <span class="n">title</span> <span class="k">then</span> <span class="k">return</span> <span class="k">end</span>
          <span class="n">cmd</span><span class="p">.</span><span class="n">describe</span><span class="p">(</span><span class="nb">string.format</span><span class="p">(</span><span class="s2">&#34;[%s] %s&#34;</span><span class="p">,</span> <span class="n">ticket</span><span class="p">,</span> <span class="n">title</span><span class="p">))</span>
        <span class="k">end</span><span class="p">)</span>
      <span class="k">end</span><span class="p">)</span>
    <span class="k">end</span><span class="p">,</span> <span class="p">{</span> <span class="n">desc</span> <span class="o">=</span> <span class="s2">&#34;JJ describe interactive&#34;</span> <span class="p">})</span>
    <span class="n">vim</span><span class="p">.</span><span class="n">keymap</span><span class="p">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&#34;n&#34;</span><span class="p">,</span> <span class="s2">&#34;&lt;leader&gt;jc&#34;</span><span class="p">,</span> <span class="k">function</span><span class="p">()</span>
      <span class="k">if</span> <span class="ow">not</span> <span class="n">utils</span><span class="p">.</span><span class="n">is_jj_repo</span><span class="p">()</span> <span class="k">then</span>
        <span class="n">vim</span><span class="p">.</span><span class="n">notify</span><span class="p">(</span><span class="s2">&#34;Not in a jj repository&#34;</span><span class="p">,</span> <span class="n">vim</span><span class="p">.</span><span class="n">log</span><span class="p">.</span><span class="n">levels</span><span class="p">.</span><span class="n">WARN</span><span class="p">)</span>
        <span class="k">return</span>
      <span class="k">end</span>
      <span class="n">vim</span><span class="p">.</span><span class="n">cmd</span><span class="p">(</span><span class="s2">&#34;!nu -lc jj-bookmark-from-desc&#34;</span><span class="p">)</span>
    <span class="k">end</span><span class="p">,</span> <span class="p">{</span> <span class="n">desc</span> <span class="o">=</span> <span class="s2">&#34;JJ bookmark from desc&#34;</span> <span class="p">})</span>
  <span class="k">end</span><span class="p">,</span>
<span class="p">}</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>The <code>jj-desc</code> command is rewritten in lua and gets a nice UX with two prompts popping up in your face when you launch it.</p>
</div>
<div class="paragraph">
<p>The <code>jj-bookmark-from-desc</code> command is just a plain keybinding.</p>
</div>
<div class="paragraph">
<p>In Emacs, I tend to open Vterm more often, so I just use my custom Nushell functions from there.</p>
</div>
</div>
</div>
]]></content:encoded></item></channel></rss>