<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Rogério Vicente</title>
    <subtitle>Software engineer in Lisbon with 15+ years of experience in web technologies and open source. This is my personal blog.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://rogeriopvl.com/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://rogeriopvl.com"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-03-11T00:00:00+00:00</updated>
    <id>https://rogeriopvl.com/atom.xml</id>
    <entry xml:lang="en">
        <title>Remapping the § key on the MacBook keyboard</title>
        <published>2026-03-11T00:00:00+00:00</published>
        <updated>2026-03-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://rogeriopvl.com/posts/202603110-remaping-the-section-symbol-key-on-macbooks/"/>
        <id>https://rogeriopvl.com/posts/202603110-remaping-the-section-symbol-key-on-macbooks/</id>
        
        <content type="html" xml:base="https://rogeriopvl.com/posts/202603110-remaping-the-section-symbol-key-on-macbooks/">&lt;p&gt;During my transition to the US ANSI keyboard layout, one of my main frustrations
with pretty much every MacBook was the INT(ISO) keyboard layout (it&#x27;s hard to
come by MacBooks with US ANSI keyboards here in the Western edge of Europe).&lt;&#x2F;p&gt;
&lt;p&gt;The problem with these layouts is that even if you select the US ANSI layout in
the operating system, the first key of the second row of keys, the one right
before the number one key, will always be &lt;code&gt;§&lt;&#x2F;code&gt; and not &lt;code&gt;~&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;picture&gt;
    &lt;source srcset=&quot;&#x2F;images&#x2F;mac-iso-layout-1200.webp&quot; type=&quot;image&#x2F;webp&quot;&gt;
    &lt;img src=&quot;&#x2F;images&#x2F;mac-iso-layout-1200.jpg&quot; alt=&quot;Partial view of a Mac keyboard showing the section key location&quot;&gt;
  &lt;&#x2F;picture&gt;
  &lt;figcaption&gt;The section symbol key on an ISO mac keyboard&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Luckily there&#x27;s a fix for this that does not involve using third-party software
like &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;karabiner-elements.pqrs.org&quot;&gt;Karabiner-Elements&lt;&#x2F;a&gt; or &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jtroo&#x2F;kanata&quot;&gt;Kanata&lt;&#x2F;a&gt;, which feels overkill just to remap
a single key.&lt;&#x2F;p&gt;
&lt;p&gt;I found &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gist.github.com&#x2F;paultheman&#x2F;808be117d447c490a29d6405975d41bd&quot;&gt;this article&lt;&#x2F;a&gt; that explains the why and how in great detail. The
command &lt;code&gt;hidutil&lt;&#x2F;code&gt;, introduced in macOS Sierra, can change the mapping of
the key, but for this to work in recent macOS versions you have to assign Input
Monitoring permissions to the terminal app you use to run the command (Ghostty
in my case).&lt;&#x2F;p&gt;
&lt;p&gt;The problem is that the new mapping created by &lt;code&gt;hidutil&lt;&#x2F;code&gt; won&#x27;t persist between
logins or OS restarts, so to restore the mapping you will need to run the
command after each login.&lt;&#x2F;p&gt;
&lt;p&gt;The article suggests running &lt;code&gt;hidutil&lt;&#x2F;code&gt; directly from a LaunchAgent, but that did
not work for me because of Input Monitoring permissions. What did work was using
a LaunchAgent to run a shell script on login with &lt;code&gt;bash&lt;&#x2F;code&gt;, then adding &lt;code&gt;bash&lt;&#x2F;code&gt; to
the list of applications allowed to do Input Monitoring:&lt;&#x2F;p&gt;
&lt;p&gt;First, create the shell script that will run &lt;code&gt;hidutil&lt;&#x2F;code&gt; and save it in your
preferred folder. I will use &lt;code&gt;~&#x2F;bin&#x2F;remap-section-key.sh&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E0DEF4; background-color: #191724;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #908CAA;font-style: italic;&quot;&gt;#!&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;font-style: italic;&quot;&gt;&#x2F;bin&#x2F;bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;hidutil&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; property&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;  --set&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; &amp;#39;{&amp;quot;UserKeyMapping&amp;quot;:[{&amp;quot;HIDKeyboardModifierMappingSrc&amp;quot;: 0x700000064,&amp;quot;HIDKeyboardModifierMappingDst&amp;quot;:0x700000035}]}&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Make sure the script is executable by running:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E0DEF4; background-color: #191724;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;chmod&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; +x ~&#x2F;bin&#x2F;remap-section-key.sh&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For reference:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;0x700000064&lt;&#x2F;code&gt; is the key code for &lt;code&gt;§&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;0x700000035&lt;&#x2F;code&gt; is the key code for &lt;code&gt;~&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Now, to make the script run on login, create the following &lt;code&gt;plist&lt;&#x2F;code&gt; file and save
it to &lt;code&gt;~&#x2F;Library&#x2F;LaunchAgents&#x2F;com.local.KeyRemapping.plist&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E0DEF4; background-color: #191724;&quot;&gt;&lt;code data-lang=&quot;xml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;lt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CCFD8;&quot;&gt;xml&lt;&#x2F;span&gt;&lt;span style=&quot;color: #C4A7E7;font-style: italic;&quot;&gt; version&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;&amp;quot;1.0&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #C4A7E7;font-style: italic;&quot;&gt; encoding&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;&amp;quot;UTF-8&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;?&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;lt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;DOCTYPE&lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt; plist&lt;&#x2F;span&gt;&lt;span&gt; PUBLIC &amp;quot;-&#x2F;&#x2F;Apple&#x2F;&#x2F;DTD PLIST 1.0&#x2F;&#x2F;EN&amp;quot; &amp;quot;http:&#x2F;&#x2F;www.apple.com&#x2F;DTDs&#x2F;PropertyList-1.0.dtd&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CCFD8;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;color: #C4A7E7;font-style: italic;&quot;&gt; version&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;&amp;quot;1.0&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CCFD8;&quot;&gt;dict&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CCFD8;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;Label&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CCFD8;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CCFD8;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;com.local.KeyRemapping&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CCFD8;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CCFD8;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;ProgramArguments&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CCFD8;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CCFD8;&quot;&gt;array&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;        &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CCFD8;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;bin&#x2F;bash&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CCFD8;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;        &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CCFD8;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;Users&#x2F;YOUR_USERNAME&#x2F;bin&#x2F;remap-section-key.sh&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CCFD8;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;    &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CCFD8;&quot;&gt;array&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CCFD8;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;RunAtLoad&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CCFD8;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CCFD8;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CCFD8;&quot;&gt;dict&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CCFD8;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Don&#x27;t forget to replace the &lt;code&gt;YOUR_USERNAME&lt;&#x2F;code&gt; with your actual username on the
machine. We have to specify here the full path to the file because &lt;code&gt;launchd&lt;&#x2F;code&gt;
does not expand &lt;code&gt;~&#x2F;&lt;&#x2F;code&gt; or any other shell variables.&lt;&#x2F;p&gt;
&lt;p&gt;Finally, you need to grant Input Monitoring permissions to &lt;code&gt;bash&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;System Settings &amp;gt; Privacy &amp;amp; Security &amp;gt; Input Monitoring&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Click the &lt;code&gt;+&lt;&#x2F;code&gt; button and add &lt;code&gt;bash&lt;&#x2F;code&gt; from &lt;code&gt;&#x2F;bin&#x2F;bash&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Without these permissions, &lt;code&gt;hidutil&lt;&#x2F;code&gt; won&#x27;t be able to remap the key when run by
launchd.&lt;&#x2F;p&gt;
&lt;p&gt;And that&#x27;s it! You should now have the key remapped and persisting between
logins.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Disable diagnostics virtual text on LazyVim &#x2F; Neovim</title>
        <published>2025-02-10T00:00:00+00:00</published>
        <updated>2025-02-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://rogeriopvl.com/posts/202502100-disable-diagnostics-virtual-text-on-neovim/"/>
        <id>https://rogeriopvl.com/posts/202502100-disable-diagnostics-virtual-text-on-neovim/</id>
        
        <content type="html" xml:base="https://rogeriopvl.com/posts/202502100-disable-diagnostics-virtual-text-on-neovim/">&lt;p&gt;This will be a quick post just to help those who, like me, don&#x27;t like the
