<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Anurag Pramanik</title>
    <description>The latest articles on DEV Community by Anurag Pramanik (@anurag_pramanik).</description>
    <link>https://dev.to/anurag_pramanik</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F909183%2F27e666da-2862-40a3-9f79-b3311e43c0d4.jpg</url>
      <title>DEV Community: Anurag Pramanik</title>
      <link>https://dev.to/anurag_pramanik</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/anurag_pramanik"/>
    <language>en</language>
    <item>
      <title>How to Enable Undercurl in Neovim: Terminal and Tmux Setup Guide</title>
      <dc:creator>Anurag Pramanik</dc:creator>
      <pubDate>Tue, 14 Jan 2025 08:53:09 +0000</pubDate>
      <link>https://dev.to/anurag_pramanik/how-to-enable-undercurl-in-neovim-terminal-and-tmux-setup-guide-2ld7</link>
      <guid>https://dev.to/anurag_pramanik/how-to-enable-undercurl-in-neovim-terminal-and-tmux-setup-guide-2ld7</guid>
      <description>&lt;p&gt;If you're using &lt;a href="https://neovim.io/" rel="noopener noreferrer"&gt;Neovim&lt;/a&gt; as your default code editor or IDE, you've likely encountered the concept of &lt;strong&gt;undercurl&lt;/strong&gt;. But what exactly is undercurl? Let's dive in!&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Undercurl?
&lt;/h2&gt;

&lt;p&gt;Think of the red squiggly lines you see in &lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;VS Code&lt;/a&gt; to highlight code errors or typos:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft1reqxq3801lol4n46q7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft1reqxq3801lol4n46q7.png" alt="vscode errors" width="800" height="209"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Undercurl&lt;/strong&gt; brings that same functionality to your terminal-based Neovim setup. It's a visual cue for spelling or code errors—right inside your terminal.&lt;/p&gt;




&lt;h2&gt;
  
  
  Setting Up Undercurl in Neovim (Terminal)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Use a True Color Terminal
&lt;/h3&gt;

&lt;p&gt;To enable undercurl, you'll need a &lt;strong&gt;True Color Terminal&lt;/strong&gt;, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://iterm2.com/" rel="noopener noreferrer"&gt;iTerm2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://alacritty.org/" rel="noopener noreferrer"&gt;Alacritty&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ghostty.org/" rel="noopener noreferrer"&gt;Ghostty&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft/terminal" rel="noopener noreferrer"&gt;Windows Terminal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To check if your terminal supports undercurl, run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\e&lt;/span&gt;&lt;span class="s2"&gt;[4:3mThis text has an undercurl&lt;/span&gt;&lt;span class="se"&gt;\e&lt;/span&gt;&lt;span class="s2"&gt;[0m"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your terminal supports undercurl, you'll see the text undercurled.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1xiyd0d41i2pova57ktk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1xiyd0d41i2pova57ktk.png" alt="undercurl on terminal" width="612" height="107"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 2: Enable Undercurl in Neovim
&lt;/h3&gt;

