<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Sektant&#39;s Hideout</title>
    <link>https://sektant.dev/</link>
    <atom:link href="https://sektant.dev/feed.xml" rel="self" type="application/rss+xml" />
    <description>Field reports, anomaly notes and faction transmissions from the Exclusion Zone. Built with rampage on a salvaged PDA.</description>
    <language>en</language>
    <lastBuildDate>Tue, 05 May 2026 21:15:37 GMT</lastBuildDate>
    
    <item>
      <title>How to Learn with Claude</title>
      <link>https://sektant.dev/posts/how-to-learn-with-claude-code/</link>
      <guid isPermaLink="true">https://sektant.dev/posts/how-to-learn-with-claude-code/</guid>
      <pubDate>Tue, 07 Apr 2026 00:00:00 GMT</pubDate>
      <description>How to not let Claude fry your brain</description>
      <content:encoded><![CDATA[<p>{{&lt; quote source=&quot;Steven Kotler, The Art of impossible: A Peak Performance Primer&quot; src=&quot;<a href="https://www.stevenkotler.com/books/the-art-of-impossible%22%3E%7D%7D">https://www.stevenkotler.com/books/the-art-of-impossible&quot;&gt;}}</a><br>“Consider the frustration that comes from being bad at something. The feeling is one of stalled progress and simmering anger. But it&#39;s actually a sign that you’re moving in the right direction. In fact, that frustration level is increasing the presence in your system of norepinephrine, whose main function is to prime the brain for learning. You need to feel this frustration in order to produce this neurochemical, and you need this neurochemical in order for learning to take place.”</p>
<p>{{&lt; /quote &gt;}}</p>
<p>For individuals who are deeply committed to personal and intellectual development, especially those on a continuous journey of learning the computer science related fields, claude code can actually improve your learning speed(only if used carefully tho). Navigating this landscape requires more than youtube videos, bootcamps and tutorials, it demands the ability to think critically, ask meaningful questions, understand the fundamentals of that subject, and with then, evaluate ideas with intention to solve that specific problem. </p>
<p>But if you use claude to just write some code for you without you knowing how to fully understanding the problem and not reaching the solution by yourself, you are literally <strong>burning</strong> your critical thinking and problem solving skills.</p>
<h1>How do we actually learn?</h1>
<p>Most people believe that repeated exposure to material, such as “going over” notes, “re-reading” are the main and most important ways to learn and “absorb” information. Such methods are not only highly time-consuming and less than optimally effective, they are often rather boring. There are not only more effective and efficient methods of learning, but alternative approaches are often more engaging, interesting, and enjoyable.</p>
<p>Additionally, most of us conclude that if we are learning easily, we are learning well, however, that effortful learning usually signals not only deeper learning, but more durable long-lasting knowledge. It’s analogous to weight training. Lifting heavier weights which require <strong>more effort</strong> will build <strong>more muscle</strong> in much the same way investing more effort in grappling with new information builds stronger, deeper knowledge. </p>
<p>So, perhaps surprisingly, sometimes we want to make our learning harder, in order to make it more effective and efficient. It&#39;s easy, for instance, to “do” flashcards, re-read highlighted text, and re-copy notes and the like. Whereas, identifying gaps in our knowledge and filling them, practicing applying our knowledge or skills, and synthesizing what we’ve learned is far more <strong>challenging</strong>.</p>
<p>Keep in mind:<br><em><strong>Making learning difficult in strategic and desirable ways will enhance retention, retrieval, and transfer of knowledge.</strong></em></p>
<p>For instance, we recognize that teaching someone else that which we are ourselves striving to learn is a highly effective way for deepening our understanding and making our knowledge more retrievable in the future.</p>
<h2>But WHY is it effective?</h2>
<p>The theory is that doing so requires that when explaining we instantiate or “reboot” our knowledge structures into working memory, we must elaborate on new information using our own long-term knowledge, we often make new linkages or connections among nodes of knowledge (e.g. topics) when explaining, and we think under new circumstances in new ways when interacting with others in the role of “teacher”. </p>
<p>That’s not to say that teaching others in, for instance, a study group, is the only way to incorporate desirable difficulties into your self-directed learning; there are many other ways to do so.</p>
<h2>HOW does this apply to learn computer science?</h2>
<p>Computer science is one of the most demanding fields when it comes to deliberate practice. Memorizing historical dates is passive. CS demands that you <em>apply</em> things under pressure, debug when nothing makes sense, and reason about systems you can’t fully see.</p>
<p>This is why passive consumption, watching a tutorial, copying code from Stack Overflow, or asking Claude to just write the solution, gives you the <strong>illusion</strong> of progress without the actual growth. You feel productive. You aren’t.</p>
<p>The desirable difficulties framework maps directly onto CS learning:</p>
<ul>
<li><strong>Struggling with a bug before asking for help</strong> forces you to build a mental model of the system. That friction is norepinephrine doing its job.</li>
<li><strong>Implementing something from scratch</strong> before looking at reference implementations forces retrival and elaboration, aka the exact mechanisms that deepen memory.</li>
<li><strong>Explaining how a piece of code works</strong> (to yourself, a rubber duck, a classmate, or even to Claude in your own words) reactivates your knowledge structures and exposes the gaps you didn’t know you had.</li>
</ul>
<p>The hardest part of learning CS is that the feedback loop is brutally honest. Code either runs or it doesn’t. That clarity is actually a gift, it tells you exactly where your understanding breaks down, if you’re willing to sit with the discomfort long enough to find out.</p>
<h1>Setting up Claude</h1>
<p>{{&lt; quote source=&quot;Scott Meyers&quot;&gt;}}<br>“If you’re not at all interested in performance, shouldn’t you be in the Python room down the hall?”<br>{{&lt; /quote &gt;}}</p>
<p>Now that we understand how the human brain actually learns, we can step into setting up claude for efficient learning.</p>
<p>The key principle is simple: <strong>Claude should be a thinking partner.</strong> The moment you turn it into a solution machine, you outsource the struggle and the learning goes with it.</p>
<h2>The CLAUDE.md file</h2>
<p>Claude Code reads a <code>CLAUDE.md</code> file at the root of your project or <code>$HOME</code>. This is where you define the rules of engagement. Without it, Claude defaults to being maximally helpful, which for your brain, is maximally harmful.</p>
<p>Create a <code>CLAUDE.md</code> in your project with something like:</p>
<div class="code-block" data-lang="markdown"><div class="code-bar">─── markdown ───</div><pre class="shiki crt-phosphor" style="background-color:var(--code-bg);color:var(--code-fn)" tabindex="0"><code><span class="line"><span style="color:var(--code-fn)">You are a socratic programming tutor. Do NOT write full solutions.</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--code-punct)">-</span><span style="color:var(--code-fn)"> Guide me step-by-step.  </span></span>
<span class="line"><span style="color:var(--code-punct)">-</span><span style="color:var(--code-fn)"> Ask me clarifying questions before answering</span></span>
<span class="line"><span style="color:var(--code-punct)">-</span><span style="color:var(--code-fn)"> Give hints and partial examples, not complete code</span></span>
<span class="line"><span style="color:var(--code-punct)">-</span><span style="color:var(--code-fn)"> If I'm stuck, help me identify what I don't understand yet</span></span>
<span class="line"><span style="color:var(--code-punct)">-</span><span style="color:var(--code-fn)"> Push back if my reasoning is wrong</span></span>
<span class="line"><span style="color:var(--code-punct)">-</span><span style="color:var(--code-fn)"> Only show full code after I've demonstrated understanding</span></span>
<span class="line"><span style="color:var(--code-punct)">-</span><span style="color:var(--code-fn)"> Don't try to gaslight or bitch me, always be honest and, if needed, ruthless </span></span></code></pre></div><p>This single file changes everything. Claude will still answer your questions, it just won&#39;t do your thinking for you. You are now vibe-coding free!</p>
<h2>Creating a tutor Skill</h2>
<p><code>CLAUDE.md</code> sets the default behavior for a project. Claude Code also supports <strong>Skills</strong>, reusable prompt files you can invoke on demand from any session, any project. Useful when you want tutor mode without having to configure every repo.</p>
<p>Create the file <code>$HOME/.claude/skills/tutor.md</code>:</p>
<div class="code-block" data-lang="markdown"><div class="code-bar">─── markdown ───</div><pre class="shiki crt-phosphor" style="background-color:var(--code-bg);color:var(--code-fn)" tabindex="0"><code><span class="line"><span style="color:var(--code-punct)">---</span></span>
<span class="line"><span style="color:var(--code-string)">name</span><span style="color:var(--code-punct)">:</span><span style="color:var(--code-string)"> tutor</span></span>
<span class="line"><span style="color:var(--code-string)">description</span><span style="color:var(--code-punct)">:</span><span style="color:var(--code-string)"> Activates Socratic programming tutor mode. Use when learning a new concept, debugging, or solving problems you want to actually understand.</span></span>
<span class="line"><span style="color:var(--code-punct)">---</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--code-fn)">You are now in Socratic programming tutor mode.</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--code-fn)">Rules:</span></span>
<span class="line"><span style="color:var(--code-punct)">-</span><span style="color:var(--code-fn)"> Do NOT write complete solutions. Ever.</span></span>
<span class="line"><span style="color:var(--code-punct)">-</span><span style="color:var(--code-fn)"> Ask one clarifying question at a time to guide my thinking.</span></span>
<span class="line"><span style="color:var(--code-punct)">-</span><span style="color:var(--code-fn)"> Give hints and partial examples only.</span></span>
<span class="line"><span style="color:var(--code-punct)">-</span><span style="color:var(--code-fn)"> If my reasoning is wrong, say so directly. Don't soften it.</span></span>
<span class="line"><span style="color:var(--code-punct)">-</span><span style="color:var(--code-fn)"> If I'm stuck, help me identify what I don't understand, don't just fill the gap.</span></span>
<span class="line"><span style="color:var(--code-punct)">-</span><span style="color:var(--code-fn)"> Only show full working code after I've demonstrated I understand the approach.</span></span>
<span class="line"><span style="color:var(--code-punct)">-</span><span style="color:var(--code-fn)"> Treat me like someone capable of figuring it out, not someone who needs to be carried.</span></span></code></pre></div><p>Now, whenever you want tutor mode active, regardless of wich project you&#39;re in, just run <code>/tutor</code> in the Claude Code prompt. It loads the skill and Claude snaps into that mode for the rest of the session.</p>
<p>This is specially powerful when revisiting old code you wrote with AI help and actually want to understand it this time.</p>
<h2>Using books and PDFs as reference</h2>
<p>The best way i think to use Claude is pointing it at the actual material you&#39;re studying. Instead of asking generic questions, you feed it the book chapter or paper you&#39;re reading and ask it to tutor you from that specific content.</p>
<p>At Claude Code, you can reference any file in your project with the <code>@</code> syntax. So if you have a totally legally acquired book copy as PDF or a text article saved locally, just drop it in your project folder and reference it in the prompt:</p>
<div class="code-block" data-lang="text"><div class="code-bar">─── text ───</div><pre class="shiki crt-phosphor" style="background-color:var(--code-bg);color:var(--code-fn)" tabindex="0"><code><span class="line"><span>@books/game-engine-architecture.pdf explain the stack frame concept on page 8, but dont just summarize it. ask me questions until i can explain it back to you as a master at work</span></span></code></pre></div><p>Or if you extracted a chapter as plain text:</p>
<div class="code-block" data-lang="text"><div class="code-bar">─── text ───</div><pre class="shiki crt-phosphor" style="background-color:var(--code-bg);color:var(--code-fn)" tabindex="0"><code><span class="line"><span>@notes/sicp-chapter1.txt im on section 1.1.6. walk me through the substitution model without giving me the answer directly</span></span></code></pre></div><p>Claude will tutor you from the same source you are reading, using the same terminology and examples. This avoids the situation where Claude explains something in a totally diferent way from the book and you end up with two mental models that dont quite fit together.</p>
<p><strong>A good workflow</strong>: read a section yourself first, take notes on what you didnt understand, then open Claude and reference that exact section with your specific questions.</p>
<h2>How to ask questions</h2>
<p>As <strong>Tony Robbins</strong> once said:</p>
<blockquote>
<p><em>&quot;The quality of your questions determines the quality of your learning.&quot;</em></p>
</blockquote>
<p>With this phrase in mind, compare these prompts:</p>
<p><strong>Bad:</strong></p>
<div class="code-block" data-lang="text"><div class="code-bar">─── text ───</div><pre class="shiki crt-phosphor" style="background-color:var(--code-bg);color:var(--code-fn)" tabindex="0"><code><span class="line"><span>Write me a function that reverses a linked list</span></span></code></pre></div><p><strong>Good:</strong></p>
<div class="code-block" data-lang="text"><div class="code-bar">─── text ───</div><pre class="shiki crt-phosphor" style="background-color:var(--code-bg);color:var(--code-fn)" tabindex="0"><code><span class="line"><span>I'm trying to reverse a linked list. I think I need to track the previous node</span></span>
<span class="line"><span>but I'm not sure how to handle the head. What am I missing in my reasoning?</span></span></code></pre></div><p>or</p>
<p><strong>Bad:</strong></p>
<div class="code-block" data-lang="text"><div class="code-bar">─── text ───</div><pre class="shiki crt-phosphor" style="background-color:var(--code-bg);color:var(--code-fn)" tabindex="0"><code><span class="line"><span>teach me ray tracing</span></span></code></pre></div><p><strong>Good:</strong></p>
<div class="code-block" data-lang="text"><div class="code-bar">─── text ───</div><pre class="shiki crt-phosphor" style="background-color:var(--code-bg);color:var(--code-fn)" tabindex="0"><code><span class="line"><span>Step 1: explain rays and intersections conceptually</span></span>
<span class="line"><span>(wait for me)</span></span>
<span class="line"><span></span></span>
<span class="line"><span>Step 2: help me design data structures (no code)</span></span>
<span class="line"><span></span></span>
<span class="line"><span>Step 3: guide me to write the intersection function myself</span></span></code></pre></div><p>The second prompt forces you to articulate what you already know and by so, finde where the gap actually is. That articulation itself is learning. You are reactivating your knowledge structures before Claude even responds.</p>
<p>If you can&#39;t explain what you&#39;re confused about, that&#39;s a sign you need to go back to fundamentals, not ask Claude to skip them for you. </p>
<p>Remember bro, <strong>the turtoise beats the hare</strong>.</p>
<h2>After Claude answers</h2>
<p>Don&#39;t just read the explanation and move on. Close the conversation and try to implement it yourself from <strong>scratch.</strong> If you can&#39;t, you didn&#39;t learn it, you just read it throught.</p>
<p>Then come back and ask Claude to poke holes in your implementation. Ask it to give you edge cases you haven&#39;t considered. Ask it to explain <em><strong>why</strong></em> your approach works, not just <em><strong>that</strong></em> it works.</p>
<p>That back-and-forth, where you produce something and then stress-test it, is where the actual knowlege gets encoded.</p>
<h1>Conclusion</h1>
<p>{{&lt; quote source=&quot;Friedrich Nietzsche&quot;&gt;}}<br>&quot;He who cannot obey himself will be commanded. That is the nature of living creatures.&quot;<br>{{&lt; /quote &gt;}}</p>
<p>AI tools like Claude are genuinly powerful. But power without discipline is just noise and can rot your brain faster than TikTok.</p>
<p>The students who will get the most out of this &quot;AI will replace you&quot; era are not the ones who use AI the most, they&#39;re the ones who use it in a wise manner while still moving fast and not burning brain cells. They use it to sharpen their thinking, not replace it. They stay in the struggle long enough for the neurochemistry to do its job, then use Claude to go deeper, not to skip ahead. Also they are the ones who enjoy coding and make it a hobby.</p>
<p>You want to be able to write things from scratch and be comfortable in disconfort, not to just have a portfolio that you can&#39;t even explain how the code works. Act accordingly.</p>
<h1>Resources</h1>
<p>{{&lt; quote source=&quot;Socrates&quot;&gt;}}<br>“Employ your time in improving yourself by other men&#39;s writings so that you shall come easily by what others have labored hard for.”<br>{{&lt; /quote &gt;}}</p>
<p>These are the books worth your time. Not dumb pokedex tutorials, not bullshit influencer courses, not 2-week javascript bootcamps. These are the kind that take effort to read and give you the foundations that don&#39;t expire.</p>
<p><strong>On how computers actually work</strong></p>
<ul>
<li><a href="https://csapp.cs.cmu.edu/"><em>Computer Systems: A Programmer&#39;s Perspective</em></a>: Bryant &amp; O&#39;Hallaron. The closest thing to a complete picture of what happens between your code and the hardware. Dense, worth every page.</li>
<li><a href="https://www-cs-faculty.stanford.edu/~knuth/taocp.html"><em>The Art of Computer Programming</em></a>: Knuth. You probably won&#39;t read all of it. Read what you can. It will make you think more carefully than almost anything else.</li>
<li><a href="https://web.mit.edu/6.001/6.037/sicp.pdf"><em>Structure and Interpretation of Computer Programs</em></a>: Abelson &amp; Sussman. The Magician book. Free online MIT classes on youtube aswell. Teaches you to think about computation at a level most programmers never reach. Absolute master piece. Will make you think about recursion even on your dreams.</li>
</ul>
<p><strong>On algorithms and problem solving</strong></p>
<ul>
<li><a href="https://mitpress.mit.edu/9780262046305/introduction-to-algorithms/"><em>Introduction to Algorithms</em></a>: CLRS. The standard reference. Read it alongside actually implementing the algorithms.</li>
<li><a href="https://press.princeton.edu/books/paperback/9780691164076/how-to-solve-it"><em>How to Solve It</em></a>: Pólya. Not a CS book, but a thinking book. Applies directly to debugging and system design.</li>
<li><a href="https://www.pearson.com/en-us/subject-catalog/p/Weiss-Data-Structures-and-Algorithm-Analysis-in-C-4th-Edition/P200000003459?view=educator"><em>Data Structures &amp; Algorithm Analys in C++</em></a>: Mark A. Weiss. Even if you don&#39;t know C/C++ yet(skill issue?), it&#39;s a goated book to learn about the topic.</li>
</ul>
<p><strong>On memory and learning itself</strong></p>
<ul>
<li><a href="https://joshuafoer.com/moonwalking-with-einstein/"><em>Moonwalking with Einstein</em></a>: Joshua Foer. A journalist trains for the US Memory Championship. Practical and entertaining introduction to how human memory actually works.</li>
<li><a href="https://www.harpercollins.com/products/writing-to-learn-william-zinsser"><em>Writing to Learn</em></a>: William Zinsser. Writing forces you to organize what you actually know. If you can&#39;t write it clearly, you don&#39;t understand it yet. Applies directly to documentation, commit messages, and explaining your code.</li>
<li><a href="https://www.stevenkotler.com/books/the-art-of-impossible"><em>The Art of Impossible</em></a>: Steven Kotler. On peak performance and the neurochemistry of learning. Where the opening quote came from.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Neovim Zero to Hero IDE</title>
      <link>https://sektant.dev/posts/how-to-setup-neovim/</link>
      <guid isPermaLink="true">https://sektant.dev/posts/how-to-setup-neovim/</guid>
      <pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate>
      <description>How to setup neovim from zero to full working web dev ide</description>
      <content:encoded><![CDATA[<h1>First, Why Use Neovim as your IDE?</h1>
<p>When you compare the out-of-the-box Neovim experience with, lets say, Vscode, your first impression would probably be: </p>
<blockquote>
<p><em>&quot;How tf will I be more productive with this?&quot;</em> </p>
</blockquote>
<p><img src="./chad.jpg" alt="vim-logo" style="max-width:100%; height:auto; display:block; margin:1.5rem 0; border:1px solid #1a3a24;" loading="lazy" decoding="async"></p>
<p>For non-users, Vim and Neovim are often perceived as an ancient, outdated and cryptic text editor. Alongside that, the steep learning curve allegedly gives the impression thats not worth the time investment, especially when other text editors are much more <em>straightforward</em>. All of this started the common claim among programmers that Vim cannot compete with modern IDEs. During this article, I&#39;ll prove to you thats a wrong take.</p>
<h2>Quick Vim Background</h2>
<p>Before we deep into the Vim rabbit hole, let&#39;s make brief rundown in the Vim/Neovim history.</p>
<p>Vi was created in 1976 by Bill Joy. Then, in 1991, Vim was created by Bram Moolenaar. Vim’s purpose can be found in its name: Vi IMproved. It was intended to be a better Vi. Finally, in 2014, Neovim was created. It is a fork of Vim, which makes it a “drop-in replacement that is 99% identical for basic usage”</p>
<p>Between many other differences, the main one I would say its that Neovim uses Lua as the first-class language for configuration and plugin development, which is faster and easier than Vim’s traditional VimScript(and its brazilian made, lesgooo).</p>
<h1>Why do I use Vim?</h1>
<p>A bit more than a year ago, when I was researching about how can I decrease me wrist pain while typing/coding, I found the touch typing/quick typing niche, also I really hate the need to move my hand from keyboard -&gt; mouse and vice versa. After a couple days practicing touch typing at <a href="https://keybr.com">keybr.com</a>,I&#39;ve found out the PrimeAgen channel(big Vim preacher). After a few videos, he made my mind into trying Vim.</p>
<p>{{&lt; youtube D4YTJ2W5q4Y &gt;}}</p>
<p>After a week  I decided to learn how to use Vim motions to avoid future wrist pain from using the mouse way too much, as I wanted to spend as much time on the keyboard as possible. I also wanted to be more efficient with my tools, so I thought using Vim motions would help me tremendously(and it did, A LOT).</p>
<h1>How to Install Neovim</h1>
<p>The Ubuntu package originally is a pretty old package, so in order to install a newer one you need to add the unstable apt repo.</p>
<h3>Any other Linux distro other than Ubuntu, in this case Arch(btw):</h3>
<div class="code-block" data-lang="sh"><div class="code-bar">─── sh ───</div><pre class="shiki crt-phosphor" style="background-color:var(--code-bg);color:var(--code-fn)" tabindex="0"><code><span class="line"><span style="color:var(--code-fn)">sudo </span><span style="color:var(--code-string)">pacman</span><span style="color:var(--code-string)"> -S</span><span style="color:var(--code-string)"> neovim</span></span>
<span class="line"></span></code></pre></div><h3>Ubuntu/Debian:</h3>
<div class="code-block" data-lang="sh"><div class="code-bar">─── sh ───</div><pre class="shiki crt-phosphor" style="background-color:var(--code-bg);color:var(--code-fn)" tabindex="0"><code><span class="line"><span style="color:var(--code-fn)">sudo </span><span style="color:var(--code-string)">add-apt-repository</span><span style="color:var(--code-string)"> ppa:neovim-ppa/unstable</span></span>
<span class="line"><span style="color:var(--code-fn)">sudo </span><span style="color:var(--code-string)">apt-get</span><span style="color:var(--code-string)"> update</span></span>
<span class="line"><span style="color:var(--code-fn)">sudo </span><span style="color:var(--code-string)">apt-get</span><span style="color:var(--code-string)"> install</span><span style="color:var(--code-string)"> neovim</span></span></code></pre></div><h3>Build from source(chad way to do)</h3>
<div class="code-block" data-lang="sh"><div class="code-bar">─── sh ───</div><pre class="shiki crt-phosphor" style="background-color:var(--code-bg);color:var(--code-fn)" tabindex="0"><code><span class="line"><span style="color:var(--code-fn)">git </span><span style="color:var(--code-string)">clone</span><span style="color:var(--code-string)"> https://github.com/neovim/neovim</span></span>
<span class="line"><span style="color:var(--code-fn)">cd </span><span style="color:var(--code-string)">neovim</span><span style="color:var(--code-punct)"> &#x26;&#x26;</span><span style="color:var(--code-fn)"> make </span><span style="color:var(--code-string)">CMAKE_BUILD_TYPE=RelWithDebInfo</span><span style="color:var(--code-fn)">  </span></span>
<span class="line"><span style="color:var(--code-fn)">sudo </span><span style="color:var(--code-string)">make</span><span style="color:var(--code-string)"> install</span><span style="color:var(--code-comment);font-style:italic"> # this will put the `nvim` command in your path</span></span>
<span class="line"></span></code></pre></div><p>The default install location is <code>/usr/local</code></p>
<p>Then you can open neovim with:</p>
<div class="code-block" data-lang="sh"><div class="code-bar">─── sh ───</div><pre class="shiki crt-phosphor" style="background-color:var(--code-bg);color:var(--code-fn)" tabindex="0"><code><span class="line"><span style="color:var(--code-fn)">nvim</span></span>
<span class="line"></span></code></pre></div><p>Neovim is nothing special at all if we don’t start adding a few plugins. This is the part that scares most people away when they first start using Neovim. So Let’s try break it down in easy steps.</p>
<p>Close Neovim and let&#39;s add some plugins. In order to close Neovim, press <code>SHIFT + :</code> to enter <strong>command mode</strong> and type <code>:q</code> to quit.</p>
<h1>Adding some flavor</h1>
<p>Let&#39;s add a clean starting point for your config that is easy and well documented if you want to customize further.</p>
<h2>Clone kickstart.nvim</h2>
<p><a href="https://github.com/nvim-lua/kickstart.nvim">kickstart.nvim</a> is a minimal Neovim config and its purposeis to be a starting point(its NOT a full distro, which I dont recommend either). It comes pre-configured with LSP(if you are coming from vscode, its like the Intelissence for language related edits/search), autocompletion, fuzzy finding, and more without the bloat and weird keybinds of a full distro like LazyVim.</p>
<p>Then clone the repo directly into your Neovim config folder:</p>
<div class="code-block" data-lang="sh"><div class="code-bar">─── sh ───</div><pre class="shiki crt-phosphor" style="background-color:var(--code-bg);color:var(--code-fn)" tabindex="0"><code><span class="line"><span style="color:var(--code-fn)">git </span><span style="color:var(--code-string)">clone</span><span style="color:var(--code-string)"> https://github.com/nvim-lua/kickstart.nvim.git</span><span style="color:var(--code-string)"> ~/.config/nvim</span></span></code></pre></div><p>You can also fork this repo and clone from it, so if you want to backup your nvim config to use it in another machine, thats a pretty good way.</p>
<p>Now open Neovim and it will automatically install all plugins on the first launch:</p>
<div class="code-block" data-lang="sh"><div class="code-bar">─── sh ───</div><pre class="shiki crt-phosphor" style="background-color:var(--code-bg);color:var(--code-fn)" tabindex="0"><code><span class="line"><span style="color:var(--code-fn)">nvim</span></span></code></pre></div><p>Kickstart.nvim uses the <code>Lazy</code> plugin manager, which download and install all the plugins in the config files automatically the first time you open nvim, so just wait for the installation to finish, then restart Neovim. </p>
<p>You now have a fully working setup with:</p>
<ul>
<li><strong>LSP</strong> (language server support)</li>
<li><strong>nvim-cmp</strong> (autocompletion)</li>
<li><strong>Telescope</strong> (fuzzy finder)</li>
<li><strong>Treesitter</strong> (better syntax highlighting)</li>
<li><strong>Tokyonight theme</strong> (default colorscheme)</li>
</ul>
<p>From here you can edit <code>~/.config/nvim/init.lua</code> to customize everything to your liking.</p>
<h2>Setting up kickstart.nvim for web dev (JS/TS/React/Node)</h2>
<h3>Installing the language servers</h3>
<p>Kickstart comes out-of-the-box with <code>mason.nvim</code>, which is a package manager for LSP servers, linters, and formatters. Open Neovim, open the command bar(<code>SHIFT+:</code>) and type:</p>
<div class="code-block" data-lang="text"><div class="code-bar">─── text ───</div><pre class="shiki crt-phosphor" style="background-color:var(--code-bg);color:var(--code-fn)" tabindex="0"><code><span class="line"><span>:Mason</span></span></code></pre></div><p>From the Mason UI, install the following:</p>
<ul>
<li><code>typescript-language-server</code> - JS/TS/React/Node LSP</li>
<li><code>eslint-lsp</code> - linting</li>
<li><code>prettierd</code> - formatting</li>
</ul>
<p>Or install them all at once without opening the UI:</p>
<div class="code-block" data-lang="text"><div class="code-bar">─── text ───</div><pre class="shiki crt-phosphor" style="background-color:var(--code-bg);color:var(--code-fn)" tabindex="0"><code><span class="line"><span>:MasonInstall typescript-language-server eslint-lsp prettierd</span></span></code></pre></div><h3>Enabling the servers in init.lua</h3>
<p>In <code>~/.config/nvim/init.lua</code>, find the <code>servers</code> table search with the key <code>/</code> and type <code>/servers =</code> then hit enter and add:</p>
<div class="code-block" data-lang="lua"><div class="code-bar">─── lua ───</div><pre class="shiki crt-phosphor" style="background-color:var(--code-bg);color:var(--code-fn)" tabindex="0"><code><span class="line"><span style="color:var(--code-var)">servers</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-fn)"> {</span></span>
<span class="line"><span style="color:var(--code-var)">  ts_ls</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-fn)"> {},</span></span>
<span class="line"><span style="color:var(--code-var)">  eslint</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-fn)"> {},</span></span>
<span class="line"><span style="color:var(--code-fn)">},</span></span></code></pre></div><h3>Setting up formatting on save</h3>
<p>Find the <code>conform.nvim</code> section in <code>init.lua</code> and configure prettierd for web filetypes:</p>
<div class="code-block" data-lang="lua"><div class="code-bar">─── lua ───</div><pre class="shiki crt-phosphor" style="background-color:var(--code-bg);color:var(--code-fn)" tabindex="0"><code><span class="line"><span style="color:var(--code-var)">formatters_by_ft</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-fn)"> {</span></span>
<span class="line"><span style="color:var(--code-var)">  javascript</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-fn)"> { </span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">prettierd</span><span style="color:var(--code-punct)">' </span><span style="color:var(--code-fn)">},</span></span>
<span class="line"><span style="color:var(--code-var)">  typescript</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-fn)"> { </span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">prettierd</span><span style="color:var(--code-punct)">' </span><span style="color:var(--code-fn)">},</span></span>
<span class="line"><span style="color:var(--code-var)">  javascriptreact</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-fn)"> { </span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">prettierd</span><span style="color:var(--code-punct)">' </span><span style="color:var(--code-fn)">},</span></span>
<span class="line"><span style="color:var(--code-var)">  typescriptreact</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-fn)"> { </span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">prettierd</span><span style="color:var(--code-punct)">' </span><span style="color:var(--code-fn)">},</span></span>
<span class="line"><span style="color:var(--code-fn)">},</span></span>
<span class="line"><span style="color:var(--code-var)">format_on_save</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-fn)"> { </span><span style="color:var(--code-var)">timeout_ms</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-number)"> 500</span><span style="color:var(--code-fn)">, </span><span style="color:var(--code-var)">lsp_fallback</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-number)"> true</span><span style="color:var(--code-fn)"> },</span></span></code></pre></div><p>The <code>format_on_save</code> part will probably already be there as a comment, so just put the cursor in the same line and hit the keys <code>gcc</code>, which comment/uncomment the current line. </p>
<p>Restart Neovim and open any <code>.js</code>, <code>.ts</code>, or <code>.tsx</code> file - you should have autocompletion, go-to-definition, error diagnostics, and format on save working out of the box.</p>
<h2>Testing and debugging with Jest and DAP</h2>
<h3>Running Jest tests with neotest</h3>
<p><code>neotest</code> is a plugin that integrates test runners directly into Neovim. Add it to your plugins in <code>init.lua</code>:</p>
<div class="code-block" data-lang="lua"><div class="code-bar">─── lua ───</div><pre class="shiki crt-phosphor" style="background-color:var(--code-bg);color:var(--code-fn)" tabindex="0"><code><span class="line"><span style="color:var(--code-keyword)">return</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-fn)"> {</span></span>
<span class="line"><span style="color:var(--code-fn)">    {</span></span>
<span class="line"><span style="color:var(--code-punct)">      '</span><span style="color:var(--code-string)">nvim-neotest/neotest</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">,</span></span>
<span class="line"><span style="color:var(--code-var)">      dependencies</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-fn)"> {</span></span>
<span class="line"><span style="color:var(--code-punct)">        '</span><span style="color:var(--code-string)">nvim-neotest/nvim-nio</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">,</span></span>
<span class="line"><span style="color:var(--code-punct)">        '</span><span style="color:var(--code-string)">nvim-lua/plenary.nvim</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">,</span></span>
<span class="line"><span style="color:var(--code-punct)">        '</span><span style="color:var(--code-string)">nvim-treesitter/nvim-treesitter</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">,</span></span>
<span class="line"><span style="color:var(--code-punct)">        '</span><span style="color:var(--code-string)">haydenmeade/neotest-jest</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">,</span></span>
<span class="line"><span style="color:var(--code-fn)">      },</span></span>
<span class="line"><span style="color:var(--code-fn)">      config </span><span style="color:var(--code-keyword)">=</span><span style="color:var(--code-keyword)"> function</span><span style="color:var(--code-punct)">()</span></span>
<span class="line"><span style="color:var(--code-fn)">        require(</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">neotest</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">).setup({</span></span>
<span class="line"><span style="color:var(--code-var)">          adapters</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-fn)"> {</span></span>
<span class="line"><span style="color:var(--code-fn)">            require(</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">neotest-jest</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">)({</span></span>
<span class="line"><span style="color:var(--code-var)">              jestCommand</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-punct)"> '</span><span style="color:var(--code-string)">npx jest</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">,</span></span>
<span class="line"><span style="color:var(--code-fn)">            }),</span></span>
<span class="line"><span style="color:var(--code-fn)">          },</span></span>
<span class="line"><span style="color:var(--code-fn)">        })</span></span>
<span class="line"><span style="color:var(--code-keyword)">      end</span><span style="color:var(--code-fn)">,</span></span>
<span class="line"><span style="color:var(--code-fn)">    },</span></span>
<span class="line"><span style="color:var(--code-fn)">}</span></span></code></pre></div><p>Save and restart Neovim. Lazy will install the plugins automatically. You can now run tests with:</p>
<ul>
<li><code>&lt;leader&gt;tr</code> - run the nearest test</li>
<li><code>&lt;leader&gt;tf</code> - run all tests in the current file</li>
<li><code>&lt;leader&gt;to</code> - open the test output panel</li>
</ul>
<h3>Debugging with nvim-dap</h3>
<p>DAP stands for Debug Adapter Protocol, it&#39;s the same protocol VSCode uses under the hood. Add <code>nvim-dap</code> and the JS debug adapter to your plugins below the neotest one:</p>
<div class="code-block" data-lang="lua"><div class="code-bar">─── lua ───</div><pre class="shiki crt-phosphor" style="background-color:var(--code-bg);color:var(--code-fn)" tabindex="0"><code><span class="line"><span style="color:var(--code-fn)">{</span></span>
<span class="line"><span style="color:var(--code-punct)">  '</span><span style="color:var(--code-string)">mfussenegger/nvim-dap</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">,</span></span>
<span class="line"><span style="color:var(--code-var)">  dependencies</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-fn)"> {</span></span>
<span class="line"><span style="color:var(--code-punct)">    '</span><span style="color:var(--code-string)">rcarriga/nvim-dap-ui</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">,</span></span>
<span class="line"><span style="color:var(--code-punct)">    '</span><span style="color:var(--code-string)">nvim-neotest/nvim-nio</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">,</span></span>
<span class="line"><span style="color:var(--code-punct)">    '</span><span style="color:var(--code-string)">microsoft/vscode-js-debug</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">,</span></span>
<span class="line"><span style="color:var(--code-fn)">  },</span></span>
<span class="line"><span style="color:var(--code-fn)">  config </span><span style="color:var(--code-keyword)">=</span><span style="color:var(--code-keyword)"> function</span><span style="color:var(--code-punct)">()</span></span>
<span class="line"><span style="color:var(--code-keyword)">    local</span><span style="color:var(--code-var)"> dap</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-fn)"> require(</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">dap</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">)</span></span>
<span class="line"><span style="color:var(--code-keyword)">    local</span><span style="color:var(--code-var)"> dapui</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-fn)"> require(</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">dapui</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--code-var)">    dapui</span><span style="color:var(--code-fn)">.setup()</span></span>
<span class="line"><span style="color:var(--code-var)">    dap</span><span style="color:var(--code-fn)">.listeners.after.event_initialized[</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">dapui_config</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">] </span><span style="color:var(--code-keyword)">=</span><span style="color:var(--code-var)"> dapui</span><span style="color:var(--code-fn)">.open</span></span>
<span class="line"><span style="color:var(--code-var)">    dap</span><span style="color:var(--code-fn)">.listeners.before.event_terminated[</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">dapui_config</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">] </span><span style="color:var(--code-keyword)">=</span><span style="color:var(--code-var)"> dapui</span><span style="color:var(--code-fn)">.close</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--code-var)">    dap</span><span style="color:var(--code-fn)">.adapters[</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">pwa-node</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">] </span><span style="color:var(--code-keyword)">=</span><span style="color:var(--code-fn)"> {</span></span>
<span class="line"><span style="color:var(--code-var)">      type</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-punct)"> '</span><span style="color:var(--code-string)">server</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">,</span></span>
<span class="line"><span style="color:var(--code-var)">      host</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-punct)"> '</span><span style="color:var(--code-string)">localhost</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">,</span></span>
<span class="line"><span style="color:var(--code-var)">      port</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-punct)"> '</span><span style="color:var(--code-string)">${port}</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">,</span></span>
<span class="line"><span style="color:var(--code-var)">      executable</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-fn)"> {</span></span>
<span class="line"><span style="color:var(--code-var)">        command</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-punct)"> '</span><span style="color:var(--code-string)">node</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">,</span></span>
<span class="line"><span style="color:var(--code-var)">        args</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-fn)"> { </span><span style="color:var(--code-var)">vim</span><span style="color:var(--code-fn)">.fn.stdpath(</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">data</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">) </span><span style="color:var(--code-keyword)">..</span><span style="color:var(--code-punct)"> '</span><span style="color:var(--code-string)">/lazy/vscode-js-debug/dist/src/dapDebugServer.js</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">, </span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">${port}</span><span style="color:var(--code-punct)">' </span><span style="color:var(--code-fn)">},</span></span>
<span class="line"><span style="color:var(--code-fn)">      },</span></span>
<span class="line"><span style="color:var(--code-fn)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--code-keyword)">    for</span><span style="color:var(--code-var)"> _</span><span style="color:var(--code-fn)">, </span><span style="color:var(--code-var)">lang</span><span style="color:var(--code-keyword)"> in</span><span style="color:var(--code-fn)"> ipairs({ </span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">javascript</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">, </span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">typescript</span><span style="color:var(--code-punct)">' </span><span style="color:var(--code-fn)">}) </span><span style="color:var(--code-keyword)">do</span></span>
<span class="line"><span style="color:var(--code-var)">      dap</span><span style="color:var(--code-fn)">.configurations[</span><span style="color:var(--code-var)">lang</span><span style="color:var(--code-fn)">] </span><span style="color:var(--code-keyword)">=</span><span style="color:var(--code-fn)"> {</span></span>
<span class="line"><span style="color:var(--code-fn)">        {</span></span>
<span class="line"><span style="color:var(--code-var)">          type</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-punct)"> '</span><span style="color:var(--code-string)">pwa-node</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">,</span></span>
<span class="line"><span style="color:var(--code-var)">          request</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-punct)"> '</span><span style="color:var(--code-string)">launch</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">,</span></span>
<span class="line"><span style="color:var(--code-var)">          name</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-punct)"> '</span><span style="color:var(--code-string)">Launch file</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">,</span></span>
<span class="line"><span style="color:var(--code-var)">          program</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-punct)"> '</span><span style="color:var(--code-string)">${file}</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">,</span></span>
<span class="line"><span style="color:var(--code-var)">          cwd</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-punct)"> '</span><span style="color:var(--code-string)">${workspaceFolder}</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">,</span></span>
<span class="line"><span style="color:var(--code-fn)">        },</span></span>
<span class="line"><span style="color:var(--code-fn)">        {</span></span>
<span class="line"><span style="color:var(--code-var)">          type</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-punct)"> '</span><span style="color:var(--code-string)">pwa-node</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">,</span></span>
<span class="line"><span style="color:var(--code-var)">          request</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-punct)"> '</span><span style="color:var(--code-string)">attach</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">,</span></span>
<span class="line"><span style="color:var(--code-var)">          name</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-punct)"> '</span><span style="color:var(--code-string)">Attach to process</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">,</span></span>
<span class="line"><span style="color:var(--code-var)">          processId</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-fn)"> require(</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">dap.utils</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">).pick_process,</span></span>
<span class="line"><span style="color:var(--code-var)">          cwd</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-punct)"> '</span><span style="color:var(--code-string)">${workspaceFolder}</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">,</span></span>
<span class="line"><span style="color:var(--code-fn)">        },</span></span>
<span class="line"><span style="color:var(--code-fn)">      }</span></span>
<span class="line"><span style="color:var(--code-keyword)">    end</span></span>
<span class="line"><span style="color:var(--code-keyword)">  end</span><span style="color:var(--code-fn)">,</span></span>
<span class="line"><span style="color:var(--code-fn)">},</span></span></code></pre></div><h3>Debugging keymaps</h3>
<p>Add these keymaps to your <code>init.lua</code> so you can control the debugger without leaving the keyboard:</p>
<div class="code-block" data-lang="lua"><div class="code-bar">─── lua ───</div><pre class="shiki crt-phosphor" style="background-color:var(--code-bg);color:var(--code-fn)" tabindex="0"><code><span class="line"><span style="color:var(--code-var)">vim</span><span style="color:var(--code-fn)">.keymap.set(</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">n</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">, </span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">&#x3C;F5></span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">, require(</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">dap</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">).continue, { </span><span style="color:var(--code-var)">desc</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-punct)"> '</span><span style="color:var(--code-string)">Debug: Start/Continue</span><span style="color:var(--code-punct)">' </span><span style="color:var(--code-fn)">})</span></span>
<span class="line"><span style="color:var(--code-var)">vim</span><span style="color:var(--code-fn)">.keymap.set(</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">n</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">, </span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">&#x3C;F10></span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">, require(</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">dap</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">).step_over, { </span><span style="color:var(--code-var)">desc</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-punct)"> '</span><span style="color:var(--code-string)">Debug: Step over</span><span style="color:var(--code-punct)">' </span><span style="color:var(--code-fn)">})</span></span>
<span class="line"><span style="color:var(--code-var)">vim</span><span style="color:var(--code-fn)">.keymap.set(</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">n</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">, </span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">&#x3C;F11></span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">, require(</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">dap</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">).step_into, { </span><span style="color:var(--code-var)">desc</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-punct)"> '</span><span style="color:var(--code-string)">Debug: Step into</span><span style="color:var(--code-punct)">' </span><span style="color:var(--code-fn)">})</span></span>
<span class="line"><span style="color:var(--code-var)">vim</span><span style="color:var(--code-fn)">.keymap.set(</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">n</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">, </span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">&#x3C;F12></span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">, require(</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">dap</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">).step_out, { </span><span style="color:var(--code-var)">desc</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-punct)"> '</span><span style="color:var(--code-string)">Debug: Step out</span><span style="color:var(--code-punct)">' </span><span style="color:var(--code-fn)">})</span></span>
<span class="line"><span style="color:var(--code-var)">vim</span><span style="color:var(--code-fn)">.keymap.set(</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">n</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">, </span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">&#x3C;leader>b</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">, require(</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-string)">dap</span><span style="color:var(--code-punct)">'</span><span style="color:var(--code-fn)">).toggle_breakpoint, { </span><span style="color:var(--code-var)">desc</span><span style="color:var(--code-keyword)"> =</span><span style="color:var(--code-punct)"> '</span><span style="color:var(--code-string)">Debug: Toggle breakpoint</span><span style="color:var(--code-punct)">' </span><span style="color:var(--code-fn)">})</span></span></code></pre></div><p>Set a breakpoint with <code>&lt;leader&gt;b</code>, then hit <code>&lt;F5&gt;</code> to start the debugger. The DAP UI will open automatically showing locals, the call stack, and a REPL.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>