distraction of virtual text on their editor.&lt;&#x2F;p&gt;
&lt;p&gt;Diagnostics are very helpful but I often get overwhelmed when I have more than a
couple of errors in a file and get virtual text all over the place. Especially
if you&#x27;re using TypeScript, those errors are very verbose, so most of the time
it doesn&#x27;t even help much having truncated messages.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;&#x2F;images&#x2F;nvim-virtual-text.png&quot; alt=&quot;Virtual text in
    Neovim displaying syntax errors in a Typescript file&quot;&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;My preference is to have just the red underline and eventually a red sign
indicating that there&#x27;s an error in a line. If I want to check that error out, I
can either open the diagnostics pane that contains all the errors listed, or
just press &lt;code&gt;Ctrl+e&lt;&#x2F;code&gt; (my personal config), to see the error message popup in a
floating tooltip.&lt;&#x2F;p&gt;
&lt;p&gt;But unfortunately LazyVim and other plugins may override these settings, which
is why just simply disabling virtual text in the config is not enough.&lt;&#x2F;p&gt;
&lt;p&gt;To effectively achieve this you only need to edit your &lt;code&gt;autocmds.lua&lt;&#x2F;code&gt; file and
add the following snippet:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E0DEF4; background-color: #191724;&quot;&gt;&lt;code data-lang=&quot;lua&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;vim&lt;&#x2F;span&gt;&lt;span&gt;.api.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt;nvim_create_autocmd&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;&amp;quot;BufEnter&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;  callback&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; = function&lt;&#x2F;span&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;    vim&lt;&#x2F;span&gt;&lt;span&gt;.diagnostic.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt;config&lt;&#x2F;span&gt;&lt;span&gt;({ &lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;virtual_text&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt; })&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;})&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This way, whenever you enter a buffer, it turns off virtual text, overriding any
other default configuration.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Building Ghostty on Ubuntu</title>
        <published>2024-12-29T00:00:00+00:00</published>
        <updated>2024-12-29T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://rogeriopvl.com/posts/202412280-building-ghostty-on-ubuntu/"/>
        <id>https://rogeriopvl.com/posts/202412280-building-ghostty-on-ubuntu/</id>
        
        <content type="html" xml:base="https://rogeriopvl.com/posts/202412280-building-ghostty-on-ubuntu/">&lt;figure&gt;
  &lt;img width=&quot;30%&quot; src=&quot;&#x2F;images&#x2F;ghostty.png&quot; alt=&quot;Ghostty terminal mascot in ASCII art&quot;&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ghostty.org&quot;&gt;Ghostty&lt;&#x2F;a&gt; is finally out. I already tried it on my MacBook and the