&lt;p&gt;Add the following lines to your Neovim configuration (&lt;code&gt;options.lua&lt;/code&gt; or &lt;code&gt;init.vim&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Undercurl&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;[[let &amp;amp;t_Cs = "\e[4:3m"]]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;[[let &amp;amp;t_Ce = "\e[4:0m"]]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;-- Enable spell check&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spell&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spelllang&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"en_us"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This setup enables undercurl for spelling errors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't forget to reload neovim after config changes above.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can see below the word &lt;code&gt;undercurl&lt;/code&gt; is undercurled.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fny1otjlejeb5yfnld240.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fny1otjlejeb5yfnld240.png" alt="undercurl neovim terminal" width="800" height="224"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 3: Configure Terminal for Undercurl
&lt;/h3&gt;

&lt;p&gt;If undercurl still doesn’t work, follow these steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Identify Your Terminal&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run &lt;code&gt;echo $TERM&lt;/code&gt; to find your terminal type (e.g., &lt;code&gt;xterm-256color&lt;/code&gt; or &lt;code&gt;xterm-ghostty&lt;/code&gt; depending on your terminal).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Check for Smulx Support&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;infocmp &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;Smulx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it produces no output, proceed.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Generate a Terminfo File&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;infocmp &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /tmp/&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TERM&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;.ti
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;${TERM}&lt;/code&gt; with your terminal type (e.g., &lt;code&gt;xterm-256color&lt;/code&gt;).&lt;br&gt;
Here in this case&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;infocmp &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /tmp/xterm-256color.ti
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Edit the Terminfo File&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open &lt;code&gt;/tmp/${TERM}.ti&lt;/code&gt; in your editor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvim /tmp/xterm-256color.ti
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the following line after &lt;code&gt;smul=\E[4m,&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Smulx=\E[4:%p1%dm,
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8quaddk4zvcc3uucx7gg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8quaddk4zvcc3uucx7gg.png" alt="Smulx entry" width="800" height="126"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reload the Terminfo&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tic &lt;span class="nt"&gt;-x&lt;/span&gt; /tmp/&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TERM&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;.ti
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;${TERM}&lt;/code&gt; with your terminal type which is the output from &lt;code&gt;echo $TERM&lt;/code&gt;. Here in this case&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tic &lt;span class="nt"&gt;-x&lt;/span&gt; /tmp/xterm-256color.ti
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Verify Smulx Support&lt;/strong&gt;
Run:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;infocmp &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;Smulx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should now see output confirming &lt;code&gt;Smulx&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh1w0vpwqhh2uitbjy602.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh1w0vpwqhh2uitbjy602.png" alt="infocmp entry" width="511" height="105"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open Neovim and enjoy undercurl support for spelling and code errors.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ijjpon8jnzetk17fk34.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ijjpon8jnzetk17fk34.png" alt="neovim with undercurl from terminal" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;BTW, if you love my &lt;code&gt;neovim&lt;/code&gt; and &lt;code&gt;tmux&lt;/code&gt; setup above, do check my &lt;a href="https://github.com/apicgg/dotfiles-public" rel="noopener noreferrer"&gt;dotfiles&lt;/a&gt; on GitHub.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Enabling Undercurl in Neovim with Tmux
&lt;/h2&gt;

&lt;p&gt;Undercurl may not work out of the box in Tmux. Here’s how to fix that:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Update Your &lt;code&gt;tmux.conf&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Add the following lines to your &lt;code&gt;~/.tmux.conf&lt;/code&gt; or &lt;code&gt;~/.config/tmux/tmux.conf&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;set -g default-terminal "screen-256color"

# Undercurl support
set -as terminal-overrides ',*:Smulx=\E[4::%p1%dm'
set -as terminal-overrides ',*:Setulc=\E[58::2::%p1%{65536}%/%d::%p1%{256}%/%{255}%&amp;amp;%d::%p1%{255}%&amp;amp;%d%;m'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check if you are able to see undercurl in &lt;code&gt;Neovim&lt;/code&gt; inside &lt;code&gt;tmux&lt;/code&gt; session. If not follow the below steps.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Configure the Terminfo
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Run &lt;code&gt;echo $TERM&lt;/code&gt; (should return &lt;code&gt;screen-256color&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Follow the terminal configuration steps. Remember your &lt;code&gt;$TERM&lt;/code&gt; is now &lt;code&gt;screen-256color&lt;/code&gt; so replace &lt;code&gt;${TERM}&lt;/code&gt; with &lt;code&gt;screen-256color&lt;/code&gt; from step 3 onwards.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 3: Verify Smulx in Tmux
&lt;/h3&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;infocmp &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;Smulx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If successful, you’ll see the correct Smulx configuration.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1aj1lb3qe4rpsyiqgj83.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1aj1lb3qe4rpsyiqgj83.png" alt="infocmp within tmux" width="730" height="1050"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Test Undercurl in Tmux
&lt;/h3&gt;

&lt;p&gt;Open Neovim inside a Tmux session, and voilà! Undercurl now works in Neovim + Tmux.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fihnc7q49623jnvhjxy89.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fihnc7q49623jnvhjxy89.png" alt="neovim undercurl within tmux" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;With these steps, you've unlocked the power of &lt;strong&gt;undercurl&lt;/strong&gt; in Neovim, both in standalone terminals and Tmux sessions. Happy coding!&lt;/p&gt;




&lt;h3&gt;
  
  
  Questions or Feedback?
&lt;/h3&gt;

&lt;p&gt;Feel free to leave a comment or ask any questions if you have doubts! I’d love to hear your thoughts or help you out. 😊&lt;/p&gt;

</description>
      <category>neovim</category>
      <category>tmux</category>
      <category>undercurl</category>
    </item>
  </channel>
</rss>
