<?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>Neovim on avni.sh</title>
    <link>http://www.avni.sh/tags/neovim/</link>
    <description>Recent content in Neovim on avni.sh</description>
    <image>
      <title>avni.sh</title>
      <url>http://www.avni.sh/cover.webp</url>
      <link>http://www.avni.sh/cover.webp</link>
    </image>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Fri, 12 Jan 2024 00:00:00 +0000</lastBuildDate>
    <atom:link href="http://www.avni.sh/tags/neovim/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Self Hosting LLMs using Ollama</title>
      <link>http://www.avni.sh/posts/self-hosting/self-hosting-ollama/</link>
      <pubDate>Fri, 12 Jan 2024 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/self-hosting/self-hosting-ollama/</guid>
      <description>Hosting Large Language Models (LLMs) on your infrastructure and integrating them with your development environment</description>
      <content:encoded><![CDATA[<p>Ollama provides an interface to self-host and interact with
open-source LLMs (Large Language Models) using its binary
or container image. Managing LLMs using Ollama
is like managing <a href="/posts/computer-science/technologies/cloud-native/container-lifecycle" target="_blank">container lifecycle</a> using container engines like <code>docker</code> or <code>podman</code>.</p>
<ul>
<li>
<p>Ollama commands <code>pull</code> and <code>run</code> are used to download and execute
LLMs respectively, just like the ones used to manage containers
with <code>podman</code> or <code>docker</code>.</p>
</li>
<li>
<p>Tags like <code>13b-python</code> and <code>7b-code</code> are used to manage different
variations of an LLM.</p>
</li>
<li>
<p>A <code>Modelfile</code> (like <code>Dockerfile</code>) is created to build a custom
model using an existing LLM as its base. Additional
parameters like <code>TEMPLATE</code> and <code>PARAMETER</code> could be used to define
a prompt template or fine-tune model parameters respectively.</p>
</li>
</ul>
<h1 id="deploying-ollama-container-with-nvidia-gpu">Deploying Ollama container with NVIDIA GPU</h1>
<p>Deploying the Ollama container directly would allow it to
utilize CPU resources for its LLM workloads, but with the parallel
computation capabilities of a Graphics Processing Unit (GPU), we can
improve the inference performance of all models.</p>
<p>In this article I&rsquo;m using an <strong>NVIDIA GeForce RTX 3070 Ti</strong> GPU, if you
want to use a GPU from AMD/Intel or any other manufacturer then steps
like driver and container toolkit installation and GPU configuration
for the container engine will differ.</p>
<h2 id="gpu-passthrough-to-vm">GPU Passthrough to VM</h2>
<p>I am deploying the Ollama container on a Fedora 38 virtual machine
so the first step will be the GPU Passthrough from my hypervisor
(Proxmox) to the VM. You can skip this step if you are deploying
Ollama on a baremetal machine.</p>
<p>In the Proxmox&rsquo;s Web UI, we can go to the VM&rsquo;s <code>Hardware</code> section
and <code>Add</code> your <code>PCI  Device</code> i.e. your GPU.</p>
<p align="center"><img src="proxmox-hardware.png" alt="Proxmox VM's Hardware Section"></p>
<p align="center"><small>Proxmox VM's Hardware Section</small></p>
<p>Make sure to mark the <code>All Functions</code> checkbox.</p>
<p align="center"><img src="proxmox-gpu-passthrough.png" alt="GPU Passthrough to a Proxmox VM"></p>
<p align="center"><small>GPU Passthrough to a Proxmox VM</small></p>
<p>Once the VM is rebooted we can verify the GPU Passthrough using
the following command.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">lspci <span class="p">|</span> grep NVIDIA
</span></span></code></pre></div><p>If the GPU name is present in the command&rsquo;s output (like below)
then the passthrough is successful and we can move to the next step.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">06:10.0 VGA compatible controller: NVIDIA Corporation GA104 [GeForce RTX 3070 Ti] (rev a1)
</span></span><span class="line"><span class="cl">06:10.1 Audio device: NVIDIA Corporation GA104 High Definition Audio Controller (rev a1)
</span></span></code></pre></div><h2 id="cuda-toolkit-installation">CUDA Toolkit Installation</h2>
<p>To utilize the parallel computation capabilities of the CUDA cores
provided in NVIDIA GPUs we have to install the CUDA Toolkit.
You can follow <a href="https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html" target="_blank">NVIDIA&rsquo;s documentation</a> on the CUDA Toolkit
installation on Linux because the steps vary depending on the host&rsquo;s configuration.</p>
<p>Here are the steps for Fedora 38:</p>
<ol>
<li>Downloading CUDA Toolkit Repo RPM.</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">wget https://developer.download.nvidia.com/compute/cuda/12.3.2/local_installers/cuda-repo-fedora37-12-3-local-12.3.2_545.23.08-1.x86_64.rpm
</span></span></code></pre></div><ol start="2">
<li>Installing CUDA Toolkit Repo RPM.</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo rpm -i cuda-repo-fedora37-12-3-local-12.3.2_545.23.08-1.x86_64.rpm
</span></span></code></pre></div><ol start="3">
<li>Cleaning <code>dnf</code> Repository Metadata.</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo dnf clean all
</span></span></code></pre></div><ol start="4">
<li>Installing <code>cuda-toolkit</code> package.</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo dnf -y install cuda-toolkit-12-3
</span></span></code></pre></div><ol start="5">
<li>Installing <code>legacy</code> (proprietary) or <code>open</code> (open source)
kernel module for <code>nvidia-driver</code>.</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo dnf -y module install nvidia-driver:latest-dkms
</span></span></code></pre></div><p>or</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo dnf -y module install nvidia-driver:open-dkms
</span></span></code></pre></div><h2 id="nvidia-container-toolkit-installation">NVIDIA Container Toolkit Installation</h2>
<p>With <code>nvidia-container-tookit</code>, we can use our NVIDIA GPU
in containerized applications. Here are the steps for installing
NVIDIA Container Toolkit on Fedora 38:</p>
<ol>
<li>Adding <code>nvidia-container-tookit</code> repository.</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="p">|</span> sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo
</span></span></code></pre></div><ol start="2">
<li>Installing the <code>nvidia-container-tookit</code> package.</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo dnf install -y nvidia-container-toolkit
</span></span></code></pre></div><ol start="3">
<li>Once the container toolkit is installed, we have to add its
runtime to our container engine.</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo nvidia-ctk runtime configure --runtime<span class="o">=</span>docker
</span></span></code></pre></div><ol start="4">
<li>Finally, we can start using our NVIDIA GPU with Docker
containers after restarting the <code>docker</code> Daemon.</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo systemctl restart docker
</span></span></code></pre></div><h2 id="deploying-ollama-as-a-docker-container">Deploying Ollama as a Docker Container</h2>
<ol>
<li>Create a directory on our host to store LLMs to avoid
re-downloading models after reprovisioning or updating the
container.</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mkdir -p ~/container-data/ollama
</span></span></code></pre></div><ol start="2">
<li>The following <code>compose.yaml</code> file will deploy
the <code>ollama</code> container with our NVIDIA GPU.</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;3.6&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">services</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">ollama</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">container_name</span><span class="p">:</span><span class="w"> </span><span class="l">ollama</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">ollama/ollama:latest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">~/container-data/ollama:/root/.ollama</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">ports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;11434:11434&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">restart</span><span class="p">:</span><span class="w"> </span><span class="l">unless-stopped</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">deploy</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">resources</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">reservations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">devices</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span>- <span class="nt">driver</span><span class="p">:</span><span class="w"> </span><span class="l">nvidia</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">count</span><span class="p">:</span><span class="w"> </span><span class="l">all</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">capabilities</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">gpu]</span><span class="w">
</span></span></span></code></pre></div><p>If you want to provision the container without GPU
you have to remove the <code>deploy</code> section.</p>
<ol start="3">
<li>Deploy the <code>ollama</code> container using the following command.</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker compose down <span class="o">&amp;&amp;</span> docker compose up -d
</span></span></code></pre></div><p>If you want to deploy Ollama with a ChatGPT-Style Web UI
then follow the deployment steps for <a href="/posts/self-hosting/self-hosting-ollama/#ollama-web-ui">Ollama Web UI</a>.</p>
<h1 id="managing-llms-using-ollama">Managing LLMs using Ollama</h1>
<p>Once the container is provisioned we can start downloading and
executing models.</p>
<p>To attach the Ollama container with a terminal use the
following command</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker <span class="nb">exec</span> -it ollama /bin/bash
</span></span></code></pre></div><h2 id="downloading-llms-using-the-pull-command">Downloading LLMs using the <code>pull</code> command</h2>
<p>To download a model use the <code>ollama pull</code> command with the name
of LLM and its tag (refer to the <a href="https://ollama.ai/library" target="_blank">Ollama Library</a>).</p>
<p>For example, to download the Code Llama model with 7 Billion
parameters we have to pull the <code>codellama:7b</code> model.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ollama pull codellama:7b
</span></span></code></pre></div><p>The model size could range from 4 to 19 GB (or even more).
So choosing the right model tag is crucial to decrease downloading
time and resource utilization.</p>
<p>If we want to delete a downloaded model we&rsquo;ll use the <code>ollama rm</code>
command followed by the name of the model.</p>
<h2 id="executing-llms-using-the-run-command">Executing LLMs using the <code>run</code> command</h2>
<p>Before we prompt the model we have to run it
first using the <code>ollama run</code> command followed by the name of
the model.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ollama run codellama:7b
</span></span></code></pre></div><p>This command will drop us directly into the model&rsquo;s
prompting window.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">&gt;&gt;&gt; Who are you?
</span></span><span class="line"><span class="cl">I am LLaMA, an AI assistant developed by Meta AI that 
</span></span><span class="line"><span class="cl">can understand and respond to human input in a conversational 
</span></span><span class="line"><span class="cl">manner. I am trained on a massive dataset of text from the 
</span></span><span class="line"><span class="cl">internet and can generate human-like responses to a wide range 
</span></span><span class="line"><span class="cl">of topics and questions. I can be used to create chatbots, 
</span></span><span class="line"><span class="cl">virtual assistants, and other applications that require natural 
</span></span><span class="line"><span class="cl">language understanding and generation capabilities.
</span></span></code></pre></div><h1 id="prompting-llms-from-command-line">Prompting LLMs from Command Line</h1>
<p>Ollama exposes multiple REST API endpoints to manage and interact
with the models</p>
<ul>
<li><code>/api/tags</code>: To list all the local models.</li>
<li><code>/api/generate</code>: To generate a response from an LLM with the
prompt passed as input.</li>
<li><code>/api/chat</code>: To generate the next chat response from an LLM.
The prior chat history could be passed as input.</li>
</ul>
<p>We can perform these API requests using <code>curl</code> and format the
response using <code>jq</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl -d <span class="s1">&#39;{
</span></span></span><span class="line"><span class="cl"><span class="s1">  &#34;model&#34;: &#34;codellama:7b&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s1">  &#34;prompt&#34;: &#34;Write a quicksort program in Go&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s1">  &#34;stream&#34;: false
</span></span></span><span class="line"><span class="cl"><span class="s1">}&#39;</span> http://localhost:11434/api/generate <span class="p">|</span> jq -r <span class="s2">&#34;.response&#34;</span>
</span></span></code></pre></div><p>By assigning the <code>stream</code> as <code>false</code> we will receive the complete
response as a single JSON object rather than a stream of multiple
objects.</p>
<h1 id="ollama-web-ui">Ollama Web UI</h1>
<p>With self-hosted applications, it always helps to have a web interface
for management and access from any device.
The Ollama Web UI provides an interface similar to ChatGPT to interact
with LLMs present in Ollama.</p>
<h2 id="deploying-ollama-web-ui">Deploying Ollama Web UI</h2>
<p>Similar to the <code>ollama</code> container deployment we will create a data
directory for <code>ollama-webui</code></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mkdir -p ~/container-data/ollama-webui
</span></span></code></pre></div><p>Modify our existing <code>compose.yaml</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;3.6&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">services</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">ollama</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">container_name</span><span class="p">:</span><span class="w"> </span><span class="l">ollama</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">ollama/ollama:latest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">~/container-data/ollama:/root/.ollama</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">ports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;11434:11434&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">restart</span><span class="p">:</span><span class="w"> </span><span class="l">unless-stopped</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">deploy</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">resources</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">reservations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">devices</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span>- <span class="nt">driver</span><span class="p">:</span><span class="w"> </span><span class="l">nvidia</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">count</span><span class="p">:</span><span class="w"> </span><span class="l">all</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">capabilities</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">gpu]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">ollama-webui</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">container_name</span><span class="p">:</span><span class="w"> </span><span class="l">ollama-webui</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">ghcr.io/ollama-webui/ollama-webui:main</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">ports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="s2">&#34;3030:8080&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">extra_hosts</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="l">host.docker.internal:host-gateway</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="l">~/container-data/ollama-webui:/app/backend/data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">restart</span><span class="p">:</span><span class="w"> </span><span class="l">always</span><span class="w">
</span></span></span></code></pre></div><p>Deploy both containers using <code>docker compose</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker compose down <span class="o">&amp;&amp;</span> docker compose up -d
</span></span></code></pre></div><p>If the <code>ollama</code> container is deployed on a different host then
we have to rebuild the <code>ollama-webui</code> container image by following
the instructions from <a href="https://github.com/ollama-webui/ollama-webui#using-ollama-on-a-different-server" target="_blank">here</a>.</p>
<h2 id="managing-llms-from-ollama-web-ui">Managing LLMs from Ollama Web UI</h2>
<p>Once the deployment is completed we can visit the web UI
at <a href="http://localhost:3030" target="_blank"><code>localhost:3030</code></a>.</p>
<p align="center"><img src="ollama-webui.png" alt="Ollama Web UI"></p>
<p align="center"><small>Ollama Web UI</small></p>
<p>Alongside prompting we can also use the Web UI to manage models.</p>
<p align="center"><img src="ollama-webui-models.png" alt="Managing models using Ollama Web UI"></p>
<p align="center"><small>Managing models using Ollama Web UI</small></p>
<h1 id="integrating-ollama-with-neovim">Integrating Ollama with Neovim</h1>
<p>If you are using Neovim (<a href="/posts/developer-tools/my-development-environment" target="_blank">like me</a>)
then you can integrate models in your development environment
using <a href="https://github.com/nomnivore/ollama.nvim" target="_blank"><code>ollama.nvim</code></a>.</p>
<p><code>ollama.nvim</code> supports the following features:</p>
<ul>
<li>Code generation from a text prompt</li>
<li>Generating an explanation for a code snippet</li>
<li>Code modification suggestions</li>
</ul>
<p align="center"><img src="ollama-nvim.gif" alt="Code explanation from Ollama using ollama.nvim"></p>
<p align="center"><small>Code explanation from Ollama using ollama.nvim</small></p>
<p>I am using LazyVim so I&rsquo;ve created <code>~/.config/nvim/lua/plugins/ollama.lua</code>
with the following content.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-lua" data-lang="lua"><span class="line"><span class="cl"><span class="kr">return</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="s2">&#34;nomnivore/ollama.nvim&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">	<span class="n">dependencies</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="s2">&#34;nvim-lua/plenary.nvim&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">	<span class="p">},</span>
</span></span><span class="line"><span class="cl">	<span class="c1">-- All the user commands added by the plugin</span>
</span></span><span class="line"><span class="cl">	<span class="n">cmd</span> <span class="o">=</span> <span class="p">{</span> <span class="s2">&#34;Ollama&#34;</span><span class="p">,</span> <span class="s2">&#34;OllamaModel&#34;</span><span class="p">,</span> <span class="s2">&#34;OllamaServe&#34;</span><span class="p">,</span> <span class="s2">&#34;OllamaServeStop&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">	<span class="n">keys</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="c1">-- Sample keybind for prompt menu.</span>
</span></span><span class="line"><span class="cl">		<span class="c1">-- Note that the &lt;c-u&gt; is important for selections</span>
</span></span><span class="line"><span class="cl">		<span class="c1">-- to work properly.</span>
</span></span><span class="line"><span class="cl">		<span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="s2">&#34;&lt;leader&gt;oo&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">			<span class="s2">&#34;:&lt;c-u&gt;lua require(&#39;ollama&#39;).prompt()&lt;cr&gt;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">			<span class="n">desc</span> <span class="o">=</span> <span class="s2">&#34;ollama prompt&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">			<span class="n">mode</span> <span class="o">=</span> <span class="p">{</span> <span class="s2">&#34;n&#34;</span><span class="p">,</span> <span class="s2">&#34;v&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">		<span class="p">},</span>
</span></span><span class="line"><span class="cl">		<span class="c1">-- Sample keybind for direct prompting.</span>
</span></span><span class="line"><span class="cl">		<span class="c1">-- Note that the &lt;c-u&gt; is important for selections</span>
</span></span><span class="line"><span class="cl">		<span class="c1">-- to work properly.</span>
</span></span><span class="line"><span class="cl">		<span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="s2">&#34;&lt;leader&gt;oG&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">			<span class="s2">&#34;:&lt;c-u&gt;lua require(&#39;ollama&#39;).prompt(&#39;Generate_Code&#39;)&lt;cr&gt;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">			<span class="n">desc</span> <span class="o">=</span> <span class="s2">&#34;ollama Generate Code&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">			<span class="n">mode</span> <span class="o">=</span> <span class="p">{</span> <span class="s2">&#34;n&#34;</span><span class="p">,</span> <span class="s2">&#34;v&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">		<span class="p">},</span>
</span></span><span class="line"><span class="cl">	<span class="p">},</span>
</span></span><span class="line"><span class="cl">	<span class="c1">---@type Ollama.Config</span>
</span></span><span class="line"><span class="cl">	<span class="n">opts</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="n">model</span> <span class="o">=</span> <span class="s2">&#34;codellama:7b&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="n">url</span> <span class="o">=</span> <span class="s2">&#34;http://127.0.0.1:11434&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">	<span class="p">},</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h1 id="integrating-ollama-with-vscode">Integrating Ollama with VSCode</h1>
<p>The <a href="https://marketplace.visualstudio.com/items?itemName=Continue.continue" target="_blank">Continue</a> VSCode
extension supports the integration of LLMs
as coding assistants. To use it with Ollama we have to
change the <strong>Proxy Server Url</strong> in its settings to the one
used by our Ollama container.</p>
<p align="center"><img src="continue-settings.png" alt="Continue Extension Settings"></p>
<p align="center"><small>Continue Extension Settings</small></p>
<p>Watch Ollama in action inside VSCode</p>
<p align="center"><img src="ollama-vscode.gif" alt="Optimizing code using Ollama in VSCode"></p>
<p align="center"><small>Optimizing code using Ollama in VSCode</small></p>
<h1 id="resources">Resources</h1>
<p><a href="https://ollama.ai/" target="_blank">Ollama</a><br>
<a href="https://hub.docker.com/r/ollama/ollama" target="_blank">Ollama Docker Image</a><br>
<a href="https://www.nvidia.com/en-in/geforce/graphics-cards/30-series/rtx-3070-3070ti/" target="_blank">NVIDIA GeForce RTX 3070 Ti</a><br>
<a href="https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html" target="_blank">NVIDIA CUDA Installation Guide for Linux</a><br>
<a href="https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/index.html" target="_blank">NVIDIA Container Toolkit</a><br>
<a href="https://ollama.ai/library" target="_blank">Ollama Library</a><br>
<a href="https://github.com/ollama-webui/ollama-webui" target="_blank">Ollama Web UI</a><br>
<a href="https://github.com/nomnivore/ollama.nvim" target="_blank">ollama.nvim</a><br>
<a href="https://marketplace.visualstudio.com/items?itemName=Continue.continue" target="_blank">Continue</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>My Development Environment: kitty, zsh, Neovim, tmux, and lazygit</title>
      <link>http://www.avni.sh/posts/developer-tools/my-development-environment/</link>
      <pubDate>Thu, 21 Dec 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/developer-tools/my-development-environment/</guid>
      <description>I am switching to Neovim</description>
      <content:encoded><![CDATA[<p>Until now I&rsquo;ve been using <a href="https://code.visualstudio.com/" target="_blank">Visual Studio Code</a> as my primary code editor because I try different Linux distributions on my laptop and VSCode is available by default in almost every application manager. When I open a new project, the VSCode suggests relevant extensions based on the tech stack.</p>
<p>After hearing the praises for Neovim from <a href="https://www.youtube.com/@ThePrimeTimeagen" target="_blank">Primeagen</a> and <a href="https://www.youtube.com/@teej_dv" target="_blank">TJ DeVries</a> I decided to give it a go along with other command line utilities like <code>tmux</code> and <code>lazygit</code> to test if they optimize my development workflow.</p>
<p>I use vim motions in all workflows related to text whether it is writing code in VSCode (using <a href="https://github.com/VSCodeVim/Vim" target="_blank">VIM Plugin</a>) or my journal in <a href="https://obsidian.md/" target="_blank">Obsidian</a>. I also use <code>vim</code> occasionally to perform quick edits on configuration files while I&rsquo;ve SSH into a remote machine.</p>
<p>I have configured key bindings to navigate inside VSCode and throughout my system. Thus, adapting to a terminal and key binding-focused workflow won’t be difficult.</p>
<h1 id="terminal-kitty">Terminal: Kitty</h1>
<p align="center"><img src="https://sw.kovidgoyal.net/kitty/_static/kitty.svg" alt="kitty logo"></p>
<p align="center"><small><i>Source: <a href="https://sw.kovidgoyal.net">sw.kovidgoyal.net</a></i></small></p>
<p>I have provisioned a Fedora 38 virtual machine on my <a href="/posts/homelab/building-your-own-homelab/" target="_blank">homelab</a> as a persistent development environment. On it, I use <a href="https://sw.kovidgoyal.net/kitty/" target="_blank">kitty</a> as my terminal emulator because it is lightweight and it could be configured by a single file <code>~/.config/kitty/kitty.conf</code>.</p>
<h2 id="installation">Installation</h2>
<p><code>kitty</code> is available as a <code>dnf</code> package by default in Fedora.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo dnf install kitty
</span></span></code></pre></div><h2 id="configuration">Configuration</h2>
<p>I have made the following changes to the default kitty configuration (<a href="https://github.com/bovem/dotfiles/blob/main/.config/kitty/kitty.conf" target="_blank"><code>kitty.conf</code></a>)</p>
<ul>
<li>Changed font family to <a href="https://www.jetbrains.com/lp/mono/" target="_blank">JetBrains Mono</a>.</li>
</ul>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 344 41"
      >
      <g transform='translate(8,16)'>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='0' y='20' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='8' y='20' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='16' y='20' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='24' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='24' y='20' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='32' y='4' fill='currentColor' style='font-size:1em'>_</text>
<text text-anchor='middle' x='32' y='20' fill='currentColor' style='font-size:1em'>_</text>
<text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='40' y='20' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='48' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='48' y='20' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='56' y='4' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='56' y='20' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='64' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='64' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='152' y='4' fill='currentColor' style='font-size:1em'>J</text>
<text text-anchor='middle' x='152' y='20' fill='currentColor' style='font-size:1em'>J</text>
<text text-anchor='middle' x='160' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='160' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='168' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='168' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='176' y='4' fill='currentColor' style='font-size:1em'>B</text>
<text text-anchor='middle' x='176' y='20' fill='currentColor' style='font-size:1em'>B</text>
<text text-anchor='middle' x='184' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='184' y='20' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='192' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='192' y='20' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='200' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='200' y='20' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='208' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='208' y='20' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='216' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='216' y='20' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='224' y='4' fill='currentColor' style='font-size:1em'>M</text>
<text text-anchor='middle' x='224' y='20' fill='currentColor' style='font-size:1em'>M</text>
<text text-anchor='middle' x='232' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='232' y='20' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='240' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='240' y='20' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='248' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='248' y='20' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='256' y='4' fill='currentColor' style='font-size:1em'>N</text>
<text text-anchor='middle' x='256' y='20' fill='currentColor' style='font-size:1em'>N</text>
<text text-anchor='middle' x='264' y='4' fill='currentColor' style='font-size:1em'>F</text>
<text text-anchor='middle' x='264' y='20' fill='currentColor' style='font-size:1em'>F</text>
<text text-anchor='middle' x='272' y='4' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='272' y='20' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='280' y='4' fill='currentColor' style='font-size:1em'>R</text>
<text text-anchor='middle' x='280' y='20' fill='currentColor' style='font-size:1em'>B</text>
<text text-anchor='middle' x='288' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='288' y='20' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='296' y='4' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='296' y='20' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='304' y='4' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='304' y='20' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='312' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='320' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='328' y='4' fill='currentColor' style='font-size:1em'>r</text>
</g>

    </svg>
  
</div>
<ul>
<li>Font size changed to 16</li>
</ul>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 120 25"
      >
      <g transform='translate(8,16)'>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='24' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='32' y='4' fill='currentColor' style='font-size:1em'>_</text>
<text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='48' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='56' y='4' fill='currentColor' style='font-size:1em'>z</text>
<text text-anchor='middle' x='64' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'>1</text>
<text text-anchor='middle' x='88' y='4' fill='currentColor' style='font-size:1em'>6</text>
<text text-anchor='middle' x='96' y='4' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='104' y='4' fill='currentColor' style='font-size:1em'>0</text>
</g>

    </svg>
  
</div>
<ul>
<li>Changed cursor for aesthetics</li>
</ul>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 216 57"
      >
      <g transform='translate(8,16)'>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='0' y='20' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='0' y='36' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='8' y='20' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='8' y='36' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='16' y='20' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='16' y='36' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='24' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='24' y='20' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='24' y='36' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='32' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='32' y='20' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='32' y='36' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='40' y='20' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='40' y='36' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='48' y='4' fill='currentColor' style='font-size:1em'>_</text>
<text text-anchor='middle' x='48' y='20' fill='currentColor' style='font-size:1em'>_</text>
<text text-anchor='middle' x='48' y='36' fill='currentColor' style='font-size:1em'>_</text>
<text text-anchor='middle' x='56' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='56' y='20' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='56' y='36' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='64' y='4' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='64' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='64' y='36' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='72' y='20' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='72' y='36' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='80' y='20' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='80' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='88' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='88' y='20' fill='currentColor' style='font-size:1em'>_</text>
<text text-anchor='middle' x='88' y='36' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='96' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='96' y='36' fill='currentColor' style='font-size:1em'>_</text>
<text text-anchor='middle' x='104' y='4' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='104' y='20' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='104' y='36' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='112' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='112' y='20' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='112' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='120' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='120' y='20' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='120' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='128' y='4' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='128' y='20' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='128' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='136' y='20' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='136' y='36' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='144' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='144' y='36' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='152' y='20' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='152' y='36' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='160' y='20' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='160' y='36' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='176' y='20' fill='currentColor' style='font-size:1em'>1</text>
<text text-anchor='middle' x='176' y='36' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='184' y='20' fill='currentColor' style='font-size:1em'>0</text>
<text text-anchor='middle' x='184' y='36' fill='currentColor' style='font-size:1em'>1</text>
<text text-anchor='middle' x='192' y='20' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='200' y='20' fill='currentColor' style='font-size:1em'>0</text>
</g>

    </svg>
  
</div>
<ul>
<li>Changed mouse cursor hiding time to 2 seconds</li>
</ul>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 160 25"
      >
      <g transform='translate(8,16)'>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='24' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='32' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>_</text>
<text text-anchor='middle' x='48' y='4' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='56' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='64' y='4' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'>_</text>
<text text-anchor='middle' x='88' y='4' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='96' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='104' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='112' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='128' y='4' fill='currentColor' style='font-size:1em'>2</text>
<text text-anchor='middle' x='136' y='4' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='144' y='4' fill='currentColor' style='font-size:1em'>0</text>
</g>

    </svg>
  
</div>
<ul>
<li>Enabled URL detection so that I visit them directly from my terminal</li>
</ul>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 128 25"
      >
      <g transform='translate(8,16)'>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='24' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='32' y='4' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='48' y='4' fill='currentColor' style='font-size:1em'>_</text>
<text text-anchor='middle' x='56' y='4' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='64' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='96' y='4' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='104' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='112' y='4' fill='currentColor' style='font-size:1em'>s</text>
</g>

    </svg>
  
</div>
<ul>
<li>Configuring copy on selection to send it directly to the clipboard. It&rsquo;s useful when I have to quickly share a command&rsquo;s output with someone else.</li>
</ul>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 200 25"
      >
      <g transform='translate(8,16)'>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='24' y='4' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='32' y='4' fill='currentColor' style='font-size:1em'>_</text>
<text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='48' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='56' y='4' fill='currentColor' style='font-size:1em'>_</text>
<text text-anchor='middle' x='64' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='88' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='96' y='4' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='104' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='120' y='4' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='128' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='136' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='144' y='4' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='152' y='4' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='160' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='168' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='176' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='184' y='4' fill='currentColor' style='font-size:1em'>d</text>
</g>

    </svg>
  
</div>
<p>If you want to test your kitty configuration changes then it might be useful to change the default key binding for reloading configuration to be something more accessible like <code>Ctrl+f5</code>.</p>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 248 25"
      >
      <g transform='translate(8,16)'>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='32' y='4' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='48' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='56' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='64' y='4' fill='currentColor' style='font-size:1em'>+</text>
<text text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'>5</text>
<text text-anchor='middle' x='112' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='120' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='128' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='136' y='4' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='144' y='4' fill='currentColor' style='font-size:1em'>_</text>
<text text-anchor='middle' x='152' y='4' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='160' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='168' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='176' y='4' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='184' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='192' y='4' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='200' y='4' fill='currentColor' style='font-size:1em'>_</text>
<text text-anchor='middle' x='208' y='4' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='216' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='224' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='232' y='4' fill='currentColor' style='font-size:1em'>e</text>
</g>

    </svg>
  
</div>
<h1 id="shell-zsh">Shell: ZSH</h1>
<p align="center"><img src="https://raw.githubusercontent.com/Zsh-art/logo/main/svg/color_horizontal_icon.svg" alt="zsh logo"></p>
<p align="center"><small><i>Source: <a href="https://github.com/Zsh-art/logo">Zsh-art/logo</a></i></small></p>
<p>I use <a href="https://www.zsh.org/" target="_blank">zsh</a> along with <a href="https://ohmyz.sh/" target="_blank">oh-my-zsh</a> because of its aesthetics and the git information displayed on its prompt.</p>
<h2 id="installation-1">Installation</h2>
<ol>
<li>Installing <code>zsh</code></li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo dnf install zsh
</span></span></code></pre></div><ol start="2">
<li>Changing default shell to <code>zsh</code></li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">chsh -s <span class="k">$(</span>which zsh<span class="k">)</span>
</span></span></code></pre></div><ol start="3">
<li>Logout and log back in with the same user</li>
<li>Installing Oh-My-Zsh</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sh -c <span class="s2">&#34;</span><span class="k">$(</span>curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh<span class="k">)</span><span class="s2">&#34;</span>
</span></span></code></pre></div><ol start="5">
<li>Add path to your <code>oh-my-zsh</code> configuration in <code>~/.zshrc</code></li>
</ol>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 224 25"
      >
      <g transform='translate(8,16)'>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>x</text>
<text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='24' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='32' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='56' y='4' fill='currentColor' style='font-size:1em'>Z</text>
<text text-anchor='middle' x='64' y='4' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'>H</text>
<text text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'>=</text>
<text text-anchor='middle' x='88' y='4' fill='currentColor' style='font-size:1em'>$</text>
<text text-anchor='middle' x='96' y='4' fill='currentColor' style='font-size:1em'>H</text>
<text text-anchor='middle' x='104' y='4' fill='currentColor' style='font-size:1em'>O</text>
<text text-anchor='middle' x='112' y='4' fill='currentColor' style='font-size:1em'>M</text>
<text text-anchor='middle' x='120' y='4' fill='currentColor' style='font-size:1em'>E</text>
<text text-anchor='middle' x='128' y='4' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='136' y='4' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='144' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='152' y='4' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='160' y='4' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='168' y='4' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='176' y='4' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='184' y='4' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='192' y='4' fill='currentColor' style='font-size:1em'>z</text>
<text text-anchor='middle' x='200' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='208' y='4' fill='currentColor' style='font-size:1em'>h</text>
</g>

    </svg>
  
</div>
<h2 id="configuration-1">Configuration</h2>
<p>I have performed the following edits on my <a href="https://github.com/bovem/dotfiles/blob/main/.zshrc" target="_blank"><code>~/.zshrc</code></a> file</p>
<ul>
<li>Changed the <code>zsh</code> theme to <code>bureau</code> in the <code>~/.zshrc</code> file</li>
</ul>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 152 25"
      >
      <g transform='translate(8,16)'>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>Z</text>
<text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>H</text>
<text text-anchor='middle' x='24' y='4' fill='currentColor' style='font-size:1em'>_</text>
<text text-anchor='middle' x='32' y='4' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>H</text>
<text text-anchor='middle' x='48' y='4' fill='currentColor' style='font-size:1em'>E</text>
<text text-anchor='middle' x='56' y='4' fill='currentColor' style='font-size:1em'>M</text>
<text text-anchor='middle' x='64' y='4' fill='currentColor' style='font-size:1em'>E</text>
<text text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'>=</text>
<text text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'>"</text>
<text text-anchor='middle' x='88' y='4' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='96' y='4' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='104' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='112' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='120' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='128' y='4' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='136' y='4' fill='currentColor' style='font-size:1em'>"</text>
</g>

    </svg>
  
</div>
<ul>
<li>Installed the <code>zsh-autosuggestions</code> plugin</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git clone https://github.com/zsh-users/zsh-autosuggestions <span class="si">${</span><span class="nv">ZSH_CUSTOM</span><span class="k">:-</span><span class="p">~/.oh-my-zsh/custom</span><span class="si">}</span>/plugins/zsh-autosuggestions
</span></span></code></pre></div><ul>
<li>Installed the <code>zsh-syntax-highlighting</code> plugin</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git clone https://github.com/zsh-users/zsh-syntax-highlighting <span class="si">${</span><span class="nv">ZSH_CUSTOM</span><span class="k">:-</span><span class="p">~/.oh-my-zsh/custom</span><span class="si">}</span>/plugins/zsh-syntax-highlighting
</span></span></code></pre></div><ul>
<li>Enabled plugins in <code>~/.zshrc</code></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-zshrc" data-lang="zshrc"><span class="line"><span class="cl"><span class="nv">plugins</span><span class="o">=(</span>
</span></span><span class="line"><span class="cl">    git
</span></span><span class="line"><span class="cl">    zsh-autosuggestions
</span></span><span class="line"><span class="cl">    zsh-syntax-highlighting
</span></span><span class="line"><span class="cl">    docker
</span></span><span class="line"><span class="cl"><span class="o">)</span>
</span></span></code></pre></div><p>You can load your <code>zsh</code> configuration using the <code>source</code> command.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">source</span> ~/.zshrc
</span></span></code></pre></div><h1 id="terminal-multiplexer-tmux">Terminal Multiplexer (<code>tmux</code>)</h1>
<p align="center"><img src="https://github.com/tmux/tmux/raw/master/logo/tmux-logo-medium.png?raw=true" alt="tmux logo"></p>
<p align="center"><small><i>Source: <a href="https://github.com/tmux/tmux/wiki">tmux wiki</a></i></small></p>
<p><a href="https://github.com/tmux/tmux/wiki" target="_blank"><code>tmux</code></a> allows me to run multiple terminal sessions that could be detached (sent to background) and reattached upon requirement. I use it to maintain persistent terminal sessions across multiple SSH clients.</p>
<h2 id="installation-2">Installation</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo dnf install tmux
</span></span></code></pre></div><h2 id="configuration-2">Configuration</h2>
<p>Here are some changes I&rsquo;ve made to <a href="https://github.com/bovem/dotfiles/blob/main/.config/tmux/tmux.conf" target="_blank"><code>~/.config/tmux/tmux.conf</code></a>.</p>
<ul>
<li>Changed the prefix key combination from <code>Ctrl+B</code> to <code>Ctrl+Space</code> because it is more ergonomic for me.</li>
</ul>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 200 57"
      >
      <g transform='translate(8,16)'>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='0' y='20' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='0' y='36' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='8' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='8' y='36' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='16' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='16' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='24' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='24' y='36' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='32' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='32' y='20' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='40' y='20' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='40' y='36' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='48' y='36' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='56' y='4' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='56' y='20' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='56' y='36' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='64' y='4' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='64' y='20' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='64' y='36' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='72' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='72' y='36' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='80' y='20' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='80' y='36' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='88' y='20' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='88' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='96' y='20' fill='currentColor' style='font-size:1em'>x</text>
<text text-anchor='middle' x='104' y='36' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='112' y='20' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='112' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='120' y='20' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='120' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='128' y='20' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='128' y='36' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='136' y='20' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='136' y='36' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='144' y='20' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='144' y='36' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='152' y='20' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='152' y='36' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='160' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='160' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='168' y='36' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='176' y='36' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='184' y='36' fill='currentColor' style='font-size:1em'>x</text>
</g>

    </svg>
  
</div>
<ul>
<li>Enabled mouse support because I want more control over window resizing.</li>
</ul>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 128 25"
      >
      <g transform='translate(8,16)'>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='32' y='4' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='56' y='4' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='64' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='88' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='104' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='112' y='4' fill='currentColor' style='font-size:1em'>n</text>
</g>

    </svg>
  
</div>
<ul>
<li>Set base index for windows to 1</li>
</ul>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 312 73"
      >
      <g transform='translate(8,16)'>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='0' y='20' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='0' y='36' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='0' y='52' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='8' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='8' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='8' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='16' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='16' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='16' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='24' y='36' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='24' y='52' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='32' y='4' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='32' y='20' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='32' y='36' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='32' y='52' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='40' y='20' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='40' y='36' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='40' y='52' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='48' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='48' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='56' y='4' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='56' y='20' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='56' y='36' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='56' y='52' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='64' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='64' y='20' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='64' y='36' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='64' y='52' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='72' y='20' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='72' y='36' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='72' y='52' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='80' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='80' y='36' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='88' y='4' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='88' y='20' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='88' y='36' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='88' y='52' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='96' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='96' y='20' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='96' y='36' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='96' y='52' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='104' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='104' y='20' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='104' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='112' y='4' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='112' y='20' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='112' y='36' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='112' y='52' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='120' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='120' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='120' y='36' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='120' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='128' y='4' fill='currentColor' style='font-size:1em'>x</text>
<text text-anchor='middle' x='128' y='20' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='128' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='128' y='52' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='136' y='20' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='136' y='52' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='144' y='4' fill='currentColor' style='font-size:1em'>1</text>
<text text-anchor='middle' x='144' y='20' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='144' y='36' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='144' y='52' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='152' y='20' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='152' y='36' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='152' y='52' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='160' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='160' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='168' y='20' fill='currentColor' style='font-size:1em'>x</text>
<text text-anchor='middle' x='168' y='36' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='168' y='52' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='176' y='36' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='176' y='52' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='184' y='20' fill='currentColor' style='font-size:1em'>1</text>
<text text-anchor='middle' x='184' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='184' y='52' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='192' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='192' y='52' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='200' y='36' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='200' y='52' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='208' y='36' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='208' y='52' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='216' y='36' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='216' y='52' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='224' y='36' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='224' y='52' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='232' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='232' y='52' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='240' y='36' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='248' y='36' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='248' y='52' fill='currentColor' style='font-size:1em'>1</text>
<text text-anchor='middle' x='256' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='264' y='36' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='272' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='280' y='36' fill='currentColor' style='font-size:1em'>x</text>
<text text-anchor='middle' x='296' y='36' fill='currentColor' style='font-size:1em'>1</text>
</g>

    </svg>
  
</div>
<ul>
<li>Added some custom key bindings for creating and switching between windows</li>
</ul>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 400 73"
      >
      <g transform='translate(8,16)'>
<path d='M 160,48 L 168,48' fill='none' stroke='currentColor'></path>
<polygon points='176.000000,48.000000 164.000000,42.400002 164.000000,53.599998' fill='currentColor' transform='rotate(90.000000, 168.000000, 48.000000)'></polygon>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='0' y='20' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='0' y='36' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='0' y='52' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='8' y='20' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='8' y='36' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='8' y='52' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='16' y='20' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='16' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='16' y='52' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='24' y='4' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='24' y='20' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='24' y='36' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='24' y='52' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='40' y='20' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='40' y='36' fill='currentColor' style='font-size:1em'>|</text>
<text text-anchor='middle' x='40' y='52' fill='currentColor' style='font-size:1em'>_</text>
<text text-anchor='middle' x='48' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='48' y='20' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='56' y='36' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='56' y='52' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='64' y='4' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='64' y='20' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='64' y='36' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='64' y='52' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='72' y='20' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='72' y='36' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='72' y='52' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='80' y='20' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='80' y='36' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='80' y='52' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='88' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='88' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='96' y='4' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='96' y='20' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='96' y='36' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='96' y='52' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='104' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='104' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='104' y='36' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='104' y='52' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='112' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='112' y='20' fill='currentColor' style='font-size:1em'>x</text>
<text text-anchor='middle' x='112' y='36' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='112' y='52' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='120' y='4' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='120' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='120' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='120' y='52' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='128' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='128' y='20' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='128' y='36' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='128' y='52' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='136' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='136' y='20' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='136' y='36' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='136' y='52' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='144' y='4' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='144' y='20' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='144' y='36' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='144' y='52' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='152' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='152' y='20' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='160' y='4' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='160' y='20' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='160' y='36' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='168' y='4' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='168' y='20' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='168' y='36' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='176' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='176' y='20' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='184' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='184' y='36' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='184' y='52' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='192' y='4' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='192' y='36' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='192' y='52' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='200' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='208' y='4' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='208' y='36' fill='currentColor' style='font-size:1em'>"</text>
<text text-anchor='middle' x='208' y='52' fill='currentColor' style='font-size:1em'>"</text>
<text text-anchor='middle' x='216' y='36' fill='currentColor' style='font-size:1em'>#</text>
<text text-anchor='middle' x='216' y='52' fill='currentColor' style='font-size:1em'>#</text>
<text text-anchor='middle' x='224' y='36' fill='currentColor' style='font-size:1em'>{</text>
<text text-anchor='middle' x='224' y='52' fill='currentColor' style='font-size:1em'>{</text>
<text text-anchor='middle' x='232' y='36' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='232' y='52' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='240' y='36' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='240' y='52' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='248' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='248' y='52' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='256' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='256' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='264' y='36' fill='currentColor' style='font-size:1em'>_</text>
<text text-anchor='middle' x='264' y='52' fill='currentColor' style='font-size:1em'>_</text>
<text text-anchor='middle' x='272' y='36' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='272' y='52' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='280' y='36' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='280' y='52' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='288' y='36' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='288' y='52' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='296' y='36' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='296' y='52' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='304' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='304' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='312' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='312' y='52' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='320' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='320' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='328' y='36' fill='currentColor' style='font-size:1em'>_</text>
<text text-anchor='middle' x='328' y='52' fill='currentColor' style='font-size:1em'>_</text>
<text text-anchor='middle' x='336' y='36' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='336' y='52' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='344' y='36' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='344' y='52' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='352' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='352' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='360' y='36' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='360' y='52' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='368' y='36' fill='currentColor' style='font-size:1em'>}</text>
<text text-anchor='middle' x='368' y='52' fill='currentColor' style='font-size:1em'>}</text>
<text text-anchor='middle' x='376' y='36' fill='currentColor' style='font-size:1em'>"</text>
<text text-anchor='middle' x='376' y='52' fill='currentColor' style='font-size:1em'>"</text>
</g>

    </svg>
  
</div>
<ul>
<li>To install plugins for <code>tmux</code> I have installed <a href="https://github.com/tmux-plugins/tpm" target="_blank">tmux plugin manager</a> or <code>tpm</code></li>
</ul>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 272 25"
      >
      <g transform='translate(8,16)'>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='32' y='4' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='56' y='4' fill='currentColor' style='font-size:1em'>@</text>
<text text-anchor='middle' x='64' y='4' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='88' y='4' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='96' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='104' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='120' y='4' fill='currentColor' style='font-size:1em'>'</text>
<text text-anchor='middle' x='128' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='136' y='4' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='144' y='4' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='152' y='4' fill='currentColor' style='font-size:1em'>x</text>
<text text-anchor='middle' x='160' y='4' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='168' y='4' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='176' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='184' y='4' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='192' y='4' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='200' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='208' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='216' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='224' y='4' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='232' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='240' y='4' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='248' y='4' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='256' y='4' fill='currentColor' style='font-size:1em'>'</text>
</g>

    </svg>
  
</div>
<p>and added this line at the end of <code>tmux.conf</code></p>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 240 25"
      >
      <g transform='translate(8,16)'>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='32' y='4' fill='currentColor' style='font-size:1em'>'</text>
<text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>~</text>
<text text-anchor='middle' x='48' y='4' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='56' y='4' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='64' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='88' y='4' fill='currentColor' style='font-size:1em'>x</text>
<text text-anchor='middle' x='96' y='4' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='104' y='4' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='112' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='120' y='4' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='128' y='4' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='136' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='144' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='152' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='160' y='4' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='168' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='176' y='4' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='184' y='4' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='192' y='4' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='200' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='208' y='4' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='216' y='4' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='224' y='4' fill='currentColor' style='font-size:1em'>'</text>
</g>

    </svg>
  
</div>
<p>Here are some of the plugins I&rsquo;ve installed for <code>tmux</code></p>
<ul>
<li><a href="https://github.com/tmux-plugins/tmux-sensible" target="_blank">tmux-sensible</a>: Helps me set custom key bindings for my workflow</li>
<li><a href="https://github.com/christoomey/vim-tmux-navigator" target="_blank">vim-tmux-navigator</a>: Enables window navigation using vim keys (<code>h,j,k,l</code>)</li>
<li><a href="https://github.com/tmux-plugins/tmux-resurrect" target="_blank">tmux-resurrect</a>: Using this I can save and restore my tmux sessions across reboots. I might switch to <a href="https://github.com/jimeh/tmuxifier" target="_blank">tmuxifier</a> to define my tmux sessions in a file rather than saving and reloading them.</li>
<li><a href="https://github.com/tmux-plugins/tmux-yank" target="_blank">tmux-yank</a>: To copy text from tmux directly to the system&rsquo;s clipboard.</li>
</ul>
<p>To load your tmux configuration changes you can use the <code>source</code> command</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">source</span> ~/.config/tmux/tmux.conf
</span></span></code></pre></div><p>and to install plugins you have to use keybinding <code>Ctrl+Space,i</code>.</p>
<h1 id="code-editor-neovim-lazyvim">Code Editor: Neovim (LazyVim)</h1>
<p align="center"><img src="https://raw.githubusercontent.com/neovim/neovim.github.io/master/logos/neovim-logo-flat.svg" alt="neovim logo"></p>
<p align="center"><small><i>Source: <a href="https://github.com/neovim/neovim.github.io">neovim.github.io</a></i></small></p>
<p><a href="https://neovim.io/" target="_blank">Neovim</a> is a fork of VIM that could be used as a base to develop a <em>Personalized Development Environment (PDE)</em>. It has multiple distributions but the one I&rsquo;m using is <a href="https://www.lazyvim.org/" target="_blank">LazyVim</a>, a minimalist configuration for Neovim. It&rsquo;s a distribution alternative to <a href="https://github.com/nvim-lua/kickstart.nvim" target="_blank">kickstart.nvim</a> configuration.</p>
<h2 id="installation-3">Installation</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo dnf install neovim
</span></span></code></pre></div><h2 id="configuration-3">Configuration</h2>
<p>To install LazyVim follow the guide at <a href="https://www.lazyvim.org/installation" target="_blank">lazyvim.org</a>. I&rsquo;ve made the following changes to LazyVim&rsquo;s default configuration</p>
<ul>
<li>Toggled visibility of hidden files and folders in neo-tree (<a href="https://github.com/bovem/dotfiles/blob/main/.config/nvim/lua/plugins/neotree.lua" target="_blank"><code>~/.config/nvim/lua/plugins/neotree.lua</code></a>)</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-lua" data-lang="lua"><span class="line"><span class="cl"><span class="kr">return</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;nvim-neo-tree/neo-tree.nvim&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">opts</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">filesystem</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="n">filtered_items</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">visible</span> <span class="o">=</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">hide_dotfiles</span> <span class="o">=</span> <span class="kc">false</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">hide_gitignored</span> <span class="o">=</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">},</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><ul>
<li>Configured <code>vim-tmux-navigator</code> key bindings (<a href="https://github.com/bovem/dotfiles/blob/main/.config/nvim/lua/plugins/vim-navigator.lua" target="_blank"><code>~/.config/nvim/lua/plugins/vim-navigator.lua</code></a>)</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-lua" data-lang="lua"><span class="line"><span class="cl"><span class="kr">return</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;christoomey/vim-tmux-navigator&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">keys</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span> <span class="s2">&#34;&lt;C-</span><span class="se">\\</span><span class="s2">&gt;&#34;</span><span class="p">,</span> <span class="s2">&#34;&lt;cmd&gt;TmuxNavigatePrevious&lt;cr&gt;&#34;</span><span class="p">,</span> <span class="n">desc</span> <span class="o">=</span> <span class="s2">&#34;Go to the previous pane&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span> <span class="s2">&#34;&lt;C-h&gt;&#34;</span><span class="p">,</span> <span class="s2">&#34;&lt;cmd&gt;TmuxNavigateLeft&lt;cr&gt;&#34;</span><span class="p">,</span> <span class="n">desc</span> <span class="o">=</span> <span class="s2">&#34;Got to the left pane&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span> <span class="s2">&#34;&lt;C-j&gt;&#34;</span><span class="p">,</span> <span class="s2">&#34;&lt;cmd&gt;TmuxNavigateDown&lt;cr&gt;&#34;</span><span class="p">,</span> <span class="n">desc</span> <span class="o">=</span> <span class="s2">&#34;Got to the down pane&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span> <span class="s2">&#34;&lt;C-k&gt;&#34;</span><span class="p">,</span> <span class="s2">&#34;&lt;cmd&gt;TmuxNavigateUp&lt;cr&gt;&#34;</span><span class="p">,</span> <span class="n">desc</span> <span class="o">=</span> <span class="s2">&#34;Got to the up pane&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span> <span class="s2">&#34;&lt;C-l&gt;&#34;</span><span class="p">,</span> <span class="s2">&#34;&lt;cmd&gt;TmuxNavigateRight&lt;cr&gt;&#34;</span><span class="p">,</span> <span class="n">desc</span> <span class="o">=</span> <span class="s2">&#34;Got to the right pane&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">},</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h1 id="git-client-lazygit">Git Client: lazygit</h1>
<p align="center"><img src="https://user-images.githubusercontent.com/8456633/174470852-339b5011-5800-4bb9-a628-ff230aa8cd4e.png" alt="lazygit logo"></p>
<p align="center"><small><i>Source: <a href="https://github.com/jesseduffield/lazygit">jesseduffield/lazygit</a></i></small></p>
<p>I like the Source control pane in the VScode and it has been my go-to client for all git operations. Going through my changes in the source control window allows me to review them before I commit to my repository. I opted for <code>lazygit</code> as its alternative.</p>
<p align="center"><img src="source-control-vscode.png" alt="Source Control pane in VSCode Sidebar"></p>
<p align="center"><small>Source Control Pane in VSCode Sidebar</small></p>
<p>In its primary window, the <code>lazygit</code> has an overview of changes performed after the last commit. It could be accessed directly from the Neovim using the key binding <code>Space,g,g</code>.</p>
<p align="center"><img src="lazygit-window.png" alt="Lazygit Window"></p>
<p align="center"><small>Lazygit Window</small></p>
<p>I can perform git operations using a single button inside the lazygit window</p>
<ul>
<li>Stage all files: <code>a</code></li>
<li>Stage current file: <code>Space</code></li>
<li>Commit all staged changes: <code>c</code></li>
<li>Pull changes to remote: <code>p</code></li>
<li>Push changes to remote: <code>P</code></li>
</ul>
<h2 id="installation-4">Installation</h2>
<p>To install <code>lazygit</code> in Fedora I had to add its Copr repository</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo dnf copr <span class="nb">enable</span> atim/lazygit -y
</span></span><span class="line"><span class="cl">sudo dnf install lazygit
</span></span></code></pre></div><h1 id="theme-tokyo-night">Theme: Tokyo Night</h1>
<p>On kitty, Neovim, and tmux I am using the Tokyo Night theme. The theme configuration for all of them is available at <a href="https://github.com/folke/tokyonight.nvim" target="_blank">folke/tokyonight.nvim</a>.</p>
<p align="center"><img src="kitty-terminal.png" alt="Terminal"></p>
<p align="center"><small>Terminal</small></p>
<p align="center"><img src="tmux-window.png" alt="Terminal Multiplexer"></p>
<p align="center"><small>Terminal Multiplexer (tmux)</small></p>
<p align="center"><img src="neovim-window.png" alt="Text Editor"></p>
<p align="center"><small>Text Editor</small></p>
<p align="center"><img src="lazygit-project-window.png" alt="Source Control UI"></p>
<p align="center"><small>UI for Source Control</small></p>
<p>All of my configuration files are available at <a href="https://github.com/bovem/dotfiles">bovem/dotfiles</a>.</p>
<h1 id="resources">Resources</h1>
<p><a href="https://code.visualstudio.com/" target="_blank">Visual Studio Code</a><br>
<a href="https://github.com/VSCodeVim/Vim" target="_blank">VIM Plugin for VSCode</a><br>
<a href="https://obsidian.md/" target="_blank">Obsidian</a><br>
<a href="https://sw.kovidgoyal.net/kitty/" target="_blank">kitty terminal emulator</a><br>
<a href="https://www.zsh.org/" target="_blank">zsh</a><br>
<a href="https://ohmyz.sh/" target="_blank">oh-my-zsh</a><br>
<a href="https://www.jetbrains.com/lp/mono/" target="_blank">JetBrains Mono</a><br>
<a href="https://github.com/tmux/tmux/wiki" target="_blank">tmux</a><br>
<a href="https://github.com/tmux-plugins/tpm" target="_blank">tmux plugin manager</a><br>
<a href="https://github.com/tmux-plugins/tmux-sensible" target="_blank">tmux-sensible</a><br>
<a href="https://github.com/christoomey/vim-tmux-navigator" target="_blank">vim-tmux-navigator</a><br>
<a href="https://github.com/tmux-plugins/tmux-resurrect" target="_blank">tmux-resurrect</a><br>
<a href="https://github.com/jimeh/tmuxifier" target="_blank">tmuxifier</a><br>
<a href="https://github.com/tmux-plugins/tmux-yank" target="_blank">tmux-yank</a><br>
<a href="https://neovim.io/" target="_blank">Neovim</a><br>
<a href="https://www.lazyvim.org/installation" target="_blank">Lazyvim Installation Guide</a><br>
<a href="https://github.com/folke/tokyonight.nvim" target="_blank">folke/tokyonight.nvim</a></p>
]]></content:encoded>
    </item>
  </channel>
</rss>