installation process went super smooth, thanks to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;brew.sh&quot;&gt;Homebrew&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;But when I tried to install it on my Ubuntu laptop, I realized that there was
no package available for Ubuntu. So I decided to build it from source.&lt;&#x2F;p&gt;
&lt;p&gt;The documentation is pretty straightforward but turns out that I did find some
problems when running the application, mainly because of some specific
configurations I had, so I&#x27;m writing this post in case it helps anyone else with
the same configurations&#x2F;issues.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;building-from-source&quot;&gt;Building from source&lt;&#x2F;h2&gt;
&lt;p&gt;First you need to clone the repository:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E0DEF4; background-color: #191724;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; clone git@github.com:ghostty-org&#x2F;ghostty.git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then, as stated in the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ghostty.org&#x2F;docs&#x2F;install&#x2F;build&quot;&gt;documentation&lt;&#x2F;a&gt;, you need to install zig, the
programming language in which Ghostty is written:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E0DEF4; background-color: #191724;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;snap&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; install zip&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; --classic --beta&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then the dependencies:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E0DEF4; background-color: #191724;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; apt install libgtk-4-dev libadwaita-1-dev git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And finally the build command:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E0DEF4; background-color: #191724;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;zig&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; build&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; -p&lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt; $HOME&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;&#x2F;.local&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; -Doptimize=ReleaseFast&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This should work fine and after the build is finished you should have a
&lt;code&gt;ghostty&lt;&#x2F;code&gt; binary in your &lt;code&gt;~&#x2F;.local&#x2F;bin&lt;&#x2F;code&gt; folder.&lt;&#x2F;p&gt;
&lt;p&gt;Now you just need to run the following command so that Gnome updates the
application launcher with Ghostty:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E0DEF4; background-color: #191724;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; update-desktop-database&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;environment-problem&quot;&gt;Environment problem&lt;&#x2F;h2&gt;
&lt;p&gt;This is the part where I ran into my first error. I was using &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alacritty.org&quot;&gt;Alacritty&lt;&#x2F;a&gt; and
tried to run Ghostty from the terminal. Ghostty partially opened but failed to
render the UI with the following error:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E0DEF4; background-color: #191724;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;ERROR:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; could not initialize EGL display&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This turned out to be a problem with the environment variables defined in
Alacritty. I don&#x27;t fully grasp the problem, but let&#x27;s just say that right after
I tried the same with Gnome Terminal and it worked with no issues.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;path-problem&quot;&gt;PATH problem&lt;&#x2F;h2&gt;
&lt;p&gt;Second problem I had was that even after running &lt;code&gt;update-desktop-database&lt;&#x2F;code&gt;,
Gnome launcher didn&#x27;t pick up the Ghostty application. Also the &lt;code&gt;ghostty&lt;&#x2F;code&gt; bin
was not in my &lt;code&gt;PATH&lt;&#x2F;code&gt;. So clearly the problem was on my setup.&lt;&#x2F;p&gt;
&lt;p&gt;After some investigation I realized that I had a &lt;code&gt;.profile&lt;&#x2F;code&gt; in my &lt;code&gt;$HOME&lt;&#x2F;code&gt;
directory, but since I had changed the default system shell to &lt;code&gt;zsh&lt;&#x2F;code&gt; it was not
being picked up. Renaming to &lt;code&gt;.zprofile&lt;&#x2F;code&gt; and logging out&#x2F;in fixed it.&lt;&#x2F;p&gt;
&lt;p&gt;For completeness, here&#x27;s what you should have in your shell profile for this to
work:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E0DEF4; background-color: #191724;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #908CAA;font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;font-style: italic;&quot;&gt; set PATH so it includes user&amp;#39;s private bin if it exists&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; -d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;$HOME&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;&#x2F;.local&#x2F;bin&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt; ] ;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;    PATH&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;$HOME&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;&#x2F;.local&#x2F;bin:&lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;$PATH&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;fi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;final-thoughts&quot;&gt;Final thoughts&lt;&#x2F;h2&gt;
&lt;p&gt;Even after these minor issues, building Ghostty was pretty much straightforward.
I did it because I&#x27;m already using it on MacOS and I wanted to check out how it
compares to the Linux version, while I wait for a package to come out. Maybe
I&#x27;ll write a review later after a couple of weeks using it. For now it&#x27;s pretty
good and will probably replace Alacritty as my go to terminal.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Keychron K3 Max Update</title>
        <published>2024-11-23T00:00:00+00:00</published>
        <updated>2024-11-23T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://rogeriopvl.com/posts/202411230-keychron-k3-max-update/"/>
        <id>https://rogeriopvl.com/posts/202411230-keychron-k3-max-update/</id>
        
        <content type="html" xml:base="https://rogeriopvl.com/posts/202411230-keychron-k3-max-update/">&lt;p&gt;In case you landed on this post without context, this is a follow-up to my post
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;rogeriopvl.com&#x2F;posts&#x2F;202405010-keychron-k3-max&#x2F;&quot;&gt;Keychron K3 Max&lt;&#x2F;a&gt; after 6 months of daily use.&lt;&#x2F;p&gt;
&lt;p&gt;During the last 6 months, I completely stopped using the built-in MacBook
keyboard. Using the K3 Max is overall a pleasurable typing experience, but it
does have some drawbacks that I will share in a minute.&lt;&#x2F;p&gt;
&lt;p&gt;As expected, I went a bit further down the rabbit hole and decided to get an
extra keycap set to change the default look of the K3 Max. I quickly grew tired
of the original keycaps color, which is just grey with two orange keys (Esc and
Enter).&lt;&#x2F;p&gt;
&lt;p&gt;So I went ahead and got a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.keychron.com&#x2F;products&#x2F;low-profile-double-shot-pbt-lsa-keycap-set-version-2?_pos=1&amp;amp;_psq=knight&amp;amp;_ss=e&amp;amp;_v=1.0&amp;amp;variant=40647942242393&quot;&gt;Double Shot PBT LSA keycap set with the Knight
color&lt;&#x2F;a&gt;. And here&#x27;s how it looks:&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;&#x2F;images&#x2F;k3max-new-keycaps.jpg&quot; alt=&quot;The Keychron K3 Max with the Knight keycap set&quot;&gt;
  &lt;figcaption&gt;How the K3 Max looks with the Knight keycap set.&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Now, as promised, here&#x27;s a list of drawbacks that I usually bump into while
using the K3 Max. Please note that some of these are not exclusive to the K3
Max keyboard and may apply to any external mechanical low-profile keyboard.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;keys-are-too-close-to-each-other&quot;&gt;Keys are too close to each other&lt;&#x2F;h3&gt;
&lt;p&gt;Sometimes I have my fingertip a bit off the center of the key and also end up
slightly pressing the key right next to it. And because I&#x27;m using linear red
switches, which require very little force to press, most of the time that key
also registers.&lt;&#x2F;p&gt;
&lt;p&gt;Maybe this could be improved with tactile brown switches, since they require a
bit more force to press? I&#x27;m not sure, but I&#x27;ll definitely try those.&lt;&#x2F;p&gt;
&lt;p&gt;Another related issue is that arrow keys are not spaced out from the rest of the
keys, making them hard to touch type. For instance, it&#x27;s common for me to hit
the right shift key when I intend to press the up arrow key. I learned that
layouts that have such spacing are named &quot;Exploded&quot; layouts, and it seems
that I unknowingly had a preference for them.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;usb-c-port-placement&quot;&gt;USB-C port placement&lt;&#x2F;h3&gt;
&lt;p&gt;I don&#x27;t mind using the keyboard wired, but when I&#x27;m away from my usual desk
setup, I like to place it on top of my laptop.
The problem is that the USB-C port is positioned facing north, causing the cable
to hit the screen and not leaving enough room for the keyboard to rest over the
built-in keyboard. This issue can be fixed with an angled USB-C cable.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;key-repeat-issue&quot;&gt;Key repeat issue&lt;&#x2F;h3&gt;
&lt;p&gt;Very occasionally, some keys start repeating with a single press. This happens
in both wired and bluetooth mode. I think this may be some switches slightly
coming off their socket, because when I press the key firmly, it stops
happening.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;Overall, I&#x27;m very happy with my decision to switch to a mechanical keyboard, and
the Keychron K3 Max is definitely a good portable option.&lt;&#x2F;p&gt;
&lt;p&gt;After 6 months of daily use, I find myself consciously avoiding the laptop&#x27;s
built-in keyboard most of the time.&lt;&#x2F;p&gt;
&lt;p&gt;Another important point is that this switch to a mechanical keyboard also marks
my transition to using a US ANSI layout. Initially, it was a bit frustrating
because I&#x27;ve spent my career using the PT-pt layout. However, I am now fully
adapted to the ANSI layout and would never go back.&lt;&#x2F;p&gt;
&lt;p&gt;In summary, my experience so far has been very positive. If you&#x27;re looking for a
good portable mechanical keyboard, the K3 Max might be a great choice for you.
Alternatively, if you prefer a smaller (65%) layout and can live without the F
keys, the K7 Max should provide a very similar experience.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>How to toggle the microphone on macOS</title>
        <published>2024-05-21T00:00:00+00:00</published>
        <updated>2024-05-21T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://rogeriopvl.com/posts/202405210-toggle-microphone-on-macos/"/>
        <id>https://rogeriopvl.com/posts/202405210-toggle-microphone-on-macos/</id>
        
        <content type="html" xml:base="https://rogeriopvl.com/posts/202405210-toggle-microphone-on-macos/">&lt;p&gt;I bet you&#x27;ve been in a situation where you need to quickly mute or unmute your
microphone on a video call. It&#x27;s a common scenario for remote workers: you&#x27;re in
a long meeting, and suddenly a service or server goes down. You need to check it
out and fix it fast, but you can&#x27;t just leave the meeting. So, you mute
yourself, quickly switch to the terminal, and start investigating the issue. A
couple of minutes later, someone asks you a question, and now everyone is
waiting for you to answer. This awkward silence settles in while you&#x27;re trying
to find the right window and the right button to unmute yourself and respond.&lt;&#x2F;p&gt;
&lt;p&gt;Most apps have a keyboard shortcut, but it only works inside the app. So in this
scenario that I just described it wouldn&#x27;t work.&lt;&#x2F;p&gt;
&lt;p&gt;I wish my Macbook had a built-in media key to toggle the microphone, just like
my Thinkpad Nano does. But it doesn&#x27;t. So I had to find a workaround...&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-shell-script&quot;&gt;The shell script&lt;&#x2F;h2&gt;
&lt;p&gt;After some investigation I realized that I can control the microphone volume via
Applescript with &lt;code&gt;OSAScript&lt;&#x2F;code&gt; (Open Scripting Architecture). So I wrote a simple
shell script that alternates between 0% and 100% input volume, which in practice
is the same as muting and unmuting the microphone.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E0DEF4; background-color: #191724;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #908CAA;font-style: italic;&quot;&gt;#!&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;font-style: italic;&quot;&gt;&#x2F;bin&#x2F;sh&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt; [ $(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;osascript&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; -e&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; &amp;quot;input volume of (get volume settings)&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; -eq&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt; ];&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;        osascript&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; -e&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; &amp;quot;set volume input volume 100&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;        osascript&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; -e&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; &amp;quot;display notification &lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;You are now unmuted&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; with title &lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;🎤 on&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; sound name &lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;Funk&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;else&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;        osascript&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; -e&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; &amp;quot;set volume input volume 0&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;        osascript&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; -e&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; &amp;quot;display notification &lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;You are now muted&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; with title &lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;🎤 off&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; sound name &lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;Funk&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;fi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I saved this file on my &lt;code&gt;~&#x2F;.dotfiles&#x2F;bin&lt;&#x2F;code&gt; directory with the name &lt;code&gt;toggle_mic&lt;&#x2F;code&gt;
and gave it permissions to execute:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E0DEF4; background-color: #191724;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;chmod&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; +x ~&#x2F;.dotfiles&#x2F;bin&#x2F;toggle_mic&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You can simply add this as a bash&#x2F;zsh function instead if you just want to call
it from the terminal. But I wanted to bind it to a keyboard key so saving it as
an executable file was a much more flexible solution.&lt;&#x2F;p&gt;
&lt;p&gt;It would also be interesting to have a status bar icon indicating the current
status of the microphone, but it&#x27;s not possible to do without relying on a third
party app. In my case, I have that status indicator via the app &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;krisp.ai&quot;&gt;Krisp.ai&lt;&#x2F;a&gt;
that displays a red cross on top of it&#x27;s menu bar icon when either sound input
or output are muted.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;&#x2F;images&#x2F;krisp-mic-disabled.jpg&quot; alt=&quot;The Krisp.ai menu bar icon
    indicating that the mic is disabled&quot;&gt;
  &lt;figcaption&gt;Krisp.ai app menu bar icon showing that the microphone is muted.&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;In case you don&#x27;t have Krisp.ai, you can use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;xbarapp.com&#x2F;&quot;&gt;BitBar&lt;&#x2F;a&gt; to
place this info on the menu bar.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-keyboard-shortcut&quot;&gt;The keyboard shortcut&lt;&#x2F;h2&gt;
&lt;p&gt;There are two options for creating a keyboard shortcut for the script we have
just created.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Using MacOS Automator (simplest approach)&lt;&#x2F;li&gt;
&lt;li&gt;Using Karabiner-Elements app (only recommend if you already have it installed)&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;1-macos-automator&quot;&gt;1. MacOS Automator&lt;&#x2F;h3&gt;
&lt;p&gt;This option is the simplest and requires no extra software. Just open
Automator, create a new Quick Action and make sure you have the following
configuration:&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;&#x2F;images&#x2F;automator-run-script.jpg&quot; alt=&quot;Screenshot of Automator with
    a quick action configured to run a script&quot;&gt;
  &lt;figcaption&gt;Creating an Automator Quick Action that uses Run Script&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Since this action does not require any input, we just need to select the Run
Script action from the Library and provide the script path so that Automator
executes it.&lt;&#x2F;p&gt;
&lt;p&gt;Now you just need to create a Keyboard Shortcut that triggers the Automator
Quick Action.&lt;&#x2F;p&gt;
&lt;p&gt;Go to &lt;strong&gt;System Settings &amp;gt; Keyboard &amp;gt; Shortcuts&lt;&#x2F;strong&gt;, select &lt;strong&gt;Services&lt;&#x2F;strong&gt; in the
sidebar and find the name of your Automator Quick Action script, it usually
appears under &lt;strong&gt;General&lt;&#x2F;strong&gt;. Now define a shortcut of your preference.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2-karabiner-elements&quot;&gt;2. Karabiner-Elements&lt;&#x2F;h3&gt;
&lt;p&gt;This solution uses the app &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;karabiner-elements.pqrs.org&quot;&gt;Karabiner-Elements&lt;&#x2F;a&gt; to map my &lt;code&gt;Del&lt;&#x2F;code&gt; key to run
the above script. It&#x27;s a bit overkill honestly and I don&#x27;t recommend it unless
you already use this app for something else.&lt;&#x2F;p&gt;
&lt;p&gt;To map a key to run a shell script, just add the following rule to your
&lt;code&gt;complex_modifications&lt;&#x2F;code&gt; rules in your &lt;code&gt;~&#x2F;.config&#x2F;karabiner&#x2F;karabiner.json&lt;&#x2F;code&gt;
config file:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E0DEF4; background-color: #191724;&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CCFD8;&quot;&gt;description&lt;&#x2F;span&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; &amp;quot;Toggle Mic&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CCFD8;&quot;&gt;manipulators&lt;&#x2F;span&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;&amp;quot;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CCFD8;&quot;&gt;from&lt;&#x2F;span&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CCFD8;&quot;&gt;key_code&lt;&#x2F;span&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; &amp;quot;delete_forward&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;      },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CCFD8;&quot;&gt;to&lt;&#x2F;span&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;&amp;quot;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;          &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CCFD8;&quot;&gt;shell_command&lt;&#x2F;span&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; &amp;quot;~&#x2F;bin&#x2F;toggle_mic&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;      ],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CCFD8;&quot;&gt;type&lt;&#x2F;span&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; &amp;quot;basic&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;  ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Or if you prefer the UI:&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;&#x2F;images&#x2F;karabiner-mic-shortcut.jpg&quot; alt=&quot;The created shortcut on
    Karabiner Elements app&quot;&gt;
  &lt;figcaption&gt;Creating a new shortcut to map the &lt;code&gt;Del&lt;&#x2F;code&gt; key to a shell
    command on Karabiner-Elements app.&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h3 id=&quot;the-dedicated-key&quot;&gt;The dedicated key&lt;&#x2F;h3&gt;
&lt;p&gt;And now, the final touch, the keycap. I replaced the &lt;code&gt;Del&lt;&#x2F;code&gt; keycap with a &lt;code&gt;Mic&lt;&#x2F;code&gt;
to make it stand out.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;&#x2F;images&#x2F;del-key-out-mic-key-in.jpg&quot; alt=&quot;My Keychron K3 Max keyboard
    with a mic key replacing the original Del key&quot;&gt;
  &lt;figcaption&gt;My Keychron K3 Max with a Mic keycap where once the &lt;code&gt;Del&lt;&#x2F;code&gt; key was.&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;This setup is working for me, even though there are some rough edges that could
use some improvement:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Apps do not show that you&#x27;re muted. The mute setting is at the OS level.&lt;&#x2F;li&gt;
&lt;li&gt;I have to rely on the Krisp.ai app to have a visual indicator of the mute
status&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Improving Copilot on Neovim</title>
        <published>2024-05-12T00:00:00+00:00</published>
        <updated>2024-05-12T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://rogeriopvl.com/posts/202405120-fixing-copilot-on-neovim/"/>
        <id>https://rogeriopvl.com/posts/202405120-fixing-copilot-on-neovim/</id>
        
        <content type="html" xml:base="https://rogeriopvl.com/posts/202405120-fixing-copilot-on-neovim/">&lt;h3 id=&quot;update-2024-16-12&quot;&gt;Update (2024-16-12)&lt;&#x2F;h3&gt;
&lt;p&gt;If you are using the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.lazyvim.org&quot;&gt;LazyVim&lt;&#x2F;a&gt; distribution, in version 14 the plugin
nvim-cmp was replaced with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Saghen&#x2F;blink.cmp&quot;&gt;blink.cmp&lt;&#x2F;a&gt; which supports the &lt;code&gt;super-tab&lt;&#x2F;code&gt;
behavior. So you can skip most of the changes I&#x27;ve described in this post.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;I&#x27;ve been having this love-hate relationship with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;features&#x2F;copilot&quot;&gt;GitHub Copilot&lt;&#x2F;a&gt;. On one
hand, it saves me a lot of typing, especially with the most cumbersome
boilerplate code, like tests. On the other hand, it&#x27;s constantly getting in my
way when writing code and even prose. I feel it robs me of my ability to think
about what I&#x27;m typing. It&#x27;s just there, constantly trying to be helpful. Not to
mention the countless hours I&#x27;ve spent debugging issues caused by its code
suggestions. And yet, it&#x27;s still a very convenient tool. But only sometimes.&lt;&#x2F;p&gt;
&lt;p&gt;The problem is considerably worse when it comes to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;neovim.io&quot;&gt;Neovim&lt;&#x2F;a&gt;, which is my
go-to editor for all text&#x2F;code editing. The best plugin available, at least
to my knowledge at the time of writing, is &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;zbirenbaum&#x2F;copilot.lua&quot;&gt;copilot.lua&lt;&#x2F;a&gt;. Since this plugin
uses &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;hrsh7th&#x2F;nvim-cmp&quot;&gt;nvim-cmp&lt;&#x2F;a&gt; to show suggestions and this plugin by default uses &lt;code&gt;&amp;lt;Enter&amp;gt;&lt;&#x2F;code&gt;
to select a suggestion, it becomes extremely frustrating to press &lt;code&gt;&amp;lt;Enter&amp;gt;&lt;&#x2F;code&gt;,
expecting a new line to be inserted and getting a whole function implementation
body instead.&lt;&#x2F;p&gt;
&lt;p&gt;To improve this experience I decided to do a couple of tweaks that seem to be
working out for me. I&#x27;m sharing them here in case someone else is having the
same challenges.&lt;&#x2F;p&gt;
&lt;p&gt;First, I decided to add a shortcut to disable Copilot entirely. This doesn&#x27;t
address the issue per se, but it&#x27;s a quick way to get rid of it when it&#x27;s being
too chatty and I don&#x27;t need it. I&#x27;m now even considering starting it disabled by
default. But for now, I just added the following lines to my
&lt;code&gt;lua&#x2F;config&#x2F;keymaps.lua&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E0DEF4; background-color: #191724;&quot;&gt;&lt;code data-lang=&quot;lua&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #908CAA;font-style: italic;&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6E6A86;font-style: italic;&quot;&gt; copilot&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;vim&lt;&#x2F;span&gt;&lt;span&gt;.keymap.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;&amp;quot;n&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;&amp;quot;&amp;lt;leader&amp;gt;cpd&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;&amp;quot;:Copilot disable&amp;lt;cr&amp;gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, { &lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;silent&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt; true&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;noremap&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt; true&lt;&#x2F;span&gt;&lt;span&gt; })&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;vim&lt;&#x2F;span&gt;&lt;span&gt;.keymap.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;&amp;quot;n&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;&amp;quot;&amp;lt;leader&amp;gt;cpe&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;&amp;quot;:Copilot enable&amp;lt;cr&amp;gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, { &lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;silent&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt; true&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;noremap&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt; true&lt;&#x2F;span&gt;&lt;span&gt; })&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This is already some improvement, but it&#x27;s still not quite there. When Copilot
is enabled, I still have to deal with the issue of pressing &lt;code&gt;&amp;lt;Enter&amp;gt;&lt;&#x2F;code&gt; and
getting a suggestion instead of a new line. So I ended up tweaking the
completion engine itself: &lt;code&gt;nvim-cmp&lt;&#x2F;code&gt;. Since I wanted to achieve a behavior
similar to VS Code, I followed this &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.lazyvim.org&#x2F;configuration&#x2F;recipes#supertab&quot;&gt;Super-Tab recipe&lt;&#x2F;a&gt; from LazyVim, with
some changes.&lt;&#x2F;p&gt;
&lt;p&gt;First I changed &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;L3MON4D3&#x2F;LuaSnip&quot;&gt;luasnip&lt;&#x2F;a&gt; configuration to remove the &lt;code&gt;&amp;lt;Tab&amp;gt;&lt;&#x2F;code&gt; key mapping. I
added the file &lt;code&gt;lua&#x2F;plugins&#x2F;luasnip.lua&lt;&#x2F;code&gt; with the following lines:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E0DEF4; background-color: #191724;&quot;&gt;&lt;code data-lang=&quot;lua&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;return&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;  &amp;quot;L3MON4D3&#x2F;LuaSnip&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;  keys&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; = function&lt;&#x2F;span&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span&gt; {}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Next, I changed the completion engine configuration by adding the file
&lt;code&gt;lua&#x2F;plugins&#x2F;nvim-cmp.lua&lt;&#x2F;code&gt; with the following lines:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E0DEF4; background-color: #191724;&quot;&gt;&lt;code data-lang=&quot;lua&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;return&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;  &amp;quot;hrsh7th&#x2F;nvim-cmp&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #908CAA;font-style: italic;&quot;&gt;  ---&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;font-style: italic;&quot;&gt;@param&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBBCBA;font-style: italic;&quot;&gt; opts&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CCFD8;font-style: italic;&quot;&gt; cmp.ConfigSchema&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;  opts&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; = function&lt;&#x2F;span&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #C4A7E7;font-style: italic;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #C4A7E7;font-style: italic;&quot;&gt; opts&lt;&#x2F;span&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;    local&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt; has_words_before&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; = function&lt;&#x2F;span&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;      unpack&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt; unpack&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; or&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt; table.unpack&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;      local&lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt; line&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;col&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt; unpack&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;vim&lt;&#x2F;span&gt;&lt;span&gt;.api.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt;nvim_win_get_cursor&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;      return&lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt; col&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; ~=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; and&lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt; vim&lt;&#x2F;span&gt;&lt;span&gt;.api.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt;nvim_buf_get_lines&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;line&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;line&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span&gt;)[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;]:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt;sub&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;col&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;col&lt;&#x2F;span&gt;&lt;span&gt;):&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt;match&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;&amp;quot;%s&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt; nil&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;    end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;    local&lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt; luasnip&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt; require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;&amp;quot;luasnip&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;    local&lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt; cmp&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt; require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;&amp;quot;cmp&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;    opts&lt;&#x2F;span&gt;&lt;span&gt;.mapping&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt; vim&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt;tbl_extend&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;&amp;quot;force&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;opts&lt;&#x2F;span&gt;&lt;span&gt;.mapping, {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;&amp;quot;&amp;lt;Tab&amp;gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt; cmp&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt;mapping&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #C4A7E7;font-style: italic;&quot;&gt;fallback&lt;&#x2F;span&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt; cmp&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt;visible&lt;&#x2F;span&gt;&lt;span&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;          cmp&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt;confirm&lt;&#x2F;span&gt;&lt;span&gt;({ &lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;select&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt; true&lt;&#x2F;span&gt;&lt;span&gt; })&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;        elseif&lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt; luasnip&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt;expand_or_jumpable&lt;&#x2F;span&gt;&lt;span&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;          luasnip&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt;expand_or_jump&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;        elseif&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt; has_words_before&lt;&#x2F;span&gt;&lt;span&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;          cmp&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt;complete&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;        else&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt;          fallback&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;        end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;      end&lt;&#x2F;span&gt;&lt;span&gt;, { &lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;&amp;quot;i&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;&amp;quot;s&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;}),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;&amp;quot;&amp;lt;S-Tab&amp;gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt; cmp&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt;mapping&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #C4A7E7;font-style: italic;&quot;&gt;fallback&lt;&#x2F;span&gt;&lt;span style=&quot;color: #908CAA;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt; cmp&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt;visible&lt;&#x2F;span&gt;&lt;span&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;          cmp&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt;select_prev_item&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;        elseif&lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt; luasnip&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt;jumpable&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;          luasnip&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt;jump&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;        else&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt;          fallback&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;        end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;      end&lt;&#x2F;span&gt;&lt;span&gt;, { &lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;&amp;quot;i&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;&amp;quot;s&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;}),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt;&amp;quot;&amp;lt;CR&amp;gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt; cmp&lt;&#x2F;span&gt;&lt;span&gt;.config.disable,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    })&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #31748F;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The changes I&#x27;ve made to the recipe were basically to make &lt;code&gt;&amp;lt;Tab&amp;gt;&lt;&#x2F;code&gt; confirm the
selection when completion panel is open, and disable the &lt;code&gt;&amp;lt;Enter&amp;gt;&lt;&#x2F;code&gt; key mapping
so that it has no action.&lt;&#x2F;p&gt;
&lt;p&gt;As I already mentioned, these improvements are working out pretty well for me,
giving me more control when using Copilot and making it more enjoyable to use
in Neovim.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Keychron K3 Max</title>
        <published>2024-05-01T00:00:00+00:00</published>
        <updated>2024-05-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://rogeriopvl.com/posts/202405010-keychron-k3-max/"/>
        <id>https://rogeriopvl.com/posts/202405010-keychron-k3-max/</id>
        
        <content type="html" xml:base="https://rogeriopvl.com/posts/202405010-keychron-k3-max/">&lt;p&gt;Admittedly, I&#x27;ve always admired mechanical keyboards with their vibrant,
colorful keycaps displayed on a developer’s desk, they just look so appealing.
However, I must confess, the loud clicky noise has never been to my liking. In
fact, I’ve had slightly annoying experiences working alongside developers who
use these keyboards. So, how did I end up getting one?&lt;&#x2F;p&gt;
&lt;p&gt;First let me just clarify that this post is not an in-depth review of the
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.keychron.com&#x2F;products&#x2F;keychron-k3-max-qmk-via-wireless-custom-mechanical-keyboard&quot;&gt;Keychron K3 Max&lt;&#x2F;a&gt;. My primary aim is to share my experience from the
perspective of someone who grew up using mechanical keyboards in the 90s and
then, like pretty much everyone else, started using membrane keyboards because:
laptops. So if you&#x27;re looking a detailed review of this keyboard, I recommend
checking out this &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;taoofmac.com&#x2F;space&#x2F;blog&#x2F;2024&#x2F;04&#x2F;06&#x2F;1830&quot;&gt;Keychron K7 Max review&lt;&#x2F;a&gt;, even though it&#x27;s not the exact
same model, the only difference is the extra row of keys on the K3. Everything
else is pretty much the same.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;&#x2F;images&#x2F;k3max-2-best.jpg&quot; alt=&quot;The Keychron K3 Max in my work desk&quot;&gt;
  &lt;figcaption&gt;My desk with the Keychron K3 Max next to a Magic Trackpad.&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h3 id=&quot;how-it-started&quot;&gt;How it started&lt;&#x2F;h3&gt;
&lt;p&gt;Over the past few years, I&#x27;ve been contemplating a switch to the US keyboard
layout to improve the overall typing experience when programming. For context,
it’s important to note that for more than 20 years, I&#x27;ve exclusively used
keyboards with a Portuguese layout (and 15 of those years were spent mostly
using Apple Keyboards). Making this change would undoubtedly require a
significant effort on my part to adapt. For this single reason, I kept delaying
making this change.&lt;&#x2F;p&gt;
&lt;p&gt;But last year, I began using a ThinkPad X1 Nano running Ubuntu as a secondary
computer. Why? Because I missed using and fiddling with Linux, but that&#x27;s a
subject for another post. Anyway, I was surprised to find that I liked the X1&#x27;s
keyboard much more. Despite it having smaller keys and still being a membrane
keyboard, it offered more tactile feedback than both my MacBook Pro 16&quot; and my
Magic Keyboard. This triggered my curiosity and led me to start flirting with
the idea of getting a new keyboard.&lt;&#x2F;p&gt;
&lt;p&gt;Fast forward a few months, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;carmo.io&quot;&gt;Rui Carmo&lt;&#x2F;a&gt; posts a great review of the
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;taoofmac.com&#x2F;space&#x2F;blog&#x2F;2024&#x2F;04&#x2F;06&#x2F;1830&quot;&gt;Keychron K7 Max&lt;&#x2F;a&gt;, piquing my interest even more. His detailed review covered
everything from the keyboard&#x27;s design and build quality to its extensive
customization capabilities. What really caught my attention however, was this
mention of &quot;red linear switches&quot; and their less noisier operation.&lt;&#x2F;p&gt;
&lt;p&gt;I was surprised by how limited by understanding of these keyboards has been.
This led me to more research trying to understand what keyboard switches are and
the meaning behind their colors. Discovering there were quieter switch options
was a revelation for me and made me see mechanical keyboards in a new light.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-decision&quot;&gt;The decision&lt;&#x2F;h3&gt;
&lt;p&gt;After spending a couple of days researching this topic, I felt ready to make my
purchase. Although I discovered there are quite a few reputable brands in the
market, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.keychron.com&quot;&gt;Keychron&lt;&#x2F;a&gt; stood out as a solid choice for my first experience into fully
configurable mechanical keyboards.&lt;&#x2F;p&gt;
&lt;p&gt;I was drawn to the K7&#x27;s compact size, but I value having dedicated media keys.
The trade-off in terms of size was more than acceptable, so ultimately, I chose
the K3 Max with RGB lights and hot-swappable red switches. I don&#x27;t care much
about RGB lights, but it was the only how-swappable model available and since
the K3 Max comes with PBT keycaps, this means that light does not shine through
them, making the colored lights less annoying.&lt;&#x2F;p&gt;
&lt;p&gt;As for the layout - yes - I went all in, and chose the &lt;strong&gt;US ANSI layout&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I placed my order, waited for 10 days and boom!&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;&#x2F;images&#x2F;k3max-1-best.jpg&quot; alt=&quot;The Keychron K3 Max with rgb lights
    on&quot;&gt;
  &lt;figcaption&gt;The Keychron K3 Max in all its RGB colored glory.&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;figure&gt;
  &lt;img src=&quot;&#x2F;images&#x2F;k3max-4-best.jpg&quot; alt=&quot;The Keychron K3 Max in the dark with
    RGB lights on&quot;&gt;
    &lt;figcaption&gt;The PBT keycaps are problematic if you need to use the keyboard
    in the dark.&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h3 id=&quot;first-hours-on-macos&quot;&gt;First hours on MacOS&lt;&#x2F;h3&gt;
&lt;p&gt;As expected, my initial hours with this new keyboard involved grappling with the
OS to configure the US ANSI layout properly. My goal was to find a setup that
would allow me to code efficiently and also write in Portuguese, which I do less
frequently. I quickly realized that the US International layout was not good for
programming, leading me to settle on the US layout and utilize MacOS shortcuts
for typing accented words (I&#x27;m also aware of the press-and-hold shortcuts, but
I quickly discarded those, since they&#x27;re not practical for fast typing):&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;á, é, í, ó, ú :&lt;&#x2F;strong&gt; &lt;code&gt;Option + e + &amp;lt;letter&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;à, è, ì, ò, ù :&lt;&#x2F;strong&gt; &lt;code&gt;Option + ` + &amp;lt;letter&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;â, ê, î, ô, û :&lt;&#x2F;strong&gt; &lt;code&gt;Option + i + &amp;lt;letter&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ã, õ, ñ :&lt;&#x2F;strong&gt; &lt;code&gt;Option + n + &amp;lt;letter&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ç :&lt;&#x2F;strong&gt; &lt;code&gt;Option + c&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Later I also discovered that to have a relatively similar behavior on Linux (in
my case Ubuntu 22.04), you need to choose the &lt;strong&gt;English (intl., with AltGr dead
keys)&lt;&#x2F;strong&gt; layout. But don&#x27;t get me started on Linux...&lt;&#x2F;p&gt;
&lt;h3 id=&quot;linux-issues&quot;&gt;Linux issues&lt;&#x2F;h3&gt;
&lt;p&gt;With MacOS ready to rock with my new keyboard, the next challenge was my
ThinkPad X1 Nano running Ubuntu 22.04 LTS. Setting up a Bluetooth keyboard
should be straightforward, right? Well, not exactly.&lt;&#x2F;p&gt;
&lt;p&gt;It&#x27;s never that easy with Linux, and I say this in the most positive way
possible. How could you learn new things otherwise? Linux is the Dark Souls of
Operating Systems and I love Dark Souls.&lt;&#x2F;p&gt;
&lt;p&gt;So back to the topic. Despite trying all the obvious steps to get the keyboard
listed among the Bluetooth devices, I had to delve into forums to figure out why
such a simple task was proving difficult. I had other Bluetooth devices paired
with this system, so something weird was happening.&lt;&#x2F;p&gt;
&lt;p&gt;Eventually, I discovered that Bluetooth LE (Low Energy) wasn&#x27;t enabled on my
system, and the K3 Max required this to connect. Initially, I used the &lt;code&gt;btmgmt&lt;&#x2F;code&gt;
tool to enable LE temporarily, and the K3 Max immediately appeared in the device
list. To make this change permanent, I edited &lt;code&gt;&#x2F;etc&#x2F;bluetooth&#x2F;main.conf&lt;&#x2F;code&gt;,
changing the mode from &lt;code&gt;bredr&lt;&#x2F;code&gt; (set for reasons unknown) to &lt;code&gt;dual&lt;&#x2F;code&gt;. This mode
supports both BR&#x2F;EDR and LE Bluetooth and should be the default, according to
the documentation.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;&#x2F;images&#x2F;k3max-3-best.jpg&quot; alt=&quot;The Keychron K3 Max&quot;&gt;
    &lt;figcaption&gt;The K3 Max fits comfortably on top on most laptop keyboards,
    MacBooks and Thinkpads included.&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h3 id=&quot;work-in-progress&quot;&gt;Work in progress&lt;&#x2F;h3&gt;
&lt;p&gt;As I continue to evaluate the K3 Max, the transition to both a mechanical feel
and the US layout remains a work in progress. Using this keyboard has been a joy
and I&#x27;ve adapted much faster than I expected. However, mastering the US ANSI
layout has been challenging and will need more time. To speed up the process,
I&#x27;ve kept the US layout configuration even when using the laptop&#x27;s Portuguese
keyboard, forcing me to remember key locations.&lt;&#x2F;p&gt;
&lt;p&gt;I don&#x27;t have much pros and cons to share yet, mainly because it&#x27;s my first
modern mechanical keyboard and I don&#x27;t have much to compare it to. So all I can
say after almost 2 weeks of use is that it&#x27;s a pleasure to write with this
keyboard. I type much faster, effortlessly.&lt;&#x2F;p&gt;
&lt;p&gt;After this adaptation period, I&#x27;ll probably start trying out different types of
switches and keycaps, going deeper down into the rabbit hole.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;update&quot;&gt;Update&lt;&#x2F;h3&gt;
&lt;p&gt;I wrote about my experience with this keyboard after 6 months of daily use in
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;rogeriopvl.com&#x2F;posts&#x2F;202411230-keychron-k3-max-update&#x2F;&quot;&gt;this blog post&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Using git with dropbox</title>
        <published>2009-11-15T00:00:00+00:00</published>
        <updated>2009-11-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://rogeriopvl.com/posts/200911150-using-git-with-dropbox/"/>
        <id>https://rogeriopvl.com/posts/200911150-using-git-with-dropbox/</id>
        
        <content type="html" xml:base="https://rogeriopvl.com/posts/200911150-using-git-with-dropbox/">&lt;p&gt;This is just another way to give some use to your &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;dropbox.com&quot;&gt;dropbox&lt;&#x2F;a&gt; account. Although I use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;git-scm.com&quot;&gt;git&lt;&#x2F;a&gt; in this article, you can pretty much do it with most source management tools.&lt;&#x2F;p&gt;
&lt;p&gt;First of all you obviously need a dropbox account. If you don&#x27;t have one already, go register for one and get 2Gb of free online storage.&lt;&#x2F;p&gt;
&lt;p&gt;Now that you have an account, create a folder on your dropbox and on the web interface and share the folder with some friends if you wish to do so.&lt;&#x2F;p&gt;
&lt;p&gt;All is ready now to start creating the repo. For this post I&#x27;m assuming you already have a local git repository of a project called &lt;code&gt;my_killer_app&lt;&#x2F;code&gt; and that you are working on a unix based operating system like MacOS or Linux.&lt;&#x2F;p&gt;
&lt;p&gt;Open up a terminal, and change directory to your project folder:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E0DEF4; background-color: #191724;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EB6F92;font-style: italic;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; ~&#x2F;Sites&#x2F;my_killer_app&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The next step is to clone your existing local repo into the shared dropbox folder:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E0DEF4; background-color: #191724;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; clone&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; --bare&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; . ~&#x2F;Dropbox&#x2F;shared_folder&#x2F;my_killer_app.git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The &lt;code&gt;--bare&lt;&#x2F;code&gt; option tells git to not include the project files. Only those files needed to track the versioning are cloned (mainly those present in the &lt;code&gt;.git&#x2F;&lt;&#x2F;code&gt; folder).&lt;&#x2F;p&gt;
&lt;p&gt;Now you have sort of a remote repository. Although it&#x27;s on your machine, it&#x27;s remote to everyone else sharing the folder. But to make things work we need to add this &quot;remote&quot; location and give it an alias:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E0DEF4; background-color: #191724;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; remote add my_killer_app ~&#x2F;Dropbox&#x2F;shared_folder&#x2F;my_killer_app.git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;There! It&#x27;s done. Now you can push your changes to the repository. And pull the changes on another machine with your dropbox account. Also people sharing the folder will be able to do the same.&lt;&#x2F;p&gt;
&lt;p&gt;Just for the sake of completeness, here&#x27;s how you would make changes and commit them to the &quot;remote&quot; server:&lt;&#x2F;p&gt;
&lt;p&gt;You made changes to the code, now it&#x27;s time to add and commit:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E0DEF4; background-color: #191724;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; commit&lt;&#x2F;span&gt;&lt;span style=&quot;color: #31748F;&quot;&gt; -a -m&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; &amp;quot;another commit example&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Nice! Now let push them to the &quot;remote&quot; server:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E0DEF4; background-color: #191724;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; push my_killer_app master&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Piece of cake.&lt;&#x2F;p&gt;
&lt;p&gt;And here&#x27;s how a different user sharing the folder would do to collaborate on your project:&lt;&#x2F;p&gt;
&lt;p&gt;Clone the repository:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E0DEF4; background-color: #191724;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; clone ~&#x2F;Dropbox&#x2F;shared_folder&#x2F;my_killer_app.git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Add the alias to remote repository:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E0DEF4; background-color: #191724;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBBCBA;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F6C177;&quot;&gt; remote add my_killer_app ~&#x2F;Dropbox&#x2F;shared_folder&#x2F;my_killer_app.git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And that&#x27;s it! Now it&#x27;s pull, commit and push!&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
