<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>GitHub Lua Daily Trending</title>
    <description>Daily Trending of Lua in GitHub</description>
    <pubDate>Sat, 18 Apr 2026 01:36:13 GMT</pubDate>
    <link>http://mshibanami.github.io/GitHubTrendingRSS</link>
    
    <item>
      <title>olimorris/codecompanion.nvim</title>
      <link>https://github.com/olimorris/codecompanion.nvim</link>
      <description>&lt;p&gt;✨ AI Coding, Vim Style&lt;/p&gt;&lt;hr&gt;&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://codecompanion.olimorris.dev&quot;&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/64da6a69-a54d-4799-b034-59d9efd27b76&quot; alt=&quot;CodeCompanion.nvim&quot; /&gt;&lt;/a&gt; &lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://github.com/olimorris/codecompanion.nvim/stargazers&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/olimorris/codecompanion.nvim?color=c678dd&amp;amp;logoColor=e06c75&amp;amp;style=for-the-badge&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/olimorris/codecompanion.nvim/actions/workflows/ci.yml&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/actions/workflow/status/olimorris/codecompanion.nvim/ci.yml?branch=main&amp;amp;label=tests&amp;amp;style=for-the-badge&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/olimorris/codecompanion.nvim/releases&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/v/release/olimorris/codecompanion.nvim?style=for-the-badge&quot; /&gt;&lt;/a&gt; &lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt;Code with LLMs and Agents via the &lt;a href=&quot;https://codecompanion.olimorris.dev/getting-started.html&quot;&gt;in-built&lt;/a&gt; adapters, the &lt;a href=&quot;https://codecompanion.olimorris.dev/configuration/adapters#community-adapters&quot;&gt;community&lt;/a&gt; adapters or by &lt;a href=&quot;https://codecompanion.olimorris.dev/extending/adapters.html&quot;&gt;building&lt;/a&gt; your own&lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt;New features are always announced &lt;a href=&quot;https://github.com/olimorris/codecompanion.nvim/discussions/categories/announcements&quot;&gt;here&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;💜 Sponsors&lt;/h2&gt; 
&lt;p&gt;Thank you to the following people:&lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; 
 &lt;!-- sponsors --&gt;&lt;a href=&quot;https://github.com/unicell&quot;&gt;&lt;img src=&quot;https://github.com/unicell.png&quot; width=&quot;60px&quot; alt=&quot;User avatar: Qiu Yu&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/jfgordon2&quot;&gt;&lt;img src=&quot;https://github.com/jfgordon2.png&quot; width=&quot;60px&quot; alt=&quot;User avatar: Jeff Gordon&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/JuanCrg90&quot;&gt;&lt;img src=&quot;https://github.com/JuanCrg90.png&quot; width=&quot;60px&quot; alt=&quot;User avatar: Juan Carlos Ruiz&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/Alexander-Garcia&quot;&gt;&lt;img src=&quot;https://github.com/Alexander-Garcia.png&quot; width=&quot;60px&quot; alt=&quot;User avatar: Alexander Garcia&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/LumenYoung&quot;&gt;&lt;img src=&quot;https://github.com/LumenYoung.png&quot; width=&quot;60px&quot; alt=&quot;User avatar: Lumen Yang&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/alzwded&quot;&gt;&lt;img src=&quot;https://github.com/alzwded.png&quot; width=&quot;60px&quot; alt=&quot;User avatar: Vlad Meșco&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/JPFrancoia&quot;&gt;&lt;img src=&quot;https://github.com/JPFrancoia.png&quot; width=&quot;60px&quot; alt=&quot;User avatar: JPFrancoia&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/pixlmint&quot;&gt;&lt;img src=&quot;https://github.com/pixlmint.png&quot; width=&quot;60px&quot; alt=&quot;User avatar: Christian Gröber&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/itskyedo&quot;&gt;&lt;img src=&quot;https://github.com/itskyedo.png&quot; width=&quot;60px&quot; alt=&quot;User avatar: Kyedo&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/jsit&quot;&gt;&lt;img src=&quot;https://github.com/jsit.png&quot; width=&quot;60px&quot; alt=&quot;User avatar: Jay Sitter&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/harrisoncramer&quot;&gt;&lt;img src=&quot;https://github.com/harrisoncramer.png&quot; width=&quot;60px&quot; alt=&quot;User avatar: Harrison (Harry) Cramer&quot; /&gt;&lt;/a&gt;
 &lt;!-- sponsors --&gt; &lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt;If &lt;i&gt;you&lt;/i&gt; love CodeCompanion and use it in your workflow, please consider &lt;a href=&quot;https://github.com/sponsors/olimorris&quot;&gt;sponsoring me&lt;/a&gt;&lt;/p&gt; 
&lt;!-- panvimdoc-ignore-end --&gt; 
&lt;h2&gt;✨ Features&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;💬 &lt;a href=&quot;https://github.com/features/copilot&quot;&gt;Copilot Chat&lt;/a&gt; meets &lt;a href=&quot;https://zed.dev/blog/zed-ai&quot;&gt;Zed AI&lt;/a&gt;, in Neovim&lt;/li&gt; 
 &lt;li&gt;⚡ Integrates Neovim with LLMs and Agents in the CLI&lt;/li&gt; 
 &lt;li&gt;🔌 Support for LLMs from Anthropic, Copilot, GitHub Models, DeepSeek, Gemini, Mistral AI, Novita, Ollama, OpenAI, Azure OpenAI, HuggingFace and xAI (or &lt;a href=&quot;https://codecompanion.olimorris.dev/extending/adapters.html&quot;&gt;bring your own&lt;/a&gt;)&lt;/li&gt; 
 &lt;li&gt;🤖 Support for &lt;a href=&quot;https://agentclientprotocol.com/overview/introduction&quot;&gt;Agent Client Protocol&lt;/a&gt;, enabling coding with agents like &lt;a href=&quot;https://docs.augmentcode.com/cli/overview&quot;&gt;Augment Code&lt;/a&gt;, &lt;a href=&quot;https://github.com/docker/cagent&quot;&gt;Cagent&lt;/a&gt; from Docker, &lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code/overview&quot;&gt;Claude Code&lt;/a&gt;, &lt;a href=&quot;https://openai.com/codex&quot;&gt;Codex&lt;/a&gt;, &lt;a href=&quot;https://github.com/features/copilot/cli&quot;&gt;Copilot CLI&lt;/a&gt;, &lt;a href=&quot;https://github.com/google-gemini/gemini-cli&quot;&gt;Gemini CLI&lt;/a&gt;, &lt;a href=&quot;https://block.github.io/goose/&quot;&gt;Goose&lt;/a&gt;, &lt;a href=&quot;https://cursor.com/docs/cli/overview&quot;&gt;Cursor CLI&lt;/a&gt;, &lt;a href=&quot;https://github.com/MoonshotAI/kimi-cli&quot;&gt;Kimi CLI&lt;/a&gt;, &lt;a href=&quot;https://kiro.dev/docs/cli/&quot;&gt;Kiro&lt;/a&gt;, &lt;a href=&quot;https://github.com/mistralai/mistral-vibe&quot;&gt;Mistral Vibe&lt;/a&gt; and &lt;a href=&quot;https://opencode.ai&quot;&gt;OpenCode&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;🫶 User contributed and supported &lt;a href=&quot;https://codecompanion.olimorris.dev/configuration/adapters-http#community-adapters&quot;&gt;adapters&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;🔋 Support for &lt;a href=&quot;https://codecompanion.olimorris.dev/model-context-protocol#model-context-protocol-mcp-support&quot;&gt;Model Context Protocol (MCP)&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;🚀 &lt;a href=&quot;https://codecompanion.olimorris.dev/usage/inline.html&quot;&gt;Inline transformations&lt;/a&gt;, code creation and refactoring&lt;/li&gt; 
 &lt;li&gt;🎨 &lt;a href=&quot;https://codecompanion.olimorris.dev/usage/chat-buffer/editor-context.html&quot;&gt;Editor Context&lt;/a&gt;, &lt;a href=&quot;https://codecompanion.olimorris.dev/usage/chat-buffer/slash-commands.html&quot;&gt;Slash Commands&lt;/a&gt;, &lt;a href=&quot;https://codecompanion.olimorris.dev/usage/chat-buffer/agents-tools&quot;&gt;Agents/Tools&lt;/a&gt; and &lt;a href=&quot;https://codecompanion.olimorris.dev/usage/workflows.html&quot;&gt;Workflows&lt;/a&gt; to improve LLM output&lt;/li&gt; 
 &lt;li&gt;🧠 Support for &lt;a href=&quot;https://codecompanion.olimorris.dev/usage/chat-buffer/rules.html&quot;&gt;rules&lt;/a&gt; files like &lt;code&gt;CLAUDE.md&lt;/code&gt;, &lt;code&gt;.cursor/rules&lt;/code&gt; and your own custom ones&lt;/li&gt; 
 &lt;li&gt;✨ Built-in &lt;a href=&quot;https://codecompanion.olimorris.dev/usage/action-palette.html&quot;&gt;prompt library&lt;/a&gt; for common tasks like advice on LSP errors and code explanations&lt;/li&gt; 
 &lt;li&gt;🏗️ Create your own &lt;a href=&quot;https://codecompanion.olimorris.dev/configuration/prompt-library.html#creating-prompts&quot;&gt;custom prompts&lt;/a&gt;, Editor Context and Slash Commands&lt;/li&gt; 
 &lt;li&gt;📚 Have &lt;a href=&quot;https://codecompanion.olimorris.dev/usage/introduction.html#quickly-accessing-a-chat-buffer&quot;&gt;multiple chats&lt;/a&gt; open at the same time&lt;/li&gt; 
 &lt;li&gt;🎨 Support for &lt;a href=&quot;https://codecompanion.olimorris.dev/usage/chat-buffer/#images-vision&quot;&gt;vision and images&lt;/a&gt; as input&lt;/li&gt; 
 &lt;li&gt;💪 Async execution for fast performance&lt;/li&gt; 
&lt;/ul&gt; 
&lt;!-- panvimdoc-ignore-start --&gt; 
&lt;h2&gt;📸 In Action&lt;/h2&gt; 
&lt;div align=&quot;center&quot;&gt; 
 &lt;p&gt; &lt;/p&gt;
 &lt;h3&gt;&lt;a href=&quot;https://github.com/user-attachments/assets/aa109f1d-0ec9-4f08-bd9a-df99da03b9a4&quot;&gt;The Chat Buffer&lt;/a&gt;&lt;/h3&gt; 
 &lt;video controls muted src=&quot;https://github.com/user-attachments/assets/3cc83544-2690-49b5-8be6-51e671db52ef&quot;&gt;&lt;/video&gt; 
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt; &lt;/p&gt;
 &lt;h3&gt;&lt;a href=&quot;https://github.com/user-attachments/assets/362b7cfd-e794-4d9c-9a74-90d5e2a87a32&quot;&gt;Tools + Agentic Workflows&lt;/a&gt;&lt;/h3&gt; 
 &lt;video controls muted src=&quot;https://github.com/user-attachments/assets/59efa262-e768-4f36-9901-9d02b018fcf0&quot;&gt;&lt;/video&gt; 
 &lt;p&gt;&lt;/p&gt; 
 &lt;p&gt; &lt;/p&gt;
 &lt;h3&gt;&lt;a href=&quot;https://github.com/user-attachments/assets/dcddcb85-cba0-4017-9723-6e6b7f080fee&quot;&gt;Inline Interaction&lt;/a&gt;&lt;/h3&gt; 
 &lt;video controls muted src=&quot;https://github.com/user-attachments/assets/11a42705-d9de-4eb5-a9ab-c8a2772fb4d4&quot;&gt;&lt;/video&gt; 
 &lt;p&gt;&lt;/p&gt; 
&lt;/div&gt; 
&lt;!-- panvimdoc-ignore-end --&gt; 
&lt;h2&gt;🚀 Getting Started&lt;/h2&gt; 
&lt;p&gt;Everything you need to know about CodeCompanion (installation, configuration and usage) is within the &lt;a href=&quot;https://codecompanion.olimorris.dev&quot;&gt;docs&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;🧰 Troubleshooting&lt;/h2&gt; 
&lt;p&gt;Before raising an &lt;a href=&quot;https://github.com/olimorris/codecompanion.nvim/issues&quot;&gt;issue&lt;/a&gt;, there are a number of steps you can take to troubleshoot a problem:&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Checkhealth&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;Run &lt;code&gt;:checkhealth codecompanion&lt;/code&gt; and check all dependencies are installed correctly. Also take note of the log file path.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Turn on logging&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;Update your config and turn debug logging on:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- lazy.nvim
{
  &quot;olimorris/codecompanion.nvim&quot;,
  dependencies = {
    &quot;nvim-lua/plenary.nvim&quot;,
    &quot;nvim-treesitter/nvim-treesitter&quot;,
  },
  opts = {
    -- NOTE: The log_level is in `opts.opts`
    opts = {
      log_level = &quot;DEBUG&quot;, -- or &quot;TRACE&quot;
    },
  },
},

-- Other package managers
require(&quot;codecompanion&quot;).setup({
  opts = {
    log_level = &quot;DEBUG&quot;, -- or &quot;TRACE&quot;
  }
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;and inspect the log file as per the location from the checkhealth command.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Try with a &lt;code&gt;minimal.lua&lt;/code&gt; file&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;A large proportion of issues which are raised in Neovim plugins are to do with a user&#39;s own config. That&#39;s why I always ask users to fill in a &lt;code&gt;minimal.lua&lt;/code&gt; file when they raise an issue. We can rule out their config being an issue and it allows me to recreate the problem.&lt;/p&gt; 
&lt;p&gt;For this purpose, I have included a &lt;a href=&quot;https://github.com/olimorris/codecompanion.nvim/raw/main/minimal.lua&quot;&gt;minimal.lua&lt;/a&gt; file in the repository for you to test out if you&#39;re facing issues. Simply copy the file, edit it and run neovim with &lt;code&gt;nvim --clean -u minimal.lua&lt;/code&gt;.&lt;/p&gt; 
&lt;!-- panvimdoc-ignore-start --&gt; 
&lt;h2&gt;🎁 Contributing&lt;/h2&gt; 
&lt;p&gt;I am open to contributions but they will be implemented at my discretion. Feel free to open up a discussion before embarking on a PR and please read the &lt;a href=&quot;https://raw.githubusercontent.com/olimorris/codecompanion.nvim/main/CONTRIBUTING.md&quot;&gt;CONTRIBUTING.md&lt;/a&gt; guide.&lt;/p&gt; 
&lt;h2&gt;👏 Acknowledgements&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/stevearc&quot;&gt;Steven Arcangeli&lt;/a&gt; for his genius creation of the chat buffer and his feedback early on&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/piersolenski/wtf.nvim&quot;&gt;Wtf.nvim&lt;/a&gt; for the LSP assistant action&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/CopilotC-Nvim/CopilotChat.nvim&quot;&gt;CopilotChat.nvim&lt;/a&gt; for the rendering and usability of the chat buffer&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/stevearc/aerial.nvim&quot;&gt;Aerial.nvim&lt;/a&gt; for the Tree-sitter parsing which inspired the symbols Slash Command&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/Saghen&quot;&gt;Saghen&lt;/a&gt; for the fantastic docs inspiration from &lt;a href=&quot;https://github.com/Saghen/blink.cmp&quot;&gt;blink.cmp&lt;/a&gt; and continued PRs to the project&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/catwell&quot;&gt;Catwell&lt;/a&gt; for the &lt;a href=&quot;https://github.com/catwell/cw-lua/raw/master/deque/deque.lua&quot;&gt;queue&lt;/a&gt; inspiration that I use to stack agents and tools&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/bassamsdata&quot;&gt;bassamsdata&lt;/a&gt; for the amazing &lt;code&gt;insert_edit_into_file&lt;/code&gt; tool (the list is endless) and ongoing contributions to this project&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/ravitemer&quot;&gt;ravitemer&lt;/a&gt; for the fantastic extensions API&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/Davidyz&quot;&gt;Davidyz&lt;/a&gt; for his continued, excellent contributions that keep CodeCompanion going&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/conradirwin&quot;&gt;Conrad Irwin&lt;/a&gt;, &lt;a href=&quot;https://github.com/agu-z&quot;&gt;Agus Zubiaga&lt;/a&gt; and Morgan Krey from &lt;a href=&quot;https://github.com/zed-industries&quot;&gt;Zed Industries&lt;/a&gt; for their support in implementing &lt;a href=&quot;https://agentclientprotocol.com&quot;&gt;ACP&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/folke/sidekick.nvim&quot;&gt;Sidekick.nvim&lt;/a&gt; for the diff and terminal input inspiration&lt;/li&gt; 
&lt;/ul&gt; 
&lt;!-- panvimdoc-ignore-end --&gt;</description>
      
      <media:content url="https://repository-images.githubusercontent.com/736363011/41e28b3c-3e8b-404e-a268-c87785cc5c19" medium="image" />
      
    </item>
    
    <item>
      <title>folke/snacks.nvim</title>
      <link>https://github.com/folke/snacks.nvim</link>
      <description>&lt;p&gt;🍿 A collection of QoL plugins for Neovim&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;🍿 &lt;code&gt;snacks.nvim&lt;/code&gt;&lt;/h1&gt; 
&lt;p&gt;A collection of small QoL plugins for Neovim.&lt;/p&gt; 
&lt;h2&gt;✨ Features&lt;/h2&gt; 
&lt;!-- toc:start --&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Snack&lt;/th&gt; 
   &lt;th&gt;Description&lt;/th&gt; 
   &lt;th style=&quot;text-align:center&quot;&gt;Setup&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/animate.md&quot;&gt;animate&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Efficient animations including over 45 easing functions &lt;em&gt;(library)&lt;/em&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/bigfile.md&quot;&gt;bigfile&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Deal with big files&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;‼️&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/bufdelete.md&quot;&gt;bufdelete&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Delete buffers without disrupting window layout&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/dashboard.md&quot;&gt;dashboard&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Beautiful declarative dashboards&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;‼️&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/debug.md&quot;&gt;debug&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Pretty inspect &amp;amp; backtraces for debugging&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/dim.md&quot;&gt;dim&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Focus on the active scope by dimming the rest&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/explorer.md&quot;&gt;explorer&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;A file explorer (picker in disguise)&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;‼️&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/gh.md&quot;&gt;gh&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;GitHub CLI integration&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/git.md&quot;&gt;git&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Git utilities&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/gitbrowse.md&quot;&gt;gitbrowse&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Open the current file, branch, commit, or repo in a browser (e.g. GitHub, GitLab, Bitbucket)&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/image.md&quot;&gt;image&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Image viewer using Kitty Graphics Protocol, supported by &lt;code&gt;kitty&lt;/code&gt;, &lt;code&gt;wezterm&lt;/code&gt; and &lt;code&gt;ghostty&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;‼️&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/indent.md&quot;&gt;indent&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Indent guides and scopes&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/input.md&quot;&gt;input&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Better &lt;code&gt;vim.ui.input&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;‼️&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/keymap.md&quot;&gt;keymap&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Better &lt;code&gt;vim.keymap&lt;/code&gt; with support for filetypes and LSP clients&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/layout.md&quot;&gt;layout&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Window layouts&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/lazygit.md&quot;&gt;lazygit&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Open LazyGit in a float, auto-configure colorscheme and integration with Neovim&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/notifier.md&quot;&gt;notifier&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Pretty &lt;code&gt;vim.notify&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;‼️&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/notify.md&quot;&gt;notify&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Utility functions to work with Neovim&#39;s &lt;code&gt;vim.notify&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/picker.md&quot;&gt;picker&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Picker for selecting items&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;‼️&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/profiler.md&quot;&gt;profiler&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Neovim lua profiler&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/quickfile.md&quot;&gt;quickfile&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;When doing &lt;code&gt;nvim somefile.txt&lt;/code&gt;, it will render the file as quickly as possible, before loading your plugins.&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;‼️&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/rename.md&quot;&gt;rename&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;LSP-integrated file renaming with support for plugins like &lt;a href=&quot;https://github.com/nvim-neo-tree/neo-tree.nvim&quot;&gt;neo-tree.nvim&lt;/a&gt; and &lt;a href=&quot;https://github.com/nvim-mini/mini.files&quot;&gt;mini.files&lt;/a&gt;.&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/scope.md&quot;&gt;scope&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Scope detection, text objects and jumping based on treesitter or indent&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;‼️&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/scratch.md&quot;&gt;scratch&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Scratch buffers with a persistent file&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/scroll.md&quot;&gt;scroll&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Smooth scrolling&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;‼️&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/statuscolumn.md&quot;&gt;statuscolumn&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Pretty status column&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;‼️&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/terminal.md&quot;&gt;terminal&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Create and toggle floating/split terminals&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/toggle.md&quot;&gt;toggle&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Toggle keymaps integrated with which-key icons / colors&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/util.md&quot;&gt;util&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Utility functions for Snacks &lt;em&gt;(library)&lt;/em&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/win.md&quot;&gt;win&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Create and manage floating windows or splits&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/words.md&quot;&gt;words&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Auto-show LSP references and quickly navigate between them&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;‼️&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/zen.md&quot;&gt;zen&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Zen mode • distraction-free coding&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;!-- toc:end --&gt; 
&lt;h2&gt;⚡️ Requirements&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Neovim&lt;/strong&gt; &amp;gt;= 0.9.4&lt;/li&gt; 
 &lt;li&gt;for proper icons support: 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://github.com/nvim-mini/mini.icons&quot;&gt;mini.icons&lt;/a&gt; &lt;em&gt;(optional)&lt;/em&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://github.com/nvim-tree/nvim-web-devicons&quot;&gt;nvim-web-devicons&lt;/a&gt; &lt;em&gt;(optional)&lt;/em&gt;&lt;/li&gt; 
   &lt;li&gt;a &lt;a href=&quot;https://www.nerdfonts.com/&quot;&gt;Nerd Font&lt;/a&gt; &lt;strong&gt;&lt;em&gt;(optional)&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;📦 Installation&lt;/h2&gt; 
&lt;p&gt;Install the plugin with your package manager:&lt;/p&gt; 
&lt;h3&gt;&lt;a href=&quot;https://github.com/folke/lazy.nvim&quot;&gt;lazy.nvim&lt;/a&gt;&lt;/h3&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-important&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-report mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Important&lt;/p&gt;
 &lt;p&gt;A couple of plugins &lt;strong&gt;require&lt;/strong&gt; &lt;code&gt;snacks.nvim&lt;/code&gt; to be set-up early. Setup creates some autocmds and does not load any plugins. Check the &lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/lua/snacks/init.lua&quot;&gt;code&lt;/a&gt; to see what it does.&lt;/p&gt; 
&lt;/div&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-caution&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-stop mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .389.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25A.749.749 0 0 1 11 16H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.389.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Caution&lt;/p&gt;
 &lt;p&gt;You need to explicitly pass options for a plugin or set &lt;code&gt;enabled = true&lt;/code&gt; to enable it.&lt;/p&gt; 
&lt;/div&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-tip&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-light-bulb mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Tip&lt;/p&gt;
 &lt;p&gt;It&#39;s a good idea to run &lt;code&gt;:checkhealth snacks&lt;/code&gt; to see if everything is set up correctly.&lt;/p&gt; 
&lt;/div&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;{
  &quot;folke/snacks.nvim&quot;,
  priority = 1000,
  lazy = false,
  ---@type snacks.Config
  opts = {
    -- your configuration comes here
    -- or leave it empty to use the default settings
    -- refer to the configuration section below
    bigfile = { enabled = true },
    dashboard = { enabled = true },
    explorer = { enabled = true },
    indent = { enabled = true },
    input = { enabled = true },
    picker = { enabled = true },
    notifier = { enabled = true },
    quickfile = { enabled = true },
    scope = { enabled = true },
    scroll = { enabled = true },
    statuscolumn = { enabled = true },
    words = { enabled = true },
  },
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;For an in-depth setup of &lt;code&gt;snacks.nvim&lt;/code&gt; with &lt;code&gt;lazy.nvim&lt;/code&gt;, check the &lt;a href=&quot;https://github.com/folke/snacks.nvim?tab=readme-ov-file#-usage&quot;&gt;example&lt;/a&gt; below.&lt;/p&gt; 
&lt;h2&gt;⚙️ Configuration&lt;/h2&gt; 
&lt;p&gt;Please refer to the readme of each plugin for their specific configuration.&lt;/p&gt; 
&lt;details&gt;
 &lt;summary&gt;Default Options&lt;/summary&gt; 
 &lt;!-- config:start --&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@class snacks.Config
---@field animate? snacks.animate.Config
---@field bigfile? snacks.bigfile.Config
---@field dashboard? snacks.dashboard.Config
---@field dim? snacks.dim.Config
---@field explorer? snacks.explorer.Config
---@field gh? snacks.gh.Config
---@field gitbrowse? snacks.gitbrowse.Config
---@field image? snacks.image.Config
---@field indent? snacks.indent.Config
---@field input? snacks.input.Config
---@field layout? snacks.layout.Config
---@field lazygit? snacks.lazygit.Config
---@field notifier? snacks.notifier.Config
---@field picker? snacks.picker.Config
---@field profiler? snacks.profiler.Config
---@field quickfile? snacks.quickfile.Config
---@field scope? snacks.scope.Config
---@field scratch? snacks.scratch.Config
---@field scroll? snacks.scroll.Config
---@field statuscolumn? snacks.statuscolumn.Config
---@field terminal? snacks.terminal.Config
---@field toggle? snacks.toggle.Config
---@field win? snacks.win.Config
---@field words? snacks.words.Config
---@field zen? snacks.zen.Config
---@field styles? table&amp;lt;string, snacks.win.Config&amp;gt;
---@field image? snacks.image.Config|{}
{
  image = {
    -- define these here, so that we don&#39;t need to load the image module
    formats = {
      &quot;png&quot;,
      &quot;jpg&quot;,
      &quot;jpeg&quot;,
      &quot;gif&quot;,
      &quot;bmp&quot;,
      &quot;webp&quot;,
      &quot;tiff&quot;,
      &quot;heic&quot;,
      &quot;avif&quot;,
      &quot;mp4&quot;,
      &quot;mov&quot;,
      &quot;avi&quot;,
      &quot;mkv&quot;,
      &quot;webm&quot;,
      &quot;pdf&quot;,
      &quot;icns&quot;,
    },
  },
}
&lt;/code&gt;&lt;/pre&gt; 
 &lt;!-- config:end --&gt; 
&lt;/details&gt; 
&lt;p&gt;Some plugins have examples in their documentation. You can include them in your config like this:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;{
  dashboard = { example = &quot;github&quot; }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;If you want to customize options for a plugin after they have been resolved, you can use the &lt;code&gt;config&lt;/code&gt; function:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;{
  gitbrowse = {
    config = function(opts, defaults)
      table.insert(opts.remote_patterns, { &quot;my&quot;, &quot;custom pattern&quot; })
    end
  },
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;🚀 Usage&lt;/h2&gt; 
&lt;p&gt;See the example below for how to configure &lt;code&gt;snacks.nvim&lt;/code&gt;.&lt;/p&gt; 
&lt;!-- example:start --&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;{
  &quot;folke/snacks.nvim&quot;,
  priority = 1000,
  lazy = false,
  ---@type snacks.Config
  opts = {
    bigfile = { enabled = true },
    dashboard = { enabled = true },
    explorer = { enabled = true },
    indent = { enabled = true },
    input = { enabled = true },
    notifier = {
      enabled = true,
      timeout = 3000,
    },
    picker = { enabled = true },
    quickfile = { enabled = true },
    scope = { enabled = true },
    scroll = { enabled = true },
    statuscolumn = { enabled = true },
    words = { enabled = true },
    styles = {
      notification = {
        -- wo = { wrap = true } -- Wrap notifications
      }
    }
  },
  keys = {
    -- Top Pickers &amp;amp; Explorer
    { &quot;&amp;lt;leader&amp;gt;&amp;lt;space&amp;gt;&quot;, function() Snacks.picker.smart() end, desc = &quot;Smart Find Files&quot; },
    { &quot;&amp;lt;leader&amp;gt;,&quot;, function() Snacks.picker.buffers() end, desc = &quot;Buffers&quot; },
    { &quot;&amp;lt;leader&amp;gt;/&quot;, function() Snacks.picker.grep() end, desc = &quot;Grep&quot; },
    { &quot;&amp;lt;leader&amp;gt;:&quot;, function() Snacks.picker.command_history() end, desc = &quot;Command History&quot; },
    { &quot;&amp;lt;leader&amp;gt;n&quot;, function() Snacks.picker.notifications() end, desc = &quot;Notification History&quot; },
    { &quot;&amp;lt;leader&amp;gt;e&quot;, function() Snacks.explorer() end, desc = &quot;File Explorer&quot; },
    -- find
    { &quot;&amp;lt;leader&amp;gt;fb&quot;, function() Snacks.picker.buffers() end, desc = &quot;Buffers&quot; },
    { &quot;&amp;lt;leader&amp;gt;fc&quot;, function() Snacks.picker.files({ cwd = vim.fn.stdpath(&quot;config&quot;) }) end, desc = &quot;Find Config File&quot; },
    { &quot;&amp;lt;leader&amp;gt;ff&quot;, function() Snacks.picker.files() end, desc = &quot;Find Files&quot; },
    { &quot;&amp;lt;leader&amp;gt;fg&quot;, function() Snacks.picker.git_files() end, desc = &quot;Find Git Files&quot; },
    { &quot;&amp;lt;leader&amp;gt;fp&quot;, function() Snacks.picker.projects() end, desc = &quot;Projects&quot; },
    { &quot;&amp;lt;leader&amp;gt;fr&quot;, function() Snacks.picker.recent() end, desc = &quot;Recent&quot; },
    -- git
    { &quot;&amp;lt;leader&amp;gt;gb&quot;, function() Snacks.picker.git_branches() end, desc = &quot;Git Branches&quot; },
    { &quot;&amp;lt;leader&amp;gt;gl&quot;, function() Snacks.picker.git_log() end, desc = &quot;Git Log&quot; },
    { &quot;&amp;lt;leader&amp;gt;gL&quot;, function() Snacks.picker.git_log_line() end, desc = &quot;Git Log Line&quot; },
    { &quot;&amp;lt;leader&amp;gt;gs&quot;, function() Snacks.picker.git_status() end, desc = &quot;Git Status&quot; },
    { &quot;&amp;lt;leader&amp;gt;gS&quot;, function() Snacks.picker.git_stash() end, desc = &quot;Git Stash&quot; },
    { &quot;&amp;lt;leader&amp;gt;gd&quot;, function() Snacks.picker.git_diff() end, desc = &quot;Git Diff (Hunks)&quot; },
    { &quot;&amp;lt;leader&amp;gt;gf&quot;, function() Snacks.picker.git_log_file() end, desc = &quot;Git Log File&quot; },
    -- gh
    { &quot;&amp;lt;leader&amp;gt;gi&quot;, function() Snacks.picker.gh_issue() end, desc = &quot;GitHub Issues (open)&quot; },
    { &quot;&amp;lt;leader&amp;gt;gI&quot;, function() Snacks.picker.gh_issue({ state = &quot;all&quot; }) end, desc = &quot;GitHub Issues (all)&quot; },
    { &quot;&amp;lt;leader&amp;gt;gp&quot;, function() Snacks.picker.gh_pr() end, desc = &quot;GitHub Pull Requests (open)&quot; },
    { &quot;&amp;lt;leader&amp;gt;gP&quot;, function() Snacks.picker.gh_pr({ state = &quot;all&quot; }) end, desc = &quot;GitHub Pull Requests (all)&quot; },
    -- Grep
    { &quot;&amp;lt;leader&amp;gt;sb&quot;, function() Snacks.picker.lines() end, desc = &quot;Buffer Lines&quot; },
    { &quot;&amp;lt;leader&amp;gt;sB&quot;, function() Snacks.picker.grep_buffers() end, desc = &quot;Grep Open Buffers&quot; },
    { &quot;&amp;lt;leader&amp;gt;sg&quot;, function() Snacks.picker.grep() end, desc = &quot;Grep&quot; },
    { &quot;&amp;lt;leader&amp;gt;sw&quot;, function() Snacks.picker.grep_word() end, desc = &quot;Visual selection or word&quot;, mode = { &quot;n&quot;, &quot;x&quot; } },
    -- search
    { &#39;&amp;lt;leader&amp;gt;s&quot;&#39;, function() Snacks.picker.registers() end, desc = &quot;Registers&quot; },
    { &#39;&amp;lt;leader&amp;gt;s/&#39;, function() Snacks.picker.search_history() end, desc = &quot;Search History&quot; },
    { &quot;&amp;lt;leader&amp;gt;sa&quot;, function() Snacks.picker.autocmds() end, desc = &quot;Autocmds&quot; },
    { &quot;&amp;lt;leader&amp;gt;sb&quot;, function() Snacks.picker.lines() end, desc = &quot;Buffer Lines&quot; },
    { &quot;&amp;lt;leader&amp;gt;sc&quot;, function() Snacks.picker.command_history() end, desc = &quot;Command History&quot; },
    { &quot;&amp;lt;leader&amp;gt;sC&quot;, function() Snacks.picker.commands() end, desc = &quot;Commands&quot; },
    { &quot;&amp;lt;leader&amp;gt;sd&quot;, function() Snacks.picker.diagnostics() end, desc = &quot;Diagnostics&quot; },
    { &quot;&amp;lt;leader&amp;gt;sD&quot;, function() Snacks.picker.diagnostics_buffer() end, desc = &quot;Buffer Diagnostics&quot; },
    { &quot;&amp;lt;leader&amp;gt;sh&quot;, function() Snacks.picker.help() end, desc = &quot;Help Pages&quot; },
    { &quot;&amp;lt;leader&amp;gt;sH&quot;, function() Snacks.picker.highlights() end, desc = &quot;Highlights&quot; },
    { &quot;&amp;lt;leader&amp;gt;si&quot;, function() Snacks.picker.icons() end, desc = &quot;Icons&quot; },
    { &quot;&amp;lt;leader&amp;gt;sj&quot;, function() Snacks.picker.jumps() end, desc = &quot;Jumps&quot; },
    { &quot;&amp;lt;leader&amp;gt;sk&quot;, function() Snacks.picker.keymaps() end, desc = &quot;Keymaps&quot; },
    { &quot;&amp;lt;leader&amp;gt;sl&quot;, function() Snacks.picker.loclist() end, desc = &quot;Location List&quot; },
    { &quot;&amp;lt;leader&amp;gt;sm&quot;, function() Snacks.picker.marks() end, desc = &quot;Marks&quot; },
    { &quot;&amp;lt;leader&amp;gt;sM&quot;, function() Snacks.picker.man() end, desc = &quot;Man Pages&quot; },
    { &quot;&amp;lt;leader&amp;gt;sp&quot;, function() Snacks.picker.lazy() end, desc = &quot;Search for Plugin Spec&quot; },
    { &quot;&amp;lt;leader&amp;gt;sq&quot;, function() Snacks.picker.qflist() end, desc = &quot;Quickfix List&quot; },
    { &quot;&amp;lt;leader&amp;gt;sR&quot;, function() Snacks.picker.resume() end, desc = &quot;Resume&quot; },
    { &quot;&amp;lt;leader&amp;gt;su&quot;, function() Snacks.picker.undo() end, desc = &quot;Undo History&quot; },
    { &quot;&amp;lt;leader&amp;gt;uC&quot;, function() Snacks.picker.colorschemes() end, desc = &quot;Colorschemes&quot; },
    -- LSP
    { &quot;gd&quot;, function() Snacks.picker.lsp_definitions() end, desc = &quot;Goto Definition&quot; },
    { &quot;gD&quot;, function() Snacks.picker.lsp_declarations() end, desc = &quot;Goto Declaration&quot; },
    { &quot;gr&quot;, function() Snacks.picker.lsp_references() end, nowait = true, desc = &quot;References&quot; },
    { &quot;gI&quot;, function() Snacks.picker.lsp_implementations() end, desc = &quot;Goto Implementation&quot; },
    { &quot;gy&quot;, function() Snacks.picker.lsp_type_definitions() end, desc = &quot;Goto T[y]pe Definition&quot; },
    { &quot;gai&quot;, function() Snacks.picker.lsp_incoming_calls() end, desc = &quot;C[a]lls Incoming&quot; },
    { &quot;gao&quot;, function() Snacks.picker.lsp_outgoing_calls() end, desc = &quot;C[a]lls Outgoing&quot; },
    { &quot;&amp;lt;leader&amp;gt;ss&quot;, function() Snacks.picker.lsp_symbols() end, desc = &quot;LSP Symbols&quot; },
    { &quot;&amp;lt;leader&amp;gt;sS&quot;, function() Snacks.picker.lsp_workspace_symbols() end, desc = &quot;LSP Workspace Symbols&quot; },
    -- Other
    { &quot;&amp;lt;leader&amp;gt;z&quot;,  function() Snacks.zen() end, desc = &quot;Toggle Zen Mode&quot; },
    { &quot;&amp;lt;leader&amp;gt;Z&quot;,  function() Snacks.zen.zoom() end, desc = &quot;Toggle Zoom&quot; },
    { &quot;&amp;lt;leader&amp;gt;.&quot;,  function() Snacks.scratch() end, desc = &quot;Toggle Scratch Buffer&quot; },
    { &quot;&amp;lt;leader&amp;gt;S&quot;,  function() Snacks.scratch.select() end, desc = &quot;Select Scratch Buffer&quot; },
    { &quot;&amp;lt;leader&amp;gt;n&quot;,  function() Snacks.notifier.show_history() end, desc = &quot;Notification History&quot; },
    { &quot;&amp;lt;leader&amp;gt;bd&quot;, function() Snacks.bufdelete() end, desc = &quot;Delete Buffer&quot; },
    { &quot;&amp;lt;leader&amp;gt;cR&quot;, function() Snacks.rename.rename_file() end, desc = &quot;Rename File&quot; },
    { &quot;&amp;lt;leader&amp;gt;gB&quot;, function() Snacks.gitbrowse() end, desc = &quot;Git Browse&quot;, mode = { &quot;n&quot;, &quot;v&quot; } },
    { &quot;&amp;lt;leader&amp;gt;gg&quot;, function() Snacks.lazygit() end, desc = &quot;Lazygit&quot; },
    { &quot;&amp;lt;leader&amp;gt;un&quot;, function() Snacks.notifier.hide() end, desc = &quot;Dismiss All Notifications&quot; },
    { &quot;&amp;lt;c-/&amp;gt;&quot;,      function() Snacks.terminal() end, desc = &quot;Toggle Terminal&quot; },
    { &quot;&amp;lt;c-_&amp;gt;&quot;,      function() Snacks.terminal() end, desc = &quot;which_key_ignore&quot; },
    { &quot;]]&quot;,         function() Snacks.words.jump(vim.v.count1) end, desc = &quot;Next Reference&quot;, mode = { &quot;n&quot;, &quot;t&quot; } },
    { &quot;[[&quot;,         function() Snacks.words.jump(-vim.v.count1) end, desc = &quot;Prev Reference&quot;, mode = { &quot;n&quot;, &quot;t&quot; } },
    {
      &quot;&amp;lt;leader&amp;gt;N&quot;,
      desc = &quot;Neovim News&quot;,
      function()
        Snacks.win({
          file = vim.api.nvim_get_runtime_file(&quot;doc/news.txt&quot;, false)[1],
          width = 0.6,
          height = 0.6,
          wo = {
            spell = false,
            wrap = false,
            signcolumn = &quot;yes&quot;,
            statuscolumn = &quot; &quot;,
            conceallevel = 3,
          },
        })
      end,
    }
  },
  init = function()
    vim.api.nvim_create_autocmd(&quot;User&quot;, {
      pattern = &quot;VeryLazy&quot;,
      callback = function()
        -- Setup some globals for debugging (lazy-loaded)
        _G.dd = function(...)
          Snacks.debug.inspect(...)
        end
        _G.bt = function()
          Snacks.debug.backtrace()
        end

        -- Override print to use snacks for `:=` command
        if vim.fn.has(&quot;nvim-0.11&quot;) == 1 then
          vim._print = function(_, ...)
            dd(...)
          end
        else
          vim.print = _G.dd 
        end

        -- Create some toggle mappings
        Snacks.toggle.option(&quot;spell&quot;, { name = &quot;Spelling&quot; }):map(&quot;&amp;lt;leader&amp;gt;us&quot;)
        Snacks.toggle.option(&quot;wrap&quot;, { name = &quot;Wrap&quot; }):map(&quot;&amp;lt;leader&amp;gt;uw&quot;)
        Snacks.toggle.option(&quot;relativenumber&quot;, { name = &quot;Relative Number&quot; }):map(&quot;&amp;lt;leader&amp;gt;uL&quot;)
        Snacks.toggle.diagnostics():map(&quot;&amp;lt;leader&amp;gt;ud&quot;)
        Snacks.toggle.line_number():map(&quot;&amp;lt;leader&amp;gt;ul&quot;)
        Snacks.toggle.option(&quot;conceallevel&quot;, { off = 0, on = vim.o.conceallevel &amp;gt; 0 and vim.o.conceallevel or 2 }):map(&quot;&amp;lt;leader&amp;gt;uc&quot;)
        Snacks.toggle.treesitter():map(&quot;&amp;lt;leader&amp;gt;uT&quot;)
        Snacks.toggle.option(&quot;background&quot;, { off = &quot;light&quot;, on = &quot;dark&quot;, name = &quot;Dark Background&quot; }):map(&quot;&amp;lt;leader&amp;gt;ub&quot;)
        Snacks.toggle.inlay_hints():map(&quot;&amp;lt;leader&amp;gt;uh&quot;)
        Snacks.toggle.indent():map(&quot;&amp;lt;leader&amp;gt;ug&quot;)
        Snacks.toggle.dim():map(&quot;&amp;lt;leader&amp;gt;uD&quot;)
      end,
    })
  end,
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;!-- example:end --&gt; 
&lt;h2&gt;🌈 Highlight Groups&lt;/h2&gt; 
&lt;p&gt;Snacks defines &lt;strong&gt;a lot&lt;/strong&gt; of highlight groups and it&#39;s impossible to document them all.&lt;/p&gt; 
&lt;p&gt;Instead, you can use the picker to see all the highlight groups.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;Snacks.picker.highlights({pattern = &quot;hl_group:^Snacks&quot;})
&lt;/code&gt;&lt;/pre&gt;</description>
      
      <media:content url="https://repository-images.githubusercontent.com/882482569/62265501-363d-4cf4-9ded-55d42b2d37bf" medium="image" />
      
    </item>
    
    <item>
      <title>coder/claudecode.nvim</title>
      <link>https://github.com/coder/claudecode.nvim</link>
      <description>&lt;p&gt;🧩 Claude Code Neovim IDE Extension&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;claudecode.nvim&lt;/h1&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/coder/claudecode.nvim/actions/workflows/test.yml&quot;&gt;&lt;img src=&quot;https://github.com/coder/claudecode.nvim/actions/workflows/test.yml/badge.svg?sanitize=true&quot; alt=&quot;Tests&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://img.shields.io/badge/Neovim-0.8%2B-green&quot; alt=&quot;Neovim version&quot; /&gt; &lt;img src=&quot;https://img.shields.io/badge/Status-beta-blue&quot; alt=&quot;Status&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;The first Neovim IDE integration for Claude Code&lt;/strong&gt; — bringing Anthropic&#39;s AI coding assistant to your favorite editor with a pure Lua implementation.&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;🎯 &lt;strong&gt;TL;DR:&lt;/strong&gt; When Anthropic released Claude Code with VS Code and JetBrains support, I reverse-engineered their extension and built this Neovim plugin. This plugin implements the same WebSocket-based MCP protocol, giving Neovim users the same AI-powered coding experience.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/user-attachments/assets/9c310fb5-5a23-482b-bedc-e21ae457a82d&quot;&gt;https://github.com/user-attachments/assets/9c310fb5-5a23-482b-bedc-e21ae457a82d&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;What Makes This Special&lt;/h2&gt; 
&lt;p&gt;When Anthropic released Claude Code, they only supported VS Code and JetBrains. As a Neovim user, I wanted the same experience — so I reverse-engineered their extension and built this.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;🚀 &lt;strong&gt;Pure Lua, Zero Dependencies&lt;/strong&gt; — Built entirely with &lt;code&gt;vim.loop&lt;/code&gt; and Neovim built-ins&lt;/li&gt; 
 &lt;li&gt;🔌 &lt;strong&gt;100% Protocol Compatible&lt;/strong&gt; — Same WebSocket MCP implementation as official extensions&lt;/li&gt; 
 &lt;li&gt;🎓 &lt;strong&gt;Fully Documented Protocol&lt;/strong&gt; — Learn how to build your own integrations (&lt;a href=&quot;https://raw.githubusercontent.com/coder/claudecode.nvim/main/PROTOCOL.md&quot;&gt;see PROTOCOL.md&lt;/a&gt;)&lt;/li&gt; 
 &lt;li&gt;⚡ &lt;strong&gt;First to Market&lt;/strong&gt; — Beat Anthropic to releasing Neovim support&lt;/li&gt; 
 &lt;li&gt;🛠️ &lt;strong&gt;Built with AI&lt;/strong&gt; — Used Claude to reverse-engineer Claude&#39;s own protocol&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Installation&lt;/h2&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;{
  &quot;coder/claudecode.nvim&quot;,
  dependencies = { &quot;folke/snacks.nvim&quot; },
  config = true,
  keys = {
    { &quot;&amp;lt;leader&amp;gt;a&quot;, nil, desc = &quot;AI/Claude Code&quot; },
    { &quot;&amp;lt;leader&amp;gt;ac&quot;, &quot;&amp;lt;cmd&amp;gt;ClaudeCode&amp;lt;cr&amp;gt;&quot;, desc = &quot;Toggle Claude&quot; },
    { &quot;&amp;lt;leader&amp;gt;af&quot;, &quot;&amp;lt;cmd&amp;gt;ClaudeCodeFocus&amp;lt;cr&amp;gt;&quot;, desc = &quot;Focus Claude&quot; },
    { &quot;&amp;lt;leader&amp;gt;ar&quot;, &quot;&amp;lt;cmd&amp;gt;ClaudeCode --resume&amp;lt;cr&amp;gt;&quot;, desc = &quot;Resume Claude&quot; },
    { &quot;&amp;lt;leader&amp;gt;aC&quot;, &quot;&amp;lt;cmd&amp;gt;ClaudeCode --continue&amp;lt;cr&amp;gt;&quot;, desc = &quot;Continue Claude&quot; },
    { &quot;&amp;lt;leader&amp;gt;am&quot;, &quot;&amp;lt;cmd&amp;gt;ClaudeCodeSelectModel&amp;lt;cr&amp;gt;&quot;, desc = &quot;Select Claude model&quot; },
    { &quot;&amp;lt;leader&amp;gt;ab&quot;, &quot;&amp;lt;cmd&amp;gt;ClaudeCodeAdd %&amp;lt;cr&amp;gt;&quot;, desc = &quot;Add current buffer&quot; },
    { &quot;&amp;lt;leader&amp;gt;as&quot;, &quot;&amp;lt;cmd&amp;gt;ClaudeCodeSend&amp;lt;cr&amp;gt;&quot;, mode = &quot;v&quot;, desc = &quot;Send to Claude&quot; },
    {
      &quot;&amp;lt;leader&amp;gt;as&quot;,
      &quot;&amp;lt;cmd&amp;gt;ClaudeCodeTreeAdd&amp;lt;cr&amp;gt;&quot;,
      desc = &quot;Add file&quot;,
      ft = { &quot;NvimTree&quot;, &quot;neo-tree&quot;, &quot;oil&quot;, &quot;minifiles&quot;, &quot;netrw&quot; },
    },
    -- Diff management
    { &quot;&amp;lt;leader&amp;gt;aa&quot;, &quot;&amp;lt;cmd&amp;gt;ClaudeCodeDiffAccept&amp;lt;cr&amp;gt;&quot;, desc = &quot;Accept diff&quot; },
    { &quot;&amp;lt;leader&amp;gt;ad&quot;, &quot;&amp;lt;cmd&amp;gt;ClaudeCodeDiffDeny&amp;lt;cr&amp;gt;&quot;, desc = &quot;Deny diff&quot; },
  },
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;That&#39;s it! The plugin will auto-configure everything else.&lt;/p&gt; 
&lt;h2&gt;Requirements&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;Neovim &amp;gt;= 0.8.0&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code&quot;&gt;Claude Code CLI&lt;/a&gt; installed&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim&quot;&gt;folke/snacks.nvim&lt;/a&gt; for enhanced terminal support&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Local Installation Configuration&lt;/h2&gt; 
&lt;p&gt;If you&#39;ve used Claude Code&#39;s &lt;code&gt;migrate-installer&lt;/code&gt; command to move to a local installation, you&#39;ll need to configure the plugin to use the local path.&lt;/p&gt; 
&lt;h3&gt;What is a Local Installation?&lt;/h3&gt; 
&lt;p&gt;Claude Code offers a &lt;code&gt;claude migrate-installer&lt;/code&gt; command that:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Moves Claude Code from a global npm installation to &lt;code&gt;~/.claude/local/&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Avoids permission issues with system directories&lt;/li&gt; 
 &lt;li&gt;Creates shell aliases but these may not be available to Neovim&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Detecting Your Installation Type&lt;/h3&gt; 
&lt;p&gt;Check your installation type:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Check where claude command points
which claude

# Global installation shows: /usr/local/bin/claude (or similar)
# Local installation shows: alias to ~/.claude/local/claude

# Verify installation health
claude doctor
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Configuring for Local Installation&lt;/h3&gt; 
&lt;p&gt;If you have a local installation, configure the plugin with the direct path:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;{
  &quot;coder/claudecode.nvim&quot;,
  dependencies = { &quot;folke/snacks.nvim&quot; },
  opts = {
    terminal_cmd = &quot;~/.claude/local/claude&quot;, -- Point to local installation
  },
  config = true,
  keys = {
    -- Your keymaps here
  },
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;details&gt; 
 &lt;summary&gt;Native Binary Installation (Alpha)&lt;/summary&gt; 
 &lt;p&gt;Claude Code also offers an experimental native binary installation method currently in alpha testing. This provides a single executable with no Node.js dependencies.&lt;/p&gt; 
 &lt;h4&gt;Installation Methods&lt;/h4&gt; 
 &lt;p&gt;Install the native binary using one of these methods:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Fresh install (recommended)
curl -fsSL claude.ai/install.sh | bash

# From existing Claude Code installation
claude install
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h4&gt;Platform Support&lt;/h4&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;strong&gt;macOS&lt;/strong&gt;: Full support for Intel and Apple Silicon&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Linux&lt;/strong&gt;: x64 and arm64 architectures&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Windows&lt;/strong&gt;: Via WSL (Windows Subsystem for Linux)&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;h4&gt;Benefits&lt;/h4&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;strong&gt;Zero Dependencies&lt;/strong&gt;: Single executable file with no external requirements&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Cross-Platform&lt;/strong&gt;: Consistent experience across operating systems&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Secure Installation&lt;/strong&gt;: Includes checksum verification and automatic cleanup&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;h4&gt;Configuring for Native Binary&lt;/h4&gt; 
 &lt;p&gt;The exact binary path depends on your shell integration. To find your installation:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Check where claude command points
which claude

# Verify installation type and health
claude doctor
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;Configure the plugin with the detected path:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;{
  &quot;coder/claudecode.nvim&quot;,
  dependencies = { &quot;folke/snacks.nvim&quot; },
  opts = {
    terminal_cmd = &quot;/path/to/your/claude&quot;, -- Use output from &#39;which claude&#39;
  },
  config = true,
  keys = {
    -- Your keymaps here
  },
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: If Claude Code was installed globally via npm, you can use the default configuration without specifying &lt;code&gt;terminal_cmd&lt;/code&gt;.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h2&gt;Quick Demo&lt;/h2&gt; 
&lt;pre&gt;&lt;code class=&quot;language-vim&quot;&gt;&quot; Launch Claude Code in a split
:ClaudeCode

&quot; Claude now sees your current file and selections in real-time!

&quot; Send visual selection as context
:&#39;&amp;lt;,&#39;&amp;gt;ClaudeCodeSend

&quot; Claude can open files, show diffs, and more
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Usage&lt;/h2&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;strong&gt;Launch Claude&lt;/strong&gt;: Run &lt;code&gt;:ClaudeCode&lt;/code&gt; to open Claude in a split terminal&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Send context&lt;/strong&gt;: 
  &lt;ul&gt; 
   &lt;li&gt;Select text in visual mode and use &lt;code&gt;&amp;lt;leader&amp;gt;as&lt;/code&gt; to send it to Claude&lt;/li&gt; 
   &lt;li&gt;In &lt;code&gt;nvim-tree&lt;/code&gt;/&lt;code&gt;neo-tree&lt;/code&gt;/&lt;code&gt;oil.nvim&lt;/code&gt;/&lt;code&gt;mini.nvim&lt;/code&gt;, press &lt;code&gt;&amp;lt;leader&amp;gt;as&lt;/code&gt; on a file to add it to Claude&#39;s context&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Let Claude work&lt;/strong&gt;: Claude can now: 
  &lt;ul&gt; 
   &lt;li&gt;See your current file and selections in real-time&lt;/li&gt; 
   &lt;li&gt;Open files in your editor&lt;/li&gt; 
   &lt;li&gt;Show diffs with proposed changes&lt;/li&gt; 
   &lt;li&gt;Access diagnostics and workspace info&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;h2&gt;Key Commands&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;:ClaudeCode&lt;/code&gt; - Toggle the Claude Code terminal window&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:ClaudeCodeFocus&lt;/code&gt; - Smart focus/toggle Claude terminal&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:ClaudeCodeSelectModel&lt;/code&gt; - Select Claude model and open terminal with optional arguments&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:ClaudeCodeSend&lt;/code&gt; - Send current visual selection to Claude&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:ClaudeCodeAdd &amp;lt;file-path&amp;gt; [start-line] [end-line]&lt;/code&gt; - Add specific file to Claude context with optional line range&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:ClaudeCodeDiffAccept&lt;/code&gt; - Accept diff changes&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:ClaudeCodeDiffDeny&lt;/code&gt; - Reject diff changes&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Working with Diffs&lt;/h2&gt; 
&lt;p&gt;When Claude proposes changes, the plugin opens a native Neovim diff view:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Accept&lt;/strong&gt;: &lt;code&gt;:w&lt;/code&gt; (save) or &lt;code&gt;&amp;lt;leader&amp;gt;aa&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Reject&lt;/strong&gt;: &lt;code&gt;:q&lt;/code&gt; or &lt;code&gt;&amp;lt;leader&amp;gt;ad&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;You can edit Claude&#39;s suggestions before accepting them.&lt;/p&gt; 
&lt;h2&gt;How It Works&lt;/h2&gt; 
&lt;p&gt;This plugin creates a WebSocket server that Claude Code CLI connects to, implementing the same protocol as the official VS Code extension. When you launch Claude, it automatically detects Neovim and gains full access to your editor.&lt;/p&gt; 
&lt;p&gt;The protocol uses a WebSocket-based variant of MCP (Model Context Protocol) that:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;Creates a WebSocket server on a random port&lt;/li&gt; 
 &lt;li&gt;Writes a lock file to &lt;code&gt;~/.claude/ide/[port].lock&lt;/code&gt; (or &lt;code&gt;$CLAUDE_CONFIG_DIR/ide/[port].lock&lt;/code&gt; if &lt;code&gt;CLAUDE_CONFIG_DIR&lt;/code&gt; is set) with connection info&lt;/li&gt; 
 &lt;li&gt;Sets environment variables that tell Claude where to connect&lt;/li&gt; 
 &lt;li&gt;Implements MCP tools that Claude can call&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;📖 &lt;strong&gt;&lt;a href=&quot;https://raw.githubusercontent.com/coder/claudecode.nvim/main/STORY.md&quot;&gt;Read the full reverse-engineering story →&lt;/a&gt;&lt;/strong&gt; 🔧 &lt;strong&gt;&lt;a href=&quot;https://raw.githubusercontent.com/coder/claudecode.nvim/main/PROTOCOL.md&quot;&gt;Complete protocol documentation →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;h2&gt;Architecture&lt;/h2&gt; 
&lt;p&gt;Built with pure Lua and zero external dependencies:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;WebSocket Server&lt;/strong&gt; - RFC 6455 compliant implementation using &lt;code&gt;vim.loop&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;MCP Protocol&lt;/strong&gt; - Full JSON-RPC 2.0 message handling&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Lock File System&lt;/strong&gt; - Enables Claude CLI discovery&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Selection Tracking&lt;/strong&gt; - Real-time context updates&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Native Diff Support&lt;/strong&gt; - Seamless file comparison&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;For deep technical details, see &lt;a href=&quot;https://raw.githubusercontent.com/coder/claudecode.nvim/main/ARCHITECTURE.md&quot;&gt;ARCHITECTURE.md&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Advanced Configuration&lt;/h2&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;{
  &quot;coder/claudecode.nvim&quot;,
  dependencies = { &quot;folke/snacks.nvim&quot; },
  opts = {
    -- Server Configuration
    port_range = { min = 10000, max = 65535 },
    auto_start = true,
    log_level = &quot;info&quot;, -- &quot;trace&quot;, &quot;debug&quot;, &quot;info&quot;, &quot;warn&quot;, &quot;error&quot;
    terminal_cmd = nil, -- Custom terminal command (default: &quot;claude&quot;)
                        -- For local installations: &quot;~/.claude/local/claude&quot;
                        -- For native binary: use output from &#39;which claude&#39;

    -- Send/Focus Behavior
    -- When true, successful sends will focus the Claude terminal if already connected
    focus_after_send = false,

    -- Selection Tracking
    track_selection = true,
    visual_demotion_delay_ms = 50,

    -- Terminal Configuration
    terminal = {
      split_side = &quot;right&quot;, -- &quot;left&quot; or &quot;right&quot;
      split_width_percentage = 0.30,
      provider = &quot;auto&quot;, -- &quot;auto&quot;, &quot;snacks&quot;, &quot;native&quot;, &quot;external&quot;, &quot;none&quot;, or custom provider table
      auto_close = true,
      snacks_win_opts = {}, -- Opts to pass to `Snacks.terminal.open()` - see Floating Window section below

      -- Provider-specific options
      provider_opts = {
        -- Command for external terminal provider. Can be:
        -- 1. String with %s placeholder: &quot;alacritty -e %s&quot; (backward compatible)
        -- 2. String with two %s placeholders: &quot;alacritty --working-directory %s -e %s&quot; (cwd, command)
        -- 3. Function returning command: function(cmd, env) return &quot;alacritty -e &quot; .. cmd end
        external_terminal_cmd = nil,
      },
    },

    -- Diff Integration
    diff_opts = {
      layout = &quot;vertical&quot;, -- &quot;vertical&quot; or &quot;horizontal&quot;
      open_in_new_tab = false,
      keep_terminal_focus = false, -- If true, moves focus back to terminal after diff opens
      hide_terminal_in_new_tab = false,
      -- on_new_file_reject = &quot;keep_empty&quot;, -- &quot;keep_empty&quot; or &quot;close_window&quot;

      -- Legacy aliases (still supported):
      -- vertical_split = true,
      -- open_in_current_tab = true,
    },
  },
  keys = {
    -- Your keymaps here
  },
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Working Directory Control&lt;/h3&gt; 
&lt;p&gt;You can fix the Claude terminal&#39;s working directory regardless of &lt;code&gt;autochdir&lt;/code&gt; and buffer-local cwd changes. Options (precedence order):&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;cwd_provider(ctx)&lt;/code&gt;: function that returns a directory string. Receives &lt;code&gt;{ file, file_dir, cwd }&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;cwd&lt;/code&gt;: static path to use as working directory.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;git_repo_cwd = true&lt;/code&gt;: resolves git root from the current file directory (or cwd if no file).&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Examples:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&quot;claudecode&quot;).setup({
  -- Top-level aliases are supported and forwarded to terminal config
  git_repo_cwd = true,
})

require(&quot;claudecode&quot;).setup({
  terminal = {
    cwd = vim.fn.expand(&quot;~/projects/my-app&quot;),
  },
})

require(&quot;claudecode&quot;).setup({
  terminal = {
    cwd_provider = function(ctx)
      -- Prefer repo root; fallback to file&#39;s directory
      local cwd = require(&quot;claudecode.cwd&quot;).git_root(ctx.file_dir or ctx.cwd) or ctx.file_dir or ctx.cwd
      return cwd
    end,
  },
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Floating Window Configuration&lt;/h2&gt; 
&lt;p&gt;The &lt;code&gt;snacks_win_opts&lt;/code&gt; configuration allows you to create floating Claude Code terminals with custom positioning, sizing, and key bindings. Here are several practical examples:&lt;/p&gt; 
&lt;h3&gt;Basic Floating Window with Ctrl+, Toggle&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;local toggle_key = &quot;&amp;lt;C-,&amp;gt;&quot;
return {
  {
    &quot;coder/claudecode.nvim&quot;,
    dependencies = { &quot;folke/snacks.nvim&quot; },
    keys = {
      { toggle_key, &quot;&amp;lt;cmd&amp;gt;ClaudeCodeFocus&amp;lt;cr&amp;gt;&quot;, desc = &quot;Claude Code&quot;, mode = { &quot;n&quot;, &quot;x&quot; } },
    },
    opts = {
      terminal = {
        ---@module &quot;snacks&quot;
        ---@type snacks.win.Config|{}
        snacks_win_opts = {
          position = &quot;float&quot;,
          width = 0.9,
          height = 0.9,
          keys = {
            claude_hide = {
              toggle_key,
              function(self)
                self:hide()
              end,
              mode = &quot;t&quot;,
              desc = &quot;Hide&quot;,
            },
          },
        },
      },
    },
  },
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;details&gt; 
 &lt;summary&gt;Alternative with Meta+, (Alt+,) Toggle&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;local toggle_key = &quot;&amp;lt;M-,&amp;gt;&quot;  -- Alt/Meta + comma
return {
  {
    &quot;coder/claudecode.nvim&quot;,
    dependencies = { &quot;folke/snacks.nvim&quot; },
    keys = {
      { toggle_key, &quot;&amp;lt;cmd&amp;gt;ClaudeCodeFocus&amp;lt;cr&amp;gt;&quot;, desc = &quot;Claude Code&quot;, mode = { &quot;n&quot;, &quot;x&quot; } },
    },
    opts = {
      terminal = {
        snacks_win_opts = {
          position = &quot;float&quot;,
          width = 0.8,
          height = 0.8,
          border = &quot;rounded&quot;,
          keys = {
            claude_hide = { toggle_key, function(self) self:hide() end, mode = &quot;t&quot;, desc = &quot;Hide&quot; },
          },
        },
      },
    },
  },
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;Centered Floating Window with Custom Styling&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&quot;claudecode&quot;).setup({
  terminal = {
    snacks_win_opts = {
      position = &quot;float&quot;,
      width = 0.6,
      height = 0.6,
      border = &quot;double&quot;,
      backdrop = 80,
      keys = {
        claude_hide = { &quot;&amp;lt;Esc&amp;gt;&quot;, function(self) self:hide() end, mode = &quot;t&quot;, desc = &quot;Hide&quot; },
        claude_close = { &quot;q&quot;, &quot;close&quot;, mode = &quot;n&quot;, desc = &quot;Close&quot; },
      },
    },
  },
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;Multiple Key Binding Options&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;{
  &quot;coder/claudecode.nvim&quot;,
  dependencies = { &quot;folke/snacks.nvim&quot; },
  keys = {
    { &quot;&amp;lt;C-,&amp;gt;&quot;, &quot;&amp;lt;cmd&amp;gt;ClaudeCodeFocus&amp;lt;cr&amp;gt;&quot;, desc = &quot;Claude Code (Ctrl+,)&quot;, mode = { &quot;n&quot;, &quot;x&quot; } },
    { &quot;&amp;lt;M-,&amp;gt;&quot;, &quot;&amp;lt;cmd&amp;gt;ClaudeCodeFocus&amp;lt;cr&amp;gt;&quot;, desc = &quot;Claude Code (Alt+,)&quot;, mode = { &quot;n&quot;, &quot;x&quot; } },
    { &quot;&amp;lt;leader&amp;gt;tc&quot;, &quot;&amp;lt;cmd&amp;gt;ClaudeCodeFocus&amp;lt;cr&amp;gt;&quot;, desc = &quot;Toggle Claude&quot;, mode = { &quot;n&quot;, &quot;x&quot; } },
  },
  opts = {
    terminal = {
      snacks_win_opts = {
        position = &quot;float&quot;,
        width = 0.85,
        height = 0.85,
        border = &quot;rounded&quot;,
        keys = {
          -- Multiple ways to hide from terminal mode
          claude_hide_ctrl = { &quot;&amp;lt;C-,&amp;gt;&quot;, function(self) self:hide() end, mode = &quot;t&quot;, desc = &quot;Hide (Ctrl+,)&quot; },
          claude_hide_alt = { &quot;&amp;lt;M-,&amp;gt;&quot;, function(self) self:hide() end, mode = &quot;t&quot;, desc = &quot;Hide (Alt+,)&quot; },
          claude_hide_esc = { &quot;&amp;lt;C-\\&amp;gt;&amp;lt;C-n&amp;gt;&quot;, function(self) self:hide() end, mode = &quot;t&quot;, desc = &quot;Hide (Ctrl+\\)&quot; },
        },
      },
    },
  },
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;Window Position Variations&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- Bottom floating (like a drawer)
snacks_win_opts = {
  position = &quot;bottom&quot;,
  height = 0.4,
  width = 1.0,
  border = &quot;single&quot;,
}

-- Side floating panel
snacks_win_opts = {
  position = &quot;right&quot;,
  width = 0.4,
  height = 1.0,
  border = &quot;rounded&quot;,
}

-- Small centered popup
snacks_win_opts = {
  position = &quot;float&quot;,
  width = 120,  -- Fixed width in columns
  height = 30,  -- Fixed height in rows
  border = &quot;double&quot;,
  backdrop = 90,
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;p&gt;For complete configuration options, see:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/terminal.md&quot;&gt;Snacks.nvim Terminal Documentation&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/win.md&quot;&gt;Snacks.nvim Window Documentation&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Terminal Providers&lt;/h2&gt; 
&lt;h3&gt;None (No-Op) Provider&lt;/h3&gt; 
&lt;p&gt;Run Claude Code without any terminal management inside Neovim. This is useful for advanced setups where you manage the CLI externally (tmux, kitty, separate terminal windows) while still using the WebSocket server and tools.&lt;/p&gt; 
&lt;p&gt;You have to take care of launching CC and connecting it to the IDE yourself. (e.g. &lt;code&gt;claude --ide&lt;/code&gt; or launching claude and then selecting the IDE using the &lt;code&gt;/ide&lt;/code&gt; command)&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;{
  &quot;coder/claudecode.nvim&quot;,
  opts = {
    terminal = {
      provider = &quot;none&quot;, -- no UI actions; server + tools remain available
    },
  },
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Notes:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;No windows/buffers are created. &lt;code&gt;:ClaudeCode&lt;/code&gt; and related commands will not open anything.&lt;/li&gt; 
 &lt;li&gt;The WebSocket server still starts and broadcasts work as usual. Launch the Claude CLI externally when desired.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;External Terminal Provider&lt;/h3&gt; 
&lt;p&gt;Run Claude Code in a separate terminal application outside of Neovim:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- Using a string template (simple)
{
  &quot;coder/claudecode.nvim&quot;,
  opts = {
    terminal = {
      provider = &quot;external&quot;,
      provider_opts = {
        external_terminal_cmd = &quot;alacritty -e %s&quot;, -- %s is replaced with claude command
        -- Or with working directory: &quot;alacritty --working-directory %s -e %s&quot; (first %s = cwd, second %s = command)
      },
    },
  },
}

-- Using a function for dynamic command generation (advanced)
{
  &quot;coder/claudecode.nvim&quot;,
  opts = {
    terminal = {
      provider = &quot;external&quot;,
      provider_opts = {
        external_terminal_cmd = function(cmd, env)
          -- You can build complex commands based on environment or conditions
          if vim.fn.has(&quot;mac&quot;) == 1 then
            return { &quot;osascript&quot;, &quot;-e&quot;, string.format(&#39;tell app &quot;Terminal&quot; to do script &quot;%s&quot;&#39;, cmd) }
          else
            return &quot;alacritty -e &quot; .. cmd
          end
        end,
      },
    },
  },
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Custom Terminal Providers&lt;/h3&gt; 
&lt;p&gt;You can create custom terminal providers by passing a table with the required functions instead of a string provider name:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&quot;claudecode&quot;).setup({
  terminal = {
    provider = {
      -- Required functions
      setup = function(config)
        -- Initialize your terminal provider
      end,

      open = function(cmd_string, env_table, effective_config, focus)
        -- Open terminal with command and environment
        -- focus parameter controls whether to focus terminal (defaults to true)
      end,

      close = function()
        -- Close the terminal
      end,

      simple_toggle = function(cmd_string, env_table, effective_config)
        -- Simple show/hide toggle
      end,

      focus_toggle = function(cmd_string, env_table, effective_config)
        -- Smart toggle: focus terminal if not focused, hide if focused
      end,

      get_active_bufnr = function()
        -- Return terminal buffer number or nil
        return 123 -- example
      end,

      is_available = function()
        -- Return true if provider can be used
        return true
      end,

      -- Optional functions (auto-generated if not provided)
      toggle = function(cmd_string, env_table, effective_config)
        -- Defaults to calling simple_toggle for backward compatibility
      end,

      _get_terminal_for_test = function()
        -- For testing only, defaults to return nil
        return nil
      end,
    },
  },
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Custom Provider Example&lt;/h3&gt; 
&lt;p&gt;Here&#39;s a complete example using a hypothetical &lt;code&gt;my_terminal&lt;/code&gt; plugin:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;local my_terminal_provider = {
  setup = function(config)
    -- Store config for later use
    self.config = config
  end,

  open = function(cmd_string, env_table, effective_config, focus)
    if focus == nil then focus = true end

    local my_terminal = require(&quot;my_terminal&quot;)
    my_terminal.open({
      cmd = cmd_string,
      env = env_table,
      width = effective_config.split_width_percentage,
      side = effective_config.split_side,
      focus = focus,
    })
  end,

  close = function()
    require(&quot;my_terminal&quot;).close()
  end,

  simple_toggle = function(cmd_string, env_table, effective_config)
    require(&quot;my_terminal&quot;).toggle()
  end,

  focus_toggle = function(cmd_string, env_table, effective_config)
    local my_terminal = require(&quot;my_terminal&quot;)
    if my_terminal.is_focused() then
      my_terminal.hide()
    else
      my_terminal.focus()
    end
  end,

  get_active_bufnr = function()
    return require(&quot;my_terminal&quot;).get_bufnr()
  end,

  is_available = function()
    local ok, _ = pcall(require, &quot;my_terminal&quot;)
    return ok
  end,
}

require(&quot;claudecode&quot;).setup({
  terminal = {
    provider = my_terminal_provider,
  },
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The custom provider will automatically fall back to the native provider if validation fails or &lt;code&gt;is_available()&lt;/code&gt; returns false.&lt;/p&gt; 
&lt;p&gt;Note: If your command or working directory may contain spaces or special characters, prefer returning a table of args from a function (e.g., &lt;code&gt;{ &quot;alacritty&quot;, &quot;--working-directory&quot;, cwd, &quot;-e&quot;, &quot;claude&quot;, &quot;--help&quot; }&lt;/code&gt;) to avoid shell-quoting issues.&lt;/p&gt; 
&lt;h2&gt;Community Extensions&lt;/h2&gt; 
&lt;p&gt;The following are third-party community extensions that complement claudecode.nvim. &lt;strong&gt;These extensions are not affiliated with Coder and are maintained independently by community members.&lt;/strong&gt; We do not ensure that these extensions work correctly or provide support for them.&lt;/p&gt; 
&lt;h3&gt;🔍 &lt;a href=&quot;https://github.com/pittcat/claude-fzf.nvim&quot;&gt;claude-fzf.nvim&lt;/a&gt;&lt;/h3&gt; 
&lt;p&gt;Integrates fzf-lua&#39;s file selection with claudecode.nvim&#39;s context management:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Batch file selection with fzf-lua multi-select&lt;/li&gt; 
 &lt;li&gt;Smart search integration with grep → Claude&lt;/li&gt; 
 &lt;li&gt;Tree-sitter based context extraction&lt;/li&gt; 
 &lt;li&gt;Support for files, buffers, git files&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;📚 &lt;a href=&quot;https://github.com/pittcat/claude-fzf-history.nvim&quot;&gt;claude-fzf-history.nvim&lt;/a&gt;&lt;/h3&gt; 
&lt;p&gt;Provides convenient Claude interaction history management and access for enhanced workflow continuity.&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;: These community extensions are developed and maintained by independent contributors. The authors and their extensions are not affiliated with Coder. Use at your own discretion and refer to their respective repositories for installation instructions, documentation, and support.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h2&gt;Auto-Save Plugin Issues&lt;/h2&gt; 
&lt;p&gt;Using auto-save plugins can cause diff windows opened by Claude to immediately accept without waiting for input. You can avoid this using a custom condition:&lt;/p&gt; 
&lt;details&gt; 
 &lt;summary&gt;Pocco81/auto-save.nvim&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;opts = {
  -- ... other options
  condition = function(buf)
    local fn = vim.fn
    local utils = require(&quot;auto-save.utils.data&quot;)

    -- First check the default conditions
    if not (fn.getbufvar(buf, &quot;&amp;amp;modifiable&quot;) == 1 and utils.not_in(fn.getbufvar(buf, &quot;&amp;amp;filetype&quot;), {})) then
      return false
    end

    -- Exclude claudecode diff buffers by buffer name patterns
    local bufname = vim.api.nvim_buf_get_name(buf)
    if bufname:match(&quot;%(proposed%)&quot;) or
       bufname:match(&quot;%(NEW FILE %- proposed%)&quot;) or
       bufname:match(&quot;%(New%)&quot;) then
      return false
    end

    -- Exclude by buffer variables (claudecode sets these)
    if vim.b[buf].claudecode_diff_tab_name or
       vim.b[buf].claudecode_diff_new_win or
       vim.b[buf].claudecode_diff_target_win then
      return false
    end

    -- Exclude by buffer type (claudecode diff buffers use &quot;acwrite&quot;)
    local buftype = fn.getbufvar(buf, &quot;&amp;amp;buftype&quot;)
    if buftype == &quot;acwrite&quot; then
      return false
    end

    return true -- Safe to auto-save
  end,
},
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;okuuva/auto-save.nvim&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;opts = {
  -- ... other options
  condition = function(buf)
    -- Exclude claudecode diff buffers by buffer name patterns
    local bufname = vim.api.nvim_buf_get_name(buf)
    if bufname:match(&#39;%(proposed%)&#39;) or bufname:match(&#39;%(NEW FILE %- proposed%)&#39;) or bufname:match(&#39;%(New%)&#39;) then
      return false
    end

    -- Exclude by buffer variables (claudecode sets these)
    if
      vim.b[buf].claudecode_diff_tab_name
      or vim.b[buf].claudecode_diff_new_win
      or vim.b[buf].claudecode_diff_target_win
    then
      return false
    end

    -- Exclude by buffer type (claudecode diff buffers use &quot;acwrite&quot;)
    local buftype = vim.fn.getbufvar(buf, &#39;&amp;amp;buftype&#39;)
    if buftype == &#39;acwrite&#39; then
      return false
    end

    return true -- Safe to auto-save
  end,
},
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;h2&gt;Troubleshooting&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Claude not connecting?&lt;/strong&gt; Check &lt;code&gt;:ClaudeCodeStatus&lt;/code&gt; and verify lock file exists in &lt;code&gt;~/.claude/ide/&lt;/code&gt; (or &lt;code&gt;$CLAUDE_CONFIG_DIR/ide/&lt;/code&gt; if &lt;code&gt;CLAUDE_CONFIG_DIR&lt;/code&gt; is set)&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Need debug logs?&lt;/strong&gt; Set &lt;code&gt;log_level = &quot;debug&quot;&lt;/code&gt; in opts&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Terminal issues?&lt;/strong&gt; Try &lt;code&gt;provider = &quot;native&quot;&lt;/code&gt; if using snacks.nvim&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Local installation not working?&lt;/strong&gt; If you used &lt;code&gt;claude migrate-installer&lt;/code&gt;, set &lt;code&gt;terminal_cmd = &quot;~/.claude/local/claude&quot;&lt;/code&gt; in your config. Check &lt;code&gt;which claude&lt;/code&gt; vs &lt;code&gt;ls ~/.claude/local/claude&lt;/code&gt; to verify your installation type.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Native binary installation not working?&lt;/strong&gt; If you used the alpha native binary installer, run &lt;code&gt;claude doctor&lt;/code&gt; to verify installation health and use &lt;code&gt;which claude&lt;/code&gt; to find the binary path. Set &lt;code&gt;terminal_cmd = &quot;/path/to/claude&quot;&lt;/code&gt; with the detected path in your config.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Contributing&lt;/h2&gt; 
&lt;p&gt;See &lt;a href=&quot;https://raw.githubusercontent.com/coder/claudecode.nvim/main/DEVELOPMENT.md&quot;&gt;DEVELOPMENT.md&lt;/a&gt; for build instructions and development guidelines. Tests can be run with &lt;code&gt;make test&lt;/code&gt;.&lt;/p&gt; 
&lt;h2&gt;License&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/coder/claudecode.nvim/main/LICENSE&quot;&gt;MIT&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;Acknowledgements&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code&quot;&gt;Claude Code CLI&lt;/a&gt; by Anthropic&lt;/li&gt; 
 &lt;li&gt;Inspired by analyzing the official VS Code extension&lt;/li&gt; 
 &lt;li&gt;Built with assistance from AI (how meta!)&lt;/li&gt; 
&lt;/ul&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/49e5d2614053b90160c3224ba77c0f09023dada31ba0957423357cc02c3b8030/coder/claudecode.nvim" medium="image" />
      
    </item>
    
    <item>
      <title>LazyVim/starter</title>
      <link>https://github.com/LazyVim/starter</link>
      <description>&lt;p&gt;Starter template for LazyVim&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;💤 LazyVim&lt;/h1&gt; 
&lt;p&gt;A starter template for &lt;a href=&quot;https://github.com/LazyVim/LazyVim&quot;&gt;LazyVim&lt;/a&gt;. Refer to the &lt;a href=&quot;https://lazyvim.github.io/installation&quot;&gt;documentation&lt;/a&gt; to get started.&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/8a7a670ae1c0350198f4c64a8ba2ac8d879bfb640b1a8698bd0b95cff7035feb/LazyVim/starter" medium="image" />
      
    </item>
    
    <item>
      <title>GustavEikaas/easy-dotnet.nvim</title>
      <link>https://github.com/GustavEikaas/easy-dotnet.nvim</link>
      <description>&lt;p&gt;A fully self-contained Neovim plugin for .NET development. Ships with integrated Roslyn LSP and netcoredbg debugging, offering fast, dependency-free setup and smooth build/test workflows for C# across .NET Core and .NET Framework.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;a href=&quot;https://git.io/typing-svg&quot;&gt;&lt;img src=&quot;https://readme-typing-svg.demolab.com?font=Fira+Code&amp;amp;size=32&amp;amp;pause=1000&amp;amp;width=435&amp;amp;lines=easy-dotnet.nvim&quot; alt=&quot;Typing SVG&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://dotfyle.com/plugins/GustavEikaas/easy-dotnet.nvim&quot;&gt; &lt;img src=&quot;https://dotfyle.com/plugins/GustavEikaas/easy-dotnet.nvim/shield?style=flat&quot; /&gt; &lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;Simplifying .NET development in Neovim&lt;/h2&gt; 
&lt;p&gt;Are you a .NET developer looking to harness the power of Neovim for your daily coding tasks? Look no further! easy-dotnet.nvim is here to streamline your workflow and make .NET development in Neovim a breeze.&lt;/p&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-important&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-report mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Important&lt;/p&gt;
 &lt;p&gt;This plugin now uses &lt;a href=&quot;https://github.com/GustavEikaas/easy-dotnet-server&quot;&gt;easy-dotnet-server&lt;/a&gt; to enable more advanced functionality. As a result, the server may require more frequent updates. Run &lt;code&gt;:Dotnet _server update&lt;/code&gt; or &lt;code&gt;dotnet tool install -g EasyDotnet&lt;/code&gt; to update it. The plugin will attempt to detect when the server is outdated and notify you. If you encounter any issues, please don&#39;t hesitate to file an issue.&lt;/p&gt; 
&lt;/div&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;📰 &lt;strong&gt;Stay updated:&lt;/strong&gt; Major updates and new features are announced in &lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/news.md&quot;&gt;&lt;code&gt;news.md&lt;/code&gt;&lt;/a&gt;.&lt;br /&gt; Give it a read periodically to stay in sync with the latest capabilities!&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h2&gt;Motivation&lt;/h2&gt; 
&lt;p&gt;As a developer transitioning from Rider to Neovim, I found myself missing the simplicity of running projects with just a single button click. Tired of typing out lengthy terminal commands for common tasks like running, testing, and managing user secrets, I decided to create easy-dotnet.nvim. This plugin aims to bridge the gap between the convenience of IDEs like Rider and the flexibility of Neovim.&lt;/p&gt; 
&lt;h1&gt;Table of Contents&lt;/h1&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#simplifying-net-development-in-neovim&quot;&gt;Simplifying .NET development in Neovim&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#motivation&quot;&gt;Motivation&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#features&quot;&gt;Features&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#requirements&quot;&gt;Requirements&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#setup&quot;&gt;Setup&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#without-options&quot;&gt;Without options&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#with-options&quot;&gt;With options&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#lualine-config&quot;&gt;Lualine config&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#commands&quot;&gt;Commands&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#lua-functions&quot;&gt;Lua functions&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#vim-commands&quot;&gt;Vim commands&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#roslyn-lsp&quot;&gt;Roslyn LSP&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#test-runner&quot;&gt;Test runner&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#keymaps&quot;&gt;Keymaps&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#debugging-tests&quot;&gt;Debugging tests&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#running-tests-from-buffer&quot;&gt;Running tests from buffer&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#project-view&quot;&gt;Project view&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#features-1&quot;&gt;Features&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#keymaps-1&quot;&gt;Keymaps&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#workspace-diagnostics&quot;&gt;Workspace Diagnostics&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#commands-1&quot;&gt;Commands&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#configuration&quot;&gt;Configuration&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#features-2&quot;&gt;Features&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#outdated&quot;&gt;Outdated&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#add&quot;&gt;Add&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#add-package&quot;&gt;Add package&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#project-mappings&quot;&gt;Project mappings&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#add-reference&quot;&gt;Add reference&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#package-autocomplete&quot;&gt;Package autocomplete&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#net-framework&quot;&gt;.NET Framework&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#requirements-1&quot;&gt;Requirements&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#new&quot;&gt;New&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#project&quot;&gt;Project&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#configuration-file&quot;&gt;Configuration file&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#integrating-with-nvim-tree&quot;&gt;Integrating with nvim-tree&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#integrating-with-neo-tree&quot;&gt;Integrating with neo-tree&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#integrating-with-mini-files&quot;&gt;Integrating with mini files&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#integrating-with-snacks-explorer&quot;&gt;Integrating with snacks explorer&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#entityframework&quot;&gt;EntityFramework&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#requirements-2&quot;&gt;Requirements&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#database&quot;&gt;Database&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#migrations&quot;&gt;Migrations&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#language-injections&quot;&gt;Language injections&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#showcase&quot;&gt;Showcase&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#requirements-3&quot;&gt;Requirements&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#support-matrix&quot;&gt;Support matrix&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#nvim-dap-configuration&quot;&gt;Nvim-dap configuration&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#troubleshooting&quot;&gt;Troubleshooting&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#highlight-groups&quot;&gt;Highlight groups&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#local-development&quot;&gt;Local Development&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#star-history&quot;&gt;Star History&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#contributors&quot;&gt;Contributors&lt;/a&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;h2&gt;Features&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;Roslyn LSP support out of the box — powered by the official .NET Roslyn language server (see &lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/docs/lsp.md&quot;&gt;LSP details&lt;/a&gt;)&lt;/li&gt; 
 &lt;li&gt;Debugger configured out of the box- powered by &lt;a href=&quot;https://github.com/samsung/netcoredbg&quot;&gt;netcoredbg&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;Solution, slnx, csproj and fsproj support: Whether its a single project or a solution containing multiple projects easy-dotnet has you covered.&lt;/li&gt; 
 &lt;li&gt;Action Commands: Execute common tasks like building, running, testing, cleaning and restoring with ease.&lt;/li&gt; 
 &lt;li&gt;User Secrets Management: Edit, create, and preview .NET user secrets directly within Neovim.&lt;/li&gt; 
 &lt;li&gt;Test runner: Test runner similiar to the one you find in Rider.&lt;/li&gt; 
 &lt;li&gt;Workspace diagnostics: Get diagnostic errors and warnings from your entire solution or individual projects&lt;/li&gt; 
 &lt;li&gt;Outdated command: Makes checking outdated packages a breeze using virtual text&lt;/li&gt; 
 &lt;li&gt;(csproj/fsproj) mappings: Keymappings for .csproj and .fsproj files are automatically available&lt;/li&gt; 
 &lt;li&gt;Auto bootstrap namespace: Automatically inserts namespace and class/interface when opening a newly created &lt;code&gt;.cs&lt;/code&gt; file. (also checks clipboard for json to create class from)&lt;/li&gt; 
 &lt;li&gt;Create dotnet templates like with &lt;code&gt;dotnet new&lt;/code&gt;, automatically adding them to the current solution&lt;/li&gt; 
 &lt;li&gt;Package autocomplete inside .csproj and .fsproj files &lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/#package-autocomplete&quot;&gt;Check it out&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.jetbrains.com/help/rider/Language_Injections.html#use-comments&quot;&gt;Rider-like&lt;/a&gt; syntax highlighting for injected languages (sql, json and xml) based on comments&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Requirements&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;Neovim needs to be built with &lt;strong&gt;LuaJIT&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.nuget.org/packages/EasyDotnet&quot;&gt;EasyDotnet&lt;/a&gt; &lt;code&gt;dotnet tool install -g EasyDotnet&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Although not &lt;em&gt;required&lt;/em&gt; by the plugin, it is highly recommended to install one of:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/nvim-telescope/telescope.nvim&quot;&gt;telescope.nvim&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/ibhagwan/fzf-lua&quot;&gt;fzf-lua&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim&quot;&gt;snacks.nvim&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Setup&lt;/h2&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-important&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-report mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Important&lt;/p&gt;
 &lt;p&gt;Remember to also setup the cmp source for autocomplete&lt;/p&gt; 
&lt;/div&gt; 
&lt;h3&gt;Without options&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- lazy.nvim
{
  &quot;GustavEikaas/easy-dotnet.nvim&quot;,
  dependencies = { &quot;nvim-lua/plenary.nvim&quot;, &#39;folke/snacks.nvim&#39;, },
  config = function()
    require(&quot;easy-dotnet&quot;).setup()
  end
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;With options&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- lazy.nvim
{
  &quot;GustavEikaas/easy-dotnet.nvim&quot;,
  -- &#39;nvim-telescope/telescope.nvim&#39; or &#39;ibhagwan/fzf-lua&#39; or &#39;folke/snacks.nvim&#39;
  -- are highly recommended for a better experience
  dependencies = { &quot;nvim-lua/plenary.nvim&quot;, &#39;mfussenegger/nvim-dap&#39;, &#39;folke/snacks.nvim&#39;, },
  config = function()
    local dotnet = require(&quot;easy-dotnet&quot;)
    -- Options are not required
    dotnet.setup({
     managed_terminal = {
       auto_hide = true, -- auto hides terminal if exit code is 0
       auto_hide_delay = 1000, -- delay before auto hiding, 0 = instant
     },
      -- Optional configuration for external terminals (matches nvim-dap structure)
      external_terminal = nil,
      lsp = {
        enabled = true, -- Enable builtin roslyn lsp
        set_fold_expr = false,
        preload_roslyn = true, -- Start loading roslyn before any buffer is opened
        roslynator_enabled = true, -- Automatically enable roslynator analyzer
        easy_dotnet_analyzer_enabled = true, -- Enable roslyn analyzer from easy-dotnet-server
        auto_refresh_codelens = true,
        analyzer_assemblies = {}, -- Any additional roslyn analyzers you might use like SonarAnalyzer.CSharp
        config = {},
      },
      debugger = {
        -- Path to custom coreclr DAP adapter
        -- easy-dotnet-server falls back to its own netcoredbg binary if bin_path is nil
        bin_path = nil,
        console = &quot;integratedTerminal&quot;, -- Controls where the target app runs: &quot;integratedTerminal&quot; (Neovim buffer) or &quot;externalTerminal&quot; (OS window)
        apply_value_converters = true,
        auto_register_dap = true,
        mappings = {
          open_variable_viewer = { lhs = &quot;T&quot;, desc = &quot;open variable viewer&quot; },
        },
      },
      ---@type TestRunnerOptions
      test_runner = {
        auto_start_testrunner = true,
        hide_legend = false,
        ---@type &quot;split&quot; | &quot;vsplit&quot; | &quot;float&quot; | &quot;buf&quot;
        viewmode = &quot;float&quot;,
        ---@type number|nil
        vsplit_width = nil,
        ---@type string|nil &quot;topleft&quot; | &quot;topright&quot; 
        vsplit_pos = nil,
        icons = {
          passed = &quot;&quot;,
          skipped = &quot;&quot;,
          failed = &quot;&quot;,
          success = &quot;&quot;,
          reload = &quot;&quot;,
          test = &quot;&quot;,
          sln = &quot;󰘐&quot;,
          project = &quot;󰘐&quot;,
          dir = &quot;&quot;,
          package = &quot;&quot;,
          class = &quot;&quot;,
          build_failed = &quot;󰒡&quot;,
        },
        mappings = {
          run_test_from_buffer = { lhs = &quot;&amp;lt;leader&amp;gt;r&quot;, desc = &quot;run test from buffer&quot; },
          get_build_errors = { lhs = &quot;&amp;lt;leader&amp;gt;e&quot;, desc = &quot;get build errors&quot; },
          peek_stack_trace_from_buffer = { lhs = &quot;&amp;lt;leader&amp;gt;p&quot;, desc = &quot;peek stack trace from buffer&quot; },
          debug_test_from_buffer = { lhs = &quot;&amp;lt;leader&amp;gt;d&quot;, desc = &quot;run test from buffer&quot; },
          debug_test = { lhs = &quot;&amp;lt;leader&amp;gt;d&quot;, desc = &quot;debug test&quot; },
          go_to_file = { lhs = &quot;g&quot;, desc = &quot;go to file&quot; },
          run_all = { lhs = &quot;&amp;lt;leader&amp;gt;R&quot;, desc = &quot;run all tests&quot; },
          run = { lhs = &quot;&amp;lt;leader&amp;gt;r&quot;, desc = &quot;run test&quot; },
          peek_stacktrace = { lhs = &quot;&amp;lt;leader&amp;gt;p&quot;, desc = &quot;peek stacktrace of failed test&quot; },
          expand = { lhs = &quot;o&quot;, desc = &quot;expand&quot; },
          expand_node = { lhs = &quot;E&quot;, desc = &quot;expand node&quot; },
          collapse_all = { lhs = &quot;W&quot;, desc = &quot;collapse all&quot; },
          close = { lhs = &quot;q&quot;, desc = &quot;close testrunner&quot; },
          refresh_testrunner = { lhs = &quot;&amp;lt;C-r&amp;gt;&quot;, desc = &quot;refresh testrunner&quot; },
          cancel = { lhs = &quot;&amp;lt;C-c&amp;gt;&quot;, desc = &quot;cancel in-flight operation&quot; },
        }
      },
      new = {
        project = {
          prefix = &quot;sln&quot; -- &quot;sln&quot; | &quot;none&quot;
        }
      },
      csproj_mappings = true,
      fsproj_mappings = true,
      auto_bootstrap_namespace = {
          --block_scoped, file_scoped
          type = &quot;block_scoped&quot;,
          enabled = true,
          use_clipboard_json = {
            behavior = &quot;prompt&quot;, --&#39;auto&#39; | &#39;prompt&#39; | &#39;never&#39;,
            register = &quot;+&quot;, -- which register to check
          },
      },
      server = {
          ---@type nil | &quot;Off&quot; | &quot;Critical&quot; | &quot;Error&quot; | &quot;Warning&quot; | &quot;Information&quot; | &quot;Verbose&quot; | &quot;All&quot;
          log_level = nil,
      },
      -- choose which picker to use with the plugin
      -- possible values are &quot;telescope&quot; | &quot;fzf&quot; | &quot;snacks&quot; | &quot;basic&quot;
      -- if no picker is specified, the plugin will determine
      -- the available one automatically with this priority:
      --  snacks -&amp;gt; fzf -&amp;gt; telescope -&amp;gt;  basic
      picker = &quot;snacks&quot;,
      background_scanning = true,
      notifications = {
        --Set this to false if you have configured lualine to avoid double logging
        handler = function(start_event)
          local spinner = require(&quot;easy-dotnet.ui-modules.spinner&quot;).new()
          spinner:start_spinner(start_event.job.name)
          ---@param finished_event JobEvent
          return function(finished_event)
            spinner:stop_spinner(finished_event.result.msg, finished_event.result.level)
          end
        end,
      },
      diagnostics = {
        default_severity = &quot;error&quot;,
        setqflist = false,
      },
    })

    -- Example command
    vim.api.nvim_create_user_command(&#39;Secrets&#39;, function()
      dotnet.secrets()
    end, {})

    -- Example keybinding
    vim.keymap.set(&quot;n&quot;, &quot;&amp;lt;C-p&amp;gt;&quot;, function()
      dotnet.run_project()
    end)
  end
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Lualine config&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;local job_indicator = { require(&quot;easy-dotnet.ui-modules.jobs&quot;).lualine }

require(&quot;lualine&quot;).setup {
  sections = {
    -- ...
    lualine_a = { &quot;mode&quot;, job_indicator },
    -- ...
  },
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Commands&lt;/h2&gt; 
&lt;h3&gt;Lua functions&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;Legend&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;&amp;lt;TS&amp;gt;&lt;/code&gt; -&amp;gt; Telescope selector&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;&amp;lt;DArgs&amp;gt;&lt;/code&gt; -&amp;gt; Dotnet args (e.g &lt;code&gt;--no-build&lt;/code&gt;, &lt;code&gt;--configuration release&lt;/code&gt;). Always optional&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;&amp;lt;TS Default&amp;gt;&lt;/code&gt; -&amp;gt; Telescope selector but persists the selection for all future use&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;&amp;lt;sln&amp;gt;&lt;/code&gt; -&amp;gt; Solution file (in some cases .csproj or .fsproj is used as fallback if no .sln file exists)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;&lt;strong&gt;Function&lt;/strong&gt;&lt;/th&gt; 
   &lt;th&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.run_profile()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;dotnet run --project &amp;lt;TS&amp;gt; --launch-profile &amp;lt;TS&amp;gt;&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.run()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;dotnet run --project &amp;lt;TS&amp;gt; &amp;lt;DArgs&amp;gt;&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.run_default()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;dotnet run --project &amp;lt;TS Default&amp;gt; &amp;lt;DArgs&amp;gt;&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.run_profile_default()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;dotnet run --project &amp;lt;TS Default&amp;gt; --launch-profile &amp;lt;TS&amp;gt; &amp;lt;DArgs&amp;gt;&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.debug_profile()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;``&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.debug_attach()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;``&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.debug()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;``&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.debug_default()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;``&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.debug_profile_default()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;``&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.build()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;dotnet build &amp;lt;TS&amp;gt; &amp;lt;DArgs&amp;gt;&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.build_solution()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;dotnet build &amp;lt;sln&amp;gt; &amp;lt;DArgs&amp;gt;&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.build_solution_quickfix()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;dotnet build &amp;lt;sln&amp;gt; &amp;lt;DArgs&amp;gt;&lt;/code&gt; and opens build errors in the quickfix list&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.build_quickfix()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;dotnet build &amp;lt;TS&amp;gt; &amp;lt;DArgs&amp;gt;&lt;/code&gt; and opens build errors in the quickfix list&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.build_default()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;dotnet build &amp;lt;TS Default&amp;gt; &amp;lt;DArgs&amp;gt;&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.build_default_quickfix()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;dotnet build &amp;lt;TS Default&amp;gt; &amp;lt;DArgs&amp;gt;&lt;/code&gt; and opens build errors in the quickfix list&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.project_view()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Opens the project view&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.project_view_default()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Opens the project view for your default project&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.pack()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;dotnet pack -c release&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.push()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;dotnet pack and push&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.test()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;dotnet test &amp;lt;TS&amp;gt; &amp;lt;DArgs&amp;gt;&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.test_solution()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;dotnet test &amp;lt;TS&amp;gt; &amp;lt;DArgs&amp;gt;&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.test_default()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;dotnet test &amp;lt;TS Default&amp;gt; &amp;lt;DArgs&amp;gt;&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.watch()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;dotnet watch --project &amp;lt;TS&amp;gt; &amp;lt;DArgs&amp;gt;&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.watch_default()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;dotnet watch --project &amp;lt;TS Default&amp;gt; &amp;lt;DArgs&amp;gt;&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.restore()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;dotnet restore &amp;lt;sln&amp;gt; &amp;lt;Dargs&amp;gt;&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.clean()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;dotnet clean &amp;lt;sln&amp;gt; &amp;lt;DArgs&amp;gt;&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.remove_package()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.add_package()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.testrunner()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Shows or hides the testrunner&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.testrunner_refresh()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Refreshes the testrunner&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.testrunner_refresh_build()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Builds the sln, then refreshes the testrunner&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.is_dotnet_project()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Returns &lt;code&gt;true&lt;/code&gt; if a &lt;code&gt;.csproj&lt;/code&gt; or &lt;code&gt;.sln&lt;/code&gt; file is present in the current working directory or subfolders&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.try_get_selected_solution()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;If a solution is selected, returns &lt;code&gt;{ basename: string, path: string }&lt;/code&gt;, otherwise &lt;code&gt;nil&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.new()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Picker for creating a new template based on &lt;code&gt;Dotnet new&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.outdated()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Runs &lt;code&gt;Dotnet outdated&lt;/code&gt; in supported file types (&lt;code&gt;.csproj&lt;/code&gt;, &lt;code&gt;.fsproj&lt;/code&gt;, &lt;code&gt;Directory.Packages.props&lt;/code&gt;, &lt;code&gt;Packages.props&lt;/code&gt;, &lt;code&gt;Directory.Build.props&lt;/code&gt;) and displays virtual text with the latest package versions.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.solution_select(path: string)&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Manually set a solution file for the current working directory. Useful for non-standard layouts where the solution file is outside the normal search depth or in a different location.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.solution_add()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;dotnet sln &amp;lt;sln&amp;gt; add &amp;lt;TS&amp;gt;&lt;/code&gt;.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.solution_remove()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;dotnet sln &amp;lt;sln&amp;gt; remove &amp;lt;TS&amp;gt;&lt;/code&gt;.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.ef_migrations_remove()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Removes the last applied Entity Framework migration&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.ef_migrations_add(name: string)&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Adds a new Entity Framework migration with the specified name.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.ef_migrations_list()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Lists all applied Entity Framework migrations.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.ef_database_drop()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Drops the database for the selected project.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.ef_database_update()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Updates the database to the latest migration.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.ef_database_update_pick()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Opens a picker to update the database to a selected migration.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.createfile(path)&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Spawns a picker for creating a new file based on a &lt;code&gt;.NET new&lt;/code&gt; template&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.secrets()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Opens a picker for &lt;code&gt;.NET user-secrets&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.get_debug_dll()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Returns the DLL from the &lt;code&gt;bin/debug&lt;/code&gt; folder&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.get_environment_variables(project_name, project_path, use_default_launch_profile: boolean)&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Returns the environment variables from the &lt;code&gt;launchSetting.json&lt;/code&gt; file&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dotnet.reset()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Deletes all files persisted by &lt;code&gt;easy-dotnet.nvim&lt;/code&gt;. Use this if unable to pick a different solution or project&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;diagnostics.get_workspace_diagnostics()&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Get workspace diagnostics using configured default severity&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;diagnostics.get_workspace_diagnostics(&quot;error&quot;)&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Get workspace diagnostics for errors only&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;diagnostics.get_workspace_diagnostics(&quot;warning&quot;)&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Get workspace diagnostics for errors and warnings&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;local dotnet = require(&quot;easy-dotnet&quot;)
dotnet.lsp_start()
dotnet.lsp_restart()
dotnet.lsp_stop()
dotnet.get_environment_variables(project_name, project_path, use_default_launch_profile: boolean)
dotnet.is_dotnet_project()                                 
dotnet.try_get_selected_solution()                         
dotnet.get_debug_dll()                                     
dotnet.reset()                                             
dotnet.test()
dotnet.test_solution()
dotnet.test_default()
dotnet.testrunner()
dotnet.testrunner_refresh()
dotnet.testrunner_refresh_build()
dotnet.new()
dotnet.outdated()
dotnet.add_package()
dotnet.remove_package()
dotnet.solution_select(path: string)
dotnet.ef_migrations_remove()
dotnet.ef_migrations_add(name: string)
dotnet.ef_migrations_list()
dotnet.ef_database_drop()
dotnet.ef_database_update()
dotnet.ef_database_update_pick()
dotnet.createfile(path: string)                                    
dotnet.build()                           
dotnet.build_solution()
dotnet.build_solution_quickfix()
dotnet.build_quickfix()                 
dotnet.build_default()                 
dotnet.build_default_quickfix()       
dotnet.project_view()
dotnet.project_view_default()
dotnet.pack()                           
dotnet.push()                           
dotnet.run()
dotnet.run_profile_default()
dotnet.run_default()
dotnet.watch()
dotnet.watch_default()
dotnet.secrets()                                                          
dotnet.clean()                                                           
dotnet.restore()

local diagnostics = require(&quot;easy-dotnet.actions.diagnostics&quot;)
diagnostics.get_workspace_diagnostics()
diagnostics.get_workspace_diagnostics(&quot;error&quot;) 
diagnostics.get_workspace_diagnostics(&quot;warning&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Vim commands&lt;/h3&gt; 
&lt;pre&gt;&lt;code&gt;Run :Dotnet in nvim to list all commands
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code&gt;Dotnet lsp start
Dotnet lsp restart
Dotnet lsp stop
Dotnet testrunner
Dotnet testrunner refresh
Dotnet testrunner refresh build
Dotnet run
Dotnet run default
Dotnet run profile
Dotnet run profile default
Dotnet debug
Dotnet debug attach
Dotnet debug default
Dotnet debug profile
Dotnet debug profile default
Dotnet watch
Dotnet watch default
Dotnet test
Dotnet test default
Dotnet test solution
Dotnet build
Dotnet build quickfix
Dotnet build solution
Dotnet build solution quickfix
Dotnet build default
Dotnet build default quickfix
Dotnet add package
Dotnet add package prerelease
Dotnet remove package
Dotnet project view
Dotnet project view default
Dotnet pack
Dotnet push
Dotnet ef database update
Dotnet ef database update pick
Dotnet ef database drop
Dotnet ef migrations add
Dotnet ef migrations remove
Dotnet ef migrations list
Dotnet secrets
Dotnet restore
Dotnet clean
Dotnet new
Dotnet createfile
Dotnet solution select &amp;lt;path&amp;gt;
Dotnet solution add
Dotnet solution remove
Dotnet outdated
Dotnet diagnostic
Dotnet diagnostic errors
Dotnet diagnostic warnings
checkhealth easy-dotnet

-- Internal 
Dotnet reset -- Deletes all persisted files
Dotnet _cached_files -- Preview picker for persisted files
Dotnet _server restart
Dotnet _server update
Dotnet _server stop
Dotnet _server start
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Roslyn LSP&lt;/h2&gt; 
&lt;p&gt;Roslyn LSP support is enabled &lt;strong&gt;out of the box&lt;/strong&gt; — no configuration required.&lt;br /&gt; Just open a C# file and the official .NET language server starts automatically.&lt;/p&gt; 
&lt;p&gt;For more information &lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/docs/lsp.md&quot;&gt;check out&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;Test runner&lt;/h2&gt; 
&lt;p&gt;Integrated test runner inspired by Rider IDE. Powered by &lt;a href=&quot;https://github.com/GustavEikaas/easy-dotnet-server&quot;&gt;easy-dotnet-server&lt;/a&gt;.&lt;/p&gt; 
&lt;img width=&quot;1911&quot; height=&quot;1049&quot; alt=&quot;testrunner float&quot; src=&quot;https://github.com/user-attachments/assets/f50ba57a-34bf-4a79-8c35-f44f1ef02dc0&quot; /&gt; 
&lt;img width=&quot;1879&quot; height=&quot;1051&quot; alt=&quot;testrunner mid-run&quot; src=&quot;https://github.com/user-attachments/assets/39f1c14c-965b-4cef-914e-0d4ca44f12f8&quot; /&gt; 
&lt;p&gt;If you experience issues with a test adapter please open an issue.&lt;/p&gt; 
&lt;p&gt;The test runner starts automatically when the server starts and runs discovery silently in the background, so the tree is ready before you open the window.&lt;/p&gt; 
&lt;ul class=&quot;task-list&quot;&gt; 
 &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_0&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_0&quot;&gt; Test runner window&lt;/label&gt; 
  &lt;ul class=&quot;task-list&quot;&gt; 
   &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_1&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_1&quot;&gt; Float, split and vsplit view modes&lt;/label&gt;&lt;/li&gt; 
   &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_2&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_2&quot;&gt; Grouped by solution, project, namespace and class&lt;/label&gt;&lt;/li&gt; 
   &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_3&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_3&quot;&gt; Passed, skipped, failed with live counts in header&lt;/label&gt;&lt;/li&gt; 
   &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_4&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_4&quot;&gt; Configurable icons and highlights&lt;/label&gt;&lt;/li&gt; 
   &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_5&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_5&quot;&gt; Collapsible hierarchy&lt;/label&gt;&lt;/li&gt; 
   &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_6&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_6&quot;&gt; Peek stacktrace with parsed highlighting (your code in yellow, framework code in grey)&lt;/label&gt;&lt;/li&gt; 
   &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_7&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_7&quot;&gt; Run and debug from solution, project, namespace, class or test&lt;/label&gt;&lt;/li&gt; 
   &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_8&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_8&quot;&gt; Cancel in-flight runs&lt;/label&gt;&lt;/li&gt; 
   &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_9&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_9&quot;&gt; Go to file&lt;/label&gt;&lt;/li&gt; 
   &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_10&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_10&quot;&gt; Aggregate test results across projects&lt;/label&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_11&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_11&quot;&gt; Buffer integration&lt;/label&gt; 
  &lt;ul class=&quot;task-list&quot;&gt; 
   &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_12&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_12&quot;&gt; Gutter signs on test methods and classes&lt;/label&gt;&lt;/li&gt; 
   &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_13&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_13&quot;&gt; Run test or class from buffer&lt;/label&gt;&lt;/li&gt; 
   &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_14&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_14&quot;&gt; Debug test or class from buffer&lt;/label&gt;&lt;/li&gt; 
   &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_15&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_15&quot;&gt; Peek stacktrace from buffer&lt;/label&gt;&lt;/li&gt; 
   &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_16&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_16&quot;&gt; Flash on run and result&lt;/label&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Keymaps&lt;/h3&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Key&lt;/th&gt; 
   &lt;th&gt;Action&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;o&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Expand / collapse node under cursor&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;E&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Expand all&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;W&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Collapse all&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;&amp;lt;leader&amp;gt;r&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Run test under cursor&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;&amp;lt;leader&amp;gt;R&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Run all tests&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;&amp;lt;leader&amp;gt;d&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Debug test under cursor&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;&amp;lt;leader&amp;gt;p&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Peek stacktrace of failed test&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;&amp;lt;leader&amp;gt;g&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Go to file&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;&amp;lt;C-r&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Refresh test runner node&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;&amp;lt;C-c&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Cancel in-flight operation&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;q&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Close window&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h3&gt;Debugging tests&lt;/h3&gt; 
&lt;p&gt;Use &lt;code&gt;&amp;lt;leader&amp;gt;d&lt;/code&gt; on any node in the runner to start a debug session. Breakpoints must be set manually before starting the session.&lt;/p&gt; 
&lt;h3&gt;Running tests from buffer&lt;/h3&gt; 
&lt;p&gt;Gutter signs appear automatically on test methods and classes once discovery has completed.&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Key&lt;/th&gt; 
   &lt;th&gt;Action&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;&amp;lt;leader&amp;gt;r&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Run test or class under cursor&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;&amp;lt;leader&amp;gt;d&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Debug test or class under cursor&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;&amp;lt;leader&amp;gt;p&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Peek stacktrace of failed test&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;When a run is triggered from the buffer the method or class flashes to confirm it was picked up. When the run finishes it flashes again in the colour of the result.&lt;/p&gt; 
&lt;img width=&quot;1238&quot; height=&quot;575&quot; alt=&quot;test signs&quot; src=&quot;https://github.com/user-attachments/assets/9e6e2d96-b389-4b35-b2a1-c8392ffdbcba&quot; /&gt; 
&lt;img width=&quot;1228&quot; height=&quot;578&quot; alt=&quot;test flash confirm&quot; src=&quot;https://github.com/user-attachments/assets/bcb8377a-577f-4808-a20e-1c90f884d9d4&quot; /&gt; 
&lt;img width=&quot;1885&quot; height=&quot;1044&quot; alt=&quot;floating stacktrace from buffer&quot; src=&quot;https://github.com/user-attachments/assets/109fdfdd-d93b-400e-a4e0-8ebf41ff9312&quot; /&gt; 
&lt;h2&gt;Project view&lt;/h2&gt; 
&lt;p&gt;Get a comprehensive overview of a project&#39;s dependencies, and easily manage NuGet packages and project references.&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/2e0e2e25-0a2b-4864-bc3b-64b4048967e5&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt; 
&lt;h3&gt;Features&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Project Details&lt;/strong&gt;: View project name, solution, language, and target version.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Project References&lt;/strong&gt;: 
  &lt;ul&gt; 
   &lt;li&gt;View project references.&lt;/li&gt; 
   &lt;li&gt;Add or remove project references.&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;NuGet Packages&lt;/strong&gt;: 
  &lt;ul&gt; 
   &lt;li&gt;View package references.&lt;/li&gt; 
   &lt;li&gt;Add or remove NuGet package references.&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Keymaps&lt;/h3&gt; 
&lt;p&gt;Keymaps are region-specific and work based on context (e.g., when hovering over a project/package or its header):&lt;/p&gt; 
&lt;h4&gt;Project References:&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;a&lt;/code&gt;: Add project reference.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;r&lt;/code&gt;: Remove project reference.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Package References:&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;a&lt;/code&gt;: Add package reference.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;r&lt;/code&gt;: Remove package reference.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;&amp;lt;C-b&amp;gt;&lt;/code&gt;: View package in browser.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Workspace Diagnostics&lt;/h2&gt; 
&lt;p&gt;Analyze your entire solution or individual projects for compilation errors and warnings using Roslyn diagnostics.&lt;/p&gt; 
&lt;h3&gt;Commands&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;Dotnet diagnostic&lt;/code&gt; - Uses the configured default severity (errors by default)&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;Dotnet diagnostic errors&lt;/code&gt; - Shows only compilation errors&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;Dotnet diagnostic warnings&lt;/code&gt; - Shows both errors and warnings&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Configuration&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&quot;easy-dotnet&quot;).setup({
  diagnostics = {
    default_severity = &quot;error&quot;,  -- &quot;error&quot; or &quot;warning&quot; (default: &quot;error&quot;)
    setqflist = false,           -- Populate quickfix list automatically (default: false)
  },
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Features&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Solution/Project Selection&lt;/strong&gt;: When multiple projects or solutions are available, you&#39;ll be prompted to select which one to analyze&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Roslyn Integration&lt;/strong&gt;: Uses the Roslyn Language Server Protocol for accurate diagnostics&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Neovim Diagnostics Integration&lt;/strong&gt;: Results are populated into Neovim&#39;s built-in diagnostic system, allowing you to: 
  &lt;ul&gt; 
   &lt;li&gt;Navigate between diagnostics using &lt;code&gt;:lua vim.diagnostic.goto_next()&lt;/code&gt; and &lt;code&gt;:lua vim.diagnostic.goto_prev()&lt;/code&gt;&lt;/li&gt; 
   &lt;li&gt;View diagnostics in the quickfix list using &lt;code&gt;:lua vim.diagnostic.setqflist()&lt;/code&gt; (or automatically if configured)&lt;/li&gt; 
   &lt;li&gt;See inline diagnostic messages&lt;/li&gt; 
   &lt;li&gt;View with trouble (requires &lt;a href=&quot;https://github.com/folke/trouble.nvim&quot;&gt;trouble.nvim&lt;/a&gt;)&lt;/li&gt; 
   &lt;li&gt;View with snacks diagnostic picker (requires &lt;a href=&quot;https://github.com/folke/snacks.nvim&quot;&gt;snacks.nvim&lt;/a&gt;)&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;The diagnostics will appear in Neovim&#39;s diagnostic system, allowing you to navigate through them using your standard diagnostic keymaps. If you have trouble.nvim or snacks.nvim configured, the diagnostics will automatically be available in their respective interfaces.&lt;/p&gt; 
&lt;h2&gt;Outdated&lt;/h2&gt; 
&lt;p&gt;Run the command &lt;code&gt;Dotnet outdated&lt;/code&gt; in one of the supported filetypes, virtual text with packages latest version will appear&lt;/p&gt; 
&lt;p&gt;Supports the following filetypes&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;*.csproj&lt;/li&gt; 
 &lt;li&gt;*.fsproj&lt;/li&gt; 
 &lt;li&gt;Directory.Packages.props&lt;/li&gt; 
 &lt;li&gt;Packages.props&lt;/li&gt; 
 &lt;li&gt;Directory.Build.props&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/496caec1-a18b-487a-8a37-07c4bb9fa113&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt; 
&lt;h2&gt;Add&lt;/h2&gt; 
&lt;h3&gt;Add package&lt;/h3&gt; 
&lt;p&gt;Adding nuget packages are available using the &lt;code&gt;:Dotnet add package&lt;/code&gt; command. This will allow you to browse for nuget packages.&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/00a9d38a-6afe-42ec-b971-04191fee1d59&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt; 
&lt;h2&gt;Project mappings&lt;/h2&gt; 
&lt;p&gt;Key mappings are available automatically within &lt;code&gt;.csproj&lt;/code&gt; and &lt;code&gt;.fsproj&lt;/code&gt; files&lt;/p&gt; 
&lt;h3&gt;Add reference&lt;/h3&gt; 
&lt;p&gt;&lt;code&gt;&amp;lt;leader&amp;gt;ar&lt;/code&gt; -&amp;gt; Opens a picker for selecting which project reference to add&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/dec096be-8a87-4dd8-aaec-8c22849d1640&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt; 
&lt;h3&gt;Package autocomplete&lt;/h3&gt; 
&lt;p&gt;When editing package references inside a .csproject file it is possible to enable autocomplete. This will trigger autocomplete for &lt;code&gt;&amp;lt;PackageReference Include=&quot;&amp;lt;cmp-trigger&amp;gt;&quot; Version=&quot;&amp;lt;cmp-trigger&amp;gt;&quot; /&amp;gt;&lt;/code&gt;&lt;/p&gt; 
&lt;h4&gt;Using nvim-cmp&lt;/h4&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;    cmp.register_source(&quot;easy-dotnet&quot;, require(&quot;easy-dotnet&quot;).package_completion_source)
    ...
    sources = cmp.config.sources({
        { name = &#39;nvim_lsp&#39;    },
        { name = &#39;easy-dotnet&#39; },
        ...
    }),
    ...
&lt;/code&gt;&lt;/pre&gt; 
&lt;h4&gt;Using Blink.cmp&lt;/h4&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;return {
  &quot;saghen/blink.cmp&quot;,
  version = &quot;*&quot;,
  config = function()
    require(&quot;blink.cmp&quot;).setup {
      fuzzy = { implementation = &quot;prefer_rust_with_warning&quot; },
      sources = {
        default = { &quot;lsp&quot;, &quot;easy-dotnet&quot;, &quot;path&quot; },
        providers = {
          [&quot;easy-dotnet&quot;] = {
            name = &quot;easy-dotnet&quot;,
            enabled = true,
            module = &quot;easy-dotnet.completion.blink&quot;,
            score_offset = 10000,
            async = true,
          },
        },
      },
    }
  end,
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/81809aa8-704b-4481-9445-3985ddef6c98&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-note&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-info mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Note&lt;/p&gt;
 &lt;p&gt;Latest is added as a snippet to make it easier to select the latest version&lt;/p&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/2b59735f-941e-44d2-93cf-76b13ac3e76f&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt; 
&lt;h2&gt;.NET Framework&lt;/h2&gt; 
&lt;p&gt;Basic support for .NET framework has been achieved. This means basic functionality like &lt;code&gt;build/run/test/test-runner&lt;/code&gt; should work. If you find something not working feel free to file an issue.&lt;/p&gt; 
&lt;h3&gt;Requirements&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;choco install nuget.commandline&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Visual studio installation&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;options.server.use_visual_studio == true&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;New&lt;/h2&gt; 
&lt;p&gt;Create dotnet templates as with &lt;code&gt;dotnet new &amp;lt;templatename&amp;gt;&lt;/code&gt; Try it out by running &lt;code&gt;Dotnet new&lt;/code&gt;&lt;/p&gt; 
&lt;h3&gt;Project&lt;/h3&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/user-attachments/assets/aa067c17-3611-4490-afc8-41d98a526729&quot;&gt;https://github.com/user-attachments/assets/aa067c17-3611-4490-afc8-41d98a526729&lt;/a&gt;&lt;/p&gt; 
&lt;h3&gt;Configuration file&lt;/h3&gt; 
&lt;p&gt;If a configuration file is selected it will&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;Create the configuration file and place it next to your solution file. (solution files and gitignore files are placed in cwd)&lt;/li&gt; 
&lt;/ol&gt; 
&lt;h3&gt;Integrating with nvim-tree&lt;/h3&gt; 
&lt;p&gt;Adding the following configuration to your nvim-tree will allow for creating files using dotnet templates&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;    require(&quot;nvim-tree&quot;).setup({
      on_attach = function(bufnr)
        local api = require(&#39;nvim-tree.api&#39;)

        local function opts(desc)
          return { desc = &#39;nvim-tree: &#39; .. desc, buffer = bufnr, noremap = true, silent = true, nowait = true }
        end

        vim.keymap.set(&#39;n&#39;, &#39;A&#39;, function()
          local node = api.tree.get_node_under_cursor()
          local path = node.type == &quot;directory&quot; and node.absolute_path or vim.fs.dirname(node.absolute_path)
          require(&quot;easy-dotnet&quot;).create_new_item(path)
        end, opts(&#39;Create file from dotnet template&#39;))
      end
    })
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Integrating with neo-tree&lt;/h3&gt; 
&lt;p&gt;Adding the following configuration to your neo-tree will allow for creating files using dotnet templates&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;      require(&quot;neo-tree&quot;).setup({
      ---...other options
        filesystem = {
          window = {
            mappings = {
              -- Make the mapping anything you want
              [&quot;R&quot;] = &quot;easy&quot;,
            },
          },
          commands = {
            [&quot;easy&quot;] = function(state)
              local node = state.tree:get_node()
              local path = node.type == &quot;directory&quot; and node.path or vim.fs.dirname(node.path)
              require(&quot;easy-dotnet&quot;).create_new_item(path, function()
                require(&quot;neo-tree.sources.manager&quot;).refresh(state.name)
              end)
            end
          }
        },
      })
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Integrating with mini files&lt;/h3&gt; 
&lt;p&gt;Adding the following autocmd to your config will allow for creating files using dotnet templates&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;    vim.api.nvim_create_autocmd(&quot;User&quot;, {
      pattern = &quot;MiniFilesBufferCreate&quot;,
      callback = function(args)
        local buf_id = args.data.buf_id
        vim.keymap.set(&quot;n&quot;, &quot;&amp;lt;leader&amp;gt;a&quot;, function()
          local entry = require(&quot;mini.files&quot;).get_fs_entry()
          if entry == nil then
            vim.notify(&quot;No fd entry in mini files&quot;, vim.log.levels.WARN)
            return
          end
          local target_dir = entry.path
          if entry.fs_type == &quot;file&quot; then
            target_dir = vim.fn.fnamemodify(entry.path, &quot;:h&quot;)
          end
          require(&quot;easy-dotnet&quot;).create_new_item(target_dir)
        end, { buffer = buf_id, desc = &quot;Create file from dotnet template&quot; })
      end,
    })
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Integrating with snacks explorer&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;  {
    &quot;folke/snacks.nvim&quot;,
    ---@type snacks.Config
    opts = {
      picker = {
        sources = {
          explorer = {
            win = {
              list = {
                keys = {
                  [&quot;A&quot;] = &quot;explorer_add_dotnet&quot;,
                },
              },
            },
            actions = {
              explorer_add_dotnet = function(picker)
                local dir = picker:dir()
                local easydotnet = require(&quot;easy-dotnet&quot;)

                easydotnet.create_new_item(dir, function(item_path)
                  local tree = require(&quot;snacks.explorer.tree&quot;)
                  local actions = require(&quot;snacks.explorer.actions&quot;)
                  tree:open(dir)
                  tree:refresh(dir)
                  actions.update(picker, { target = item_path })
                  picker:focus()
                end)
              end,
            },
          },
        },
      },
    },
  },

&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;EntityFramework&lt;/h2&gt; 
&lt;p&gt;Common EntityFramework commands have been added mainly to reduce the overhead of writing &lt;code&gt;--project .. --startup-project ..&lt;/code&gt;.&lt;/p&gt; 
&lt;h3&gt;Requirements&lt;/h3&gt; 
&lt;p&gt;This functionality relies on dotnet-ef tool, install using &lt;code&gt;dotnet tool install --global dotnet-ef&lt;/code&gt;&lt;/p&gt; 
&lt;h3&gt;Database&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;Dotnet ef database update&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;Dotnet ef database update pick&lt;/code&gt; --allows to pick which migration to apply&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;Dotnet ef database drop&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Migrations&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;Dotnet ef migrations add &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;Dotnet ef migrations remove&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;Dotnet ef migrations list&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Language injections&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.jetbrains.com/help/rider/Language_Injections.html#use-comments&quot;&gt;Rider-like&lt;/a&gt; syntax highlighting for injected languages (sql, json and xml) based on comments.&lt;/p&gt; 
&lt;p&gt;Just add single-line comment like &lt;code&gt;//language=json&lt;/code&gt; before string to start using this.&lt;/p&gt; 
&lt;h3&gt;Showcase&lt;/h3&gt; 
&lt;p&gt;Language injection with raw json string as an example.&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/2057bf66-e207-479c-8bd9-35714cdb7e24&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt; 
&lt;h3&gt;Requirements&lt;/h3&gt; 
&lt;p&gt;This functionality is based on &lt;a href=&quot;https://github.com/nvim-treesitter/nvim-treesitter&quot;&gt;Treesitter&lt;/a&gt; and parsers for &lt;code&gt;sql&lt;/code&gt;, &lt;code&gt;json&lt;/code&gt; and &lt;code&gt;xml&lt;/code&gt;, so make sure you have these parsers installed: &lt;code&gt;:TSInstall sql json xml&lt;/code&gt;.&lt;/p&gt; 
&lt;h3&gt;Support matrix&lt;/h3&gt; 
&lt;h4&gt;Strings&lt;/h4&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;string&lt;/th&gt; 
   &lt;th&gt;sql&lt;/th&gt; 
   &lt;th&gt;json&lt;/th&gt; 
   &lt;th&gt;xml&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;quoted&lt;/td&gt; 
   &lt;td&gt;✅&lt;/td&gt; 
   &lt;td&gt;❌&lt;/td&gt; 
   &lt;td&gt;✅&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;verbatim&lt;/td&gt; 
   &lt;td&gt;✅&lt;/td&gt; 
   &lt;td&gt;❌&lt;/td&gt; 
   &lt;td&gt;✅&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;raw&lt;/td&gt; 
   &lt;td&gt;✅&lt;/td&gt; 
   &lt;td&gt;✅&lt;/td&gt; 
   &lt;td&gt;✅&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;regexp quoted&lt;/td&gt; 
   &lt;td&gt;❌&lt;/td&gt; 
   &lt;td&gt;❌&lt;/td&gt; 
   &lt;td&gt;❌&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;regexp verbatim&lt;/td&gt; 
   &lt;td&gt;❌&lt;/td&gt; 
   &lt;td&gt;❌&lt;/td&gt; 
   &lt;td&gt;❌&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;regexp raw&lt;/td&gt; 
   &lt;td&gt;❌&lt;/td&gt; 
   &lt;td&gt;❌&lt;/td&gt; 
   &lt;td&gt;❌&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h4&gt;Interpolated strings&lt;/h4&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;interpolated string&lt;/th&gt; 
   &lt;th&gt;json&lt;/th&gt; 
   &lt;th&gt;xml&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;quoted&lt;/td&gt; 
   &lt;td&gt;❌&lt;/td&gt; 
   &lt;td&gt;❌&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;verbatim&lt;/td&gt; 
   &lt;td&gt;❌&lt;/td&gt; 
   &lt;td&gt;❌&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;raw&lt;/td&gt; 
   &lt;td&gt;✅&lt;/td&gt; 
   &lt;td&gt;✅&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;regexp quoted&lt;/td&gt; 
   &lt;td&gt;❌&lt;/td&gt; 
   &lt;td&gt;❌&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;regexp verbatim&lt;/td&gt; 
   &lt;td&gt;❌&lt;/td&gt; 
   &lt;td&gt;❌&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;regexp raw&lt;/td&gt; 
   &lt;td&gt;❌&lt;/td&gt; 
   &lt;td&gt;❌&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h2&gt;Nvim-dap configuration&lt;/h2&gt; 
&lt;p&gt;Check out &lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/docs/debugging.md&quot;&gt;debugging-setup&lt;/a&gt; for a full walkthrough of debugging setup&lt;/p&gt; 
&lt;h2&gt;Troubleshooting&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;Update the plugin to latest version&lt;/li&gt; 
 &lt;li&gt;Run &lt;code&gt;:checkhealth easy-dotnet&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Highlight groups&lt;/h2&gt; 
&lt;details&gt; 
 &lt;summary&gt;Click to see all highlight groups&lt;/summary&gt; 
 &lt;!--hl start--&gt; 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th&gt;Highlight group&lt;/th&gt; 
    &lt;th&gt;Default&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;EasyDotnetTestRunnerSolution&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;Question&lt;/em&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;EasyDotnetTestRunnerProject&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;Character&lt;/em&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;EasyDotnetTestRunnerTest&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;Normal&lt;/em&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;EasyDotnetTestRunnerSubcase&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;Conceal&lt;/em&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;EasyDotnetTestRunnerDir&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;Directory&lt;/em&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;EasyDotnetTestRunnerPackage&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;Include&lt;/em&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;EasyDotnetTestRunnerPassed&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;DiagnosticOk&lt;/em&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;EasyDotnetTestRunnerFailed&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;DiagnosticError&lt;/em&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;EasyDotnetTestRunnerRunning&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;DiagnosticWarn&lt;/em&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;EasyDotnetDebuggerFloatVariable&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;Question&lt;/em&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;EasyDotnetDebuggerVirtualVariable&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;Question&lt;/em&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;EasyDotnetDebuggerVirtualException&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;DiagnosticError&lt;/em&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;EasyDotnetPeekTitle&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;Custom (Accent)&lt;/em&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;EasyDotnetPeekBorder&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;Custom (Accent)&lt;/em&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;EasyDotnetPeekMain&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;Custom (Dark)&lt;/em&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;EasyDotnetPeekSideBar&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;Custom (Darker)&lt;/em&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;EasyDotnetPeekWinBar&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;Custom (Dark)&lt;/em&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;EasyDotnetPeekHint&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;Custom (Italic Gray)&lt;/em&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;EasyDotnetPeekListActive&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;Custom (Blue)&lt;/em&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
 &lt;!-- hl-end --&gt; 
&lt;/details&gt; 
&lt;h2&gt;Local Development&lt;/h2&gt; 
&lt;p&gt;Check out &lt;a href=&quot;https://raw.githubusercontent.com/GustavEikaas/easy-dotnet.nvim/main/docs/server-development.md&quot;&gt;setup guide&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;Star History&lt;/h2&gt; 
&lt;picture&gt; 
 &lt;source media=&quot;(prefers-color-scheme: dark)&quot; srcset=&quot;https://api.star-history.com/svg?repos=GustavEikaas/easy-dotnet.nvim&amp;amp;type=date&amp;amp;theme=dark&amp;amp;legend=top-left&quot; /&gt; 
 &lt;source media=&quot;(prefers-color-scheme: light)&quot; srcset=&quot;https://api.star-history.com/svg?repos=GustavEikaas/easy-dotnet.nvim&amp;amp;type=date&amp;amp;legend=top-left&quot; /&gt; 
 &lt;img alt=&quot;Star History Chart&quot; src=&quot;https://api.star-history.com/svg?repos=GustavEikaas/easy-dotnet.nvim&amp;amp;type=date&amp;amp;legend=top-left&quot; /&gt; 
&lt;/picture&gt; 
&lt;h2&gt;Contributors&lt;/h2&gt; 
&lt;a href=&quot;https://github.com/GustavEikaas/easy-dotnet.nvim/graphs/contributors&quot;&gt; &lt;img src=&quot;https://contrib.rocks/image?repo=GustavEikaas/easy-dotnet.nvim&quot; /&gt; &lt;/a&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/343c15d3d9a6a4547a7174b9f063ebd6e5516fcfd022e159bafddeacb400080d/GustavEikaas/easy-dotnet.nvim" medium="image" />
      
    </item>
    
    <item>
      <title>esmuellert/codediff.nvim</title>
      <link>https://github.com/esmuellert/codediff.nvim</link>
      <description>&lt;p&gt;A Neovim plugin that provides VSCode-style diff rendering with two-tier highlighting (line + character level) in side-by-side and inline layouts, using VSCode&#39;s algorithm implemented in C.&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;codediff.nvim&lt;/h1&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/esmuellert/vscode-diff.nvim/releases&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/downloads/esmuellert/vscode-diff.nvim/total?label=%E2%AC%87%20downloads&amp;amp;color=blue&quot; alt=&quot;Downloads&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;A Neovim plugin that provides VSCode-style diff rendering with two-tier highlighting, supporting both side-by-side and inline (unified) layouts.&lt;/p&gt; 
&lt;div align=&quot;center&quot;&gt; 
 &lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/473ae319-40ac-40e4-958b-a0f2525d1f94&quot; alt=&quot;VSCode-style diff view showing side-by-side comparison with two-tier highlighting&quot; /&gt;&lt;/p&gt; 
&lt;/div&gt; 
&lt;div align=&quot;center&quot;&gt; 
 &lt;p&gt;&lt;a href=&quot;https://github.com/user-attachments/assets/64c41f01-dffe-4318-bce4-16eec8de356e&quot;&gt;https://github.com/user-attachments/assets/64c41f01-dffe-4318-bce4-16eec8de356e&lt;/a&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;strong&gt;Demo: Quick walkthrough of diff features&lt;/strong&gt;&lt;/p&gt; 
&lt;/div&gt; 
&lt;h2&gt;Features&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Two-tier highlighting system&lt;/strong&gt;: 
  &lt;ul&gt; 
   &lt;li&gt;Light backgrounds for entire modified lines (green for insertions, red for deletions)&lt;/li&gt; 
   &lt;li&gt;Deep/dark character-level highlights showing exact changes within lines&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Side-by-side diff view&lt;/strong&gt; in a new tab with synchronized scrolling&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Inline (unified) diff view&lt;/strong&gt; — single-window layout with deleted lines as virtual overlays, with treesitter syntax highlighting&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Toggle layout&lt;/strong&gt; — switch between side-by-side and inline layout at runtime with &lt;code&gt;t&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Git integration&lt;/strong&gt;: Compare between any git revision (HEAD, commits, branches, tags)&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Same implementation as VSCode&#39;s diff engine&lt;/strong&gt;, providing identical visual highlighting for most scenarios&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Fast C-based diff computation&lt;/strong&gt; using FFI with &lt;strong&gt;multi-core parallelization&lt;/strong&gt; (OpenMP)&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Async git operations&lt;/strong&gt; - non-blocking file retrieval from git&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Moved code detection&lt;/strong&gt; — identifies blocks of code that moved within a file, with visual indicators (highlights, signs, annotations) matching VSCode&#39;s experimental &lt;code&gt;showMoves&lt;/code&gt; feature (opt-in)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Installation&lt;/h2&gt; 
&lt;h3&gt;Prerequisites&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;Neovim &amp;gt;= 0.7.0 (for Lua FFI support; 0.10+ recommended for vim.system)&lt;/li&gt; 
 &lt;li&gt;Git (for git diff features)&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;curl&lt;/code&gt; or &lt;code&gt;wget&lt;/code&gt; (for automatic binary download) &lt;strong&gt;No compiler required!&lt;/strong&gt; The plugin automatically downloads pre-built binaries from GitHub releases.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Using lazy.nvim&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;Minimal installation:&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;{
  &quot;esmuellert/codediff.nvim&quot;,
  cmd = &quot;CodeDiff&quot;,
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The plugin automatically adapts to your colorscheme&#39;s background (dark/light). It uses &lt;code&gt;DiffAdd&lt;/code&gt; and &lt;code&gt;DiffDelete&lt;/code&gt; for line-level diffs, and auto-adjusts brightness for character-level highlights (1.4x brighter for dark themes, 0.92x darker for light themes). See &lt;a href=&quot;https://raw.githubusercontent.com/esmuellert/codediff.nvim/main/#highlight-groups&quot;&gt;Highlight Groups&lt;/a&gt; for customization.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;strong&gt;With custom configuration:&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;{
  &quot;esmuellert/codediff.nvim&quot;,
  cmd = &quot;CodeDiff&quot;,
  opts = {
    -- Highlight configuration
    highlights = {
      -- Line-level: accepts highlight group names or hex colors (e.g., &quot;#2ea043&quot;)
      line_insert = &quot;DiffAdd&quot;,      -- Line-level insertions
      line_delete = &quot;DiffDelete&quot;,   -- Line-level deletions

      -- Character-level: accepts highlight group names or hex colors
      -- If specified, these override char_brightness calculation
      char_insert = nil,            -- Character-level insertions (nil = auto-derive)
      char_delete = nil,            -- Character-level deletions (nil = auto-derive)

      -- Brightness multiplier (only used when char_insert/char_delete are nil)
      -- nil = auto-detect based on background (1.4 for dark, 0.92 for light)
      char_brightness = nil,        -- Auto-adjust based on your colorscheme

      -- Conflict sign highlights (for merge conflict views)
      -- Accepts highlight group names or hex colors (e.g., &quot;#f0883e&quot;)
      -- nil = use default fallback chain
      conflict_sign = nil,          -- Unresolved: DiagnosticSignWarn -&amp;gt; #f0883e
      conflict_sign_resolved = nil, -- Resolved: Comment -&amp;gt; #6e7681
      conflict_sign_accepted = nil, -- Accepted: GitSignsAdd -&amp;gt; DiagnosticSignOk -&amp;gt; #3fb950
      conflict_sign_rejected = nil, -- Rejected: GitSignsDelete -&amp;gt; DiagnosticSignError -&amp;gt; #f85149
    },

    -- Diff view behavior
    diff = {
      layout = &quot;side-by-side&quot;,             -- Diff layout: &quot;side-by-side&quot; (two panes) or &quot;inline&quot; (single pane with virtual lines)
      disable_inlay_hints = true,         -- Disable inlay hints in diff windows for cleaner view
      max_computation_time_ms = 5000,     -- Maximum time for diff computation (VSCode default)
      ignore_trim_whitespace = false,     -- Ignore leading/trailing whitespace changes (like diffopt+=iwhite)
      hide_merge_artifacts = false,       -- Hide merge tool temp files (*.orig, *.BACKUP.*, *.BASE.*, *.LOCAL.*, *.REMOTE.*)
      original_position = &quot;left&quot;,         -- Position of original (old) content: &quot;left&quot; or &quot;right&quot;
      conflict_ours_position = &quot;right&quot;,   -- Position of ours (:2) in conflict view: &quot;left&quot; or &quot;right&quot;
      conflict_result_position = &quot;bottom&quot;, -- &quot;bottom&quot; (default): result below diff panes or &quot;center&quot;: result between diff panes (three columns)
      conflict_result_height = 30,         -- Height of result pane in bottom layout (% of total height)
      conflict_result_width_ratio = { 1, 1, 1 }, -- Width ratio for center layout panes {left, center, right} (e.g., {1, 2, 1} for wider result)
      cycle_next_hunk = true,             -- Wrap around when navigating hunks (]c/[c): false to stop at first/last
      cycle_next_file = true,             -- Wrap around when navigating files (]f/[f): false to stop at first/last
      jump_to_first_change = true,        -- Auto-scroll to first change when opening a diff: false to stay at same line
      highlight_priority = 100,           -- Priority for line-level diff highlights (increase to override LSP highlights)
      compute_moves = false,              -- Detect moved code blocks (opt-in, matches VSCode experimental.showMoves)
    },

    -- Explorer panel configuration
    explorer = {
      position = &quot;left&quot;,  -- &quot;left&quot; or &quot;bottom&quot;
      width = 40,         -- Width when position is &quot;left&quot; (columns)
      height = 15,        -- Height when position is &quot;bottom&quot; (lines)
      indent_markers = true,  -- Show indent markers in tree view (│, ├, └)
      initial_focus = &quot;explorer&quot;,  -- Initial focus: &quot;explorer&quot;, &quot;original&quot;, or &quot;modified&quot;
      icons = {
        folder_closed = &quot;&quot;,  -- Nerd Font folder icon (customize as needed)
        folder_open = &quot;&quot;,    -- Nerd Font folder-open icon
      },
      view_mode = &quot;list&quot;,    -- &quot;list&quot; or &quot;tree&quot;
      flatten_dirs = true,   -- Flatten single-child directory chains in tree view
      file_filter = {
        ignore = { &quot;.git/**&quot;, &quot;.jj/**&quot; },  -- Glob patterns to hide (e.g., {&quot;*.lock&quot;, &quot;dist/*&quot;})
      },
      focus_on_select = false,  -- Jump to modified pane after selecting a file (default: stay in explorer)
      visible_groups = {       -- Which groups to show (can be toggled at runtime)
        staged = true,
        unstaged = true,
        conflicts = true,
      },
    },

    -- History panel configuration (for :CodeDiff history)
    history = {
      position = &quot;bottom&quot;,  -- &quot;left&quot; or &quot;bottom&quot; (default: bottom)
      width = 40,           -- Width when position is &quot;left&quot; (columns)
      height = 15,          -- Height when position is &quot;bottom&quot; (lines)
      initial_focus = &quot;history&quot;,  -- Initial focus: &quot;history&quot;, &quot;original&quot;, or &quot;modified&quot;
      view_mode = &quot;list&quot;,   -- &quot;list&quot; or &quot;tree&quot; for files under commits
    },

    -- Keymaps in diff view
    keymaps = {
      view = {
        quit = &quot;q&quot;,                    -- Close diff tab
        toggle_explorer = &quot;&amp;lt;leader&amp;gt;b&quot;,  -- Toggle explorer visibility (explorer mode only)
        focus_explorer = &quot;&amp;lt;leader&amp;gt;e&quot;,   -- Focus explorer panel (explorer mode only)
        next_hunk = &quot;]c&quot;,   -- Jump to next change
        prev_hunk = &quot;[c&quot;,   -- Jump to previous change
        next_file = &quot;]f&quot;,   -- Next file in explorer/history mode
        prev_file = &quot;[f&quot;,   -- Previous file in explorer/history mode
        diff_get = &quot;do&quot;,    -- Get change from other buffer (like vimdiff)
        diff_put = &quot;dp&quot;,    -- Put change to other buffer (like vimdiff)
        open_in_prev_tab = &quot;gf&quot;, -- Open current buffer in previous tab (or create one before)
        close_on_open_in_prev_tab = false, -- Close codediff tab after gf opens file in previous tab
        toggle_stage = &quot;-&quot;, -- Stage/unstage current file (works in explorer and diff buffers)
        stage_hunk = &quot;&amp;lt;leader&amp;gt;hs&quot;,   -- Stage hunk under cursor to git index
        unstage_hunk = &quot;&amp;lt;leader&amp;gt;hu&quot;, -- Unstage hunk under cursor from git index
        discard_hunk = &quot;&amp;lt;leader&amp;gt;hr&quot;, -- Discard hunk under cursor (working tree only)
        hunk_textobject = &quot;ih&quot;,      -- Textobject for hunk (vih to select, yih to yank, etc.)
        show_help = &quot;g?&quot;,   -- Show floating window with available keymaps
        align_move = &quot;gm&quot;, -- Temporarily align moved code blocks across panes
        toggle_layout = &quot;t&quot;, -- Toggle between side-by-side and inline layout
      },
      explorer = {
        select = &quot;&amp;lt;CR&amp;gt;&quot;,    -- Open diff for selected file
        hover = &quot;K&quot;,        -- Show file diff preview
        refresh = &quot;R&quot;,      -- Refresh git status
        toggle_view_mode = &quot;i&quot;,  -- Toggle between &#39;list&#39; and &#39;tree&#39; views
        stage_all = &quot;S&quot;,    -- Stage all files
        unstage_all = &quot;U&quot;,  -- Unstage all files
        restore = &quot;X&quot;,      -- Discard changes (restore file)
        toggle_changes = &quot;gu&quot;,  -- Toggle Changes (unstaged) group visibility
        toggle_staged = &quot;gs&quot;,   -- Toggle Staged Changes group visibility
        -- Fold keymaps (Vim-style)
        fold_open = &quot;zo&quot;,           -- Open fold (expand current node)
        fold_open_recursive = &quot;zO&quot;, -- Open fold recursively (expand all descendants)
        fold_close = &quot;zc&quot;,          -- Close fold (collapse current node)
        fold_close_recursive = &quot;zC&quot;, -- Close fold recursively (collapse all descendants)
        fold_toggle = &quot;za&quot;,         -- Toggle fold (expand/collapse current node)
        fold_toggle_recursive = &quot;zA&quot;, -- Toggle fold recursively
        fold_open_all = &quot;zR&quot;,       -- Open all folds in tree
        fold_close_all = &quot;zM&quot;,      -- Close all folds in tree
      },
      history = {
        select = &quot;&amp;lt;CR&amp;gt;&quot;,    -- Select commit/file or toggle expand
        toggle_view_mode = &quot;i&quot;,  -- Toggle between &#39;list&#39; and &#39;tree&#39; views
        refresh = &quot;R&quot;,      -- Refresh history (re-fetch commits)
        -- Fold keymaps (Vim-style, apply to directory nodes only)
        fold_open = &quot;zo&quot;,           -- Open fold (expand current node)
        fold_open_recursive = &quot;zO&quot;, -- Open fold recursively (expand all descendants)
        fold_close = &quot;zc&quot;,          -- Close fold (collapse current node)
        fold_close_recursive = &quot;zC&quot;, -- Close fold recursively (collapse all descendants)
        fold_toggle = &quot;za&quot;,         -- Toggle fold (expand/collapse current node)
        fold_toggle_recursive = &quot;zA&quot;, -- Toggle fold recursively
        fold_open_all = &quot;zR&quot;,       -- Open all folds in tree
        fold_close_all = &quot;zM&quot;,      -- Close all folds in tree
      },
      conflict = {
        accept_incoming = &quot;&amp;lt;leader&amp;gt;ct&quot;,  -- Accept incoming (theirs/left) change
        accept_current = &quot;&amp;lt;leader&amp;gt;co&quot;,   -- Accept current (ours/right) change
        accept_both = &quot;&amp;lt;leader&amp;gt;cb&quot;,      -- Accept both changes (incoming first)
        discard = &quot;&amp;lt;leader&amp;gt;cx&quot;,          -- Discard both, keep base
        -- Accept all (whole file) - uppercase versions
        accept_all_incoming = &quot;&amp;lt;leader&amp;gt;cT&quot;,  -- Accept ALL incoming changes
        accept_all_current = &quot;&amp;lt;leader&amp;gt;cO&quot;,   -- Accept ALL current changes
        accept_all_both = &quot;&amp;lt;leader&amp;gt;cB&quot;,      -- Accept ALL both changes
        discard_all = &quot;&amp;lt;leader&amp;gt;cX&quot;,          -- Discard ALL, reset to base
        next_conflict = &quot;]x&quot;,            -- Jump to next conflict
        prev_conflict = &quot;[x&quot;,            -- Jump to previous conflict
        diffget_incoming = &quot;2do&quot;,        -- Get hunk from incoming (left/theirs) buffer
        diffget_current = &quot;3do&quot;,         -- Get hunk from current (right/ours) buffer
      },
    },
  },
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The C library will be downloaded automatically on first use. No &lt;code&gt;build&lt;/code&gt; step needed!&lt;/p&gt; 
&lt;h3&gt;Managing Library Installation&lt;/h3&gt; 
&lt;p&gt;The plugin automatically manages the C library installation:&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Automatic Updates:&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;The library is automatically downloaded on first use&lt;/li&gt; 
 &lt;li&gt;When you update the plugin to a new version, the library is automatically updated to match&lt;/li&gt; 
 &lt;li&gt;No manual intervention required!&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong&gt;Manual Installation Commands:&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-vim&quot;&gt;&quot; Install/update the library manually
:CodeDiff install

&quot; Force reinstall (useful for troubleshooting)
:CodeDiff install!
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;Version Management:&lt;/strong&gt; The installer reads the &lt;code&gt;VERSION&lt;/code&gt; file to download the matching library version from GitHub releases. This ensures compatibility between the Lua code and C library.&lt;/p&gt; 
&lt;h3&gt;Manual Installation&lt;/h3&gt; 
&lt;p&gt;If you prefer to install manually without a plugin manager:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;strong&gt;Clone the repository:&lt;/strong&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/esmuellert/codediff.nvim ~/.local/share/nvim/codediff.nvim
&lt;/code&gt;&lt;/pre&gt; 
&lt;ol start=&quot;2&quot;&gt; 
 &lt;li&gt;&lt;strong&gt;Add to your Neovim runtime path in &lt;code&gt;init.lua&lt;/code&gt;:&lt;/strong&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;vim.opt.rtp:append(&quot;~/.local/share/nvim/codediff.nvim&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;ol start=&quot;3&quot;&gt; 
 &lt;li&gt;&lt;strong&gt;Install the C library:&lt;/strong&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;The plugin requires a C library binary in the plugin root directory. The plugin auto-detects these filenames:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;libvscode_diff.so&lt;/code&gt; or &lt;code&gt;libvscode_diff_&amp;lt;version&amp;gt;.so&lt;/code&gt; (Linux/BSD)&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;libvscode_diff.dylib&lt;/code&gt; or &lt;code&gt;libvscode_diff_&amp;lt;version&amp;gt;.dylib&lt;/code&gt; (macOS)&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;libvscode_diff.dll&lt;/code&gt; or &lt;code&gt;libvscode_diff_&amp;lt;version&amp;gt;.dll&lt;/code&gt; (Windows)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong&gt;Option A: Download from GitHub releases&lt;/strong&gt; (recommended)&lt;/p&gt; 
&lt;p&gt;Download the appropriate binary from the &lt;a href=&quot;https://github.com/esmuellert/codediff.nvim/releases&quot;&gt;GitHub releases page&lt;/a&gt; and place it in the plugin root directory. Rename it to match the expected format: &lt;code&gt;libvscode_diff.so&lt;/code&gt;/&lt;code&gt;.dylib&lt;/code&gt;/&lt;code&gt;.dll&lt;/code&gt; or &lt;code&gt;libvscode_diff_&amp;lt;version&amp;gt;.so&lt;/code&gt;/&lt;code&gt;.dylib&lt;/code&gt;/&lt;code&gt;.dll&lt;/code&gt;. &lt;strong&gt;Linux users&lt;/strong&gt;: If your system lacks OpenMP, also download &lt;code&gt;libgomp_linux_{arch}_{version}.so.1&lt;/code&gt; and rename it to &lt;code&gt;libgomp.so.1&lt;/code&gt; in the same directory.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Option B: Build from source&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;Build requirements: C compiler (GCC/Clang/MSVC/MinGW) or CMake 3.15+&lt;/p&gt; 
&lt;p&gt;Using build scripts (no CMake required):&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Linux/macOS/BSD
./build.sh

# Windows
build.cmd
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Or using CMake:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cmake -B build
cmake --build build
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Both methods automatically place the library in the plugin root directory.&lt;/p&gt; 
&lt;h2&gt;Usage&lt;/h2&gt; 
&lt;p&gt;The &lt;code&gt;:CodeDiff&lt;/code&gt; command supports multiple modes:&lt;/p&gt; 
&lt;h3&gt;File Explorer Mode&lt;/h3&gt; 
&lt;p&gt;Open an interactive file explorer showing changed files:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-vim&quot;&gt;&quot; Show git status in explorer (default)
:CodeDiff

&quot; Show changes for specific revision in explorer
:CodeDiff HEAD~5

&quot; Compare against a branch
:CodeDiff main

&quot; Compare against a specific commit
:CodeDiff abc123

&quot; Compare two revisions (e.g. HEAD vs main)
:CodeDiff main HEAD

&quot; Override layout for this invocation (works with all subcommands)
:CodeDiff --inline
:CodeDiff main --side-by-side
&lt;/code&gt;&lt;/pre&gt; 
&lt;h4&gt;PR-like Diff (Merge-base)&lt;/h4&gt; 
&lt;p&gt;Show only changes introduced since branching from a base branch—exactly like a Pull Request:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-vim&quot;&gt;&quot; Compare merge-base(main, HEAD) vs working tree
&quot; Shows only YOUR changes since you branched from main
:CodeDiff main...

&quot; Compare merge-base(main, HEAD) vs HEAD (committed changes only)
:CodeDiff main...HEAD

&quot; Compare merge-base between two branches
:CodeDiff develop...feature/new-ui
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This uses &lt;code&gt;git merge-base&lt;/code&gt; semantics (equivalent to &lt;code&gt;git diff main...HEAD&lt;/code&gt;), showing only the changes introduced on your branch, not changes that happened on the base branch since you branched.&lt;/p&gt; 
&lt;h3&gt;Git Diff Mode&lt;/h3&gt; 
&lt;p&gt;Compare the current buffer with a git revision:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-vim&quot;&gt;&quot; Compare with last commit
:CodeDiff file HEAD

&quot; Compare with previous commit
:CodeDiff file HEAD~1

&quot; Compare with specific commit
:CodeDiff file abc123

&quot; Compare with branch
:CodeDiff file main

&quot; Compare with tag
:CodeDiff file v1.0.0

&quot; Compare two revisions for current file
:CodeDiff file main HEAD

&quot; PR-like diff: compare merge-base(main, HEAD) vs working tree
:CodeDiff file main...
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;Requirements:&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Current buffer must be saved to a file&lt;/li&gt; 
 &lt;li&gt;File must be in a git repository&lt;/li&gt; 
 &lt;li&gt;Git revision must exist&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong&gt;Behavior:&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Left buffer: Git version (at specified revision) - readonly&lt;/li&gt; 
 &lt;li&gt;Right buffer: Current buffer content - readonly&lt;/li&gt; 
 &lt;li&gt;Opens in a new tab automatically&lt;/li&gt; 
 &lt;li&gt;Async operation - won&#39;t block Neovim&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;File Comparison Mode&lt;/h3&gt; 
&lt;p&gt;Compare two arbitrary files side-by-side:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-vim&quot;&gt;:CodeDiff file file_a.txt file_b.txt
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Directory Comparison Mode&lt;/h3&gt; 
&lt;p&gt;Compare two directories without git:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-vim&quot;&gt;&quot; Auto-detect directories
:CodeDiff ~/project-v1 ~/project-v2

&quot; Explicit dir subcommand
:CodeDiff dir /path/to/dir1 /path/to/dir2
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Shows files as Added (A), Deleted (D), or Modified (M) using file size plus byte-level content comparison. Select a file to view its diff.&lt;/p&gt; 
&lt;h3&gt;File History Mode&lt;/h3&gt; 
&lt;p&gt;Review commits on a per-commit basis:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-vim&quot;&gt;&quot; Show last 50 commits
:CodeDiff history

&quot; Show last N commits
:CodeDiff history HEAD~10

&quot; Show commits in a range (great for PR review)
:CodeDiff history origin/main..HEAD

&quot; Show commits for current file only
:CodeDiff history HEAD~20 %

&quot; Show commits for a specific file
:CodeDiff history HEAD~10 path/to/file.lua

&quot; Show commits in chronological order (oldest first)
:CodeDiff history --reverse
:CodeDiff history HEAD~10 --reverse
:CodeDiff history origin/main..HEAD -r
:CodeDiff history HEAD~20 % --reverse

&quot; Compare each commit against the current working tree
:CodeDiff history --base WORKING

&quot; Compare each commit against HEAD
:CodeDiff history --base HEAD

&quot; Line-range history: show only commits that changed the selected lines
:&#39;&amp;lt;,&#39;&amp;gt;CodeDiff history
:&#39;&amp;lt;,&#39;&amp;gt;CodeDiff history HEAD~10
:&#39;&amp;lt;,&#39;&amp;gt;CodeDiff history --reverse
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The history panel shows a list of commits. Each commit can be expanded to show its changed files. Select a file to view the diff between the commit and its parent (&lt;code&gt;commit^&lt;/code&gt; vs &lt;code&gt;commit&lt;/code&gt;).&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Options:&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;--reverse&lt;/code&gt; or &lt;code&gt;-r&lt;/code&gt;: Show commits in chronological order (oldest first) instead of reverse chronological. Useful for following development story from beginning to end, or reviewing PR changes in the order they were made.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;--base&lt;/code&gt; or &lt;code&gt;-b&lt;/code&gt;: Compare each commit against a fixed revision instead of its parent. Accepts any git revision (&lt;code&gt;HEAD&lt;/code&gt;, branch name, commit hash) or &lt;code&gt;WORKING&lt;/code&gt; for the current working tree.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;--inline&lt;/code&gt; / &lt;code&gt;--side-by-side&lt;/code&gt;: Override the diff layout for this invocation. These flags work with all &lt;code&gt;:CodeDiff&lt;/code&gt; subcommands.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong&gt;Visual selection:&lt;/strong&gt; When called with a visual range (&lt;code&gt;:&#39;&amp;lt;,&#39;&amp;gt;CodeDiff history&lt;/code&gt;), only commits that modified the selected lines are shown. This uses &lt;code&gt;git log -L&lt;/code&gt; under the hood and is useful for tracing the evolution of a specific function or block in a large file.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;History Keymaps:&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;i&lt;/code&gt; - Toggle between list and tree view for files under commits&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Git Merge Tool&lt;/h3&gt; 
&lt;p&gt;Use CodeDiff as your git merge tool for resolving conflicts:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git config --global merge.tool codediff
git config --global mergetool.codediff.cmd &#39;nvim &quot;$MERGED&quot; -c &quot;CodeDiff merge \&quot;$MERGED\&quot;&quot;&#39;
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Git Diff Tool&lt;/h3&gt; 
&lt;p&gt;Use CodeDiff as your git diff tool for viewing changes:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git config --global diff.tool codediff
git config --global difftool.codediff.cmd &#39;nvim &quot;$LOCAL&quot; &quot;$REMOTE&quot; +&quot;CodeDiff file $LOCAL $REMOTE&quot;&#39;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Then use &lt;code&gt;git difftool&lt;/code&gt; to view diffs:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git difftool                      # View all uncommitted changes
git difftool HEAD~2 HEAD          # Compare two commits
git difftool main feature-branch  # Compare branches
git difftool -y                   # Skip confirmation prompts
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Lua API&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- Primary user API - setup configuration
require(&quot;codediff&quot;).setup({
  highlights = {
    line_insert = &quot;DiffAdd&quot;,
    line_delete = &quot;DiffDelete&quot;,
    char_brightness = 1.4,
  },
})

-- Advanced usage - direct access to internal modules
local diff = require(&quot;codediff.diff&quot;)
local render = require(&quot;codediff.ui&quot;)
local git = require(&quot;codediff.git&quot;)

-- Example 1: Compute diff between two sets of lines
local lines_a = {&quot;line 1&quot;, &quot;line 2&quot;}
local lines_b = {&quot;line 1&quot;, &quot;modified line 2&quot;}
local lines_diff = diff.compute_diff(lines_a, lines_b)

-- Example 2: Get file content from git (async)
git.get_file_content(&quot;HEAD~1&quot;, &quot;/path/to/repo&quot;, &quot;relative/path.lua&quot;, function(err, lines)
  if err then
    vim.notify(err, vim.log.levels.ERROR)
    return
  end
  -- Use lines...
end)

-- Example 3: Get git root for a file (async)
git.get_git_root(&quot;/path/to/file.lua&quot;, function(err, git_root)
  if not err then
    -- File is in a git repository
  end
end)
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;User Autocmd Events&lt;/h3&gt; 
&lt;p&gt;CodeDiff emits &lt;code&gt;User&lt;/code&gt; autocmd events at key lifecycle points, allowing you to customize behavior without config flags:&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Event&lt;/th&gt; 
   &lt;th&gt;When&lt;/th&gt; 
   &lt;th&gt;Data&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;CodeDiffOpen&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;After diff view is fully ready&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;tabpage&lt;/code&gt;, &lt;code&gt;mode&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;CodeDiffClose&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Before cleanup starts&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;tabpage&lt;/code&gt;, &lt;code&gt;mode&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;CodeDiffFileSelect&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;When a file is selected in explorer&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;tabpage&lt;/code&gt;, &lt;code&gt;path&lt;/code&gt;, &lt;code&gt;status&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;&lt;code&gt;mode&lt;/code&gt; is one of &lt;code&gt;&quot;explorer&quot;&lt;/code&gt;, &lt;code&gt;&quot;standalone&quot;&lt;/code&gt;, or &lt;code&gt;&quot;history&quot;&lt;/code&gt;.&lt;/p&gt; 
&lt;details&gt; 
 &lt;summary&gt;Example: Disable cursorline in diff windows&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;vim.api.nvim_create_autocmd(&quot;User&quot;, {
  pattern = &quot;CodeDiffOpen&quot;,
  callback = function()
    for _, win in ipairs(vim.api.nvim_tabpage_list_wins(0)) do
      vim.wo[win].cursorline = false
    end
  end,
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;Example: Hide tabline while CodeDiff is open&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;vim.api.nvim_create_autocmd(&quot;User&quot;, {
  pattern = &quot;CodeDiffOpen&quot;,
  callback = function()
    vim.g.codediff_saved_showtabline = vim.o.showtabline
    vim.o.showtabline = 0
  end,
})
vim.api.nvim_create_autocmd(&quot;User&quot;, {
  pattern = &quot;CodeDiffClose&quot;,
  callback = function()
    if vim.g.codediff_saved_showtabline then
      vim.o.showtabline = vim.g.codediff_saved_showtabline
      vim.g.codediff_saved_showtabline = nil
    end
  end,
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; ``` 
&lt;h2&gt;Architecture&lt;/h2&gt; 
&lt;h3&gt;Components&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt; &lt;p&gt;&lt;strong&gt;C Module&lt;/strong&gt; (&lt;code&gt;libvscode-diff/&lt;/code&gt;): Fast diff computation and render plan generation&lt;/p&gt; 
  &lt;ul&gt; 
   &lt;li&gt;Myers diff algorithm&lt;/li&gt; 
   &lt;li&gt;Character-level refinement for highlighting&lt;/li&gt; 
   &lt;li&gt;Matches VSCode&#39;s &lt;code&gt;rangeMapping.ts&lt;/code&gt; data structures&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;strong&gt;Lua FFI Layer&lt;/strong&gt; (&lt;code&gt;lua/vscode-diff/diff.lua&lt;/code&gt;): Bridge between C and Lua&lt;/p&gt; 
  &lt;ul&gt; 
   &lt;li&gt;FFI declarations matching C structs&lt;/li&gt; 
   &lt;li&gt;Type conversions between C and Lua&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;strong&gt;Render Module&lt;/strong&gt; (&lt;code&gt;lua/vscode-diff/render/&lt;/code&gt;): Neovim buffer rendering&lt;/p&gt; 
  &lt;ul&gt; 
   &lt;li&gt;VSCode-style highlight groups&lt;/li&gt; 
   &lt;li&gt;Virtual line insertion for alignment&lt;/li&gt; 
   &lt;li&gt;Side-by-side window management&lt;/li&gt; 
   &lt;li&gt;Git status explorer&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Syntax Highlighting&lt;/h3&gt; 
&lt;p&gt;The plugin handles syntax highlighting differently based on buffer type:&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Working files (editable):&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Behaves like normal buffers with standard highlighting&lt;/li&gt; 
 &lt;li&gt;Inlay hints disabled by default (incompatible with diff highlights)&lt;/li&gt; 
 &lt;li&gt;All LSP features available&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong&gt;Git history files (read-only):&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Virtual buffers stored in memory, discarded when tab closes&lt;/li&gt; 
 &lt;li&gt;TreeSitter highlighting applied automatically (if installed)&lt;/li&gt; 
 &lt;li&gt;LSP not attached (most features meaningless for historical files)&lt;/li&gt; 
 &lt;li&gt;Semantic token highlighting fetched via LSP request when available&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Highlight Groups&lt;/h3&gt; 
&lt;p&gt;The plugin defines highlight groups matching VSCode&#39;s diff colors:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;CodeDiffLineInsert&lt;/code&gt; - Light green background for inserted lines&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;CodeDiffLineDelete&lt;/code&gt; - Light red background for deleted lines&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;CodeDiffCharInsert&lt;/code&gt; - Deep/dark green for inserted characters&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;CodeDiffCharDelete&lt;/code&gt; - Deep/dark red for deleted characters&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;CodeDiffFiller&lt;/code&gt; - Gray foreground for filler line slashes (&lt;code&gt;╱╱╱&lt;/code&gt;)&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;CodeDiffLineMove&lt;/code&gt; - Background for moved code lines (derived from DiffChange)&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;CodeDiffMoveTo&lt;/code&gt; - Sign column and annotation color for move indicators&lt;/li&gt; 
&lt;/ul&gt; 
&lt;details open&gt; 
 &lt;summary&gt;&lt;b&gt;📸 Visual Examples&lt;/b&gt; (click to collapse)&lt;/summary&gt; 
 &lt;br /&gt; 
 &lt;p&gt;&lt;strong&gt;Dawnfox Light&lt;/strong&gt; - Default configuration with auto-detected brightness (&lt;code&gt;char_brightness = 0.92&lt;/code&gt; for light themes):&lt;/p&gt; 
 &lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/760fa8be-dba7-4eb5-b71b-c53fb3aa6edf&quot; alt=&quot;Dawnfox Light theme with default auto color selection&quot; /&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;strong&gt;Catppuccin Mocha&lt;/strong&gt; - Default configuration with auto-detected brightness (&lt;code&gt;char_brightness = 1.4&lt;/code&gt; for dark themes):&lt;/p&gt; 
 &lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/0187ff6c-9a2b-45dc-b9be-c15fd2a796d9&quot; alt=&quot;Catppuccin Mocha theme with default auto color selection&quot; /&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;strong&gt;Kanagawa Lotus&lt;/strong&gt; - Default configuration with auto-detected brightness (&lt;code&gt;char_brightness = 0.92&lt;/code&gt; for light themes):&lt;/p&gt; 
 &lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/9e4a0e1c-0ebf-47c8-a8b5-f8a0966c5592&quot; alt=&quot;Kanagawa Lotus theme with default auto color selection&quot; /&gt;&lt;/p&gt; 
&lt;/details&gt; 
&lt;p&gt;&lt;strong&gt;Default behavior:&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Uses your colorscheme&#39;s &lt;code&gt;DiffAdd&lt;/code&gt; and &lt;code&gt;DiffDelete&lt;/code&gt; for line-level highlights&lt;/li&gt; 
 &lt;li&gt;Character-level highlights are auto-adjusted based on &lt;code&gt;vim.o.background&lt;/code&gt;: 
  &lt;ul&gt; 
   &lt;li&gt;&lt;strong&gt;Dark themes&lt;/strong&gt; (&lt;code&gt;background = &quot;dark&quot;&lt;/code&gt;): Brightness multiplied by &lt;code&gt;1.4&lt;/code&gt; (40% brighter)&lt;/li&gt; 
   &lt;li&gt;&lt;strong&gt;Light themes&lt;/strong&gt; (&lt;code&gt;background = &quot;light&quot;&lt;/code&gt;): Brightness multiplied by &lt;code&gt;0.92&lt;/code&gt; (8% darker)&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;This auto-detection works out-of-box for most colorschemes&lt;/li&gt; 
 &lt;li&gt;You can override with explicit &lt;code&gt;char_brightness&lt;/code&gt; value if needed&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong&gt;Customization examples:&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- Use hex colors directly
highlights = {
  line_insert = &quot;#1d3042&quot;,
  line_delete = &quot;#351d2b&quot;,
  char_brightness = 1.5,  -- Override auto-detection with explicit value
}

-- Override character colors explicitly
highlights = {
  line_insert = &quot;DiffAdd&quot;,
  line_delete = &quot;DiffDelete&quot;,
  char_insert = &quot;#3fb950&quot;,
  char_delete = &quot;#ff7b72&quot;,
}

-- Mix highlight groups and hex colors
highlights = {
  line_insert = &quot;String&quot;,
  char_delete = &quot;#ff0000&quot;,
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Development&lt;/h2&gt; 
&lt;h3&gt;Building&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;make clean &amp;amp;&amp;amp; make
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Testing&lt;/h3&gt; 
&lt;p&gt;Run all tests:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;make test              # Run all tests (C + Lua integration)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Run specific test suites:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;make test-c            # C unit tests only
make test-lua          # Lua integration tests only
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;For more details on the test structure, see &lt;a href=&quot;https://raw.githubusercontent.com/esmuellert/codediff.nvim/main/tests/README.md&quot;&gt;&lt;code&gt;tests/README.md&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt; 
&lt;h3&gt;Project Structure&lt;/h3&gt; 
&lt;pre&gt;&lt;code&gt;codediff.nvim/
├── libvscode-diff/        # C diff engine
│   ├── src/               # C implementation
│   ├── include/           # C headers
│   └── tests/             # C unit tests
├── lua/
│   ├── codediff/          # Main Lua modules
│   │   ├── init.lua       # Main API
│   │   ├── config.lua     # Configuration
│   │   ├── diff.lua       # FFI interface
│   │   ├── git.lua        # Git operations
│   │   ├── commands.lua   # Command handlers
│   │   ├── installer.lua  # Binary installer
│   │   └── ui/            # UI components
│   │       ├── core.lua       # Diff rendering
│   │       ├── highlights.lua # Highlight setup
│   │       ├── view/          # View management
│   │       ├── explorer/      # Git status explorer
│   │       ├── history/       # Commit history panel
│   │       ├── lifecycle/     # Lifecycle management
│   │       └── conflict/      # Conflict resolution
│   └── vscode-diff/       # Backward compatibility shims
├── plugin/                # Plugin entry point
│   └── codediff.lua       # Auto-loaded on startup
├── tests/                 # Test suite (plenary.nvim)
├── docs/                  # Documentation and development history
├── Makefile               # Build automation
└── README.md
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Roadmap&lt;/h2&gt; 
&lt;h3&gt;Current Status: Complete ✅&lt;/h3&gt; 
&lt;ul class=&quot;task-list&quot;&gt; 
 &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_0&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_0&quot;&gt; C-based diff computation with VSCode-identical algorithm&lt;/label&gt;&lt;/li&gt; 
 &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_1&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_1&quot;&gt; Two-tier highlighting (line + character level)&lt;/label&gt;&lt;/li&gt; 
 &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_2&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_2&quot;&gt; Side-by-side view with synchronized scrolling&lt;/label&gt;&lt;/li&gt; 
 &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_3&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_3&quot;&gt; Git integration (async operations, status explorer, revision comparison)&lt;/label&gt;&lt;/li&gt; 
 &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_4&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_4&quot;&gt; Auto-refresh on buffer changes (live diff updates)&lt;/label&gt;&lt;/li&gt; 
 &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_5&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_5&quot;&gt; Syntax highlighting preservation (LSP semantic tokens + TreeSitter)&lt;/label&gt;&lt;/li&gt; 
 &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_6&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_6&quot;&gt; Read-only buffers with virtual filler lines for alignment&lt;/label&gt;&lt;/li&gt; 
 &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_7&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_7&quot;&gt; Flexible highlight configuration (colorscheme-aware)&lt;/label&gt;&lt;/li&gt; 
 &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_8&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_8&quot;&gt; Integration tests (C + Lua with plenary.nvim)&lt;/label&gt;&lt;/li&gt; 
 &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_9&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_9&quot;&gt; File history mode (per-commit review, similar to DiffviewFileHistory)&lt;/label&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Future Enhancements&lt;/h3&gt; 
&lt;ul class=&quot;task-list&quot;&gt; 
 &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_10&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_10&quot;&gt; Inline diff mode (single buffer view)&lt;/label&gt;&lt;/li&gt; 
 &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_11&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_11&quot;&gt; Moved code detection (VSCode parity)&lt;/label&gt;&lt;/li&gt; 
 &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_12&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_12&quot;&gt; Fold support for large diffs&lt;/label&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;VSCode Reference&lt;/h2&gt; 
&lt;p&gt;This plugin follows VSCode&#39;s diff rendering architecture:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Data structures&lt;/strong&gt;: Based on &lt;code&gt;src/vs/editor/common/diff/rangeMapping.ts&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Decorations&lt;/strong&gt;: Based on &lt;code&gt;src/vs/editor/browser/widget/diffEditor/registrations.contribution.ts&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Styling&lt;/strong&gt;: Based on &lt;code&gt;src/vs/editor/browser/widget/diffEditor/style.css&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;License&lt;/h2&gt; 
&lt;p&gt;MIT&lt;/p&gt; 
&lt;h2&gt;Contributing&lt;/h2&gt; 
&lt;p&gt;Contributions are welcome! Please ensure:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;C tests pass (&lt;code&gt;make test&lt;/code&gt;)&lt;/li&gt; 
 &lt;li&gt;Lua tests pass&lt;/li&gt; 
 &lt;li&gt;Code follows existing style&lt;/li&gt; 
 &lt;li&gt;Updates to README if adding features&lt;/li&gt; 
&lt;/ol&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/b6244081c30b969d97657be3f2a3a54de6e97376e91682950771a47a43bb942a/esmuellert/codediff.nvim" medium="image" />
      
    </item>
    
    <item>
      <title>lite-xl/lite-xl</title>
      <link>https://github.com/lite-xl/lite-xl</link>
      <description>&lt;p&gt;A lightweight text editor written in Lua&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;Lite XL&lt;/h1&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/lite-xl/lite-xl/actions/workflows/build.yml&quot;&gt;&lt;img src=&quot;https://github.com/lite-xl/lite-xl/actions/workflows/build.yml/badge.svg?sanitize=true&quot; alt=&quot;CI&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://discord.gg/UQKnzBhY5H&quot;&gt;&lt;img src=&quot;https://img.shields.io/discord/847122429742809208?label=discord&amp;amp;logo=discord&quot; alt=&quot;Discord Badge Image&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/433545/111063905-66943980-84b1-11eb-9040-3876f1133b20.png&quot; alt=&quot;screenshot-dark&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;A lightweight text editor written in Lua, adapted from &lt;a href=&quot;https://github.com/rxi/lite&quot;&gt;lite&lt;/a&gt;.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/lite-xl/lite-xl/releases/latest&quot;&gt;Get Lite XL&lt;/a&gt;&lt;/strong&gt; — Download for Windows, Linux and Mac OS.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/lite-xl/lite-xl-plugins&quot;&gt;Get plugins&lt;/a&gt;&lt;/strong&gt; — Add additional functionality, adapted for Lite XL.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/lite-xl/lite-xl-colors&quot;&gt;Get color themes&lt;/a&gt;&lt;/strong&gt; — Add additional colors themes.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Please refer to our &lt;a href=&quot;https://lite-xl.com&quot;&gt;website&lt;/a&gt; for the user and developer documentation, including &lt;a href=&quot;https://lite-xl.com/setup/building-from-source/&quot;&gt;build&lt;/a&gt; instructions details. A quick build guide is described below.&lt;/p&gt; 
&lt;p&gt;Lite XL has support for high DPI display on Windows and Linux and, since 1.16.7 release, it supports &lt;strong&gt;retina displays&lt;/strong&gt; on macOS.&lt;/p&gt; 
&lt;p&gt;Please note that Lite XL is compatible with lite for most plugins and all color themes. We provide a separate lite-xl-plugins repository for Lite XL, because in some cases some adaptations may be needed to make them work better with Lite XL. The repository with modified plugins is &lt;a href=&quot;https://github.com/lite-xl/lite-xl-plugins&quot;&gt;https://github.com/lite-xl/lite-xl-plugins&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;The changes and differences between Lite XL and rxi/lite are listed in the &lt;a href=&quot;https://github.com/lite-xl/lite-xl/raw/master/changelog.md&quot;&gt;changelog&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Overview&lt;/h2&gt; 
&lt;p&gt;Lite XL is derived from &lt;a href=&quot;https://github.com/rxi/lite&quot;&gt;lite&lt;/a&gt;. It is a lightweight text editor written mostly in Lua — it aims to provide something practical, pretty, &lt;em&gt;small&lt;/em&gt; and fast easy to modify and extend, or to use without doing either.&lt;/p&gt; 
&lt;p&gt;The aim of Lite XL compared to lite is to be more user friendly, improve the quality of font rendering, and reduce CPU usage.&lt;/p&gt; 
&lt;h2&gt;Customization&lt;/h2&gt; 
&lt;p&gt;Additional functionality can be added through plugins which are available in the &lt;a href=&quot;https://github.com/rxi/lite-plugins&quot;&gt;plugins repository&lt;/a&gt; or in the &lt;a href=&quot;https://github.com/lite-xl/lite-xl-plugins&quot;&gt;Lite XL plugins repository&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;Additional color themes can be found in the &lt;a href=&quot;https://github.com/lite-xl/lite-xl-colors&quot;&gt;colors repository&lt;/a&gt;. These color themes are bundled with all releases of Lite XL by default.&lt;/p&gt; 
&lt;h2&gt;Quick Build Guide&lt;/h2&gt; 
&lt;p&gt;To compile Lite XL yourself, you must have the following dependencies installed via your desired package manager, or manually.&lt;/p&gt; 
&lt;h3&gt;Prerequisites&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;Meson (&amp;gt;=0.63)&lt;/li&gt; 
 &lt;li&gt;Ninja&lt;/li&gt; 
 &lt;li&gt;SDL2&lt;/li&gt; 
 &lt;li&gt;PCRE2&lt;/li&gt; 
 &lt;li&gt;FreeType2&lt;/li&gt; 
 &lt;li&gt;Lua 5.4&lt;/li&gt; 
 &lt;li&gt;A working C compiler (GCC / Clang / MSVC)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;SDL2, PCRE2, FreeType2 and Lua will be downloaded by Meson if &lt;code&gt;--wrap-mode=forcefallback&lt;/code&gt; or &lt;code&gt;--wrap-mode=default&lt;/code&gt; is specified.&lt;/p&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-note&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-info mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Note&lt;/p&gt;
 &lt;p&gt;MSVC is used in the CI, but MSVC-compiled binaries are not distributed officially or tested extensively for bugs.&lt;/p&gt; 
&lt;/div&gt; 
&lt;p&gt;On Linux, you may install the following dependencies for the SDL2 X11 and/or Wayland backend to work properly:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;libX11-devel&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;libXi-devel&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;libXcursor-devel&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;libxkbcommon-devel&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;libXrandr-devel&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;wayland-devel&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;wayland-protocols-devel&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;dbus-devel&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;ibus-devel&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;The following command can be used to install the dependencies in Ubuntu:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;apt-get install python3.8 python3-pip build-essential git cmake wayland-protocols libsdl2-dev
pip3 install meson ninja
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Please refer to &lt;a href=&quot;https://github.com/lite-xl/lite-xl-build-box&quot;&gt;lite-xl-build-box&lt;/a&gt; for a working Linux build environment used to package official Lite XL releases.&lt;/p&gt; 
&lt;p&gt;On macOS, you must install bash via Brew, as the default bash version on macOS is antiquated and may not run the build script correctly.&lt;/p&gt; 
&lt;h3&gt;Building&lt;/h3&gt; 
&lt;p&gt;You can use &lt;code&gt;scripts/build.sh&lt;/code&gt; to set up Lite XL and build it.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;$ bash build.sh --help
# Usage: scripts/build.sh &amp;lt;OPTIONS&amp;gt;
# 
# Available options:
# 
# -b --builddir DIRNAME         Sets the name of the build directory (not path).
#                               Default: &#39;build-x86_64-linux&#39;.
#    --debug                    Debug this script.
# -f --forcefallback            Force to build dependencies statically.
# -h --help                     Show this help and exit.
# -d --debug-build              Builds a debug build.
# -p --prefix PREFIX            Install directory prefix. Default: &#39;/&#39;.
# -B --bundle                   Create an App bundle (macOS only)
# -A --addons                   Add in addons
# -P --portable                 Create a portable binary package.
# -r --reconfigure              Tries to reuse the meson build directory, if possible.
#                               Default: Deletes the build directory and recreates it.
# -O --pgo                      Use profile guided optimizations (pgo).
#                               macOS: disabled when used with --bundle,
#                               Windows: Implicit being the only option.
#    --cross-platform PLATFORM  Cross compile for this platform.
#                               The script will find the appropriate
#                               cross file in &#39;resources/cross&#39;.
#    --cross-arch ARCH          Cross compile for this architecture.
#                               The script will find the appropriate
#                               cross file in &#39;resources/cross&#39;.
#    --cross-file CROSS_FILE    Cross compile with the given cross file.
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Alternatively, you can use the following commands to customize the build:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;meson setup --buildtype=release --prefix &amp;lt;prefix&amp;gt; build
meson compile -C build
DESTDIR=&quot;$(pwd)/lite-xl&quot; meson install --skip-subprojects -C build
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;where &lt;code&gt;&amp;lt;prefix&amp;gt;&lt;/code&gt; might be one of &lt;code&gt;/&lt;/code&gt;, &lt;code&gt;/usr&lt;/code&gt; or &lt;code&gt;/opt&lt;/code&gt;, the default is &lt;code&gt;/&lt;/code&gt;. To build a bundle application on macOS:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;meson setup --buildtype=release --Dbundle=true --prefix / build
meson compile -C build
DESTDIR=&quot;$(pwd)/Lite XL.app&quot; meson install --skip-subprojects -C build
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Please note that the package is relocatable to any prefix and the option prefix affects only the place where the application is actually installed.&lt;/p&gt; 
&lt;h2&gt;Installing Prebuilt&lt;/h2&gt; 
&lt;p&gt;Head over to &lt;a href=&quot;https://github.com/lite-xl/lite-xl/releases&quot;&gt;releases&lt;/a&gt; and download the version for your operating system.&lt;/p&gt; 
&lt;p&gt;The prebuilt releases supports the following OSes:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Windows 7 and above&lt;/li&gt; 
 &lt;li&gt;Ubuntu 18.04 and above (glibc 2.27 and above)&lt;/li&gt; 
 &lt;li&gt;OS X El Capitan and above (version 10.11 and above)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Some distributions may provide custom binaries for their platforms.&lt;/p&gt; 
&lt;h3&gt;Windows&lt;/h3&gt; 
&lt;p&gt;Lite XL comes with installers on Windows for typical installations. Alternatively, we provide ZIP archives that you can download and extract anywhere and run directly.&lt;/p&gt; 
&lt;p&gt;To make Lite XL portable (e.g. running Lite XL from a thumb drive), simply create a &lt;code&gt;user&lt;/code&gt; folder where &lt;code&gt;lite-xl.exe&lt;/code&gt; is located. Lite XL will load and store all your configurations and plugins in the folder.&lt;/p&gt; 
&lt;h3&gt;macOS&lt;/h3&gt; 
&lt;p&gt;We provide DMG files for macOS. Simply drag the program into your Applications folder.&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt; Newer versions of Lite XL are signed with a self-signed certificate, so you&#39;ll have to follow these steps when running Lite XL for the first time.&lt;/p&gt; 
 &lt;ol&gt; 
  &lt;li&gt;Find Lite XL in Finder (do not open it in Launchpad).&lt;/li&gt; 
  &lt;li&gt;Control-click Lite XL, then choose &lt;code&gt;Open&lt;/code&gt; from the shortcut menu.&lt;/li&gt; 
  &lt;li&gt;Click &lt;code&gt;Open&lt;/code&gt; in the popup menu.&lt;/li&gt; 
 &lt;/ol&gt; 
 &lt;p&gt;The correct steps may vary between macOS versions, so you should refer to the &lt;a href=&quot;https://support.apple.com/en-my/guide/mac-help/mh40616/mac&quot;&gt;macOS User Guide&lt;/a&gt;.&lt;/p&gt; 
 &lt;p&gt;On an older version of Lite XL, you will need to run these commands instead:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;# clears attributes from the directory
xattr -cr /Applications/Lite\ XL.app
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;Otherwise, macOS will display a &lt;strong&gt;very misleading error&lt;/strong&gt; saying that the application is damaged.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h3&gt;Linux&lt;/h3&gt; 
&lt;p&gt;Unzip the file and &lt;code&gt;cd&lt;/code&gt; into the &lt;code&gt;lite-xl&lt;/code&gt; directory:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;tar -xzf &amp;lt;file&amp;gt;
cd lite-xl
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To run lite-xl without installing:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;./lite-xl
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To install lite-xl copy files over into appropriate directories:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;rm -rf  $HOME/.local/share/lite-xl $HOME/.local/bin/lite-xl
mkdir -p $HOME/.local/bin &amp;amp;&amp;amp; cp lite-xl $HOME/.local/bin/
mkdir -p $HOME/.local/share/lite-xl &amp;amp;&amp;amp; cp -r data/* $HOME/.local/share/lite-xl/
&lt;/code&gt;&lt;/pre&gt; 
&lt;h4&gt;Add Lite XL to PATH&lt;/h4&gt; 
&lt;p&gt;To run Lite XL from the command line, you must add it to PATH.&lt;/p&gt; 
&lt;p&gt;If &lt;code&gt;$HOME/.local/bin&lt;/code&gt; is not in PATH:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;echo -e &#39;export PATH=$PATH:$HOME/.local/bin&#39; &amp;gt;&amp;gt; $HOME/.bashrc
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Alternatively on recent versions of GNOME and KDE Plasma, you can add &lt;code&gt;$HOME/.local/bin&lt;/code&gt; to PATH via &lt;code&gt;~/.config/environment.d/envvars.conf&lt;/code&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-ini&quot;&gt;PATH=$HOME/.local/bin:$PATH
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; Some systems might not load &lt;code&gt;.bashrc&lt;/code&gt; when logging in. This can cause problems with launching applications from the desktop / menu.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h4&gt;Add Lite XL to application launchers&lt;/h4&gt; 
&lt;p&gt;To get the icon to show up in app launcher, you need to create a desktop entry and put it into &lt;code&gt;/usr/share/applications&lt;/code&gt; or &lt;code&gt;~/.local/share/applications&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;Here is an example for a desktop entry in &lt;code&gt;~/.local/share/applications/com.lite_xl.LiteXL.desktop&lt;/code&gt;, assuming Lite XL is in PATH:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-ini&quot;&gt;[Desktop Entry]
Type=Application
Name=Lite XL
Comment=A lightweight text editor written in Lua
Exec=lite-xl %F
Icon=lite-xl
Terminal=false
StartupWMClass=lite-xl
Categories=Development;IDE;
MimeType=text/plain;inode/directory;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To get the icon to show up in app launcher immediately, run:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;xdg-desktop-menu forceupdate
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Alternatively, you may log out and log in again.&lt;/p&gt; 
&lt;h4&gt;Uninstall&lt;/h4&gt; 
&lt;p&gt;To uninstall Lite XL, run:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;rm -f $HOME/.local/bin/lite-xl
rm -rf $HOME/.local/share/icons/hicolor/scalable/apps/lite-xl.svg \
          $HOME/.local/share/applications/com.lite_xl.LiteXL.desktop \
          $HOME/.local/share/metainfo/com.lite_xl.LiteXL.appdata.xml \
          $HOME/.local/share/lite-xl
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Contributing&lt;/h2&gt; 
&lt;p&gt;Any additional functionality that can be added through a plugin should be done as a plugin, after which a pull request to the &lt;a href=&quot;https://github.com/lite-xl/lite-xl-plugins&quot;&gt;Lite XL plugins repository&lt;/a&gt; can be made.&lt;/p&gt; 
&lt;p&gt;Pull requests to improve or modify the editor itself are welcome. See &lt;a href=&quot;https://raw.githubusercontent.com/lite-xl/lite-xl/master/CONTRIBUTING.md&quot;&gt;CONTRIBUTING.md&lt;/a&gt; for more details.&lt;/p&gt; 
&lt;h2&gt;Licenses&lt;/h2&gt; 
&lt;p&gt;This project is free software; you can redistribute it and/or modify it under the terms of the MIT license. See &lt;a href=&quot;https://raw.githubusercontent.com/lite-xl/lite-xl/master/LICENSE&quot;&gt;LICENSE&lt;/a&gt; for details.&lt;/p&gt; 
&lt;p&gt;See the &lt;a href=&quot;https://raw.githubusercontent.com/lite-xl/lite-xl/master/licenses/licenses.md&quot;&gt;licenses&lt;/a&gt; file for details on licenses used by the required dependencies.&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/a901765022826df7d06e2ec11945d7726119063742abe1f9851717260ef5542c/lite-xl/lite-xl" medium="image" />
      
    </item>
    
    <item>
      <title>sindrets/diffview.nvim</title>
      <link>https://github.com/sindrets/diffview.nvim</link>
      <description>&lt;p&gt;Single tabpage interface for easily cycling through diffs for all modified files for any git rev.&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;Diffview.nvim&lt;/h1&gt; 
&lt;p&gt;Single tabpage interface for easily cycling through diffs for all modified files for any git rev.&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/2786478/131269942-e34100dd-cbb9-48fe-af31-6e518ce06e9e.png&quot; alt=&quot;preview&quot; /&gt;&lt;/p&gt; 
&lt;h2&gt;Introduction&lt;/h2&gt; 
&lt;p&gt;Vim&#39;s diff mode is pretty good, but there is no convenient way to quickly bring up all modified files in a diffsplit. This plugin aims to provide a simple, unified, single tabpage interface that lets you easily review all changed files for any git rev.&lt;/p&gt; 
&lt;h2&gt;Requirements&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;Git ≥ 2.31.0 (for Git support)&lt;/li&gt; 
 &lt;li&gt;Mercurial ≥ 5.4.0 (for Mercurial support)&lt;/li&gt; 
 &lt;li&gt;Neovim ≥ 0.7.0 (with LuaJIT)&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/nvim-tree/nvim-web-devicons&quot;&gt;nvim-web-devicons&lt;/a&gt; (optional) For file icons&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Installation&lt;/h2&gt; 
&lt;p&gt;Install the plugin with your package manager of choice.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-vim&quot;&gt;&quot; Plug
Plug &#39;sindrets/diffview.nvim&#39;
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- Packer
use &quot;sindrets/diffview.nvim&quot; 
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Merge Tool&lt;/h2&gt; 
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/2786478/188286293-13bbf0ab-3595-425d-ba4a-12f514c17eb6.png&quot; alt=&quot;merge tool showcase&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;Opening a diff view during a merge or a rebase will list the conflicted files in their own section. When opening a conflicted file, it will open in a 3-way diff allowing you to resolve the merge conflicts with the context of the target branch&#39;s version, as well as the version from the branch which is being merged.&lt;/p&gt; 
&lt;p&gt;The 3-way diff is only the default layout for merge conflicts. There are multiple variations on this layout, a 4-way diff layout, and a single window layout available.&lt;/p&gt; 
&lt;p&gt;In addition to the normal &lt;code&gt;:h copy-diffs&lt;/code&gt; mappings, there are default mappings provided for jumping between conflict markers, obtaining a hunk directly from any of the diff buffers, and accepting any one, all, or none of the versions of a file given by a conflict region.&lt;/p&gt; 
&lt;p&gt;For more information on the merge tool, mappings, layouts and how to configure them, see:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;:h diffview-merge-tool&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:h diffview-config-view.x.layout&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;File History&lt;/h2&gt; 
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/2786478/188331057-f9ec9a0d-8cda-4ff8-ac98-febcc7aa4010.png&quot; alt=&quot;file history showcase&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;The file history view allows you to list all the commits that affected a given set of paths, and view the changes made in a diff split. This is a porcelain interface for git-log, and supports a good number of its options. Things like:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Filtering commits by grepping commit messages and commit authors.&lt;/li&gt; 
 &lt;li&gt;Tracing the line evolution of a given set of line ranges for multiple files.&lt;/li&gt; 
 &lt;li&gt;Only listing changes for a specific commit range, branch, or tag.&lt;/li&gt; 
 &lt;li&gt;Following file changes through renames.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Get started by opening file history for:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;The current branch: &lt;code&gt;:DiffviewFileHistory&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;The current file: &lt;code&gt;:DiffviewFileHistory %&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;For more info, see &lt;code&gt;:h :DiffviewFileHistory&lt;/code&gt;.&lt;/p&gt; 
&lt;h2&gt;Usage&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;:DiffviewOpen [git rev] [options] [ -- {paths...}]&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;Calling &lt;code&gt;:DiffviewOpen&lt;/code&gt; with no args opens a new Diffview that compares against the current index. You can also provide any valid git rev to view only changes for that rev.&lt;/p&gt; 
&lt;p&gt;Examples:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;:DiffviewOpen&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:DiffviewOpen HEAD~2&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:DiffviewOpen HEAD~4..HEAD~2&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:DiffviewOpen d4a7b0d&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:DiffviewOpen d4a7b0d^!&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:DiffviewOpen d4a7b0d..519b30e&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:DiffviewOpen origin/main...HEAD&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;You can also provide additional paths to narrow down what files are shown:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;:DiffviewOpen HEAD~2 -- lua/diffview plugin&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;For information about additional &lt;code&gt;[options]&lt;/code&gt;, visit the &lt;a href=&quot;https://github.com/sindrets/diffview.nvim/raw/main/doc/diffview.txt&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;Additional commands for convenience:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;:DiffviewClose&lt;/code&gt;: Close the current diffview. You can also use &lt;code&gt;:tabclose&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:DiffviewToggleFiles&lt;/code&gt;: Toggle the file panel.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:DiffviewFocusFiles&lt;/code&gt;: Bring focus to the file panel.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:DiffviewRefresh&lt;/code&gt;: Update stats and entries in the file list of the current Diffview.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;With a Diffview open and the default key bindings, you can cycle through changed files with &lt;code&gt;&amp;lt;tab&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;s-tab&amp;gt;&lt;/code&gt; (see configuration to change the key bindings).&lt;/p&gt; 
&lt;h4&gt;Staging&lt;/h4&gt; 
&lt;p&gt;You can stage individual hunks by editing any buffer that represents the index (after running &lt;code&gt;:DiffviewOpen&lt;/code&gt; with no &lt;code&gt;[git-rev]&lt;/code&gt; the entries under &quot;Changes&quot; will have the index buffer on the left side, and the entries under &quot;Staged changes&quot; will have it on the right side). Once you write to an index buffer the index will be updated.&lt;/p&gt; 
&lt;h3&gt;&lt;code&gt;:[range]DiffviewFileHistory [paths] [options]&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;Opens a new file history view that lists all commits that affected the given paths. This is a porcelain interface for git-log. Both &lt;code&gt;[paths]&lt;/code&gt; and &lt;code&gt;[options]&lt;/code&gt; may be specified in any order, even interchangeably.&lt;/p&gt; 
&lt;p&gt;If no &lt;code&gt;[paths]&lt;/code&gt; are given, defaults to the top-level of the working tree. The top-level will be inferred from the current buffer when possible, otherwise the cwd is used. Multiple &lt;code&gt;[paths]&lt;/code&gt; may be provided and git pathspec is supported.&lt;/p&gt; 
&lt;p&gt;If &lt;code&gt;[range]&lt;/code&gt; is given, the file history view will trace the line evolution of the given range in the current file (for more info, see the &lt;code&gt;-L&lt;/code&gt; flag in the docs).&lt;/p&gt; 
&lt;p&gt;Examples:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;:DiffviewFileHistory&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:DiffviewFileHistory %&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:DiffviewFileHistory path/to/some/file.txt&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:DiffviewFileHistory path/to/some/directory&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:DiffviewFileHistory include/this and/this :!but/not/this&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:DiffviewFileHistory --range=origin..HEAD&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:DiffviewFileHistory --range=feat/example-branch&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:&#39;&amp;lt;,&#39;&amp;gt;DiffviewFileHistory&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-important&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-report mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Important&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;h3&gt;Familiarize Yourself With &lt;code&gt;:h diff-mode&lt;/code&gt;&lt;/h3&gt; 
 &lt;p&gt;This plugin assumes you&#39;re familiar with all the features already provided by nvim&#39;s builtin diff-mode. These features include:&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;Jumping between hunks (&lt;code&gt;:h jumpto-diffs&lt;/code&gt;).&lt;/li&gt; 
  &lt;li&gt;Applying the changes of a diff hunk from any of the diffed buffers (&lt;code&gt;:h copy-diffs&lt;/code&gt;).&lt;/li&gt; 
  &lt;li&gt;And more...&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p&gt;Read the help page for more info.&lt;/p&gt; 
&lt;/div&gt; 
&lt;hr /&gt; 
&lt;br /&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-note&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-info mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Note&lt;/p&gt;
 &lt;p&gt;Additionally check out &lt;a href=&quot;https://raw.githubusercontent.com/sindrets/diffview.nvim/main/USAGE.md&quot;&gt;USAGE&lt;/a&gt; for examples of some more specific use-cases.&lt;/p&gt; 
&lt;/div&gt; 
&lt;br /&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Configuration&lt;/h2&gt; 
&lt;p&gt; &lt;/p&gt;
&lt;details&gt; 
 &lt;summary style=&quot;cursor: pointer&quot;&gt;&lt;b&gt;Example config with default values&lt;/b&gt;&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- Lua
local actions = require(&quot;diffview.actions&quot;)

require(&quot;diffview&quot;).setup({
  diff_binaries = false,    -- Show diffs for binaries
  enhanced_diff_hl = false, -- See |diffview-config-enhanced_diff_hl|
  git_cmd = { &quot;git&quot; },      -- The git executable followed by default args.
  hg_cmd = { &quot;hg&quot; },        -- The hg executable followed by default args.
  use_icons = true,         -- Requires nvim-web-devicons
  show_help_hints = true,   -- Show hints for how to open the help panel
  watch_index = true,       -- Update views and index buffers when the git index changes.
  icons = {                 -- Only applies when use_icons is true.
    folder_closed = &quot;&quot;,
    folder_open = &quot;&quot;,
  },
  signs = {
    fold_closed = &quot;&quot;,
    fold_open = &quot;&quot;,
    done = &quot;✓&quot;,
  },
  view = {
    -- Configure the layout and behavior of different types of views.
    -- Available layouts:
    --  &#39;diff1_plain&#39;
    --    |&#39;diff2_horizontal&#39;
    --    |&#39;diff2_vertical&#39;
    --    |&#39;diff3_horizontal&#39;
    --    |&#39;diff3_vertical&#39;
    --    |&#39;diff3_mixed&#39;
    --    |&#39;diff4_mixed&#39;
    -- For more info, see |diffview-config-view.x.layout|.
    default = {
      -- Config for changed files, and staged files in diff views.
      layout = &quot;diff2_horizontal&quot;,
      disable_diagnostics = false,  -- Temporarily disable diagnostics for diff buffers while in the view.
      winbar_info = false,          -- See |diffview-config-view.x.winbar_info|
    },
    merge_tool = {
      -- Config for conflicted files in diff views during a merge or rebase.
      layout = &quot;diff3_horizontal&quot;,
      disable_diagnostics = true,   -- Temporarily disable diagnostics for diff buffers while in the view.
      winbar_info = true,           -- See |diffview-config-view.x.winbar_info|
    },
    file_history = {
      -- Config for changed files in file history views.
      layout = &quot;diff2_horizontal&quot;,
      disable_diagnostics = false,  -- Temporarily disable diagnostics for diff buffers while in the view.
      winbar_info = false,          -- See |diffview-config-view.x.winbar_info|
    },
  },
  file_panel = {
    listing_style = &quot;tree&quot;,             -- One of &#39;list&#39; or &#39;tree&#39;
    tree_options = {                    -- Only applies when listing_style is &#39;tree&#39;
      flatten_dirs = true,              -- Flatten dirs that only contain one single dir
      folder_statuses = &quot;only_folded&quot;,  -- One of &#39;never&#39;, &#39;only_folded&#39; or &#39;always&#39;.
    },
    win_config = {                      -- See |diffview-config-win_config|
      position = &quot;left&quot;,
      width = 35,
      win_opts = {},
    },
  },
  file_history_panel = {
    log_options = {   -- See |diffview-config-log_options|
      git = {
        single_file = {
          diff_merges = &quot;combined&quot;,
        },
        multi_file = {
          diff_merges = &quot;first-parent&quot;,
        },
      },
      hg = {
        single_file = {},
        multi_file = {},
      },
    },
    win_config = {    -- See |diffview-config-win_config|
      position = &quot;bottom&quot;,
      height = 16,
      win_opts = {},
    },
  },
  commit_log_panel = {
    win_config = {},  -- See |diffview-config-win_config|
  },
  default_args = {    -- Default args prepended to the arg-list for the listed commands
    DiffviewOpen = {},
    DiffviewFileHistory = {},
  },
  hooks = {},         -- See |diffview-config-hooks|
  keymaps = {
    disable_defaults = false, -- Disable the default keymaps
    view = {
      -- The `view` bindings are active in the diff buffers, only when the current
      -- tabpage is a Diffview.
      { &quot;n&quot;, &quot;&amp;lt;tab&amp;gt;&quot;,       actions.select_next_entry,              { desc = &quot;Open the diff for the next file&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;s-tab&amp;gt;&quot;,     actions.select_prev_entry,              { desc = &quot;Open the diff for the previous file&quot; } },
      { &quot;n&quot;, &quot;[F&quot;,          actions.select_first_entry,             { desc = &quot;Open the diff for the first file&quot; } },
      { &quot;n&quot;, &quot;]F&quot;,          actions.select_last_entry,              { desc = &quot;Open the diff for the last file&quot; } },
      { &quot;n&quot;, &quot;gf&quot;,          actions.goto_file_edit,                 { desc = &quot;Open the file in the previous tabpage&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;C-w&amp;gt;&amp;lt;C-f&amp;gt;&quot;,  actions.goto_file_split,                { desc = &quot;Open the file in a new split&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;C-w&amp;gt;gf&quot;,     actions.goto_file_tab,                  { desc = &quot;Open the file in a new tabpage&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;leader&amp;gt;e&quot;,   actions.focus_files,                    { desc = &quot;Bring focus to the file panel&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;leader&amp;gt;b&quot;,   actions.toggle_files,                   { desc = &quot;Toggle the file panel.&quot; } },
      { &quot;n&quot;, &quot;g&amp;lt;C-x&amp;gt;&quot;,      actions.cycle_layout,                   { desc = &quot;Cycle through available layouts.&quot; } },
      { &quot;n&quot;, &quot;[x&quot;,          actions.prev_conflict,                  { desc = &quot;In the merge-tool: jump to the previous conflict&quot; } },
      { &quot;n&quot;, &quot;]x&quot;,          actions.next_conflict,                  { desc = &quot;In the merge-tool: jump to the next conflict&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;leader&amp;gt;co&quot;,  actions.conflict_choose(&quot;ours&quot;),        { desc = &quot;Choose the OURS version of a conflict&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;leader&amp;gt;ct&quot;,  actions.conflict_choose(&quot;theirs&quot;),      { desc = &quot;Choose the THEIRS version of a conflict&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;leader&amp;gt;cb&quot;,  actions.conflict_choose(&quot;base&quot;),        { desc = &quot;Choose the BASE version of a conflict&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;leader&amp;gt;ca&quot;,  actions.conflict_choose(&quot;all&quot;),         { desc = &quot;Choose all the versions of a conflict&quot; } },
      { &quot;n&quot;, &quot;dx&quot;,          actions.conflict_choose(&quot;none&quot;),        { desc = &quot;Delete the conflict region&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;leader&amp;gt;cO&quot;,  actions.conflict_choose_all(&quot;ours&quot;),    { desc = &quot;Choose the OURS version of a conflict for the whole file&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;leader&amp;gt;cT&quot;,  actions.conflict_choose_all(&quot;theirs&quot;),  { desc = &quot;Choose the THEIRS version of a conflict for the whole file&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;leader&amp;gt;cB&quot;,  actions.conflict_choose_all(&quot;base&quot;),    { desc = &quot;Choose the BASE version of a conflict for the whole file&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;leader&amp;gt;cA&quot;,  actions.conflict_choose_all(&quot;all&quot;),     { desc = &quot;Choose all the versions of a conflict for the whole file&quot; } },
      { &quot;n&quot;, &quot;dX&quot;,          actions.conflict_choose_all(&quot;none&quot;),    { desc = &quot;Delete the conflict region for the whole file&quot; } },
    },
    diff1 = {
      -- Mappings in single window diff layouts
      { &quot;n&quot;, &quot;g?&quot;, actions.help({ &quot;view&quot;, &quot;diff1&quot; }), { desc = &quot;Open the help panel&quot; } },
    },
    diff2 = {
      -- Mappings in 2-way diff layouts
      { &quot;n&quot;, &quot;g?&quot;, actions.help({ &quot;view&quot;, &quot;diff2&quot; }), { desc = &quot;Open the help panel&quot; } },
    },
    diff3 = {
      -- Mappings in 3-way diff layouts
      { { &quot;n&quot;, &quot;x&quot; }, &quot;2do&quot;,  actions.diffget(&quot;ours&quot;),            { desc = &quot;Obtain the diff hunk from the OURS version of the file&quot; } },
      { { &quot;n&quot;, &quot;x&quot; }, &quot;3do&quot;,  actions.diffget(&quot;theirs&quot;),          { desc = &quot;Obtain the diff hunk from the THEIRS version of the file&quot; } },
      { &quot;n&quot;,          &quot;g?&quot;,   actions.help({ &quot;view&quot;, &quot;diff3&quot; }),  { desc = &quot;Open the help panel&quot; } },
    },
    diff4 = {
      -- Mappings in 4-way diff layouts
      { { &quot;n&quot;, &quot;x&quot; }, &quot;1do&quot;,  actions.diffget(&quot;base&quot;),            { desc = &quot;Obtain the diff hunk from the BASE version of the file&quot; } },
      { { &quot;n&quot;, &quot;x&quot; }, &quot;2do&quot;,  actions.diffget(&quot;ours&quot;),            { desc = &quot;Obtain the diff hunk from the OURS version of the file&quot; } },
      { { &quot;n&quot;, &quot;x&quot; }, &quot;3do&quot;,  actions.diffget(&quot;theirs&quot;),          { desc = &quot;Obtain the diff hunk from the THEIRS version of the file&quot; } },
      { &quot;n&quot;,          &quot;g?&quot;,   actions.help({ &quot;view&quot;, &quot;diff4&quot; }),  { desc = &quot;Open the help panel&quot; } },
    },
    file_panel = {
      { &quot;n&quot;, &quot;j&quot;,              actions.next_entry,                     { desc = &quot;Bring the cursor to the next file entry&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;down&amp;gt;&quot;,         actions.next_entry,                     { desc = &quot;Bring the cursor to the next file entry&quot; } },
      { &quot;n&quot;, &quot;k&quot;,              actions.prev_entry,                     { desc = &quot;Bring the cursor to the previous file entry&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;up&amp;gt;&quot;,           actions.prev_entry,                     { desc = &quot;Bring the cursor to the previous file entry&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;cr&amp;gt;&quot;,           actions.select_entry,                   { desc = &quot;Open the diff for the selected entry&quot; } },
      { &quot;n&quot;, &quot;o&quot;,              actions.select_entry,                   { desc = &quot;Open the diff for the selected entry&quot; } },
      { &quot;n&quot;, &quot;l&quot;,              actions.select_entry,                   { desc = &quot;Open the diff for the selected entry&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;2-LeftMouse&amp;gt;&quot;,  actions.select_entry,                   { desc = &quot;Open the diff for the selected entry&quot; } },
      { &quot;n&quot;, &quot;-&quot;,              actions.toggle_stage_entry,             { desc = &quot;Stage / unstage the selected entry&quot; } },
      { &quot;n&quot;, &quot;s&quot;,              actions.toggle_stage_entry,             { desc = &quot;Stage / unstage the selected entry&quot; } },
      { &quot;n&quot;, &quot;S&quot;,              actions.stage_all,                      { desc = &quot;Stage all entries&quot; } },
      { &quot;n&quot;, &quot;U&quot;,              actions.unstage_all,                    { desc = &quot;Unstage all entries&quot; } },
      { &quot;n&quot;, &quot;X&quot;,              actions.restore_entry,                  { desc = &quot;Restore entry to the state on the left side&quot; } },
      { &quot;n&quot;, &quot;L&quot;,              actions.open_commit_log,                { desc = &quot;Open the commit log panel&quot; } },
      { &quot;n&quot;, &quot;zo&quot;,             actions.open_fold,                      { desc = &quot;Expand fold&quot; } },
      { &quot;n&quot;, &quot;h&quot;,              actions.close_fold,                     { desc = &quot;Collapse fold&quot; } },
      { &quot;n&quot;, &quot;zc&quot;,             actions.close_fold,                     { desc = &quot;Collapse fold&quot; } },
      { &quot;n&quot;, &quot;za&quot;,             actions.toggle_fold,                    { desc = &quot;Toggle fold&quot; } },
      { &quot;n&quot;, &quot;zR&quot;,             actions.open_all_folds,                 { desc = &quot;Expand all folds&quot; } },
      { &quot;n&quot;, &quot;zM&quot;,             actions.close_all_folds,                { desc = &quot;Collapse all folds&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;c-b&amp;gt;&quot;,          actions.scroll_view(-0.25),             { desc = &quot;Scroll the view up&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;c-f&amp;gt;&quot;,          actions.scroll_view(0.25),              { desc = &quot;Scroll the view down&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;tab&amp;gt;&quot;,          actions.select_next_entry,              { desc = &quot;Open the diff for the next file&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;s-tab&amp;gt;&quot;,        actions.select_prev_entry,              { desc = &quot;Open the diff for the previous file&quot; } },
      { &quot;n&quot;, &quot;[F&quot;,             actions.select_first_entry,             { desc = &quot;Open the diff for the first file&quot; } },
      { &quot;n&quot;, &quot;]F&quot;,             actions.select_last_entry,              { desc = &quot;Open the diff for the last file&quot; } },
      { &quot;n&quot;, &quot;gf&quot;,             actions.goto_file_edit,                 { desc = &quot;Open the file in the previous tabpage&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;C-w&amp;gt;&amp;lt;C-f&amp;gt;&quot;,     actions.goto_file_split,                { desc = &quot;Open the file in a new split&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;C-w&amp;gt;gf&quot;,        actions.goto_file_tab,                  { desc = &quot;Open the file in a new tabpage&quot; } },
      { &quot;n&quot;, &quot;i&quot;,              actions.listing_style,                  { desc = &quot;Toggle between &#39;list&#39; and &#39;tree&#39; views&quot; } },
      { &quot;n&quot;, &quot;f&quot;,              actions.toggle_flatten_dirs,            { desc = &quot;Flatten empty subdirectories in tree listing style&quot; } },
      { &quot;n&quot;, &quot;R&quot;,              actions.refresh_files,                  { desc = &quot;Update stats and entries in the file list&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;leader&amp;gt;e&quot;,      actions.focus_files,                    { desc = &quot;Bring focus to the file panel&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;leader&amp;gt;b&quot;,      actions.toggle_files,                   { desc = &quot;Toggle the file panel&quot; } },
      { &quot;n&quot;, &quot;g&amp;lt;C-x&amp;gt;&quot;,         actions.cycle_layout,                   { desc = &quot;Cycle available layouts&quot; } },
      { &quot;n&quot;, &quot;[x&quot;,             actions.prev_conflict,                  { desc = &quot;Go to the previous conflict&quot; } },
      { &quot;n&quot;, &quot;]x&quot;,             actions.next_conflict,                  { desc = &quot;Go to the next conflict&quot; } },
      { &quot;n&quot;, &quot;g?&quot;,             actions.help(&quot;file_panel&quot;),             { desc = &quot;Open the help panel&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;leader&amp;gt;cO&quot;,     actions.conflict_choose_all(&quot;ours&quot;),    { desc = &quot;Choose the OURS version of a conflict for the whole file&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;leader&amp;gt;cT&quot;,     actions.conflict_choose_all(&quot;theirs&quot;),  { desc = &quot;Choose the THEIRS version of a conflict for the whole file&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;leader&amp;gt;cB&quot;,     actions.conflict_choose_all(&quot;base&quot;),    { desc = &quot;Choose the BASE version of a conflict for the whole file&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;leader&amp;gt;cA&quot;,     actions.conflict_choose_all(&quot;all&quot;),     { desc = &quot;Choose all the versions of a conflict for the whole file&quot; } },
      { &quot;n&quot;, &quot;dX&quot;,             actions.conflict_choose_all(&quot;none&quot;),    { desc = &quot;Delete the conflict region for the whole file&quot; } },
    },
    file_history_panel = {
      { &quot;n&quot;, &quot;g!&quot;,            actions.options,                     { desc = &quot;Open the option panel&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;C-A-d&amp;gt;&quot;,       actions.open_in_diffview,            { desc = &quot;Open the entry under the cursor in a diffview&quot; } },
      { &quot;n&quot;, &quot;y&quot;,             actions.copy_hash,                   { desc = &quot;Copy the commit hash of the entry under the cursor&quot; } },
      { &quot;n&quot;, &quot;L&quot;,             actions.open_commit_log,             { desc = &quot;Show commit details&quot; } },
      { &quot;n&quot;, &quot;X&quot;,             actions.restore_entry,               { desc = &quot;Restore file to the state from the selected entry&quot; } },
      { &quot;n&quot;, &quot;zo&quot;,            actions.open_fold,                   { desc = &quot;Expand fold&quot; } },
      { &quot;n&quot;, &quot;zc&quot;,            actions.close_fold,                  { desc = &quot;Collapse fold&quot; } },
      { &quot;n&quot;, &quot;h&quot;,             actions.close_fold,                  { desc = &quot;Collapse fold&quot; } },
      { &quot;n&quot;, &quot;za&quot;,            actions.toggle_fold,                 { desc = &quot;Toggle fold&quot; } },
      { &quot;n&quot;, &quot;zR&quot;,            actions.open_all_folds,              { desc = &quot;Expand all folds&quot; } },
      { &quot;n&quot;, &quot;zM&quot;,            actions.close_all_folds,             { desc = &quot;Collapse all folds&quot; } },
      { &quot;n&quot;, &quot;j&quot;,             actions.next_entry,                  { desc = &quot;Bring the cursor to the next file entry&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;down&amp;gt;&quot;,        actions.next_entry,                  { desc = &quot;Bring the cursor to the next file entry&quot; } },
      { &quot;n&quot;, &quot;k&quot;,             actions.prev_entry,                  { desc = &quot;Bring the cursor to the previous file entry&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;up&amp;gt;&quot;,          actions.prev_entry,                  { desc = &quot;Bring the cursor to the previous file entry&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;cr&amp;gt;&quot;,          actions.select_entry,                { desc = &quot;Open the diff for the selected entry&quot; } },
      { &quot;n&quot;, &quot;o&quot;,             actions.select_entry,                { desc = &quot;Open the diff for the selected entry&quot; } },
      { &quot;n&quot;, &quot;l&quot;,             actions.select_entry,                { desc = &quot;Open the diff for the selected entry&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;2-LeftMouse&amp;gt;&quot;, actions.select_entry,                { desc = &quot;Open the diff for the selected entry&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;c-b&amp;gt;&quot;,         actions.scroll_view(-0.25),          { desc = &quot;Scroll the view up&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;c-f&amp;gt;&quot;,         actions.scroll_view(0.25),           { desc = &quot;Scroll the view down&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;tab&amp;gt;&quot;,         actions.select_next_entry,           { desc = &quot;Open the diff for the next file&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;s-tab&amp;gt;&quot;,       actions.select_prev_entry,           { desc = &quot;Open the diff for the previous file&quot; } },
      { &quot;n&quot;, &quot;[F&quot;,            actions.select_first_entry,          { desc = &quot;Open the diff for the first file&quot; } },
      { &quot;n&quot;, &quot;]F&quot;,            actions.select_last_entry,           { desc = &quot;Open the diff for the last file&quot; } },
      { &quot;n&quot;, &quot;gf&quot;,            actions.goto_file_edit,              { desc = &quot;Open the file in the previous tabpage&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;C-w&amp;gt;&amp;lt;C-f&amp;gt;&quot;,    actions.goto_file_split,             { desc = &quot;Open the file in a new split&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;C-w&amp;gt;gf&quot;,       actions.goto_file_tab,               { desc = &quot;Open the file in a new tabpage&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;leader&amp;gt;e&quot;,     actions.focus_files,                 { desc = &quot;Bring focus to the file panel&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;leader&amp;gt;b&quot;,     actions.toggle_files,                { desc = &quot;Toggle the file panel&quot; } },
      { &quot;n&quot;, &quot;g&amp;lt;C-x&amp;gt;&quot;,        actions.cycle_layout,                { desc = &quot;Cycle available layouts&quot; } },
      { &quot;n&quot;, &quot;g?&quot;,            actions.help(&quot;file_history_panel&quot;),  { desc = &quot;Open the help panel&quot; } },
    },
    option_panel = {
      { &quot;n&quot;, &quot;&amp;lt;tab&amp;gt;&quot;, actions.select_entry,          { desc = &quot;Change the current option&quot; } },
      { &quot;n&quot;, &quot;q&quot;,     actions.close,                 { desc = &quot;Close the panel&quot; } },
      { &quot;n&quot;, &quot;g?&quot;,    actions.help(&quot;option_panel&quot;),  { desc = &quot;Open the help panel&quot; } },
    },
    help_panel = {
      { &quot;n&quot;, &quot;q&quot;,     actions.close,  { desc = &quot;Close help menu&quot; } },
      { &quot;n&quot;, &quot;&amp;lt;esc&amp;gt;&quot;, actions.close,  { desc = &quot;Close help menu&quot; } },
    },
  },
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;p&gt;&lt;/p&gt; 
&lt;h3&gt;Hooks&lt;/h3&gt; 
&lt;p&gt;The &lt;code&gt;hooks&lt;/code&gt; table allows you to define callbacks for various events emitted from Diffview. The available hooks are documented in detail in &lt;code&gt;:h diffview-config-hooks&lt;/code&gt;. The hook events are also available as User autocommands. See &lt;code&gt;:h diffview-user-autocmds&lt;/code&gt; for more details.&lt;/p&gt; 
&lt;p&gt;Examples:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;hooks = {
  diff_buf_read = function(bufnr)
    -- Change local options in diff buffers
    vim.opt_local.wrap = false
    vim.opt_local.list = false
    vim.opt_local.colorcolumn = { 80 }
  end,
  view_opened = function(view)
    print(
      (&quot;A new %s was opened on tab page %d!&quot;)
      :format(view.class:name(), view.tabpage)
    )
  end,
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Keymaps&lt;/h3&gt; 
&lt;p&gt;The keymaps config is structured as a table with sub-tables for various different contexts where mappings can be declared. In these sub-tables key-value pairs are treated as the &lt;code&gt;{lhs}&lt;/code&gt; and &lt;code&gt;{rhs}&lt;/code&gt; of a normal mode mapping. These mappings all use the &lt;code&gt;:map-arguments&lt;/code&gt; &lt;code&gt;silent&lt;/code&gt;, &lt;code&gt;nowait&lt;/code&gt;, and &lt;code&gt;noremap&lt;/code&gt;. The implementation uses &lt;code&gt;vim.keymap.set()&lt;/code&gt;, so the &lt;code&gt;{rhs}&lt;/code&gt; can be either a vim command in the form of a string, or it can be a lua function:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;  view = {
    -- Vim command:
    [&quot;a&quot;] = &quot;&amp;lt;Cmd&amp;gt;echom &#39;foo&#39;&amp;lt;CR&amp;gt;&quot;,
    -- Lua function:
    [&quot;b&quot;] = function() print(&quot;bar&quot;) end,
  }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;For more control (i.e. mappings for other modes), you can also define index values as list-like tables containing the arguments for &lt;code&gt;vim.keymap.set()&lt;/code&gt;. This way you can also change all the &lt;code&gt;:map-arguments&lt;/code&gt; with the only exception being the &lt;code&gt;buffer&lt;/code&gt; field, as this will be overridden with the target buffer number:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;view = {
  -- Normal and visual mode mapping to vim command:
  { { &quot;n&quot;, &quot;v&quot; }, &quot;&amp;lt;leader&amp;gt;a&quot;, &quot;&amp;lt;Cmd&amp;gt;echom &#39;foo&#39;&amp;lt;CR&amp;gt;&quot;, { silent = true } },
  -- Visual mode mapping to lua function:
  { &quot;v&quot;, &quot;&amp;lt;leader&amp;gt;b&quot;, function() print(&quot;bar&quot;) end, { nowait = true } },
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To disable any single mapping without disabling them all, set its &lt;code&gt;{rhs}&lt;/code&gt; to &lt;code&gt;false&lt;/code&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;  view = {
    -- Disable the default normal mode mapping for `&amp;lt;tab&amp;gt;`:
    [&quot;&amp;lt;tab&amp;gt;&quot;] = false,
    -- Disable the default visual mode mapping for `gf`:
    { &quot;x&quot;, &quot;gf&quot;, false },
  }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Most of the mapped file panel actions also work from the view if they are added to the view maps (and vice versa). The exception is for actions that only really make sense specifically in the file panel, such as &lt;code&gt;next_entry&lt;/code&gt;, &lt;code&gt;prev_entry&lt;/code&gt;. Actions such as &lt;code&gt;toggle_stage_entry&lt;/code&gt; and &lt;code&gt;restore_entry&lt;/code&gt; work just fine from the view. When invoked from the view, these will target the file currently open in the view rather than the file under the cursor in the file panel.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;For more details on how to set mappings for other modes, actions, and more see:&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;:h diffview-config-keymaps&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:h diffview-actions&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Restoring Files&lt;/h2&gt; 
&lt;p&gt;If the right side of the diff is showing the local state of a file, you can restore the file to the state from the left side of the diff (key binding &lt;code&gt;X&lt;/code&gt; from the file panel by default). The current state of the file is stored in the git object database, and a command is echoed that shows how to undo the change.&lt;/p&gt; 
&lt;h2&gt;Tips and FAQ&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Hide untracked files:&lt;/strong&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;code&gt;DiffviewOpen -uno&lt;/code&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Exclude certain paths:&lt;/strong&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;code&gt;DiffviewOpen -- :!exclude/this :!and/this&lt;/code&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Run as if git was started in a specific directory:&lt;/strong&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;code&gt;DiffviewOpen -C/foo/bar/baz&lt;/code&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Diff the index against a git rev:&lt;/strong&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;code&gt;DiffviewOpen HEAD~2 --cached&lt;/code&gt;&lt;/li&gt; 
   &lt;li&gt;Defaults to &lt;code&gt;HEAD&lt;/code&gt; if no rev is given.&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Q: How do I get the diagonal lines in place of deleted lines in diff-mode?&lt;/strong&gt; 
  &lt;ul&gt; 
   &lt;li&gt;A: Change your &lt;code&gt;:h &#39;fillchars&#39;&lt;/code&gt;: 
    &lt;ul&gt; 
     &lt;li&gt;(vimscript): &lt;code&gt;set fillchars+=diff:╱&lt;/code&gt;&lt;/li&gt; 
     &lt;li&gt;(Lua): &lt;code&gt;vim.opt.fillchars:append { diff = &quot;╱&quot; }&lt;/code&gt;&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
   &lt;li&gt;Note: whether or not the diagonal lines will line up nicely will depend on your terminal emulator. The terminal used in the screenshots is Kitty.&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Q: How do I jump between hunks in the diff?&lt;/strong&gt; 
  &lt;ul&gt; 
   &lt;li&gt;A: Use &lt;code&gt;[c&lt;/code&gt; and &lt;code&gt;]c&lt;/code&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;code&gt;:h jumpto-diffs&lt;/code&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;!-- vim: set tw=80 --&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/0615c7e60ebe3007cc16aeac7a4aba21a6e03dcc04bdeb1f4970688ba92a9b3e/sindrets/diffview.nvim" medium="image" />
      
    </item>
    
    <item>
      <title>sphamba/smear-cursor.nvim</title>
      <link>https://github.com/sphamba/smear-cursor.nvim</link>
      <description>&lt;p&gt;🌠 Neovim plugin to animate the cursor with a smear effect in all terminals&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;Smear cursor for Neovim&lt;/h1&gt; 
&lt;p&gt;&lt;em&gt;Neovim plugin to animate the cursor with a smear effect in all terminals. Inspired by &lt;a href=&quot;https://neovide.dev/features.html#animated-cursor&quot;&gt;Neovide&#39;s animated cursor&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt; 
&lt;p&gt;This plugin is intended for terminals/GUIs that can only display text and do not have graphical capabilities (unlike &lt;a href=&quot;https://neovide.dev/&quot;&gt;Neovide&lt;/a&gt;, or the &lt;a href=&quot;https://sw.kovidgoyal.net/kitty/&quot;&gt;Kitty&lt;/a&gt; terminal). Also, check out the &lt;a href=&quot;https://github.com/karb94/neoscroll.nvim&quot;&gt;karb94/neoscroll.nvim&lt;/a&gt; plugin for smooth scrolling!&lt;/p&gt; 
&lt;h2&gt;🚀 Demo&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://private-user-images.githubusercontent.com/17217484/389300116-fc95b4df-d791-4c53-9141-4f870eb03ab2.mp4?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzI0NzY0NDAsIm5iZiI6MTczMjQ3NjE0MCwicGF0aCI6Ii8xNzIxNzQ4NC8zODkzMDAxMTYtZmM5NWI0ZGYtZDc5MS00YzUzLTkxNDEtNGY4NzBlYjAzYWIyLm1wND9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDExMjQlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQxMTI0VDE5MjIyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTg1NjFhZjJlODQ4YmU2NjAzY2EzY2I3NWMzMzI5MWQ1Njk2MTExYmEwYmExNTMwMThmYTJjYjE2ZjIyOThjNjMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.Skw2VVyVWVkMe4ht6mvl_AZ_6QasJm8O6qsIZmcQ2XE&quot;&gt;Demo&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;Some configuration examples:&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Default&lt;/th&gt; 
   &lt;th&gt;Faster&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/8d4ea0e6-6764-48ce-a182-7f1a63ffd762&quot; alt=&quot;Image&quot; /&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/6c2ae042-55df-48a3-8e18-57517dc06633&quot; alt=&quot;Image&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Smooth cursor without smear&lt;/th&gt; 
   &lt;th&gt;Smooth caret&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/47950a0c-2bbe-4148-b633-fea6d5e1f985&quot; alt=&quot;Image&quot; /&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/4ce13647-62fa-4f11-9d05-83c5b1ab4c7c&quot; alt=&quot;Image&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Fire hazard&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/ebb37a37-04dd-4400-b22c-d7be86a8b939&quot; alt=&quot;Image&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;!-- panvimdoc-ignore-end --&gt; 
&lt;h2&gt;📦 Installation&lt;/h2&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-note&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-info mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Note&lt;/p&gt;
 &lt;p&gt;After enabling the plugin in your configuration, you can toggle the smear cursor on and off with the &lt;code&gt;:SmearCursorToggle&lt;/code&gt; command or with &lt;code&gt;:lua require(&quot;smear_cursor&quot;).toggle()&lt;/code&gt;.&lt;/p&gt; 
&lt;/div&gt; 
&lt;h3&gt;Minimum requirements&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;Neovim 0.10.2&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Using &lt;a href=&quot;https://neovim.io/doc/user/pack/&quot;&gt;vim.pack&lt;/a&gt;&lt;/h3&gt; 
&lt;p&gt;In your &lt;code&gt;~/.config/nvim/init.lua&lt;/code&gt;, add:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;vim.pack.add({
  &quot;https://github.com/sphamba/smear-cursor.nvim&quot;,
})

require(&#39;smear_cursor&#39;).setup({
  -- Your options
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Using &lt;a href=&quot;https://lazy.folke.io/&quot;&gt;lazy.nvim&lt;/a&gt;&lt;/h3&gt; 
&lt;p&gt;In &lt;code&gt;~/.config/nvim/lua/plugins/smear_cursor.lua&lt;/code&gt;, add:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;return {
  &quot;sphamba/smear-cursor.nvim&quot;,
  opts = {},
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Using &lt;a href=&quot;https://github.com/junegunn/vim-plug&quot;&gt;vim-plug&lt;/a&gt;&lt;/h3&gt; 
&lt;p&gt;In your &lt;code&gt;init.vim&lt;/code&gt;, add:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-vim&quot;&gt;call plug#begin()
Plug &#39;sphamba/smear-cursor.nvim&#39;
call plug#end()

lua require(&#39;smear_cursor&#39;).enabled = true
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;⚙ Configuration&lt;/h2&gt; 
&lt;h3&gt;Using &lt;a href=&quot;https://lazy.folke.io/&quot;&gt;lazy.nvim&lt;/a&gt;&lt;/h3&gt; 
&lt;p&gt;Here are the default configuration options:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;return {
  &quot;sphamba/smear-cursor.nvim&quot;,

  opts = {
    -- Smear cursor when switching buffers or windows.
    smear_between_buffers = true,

    -- Smear cursor when moving within line or to neighbor lines.
    -- Use `min_horizontal_distance_smear` and `min_vertical_distance_smear` for finer control
    smear_between_neighbor_lines = true,

    -- Draw the smear in buffer space instead of screen space when scrolling
    scroll_buffer_space = true,

    -- Set to `true` if your font supports legacy computing symbols (block unicode symbols).
    -- Smears and particles will look a lot less blocky.
    legacy_computing_symbols_support = false,

    -- Smear cursor in insert mode.
    -- See also `vertical_bar_cursor_insert_mode` and `distance_stop_animating_vertical_bar`.
    smear_insert_mode = true,
  },
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Refer to &lt;a href=&quot;https://github.com/sphamba/smear-cursor.nvim/raw/main/lua/smear_cursor/config.lua&quot;&gt;&lt;code&gt;lua/smear_cursor/config.lua&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://github.com/sphamba/smear-cursor.nvim/raw/main/lua/smear_cursor/color.lua&quot;&gt;&lt;code&gt;lua/smear_cursor/color.lua&lt;/code&gt;&lt;/a&gt; for the full list of configuration options that can be set with &lt;code&gt;opts&lt;/code&gt;.&lt;/p&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-tip&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-light-bulb mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Tip&lt;/p&gt;
 &lt;p&gt;Some terminals override the cursor color set by Neovim. If that is the case, manually put the actual cursor color in your config to get a matching smear color:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;  opts = {
    -- Smear cursor color. Defaults to Cursor GUI color if not set.
    -- Set to &quot;none&quot; to match the text color at the target cursor position.
    -- Can be a hex color code, or a highlight group name.
    cursor_color = &quot;#d3cdc3&quot;,
  }
&lt;/code&gt;&lt;/pre&gt; 
&lt;/div&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-note&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-info mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Note&lt;/p&gt;
 &lt;p&gt;Fonts with legacy computing symbols support seems to be rare. One notable example is &lt;a href=&quot;https://github.com/microsoft/cascadia-code/releases&quot;&gt;Cascadia Code&lt;/a&gt;. You can still use smear-cursor.nvim without such a font.&lt;/p&gt; 
&lt;/div&gt; 
&lt;h3&gt;Examples&lt;/h3&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-tip&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-light-bulb mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Tip&lt;/p&gt;
 &lt;p&gt;See videos at the top for visual examples.&lt;/p&gt; 
&lt;/div&gt; 
&lt;details&gt; 
 &lt;summary&gt;🔥 Faster smear&lt;/summary&gt; 
 &lt;p&gt;As an example of further configuration, you can tune the smear dynamics to be snappier:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;  opts = {                                -- Default  Range
    stiffness = 0.8,                      -- 0.6      [0, 1]
    trailing_stiffness = 0.6,             -- 0.45     [0, 1]
    stiffness_insert_mode = 0.7,          -- 0.5      [0, 1]
    trailing_stiffness_insert_mode = 0.7, -- 0.5      [0, 1]
    damping = 0.95,                       -- 0.85     [0, 1]
    damping_insert_mode = 0.95,           -- 0.9      [0, 1]
    distance_stop_animating = 0.5,        -- 0.1      &amp;gt; 0
  },
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;If you notice a low framerate, you can try lowering the time interval between draws (default is 17ms):&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;  opts = {
    time_interval = 7, -- milliseconds
  },
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;You can also change the &quot;bounciness&quot; of the smear by adjusting the &lt;code&gt;damping&lt;/code&gt; and &lt;code&gt;damping_insert_mode&lt;/code&gt; parameters (default to &lt;code&gt;0.85&lt;/code&gt; and &lt;code&gt;0.9&lt;/code&gt; respectively). Decreasing them (&lt;em&gt;e.g.&lt;/em&gt; to &lt;code&gt;0.65&lt;/code&gt;) will make the smear appear more elastic (overshooting target position).&lt;/p&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;🔥 FIRE HAZARD 🔥&lt;/strong&gt;&lt;/p&gt; 
  &lt;p&gt;Feel free to experiment with all the configuration options, but be aware that some combinations may cause your cursor to flicker or even &lt;strong&gt;catch fire&lt;/strong&gt;. That can happen with the following settings:&lt;/p&gt; 
  &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt; opts = {
   cursor_color = &quot;#ff4000&quot;,
   particles_enabled = true,
   stiffness = 0.5,
   trailing_stiffness = 0.2,
   trailing_exponent = 5,
   damping = 0.6,
   gradient_exponent = 0,
   gamma = 1,
   never_draw_over_target = true, -- if you want to actually see under the cursor
   hide_target_hack = true,       -- same
   particle_spread = 1,
   particles_per_second = 500,
   particles_per_length = 50,
   particle_max_lifetime = 800,
   particle_max_initial_velocity = 20,
   particle_velocity_from_cursor = 0.5,
   particle_damping = 0.15,
   particle_gravity = -50,
   min_distance_emit_particles = 0,
}
&lt;/code&gt;&lt;/pre&gt; 
 &lt;/blockquote&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;█ Smooth cursor without smear&lt;/summary&gt; 
 &lt;p&gt;If you wish to only have a smoother cursor that keeps its rectangular shape (without the trail), you can set the following options:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;  opts = {
    stiffness = 0.5,
    trailing_stiffness = 0.5,
    matrix_pixel_threshold = 0.5,
  },
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;🌌 Transparent background&lt;/summary&gt; 
 &lt;p&gt;Drawing the smear over a transparent background works better when using a font that supports legacy computing symbols, therefore setting the following option:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;  opts = {
    legacy_computing_symbols_support = true,
  },
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;If your font does not support legacy computing symbols, there will be a shadow under the smear. You may set a color for this shadow to be less noticeable:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;  opts = {
    transparent_bg_fallback_color = &quot;#303030&quot;,
  },
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;🔲 No GUI colors&lt;/summary&gt; 
 &lt;p&gt;If you are not using &lt;code&gt;termguicolors&lt;/code&gt;, you need to manually set a color gradient for the smear (it can be a single color):&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;  opts = {
    cterm_cursor_colors = { 240, 245, 250, 255 },
    cterm_bg = 235,
  }
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;If you are not using &lt;code&gt;guicursor&lt;/code&gt;, and you notice the cursor getting duplicated (smear visible at the same time as the &lt;em&gt;real&lt;/em&gt; cursor), try setting&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;  opts = {
    hide_target_hack = true,
    never_draw_over_target = true,
  }
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;h3&gt;Using &lt;code&gt;init.vim&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;You can set the configuration variables in your &lt;code&gt;init.vim&lt;/code&gt; file like this:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-vim&quot;&gt;lua require(&#39;smear_cursor&#39;).setup({
    \cursor_color = &#39;#d3cdc3&#39;,
\})
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;🤕 Known issues&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;There is a shadow around the smear (text become invisible). This is inherent to the way the smear is rendered, as Neovim is not able to render superimposed characters. The shadow is less noticeable when the smear is moving faster (see configuration options).&lt;/li&gt; 
 &lt;li&gt;Likely not compatible with other plugins that modify the cursor.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;!-- panvimdoc-ignore-start --&gt; 
&lt;h2&gt;👨‍💻 Contributing&lt;/h2&gt; 
&lt;p&gt;Please feel free to open an issue or a pull request if you have any suggestions or improvements! This project uses &lt;a href=&quot;https://pre-commit.com/&quot;&gt;pre-commit&lt;/a&gt; hooks to ensure code quality (with &lt;a href=&quot;https://github.com/JohnnyMorganz/StyLua&quot;&gt;StyLua&lt;/a&gt;) and meaningful commit messages (following &lt;a href=&quot;https://www.conventionalcommits.org/&quot;&gt;Conventional Commits&lt;/a&gt;)&lt;/p&gt; 
&lt;h3&gt;Requirements&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;Neovim &amp;gt;= 0.10.2&lt;/li&gt; 
 &lt;li&gt;Make&lt;/li&gt; 
 &lt;li&gt;pre-commit (&lt;code&gt;pip install pre-commit&lt;/code&gt;)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Setup&lt;/h3&gt; 
&lt;ol&gt; 
 &lt;li&gt;Clone the repository&lt;/li&gt; 
 &lt;li&gt;Run &lt;code&gt;make install&lt;/code&gt; to install the pre-commit hooks&lt;/li&gt; 
&lt;/ol&gt; 
&lt;!-- panvimdoc-ignore-end --&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/2cc9644162a757cb38a5052e398585e29fe7145d648a7c3f9323410110f915b1/sphamba/smear-cursor.nvim" medium="image" />
      
    </item>
    
    <item>
      <title>Wansmer/treesj</title>
      <link>https://github.com/Wansmer/treesj</link>
      <description>&lt;p&gt;Neovim plugin for splitting/joining blocks of code&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;TreeSJ&lt;/h1&gt; 
&lt;p&gt;Neovim plugin for splitting/joining blocks of code like arrays, hashes, statements, objects, dictionaries, etc.&lt;/p&gt; 
&lt;p&gt;Written in Lua, using &lt;a href=&quot;https://tree-sitter.github.io/tree-sitter/&quot;&gt;Tree-Sitter&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;Inspired by and partly repeats the functionality of &lt;a href=&quot;https://github.com/AndrewRadev/splitjoin.vim&quot;&gt;splitjoin.vim&lt;/a&gt;.&lt;/p&gt; 
&lt;!-- panvimdoc-ignore-start --&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/Wansmer/treesj/assets/46977173/4277455b-81fd-4e99-9af7-43c77dbf542b&quot;&gt;https://github.com/Wansmer/treesj/assets/46977173/4277455b-81fd-4e99-9af7-43c77dbf542b&lt;/a&gt;&lt;/p&gt; 
&lt;!--toc:start--&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Wansmer/treesj/main/#features&quot;&gt;Features&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Wansmer/treesj/main/#requirements&quot;&gt;Requirements&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Wansmer/treesj/main/#installation&quot;&gt;Installation&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Wansmer/treesj/main/#settings&quot;&gt;Settings&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Wansmer/treesj/main/#commands&quot;&gt;Commands&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Wansmer/treesj/main/#how-plugin-works&quot;&gt;How plugin works&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Wansmer/treesj/main/#configuration&quot;&gt;Configuration&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Wansmer/treesj/main/#languages&quot;&gt;Languages&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Wansmer/treesj/main/#basic-node&quot;&gt;Basic node&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Wansmer/treesj/main/#advanced-node&quot;&gt;Advanced node&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Wansmer/treesj/main/#treesj-instance&quot;&gt;TreeSJ instance&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;!--toc:end--&gt; 
&lt;!-- panvimdoc-ignore-end --&gt; 
&lt;h2&gt;Features&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Can be called from anywhere in the block&lt;/strong&gt;: No need to move cursor to specified place to split/join block of code;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Make cursor sticky&lt;/strong&gt;: The cursor follows the text on which it was called;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Autodetect mode&lt;/strong&gt;: Toggle-mode present. Split or join blocks by same key mapping;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Do it recursively&lt;/strong&gt;: Expand or collapse all nested nodes? Yes, you can;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Recognize nested languages&lt;/strong&gt;: Filetype doesn&#39;t matter, detect language with treesitter;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Repeat formatting with &lt;code&gt;dot&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;.&lt;/code&gt; support for each action.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Smart&lt;/strong&gt;: Different behavior depending on the context.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Requirements&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/neovim/neovim/releases&quot;&gt;Neovim 0.9+&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/nvim-treesitter/nvim-treesitter&quot;&gt;nvim-treesitter&lt;/a&gt; (optional: if you install parsers with &lt;code&gt;nvim-treesitter&lt;/code&gt;)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Installation&lt;/h2&gt; 
&lt;p&gt;With &lt;a href=&quot;https://github.com/folke/lazy.nvim&quot;&gt;lazy.nvim&lt;/a&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;return {
  &#39;Wansmer/treesj&#39;,
  keys = { &#39;&amp;lt;space&amp;gt;m&#39;, &#39;&amp;lt;space&amp;gt;j&#39;, &#39;&amp;lt;space&amp;gt;s&#39; },
  dependencies = { &#39;nvim-treesitter/nvim-treesitter&#39; }, -- if you install parsers with `nvim-treesitter`
  config = function()
    require(&#39;treesj&#39;).setup({--[[ your config ]]})
  end,
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;With &lt;a href=&quot;https://github.com/wbthomason/packer.nvim&quot;&gt;packer.nvim&lt;/a&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;use({
  &#39;Wansmer/treesj&#39;,
  requires = { &#39;nvim-treesitter/nvim-treesitter&#39; }, -- if you install parsers with `nvim-treesitter`
  config = function()
    require(&#39;treesj&#39;).setup({--[[ your config ]]})
  end,
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Settings&lt;/h2&gt; 
&lt;p&gt;Default configuration:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;local tsj = require(&#39;treesj&#39;)

local langs = {--[[ configuration for languages ]]}

tsj.setup({
  ---@type boolean Use default keymaps (&amp;lt;space&amp;gt;m - toggle, &amp;lt;space&amp;gt;j - join, &amp;lt;space&amp;gt;s - split)
  use_default_keymaps = true,
  ---@type boolean Node with syntax error will not be formatted
  check_syntax_error = true,
  ---If line after join will be longer than max value,
  ---@type number If line after join will be longer than max value, node will not be formatted
  max_join_length = 120,
  ---Cursor behavior:
  ---hold - cursor follows the node/place on which it was called
  ---start - cursor jumps to the first symbol of the node being formatted
  ---end - cursor jumps to the last symbol of the node being formatted
  ---@type &#39;hold&#39;|&#39;start&#39;|&#39;end&#39;
  cursor_behavior = &#39;hold&#39;,
  ---@type boolean Notify about possible problems or not
  notify = true,
  ---@type boolean Use `dot` for repeat action
  dot_repeat = true,
  ---@type nil|function Callback for treesj error handler. func (err_text, level, ...other_text)
  on_error = nil,
  ---@type table Presets for languages
  -- langs = {}, -- See the default presets in lua/treesj/langs
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Commands&lt;/h2&gt; 
&lt;p&gt;TreeSJ provide user commands:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;:TSJToggle&lt;/code&gt; - toggle node under cursor (split if one-line and join if multiline);&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:TSJSplit&lt;/code&gt; - split node under cursor;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:TSJJoin&lt;/code&gt; - join node under cursor;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Similar with lua:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;:lua require(&#39;treesj&#39;).toggle()
:lua require(&#39;treesj&#39;).split()
:lua require(&#39;treesj&#39;).join()
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;In the lua version, you can optionally pass a preset that will overwrite the default preset values. It should contain &lt;code&gt;split&lt;/code&gt; or &lt;code&gt;join&lt;/code&gt; keys. Key &lt;code&gt;both&lt;/code&gt; will be ignored.&lt;/p&gt; 
&lt;p&gt;E.g.:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- For default preset
vim.keymap.set(&#39;n&#39;, &#39;&amp;lt;leader&amp;gt;m&#39;, require(&#39;treesj&#39;).toggle)
-- For extending default preset with `recursive = true`
vim.keymap.set(&#39;n&#39;, &#39;&amp;lt;leader&amp;gt;M&#39;, function()
    require(&#39;treesj&#39;).toggle({ split = { recursive = true } })
end)
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;How plugin works&lt;/h2&gt; 
&lt;p&gt;When you run the plugin, TreeSJ detects the node under the cursor, recognizes the language, and looks for it in the presets. If the current node is not configured, TreeSJ checks the parent node, and so on, until a configured node is found.&lt;/p&gt; 
&lt;p&gt;Presets for node can be two types:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;With preset for self - if this type is found, the node will be formatted;&lt;/li&gt; 
 &lt;li&gt;With referens for nested nodes or fields - in this case, search will be continued among this node descendants;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;:&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&quot;|&quot; - meaning cursor&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;pre&gt;&lt;code class=&quot;language-txt&quot;&gt;// with preset for self
const arr = [ 1, |2, 3 ];
                 |
    first node is &#39;number&#39; - not configured,
    parent node is &#39;array&#39; - configured and will be split

// with referens
cons|t arr = [ 1, 2, 3 ];
    |
  first node is &#39;variable_declarator&#39; - not configured,
  parent node is &#39;lexical_declaration&#39; - configured and has reference
  { target_nodes = { &#39;array&#39;, &#39;object&#39; } },
  first configured nested node is &#39;array&#39; and array will be splitted
&lt;/code&gt;&lt;/pre&gt; 
&lt;h1&gt;Configuration&lt;/h1&gt; 
&lt;h2&gt;Languages&lt;/h2&gt; 
&lt;p&gt;By default, TreeSJ has presets for these languages:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Javascript&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Typescript&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Tsx&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Jsx&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Lua&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;CSS&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;SCSS&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;HTML&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Pug&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Vue&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Svelte&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;JSON&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;JSONC&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;JSON5&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Toml&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Yaml&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Perl&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;PHP&lt;/strong&gt; (both &lt;code&gt;php&lt;/code&gt; and &lt;code&gt;php_only&lt;/code&gt;);&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Ruby&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Python&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Starlark&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Go&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Java&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Rust&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;R&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;C/C++&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Nix&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Kotlin&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Bash&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Zsh&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;SQL&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Dart&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Elixir&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Haskell&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Zig&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Julia&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Terraform&lt;/strong&gt;;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Typst&lt;/strong&gt;;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;For adding your favorite language, add it to &lt;code&gt;langs&lt;/code&gt; sections in your configuration. Also, see how &lt;a href=&quot;https://github.com/Wansmer/treesj/discussions/19&quot;&gt;to implement fallback&lt;/a&gt; to splitjoin.vim.&lt;/p&gt; 
&lt;p&gt;It is also possible to configure fallback for any node (see &lt;a href=&quot;https://raw.githubusercontent.com/Wansmer/treesj/main/#advanced-node&quot;&gt;Advanced node&lt;/a&gt;).&lt;/p&gt; 
&lt;p&gt;To find out what nodes are called in your language, analyze your code with &lt;a href=&quot;https://github.com/nvim-treesitter/playground&quot;&gt;nvim-treesitter/playground&lt;/a&gt; or look in the &lt;a href=&quot;https://tree-sitter.github.io/tree-sitter/&quot;&gt;source code of the parsers&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;local langs = {
  javascript = {
    array = {--[[ preset ]]},
    object = {--[[ preset ]]}
    [&#39;function&#39;] = { target_nodes = {--[[ targets ]]}}
  },
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;If you have completely configured your language, and it works as well as you expected, feel free to open PR and share it. (Please, read &lt;a href=&quot;https://raw.githubusercontent.com/Wansmer/treesj/main/tests/README.md&quot;&gt;manual&lt;/a&gt; before PR)&lt;/p&gt; 
&lt;h2&gt;Basic node&lt;/h2&gt; 
&lt;p&gt;Default preset for node:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;local node_type = {
  -- `both` will be merged with both presets from `split` and `join` modes tables.
  -- If you need different values for different modes, they can be overridden
  -- in mode tables unless otherwise noted.
  both = {
    ---If a node contains descendants with a type from the list, it will not be formatted
    ---@type string[]
    no_format_with = { &#39;comment&#39; },
    ---Separator for arrays, objects, hash e.c.t. (usually &#39;,&#39;)
    ---@type string
    separator = &#39;&#39;,
    ---Set last separator or not
    ---@type boolean
    last_separator = false,
    ---If true, empty brackets, empty tags, or node which only contains nodes from &#39;omit&#39; no will handling
    ---@type boolean
    format_empty_node = true,
    ---All nested configured nodes will process according to their presets
    ---@type boolean
    recursive = true,
    ---Type of configured node that must be ignored
    ---@type string[]
    recursive_ignore = {},

    --[[ Working with the options below is explained in detail in `advanced node configuration` section. ]]
    ---Set `false` if node should&#39;t be splitted or joined.
    ---@type boolean|function For function: function(tsnode: TSNode): boolean
    enable = true,
    ---@type function|nil function(tsj: TreeSJ): void
    format_tree = nil,
    ---@type function|nil function(lines: string[], tsn?: TSNode): string[]
    format_resulted_lines = nil,
    ---Passes control to an external script and terminates treesj execution.
    ---@type function|nil function(node: TSNode): void
    fallback = nil,

    --[[ The options below should be the same for both modes. ]]
    ---The text of the node will be merged with the previous one, without wrapping to a new line
    ---@type table List-like table with types &#39;string&#39; (type of node) or &#39;function&#39; (function(child: TreeSJ): boolean).
    omit = {},
    ---Non-bracket nodes (e.g., with &#39;then|()&#39; ... &#39;end&#39; instead of { ... }|&amp;lt; ... &amp;gt;|[ ... ])
    ---If value is table, should be contains follow keys: { left = &#39;text&#39;, right = &#39;text&#39; }. Empty string uses by default
    ---@type boolean|table
    non_bracket_node = false,
    ---If you need to process only nodes in the range from / to.
    ---If `shrink_node` is present, `non_bracket_node` will be ignored
    ---Learn more in advanced node configuration
    ---@type table|nil
    shrink_node = nil,
    -- shrink_node = { from = string, to = string },
  },
  -- Use only for join. If contains field from &#39;both&#39;,
  -- field here have higher priority
  join = {
    ---Adding space in framing brackets or last/end element
    ---@type boolean
    space_in_brackets = false,
    ---Insert space between nodes or not
    ---@type boolean
    space_separator = true,
    ---Adds instruction separator like &#39;;&#39; in statement block.
    ---It&#39;s not the same as `separator`: `separator` is a separate node, `force_insert` is a last symbol of code instruction.
    ---@type string
    force_insert = &#39;&#39;,
    ---The `force_insert` symbol will be omitted if the type of node contains in this list
    -- (e.g. function_declaration inside statement_block in JS no require instruction separator (&#39;;&#39;))
    ---@type table List-like table with types &#39;string&#39; (type of node) or &#39;function&#39; (function(child: TreeSJ): boolean).
    no_insert_if = {},
  },
  -- Use only for split. If contains field from &#39;both&#39;,
  -- field here have higher priority
  split = {
    ---All nested configured nodes will process according to their presets
    ---@type boolean
    recursive = false,
    ---Which indent must be on the last line of the formatted node.
    --- &#39;normal&#39; – indent equals of the indent from first line;
    --- &#39;inner&#39; – indent, like all inner nodes (indent of start line of node + vim.fn.shiftwidth()).
    ---@type &#39;normal&#39;|&#39;inner&#39;
    last_indent = &#39;normal&#39;,
    ---Which indent must be on the last line of the formatted node.
    --- &#39;normal&#39; – indent equals of the indent from first line;
    --- &#39;inner&#39; – indent, like all inner nodes (indent of start line of node + vim.fn.shiftwidth()).
    ---@type &#39;normal&#39;|&#39;inner&#39;
    inner_indent = &#39;inner&#39;,
  },
  ---If &#39;true&#39;, node will be completely removed from langs preset
  ---@type boolean
  disable = false,
  ---TreeSJ will search child from list into this node and redirect to found child
  ---If list not empty, another fields (split, join) will be ignored
  ---@type string[]|table See `advanced node configuration`
  target_nodes = {},
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;All nodes in every language have similar characteristics. TreeSJ provide default presets for common nodes:&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;set_default_preset(override)&lt;/code&gt; - default.&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;set_preset_for_list(override)&lt;/code&gt; - list-like nodes.&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;set_preset_for_dict(override)&lt;/code&gt; - dict-like nodes.&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;set_preset_for_statement(override)&lt;/code&gt; - statement-like nodes.&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;set_preset_for_args(override)&lt;/code&gt; - arguments-like nodes.&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;set_preset_for_non_bracket(override)&lt;/code&gt; - non-bracket nodes;&lt;/p&gt; 
&lt;p&gt;Takes a table with the settings to be overwritten as an argument.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Usage example&lt;/strong&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;local lang_utils = require(&#39;treesj.langs.utils&#39;)

local langs = {
  javascript = {
    object = lang_utils.set_preset_for_dict(),
    array = lang_utils.set_preset_for_list(),
    formal_parameters = lang_utils.set_preset_for_args(),
    arguments = lang_utils.set_preset_for_args(),
    statement_block = lang_utils.set_preset_for_statement({
      join = {
        no_insert_if = {
          &#39;function_declaration&#39;,
          &#39;try_statement&#39;,
          &#39;if_statement&#39;,
        },
      },
    }),
  },
  lua = {
    table_constructor = lang_utils.set_preset_for_dict(),
    arguments = lang_utils.set_preset_for_args(),
    parameters = lang_utils.set_preset_for_args(),
  },
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Also, you can use whole preset for language if your language has the same types of nodes:&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;For example, &lt;code&gt;css&lt;/code&gt; and &lt;code&gt;scss&lt;/code&gt; have the same structure, and you can use already configured preset&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;local tsj_utils = require(&#39;treesj.langs.utils&#39;)
local css = require(&#39;treesj.langs.css&#39;)

local langs = {
  scss = tsj_utils.merge_preset(css, {--[[
    Here you can override existing nodes
    or add language-specific nodes
]]})
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Advanced node&lt;/h2&gt; 
&lt;p&gt;Although most nodes have similar parameters and can be configured declarative, sometimes you need to change the values, text, or order of children on the fly.&lt;/p&gt; 
&lt;p&gt;To do this, some options accept functions as a value, which are passed instances of &lt;a href=&quot;https://neovim.io/doc/user/treesitter.html#treesitter-node&quot;&gt;TSNode&lt;/a&gt;, &lt;a href=&quot;https://raw.githubusercontent.com/Wansmer/treesj/main/#treesj-instance&quot;&gt;TreeSJ&lt;/a&gt;, or an array of rows to insert.&lt;/p&gt; 
&lt;h4&gt;Option &lt;code&gt;enable&lt;/code&gt;&lt;/h4&gt; 
&lt;p&gt;The &lt;code&gt;enable&lt;/code&gt; option can be a boolean value or a function. The function takes the found &lt;a href=&quot;https://neovim.io/doc/user/treesitter.html#treesitter-node&quot;&gt;TSNode&lt;/a&gt; node as arguments and should return a boolean value.&lt;/p&gt; 
&lt;details&gt; 
 &lt;summary&gt;Example of usage&lt;/summary&gt; 
 &lt;p&gt;The problem:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;// from &#39;import_spec_list&#39;
import (
    &quot;123&quot;
)

// to &#39;import_spec&#39; and back
import &quot;123&quot;

// but disable &#39;import_spec_list&#39; when two or more &#39;import_spec&#39; inside and
// disable &#39;import_spec&#39; when it already inside &#39;import_spec_list&#39;
import (
    &quot;123&quot;
    &quot;321&quot;
)
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;This can be implemented with:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;local go = {
  import_spec = lang_utils.set_preset_for_args({
    both = {
      -- If the parent is a &#39;import_spec_list&#39;, then skip this node and
      -- look for a suitable one for formatting further
      enable = function(tsn)
        return tsn:parent():type() ~= &#39;import_spec_list&#39;
      end,
    },
    split = {
      -- If the parent was something else, then wrap the import in parentheses,
      -- which actually converts the &#39;import_spec&#39; into the &#39;import_spec_list&#39;
      format_tree = function(tsj)
        tsj:wrap({ left = &#39;(&#39;, right = &#39;)&#39; })
      end,
    },
  }),
  import_spec_list = lang_utils.set_preset_for_args({
    join = {
      enable = function(tsn)
        -- If the node contains more than one named child node, then disable
        return tsn:named_child_count() &amp;lt; 2
      end,
      format_tree = function(tsj)
        -- If there was only one named element, then remove the brackets
        tsj:remove_child({ &#39;(&#39;, &#39;)&#39; })
      end,
    },
  }),
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;h4&gt;Option &lt;code&gt;fallback&lt;/code&gt;&lt;/h4&gt; 
&lt;p&gt;The &lt;code&gt;fallback&lt;/code&gt; option passes control to a third-party script that can be called within the function. When this option is used, &lt;code&gt;treesj&lt;/code&gt; only searches for the required node, but does not process it.&lt;/p&gt; 
&lt;p&gt;A found TSNode instance is passed to the function, which can be handled independently. For example, you can get the region of its location, check its siblings, etc.&lt;/p&gt; 
&lt;details&gt; 
 &lt;summary&gt;Example of usage&lt;/summary&gt; 
 &lt;p&gt;The problem:&lt;/p&gt; 
 &lt;p&gt;This action is difficult to implement with &lt;code&gt;treesj&lt;/code&gt;, so you can pass control to &lt;code&gt;splitjoin.vim&lt;/code&gt; if the found node is a &lt;code&gt;class&lt;/code&gt; or &lt;code&gt;module&lt;/code&gt;.&lt;/p&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;Note that in the above example, `splitjoin.vim&#39; requires the cursor to be on the name of a class or module. In some cases, you may need to keep track of the position of the cursor from which the handler is called.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-ruby&quot;&gt;# RESULT OF JOIN
class Foo::Bar::Baz &amp;lt; Quux
  def initialize
    # foo
  end
end

# RESULT OF SPLIT
module Foo
  module Bar
    class Baz &amp;lt; Quux
      def initialize
        # foo
      end
    end
  end
end
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;This can be implemented with:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;ruby = {
  module = {
    both = {
      no_format_with = {}, -- Need to avoid &#39;no format with comment&#39;
      fallback = function(_)
        vim.cmd(&#39;SplitjoinJoin&#39;)
      end,
    },
  },
  class = {
    both = {
      no_format_with = {},
      fallback = function(_)
        vim.cmd(&#39;SplitjoinSplit&#39;)
      end,
    },
  },
},
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;h4&gt;Option &lt;code&gt;no_insert_if&lt;/code&gt;&lt;/h4&gt; 
&lt;p&gt;The &lt;code&gt;preset[join].no_insert_if&lt;/code&gt; option takes an array with node types or functions. The function takes a TreeSJ as a parameter (each child of the root node in turn) and should return a boolean if that child matches the condition.&lt;/p&gt; 
&lt;p&gt;The utilities have helper functions that you will need most often:&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;lang_utils.helpers.if_penultimate&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;lang_utils.helpers.if_second&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;lang_utils.helpers.by_index(index)&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;lang_utils.helpers.has_parent(parent_type)&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;lang_utils.helpers.match(pattern)&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;lang_utils.helpers.contains(tsn_types)&lt;/code&gt;&lt;/p&gt; 
&lt;details&gt; 
 &lt;summary&gt;Example of usage&lt;/summary&gt; 
 &lt;p&gt;The problem:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;// Kotlin&#39;s &#39;statements&#39; should be separated with &#39;;&#39; after each child
// when it joins, but for the last named child it is not necessary,
// and we want to skip it

// from
call_expression(&quot;arg1&quot;) {
  call1(1, 2)
  call2(1, 2)
}

// to                                             | here no &#39;;&#39;, great
call_expression(&quot;arg1&quot;) { call1(1, 2); call2(1, 2) }
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;This can be implemented with:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;local lang_utils = require(&#39;treesj.langs.utils&#39;)

local kotlin = {
  statements = lang_utils.set_preset_for_non_bracket({
    join = {
      force_insert = &#39;;&#39;,
      no_insert_if = {
        lang_utils.no_insert.if_penultimate,
      },
    },
  }),
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;h4&gt;Option &lt;code&gt;omit&lt;/code&gt;&lt;/h4&gt; 
&lt;p&gt;The &lt;code&gt;preset[both]omit&lt;/code&gt; option accepts a list of node types or functions. If at the time the tree is built, the type of the child matches one of the listed ones, then this child remains unchanged. (does not wrap to a new line in case of a split, or its position and spaces do not change in the case of a join).&lt;/p&gt; 
&lt;p&gt;When some value of list is &lt;code&gt;function&lt;/code&gt; the principle of operation is the same as that of &lt;code&gt;no_insert_if&lt;/code&gt;.&lt;/p&gt; 
&lt;h4&gt;Option &lt;code&gt;non_bracket_node&lt;/code&gt;&lt;/h4&gt; 
&lt;p&gt;Some languages have nodes that can be split and joined, but they don&#39;t have brackets or other framing elements.&lt;/p&gt; 
&lt;p&gt;In this case, it is necessary not only to simulate the framing nodes, but also to calculate a new range for inserting rows.&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;preset[both].non_bracket_node&lt;/code&gt; can be a boolean value (in which case wrapping node imitators are created with an empty value) or take a table that specifies what text should wrap the actual base node.&lt;/p&gt; 
&lt;p&gt;E.g., table value: &lt;code&gt;{ left = &#39;text&#39;, right = &#39;text&#39; }&lt;/code&gt;&lt;/p&gt; 
&lt;details&gt; 
 &lt;summary&gt;Example of usage&lt;/summary&gt; 
 &lt;p&gt;The problem:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- `block` in Lua does not have parentheses, but when it joins,
-- it must jump up a line and pull an `end` node that is not part of it.
-- To do this, you need to create imitators of framing nodes one line above
-- and one line below
               | -- imitator left-side bracket
function test()|
  | -- real start of `block`
  |print(123)
  return 123| -- real end of `block`
| -- imitator right-side bracket
|end

-- from
function test()
  print(123)
  return 123
end

-- to and back
function test() print(123) return 123 end
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;This can be implemented with:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;local lang_utils = require(&#39;treesj.langs.utils&#39;)

local lua = {
  block = {
    both = {
      non_bracket_node = true,
      -- non_bracket_node = { left = &#39;&#39;, right = &#39;&#39; }, - it is similar
    },
    join = {
      space_in_brackets = true,
    },
  },
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;h4&gt;Option &lt;code&gt;shrink_node&lt;/code&gt;&lt;/h4&gt; 
&lt;p&gt;The &lt;code&gt;shrink_node&lt;/code&gt; option does not process or modify text outside the specified child types in from/to. This is needed when the node does not have a container, but can be split or join. For better understanding, see example of usage.&lt;/p&gt; 
&lt;details&gt; 
 &lt;summary&gt;Example of usage&lt;/summary&gt; 
 &lt;p&gt;The problem:&lt;/p&gt; 
 &lt;p&gt;In the Kotlin language, the &lt;code&gt;function_declaration&lt;/code&gt; node has parameters in brackets, but they are not packaged in a separate container and go at the same level as the other children of the &lt;code&gt;function_declaration&lt;/code&gt;.&lt;/p&gt; 
 &lt;p&gt;The difficulty is that the last element in &lt;code&gt;function_declaration&lt;/code&gt; is &lt;code&gt;function_body&lt;/code&gt;, which must remain unchanged and can be multi-line.&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;| - start of `function_declaration`
|        | - from             | - to
|        |                    | | - `function_body` must remain unchanged
|fun test(a: String, b: String) {
         | - start insert range
                              | - end insert range
         Everything outside the insertion range will remain unchanged,
         even though it is part of the node
  val var1 = 1
  val var2 = 2
}|
 | - end of `function_declaration`

// from
fun test(a: String, b: String) {
  val var1 = 1
  val var2 = 2
}
// to
fun test(
  a: String,
  b: String
) {
  val var1 = 1
  val var2 = 2
}
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;This can be implemented with:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;{
  function_declaration = lang_utils.set_preset_for_args({
    both = {
      non_bracket_node = true,
      shrink_node = { from = &#39;(&#39;, to = &#39;)&#39; },
    },
  }),
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;h4&gt;Option &lt;code&gt;target_nodes&lt;/code&gt;&lt;/h4&gt; 
&lt;p&gt;In most cases, &lt;code&gt;target_nodes&lt;/code&gt; is a list of node types to redirect the search for the configured node deeper. But in reality it is treated like a dictionary:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- these values are equivalent
target_nodes = { &#39;block&#39;, &#39;statement&#39; }
target_nodes = { [&#39;block&#39;] = &#39;block&#39;, [&#39;statement&#39;] = &#39;statement&#39; }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The key must be a node type or a field name. The value is the name of any configured node whose preset is to be used.&lt;/p&gt; 
&lt;p&gt;If the field name is specified in the keys, then it has the highest priority over node types.&lt;/p&gt; 
&lt;p&gt;This also means that you can redirect found fields or nodes for processing with other (including custom) presets.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;{
  block = lang_utils.set_preset_for_statement(),
  my_custom_preset_for_block_inside_fun_dec = {--[[ another preset ]]}
  function_declaration = {
      target_nodes = { [&#39;block&#39;] = &#39;my_custom_preset_for_block_inside_fun_dec&#39; }
  }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;details&gt; 
 &lt;summary&gt;Example of usage&lt;/summary&gt; 
 &lt;p&gt;The problem:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-rust&quot;&gt;match x {
    //   | - it is a field `value` and now it `integer_literal`
    _ =&amp;gt; 12
    //   `integer_literal` is not configured and can&#39;t be configured
    //   but you can transform this field into a `block` node
}

match x {
    _ =&amp;gt; {
        12
    }
}

&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;This can be implemented with:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;local rust = {
  match_arm = {
    target_nodes = { &#39;value&#39; },
  },
  value = lang_utils.set_preset_for_statement({
    split = {
      format_tree = function(tsj)
        if tsj:type() ~= &#39;block&#39; then
          tsj:wrap({ left = &#39;{&#39;, right = &#39;}&#39; })
        end
      end,
    },
    join = {
      no_insert_if = { lang_utils.helpers.if_penultimate },
      format_tree = function(tsj)
        local node = tsj:tsnode()
        local parents = { &#39;match_arm&#39;, &#39;closure_expression&#39; }
        local has_parent = vim.tbl_contains(parents, node:parent():type())
        if has_parent and node:named_child_count() == 1 then
          tsj:remove_child({ &#39;{&#39;, &#39;}&#39; })
        end
      end,
    },
  }),
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;h4&gt;Option &lt;code&gt;format_tree&lt;/code&gt;&lt;/h4&gt; 
&lt;p&gt;&lt;code&gt;format_tree&lt;/code&gt; is a function that takes a TreeSJ root node. In this function, you can work with the context and add or remove elements.&lt;/p&gt; 
&lt;details&gt; 
 &lt;summary&gt;Example of usage&lt;/summary&gt; 
 &lt;p&gt;The problem:&lt;/p&gt; 
 &lt;p&gt;Python&#39;s &lt;code&gt;import_from_statement&lt;/code&gt; does not have a container for a list of imported modules.&lt;/p&gt; 
 &lt;p&gt;Here you need to add parentheses to the middle and end of TreeSJ when splitting and remove these parentheses when joining.&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# from
from re import search, match,sub

# to this and back
from re import (
    search,
    match,
    sub,
)
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;This can be implemented with:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;local python = {
  import_from_statement = lang_utils.set_preset_for_args({
    both = {
      -- There is no need to wrap the second element, the &#39;import&#39; node,
      -- and the first parenthesis, which does not already exist.
      omit = { lang_utils.omit.if_second, &#39;import&#39;, &#39; (&#39; },
    },
    split = {
      last_separator = true,
      format_tree = function(tsj)
        -- If there are no brackets, then create them
        if not tsj:has_children({ &#39;(&#39;, &#39;)&#39; }) then
          tsj:create_child({ text = &#39; (&#39; }, 4)
          tsj:create_child({ text = &#39;)&#39; }, #tsj:children() + 1)
          -- Since the elements have moved, you need to add the penultimate
          -- separator manually
          local penult = tsj:child(-2)
          penult:update_text(penult:text() .. &#39;,&#39;)
        end
      end,
    },
    join = {
      format_tree = function(tsj)
        -- Remove brackets
        tsj:remove_child({ &#39;(&#39;, &#39;)&#39; })
      end,
    },
  }),
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;h4&gt;Option &lt;code&gt;format_resulted_lines&lt;/code&gt;&lt;/h4&gt; 
&lt;p&gt;The &lt;code&gt;format_resulted_lines&lt;/code&gt; function takes as an argument an array of strings that will replace the content of the base node. The second optional argument is the node that was processed. Useful if you want to format terms based on some values, such as a range.&lt;/p&gt; 
&lt;p&gt;The function should return an array of strings that may have been modified.&lt;/p&gt; 
&lt;p&gt;If the mode is &quot;join&quot;, then after executing this function, these strings will be concatenated.&lt;/p&gt; 
&lt;p&gt;E.g.:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- base node
local dict = { one = &#39;one&#39;, two = &#39;two&#39; }

-- array of string for replacement is { &quot;{&quot;, &quot;    one = &#39;one&#39;,&quot;, &quot;    two = &#39;two&#39;,&quot;, &quot;}&quot; }

-- base node after format
local dict = {
    one = &#39;one&#39;,
    two = &#39;two&#39;,
}

&lt;/code&gt;&lt;/pre&gt; 
&lt;details&gt; 
 &lt;summary&gt;Example of usage&lt;/summary&gt; 
 &lt;p&gt;The problem:&lt;/p&gt; 
 &lt;p&gt;Python&#39;s &lt;code&gt;import_from_statement&lt;/code&gt; does not have a container for a list of imported modules.&lt;/p&gt; 
 &lt;p&gt;Here you need to add parentheses to the middle and end of TreeSJ when splitting and remove these parentheses when joining.&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-ruby&quot;&gt;# from
if cond
    do_that(&#39;cond&#39;)
else
    do_this(&#39;not nond&#39;)
end

# to this and back
cond ? do_that(&#39;cond&#39;) : do_this(&#39;not nond&#39;)
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;This can be implemented with:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;local ruby = {
  conditional = lang_utils.set_default_preset({
    join = { enable = false },
    split = {
      omit = { lang_utils.omit.if_second },
      format_tree = function(tsj)
        local children = tsj:children()
        table.insert(children, tsj:create_child({ text = &#39;end&#39;, type = &#39;end&#39; }))
        tsj:child(&#39;?&#39;):update_text(&#39;if &#39;)
        tsj:child(&#39;:&#39;):update_text(&#39;else&#39;)
        local first, second = tsj:child(1), tsj:child(2)
        children[1] = second
        children[2] = first
        tsj:update_children(children)
      end,
      format_resulted_lines = function(lines)
        return vim.tbl_map(function(line)
          -- Need to remove one indent on `else` element
          if line:match(&#39;%s.else$&#39;) then
            local rgx = &#39;^&#39; .. (&#39; &#39;):rep(vim.fn.shiftwidth())
            return line:gsub(rgx, &#39;&#39;)
          else
            return line
          end
        end, lines)
      end,
    },
  }),
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;h2&gt;TreeSJ instance&lt;/h2&gt; 
&lt;p&gt;After the node for formatting is found, an instance of the TreeSJ class is created. Each of its children and descendants is also an instance of this class. The methods of this class can be used to change formatting behavior on the fly (see advanced node configuration).&lt;/p&gt; 
&lt;h3&gt;TreeSJ Lifecycle&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Checking the found Node&lt;/strong&gt;: There is a check that there is no syntax error in the node, there are no descendants with types from &lt;code&gt;preset[mode].no_format_with&lt;/code&gt; and &lt;code&gt;preset[mode].enable&lt;/code&gt; is true.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Creating root TreeSJ&lt;/strong&gt;: A node for formatting has been found and checked, and an instance of TreeSJ is created based on it.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Build tree&lt;/strong&gt;: It iterates all the children of the base node and creates the TreeSJ children. If the &lt;code&gt;preset[mode].recursive&lt;/code&gt; is true, then a check is made to see if the child or its children are configured, if so, a tree is built for it and its children.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Remove or insert last separator&lt;/strong&gt;: if a separator is specified in the preset.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Run &lt;code&gt;preset[mode].format_tree&lt;/code&gt;&lt;/strong&gt;: custom function from preset.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Mode-based preparation&lt;/strong&gt;: spacing or indenting, adding a &lt;code&gt;preset.join.force_insert&lt;/code&gt;, forming a list of strings to replace the base node content.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Run &lt;code&gt;preset[mode].format_resulted_lines&lt;/code&gt;&lt;/strong&gt;: custom function from preset.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Methods&lt;/h3&gt; 
&lt;details&gt; 
 &lt;summary&gt;Show/Hide methods...&lt;/summary&gt; 
 &lt;h4&gt;has_children&lt;/h4&gt; 
 &lt;p&gt;Checks if the specified types of children exist among the list of children. If types are omitted, checks that there is at least one child.&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@param types? string[]
---@return boolean
function TreeSJ:has_children(types)
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h4&gt;iter_children&lt;/h4&gt; 
 &lt;p&gt;Iterate all TreeSJ children. Use: &lt;code&gt;... for child, index in tsj:iter_children() do ...&lt;/code&gt;&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@return function, table
function TreeSJ:iter_children()
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h4&gt;children&lt;/h4&gt; 
 &lt;p&gt;Get the children list of the current TreeSJ. Returns all children if &lt;code&gt;types&lt;/code&gt; are omitted, otherwise returns all children of the listed types.&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@param types? string[] List-like table with child&#39;s types for filtering
---@return TreeSJ[]
function TreeSJ:children(types)
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h4&gt;root&lt;/h4&gt; 
 &lt;p&gt;Get root TreeSJ node of current TreeSJ&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@return TreeSJ TreeSJ instance
function TreeSJ:root()
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h4&gt;parent&lt;/h4&gt; 
 &lt;p&gt;Get parent TreeSJ&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@return TreeSJ|nil
function TreeSJ:parent()
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h4&gt;child&lt;/h4&gt; 
 &lt;p&gt;Get the child of the current node, using its &lt;code&gt;type&lt;/code&gt; (&lt;code&gt;tsj:type()&lt;/code&gt;) or &lt;code&gt;index&lt;/code&gt;.&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;The &lt;code&gt;index&lt;/code&gt; can be a negative value, which means to search from the end of the list.&lt;/li&gt; 
  &lt;li&gt;If a &lt;code&gt;type&lt;/code&gt; is passed, the first element found will be returned. To get an array of similar elements, use &lt;code&gt;TreeSJ:children(types)&lt;/code&gt;.&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@param type_or_index number|string Type of TreeSJ child or it index in children list
---@return TreeSJ|nil
function TreeSJ:child(type_or_index)
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h4&gt;create_child&lt;/h4&gt; 
 &lt;p&gt;Creating a new TreeSJ instance as a child of current TreeSJ.&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;data: {text=string, type=string|nil, copy_from=TreeSJ|nil} The &quot;copy_from&quot; field is used if a node needs to be duplicated and expects TreeSJ. If a TreeSJ instance is passed to it, then the &quot;text&quot; and &quot;type&quot; fields will be ignored.&lt;/li&gt; 
  &lt;li&gt;index: If index present, puts it in children list and returned this child, if not – returned child, but not puts it in children list. Index can be a negative value, meaning insert from the end. If an index is specified that is outside the list of children, then &lt;code&gt;nil&lt;/code&gt; will be returned.&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@param data table { text = string, type? = string }. If `type` not present, uses value of `text`
---@param index? integer Index where the child should be inserted.
---@return TreeSJ|nil
function TreeSJ:create_child(data, index)
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h4&gt;update_children&lt;/h4&gt; 
 &lt;p&gt;Updating children list of current TreeSJ&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@param children TreeSJ[]
function TreeSJ:update_children(children)
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;This function must be called every time you update the list of children from outside, for example:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- When a function should be called
local children = tsj:children()
local child = tsj:create_child({ text = &#39;end&#39; })
table.insert(children, child)
tsj:update_children(children) -- important

-- Here it is not necessary
tsj:create_child({ text = &#39;end&#39; }, #tsj:children() + 1)
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h4&gt;remove_child&lt;/h4&gt; 
 &lt;p&gt;Removes children by the passed types or index.&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@param types_or_index string|string[]|integer Type, types, or index of child to remove
function TreeSJ:remove_child(types_or_index)
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h4&gt;wrap&lt;/h4&gt; 
 &lt;p&gt;Creates the first and last elements in the list of children of the current TreeSJ.&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;If the &lt;code&gt;wrap&lt;/code&gt; mode is passed (the default), then a new list of children is created with one element as itself, and the wrapping elements are added to it.&lt;/li&gt; 
  &lt;li&gt;If the &lt;code&gt;inline&lt;/code&gt; mode is passed, then the real list of children of the current TreeSJ is used to add framing elements.&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@param data table { left = string, right = string }
---@param mode? &#39;wrap&#39;|&#39;inline&#39; &#39;wrap&#39; by default
function TreeSJ:wrap(data, mode)
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h4&gt;swap_children&lt;/h4&gt; 
 &lt;p&gt;Helps to swap elements by their indexes&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@param index1 integer
---@param index2 integer
function TreeSJ:swap_children(index1, index2)
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h4&gt;tsnode&lt;/h4&gt; 
 &lt;p&gt;Get &lt;a href=&quot;https://neovim.io/doc/user/treesitter.html#treesitter-node&quot;&gt;TSNode&lt;/a&gt; or TSNode imitator of current TreeSJ. If you plan to use tsnode methods in the future, you first need to check that the returned value is not an imitator.&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@return TSNode|table TSNode or TSNode imitator
function TreeSJ:tsnode()
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h4&gt;prev&lt;/h4&gt; 
 &lt;p&gt;Get left side TreeSJ&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@return TreeSJ|nil
function TreeSJ:prev()
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h4&gt;next&lt;/h4&gt; 
 &lt;p&gt;Get right side TreeSJ&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@return TreeSJ|nil
function TreeSJ:next()
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h4&gt;type&lt;/h4&gt; 
 &lt;p&gt;Get node type of current TreeSJ.&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@return string
function TreeSJ:type()
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h4&gt;text&lt;/h4&gt; 
 &lt;p&gt;Get text of current TreeSJ. At the time of the execution of the &lt;code&gt;format_tree&lt;/code&gt; function, the text will always be returned, not the table.&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@return string|table
function TreeSJ:text()
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h4&gt;update_text&lt;/h4&gt; 
 &lt;p&gt;Updating text of current TreeSJ. If the mode &quot;split&quot; and &quot;recursively&quot; is active, then it can be an array. In such a case, you need to update the text in its children directly.&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@param new_text string|string[]
function TreeSJ:update_text(new_text)
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;When working in recursive mode, you need to check that the nodes in which you want to change the text do not have children for recursive processing. In this case, the text will be glued from the children of the node, and you need to change the text in them.&lt;/p&gt; 
 &lt;p&gt;E.g.:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;{
  format_tree = function(tsj)
    if tsj:type() ~= &#39;statement_block&#39; then
      -- ...
      local body = tsj:child(2)
      if body:will_be_formatted() then
        local set_return
        if body:has_preset(&#39;split&#39;) then
          set_return = body:child(1)
        else
          set_return = body:child(1):child(1)
        end
        set_return:update_text(&#39;return &#39; .. set_return:text())
      else
        body:update_text(&#39;return &#39; .. body:text())
      end
      -- ...
    end
  end,
}
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h4&gt;will_be_formatted&lt;/h4&gt; 
 &lt;p&gt;Returns true if the current TreeSJ will be formatted. The conditions are met: recursion is active, the current element has a preset, or among its descendants there are nodes that will be processed.&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@return boolean
function TreeSJ:will_be_formatted()
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h4&gt;is_ignore&lt;/h4&gt; 
 &lt;p&gt;Checks if the current TreeSJ child must be ignored while recursive formatting.&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@return boolean
function TreeSJ:is_ignore()
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h4&gt;has_to_format&lt;/h4&gt; 
 &lt;p&gt;Checks if the TreeSJ contains children that need to be formatted&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@return boolean
function TreeSJ:has_to_format()
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h4&gt;is_first&lt;/h4&gt; 
 &lt;p&gt;Checks if the current node is first among sibling&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@return boolean
function TreeSJ:is_first()
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h4&gt;is_last&lt;/h4&gt; 
 &lt;p&gt;Checks if the current node is last among sibling&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@return boolean
function TreeSJ:is_last()
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h4&gt;is_framing&lt;/h4&gt; 
 &lt;p&gt;Checks if the current node is first or is last among sibling&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@return boolean
function TreeSJ:is_framing()
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h4&gt;is_omit&lt;/h4&gt; 
 &lt;p&gt;Checks if the text of current TreeSJ&#39;s type contains at &lt;code&gt;preset[mode].omit&lt;/code&gt;&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@return boolean
function TreeSJ:is_omit()
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h4&gt;is_imitator&lt;/h4&gt; 
 &lt;p&gt;Checks if the current TreeSJ is node-imitator&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@return boolean
function TreeSJ:is_imitator()
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h4&gt;preset&lt;/h4&gt; 
 &lt;p&gt;Get preset for current TreeSJ&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@param mode? &#39;split&#39;|&#39;join&#39; Current mode (split|join)
---@return table|nil
function TreeSJ:preset(mode)
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h4&gt;parent_preset&lt;/h4&gt; 
 &lt;p&gt;Get the preset of the TreeSJ parent&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@param mode? &#39;split&#39;|&#39;join&#39; Current mode (split|join)
---@return table|nil
function TreeSJ:parent_preset(mode)
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h4&gt;update_preset&lt;/h4&gt; 
 &lt;p&gt;Updates the presets for the current TreeSJ.&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@param new_preset table
---@param mode? &#39;split&#39;|&#39;join&#39;
function TreeSJ:update_preset(new_preset, mode)
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/14f23f707e8e3d6c6841d294b9115000a72c6ec0c497624baa6f14f9d8debc49/Wansmer/treesj" medium="image" />
      
    </item>
    
    <item>
      <title>folke/tokyonight.nvim</title>
      <link>https://github.com/folke/tokyonight.nvim</link>
      <description>&lt;p&gt;🏙 A clean, dark Neovim theme written in Lua, with support for lsp, treesitter and lots of plugins. Includes additional themes for Kitty, Alacritty, iTerm and Fish.&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;🏙 Tokyo Night&lt;/h1&gt; 
&lt;p&gt;A dark and light &lt;a href=&quot;https://github.com/neovim/neovim&quot;&gt;Neovim&lt;/a&gt; theme written in &lt;a href=&quot;https://www.lua.org&quot;&gt;Lua&lt;/a&gt; ported from the &lt;a href=&quot;https://github.com/enkia/tokyo-night-vscode-theme&quot;&gt;Visual Studio Code TokyoNight&lt;/a&gt; theme. Includes &lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/#-extras&quot;&gt;extra&lt;/a&gt; themes for &lt;a href=&quot;https://sw.kovidgoyal.net/kitty/conf.html&quot;&gt;Kitty&lt;/a&gt;, &lt;a href=&quot;https://github.com/alacritty/alacritty&quot;&gt;Alacritty&lt;/a&gt;, &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm&lt;/a&gt; and &lt;a href=&quot;https://fishshell.com/docs/current/index.html&quot;&gt;Fish&lt;/a&gt;.&lt;/p&gt; 
&lt;table width=&quot;100%&quot;&gt; 
 &lt;tbody&gt;
  &lt;tr&gt; 
   &lt;th&gt;Moon&lt;/th&gt; 
   &lt;th&gt;Storm&lt;/th&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td width=&quot;50%&quot;&gt; &lt;img src=&quot;https://user-images.githubusercontent.com/292349/190951628-10ba28a1-57ff-4479-8eab-47400a402242.png&quot; /&gt; &lt;/td&gt; 
   &lt;td width=&quot;50%&quot;&gt; &lt;img src=&quot;https://user-images.githubusercontent.com/292349/115295095-3a9e5080-a10e-11eb-9aed-6054488c46ce.png&quot; /&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Night&lt;/th&gt; 
   &lt;th&gt;Day&lt;/th&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td width=&quot;50%&quot;&gt; &lt;img src=&quot;https://user-images.githubusercontent.com/292349/115295327-7afdce80-a10e-11eb-89b3-2591262bf95a.png&quot; /&gt; &lt;/td&gt; 
   &lt;td width=&quot;50%&quot;&gt; &lt;img src=&quot;https://user-images.githubusercontent.com/292349/115996270-78c6c480-a593-11eb-8ed0-7d1400b058f5.png&quot; /&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt;
&lt;/table&gt; 
&lt;h2&gt;✨ Features&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;Supports the latest &lt;a href=&quot;https://github.com/neovim/neovim&quot;&gt;Neovim&lt;/a&gt; &lt;a href=&quot;https://github.com/neovim/neovim/releases/tag/v0.9.0&quot;&gt;0.9.0&lt;/a&gt; features.&lt;/li&gt; 
 &lt;li&gt;Terminal colors.&lt;/li&gt; 
 &lt;li&gt;Supports all major plugins.&lt;/li&gt; 
 &lt;li&gt;Provides &lt;a href=&quot;https://github.com/folke/tokyonight.nvim&quot;&gt;TokyoNight&lt;/a&gt; &lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/#-extras&quot;&gt;extras&lt;/a&gt; for numerous other applications.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;details&gt; 
 &lt;summary&gt;🎨 Supported Plugins&lt;/summary&gt; 
 &lt;!-- plugins:start --&gt; 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th&gt;Plugin&lt;/th&gt; 
    &lt;th&gt;Source&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/stevearc/aerial.nvim&quot;&gt;aerial.nvim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/aerial.lua&quot;&gt;&lt;code&gt;aerial&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/dense-analysis/ale&quot;&gt;ale&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/ale.lua&quot;&gt;&lt;code&gt;ale&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/goolord/alpha-nvim&quot;&gt;alpha-nvim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/alpha.lua&quot;&gt;&lt;code&gt;alpha&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/romgrk/barbar.nvim&quot;&gt;barbar.nvim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/barbar.lua&quot;&gt;&lt;code&gt;barbar&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/Saghen/blink.cmp&quot;&gt;blink.cmp&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/blink.lua&quot;&gt;&lt;code&gt;blink&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/akinsho/bufferline.nvim&quot;&gt;bufferline.nvim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/bufferline.lua&quot;&gt;&lt;code&gt;bufferline&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/hrsh7th/nvim-cmp&quot;&gt;nvim-cmp&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/cmp.lua&quot;&gt;&lt;code&gt;cmp&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/Exafunction/codeium.nvim&quot;&gt;codeium.nvim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/codeium.lua&quot;&gt;&lt;code&gt;codeium&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/zbirenbaum/copilot.lua&quot;&gt;copilot.lua&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/copilot.lua&quot;&gt;&lt;code&gt;copilot&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/mfussenegger/nvim-dap&quot;&gt;nvim-dap&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/dap.lua&quot;&gt;&lt;code&gt;dap&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/nvimdev/dashboard-nvim&quot;&gt;dashboard-nvim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/dashboard.lua&quot;&gt;&lt;code&gt;dashboard&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/folke/flash.nvim&quot;&gt;flash.nvim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/flash.lua&quot;&gt;&lt;code&gt;flash&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/ibhagwan/fzf-lua&quot;&gt;fzf-lua&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/fzf.lua&quot;&gt;&lt;code&gt;fzf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/airblade/vim-gitgutter&quot;&gt;vim-gitgutter&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/gitgutter.lua&quot;&gt;&lt;code&gt;gitgutter&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/lewis6991/gitsigns.nvim&quot;&gt;gitsigns.nvim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/gitsigns.lua&quot;&gt;&lt;code&gt;gitsigns&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/lambdalisue/glyph-palette.vim&quot;&gt;glyph-palette.vim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/glyph-palette.lua&quot;&gt;&lt;code&gt;glyph-palette&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/MagicDuck/grug-far.nvim&quot;&gt;grug-far.nvim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/grug-far.lua&quot;&gt;&lt;code&gt;grug-far&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/lukas-reineke/headlines.nvim&quot;&gt;headlines.nvim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/headlines.lua&quot;&gt;&lt;code&gt;headlines&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/phaazon/hop.nvim&quot;&gt;hop.nvim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/hop.lua&quot;&gt;&lt;code&gt;hop&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/RRethy/vim-illuminate&quot;&gt;vim-illuminate&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/illuminate.lua&quot;&gt;&lt;code&gt;illuminate&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/lukas-reineke/indent-blankline.nvim&quot;&gt;indent-blankline.nvim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/indent-blankline.lua&quot;&gt;&lt;code&gt;indent-blankline&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/nvimdev/indentmini.nvim&quot;&gt;indentmini.nvim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/indentmini.lua&quot;&gt;&lt;code&gt;indentmini&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/folke/lazy.nvim&quot;&gt;lazy.nvim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/lazy.lua&quot;&gt;&lt;code&gt;lazy&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/ggandor/leap.nvim&quot;&gt;leap.nvim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/leap.lua&quot;&gt;&lt;code&gt;leap&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/glepnir/lspsaga.nvim&quot;&gt;lspsaga.nvim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/lspsaga.lua&quot;&gt;&lt;code&gt;lspsaga&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/echasnovski/mini.animate&quot;&gt;mini.animate&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/mini_animate.lua&quot;&gt;&lt;code&gt;mini_animate&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/echasnovski/mini.clue&quot;&gt;mini.clue&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/mini_clue.lua&quot;&gt;&lt;code&gt;mini_clue&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/echasnovski/mini.completion&quot;&gt;mini.completion&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/mini_completion.lua&quot;&gt;&lt;code&gt;mini_completion&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/echasnovski/mini.cursorword&quot;&gt;mini.cursorword&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/mini_cursorword.lua&quot;&gt;&lt;code&gt;mini_cursorword&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/echasnovski/mini.deps&quot;&gt;mini.deps&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/mini_deps.lua&quot;&gt;&lt;code&gt;mini_deps&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/echasnovski/mini.diff&quot;&gt;mini.diff&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/mini_diff.lua&quot;&gt;&lt;code&gt;mini_diff&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/echasnovski/mini.files&quot;&gt;mini.files&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/mini_files.lua&quot;&gt;&lt;code&gt;mini_files&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/echasnovski/mini.hipatterns&quot;&gt;mini.hipatterns&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/mini_hipatterns.lua&quot;&gt;&lt;code&gt;mini_hipatterns&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/echasnovski/mini.icons&quot;&gt;mini.icons&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/mini_icons.lua&quot;&gt;&lt;code&gt;mini_icons&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/echasnovski/mini.indentscope&quot;&gt;mini.indentscope&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/mini_indentscope.lua&quot;&gt;&lt;code&gt;mini_indentscope&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/echasnovski/mini.jump&quot;&gt;mini.jump&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/mini_jump.lua&quot;&gt;&lt;code&gt;mini_jump&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/echasnovski/mini.map&quot;&gt;mini.map&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/mini_map.lua&quot;&gt;&lt;code&gt;mini_map&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/echasnovski/mini.notify&quot;&gt;mini.notify&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/mini_notify.lua&quot;&gt;&lt;code&gt;mini_notify&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/echasnovski/mini.operators&quot;&gt;mini.operators&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/mini_operators.lua&quot;&gt;&lt;code&gt;mini_operators&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/echasnovski/mini.pick&quot;&gt;mini.pick&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/mini_pick.lua&quot;&gt;&lt;code&gt;mini_pick&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/echasnovski/mini.starter&quot;&gt;mini.starter&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/mini_starter.lua&quot;&gt;&lt;code&gt;mini_starter&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/echasnovski/mini.statusline&quot;&gt;mini.statusline&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/mini_statusline.lua&quot;&gt;&lt;code&gt;mini_statusline&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/echasnovski/mini.surround&quot;&gt;mini.surround&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/mini_surround.lua&quot;&gt;&lt;code&gt;mini_surround&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/echasnovski/mini.tabline&quot;&gt;mini.tabline&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/mini_tabline.lua&quot;&gt;&lt;code&gt;mini_tabline&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/echasnovski/mini.test&quot;&gt;mini.test&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/mini_test.lua&quot;&gt;&lt;code&gt;mini_test&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/echasnovski/mini.trailspace&quot;&gt;mini.trailspace&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/mini_trailspace.lua&quot;&gt;&lt;code&gt;mini_trailspace&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/SmiteshP/nvim-navic&quot;&gt;nvim-navic&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/navic.lua&quot;&gt;&lt;code&gt;navic&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/nvim-neo-tree/neo-tree.nvim&quot;&gt;neo-tree.nvim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/neo-tree.lua&quot;&gt;&lt;code&gt;neo-tree&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/TimUntersberger/neogit&quot;&gt;neogit&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/neogit.lua&quot;&gt;&lt;code&gt;neogit&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/nvim-neotest/neotest&quot;&gt;neotest&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/neotest.lua&quot;&gt;&lt;code&gt;neotest&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/folke/noice.nvim&quot;&gt;noice.nvim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/noice.lua&quot;&gt;&lt;code&gt;noice&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/rcarriga/nvim-notify&quot;&gt;nvim-notify&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/notify.lua&quot;&gt;&lt;code&gt;notify&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/kyazdani42/nvim-tree.lua&quot;&gt;nvim-tree.lua&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/nvim-tree.lua&quot;&gt;&lt;code&gt;nvim-tree&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/pwntester/octo.nvim&quot;&gt;octo.nvim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/octo.lua&quot;&gt;&lt;code&gt;octo&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/HiPhish/rainbow-delimiters.nvim&quot;&gt;rainbow-delimiters.nvim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/rainbow.lua&quot;&gt;&lt;code&gt;rainbow&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/MeanderingProgrammer/render-markdown.nvim&quot;&gt;render-markdown.nvim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/render-markdown.lua&quot;&gt;&lt;code&gt;render-markdown&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/petertriho/nvim-scrollbar&quot;&gt;nvim-scrollbar&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/scrollbar.lua&quot;&gt;&lt;code&gt;scrollbar&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/folke/sidekick.nvim&quot;&gt;sidekick.nvim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/sidekick.lua&quot;&gt;&lt;code&gt;sidekick&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim&quot;&gt;snacks.nvim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/snacks.lua&quot;&gt;&lt;code&gt;snacks&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/justinmk/vim-sneak&quot;&gt;vim-sneak&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/sneak.lua&quot;&gt;&lt;code&gt;sneak&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/supermaven-inc/supermaven-nvim&quot;&gt;supermaven-nvim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/supermaven.lua&quot;&gt;&lt;code&gt;supermaven&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/nvim-telescope/telescope.nvim&quot;&gt;telescope.nvim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/telescope.lua&quot;&gt;&lt;code&gt;telescope&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/nvim-treesitter/nvim-treesitter-context&quot;&gt;nvim-treesitter-context&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/treesitter-context.lua&quot;&gt;&lt;code&gt;treesitter-context&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/folke/trouble.nvim&quot;&gt;trouble.nvim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/trouble.lua&quot;&gt;&lt;code&gt;trouble&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/vimwiki/vimwiki&quot;&gt;vimwiki&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/vimwiki.lua&quot;&gt;&lt;code&gt;vimwiki&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/folke/which-key.nvim&quot;&gt;which-key.nvim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/which-key.lua&quot;&gt;&lt;code&gt;which-key&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/gbprod/yanky.nvim&quot;&gt;yanky.nvim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/lua/tokyonight/groups/yanky.lua&quot;&gt;&lt;code&gt;yanky&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
 &lt;!-- plugins:end --&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;🍭 Extras&lt;/summary&gt; 
 &lt;!-- extras:start --&gt; 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th&gt;Tool&lt;/th&gt; 
    &lt;th&gt;Extra&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://git.sr.ht/~rjarry/aerc/&quot;&gt;Aerc&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/aerc&quot;&gt;extras/aerc&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://aider.chat&quot;&gt;Aider&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/aider&quot;&gt;extras/aider&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/alacritty/alacritty&quot;&gt;Alacritty&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/alacritty&quot;&gt;extras/alacritty&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/aristocratos/btop&quot;&gt;Btop++&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/btop&quot;&gt;extras/btop&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/dandavison/delta&quot;&gt;Delta&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/delta&quot;&gt;extras/delta&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://betterdiscord.app/&quot;&gt;(Better-)Discord&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/discord&quot;&gt;extras/discord&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://dunst-project.org/&quot;&gt;Dunst&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/dunst&quot;&gt;extras/dunst&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://eza.rocks&quot;&gt;eza&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/eza&quot;&gt;extras/eza&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://fishshell.com/docs/current/index.html&quot;&gt;Fish&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/fish&quot;&gt;extras/fish&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://fishshell.com/docs/current/interactive.html#syntax-highlighting&quot;&gt;Fish Themes&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/fish_themes&quot;&gt;extras/fish_themes&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://codeberg.org/dnkl/foot&quot;&gt;Foot&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/foot&quot;&gt;extras/foot&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://codeberg.org/dnkl/fuzzel&quot;&gt;Fuzzel&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/fuzzel&quot;&gt;extras/fuzzel&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/junegunn/fzf&quot;&gt;Fzf&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/fzf&quot;&gt;extras/fzf&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/google-gemini/gemini-cli&quot;&gt;Gemini CLI&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/gemini_cli&quot;&gt;extras/gemini_cli&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/ghostty-org/ghostty&quot;&gt;Ghostty&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/ghostty&quot;&gt;extras/ghostty&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/extrawurst/gitui&quot;&gt;GitUI&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/gitui&quot;&gt;extras/gitui&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://gitlab.gnome.org/GNOME/gnome-terminal&quot;&gt;GNOME Terminal&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/gnome_terminal&quot;&gt;extras/gnome_terminal&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://helix-editor.com/&quot;&gt;Helix&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/helix&quot;&gt;extras/helix&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://ish.app&quot;&gt;iSH &lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/ish&quot;&gt;extras/ish&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/iterm&quot;&gt;extras/iterm&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://sw.kovidgoyal.net/kitty/conf.html&quot;&gt;Kitty&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/kitty&quot;&gt;extras/kitty&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://konsole.kde.org/&quot;&gt;Konsole&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/konsole&quot;&gt;extras/konsole&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/jesseduffield/lazygit&quot;&gt;Lazygit&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/lazygit&quot;&gt;extras/lazygit&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://www.lua.org&quot;&gt;Lua Table for testing&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/lua&quot;&gt;extras/lua&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/sst/opencode&quot;&gt;opencode&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/opencode&quot;&gt;extras/opencode&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/badlogic/pi-mono&quot;&gt;pi&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/pi&quot;&gt;extras/pi&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://prismjs.com&quot;&gt;Prism&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/prism&quot;&gt;extras/prism&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://f1bonacc1.github.io/process-compose/&quot;&gt;process-compose&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/process_compose&quot;&gt;extras/process_compose&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/lxqt/qterminal&quot;&gt;QTerminal&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/qterminal&quot;&gt;extras/qterminal&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://slack.com&quot;&gt;Slack&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/slack&quot;&gt;extras/slack&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/aome510/spotify-player&quot;&gt;Spotify Player&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/spotify_player&quot;&gt;extras/spotify_player&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://www.sublimetext.com/docs/themes&quot;&gt;Sublime Text&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/sublime&quot;&gt;extras/sublime&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://tailwindcss.com&quot;&gt;Tailwind CSS (v4)&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/tailwindv4&quot;&gt;extras/tailwindv4&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://gnome-terminator.readthedocs.io/en/latest/config.html&quot;&gt;Terminator&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/terminator&quot;&gt;extras/terminator&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://termux.dev/&quot;&gt;Termux&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/termux&quot;&gt;extras/termux&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/gnunn1/tilix&quot;&gt;Tilix&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/tilix&quot;&gt;extras/tilix&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/tmux/tmux/wiki&quot;&gt;Tmux&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/tmux&quot;&gt;extras/tmux&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://vimhelp.org/&quot;&gt;Vim&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/vim&quot;&gt;extras/vim&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://vimium.github.io/&quot;&gt;Vimium&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/vimium&quot;&gt;extras/vimium&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://vivaldi.com&quot;&gt;Vivaldi&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/vivaldi&quot;&gt;extras/vivaldi&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://wezfurlong.org/wezterm/config/files.html&quot;&gt;WezTerm&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/wezterm&quot;&gt;extras/wezterm&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://aka.ms/terminal-documentation&quot;&gt;Windows Terminal&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/windows_terminal&quot;&gt;extras/windows_terminal&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://docs.xfce.org/apps/terminal/advanced&quot;&gt;Xfce Terminal&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/xfceterm&quot;&gt;extras/xfceterm&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://wiki.archlinux.org/title/X_resources&quot;&gt;Xresources&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/xresources&quot;&gt;extras/xresources&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/sxyazi/yazi&quot;&gt;Yazi&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/yazi&quot;&gt;extras/yazi&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://pwmt.org/projects/zathura/&quot;&gt;Zathura&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/zathura&quot;&gt;extras/zathura&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;a href=&quot;https://zellij.dev/&quot;&gt;Zellij&lt;/a&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/zellij&quot;&gt;extras/zellij&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
 &lt;!-- extras:end --&gt; 
&lt;/details&gt; 
&lt;h2&gt;⚡️ Requirements&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/neovim/neovim&quot;&gt;Neovim&lt;/a&gt; &amp;gt;= &lt;a href=&quot;https://github.com/neovim/neovim/releases/tag/v0.8.0&quot;&gt;0.8.0&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;📦 Installation&lt;/h2&gt; 
&lt;p&gt;Install the theme with your preferred package manager, such as &lt;a href=&quot;https://github.com/folke/lazy.nvim&quot;&gt;folke/lazy.nvim&lt;/a&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;{
  &quot;folke/tokyonight.nvim&quot;,
  lazy = false,
  priority = 1000,
  opts = {},
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;🚀 Usage&lt;/h2&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;vim.cmd[[colorscheme tokyonight]]
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code class=&quot;language-vim&quot;&gt;colorscheme tokyonight

&quot; There are also colorschemes for the different styles.
colorscheme tokyonight-night
colorscheme tokyonight-storm
colorscheme tokyonight-day
colorscheme tokyonight-moon
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Some plugins need extra configuration to work with &lt;strong&gt;TokyoNight&lt;/strong&gt;.&lt;/p&gt; 
&lt;details&gt; 
 &lt;summary&gt;Click here for more details&lt;/summary&gt; 
 &lt;h3&gt;&lt;a href=&quot;https://github.com/utilyre/barbecue.nvim&quot;&gt;Barbecue&lt;/a&gt;&lt;/h3&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- Lua
require(&#39;barbecue&#39;).setup {
  -- ... your barbecue config
  theme = &#39;tokyonight&#39;,
  -- ... your barbecue config
}
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h3&gt;&lt;a href=&quot;https://github.com/nvim-lualine/lualine.nvim&quot;&gt;Lualine&lt;/a&gt;&lt;/h3&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- Lua
require(&#39;lualine&#39;).setup {
  options = {
    -- ... your lualine config
    theme = &#39;tokyonight&#39;
    -- ... your lualine config
  }
}
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h3&gt;&lt;a href=&quot;https://github.com/itchyny/lightline.vim&quot;&gt;Lightline&lt;/a&gt;&lt;/h3&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-vim&quot;&gt;&quot; Vim Script
let g:lightline = {&#39;colorscheme&#39;: &#39;tokyonight&#39;}
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;h2&gt;⚙️ Configuration&lt;/h2&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-important&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-report mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Important&lt;/p&gt;
 &lt;p&gt;Set the configuration &lt;strong&gt;BEFORE&lt;/strong&gt; loading the color scheme with &lt;code&gt;colorscheme tokyonight&lt;/code&gt;.&lt;/p&gt; 
&lt;/div&gt; 
&lt;p&gt;The theme offers four styles: &lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/#storm&quot;&gt;storm&lt;/a&gt;, &lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/#moon&quot;&gt;moon&lt;/a&gt;, &lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/#night&quot;&gt;night&lt;/a&gt;, and &lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/#day&quot;&gt;day&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;The &lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/#day&quot;&gt;day&lt;/a&gt; style is used when &lt;code&gt;{ style = &quot;day&quot; }&lt;/code&gt; is passed to &lt;code&gt;setup(options)&lt;/code&gt; or when &lt;code&gt;vim.o.background = &quot;light&quot;&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/folke/tokyonight.nvim&quot;&gt;TokyoNight&lt;/a&gt; uses the default options, unless &lt;code&gt;setup&lt;/code&gt; is explicitly called.&lt;/p&gt; 
&lt;details&gt; 
 &lt;summary&gt;Default Options&lt;/summary&gt; 
 &lt;!-- config:start --&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;---@class tokyonight.Config
---@field on_colors fun(colors: ColorScheme)
---@field on_highlights fun(highlights: tokyonight.Highlights, colors: ColorScheme)
M.defaults = {
  style = &quot;moon&quot;, -- The theme comes in three styles, `storm`, a darker variant `night` and `day`
  light_style = &quot;day&quot;, -- The theme is used when the background is set to light
  transparent = false, -- Enable this to disable setting the background color
  terminal_colors = true, -- Configure the colors used when opening a `:terminal` in Neovim
  styles = {
    -- Style to be applied to different syntax groups
    -- Value is any valid attr-list value for `:help nvim_set_hl`
    comments = { italic = true },
    keywords = { italic = true },
    functions = {},
    variables = {},
    -- Background styles. Can be &quot;dark&quot;, &quot;transparent&quot; or &quot;normal&quot;
    sidebars = &quot;dark&quot;, -- style for sidebars, see below
    floats = &quot;dark&quot;, -- style for floating windows
  },
  day_brightness = 0.3, -- Adjusts the brightness of the colors of the **Day** style. Number between 0 and 1, from dull to vibrant colors
  dim_inactive = false, -- dims inactive windows
  lualine_bold = false, -- When `true`, section headers in the lualine theme will be bold

  --- You can override specific color groups to use other groups or a hex color
  --- function will be called with a ColorScheme table
  ---@param colors ColorScheme
  on_colors = function(colors) end,

  --- You can override specific highlights to use other groups or a hex color
  --- function will be called with a Highlights and ColorScheme table
  ---@param highlights tokyonight.Highlights
  ---@param colors ColorScheme
  on_highlights = function(highlights, colors) end,

  cache = true, -- When set to true, the theme will be cached for better performance

  ---@type table&amp;lt;string, boolean|{enabled:boolean}&amp;gt;
  plugins = {
    -- enable all plugins when not using lazy.nvim
    -- set to false to manually enable/disable plugins
    all = package.loaded.lazy == nil,
    -- uses your plugin manager to automatically enable needed plugins
    -- currently only lazy.nvim is supported
    auto = true,
    -- add any plugins here that you want to enable
    -- for all possible plugins, see:
    --   * https://github.com/folke/tokyonight.nvim/tree/main/lua/tokyonight/groups
    -- telescope = true,
  },
}
&lt;/code&gt;&lt;/pre&gt; 
 &lt;!-- config:end --&gt; 
&lt;/details&gt; 
&lt;h2&gt;🪓 Overriding Colors &amp;amp; Highlight Groups&lt;/h2&gt; 
&lt;p&gt;How the highlight groups are calculated:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;code&gt;colors&lt;/code&gt; are determined based on your configuration, with the ability to override them using &lt;code&gt;config.on_colors(colors)&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;These &lt;code&gt;colors&lt;/code&gt; are utilized to generate the highlight groups.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;config.on_highlights(highlights, colors)&lt;/code&gt; can be used to override highlight groups.&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;For default values of &lt;code&gt;colors&lt;/code&gt; and &lt;code&gt;highlights&lt;/code&gt;, please consult the &lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/lua/tokyonight_storm.lua&quot;&gt;storm&lt;/a&gt;, &lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/lua/tokyonight_moon.lua&quot;&gt;moon&lt;/a&gt;, &lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/lua/tokyonight_night.lua&quot;&gt;night&lt;/a&gt;, and &lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/lua/tokyonight_day.lua&quot;&gt;day&lt;/a&gt; themes.&lt;/p&gt; 
&lt;details&gt; 
 &lt;summary&gt;Settings &amp;amp; Changing Colors&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&quot;tokyonight&quot;).setup({
  -- use the night style
  style = &quot;night&quot;,
  -- disable italic for functions
  styles = {
    functions = {}
  },
  -- Change the &quot;hint&quot; color to the &quot;orange&quot; color, and make the &quot;error&quot; color bright red
  on_colors = function(colors)
    colors.hint = colors.orange
    colors.error = &quot;#ff0000&quot;
  end
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;Borderless Telescope&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&quot;tokyonight&quot;).setup({
  on_highlights = function(hl, c)
    local prompt = &quot;#2d3149&quot;
    hl.TelescopeNormal = {
      bg = c.bg_dark,
      fg = c.fg_dark,
    }
    hl.TelescopeBorder = {
      bg = c.bg_dark,
      fg = c.bg_dark,
    }
    hl.TelescopePromptNormal = {
      bg = prompt,
    }
    hl.TelescopePromptBorder = {
      bg = prompt,
      fg = prompt,
    }
    hl.TelescopePromptTitle = {
      bg = prompt,
      fg = prompt,
    }
    hl.TelescopePreviewTitle = {
      bg = c.bg_dark,
      fg = c.bg_dark,
    }
    hl.TelescopeResultsTitle = {
      bg = c.bg_dark,
      fg = c.bg_dark,
    }
  end,
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;Fix &lt;code&gt;undercurls&lt;/code&gt; in Tmux&lt;/summary&gt; 
 &lt;p&gt;To have undercurls show up and in color, add the following to your &lt;a href=&quot;https://github.com/tmux/tmux&quot;&gt;Tmux&lt;/a&gt; configuration file:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;# Undercurl
set -g default-terminal &quot;${TERM}&quot;
set -as terminal-overrides &#39;,*:Smulx=\E[4::%p1%dm&#39;  # undercurl support
set -as terminal-overrides &#39;,*:Setulc=\E[58::2::::%p1%{65536}%/%d::%p1%{256}%/%{255}%&amp;amp;%d::%p1%{255}%&amp;amp;%d%;m&#39;  # underscore colours - needs tmux-3.0
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;h2&gt;🍭 Extras&lt;/h2&gt; 
&lt;p&gt;Extra color configs for &lt;a href=&quot;https://sw.kovidgoyal.net/kitty/conf.html&quot;&gt;Kitty&lt;/a&gt;, &lt;a href=&quot;https://github.com/alacritty/alacritty&quot;&gt;Alacritty&lt;/a&gt;, &lt;a href=&quot;https://fishshell.com/docs/current/index.html&quot;&gt;Fish&lt;/a&gt;, &lt;a href=&quot;https://wezfurlong.org/wezterm/config/files.html&quot;&gt;WezTerm&lt;/a&gt;, &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm&lt;/a&gt; and &lt;a href=&quot;https://codeberg.org/dnkl/foot&quot;&gt;foot&lt;/a&gt; can be found in &lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/&quot;&gt;extras&lt;/a&gt;. To use them, refer to their respective documentation.&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/292349/115395546-d8d6f880-a198-11eb-98fb-a1194787701d.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;You can easily use the color palette for other plugins inside your &lt;a href=&quot;https://github.com/neovim/neovim&quot;&gt;Neovim&lt;/a&gt; configuration:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;local colors = require(&quot;tokyonight.colors&quot;).setup() -- pass in any of the config options as explained above
local util = require(&quot;tokyonight.util&quot;)

aplugin.background = colors.bg_dark
aplugin.my_error = util.lighten(colors.red1, 0.3) -- number between 0 and 1. 0 results in white, 1 results in red1
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;🔥 Contributing&lt;/h2&gt; 
&lt;p&gt;Pull requests are welcome! Please see &lt;a href=&quot;https://raw.githubusercontent.com/folke/tokyonight.nvim/main/CONTRIBUTING.md&quot;&gt;CONTRIBUTING.md&lt;/a&gt; for guidelines on adding new extras and general contribution guidelines.&lt;/p&gt;</description>
      
      <media:content url="https://repository-images.githubusercontent.com/358671583/e3e54680-a10e-11eb-934a-a5b7e149e399" medium="image" />
      
    </item>
    
    <item>
      <title>pterodactyl/game-eggs</title>
      <link>https://github.com/pterodactyl/game-eggs</link>
      <description>&lt;p&gt;Pterodactyl Game Eggs&lt;/p&gt;&lt;hr&gt;&lt;h2&gt;Game egg list&lt;/h2&gt; 
&lt;p&gt;Below is a categorized list of games with links to their respective server configurations and mod files. Click on each game to explore further.&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/7_days_to_die&quot;&gt;7 Days to Die&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/abiotic_factor&quot;&gt;Abiotic Factor&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/aloft&quot;&gt;Aloft&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;Americas Army&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/americas_army/proving_grounds&quot;&gt;Proving Grounds&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Among Us&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/among_us/bettercrewlink_server&quot;&gt;BetterCrewLink Server&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/among_us/crewlink_server&quot;&gt;Crewlink Server&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/among_us/impostor_server&quot;&gt;Impostor Server&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;ARK&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/ark_survival_ascended&quot;&gt;Survival Ascended&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/ark_survival_evolved&quot;&gt;Survival Evolved&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Arma&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/arma/arma3&quot;&gt;Arma 3&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/arma/arma_reforger&quot;&gt;Arma Reforger&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/Aska&quot;&gt;Aska&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;Assetto Corsa&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/astroneer&quot;&gt;Astroneer&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/astro_colony&quot;&gt;Astro Colony&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/automobilista2&quot;&gt;Automobilista 2&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/avorion&quot;&gt;Avorion&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/barotrauma&quot;&gt;Barotrauma&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/banana_shooter&quot;&gt;Banana Shooter&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/battalion_legacy&quot;&gt;BATTALION Legacy&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;BeamNG&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/beamng/beammp&quot;&gt;BeamMP&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/beamng/kissmp&quot;&gt;KissMP&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/black_mesa&quot;&gt;Black Mesa&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/brickadia&quot;&gt;Brickadia&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/citadel&quot;&gt;Citadel&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;ClassiCube&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/classicube/mcgalaxy&quot;&gt;MCGalaxy&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/clone_hero&quot;&gt;Clone Hero&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;Call of Duty / COD&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/cod/iw4x&quot;&gt;IW4X&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/colony_survival&quot;&gt;Colony Survival&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/conan_exiles&quot;&gt;Conan Exiles&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/contagion&quot;&gt;Contagion)&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/core_keeper&quot;&gt;Core Keeper&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;Counter-Strike&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/counter_strike/counter_strike_2&quot;&gt;Counter-Strike 2&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/counter_strike/counter_strike_source&quot;&gt;Counter-Strike: Source&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/counter_strike/counter_strike_1.6_rehlds&quot;&gt;Counter-Strike: cs1.6-rehlds&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/craftopia&quot;&gt;Craftopia&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/cryofall&quot;&gt;CryoFall&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/cs2d&quot;&gt;CS2D&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;Cube Engine&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/cubeengine/assaultcube&quot;&gt;AssaultCube&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/cubeengine/cube2&quot;&gt;Cube 2&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/cubic_odyssey&quot;&gt;Cubic Odyssey&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/dayz&quot;&gt;DayZ&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/ddnet&quot;&gt;DDNet&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/ddracenetwork&quot;&gt;DDRace Network&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/dead_matter&quot;&gt;Dead Matter&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/dont_starve&quot;&gt;Don&#39;t Starve&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;Doom&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/doom/zandronum&quot;&gt;Zandronum&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/eco&quot;&gt;Eco&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/eft&quot;&gt;Escape from Tarkov (EFT)&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/empyrion&quot;&gt;Empyrion&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/enshrouded&quot;&gt;Enshrouded&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/factorio&quot;&gt;Factorio&lt;/a&gt;&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/factorio/clusterio&quot;&gt;Clusterio&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/factorio/factorio-modupdate&quot;&gt;Factorio Mod Update&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/fof&quot;&gt;Fistful of Frags (FoF)&lt;/a&gt;&lt;/h4&gt; 
&lt;h3&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/fortresscraft_evolved&quot;&gt;FortressCraft Evolved&lt;/a&gt;&lt;/h3&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/foundry&quot;&gt;Foundry&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/foundry_vtt&quot;&gt;Foundry Virtual Tabletop (VTT)&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/frozen_flame&quot;&gt;Frozen Flame&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/ftl_tachyon&quot;&gt;FTL Tachyon&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/gmod&quot;&gt;Garry&#39;s Mod (GMod)&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/ground_branch&quot;&gt;Ground Branch&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;Grand Theft Auto (GTA)&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/gta/altv&quot;&gt;AltV&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/gta/fivem&quot;&gt;FiveM&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/gta/gtac&quot;&gt;GTAC&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/gta/mtasa&quot;&gt;Multi Theft Auto: SA (MTA:SA)&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/gta/openmp&quot;&gt;OpenMP&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/gta/ragecoop&quot;&gt;RAGE:Coop&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/gta/ragemp&quot;&gt;RAGEMP&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/gta/samp&quot;&gt;SA-MP&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Half-Life Dedicated Server (HLDS)&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/hlds_server/rehlds&quot;&gt;ReHLDS&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/hlds_server/vanilla&quot;&gt;Vanilla&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/half_life_2_deathmatch/&quot;&gt;Half-Life 2: Deathmatch&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/hogwarp&quot;&gt;Hogwarp&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/holdfast&quot;&gt;Holdfast&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/humanitz&quot;&gt;HumanitZ&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/hurtworld&quot;&gt;Hurtworld&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/hytale&quot;&gt;Hytale&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/icarus&quot;&gt;Icarus&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/insurgency_sandstorm&quot;&gt;Insurgency: Sandstorm&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/iosoccer&quot;&gt;IOSoccer&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;Just Cause&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/just_cause/just_cause_3&quot;&gt;Just Cause 3&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/killing_floor_2&quot;&gt;Killing Floor 2&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/ksp&quot;&gt;Kerbal Space Program (KSP)&lt;/a&gt;&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/ksp/DMP&quot;&gt;Dark Multiplayer&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/ksp/LMP&quot;&gt;Luna Multiplayer&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/leaguesandbox&quot;&gt;League Sandbox&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;Left 4 Dead Series&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/left4dead&quot;&gt;Left 4 Dead&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/left4dead_2&quot;&gt;Left 4 Dead 2&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/longvinter&quot;&gt;Longvinter&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/losangelescrimes&quot;&gt;Los Angeles Crimes&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/midnight_ghost_hunt&quot;&gt;Midnight Ghost Hunt&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/mindustry&quot;&gt;Mindustry&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;Minecraft&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/minecraft/bedrock&quot;&gt;Bedrock Edition&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/minecraft/bedrock/gomint&quot;&gt;GoMint&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/minecraft/bedrock/LeviLamina&quot;&gt;LeviLamina&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/minecraft/bedrock/LiteLoader-bedrock&quot;&gt;LiteLoader&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/minecraft/bedrock/nukkit&quot;&gt;Nukkit&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/minecraft/bedrock/pocketmine_mp&quot;&gt;PocketMine-MP&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/minecraft/bedrock/PowerNukkitX&quot;&gt;PowerNukkitX&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/minecraft/crossplay/purpur-geysermc-floodgate&quot;&gt;Crossplay&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/minecraft/java&quot;&gt;Java Edition&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/minecraft/java/canvas-mc&quot;&gt;CanvasMC&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/minecraft/java/cuberite&quot;&gt;Cuberite&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/minecraft/java/curseforge&quot;&gt;CurseForge&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/minecraft/java/fabric&quot;&gt;Fabric&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/minecraft/java/forge&quot;&gt;Forge&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/minecraft/java/technic&quot;&gt;Technic&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/minetest&quot;&gt;Minetest&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/modiverse&quot;&gt;Modiverse&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/mohaa&quot;&gt;Medal of Honor: Allied Assault (MoHAA)&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/mordhau&quot;&gt;Mordhau&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/mount_blade_II_bannerlord&quot;&gt;Mount &amp;amp; Blade II: Bannerlord&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/myth_of_empires&quot;&gt;Myth of Empires&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/necesse&quot;&gt;Necesse&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/neosvr&quot;&gt;Neos VR&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/neverwinter_nights_ee&quot;&gt;Neverwinter Nights: Enhanced Edition&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/Nightingale&quot;&gt;Nightingale&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/night_of_the_dead&quot;&gt;Night of the Dead&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/nmrih&quot;&gt;No More Room in Hell (NMRIH)&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/novalife_amboise&quot;&gt;Novalife Amboise&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/no_love_lost&quot;&gt;No Love Lost&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/no_one_survived&quot;&gt;No One Survived&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/nuclear_option&quot;&gt;Nuclear Option&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/onset&quot;&gt;Onset&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/openarena&quot;&gt;OpenArena&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/openra&quot;&gt;OpenRA&lt;/a&gt;&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/openra/openra_dune2000&quot;&gt;Dune 2000&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/openra/openra_red_alert&quot;&gt;Red Alert&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/openra/openra_tiberian_dawn&quot;&gt;Tiberian Dawn&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/openrct2&quot;&gt;OpenRCT2&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/openttd&quot;&gt;OpenTTD&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/operation_harsh_doorstop&quot;&gt;Operation Harsh Doorstop&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/palworld&quot;&gt;Palworld&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/path_of_titans&quot;&gt;Path of Titans&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/pavlov_vr&quot;&gt;Pavlov VR&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/renown&quot;&gt;Renown&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/scum&quot;&gt;SCUM&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/plains_of_pain&quot;&gt;Plains of Pain&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/puck&quot;&gt;Puck&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/sonic_robo_blast_2&quot;&gt;Sonic Robo Blast 2 (SRB2)&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/soldat_2&quot;&gt;Soldat 2&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/sunkenland&quot;&gt;Sunkenland&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/voyagers_of_nera&quot;&gt;Voyager of Nera&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/windrose&quot;&gt;Windrose&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/wine/generic&quot;&gt;Wine Generic&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/wolfenstein_enemy_territory/etlegacy&quot;&gt;Wolfenstein: Enemy Territory (ET Legacy)&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/wurm_unlimited&quot;&gt;Wurm Unlimited&lt;/a&gt;&lt;/h4&gt; 
&lt;h4&gt;&lt;a href=&quot;https://raw.githubusercontent.com/pterodactyl/game-eggs/main/xonotic&quot;&gt;Xonotic&lt;/a&gt;&lt;/h4&gt; 
&lt;hr /&gt; 
&lt;p&gt;For detailed configuration files, mod support, or server setup guides, refer to each game&#39;s folder. Please submit issues or pull requests for any improvements or additions.&lt;/p&gt; 
&lt;hr /&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/6d9da986f0944cd6172961590373ffb8295cf34b011ac3d582318b44d39a5ddb/pterodactyl/game-eggs" medium="image" />
      
    </item>
    
    <item>
      <title>LazyVim/LazyVim</title>
      <link>https://github.com/LazyVim/LazyVim</link>
      <description>&lt;p&gt;Neovim config for the lazy&lt;/p&gt;&lt;hr&gt;&lt;div align=&quot;center&quot;&gt; 
 &lt;img src=&quot;https://user-images.githubusercontent.com/292349/213446185-2db63fd5-8c84-459c-9f04-e286382d6e80.png&quot; /&gt; 
&lt;/div&gt; 
&lt;hr /&gt; 
&lt;h4 align=&quot;center&quot;&gt; &lt;a href=&quot;https://lazyvim.github.io/installation&quot;&gt;Install&lt;/a&gt; · &lt;a href=&quot;https://lazyvim.github.io/configuration&quot;&gt;Configure&lt;/a&gt; · &lt;a href=&quot;https://lazyvim.github.io&quot;&gt;Docs&lt;/a&gt; &lt;/h4&gt; 
&lt;div align=&quot;center&quot;&gt;
 &lt;p&gt; &lt;a href=&quot;https://github.com/LazyVim/LazyVim/releases/latest&quot;&gt; &lt;img alt=&quot;Latest release&quot; src=&quot;https://img.shields.io/github/v/release/LazyVim/LazyVim?style=for-the-badge&amp;amp;logo=starship&amp;amp;color=C9CBFF&amp;amp;logoColor=D9E0EE&amp;amp;labelColor=302D41&amp;amp;include_prerelease&amp;amp;sort=semver&quot; /&gt; &lt;/a&gt; &lt;a href=&quot;https://github.com/LazyVim/LazyVim/pulse&quot;&gt; &lt;img alt=&quot;Last commit&quot; src=&quot;https://img.shields.io/github/last-commit/LazyVim/LazyVim?style=for-the-badge&amp;amp;logo=starship&amp;amp;color=8bd5ca&amp;amp;logoColor=D9E0EE&amp;amp;labelColor=302D41&quot; /&gt; &lt;/a&gt; &lt;a href=&quot;https://github.com/LazyVim/LazyVim/raw/main/LICENSE&quot;&gt; &lt;img alt=&quot;License&quot; src=&quot;https://img.shields.io/github/license/LazyVim/LazyVim?style=for-the-badge&amp;amp;logo=starship&amp;amp;color=ee999f&amp;amp;logoColor=D9E0EE&amp;amp;labelColor=302D41&quot; /&gt; &lt;/a&gt; &lt;a href=&quot;https://github.com/LazyVim/LazyVim/stargazers&quot;&gt; &lt;img alt=&quot;Stars&quot; src=&quot;https://img.shields.io/github/stars/LazyVim/LazyVim?style=for-the-badge&amp;amp;logo=starship&amp;amp;color=c69ff5&amp;amp;logoColor=D9E0EE&amp;amp;labelColor=302D41&quot; /&gt; &lt;/a&gt; &lt;a href=&quot;https://github.com/LazyVim/LazyVim/issues&quot;&gt; &lt;img alt=&quot;Issues&quot; src=&quot;https://img.shields.io/github/issues/LazyVim/LazyVim?style=for-the-badge&amp;amp;logo=bilibili&amp;amp;color=F5E0DC&amp;amp;logoColor=D9E0EE&amp;amp;labelColor=302D41&quot; /&gt; &lt;/a&gt; &lt;a href=&quot;https://github.com/LazyVim/LazyVim&quot;&gt; &lt;img alt=&quot;Repo Size&quot; src=&quot;https://img.shields.io/github/repo-size/LazyVim/LazyVim?color=%23DDB6F2&amp;amp;label=SIZE&amp;amp;logo=codesandbox&amp;amp;style=for-the-badge&amp;amp;logoColor=D9E0EE&amp;amp;labelColor=302D41&quot; /&gt; &lt;/a&gt; &lt;a href=&quot;https://twitter.com/intent/follow?screen_name=folke&quot;&gt; &lt;img alt=&quot;follow on Twitter&quot; src=&quot;https://img.shields.io/twitter/follow/folke?style=for-the-badge&amp;amp;logo=twitter&amp;amp;color=8aadf3&amp;amp;logoColor=D9E0EE&amp;amp;labelColor=302D41&quot; /&gt; &lt;/a&gt; &lt;/p&gt;
&lt;/div&gt; 
&lt;p&gt;LazyVim is a Neovim setup powered by &lt;a href=&quot;https://github.com/folke/lazy.nvim&quot;&gt;💤 lazy.nvim&lt;/a&gt; to make it easy to customize and extend your config. Rather than having to choose between starting from scratch or using a pre-made distro, LazyVim offers the best of both worlds - the flexibility to tweak your config as needed, along with the convenience of a pre-configured setup.&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/292349/211285846-0b7bb3bf-0462-4029-b64c-4ee1d037fc1c.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/292349/213447056-92290767-ea16-430c-8727-ce994c93e9cc.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt; 
&lt;h2&gt;✨ Features&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;🔥 Transform your Neovim into a full-fledged IDE&lt;/li&gt; 
 &lt;li&gt;💤 Easily customize and extend your config with &lt;a href=&quot;https://github.com/folke/lazy.nvim&quot;&gt;lazy.nvim&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;🚀 Blazingly fast&lt;/li&gt; 
 &lt;li&gt;🧹 Sane default settings for options, autocmds, and keymaps&lt;/li&gt; 
 &lt;li&gt;📦 Comes with a wealth of plugins pre-configured and ready to use&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;⚡️ Requirements&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;Neovim &amp;gt;= &lt;strong&gt;0.11.2&lt;/strong&gt; (needs to be built with &lt;strong&gt;LuaJIT&lt;/strong&gt;)&lt;/li&gt; 
 &lt;li&gt;Git &amp;gt;= &lt;strong&gt;2.19.0&lt;/strong&gt; (for partial clones support)&lt;/li&gt; 
 &lt;li&gt;a &lt;a href=&quot;https://www.nerdfonts.com/&quot;&gt;Nerd Font&lt;/a&gt; &lt;strong&gt;&lt;em&gt;(optional)&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;a &lt;strong&gt;C&lt;/strong&gt; compiler for &lt;code&gt;nvim-treesitter&lt;/code&gt;. See &lt;a href=&quot;https://github.com/nvim-treesitter/nvim-treesitter#requirements&quot;&gt;here&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;🚀 Getting Started&lt;/h2&gt; 
&lt;p&gt;You can find a starter template for &lt;strong&gt;LazyVim&lt;/strong&gt; &lt;a href=&quot;https://github.com/LazyVim/starter&quot;&gt;here&lt;/a&gt;&lt;/p&gt; 
&lt;details&gt;
 &lt;summary&gt;Try it with Docker&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;docker run -w /root -it --rm alpine:edge sh -uelic &#39;
  apk add git lazygit fzf curl neovim ripgrep alpine-sdk --update
  git clone https://github.com/LazyVim/starter ~/.config/nvim
  cd ~/.config/nvim
  nvim
&#39;
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;details&gt;
 &lt;summary&gt;Install the &lt;a href=&quot;https://github.com/LazyVim/starter&quot;&gt;LazyVim Starter&lt;/a&gt;&lt;/summary&gt; 
 &lt;ul&gt; 
  &lt;li&gt; &lt;p&gt;Make a backup of your current Neovim files:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;mv ~/.config/nvim ~/.config/nvim.bak
mv ~/.local/share/nvim ~/.local/share/nvim.bak
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;Clone the starter&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;git clone https://github.com/LazyVim/starter ~/.config/nvim
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;Remove the &lt;code&gt;.git&lt;/code&gt; folder, so you can add it to your own repo later&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;rm -rf ~/.config/nvim/.git
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;Start Neovim!&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;nvim
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Refer to the comments in the files on how to customize &lt;strong&gt;LazyVim&lt;/strong&gt;.&lt;/p&gt; &lt;/li&gt; 
 &lt;/ul&gt; 
&lt;/details&gt; 
&lt;hr /&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/dusty-phillips&quot;&gt;@dusty-phillips&lt;/a&gt; wrote a comprehensive book called &lt;a href=&quot;https://lazyvim-ambitious-devs.phillips.codes&quot;&gt;LazyVim for Ambitious Developers&lt;/a&gt; available for free online.&lt;/p&gt; 
&lt;h2&gt;📂 File Structure&lt;/h2&gt; 
&lt;p&gt;The files under config will be automatically loaded at the appropriate time, so you don&#39;t need to require those files manually. &lt;strong&gt;LazyVim&lt;/strong&gt; comes with a set of default config files that will be loaded &lt;strong&gt;&lt;em&gt;before&lt;/em&gt;&lt;/strong&gt; your own. See &lt;a href=&quot;https://github.com/LazyVim/LazyVim/tree/main/lua/lazyvim/config&quot;&gt;here&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;You can add your custom plugin specs under &lt;code&gt;lua/plugins/&lt;/code&gt;. All files there will be automatically loaded by &lt;a href=&quot;https://github.com/folke/lazy.nvim&quot;&gt;lazy.nvim&lt;/a&gt;&lt;/p&gt; 
&lt;pre&gt;
~/.config/nvim
├── lua
│&amp;nbsp;&amp;nbsp; ├── config
│&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; ├── autocmds.lua
│&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; ├── keymaps.lua
│&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; ├── lazy.lua
│&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; └── options.lua
│&amp;nbsp;&amp;nbsp; └── plugins
│&amp;nbsp;&amp;nbsp;     ├── spec1.lua
│&amp;nbsp;&amp;nbsp;     ├── **
│&amp;nbsp;&amp;nbsp;     └── spec2.lua
└── init.lua
&lt;/pre&gt; 
&lt;h2&gt;⚙️ Configuration&lt;/h2&gt; 
&lt;p&gt;Refer to the &lt;a href=&quot;https://lazyvim.github.io&quot;&gt;docs&lt;/a&gt;&lt;/p&gt;</description>
      
      <media:content url="https://repository-images.githubusercontent.com/583706111/7fc50ada-aecc-4ba7-99a9-18c3d31fcf6f" medium="image" />
      
    </item>
    
    <item>
      <title>windwp/nvim-ts-autotag</title>
      <link>https://github.com/windwp/nvim-ts-autotag</link>
      <description>&lt;p&gt;Use treesitter to auto close and auto rename html tag&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;nvim-ts-autotag&lt;/h1&gt; 
&lt;p&gt;Use treesitter to &lt;strong&gt;autoclose&lt;/strong&gt; and &lt;strong&gt;autorename&lt;/strong&gt; html tag&lt;/p&gt; 
&lt;p&gt;It works with:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;astro&lt;/li&gt; 
 &lt;li&gt;dot&lt;/li&gt; 
 &lt;li&gt;glimmer&lt;/li&gt; 
 &lt;li&gt;handlebars&lt;/li&gt; 
 &lt;li&gt;html&lt;/li&gt; 
 &lt;li&gt;javascript&lt;/li&gt; 
 &lt;li&gt;jsx&lt;/li&gt; 
 &lt;li&gt;liquid&lt;/li&gt; 
 &lt;li&gt;vento&lt;/li&gt; 
 &lt;li&gt;markdown&lt;/li&gt; 
 &lt;li&gt;php&lt;/li&gt; 
 &lt;li&gt;rescript&lt;/li&gt; 
 &lt;li&gt;svelte&lt;/li&gt; 
 &lt;li&gt;tsx&lt;/li&gt; 
 &lt;li&gt;twig&lt;/li&gt; 
 &lt;li&gt;typescript&lt;/li&gt; 
 &lt;li&gt;vue&lt;/li&gt; 
 &lt;li&gt;xml&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;and more&lt;/p&gt; 
&lt;h2&gt;Usage&lt;/h2&gt; 
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Before        Input         After
------------------------------------
&amp;lt;div           &amp;gt;              &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;    ciwspan&amp;lt;esc&amp;gt;   &amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;
------------------------------------
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Setup&lt;/h2&gt; 
&lt;p&gt;Requires &lt;code&gt;Nvim 0.9.5&lt;/code&gt; and up.&lt;/p&gt; 
&lt;p&gt;Note that &lt;code&gt;nvim-ts-autotag&lt;/code&gt; will not work unless you have treesitter parsers (like &lt;code&gt;html&lt;/code&gt;) installed for a given filetype. See &lt;a href=&quot;https://github.com/nvim-treesitter/nvim-treesitter&quot;&gt;nvim-treesitter&lt;/a&gt; for installing parsers.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&#39;nvim-ts-autotag&#39;).setup({
  opts = {
    -- Defaults
    enable_close = true, -- Auto close tags
    enable_rename = true, -- Auto rename pairs of tags
    enable_close_on_slash = false -- Auto close on trailing &amp;lt;/
  },
  -- Also override individual filetype configs, these take priority.
  -- Empty by default, useful if one of the &quot;opts&quot; global settings
  -- doesn&#39;t work well in a specific filetype
  per_filetype = {
    [&quot;html&quot;] = {
      enable_close = false
    }
  }
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-caution&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-stop mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .389.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25A.749.749 0 0 1 11 16H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.389.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Caution&lt;/p&gt;
 &lt;p&gt;If you are setting up via &lt;code&gt;nvim-treesitter.configs&lt;/code&gt; it has been deprecated! Please migrate to the new way. It will be removed in &lt;code&gt;1.0.0&lt;/code&gt;.&lt;/p&gt; 
&lt;/div&gt; 
&lt;h3&gt;A note on lazy loading&lt;/h3&gt; 
&lt;p&gt;For those of you using lazy loading through a plugin manager (like &lt;a href=&quot;https://github.com/folke/lazy.nvim&quot;&gt;lazy.nvim&lt;/a&gt;) lazy loading is not particularly necessary for this plugin. &lt;code&gt;nvim-ts-autotag&lt;/code&gt; is efficient in choosing when it needs to load. If you still insist on lazy loading &lt;code&gt;nvim-ts-autotag&lt;/code&gt;, then two good events to use are &lt;code&gt;BufReadPre&lt;/code&gt; &amp;amp; &lt;code&gt;BufNewFile&lt;/code&gt;.&lt;/p&gt; 
&lt;h3&gt;Extending the default config&lt;/h3&gt; 
&lt;p&gt;Let&#39;s say that there&#39;s a language that &lt;code&gt;nvim-ts-autotag&lt;/code&gt; doesn&#39;t currently support and you&#39;d like to support it in your config. While it would be the preference of the author that you upstream your changes, perhaps you would rather not 😢.&lt;/p&gt; 
&lt;p&gt;For example, if you have a language that has a very similar layout in its Treesitter Queries as &lt;code&gt;html&lt;/code&gt;, you could add an alias like so:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&#39;nvim-ts-autotag&#39;).setup({
  aliases = {
    [&quot;your language here&quot;] = &quot;html&quot;,
  }
})

-- or
local TagConfigs = require(&quot;nvim-ts-autotag.config.init&quot;)
TagConfigs:add_alias(&quot;your language here&quot;, &quot;html&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;That will make &lt;code&gt;nvim-ts-autotag&lt;/code&gt; close tags according to the rules of the &lt;code&gt;html&lt;/code&gt; config in the given language.&lt;/p&gt; 
&lt;p&gt;But what if a parser breaks for whatever reason, for example the upstream Treesitter tree changes its node names and now the default queries that &lt;code&gt;nvim-ts-autotag&lt;/code&gt; provides no longer work.&lt;/p&gt; 
&lt;p&gt;Fear not! You can directly extend and override the existing configs. For example, let&#39;s say the start and end tag patterns have changed for &lt;code&gt;xml&lt;/code&gt;. We can directly override the &lt;code&gt;xml&lt;/code&gt; config:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;local TagConfigs = require(&quot;nvim-ts-autotag.config.init&quot;)
TagConfigs:update(TagConfigs:get(&quot;xml&quot;):override(&quot;xml&quot;, {
    start_tag_pattern = { &quot;STag&quot; },
    end_tag_pattern = { &quot;ETag&quot; },
}))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;In fact, this very nearly what we do during our own internal initialization phase for &lt;code&gt;nvim-ts-autotag&lt;/code&gt;.&lt;/p&gt; 
&lt;h3&gt;Enable update on insert&lt;/h3&gt; 
&lt;p&gt;If you have that issue &lt;a href=&quot;https://github.com/windwp/nvim-ts-autotag/issues/19&quot;&gt;#19&lt;/a&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;vim.lsp.handlers[&#39;textDocument/publishDiagnostics&#39;] = vim.lsp.with(
    vim.lsp.diagnostic.on_publish_diagnostics,
    {
        underline = true,
        virtual_text = {
            spacing = 5,
            severity_limit = &#39;Warning&#39;,
        },
        update_in_insert = true,
    }
)
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Contributors&lt;/h2&gt; 
&lt;p&gt;Thank &lt;a href=&quot;https://github.com/PriceHiller&quot;&gt;@PriceHiller&lt;/a&gt; for his work on this plugin.&lt;/p&gt; 
&lt;h2&gt;Sponsor&lt;/h2&gt; 
&lt;p&gt;If you find this plugin useful, please consider sponsoring the project.&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://paypal.me/trieule1vn&quot;&gt;Sponsor&lt;/a&gt;&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/92002efc0e023ac487e31cdb8c7583d3ed7b06cf4798d1fab20287c223436e17/windwp/nvim-ts-autotag" medium="image" />
      
    </item>
    
    <item>
      <title>DataDog/kong-plugin-ddtrace</title>
      <link>https://github.com/DataDog/kong-plugin-ddtrace</link>
      <description>&lt;p&gt;Datadog APM Plugin for Kong Gateway&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;Kong Plugin for Datadog APM&lt;/h1&gt; 
&lt;p&gt;&lt;a href=&quot;https://codecov.io/github/DataDog/kong-plugin-ddtrace&quot;&gt;&lt;img src=&quot;https://codecov.io/github/DataDog/kong-plugin-ddtrace/graph/badge.svg?token=htSU1hFalA&quot; alt=&quot;codecov&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;The &lt;code&gt;kong-plugin-ddtrace&lt;/code&gt; is a Datadog APM plugin designed to integrate seamlessly with the Kong Gateway. This plugin enables detailed tracing of requests passing through Kong, providing insights into the performance and behavior of your APIs.&lt;/p&gt; 
&lt;h2&gt;Features&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Detailed Tracing&lt;/strong&gt;: Capture and report trace data to the Datadog Agent, allowing you to monitor and diagnose performance issues in real-time.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Real-Time Monitoring&lt;/strong&gt;: Integrate with Datadog to monitor API performance and diagnose issues in real-time.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Configurable&lt;/strong&gt;: Supports a wide range of configuration options to tailor tracing to your specific needs.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Compatibility&lt;/strong&gt;: Works with various Kong deployment environments, including Kubernetes.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Getting Started&lt;/h2&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-important&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-report mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Important&lt;/p&gt;
 &lt;p&gt;This plugin is compatible with Kong Gateway &lt;code&gt;v3.4&lt;/code&gt; LTS (&amp;gt;= &lt;code&gt;v3.4.3.5&lt;/code&gt;) or newer. For older version of Kong, please use &lt;a href=&quot;https://github.com/DataDog/kong-plugin-ddtrace/releases/tag/v0.2.2&quot;&gt;v0.2.2&lt;/a&gt; or older versions.&lt;/p&gt; 
&lt;/div&gt; 
&lt;h3&gt;Prerequisites&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;Kong Gateway installed and running.&lt;/li&gt; 
 &lt;li&gt;Datadog Agent installed and configured.&lt;/li&gt; 
 &lt;li&gt;API key for Datadog.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Installation&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;luarocks install kong-plugin-ddtrace
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Usage&lt;/h3&gt; 
&lt;p&gt;Kong Admin API:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Enabled globally
curl -i -X POST --url http://${KONG_ADMIN_HOST}:${KONG_ADMIN_PORT}/plugins/ --data &#39;name=ddtrace&#39;

# Enabled for specific service only
curl -i -X POST --url http://${KONG_ADMIN_HOST}:${KONG_ADMIN_PORT}/services/example-service/plugins/ --data &#39;name=ddtrace&#39;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Kong DB-less:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# Enable for a specific service
_format_version: &quot;3.0&quot;
_transform: true

services:
- name: example-service
  url: http://httpbin.org/headers
  plugins:
  - name: ddtrace
    config:
      service_name: example-service
      agent_host: datadog-agent
  routes:
  - name: my-route
    paths:
    - /
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Configuration&lt;/h3&gt; 
&lt;p&gt;This plugin supports a number of configuration options. These can be supplied when registering the plugin or by setting environment variables.&lt;/p&gt; 
&lt;p&gt;More details on the &lt;a href=&quot;https://raw.githubusercontent.com/DataDog/kong-plugin-ddtrace/main/doc/configuration.md&quot;&gt;Configuration page&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Support&lt;/h2&gt; 
&lt;p&gt;For support, please &lt;a href=&quot;https://raw.githubusercontent.com/DataDog/kong-plugin-ddtrace/main/issues&quot;&gt;open an issue on the GitHub repository&lt;/a&gt; or &lt;a href=&quot;https://help.datadoghq.com/hc/en-us/requests/new&quot;&gt;contact Datadog support&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Contributing&lt;/h2&gt; 
&lt;p&gt;Contributions are welcome! Please read &lt;a href=&quot;https://raw.githubusercontent.com/DataDog/kong-plugin-ddtrace/main/CONTRIBUTING.md&quot;&gt;the contributing guidelines&lt;/a&gt; and follow the best practices outlined in the project documentation.&lt;/p&gt; 
&lt;h2&gt;License&lt;/h2&gt; 
&lt;p&gt;This project is licensed under the Apache License 2.0. See the LICENSE file for details.&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/a61e4025f34c003e44e08bcd3556c852f04c63fcf71bc5d7cc703a5a5b5db7a8/DataDog/kong-plugin-ddtrace" medium="image" />
      
    </item>
    
    <item>
      <title>folke/noice.nvim</title>
      <link>https://github.com/folke/noice.nvim</link>
      <description>&lt;p&gt;💥 Highly experimental plugin that completely replaces the UI for messages, cmdline and the popupmenu.&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;💥 Noice &lt;em&gt;(Nice, Noise, Notice)&lt;/em&gt;&lt;/h1&gt; 
&lt;p&gt;Highly experimental plugin that completely replaces the UI for &lt;code&gt;messages&lt;/code&gt;, &lt;code&gt;cmdline&lt;/code&gt; and the &lt;code&gt;popupmenu&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/292349/193263220-791847b2-516c-4f23-9802-31dd6bec5f6a.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt; 
&lt;h2&gt;✨ Features&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;🌅 fully &lt;strong&gt;configurable views&lt;/strong&gt; like &lt;a href=&quot;https://github.com/rcarriga/nvim-notify&quot;&gt;nvim-notify&lt;/a&gt;, splits, popups, virtual text, ..&lt;/li&gt; 
 &lt;li&gt;🔍 use &lt;strong&gt;filters&lt;/strong&gt; to &lt;strong&gt;route messages&lt;/strong&gt; to different views&lt;/li&gt; 
 &lt;li&gt;🌈 message &lt;strong&gt;highlights&lt;/strong&gt; are preserved in the views (like the colors of &lt;code&gt;:hi&lt;/code&gt;)&lt;/li&gt; 
 &lt;li&gt;📝 command output like &lt;a href=&quot;https://neovim.io/doc/user/message.html#:messages&quot;&gt;:messages&lt;/a&gt; is shown in normal buffers, which makes it much easier to work with&lt;/li&gt; 
 &lt;li&gt;📚 &lt;code&gt;:Noice&lt;/code&gt; command to show a full message history&lt;/li&gt; 
 &lt;li&gt;⌨️ no more &lt;a href=&quot;https://neovim.io/doc/user/message.html#more-prompt&quot;&gt;:h more-prompt&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;💻 fully customizable &lt;strong&gt;cmdline&lt;/strong&gt; with icons&lt;/li&gt; 
 &lt;li&gt;💅 &lt;strong&gt;syntax highlighting&lt;/strong&gt; for &lt;code&gt;vim&lt;/code&gt; and &lt;code&gt;lua&lt;/code&gt; on the &lt;strong&gt;cmdline&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;🚥 &lt;strong&gt;statusline&lt;/strong&gt; components&lt;/li&gt; 
 &lt;li&gt;🔭 open message history in &lt;a href=&quot;https://github.com/nvim-telescope/telescope.nvim&quot;&gt;telescope.nvim&lt;/a&gt; or &lt;a href=&quot;https://github.com/ibhagwan/fzf-lua&quot;&gt;fzf-lua&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;🔥 Status&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Noice&lt;/strong&gt; is using the new experimental &lt;code&gt;vim.ui_attach&lt;/code&gt; API, so issues are to be expected. It is highly recommended to use Neovim nightly, since a bunch of issues have already been fixed upstream. Check this &lt;a href=&quot;https://github.com/folke/noice.nvim/issues/6&quot;&gt;tracking issue&lt;/a&gt; for a list of known issues.&lt;/p&gt; 
&lt;h2&gt;⚡️ Requirements&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;Neovim &amp;gt;= 0.9.0 &lt;strong&gt;&lt;em&gt;(nightly highly recommended)&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/MunifTanjim/nui.nvim&quot;&gt;nui.nvim&lt;/a&gt;: used for proper rendering and multiple views&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/rcarriga/nvim-notify&quot;&gt;nvim-notify&lt;/a&gt;: notification view &lt;em&gt;&lt;strong&gt;(optional)&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt; 
 &lt;li&gt;a &lt;a href=&quot;https://www.nerdfonts.com/&quot;&gt;Nerd Font&lt;/a&gt; &lt;strong&gt;&lt;em&gt;(optional)&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/nvim-treesitter/nvim-treesitter/&quot;&gt;nvim-treesitter&lt;/a&gt; &lt;strong&gt;&lt;em&gt;(optional, but highly recommended)&lt;/em&gt;&lt;/strong&gt; used for highlighting the cmdline and lsp docs. Make sure to install the parsers for &lt;code&gt;vim&lt;/code&gt;, &lt;code&gt;regex&lt;/code&gt;, &lt;code&gt;lua&lt;/code&gt;, &lt;code&gt;bash&lt;/code&gt;, &lt;code&gt;markdown&lt;/code&gt; and &lt;code&gt;markdown_inline&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;📦 Installation&lt;/h2&gt; 
&lt;p&gt;Install the plugin with your preferred package manager:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- lazy.nvim
{
  &quot;folke/noice.nvim&quot;,
  event = &quot;VeryLazy&quot;,
  opts = {
    -- add any options here
  },
  dependencies = {
    -- if you lazy-load any plugin below, make sure to add proper `module=&quot;...&quot;` entries
    &quot;MunifTanjim/nui.nvim&quot;,
    -- OPTIONAL:
    --   `nvim-notify` is only needed, if you want to use the notification view.
    --   If not available, we use `mini` as the fallback
    &quot;rcarriga/nvim-notify&quot;,
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Suggested setup:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&quot;noice&quot;).setup({
  lsp = {
    -- override markdown rendering so that **cmp** and other plugins use **Treesitter**
    override = {
      [&quot;vim.lsp.util.convert_input_to_markdown_lines&quot;] = true,
      [&quot;vim.lsp.util.stylize_markdown&quot;] = true,
      [&quot;cmp.entry.get_documentation&quot;] = true, -- requires hrsh7th/nvim-cmp
    },
  },
  -- you can enable a preset for easier configuration
  presets = {
    bottom_search = true, -- use a classic bottom cmdline for search
    command_palette = true, -- position the cmdline and popupmenu together
    long_message_to_split = true, -- long messages will be sent to a split
    inc_rename = false, -- enables an input dialog for inc-rename.nvim
    lsp_doc_border = false, -- add a border to hover docs and signature help
  },
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;It&#39;s a good idea to run &lt;code&gt;:checkhealth noice&lt;/code&gt; after installing to check for common issues.&lt;/p&gt; 
&lt;details&gt;
 &lt;summary&gt;vim-plug&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-vim&quot;&gt;&quot; vim-plug
call plug#begin()
  Plug &#39;folke/noice.nvim&#39;
  Plug &#39;MunifTanjim/nui.nvim&#39;
call plug#end()

lua require(&quot;noice&quot;).setup()

&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;h2&gt;⚙️ Configuration&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;noice.nvim&lt;/strong&gt; comes with the following defaults:&lt;/p&gt; 
&lt;p&gt;Check the &lt;a href=&quot;https://github.com/folke/noice.nvim/wiki/Configuration-Recipes&quot;&gt;wiki&lt;/a&gt; for configuration recipes.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;{
  cmdline = {
    enabled = true, -- enables the Noice cmdline UI
    view = &quot;cmdline_popup&quot;, -- view for rendering the cmdline. Change to `cmdline` to get a classic cmdline at the bottom
    opts = {}, -- global options for the cmdline. See section on views
    ---@type table&amp;lt;string, CmdlineFormat&amp;gt;
    format = {
      -- conceal: (default=true) This will hide the text in the cmdline that matches the pattern.
      -- view: (default is cmdline view)
      -- opts: any options passed to the view
      -- icon_hl_group: optional hl_group for the icon
      -- title: set to anything or empty string to hide
      cmdline = { pattern = &quot;^:&quot;, icon = &quot;&quot;, lang = &quot;vim&quot; },
      search_down = { kind = &quot;search&quot;, pattern = &quot;^/&quot;, icon = &quot; &quot;, lang = &quot;regex&quot; },
      search_up = { kind = &quot;search&quot;, pattern = &quot;^%?&quot;, icon = &quot; &quot;, lang = &quot;regex&quot; },
      filter = { pattern = &quot;^:%s*!&quot;, icon = &quot;$&quot;, lang = &quot;bash&quot; },
      lua = { pattern = { &quot;^:%s*lua%s+&quot;, &quot;^:%s*lua%s*=%s*&quot;, &quot;^:%s*=%s*&quot; }, icon = &quot;&quot;, lang = &quot;lua&quot; },
      help = { pattern = &quot;^:%s*he?l?p?%s+&quot;, icon = &quot;&quot; },
      input = { view = &quot;cmdline_input&quot;, icon = &quot;󰥻 &quot; }, -- Used by input()
      -- lua = false, -- to disable a format, set to `false`
    },
  },
  messages = {
    -- NOTE: If you enable messages, then the cmdline is enabled automatically.
    -- This is a current Neovim limitation.
    enabled = true, -- enables the Noice messages UI
    view = &quot;notify&quot;, -- default view for messages
    view_error = &quot;notify&quot;, -- view for errors
    view_warn = &quot;notify&quot;, -- view for warnings
    view_history = &quot;messages&quot;, -- view for :messages
    view_search = &quot;virtualtext&quot;, -- view for search count messages. Set to `false` to disable
  },
  popupmenu = {
    enabled = true, -- enables the Noice popupmenu UI
    ---@type &#39;nui&#39;|&#39;cmp&#39;
    backend = &quot;nui&quot;, -- backend to use to show regular cmdline completions
    ---@type NoicePopupmenuItemKind|false
    -- Icons for completion item kinds (see defaults at noice.config.icons.kinds)
    kind_icons = {}, -- set to `false` to disable icons
  },
  -- default options for require(&#39;noice&#39;).redirect
  -- see the section on Command Redirection
  ---@type NoiceRouteConfig
  redirect = {
    view = &quot;popup&quot;,
    filter = { event = &quot;msg_show&quot; },
  },
  -- You can add any custom commands below that will be available with `:Noice command`
  ---@type table&amp;lt;string, NoiceCommand&amp;gt;
  commands = {
    history = {
      -- options for the message history that you get with `:Noice`
      view = &quot;split&quot;,
      opts = { enter = true, format = &quot;details&quot; },
      filter = {
        any = {
          { event = &quot;notify&quot; },
          { error = true },
          { warning = true },
          { event = &quot;msg_show&quot;, kind = { &quot;&quot; } },
          { event = &quot;lsp&quot;, kind = &quot;message&quot; },
        },
      },
    },
    -- :Noice last
    last = {
      view = &quot;popup&quot;,
      opts = { enter = true, format = &quot;details&quot; },
      filter = {
        any = {
          { event = &quot;notify&quot; },
          { error = true },
          { warning = true },
          { event = &quot;msg_show&quot;, kind = { &quot;&quot; } },
          { event = &quot;lsp&quot;, kind = &quot;message&quot; },
        },
      },
      filter_opts = { count = 1 },
    },
    -- :Noice errors
    errors = {
      -- options for the message history that you get with `:Noice`
      view = &quot;popup&quot;,
      opts = { enter = true, format = &quot;details&quot; },
      filter = { error = true },
      filter_opts = { reverse = true },
    },
    all = {
      -- options for the message history that you get with `:Noice`
      view = &quot;split&quot;,
      opts = { enter = true, format = &quot;details&quot; },
      filter = {},
    },
  },
  notify = {
    -- Noice can be used as `vim.notify` so you can route any notification like other messages
    -- Notification messages have their level and other properties set.
    -- event is always &quot;notify&quot; and kind can be any log level as a string
    -- The default routes will forward notifications to nvim-notify
    -- Benefit of using Noice for this is the routing and consistent history view
    enabled = true,
    view = &quot;notify&quot;,
  },
  lsp = {
    progress = {
      enabled = true,
      -- Lsp Progress is formatted using the builtins for lsp_progress. See config.format.builtin
      -- See the section on formatting for more details on how to customize.
      --- @type NoiceFormat|string
      format = &quot;lsp_progress&quot;,
      --- @type NoiceFormat|string
      format_done = &quot;lsp_progress_done&quot;,
      throttle = 1000 / 30, -- frequency to update lsp progress message
      view = &quot;mini&quot;,
    },
    override = {
      -- override the default lsp markdown formatter with Noice
      [&quot;vim.lsp.util.convert_input_to_markdown_lines&quot;] = false,
      -- override the lsp markdown formatter with Noice
      [&quot;vim.lsp.util.stylize_markdown&quot;] = false,
      -- override cmp documentation with Noice (needs the other options to work)
      [&quot;cmp.entry.get_documentation&quot;] = false,
    },
    hover = {
      enabled = true,
      silent = false, -- set to true to not show a message if hover is not available
      view = nil, -- when nil, use defaults from documentation
      ---@type NoiceViewOptions
      opts = {}, -- merged with defaults from documentation
    },
    signature = {
      enabled = true,
      auto_open = {
        enabled = true,
        trigger = true, -- Automatically show signature help when typing a trigger character from the LSP
        luasnip = true, -- Will open signature help when jumping to Luasnip insert nodes
        throttle = 50, -- Debounce lsp signature help request by 50ms
      },
      view = nil, -- when nil, use defaults from documentation
      ---@type NoiceViewOptions
      opts = {}, -- merged with defaults from documentation
    },
    message = {
      -- Messages shown by lsp servers
      enabled = true,
      view = &quot;notify&quot;,
      opts = {},
    },
    -- defaults for hover and signature help
    documentation = {
      view = &quot;hover&quot;,
      ---@type NoiceViewOptions
      opts = {
        lang = &quot;markdown&quot;,
        replace = true,
        render = &quot;plain&quot;,
        format = { &quot;{message}&quot; },
        win_options = { concealcursor = &quot;n&quot;, conceallevel = 3 },
      },
    },
  },
  markdown = {
    hover = {
      [&quot;|(%S-)|&quot;] = vim.cmd.help, -- vim help links
      [&quot;%[.-%]%((%S-)%)&quot;] = require(&quot;noice.util&quot;).open, -- markdown links
    },
    highlights = {
      [&quot;|%S-|&quot;] = &quot;@text.reference&quot;,
      [&quot;@%S+&quot;] = &quot;@parameter&quot;,
      [&quot;^%s*(Parameters:)&quot;] = &quot;@text.title&quot;,
      [&quot;^%s*(Return:)&quot;] = &quot;@text.title&quot;,
      [&quot;^%s*(See also:)&quot;] = &quot;@text.title&quot;,
      [&quot;{%S-}&quot;] = &quot;@parameter&quot;,
    },
  },
  health = {
    checker = true, -- Disable if you don&#39;t want health checks to run
  },
  ---@type NoicePresets
  presets = {
    -- you can enable a preset by setting it to true, or a table that will override the preset config
    -- you can also add custom presets that you can enable/disable with enabled=true
    bottom_search = false, -- use a classic bottom cmdline for search
    command_palette = false, -- position the cmdline and popupmenu together
    long_message_to_split = false, -- long messages will be sent to a split
    inc_rename = false, -- enables an input dialog for inc-rename.nvim
    lsp_doc_border = false, -- add a border to hover docs and signature help
  },
  throttle = 1000 / 30, -- how frequently does Noice need to check for ui updates? This has no effect when in blocking mode.
  ---@type NoiceConfigViews
  views = {}, ---@see section on views
  ---@type NoiceRouteConfig[]
  routes = {}, --- @see section on routes
  ---@type table&amp;lt;string, NoiceFilter&amp;gt;
  status = {}, --- @see section on statusline components
  ---@type NoiceFormatOptions
  format = {}, --- @see section on formatting
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;details&gt; 
 &lt;summary&gt;If you don&#39;t want to use a Nerd Font, you can replace the icons with Unicode symbols.&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;  require(&quot;noice&quot;).setup({
    cmdline = {
      format = {
        cmdline = { icon = &quot;&amp;gt;&quot; },
        search_down = { icon = &quot;🔍⌄&quot; },
        search_up = { icon = &quot;🔍⌃&quot; },
        filter = { icon = &quot;$&quot; },
        lua = { icon = &quot;☾&quot; },
        help = { icon = &quot;?&quot; },
      },
    },
    format = {
      level = {
        icons = {
          error = &quot;✖&quot;,
          warn = &quot;▼&quot;,
          info = &quot;●&quot;,
        },
      },
    },
    popupmenu = {
      kind_icons = false,
    },
    inc_rename = {
      cmdline = {
        format = {
          IncRename = { icon = &quot;⟳&quot; },
        },
      },
    },
  })
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;h2&gt;🔍 Filters&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Noice&lt;/strong&gt; uses filters to route messages to specific views.&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Name&lt;/th&gt; 
   &lt;th&gt;Type&lt;/th&gt; 
   &lt;th&gt;Description&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;any&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;filter[]&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;checks that at least one of the filters matches&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;blocking&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;are we in blocking mode?&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;cleared&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;checks if the message is cleared, meaning it&#39;s in the history&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;cmdline&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;boolean&lt;/code&gt; or &lt;code&gt;string&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;checks if the message was generated by executing a cmdline. When &lt;code&gt;string&lt;/code&gt;, then it is used as a pattern&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;error&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;all error-like kinds from &lt;code&gt;ext_messages&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;event&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;string&lt;/code&gt; or &lt;code&gt;string[]&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;any of the events from &lt;code&gt;ext_messages&lt;/code&gt; or &lt;code&gt;cmdline&lt;/code&gt;. See &lt;a href=&quot;https://neovim.io/doc/user/ui.html#ui-messages&quot;&gt;:h ui-messages&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;find&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;uses lua &lt;code&gt;string.find&lt;/code&gt; to match the pattern&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;has&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;checks if the message is exists, meaning it&#39;s in the history&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;kind&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;string&lt;/code&gt; or &lt;code&gt;string[]&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;any of the kinds from &lt;code&gt;ext_messages&lt;/code&gt;. See &lt;a href=&quot;https://neovim.io/doc/user/ui.html#ui-messages&quot;&gt;:h ui-messages&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;max_height&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;maximum height of the message&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;max_length&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;maximum length of the message (total width of all the lines)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;max_width&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;maximum width of the message&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;min_height&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;minimum height of the message&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;min_length&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;minimum length of the message (total width of all the lines)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;min_width&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;minimum width of the message&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;mode&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;checks if &lt;code&gt;vim.api.nvim_get_mode()&lt;/code&gt; contains the given mode&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;not&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;filter&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;checks whether the filter matches or not&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;warning&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;all warning-like kinds from &lt;code&gt;ext_messages&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;details&gt; 
 &lt;summary&gt;Example:&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- all messages over 10 lines, excluding echo and search_count
local filter = {
  event = &quot;msg_show&quot;,
  min_height = 10,
  [&quot;not&quot;] = { kind = { &quot;search_count&quot;, &quot;echo&quot; } },
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;h2&gt;🌅 Views&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Noice&lt;/strong&gt; comes with the following built-in backends:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;popup&lt;/strong&gt;: powered by &lt;a href=&quot;https://github.com/MunifTanjim/nui.nvim&quot;&gt;nui.nvim&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;split&lt;/strong&gt;: powered by &lt;a href=&quot;https://github.com/MunifTanjim/nui.nvim&quot;&gt;nui.nvim&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;notify&lt;/strong&gt;: powered by &lt;a href=&quot;https://github.com/rcarriga/nvim-notify&quot;&gt;nvim-notify&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;virtualtext&lt;/strong&gt;: shows the message as virtualtext (for example for &lt;code&gt;search_count&lt;/code&gt;)&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;mini&lt;/strong&gt;: similar to &lt;a href=&quot;https://github.com/vigoux/notifier.nvim&quot;&gt;notifier.nvim&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://github.com/j-hui/fidget.nvim&quot;&gt;fidget.nvim&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;notify_send&lt;/strong&gt;: generate a desktop notification&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;A &lt;strong&gt;View&lt;/strong&gt; (&lt;code&gt;config.views&lt;/code&gt;) is a combination of a &lt;code&gt;backend&lt;/code&gt; and options. &lt;strong&gt;Noice&lt;/strong&gt; comes with the following built-in views with sane defaults:&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;View&lt;/th&gt; 
   &lt;th&gt;Backend&lt;/th&gt; 
   &lt;th&gt;Description&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;notify&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;notify&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;em&gt;nvim-notify&lt;/em&gt; with &lt;code&gt;level=nil&lt;/code&gt;, &lt;code&gt;replace=false&lt;/code&gt;, &lt;code&gt;merge=false&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;split&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;split&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;horizontal split&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;vsplit&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;split&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;vertical split&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;popup&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;popup&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;simple popup&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;mini&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;mini&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;minimal view, by default bottom right, right-aligned&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;cmdline&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;popup&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;bottom line, similar to the classic cmdline&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;cmdline_popup&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;popup&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;fancy cmdline popup, with different styles according to the cmdline mode&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;cmdline_output&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;split&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;split used by &lt;code&gt;config.presets.cmdline_output_to_split&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;messages&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;split&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;split used for &lt;code&gt;:messages&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;confirm&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;popup&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;popup used for &lt;code&gt;confirm&lt;/code&gt; events&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;hover&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;popup&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;popup used for lsp signature help and hover&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;popupmenu&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;nui.menu&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;special view with the options used to render the popupmenu when backend is &lt;strong&gt;nui&lt;/strong&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;Please refer to &lt;a href=&quot;https://github.com/folke/noice.nvim/raw/main/lua/noice/config/views.lua&quot;&gt;noice.config.views&lt;/a&gt; to see the options. Any options passed to existing views in &lt;code&gt;config.views&lt;/code&gt;, will override those options only. You can configure completely new views and use them in custom routes.&lt;/p&gt; 
&lt;details&gt; 
 &lt;summary&gt;Example:&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- override the default split view to always enter the split when it opens
require(&quot;noice&quot;).setup({
  views = {
    split = {
      enter = true,
    },
  },
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;All built-in Noice views have the filetype &lt;code&gt;noice&lt;/code&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h3&gt;Nui Options&lt;/h3&gt; 
&lt;p&gt;See the Nui documentation for &lt;a href=&quot;https://github.com/MunifTanjim/nui.nvim/tree/main/lua/nui/popup&quot;&gt;Popup&lt;/a&gt; and &lt;a href=&quot;https://github.com/MunifTanjim/nui.nvim/tree/main/lua/nui/split&quot;&gt;Split&lt;/a&gt;.&lt;/p&gt; 
&lt;table&gt; 
 &lt;tbody&gt;
  &lt;tr&gt;
   &lt;td&gt;Option&lt;/td&gt;
   &lt;td&gt;Description&lt;/td&gt;
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;b&gt;size, position&lt;/b&gt; &lt;/td&gt; 
   &lt;td&gt;Size, position and their constituents can additionally be specified as &lt;b&gt;&quot;auto&quot;&lt;/b&gt;, to use the message height and width.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;b&gt;win_options.winhighlight&lt;/b&gt;&lt;/td&gt; 
   &lt;td&gt; String or can also be a table like: &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;{
  win_options = {
    winhighlight = {
      Normal = &quot;NormalFloat&quot;,
      FloatBorder = &quot;FloatBorder&quot;
    },
  }
}
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt;
   &lt;td&gt; &lt;b&gt;scrollbar&lt;/b&gt; &lt;/td&gt; 
   &lt;td&gt;Set to &lt;code&gt;false&lt;/code&gt; to hide the scrollbar.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
  &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt; 
&lt;h3&gt;Notify Options&lt;/h3&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Option&lt;/th&gt; 
   &lt;th&gt;Type&lt;/th&gt; 
   &lt;th&gt;Default&lt;/th&gt; 
   &lt;th&gt;Description&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;title&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;&quot;Notification&quot;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;title to be used for the notification. Uses &lt;code&gt;Message.title&lt;/code&gt; if available.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;replace&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;when true, messages routing to the same notify instance will replace existing messages instead of pushing a new notification every time&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;merge&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Merge messages into one Notification or create separate notifications&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;level&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;number|string&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;nil&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;notification level. Uses &lt;code&gt;Message.level&lt;/code&gt; if available.&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h3&gt;Virtual Text Options&lt;/h3&gt; 
&lt;p&gt;Right now there&#39;s only an option to set the &lt;code&gt;hl_group&lt;/code&gt; used to render the virtual text.&lt;/p&gt; 
&lt;h2&gt;🎨 Formatting&lt;/h2&gt; 
&lt;p&gt;Formatting options can be specified with &lt;code&gt;config.format&lt;/code&gt;. For a list of the defaults, please refer to &lt;a href=&quot;https://github.com/folke/noice.nvim/raw/main/lua/noice/config/format.lua&quot;&gt;config.format&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Noice&lt;/strong&gt; includes the following formatters:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;level&lt;/strong&gt;: message level with optional &lt;code&gt;icon&lt;/code&gt; and &lt;code&gt;hl_group&lt;/code&gt; per level&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;text&lt;/strong&gt;: any text with optional &lt;code&gt;hl_group&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;title&lt;/strong&gt;: message title with optional &lt;code&gt;hl_group&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;event&lt;/strong&gt;: message event with optional &lt;code&gt;hl_group&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;kind&lt;/strong&gt;: message kind with optional &lt;code&gt;hl_group&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;date&lt;/strong&gt;: formatted date with optional date format string&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;message&lt;/strong&gt;: message content itself with optional &lt;code&gt;hl_group&lt;/code&gt; to override message highlights&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;confirm&lt;/strong&gt;: only useful for &lt;code&gt;confirm&lt;/code&gt; messages. Will format the choices as buttons.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;cmdline&lt;/strong&gt;: will render the cmdline in the message that generated the message.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;progress&lt;/strong&gt;: progress bar used by lsp progress&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;spinner&lt;/strong&gt;: spinners used by lsp progress&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;data&lt;/strong&gt;: render any custom data from &lt;code&gt;Message.opts&lt;/code&gt;. Useful in combination with the opts passed to &lt;code&gt;vim.notify&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Formatters are used in &lt;code&gt;format&lt;/code&gt; definitions. &lt;strong&gt;Noice&lt;/strong&gt; includes the following built-in formats:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;{
  -- default format
  default = { &quot;{level} &quot;, &quot;{title} &quot;, &quot;{message}&quot; },
  -- default format for vim.notify views
  notify = { &quot;{message}&quot; },
  -- default format for the history
  details = {
    &quot;{level} &quot;,
    &quot;{date} &quot;,
    &quot;{event}&quot;,
    { &quot;{kind}&quot;, before = { &quot;.&quot;, hl_group = &quot;NoiceFormatKind&quot; } },
    &quot; &quot;,
    &quot;{title} &quot;,
    &quot;{cmdline} &quot;,
    &quot;{message}&quot;,
  },
  telescope = ..., -- formatter used to display telescope results
  telescope_preview = ..., -- formatter used to preview telescope results
  fzf = ..., -- formatter used to display fzf results
  fzf_preview = ..., -- formatter used to preview fzf results
  lsp_progress = ..., -- formatter used by lsp progress
  lsp_progress_done = ..., -- formatter used by lsp progress
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Text before/after the formatter or in the before/after options, will only be rendered if the formatter itself rendered something.&lt;/p&gt; 
&lt;p&gt;The &lt;code&gt;format&lt;/code&gt; view option, can be either a &lt;code&gt;string&lt;/code&gt; (one of the built-in formats), or a table with a custom format definition.&lt;/p&gt; 
&lt;p&gt;To align text, you can use the &lt;code&gt;align&lt;/code&gt; option for a view. Can be &lt;code&gt;center&lt;/code&gt;, &lt;code&gt;left&lt;/code&gt; or &lt;code&gt;right&lt;/code&gt;.&lt;/p&gt; 
&lt;h2&gt;🚗 Routes&lt;/h2&gt; 
&lt;p&gt;A &lt;strong&gt;route&lt;/strong&gt; has a &lt;code&gt;filter&lt;/code&gt;, &lt;code&gt;view&lt;/code&gt; and optional &lt;code&gt;opts&lt;/code&gt; attribute.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;view&lt;/strong&gt;: one of the views (built-in or custom)&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;filter&lt;/strong&gt; a filter for messages matching this route&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;opts&lt;/strong&gt;: options for the view and the route&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Route options can be any of the view options above, or one of:&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Option&lt;/th&gt; 
   &lt;th&gt;Type&lt;/th&gt; 
   &lt;th&gt;Default&lt;/th&gt; 
   &lt;th&gt;Description&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;skip&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;messages matching this filter will be skipped and not shown in any views&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;stop&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;When &lt;code&gt;false&lt;/code&gt; and a route matches the filter, then other routes can still process the message too. Useful if you want certain messages to be shown in multiple views.&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;Please refer to &lt;a href=&quot;https://github.com/folke/noice.nvim/raw/main/lua/noice/config/routes.lua&quot;&gt;noice.config.routes&lt;/a&gt; for an overview of the default routes. &lt;strong&gt;Routes&lt;/strong&gt; passed to &lt;code&gt;setup()&lt;/code&gt; will be prepended to the default routes.&lt;/p&gt; 
&lt;details&gt; 
 &lt;summary&gt;Example&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- skip search_count messages instead of showing them as virtual text
require(&quot;noice&quot;).setup({
  routes = {
    {
      filter = { event = &quot;msg_show&quot;, kind = &quot;search_count&quot; },
      opts = { skip = true },
    },
  },
})

-- always route any messages with more than 20 lines to the split view
require(&quot;noice&quot;).setup({
  routes = {
    {
      view = &quot;split&quot;,
      filter = { event = &quot;msg_show&quot;, min_height = 20 },
    },
  },
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;h2&gt;🚥 Statusline Components&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Noice&lt;/strong&gt; comes with the following statusline components:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;ruler&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;message&lt;/strong&gt;: last line of the last message (&lt;code&gt;event=show_msg&lt;/code&gt;)&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;command&lt;/strong&gt;: &lt;code&gt;showcmd&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;mode&lt;/strong&gt;: &lt;code&gt;showmode&lt;/code&gt; (@recording messages)&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;search&lt;/strong&gt;: search count messages&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;See &lt;a href=&quot;https://github.com/folke/noice.nvim/raw/main/lua/noice/config/status.lua&quot;&gt;noice.config.status&lt;/a&gt; for the default config.&lt;/p&gt; 
&lt;p&gt;You can add custom statusline components in setup under the &lt;code&gt;status&lt;/code&gt; key.&lt;/p&gt; 
&lt;p&gt;Statusline components have the following methods:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;get&lt;/strong&gt;: gets the content of the message &lt;strong&gt;without&lt;/strong&gt; highlights&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;get_hl&lt;/strong&gt;: gets the content of the message &lt;strong&gt;with&lt;/strong&gt; highlights&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;has&lt;/strong&gt;: checks if the component is available&lt;/li&gt; 
&lt;/ul&gt; 
&lt;details&gt; 
 &lt;summary&gt;Example of configuring &lt;a href=&quot;https://github.com/nvim-lualine/lualine.nvim&quot;&gt;lualine.nvim&lt;/a&gt;&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&quot;lualine&quot;).setup({
  sections = {
    lualine_x = {
      {
        require(&quot;noice&quot;).api.status.message.get_hl,
        cond = require(&quot;noice&quot;).api.status.message.has,
      },
      {
        require(&quot;noice&quot;).api.status.command.get,
        cond = require(&quot;noice&quot;).api.status.command.has,
        color = { fg = &quot;#ff9e64&quot; },
      },
      {
        require(&quot;noice&quot;).api.status.mode.get,
        cond = require(&quot;noice&quot;).api.status.mode.has,
        color = { fg = &quot;#ff9e64&quot; },
      },
      {
        require(&quot;noice&quot;).api.status.search.get,
        cond = require(&quot;noice&quot;).api.status.search.has,
        color = { fg = &quot;#ff9e64&quot; },
      },
    },
  },
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;h2&gt;🔭 Pickers&lt;/h2&gt; 
&lt;p&gt;For convenience, you can do &lt;code&gt;:Noice pick&lt;/code&gt;, which will open a picker with all the messages in the history, either with &lt;code&gt;telescope&lt;/code&gt; or &lt;code&gt;fzf-lua&lt;/code&gt;.&lt;/p&gt; 
&lt;h2&gt;🔭 Telescope&lt;/h2&gt; 
&lt;p&gt;In order to use &lt;strong&gt;Noice&lt;/strong&gt; in &lt;strong&gt;Telescope&lt;/strong&gt;, you can either do &lt;code&gt;:Noice telescope&lt;/code&gt;, or register the extension and use &lt;code&gt;:Telescope noice&lt;/code&gt;. The results panel is formatted using &lt;code&gt;config.format.formatters.telescope&lt;/code&gt;. The preview is formatted with &lt;code&gt;config.format.formatters.telescope_preview&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&quot;telescope&quot;).load_extension(&quot;noice&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;🔭 Fzf Lua&lt;/h2&gt; 
&lt;p&gt;In order to use &lt;strong&gt;Noice&lt;/strong&gt; in &lt;strong&gt;FzfLua&lt;/strong&gt;, you can do &lt;code&gt;:Noice fzf&lt;/code&gt;. The results panel is formatted using &lt;code&gt;config.format.formatters.fzf&lt;/code&gt;. The preview is formatted with &lt;code&gt;config.format.formatters.telescope_fzf&lt;/code&gt;&lt;/p&gt; 
&lt;h2&gt;🚀 Usage&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;:Noice&lt;/code&gt; or &lt;code&gt;:Noice history&lt;/code&gt; shows the message history&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:Noice last&lt;/code&gt; shows the last message in a popup&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:Noice dismiss&lt;/code&gt; dismiss all visible messages&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:Noice errors&lt;/code&gt; shows the error messages in a split. Last errors on top&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:Noice disable&lt;/code&gt; disables &lt;strong&gt;Noice&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:Noice enable&lt;/code&gt; enables &lt;strong&gt;Noice&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:Noice stats&lt;/code&gt; shows debugging stats&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;:Noice telescope&lt;/code&gt; opens message history in Telescope&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Alternatively, all commands also exist as a full name like &lt;code&gt;:NoiceLast&lt;/code&gt;, &lt;code&gt;:NoiceDisable&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;You can also use &lt;code&gt;Lua&lt;/code&gt; equivalents.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;vim.keymap.set(&quot;n&quot;, &quot;&amp;lt;leader&amp;gt;nl&quot;, function()
  require(&quot;noice&quot;).cmd(&quot;last&quot;)
end)

vim.keymap.set(&quot;n&quot;, &quot;&amp;lt;leader&amp;gt;nh&quot;, function()
  require(&quot;noice&quot;).cmd(&quot;history&quot;)
end)
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;You can add custom commands with &lt;code&gt;config.commands&lt;/code&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h3&gt;↪️ Command Redirection&lt;/h3&gt; 
&lt;p&gt;Sometimes it&#39;s useful to redirect the messages generated by a command or function to a different view. That can be easily achieved with command redirection.&lt;/p&gt; 
&lt;p&gt;The redirect API can taken an optional &lt;code&gt;routes&lt;/code&gt; parameter, which defaults to &lt;code&gt;{config.redirect}&lt;/code&gt;.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- redirect &quot;:hi&quot;
require(&quot;noice&quot;).redirect(&quot;hi&quot;)

-- redirect some function
require(&quot;noice&quot;).redirect(function()
  print(&quot;test&quot;)
end)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Adding the following keymap, will redirect the active cmdline when pressing &lt;code&gt;&amp;lt;S-Enter&amp;gt;&lt;/code&gt;. The cmdline stays open, so you can change the command and execute it again. When exiting the cmdline, the popup window will be focused.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;vim.keymap.set(&quot;c&quot;, &quot;&amp;lt;S-Enter&amp;gt;&quot;, function()
  require(&quot;noice&quot;).redirect(vim.fn.getcmdline())
end, { desc = &quot;Redirect Cmdline&quot; })
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Lsp Hover Doc Scrolling&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;vim.keymap.set({ &quot;n&quot;, &quot;i&quot;, &quot;s&quot; }, &quot;&amp;lt;c-f&amp;gt;&quot;, function()
  if not require(&quot;noice.lsp&quot;).scroll(4) then
    return &quot;&amp;lt;c-f&amp;gt;&quot;
  end
end, { silent = true, expr = true })

vim.keymap.set({ &quot;n&quot;, &quot;i&quot;, &quot;s&quot; }, &quot;&amp;lt;c-b&amp;gt;&quot;, function()
  if not require(&quot;noice.lsp&quot;).scroll(-4) then
    return &quot;&amp;lt;c-b&amp;gt;&quot;
  end
end, { silent = true, expr = true })
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;🌈 Highlight Groups&lt;/h2&gt; 
&lt;details&gt; 
 &lt;summary&gt;Click to see all highlight groups&lt;/summary&gt; 
 &lt;!-- hl_start --&gt; 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th&gt;Highlight Group&lt;/th&gt; 
    &lt;th&gt;Default Group&lt;/th&gt; 
    &lt;th&gt;Description&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCmdline&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;MsgArea&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;Normal for the classic cmdline area at the bottom&quot;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCmdlineIcon&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;DiagnosticSignInfo&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;Cmdline icon&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCmdlineIconCalculator&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCmdlineIcon&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCmdlineIconCmdline&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCmdlineIcon&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCmdlineIconFilter&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCmdlineIcon&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCmdlineIconHelp&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCmdlineIcon&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCmdlineIconIncRename&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCmdlineIcon&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCmdlineIconInput&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCmdlineIcon&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCmdlineIconLua&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCmdlineIcon&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCmdlineIconSearch&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;DiagnosticSignWarn&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;Cmdline search icon (&lt;code&gt;/&lt;/code&gt; and &lt;code&gt;?&lt;/code&gt;)&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCmdlinePopup&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;Normal&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;Normal for the cmdline popup&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCmdlinePopupBorder&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;DiagnosticSignInfo&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;Cmdline popup border&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCmdlinePopupBorderCalculator&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCmdlinePopupBorder&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCmdlinePopupBorderCmdline&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCmdlinePopupBorder&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCmdlinePopupBorderFilter&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCmdlinePopupBorder&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCmdlinePopupBorderHelp&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCmdlinePopupBorder&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCmdlinePopupBorderIncRename&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCmdlinePopupBorder&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCmdlinePopupBorderInput&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCmdlinePopupBorder&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCmdlinePopupBorderLua&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCmdlinePopupBorder&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCmdlinePopupBorderSearch&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;DiagnosticSignWarn&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;Cmdline popup border for search&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCmdlinePopupTitle&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;DiagnosticSignInfo&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;Cmdline popup border&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCmdlinePrompt&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;Title&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;prompt for input()&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCompletionItemKindClass&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCompletionItemKindDefault&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCompletionItemKindColor&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCompletionItemKindDefault&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCompletionItemKindConstant&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCompletionItemKindDefault&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCompletionItemKindConstructor&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCompletionItemKindDefault&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCompletionItemKindDefault&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;Special&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCompletionItemKindEnum&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCompletionItemKindDefault&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCompletionItemKindEnumMember&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCompletionItemKindDefault&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCompletionItemKindField&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCompletionItemKindDefault&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCompletionItemKindFile&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCompletionItemKindDefault&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCompletionItemKindFolder&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCompletionItemKindDefault&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCompletionItemKindFunction&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCompletionItemKindDefault&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCompletionItemKindInterface&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCompletionItemKindDefault&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCompletionItemKindKeyword&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCompletionItemKindDefault&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCompletionItemKindMethod&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCompletionItemKindDefault&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCompletionItemKindModule&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCompletionItemKindDefault&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCompletionItemKindProperty&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCompletionItemKindDefault&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCompletionItemKindSnippet&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCompletionItemKindDefault&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCompletionItemKindStruct&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCompletionItemKindDefault&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCompletionItemKindText&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCompletionItemKindDefault&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCompletionItemKindUnit&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCompletionItemKindDefault&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCompletionItemKindValue&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCompletionItemKindDefault&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCompletionItemKindVariable&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NoiceCompletionItemKindDefault&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCompletionItemMenu&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;none&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;Normal for the popupmenu&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCompletionItemWord&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;none&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;Normal for the popupmenu&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceConfirm&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;Normal&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;Normal for the confirm view&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceConfirmBorder&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;DiagnosticSignInfo&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;Border for the confirm view&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceCursor&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;Cursor&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;Fake Cursor&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceFormatConfirm&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;CursorLine&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceFormatConfirmDefault&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;Visual&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceFormatDate&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;Special&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceFormatEvent&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NonText&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceFormatKind&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NonText&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceFormatLevelDebug&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NonText&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceFormatLevelError&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;DiagnosticVirtualTextError&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceFormatLevelInfo&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;DiagnosticVirtualTextInfo&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceFormatLevelOff&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NonText&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceFormatLevelTrace&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NonText&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceFormatLevelWarn&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;DiagnosticVirtualTextWarn&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceFormatProgressDone&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;Search&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;Progress bar done&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceFormatProgressTodo&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;CursorLine&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;progress bar todo&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceFormatTitle&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;Title&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceLspProgressClient&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;Title&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;Lsp progress client name&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceLspProgressSpinner&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;Constant&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;Lsp progress spinner&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceLspProgressTitle&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NonText&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;Lsp progress title&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceMini&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;MsgArea&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;Normal for mini view&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoicePopup&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NormalFloat&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;Normal for popup views&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoicePopupBorder&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;FloatBorder&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;Border for popup views&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoicePopupmenu&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;Pmenu&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;Normal for the popupmenu&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoicePopupmenuBorder&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;FloatBorder&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;Popupmenu border&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoicePopupmenuMatch&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;Special&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;Part of the item that matches the input&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoicePopupmenuSelected&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;PmenuSel&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;Selected item in the popupmenu&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceScrollbar&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;PmenuSbar&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;Normal for scrollbar&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceScrollbarThumb&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;PmenuThumb&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;Scrollbar thumb&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceSplit&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;NormalFloat&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;Normal for split views&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceSplitBorder&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;FloatBorder&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;Border for split views&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;NoiceVirtualText&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;em&gt;DiagnosticVirtualTextInfo&lt;/em&gt;&lt;/td&gt; 
    &lt;td&gt;Default hl group for virtualtext views&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
 &lt;!-- hl_end --&gt; 
&lt;/details&gt;</description>
      
      <media:content url="https://repository-images.githubusercontent.com/539654526/ebd55d97-4c53-4522-b10c-44d544e0e894" medium="image" />
      
    </item>
    
    <item>
      <title>catppuccin/nvim</title>
      <link>https://github.com/catppuccin/nvim</link>
      <description>&lt;p&gt;🍨 Soothing pastel theme for Neovim&lt;/p&gt;&lt;hr&gt;&lt;h3 align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/catppuccin/catppuccin/main/assets/logos/exports/1544x1544_circle.png&quot; width=&quot;100&quot; alt=&quot;Logo&quot; /&gt;&lt;br /&gt; &lt;img src=&quot;https://raw.githubusercontent.com/catppuccin/catppuccin/main/assets/misc/transparent.png&quot; height=&quot;30&quot; width=&quot;0px&quot; /&gt; Catppuccin for &lt;a href=&quot;https://github.com/neovim/neovim&quot;&gt;Neovim&lt;/a&gt; &lt;img src=&quot;https://raw.githubusercontent.com/catppuccin/catppuccin/main/assets/misc/transparent.png&quot; height=&quot;30&quot; width=&quot;0px&quot; /&gt; &lt;/h3&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://github.com/catppuccin/nvim/stargazers&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/catppuccin/nvim?colorA=363a4f&amp;amp;colorB=b7bdf8&amp;amp;style=for-the-badge&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/catppuccin/nvim/issues&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/issues/catppuccin/nvim?colorA=363a4f&amp;amp;colorB=f5a97f&amp;amp;style=for-the-badge&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/catppuccin/nvim/contributors&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/contributors/catppuccin/nvim?colorA=363a4f&amp;amp;colorB=a6da95&amp;amp;style=for-the-badge&quot; /&gt;&lt;/a&gt; &lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://user-images.githubusercontent.com/56817415/213472445-091e54fb-091f-4448-a631-fa6b2ba7d8a5.png&quot; /&gt; &lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; This port of &lt;a href=&quot;https://github.com/catppuccin/&quot;&gt;Catppuccin&lt;/a&gt; is special because it was the first one and the one that originated the project itself. Given this, it&#39;s important to acknowledge that it all didn&#39;t come to be what it is now out of nowhere. So, if you are interested in knowing more about the initial stages of the theme, you can find it under the &lt;a href=&quot;https://github.com/catppuccin/nvim/tree/v0.1&quot;&gt;v0.1&lt;/a&gt; tag. &lt;/p&gt; 
&lt;h2&gt;Previews&lt;/h2&gt; 
&lt;details&gt; 
 &lt;summary&gt;🌻 Latte&lt;/summary&gt; 
 &lt;img src=&quot;https://user-images.githubusercontent.com/56817415/213473391-603bdc68-68f4-4877-a15a-b469040928b5.png&quot; /&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;🪴 Frappé&lt;/summary&gt; 
 &lt;img src=&quot;https://user-images.githubusercontent.com/56817415/213473368-16931b70-fd84-4a89-a698-1b1bca1f82de.png&quot; /&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;🌺 Macchiato&lt;/summary&gt; 
 &lt;img src=&quot;https://user-images.githubusercontent.com/56817415/213473285-7bd858be-6947-4d9e-8c01-2573cbc7e76c.png&quot; /&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;🌿 Mocha&lt;/summary&gt; 
 &lt;img src=&quot;https://user-images.githubusercontent.com/56817415/213471997-34837219-88cc-4db2-baca-e25813a89789.png&quot; /&gt; 
&lt;/details&gt; 
&lt;!-- panvimdoc-ignore-end --&gt; 
&lt;h2&gt;Features&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;Supports &lt;a href=&quot;https://github.com/neovim/neovim/&quot;&gt;Neovim&lt;/a&gt; &amp;gt;= 0.8&lt;/li&gt; 
 &lt;li&gt;Highly configurable with 4 different flavours and &lt;a href=&quot;https://github.com/catppuccin/nvim/discussions/323&quot;&gt;the ability to create your own!&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/catppuccin/nvim#Compile&quot;&gt;Compiled&lt;/a&gt; configuration for &lt;a href=&quot;https://www.reddit.com/r/neovim/comments/xxfpt3/catppuccinnvim_now_startup_in_1ms/&quot;&gt;fast startup time&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;Integrations with lsp, treesitter and &lt;a href=&quot;https://github.com/catppuccin/nvim#integrations&quot;&gt;a bunch of plugins&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;Support for &lt;a href=&quot;https://github.com/catppuccin/catppuccin&quot;&gt;many other applications&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Installation&lt;/h2&gt; 
&lt;p&gt;with Neovim 0.12&#39;s &lt;code&gt;vim.pack&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;vim.pack.add { { src = &quot;https://github.com/catppuccin/nvim&quot;, name = &quot;catppuccin&quot; } }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/folke/lazy.nvim&quot;&gt;lazy.nvim&lt;/a&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;{ &quot;catppuccin/nvim&quot;, name = &quot;catppuccin&quot;, priority = 1000 }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/wbthomason/packer.nvim&quot;&gt;packer.nvim&lt;/a&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;use { &quot;catppuccin/nvim&quot;, as = &quot;catppuccin&quot; }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/nvim-neorocks/rocks.nvim&quot;&gt;rocks.nvim&lt;/a&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-vim&quot;&gt;:Rocks install catppuccin.nvim
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Vim support&lt;/h3&gt; 
&lt;p&gt;Support for Vim is provided through the &lt;code&gt;vim&lt;/code&gt; branch.&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/junegunn/vim-plug&quot;&gt;vim-plug&lt;/a&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-vim&quot;&gt;Plug &#39;catppuccin/nvim&#39;, { &#39;branch&#39;: &#39;vim&#39;, &#39;as&#39;: &#39;catppuccin&#39; }
&lt;/code&gt;&lt;/pre&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-note&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-info mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Note&lt;/p&gt;
 &lt;p&gt;Keep in mind that Vim support has been dropped (&lt;a href=&quot;https://github.com/catppuccin/nvim/pull/949&quot;&gt;#949&lt;/a&gt;) and this branch won&#39;t receive further updates unless necessary. For full Vim support, see &lt;a href=&quot;https://github.com/catppuccin/vim&quot;&gt;catppuccin/vim&lt;/a&gt;. Starting from Vim v9.2.0219 and Neovim 0.12, &lt;code&gt;catppuccin&lt;/code&gt; is shipped with the editors. Note that it is not maintained by the Catppuccin organization and follows &lt;a href=&quot;https://github.com/vim/colorschemes?tab=readme-ov-file#providing-better-tooling-and-documentation-to-authors&quot;&gt;Vim colorscheme rules&lt;/a&gt; instead of &lt;a href=&quot;https://github.com/catppuccin/catppuccin/raw/main/docs/style-guide.md&quot;&gt;the official Catppuccin style guide&lt;/a&gt;.&lt;/p&gt; 
&lt;/div&gt; 
&lt;h2&gt;Usage&lt;/h2&gt; 
&lt;pre&gt;&lt;code class=&quot;language-vim&quot;&gt;colorscheme catppuccin-nvim &quot; catppuccin-latte, catppuccin-frappe, catppuccin-macchiato, catppuccin-mocha
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;vim.cmd.colorscheme &quot;catppuccin-nvim&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Configuration&lt;/h2&gt; 
&lt;p&gt;There is no need to call &lt;code&gt;setup&lt;/code&gt; if you don&#39;t want to change the default options and settings.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&quot;catppuccin&quot;).setup({
    flavour = &quot;auto&quot;, -- latte, frappe, macchiato, mocha
    background = { -- :h background
        light = &quot;latte&quot;,
        dark = &quot;mocha&quot;,
    },
    transparent_background = false, -- disables setting the background color.
    float = {
        transparent = false, -- enable transparent floating windows
        solid = false, -- use solid styling for floating windows, see |winborder|
    },
    term_colors = false, -- sets terminal colors (e.g. `g:terminal_color_0`)
    dim_inactive = {
        enabled = false, -- dims the background color of inactive window
        shade = &quot;dark&quot;,
        percentage = 0.15, -- percentage of the shade to apply to the inactive window
    },
    no_italic = false, -- Force no italic
    no_bold = false, -- Force no bold
    no_underline = false, -- Force no underline
    styles = { -- Handles the styles of general hi groups (see `:h highlight-args`):
        comments = { &quot;italic&quot; }, -- Change the style of comments
        conditionals = { &quot;italic&quot; },
        loops = {},
        functions = {},
        keywords = {},
        strings = {},
        variables = {},
        numbers = {},
        booleans = {},
        properties = {},
        types = {},
        operators = {},
        -- miscs = {}, -- Uncomment to turn off hard-coded styles
    },
    lsp_styles = { -- Handles the style of specific lsp hl groups (see `:h lsp-highlight`).
        virtual_text = {
            errors = { &quot;italic&quot; },
            hints = { &quot;italic&quot; },
            warnings = { &quot;italic&quot; },
            information = { &quot;italic&quot; },
            ok = { &quot;italic&quot; },
        },
        underlines = {
            errors = { &quot;underline&quot; },
            hints = { &quot;underline&quot; },
            warnings = { &quot;underline&quot; },
            information = { &quot;underline&quot; },
            ok = { &quot;underline&quot; },
        },
        inlay_hints = {
            background = true,
        },
    },
    color_overrides = {},
    custom_highlights = {},
    default_integrations = true,
    auto_integrations = false,
    integrations = {
        cmp = true,
        gitsigns = true,
        nvimtree = true,
        notify = false,
        mini = {
            enabled = true,
            indentscope_color = &quot;&quot;,
        },
        -- For more plugins integrations please scroll down (https://github.com/catppuccin/nvim#integrations)
    },
})

-- setup must be called before loading
vim.cmd.colorscheme &quot;catppuccin-nvim&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Customization&lt;/h2&gt; 
&lt;h3&gt;Getting colors&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;local latte = require(&quot;catppuccin.palettes&quot;).get_palette &quot;latte&quot;
local frappe = require(&quot;catppuccin.palettes&quot;).get_palette &quot;frappe&quot;
local macchiato = require(&quot;catppuccin.palettes&quot;).get_palette &quot;macchiato&quot;
local mocha = require(&quot;catppuccin.palettes&quot;).get_palette &quot;mocha&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Returns a table where the key is the name of the color and the value is the hex code.&lt;/p&gt; 
&lt;h3&gt;Overwriting colors&lt;/h3&gt; 
&lt;p&gt;Colors can be overwritten using &lt;code&gt;color_overrides&lt;/code&gt;, see &lt;a href=&quot;https://github.com/catppuccin/nvim/discussions/323&quot;&gt;https://github.com/catppuccin/nvim/discussions/323&lt;/a&gt; for inspiration:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&quot;catppuccin&quot;).setup {
    color_overrides = {
        all = {
            text = &quot;#ffffff&quot;,
        },
        latte = {
            base = &quot;#ff0000&quot;,
            mantle = &quot;#242424&quot;,
            crust = &quot;#474747&quot;,
        },
        frappe = {},
        macchiato = {},
        mocha = {},
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Overwriting highlight groups&lt;/h3&gt; 
&lt;p&gt;Global highlight groups can be overwritten, for example:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&quot;catppuccin&quot;).setup {
    custom_highlights = function(colors)
        return {
            Comment = { fg = colors.flamingo },
            TabLineSel = { bg = colors.pink },
            CmpBorder = { fg = colors.surface2 },
            Pmenu = { bg = colors.none },
        }
    end
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Highlight groups per flavour can also be overwritten, for example:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&quot;catppuccin&quot;).setup {
    highlight_overrides = {
        all = function(colors)
            return {
                NvimTreeNormal = { fg = colors.none },
                CmpBorder = { fg = &quot;#3e4145&quot; },
            }
        end,
        latte = function(latte)
            return {
                Normal = { fg = latte.base },
            }
        end,
        frappe = function(frappe)
            return {
                [&quot;@comment&quot;] = { fg = frappe.surface2, style = { &quot;italic&quot; } },
            }
        end,
        macchiato = function(macchiato)
            return {
                LineNr = { fg = macchiato.overlay1 },
            }
        end,
        mocha = function(mocha)
            return {
                Comment = { fg = mocha.flamingo },
            }
        end,
    },
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Integrations&lt;/h2&gt; 
&lt;p&gt;Catppuccin provides theme support for other plugins in the Neovim ecosystem and extended Neovim functionality through &lt;em&gt;integrations&lt;/em&gt;.&lt;/p&gt; 
&lt;p&gt;To enable/disable an integration you just need to set it to true/false, for example:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&quot;catppuccin&quot;).setup({
    integrations = {
        cmp = true,
        gitsigns = true,
        nvimtree = true,
        notify = false,
        mini = {
            enabled = true,
            indentscope_color = &quot;&quot;,
        },
    }
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Some integrations are enabled by default, you can control this behaviour with &lt;code&gt;default_integrations&lt;/code&gt; option.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&quot;catppuccin&quot;).setup({
    default_integrations = false,
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;If you use &lt;a href=&quot;https://github.com/folke/lazy.nvim&quot;&gt;lazy.nvim&lt;/a&gt; as your package manager, you can use the &lt;code&gt;auto_integrations&lt;/code&gt; option to let catppuccin automatically detect installed plugins and enable their respective integrations.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&quot;catppuccin&quot;).setup({
    auto_integrations = true,
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Below is a list of supported plugins and their corresponding integration module.&lt;/p&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-important&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-report mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Important&lt;/p&gt;
 &lt;p&gt;If you&#39;d like to see the full list of highlight groups modified by Catppuccin, see the &lt;a href=&quot;https://github.com/catppuccin/nvim/tree/main/lua/catppuccin/groups/integrations&quot;&gt;&lt;code&gt;lua/catppuccin/groups/integrations/&lt;/code&gt;&lt;/a&gt; directory.&lt;/p&gt; 
&lt;/div&gt; 
&lt;table&gt; 
 &lt;!-- panvimdoc-ignore-start --&gt; 
 &lt;tbody&gt;
  &lt;tr&gt; 
   &lt;td&gt; &lt;b&gt;Plugin&lt;/b&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;b&gt;Default&lt;/b&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- panvimdoc-ignore-end --&gt; 
  &lt;!-- aerial.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/stevearc/aerial.nvim&quot;&gt;aerial.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;aerial = false
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- aerial.nvim --&gt; 
  &lt;!-- alpha.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/goolord/alpha-nvim&quot;&gt;alpha-nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;alpha = true
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- alpha.nvim --&gt; 
  &lt;!-- artio.nvim --&gt;  
  &lt;tr &lt;tr&gt; 
   &lt;td&gt; &lt;a href=&quot;https://github.com/comfysage/artio.nvim&quot;&gt;artio.nvim&lt;/a&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;artio = true
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- artio.nvim --&gt; 
  &lt;!-- barbar.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/romgrk/barbar.nvim&quot;&gt;barbar.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;barbar = false
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- barbar.nvim --&gt; 
  &lt;!-- barbecue.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/utilyre/barbecue.nvim&quot;&gt;barbecue.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;barbecue = {
    dim_dirname = true, -- directory name is dimmed by default
    bold_basename = true,
    dim_context = false,
    alt_background = false,
},
&lt;/code&gt;&lt;/pre&gt; 
    &lt;details&gt; 
     &lt;summary&gt;Special&lt;/summary&gt; 
     &lt;p&gt;Use this to set it up:&lt;/p&gt; 
     &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&quot;barbecue&quot;).setup {
  theme = &quot;catppuccin-nvim&quot;, -- catppuccin-latte, catppuccin-frappe, catppuccin-macchiato, catppuccin-mocha
}
&lt;/code&gt;&lt;/pre&gt; 
    &lt;/details&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- barbecue.nvim --&gt; 
  &lt;!-- beacon.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/DanilaMihailov/beacon.nvim&quot;&gt;beacon.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;beacon = false
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- beacon.nvim --&gt; 
  &lt;!-- blink.cmp --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/Saghen/blink.cmp&quot;&gt;blink.cmp&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;blink_cmp = {
    style = &#39;bordered&#39;,
}
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- blink.cmp --&gt; 
  &lt;!-- blink.indent --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/saghen/blink.indent&quot;&gt;blink.indent&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;blink_indent = true
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- blink.indent --&gt; 
  &lt;!-- blink.pairs --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/saghen/blink.pairs&quot;&gt;blink.pairs&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;blink_pairs = true
&lt;/code&gt;&lt;/pre&gt; 
    &lt;details&gt; 
     &lt;summary&gt;Special&lt;/summary&gt; 
     &lt;p&gt;Use this to set it up:&lt;/p&gt; 
     &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&quot;blink.pairs&quot;).setup {
    highlights = {
        groups = {
            &quot;BlinkPairsRed&quot;,
            &quot;BlinkPairsYellow&quot;,
            &quot;BlinkPairsBlue&quot;,
            &quot;BlinkPairsOrange&quot;,
            &quot;BlinkPairsGreen&quot;,
            &quot;BlinkPairsPurple&quot;,
            &quot;BlinkPairsCyan&quot;,
        },
    },
}
&lt;/code&gt;&lt;/pre&gt; 
    &lt;/details&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- blink.pairs --&gt; 
  &lt;!-- bufferline.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/akinsho/bufferline.nvim&quot;&gt;bufferline.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; 
    &lt;details&gt; 
     &lt;summary&gt;Special&lt;/summary&gt; 
     &lt;p&gt;Update your bufferline config to use the Catppuccin components:&lt;/p&gt; 
     &lt;div class=&quot;markdown-alert markdown-alert-note&quot;&gt;
      &lt;p class=&quot;markdown-alert-title&quot;&gt;
       &lt;svg class=&quot;octicon octicon-info mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
        &lt;path d=&quot;M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&quot;&gt;&lt;/path&gt;
       &lt;/svg&gt;Note&lt;/p&gt;
      &lt;p&gt;bufferline needs to be loaded after setting up Catppuccin or it will highlight incorrectly&lt;/p&gt; 
     &lt;/div&gt; 
     &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;use &quot;akinsho/bufferline.nvim&quot; {
  after = &quot;catppuccin&quot;,
  config = function()
    require(&quot;bufferline&quot;).setup {
      highlights = require(&quot;catppuccin.special.bufferline&quot;).get_theme()
    }
  end
}
&lt;/code&gt;&lt;/pre&gt; 
     &lt;p&gt;Configurations are self-explanatory, see &lt;code&gt;:h bufferline-highlights&lt;/code&gt; for detailed explanations:&lt;/p&gt; 
     &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;local mocha = require(&quot;catppuccin.palettes&quot;).get_palette &quot;mocha&quot;
bufferline.setup {
    highlights = require(&quot;catppuccin.special.bufferline&quot;).get_theme {
        styles = { &quot;italic&quot;, &quot;bold&quot; },
        custom = {
            all = {
                fill = { bg = &quot;#000000&quot; },
            },
            mocha = {
                background = { fg = mocha.text },
            },
            latte = {
                background = { fg = &quot;#000000&quot; },
            },
        },
    },
}
&lt;/code&gt;&lt;/pre&gt; 
    &lt;/details&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- bufferline.nvim --&gt; 
  &lt;!-- buffon.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/francescarpi/buffon.nvim&quot;&gt;buffon.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;buffon = false
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- buffon.nvim --&gt; 
  &lt;!-- coc.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/neoclide/coc.nvim&quot;&gt;coc.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;coc_nvim = false
&lt;/code&gt;&lt;/pre&gt; 
    &lt;details&gt; 
     &lt;summary&gt;Special&lt;/summary&gt; 
     &lt;p&gt;Setting &lt;code&gt;enabled&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; enables this integration.&lt;/p&gt; 
     &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;coc_nvim = true,
&lt;/code&gt;&lt;/pre&gt; 
     &lt;div class=&quot;markdown-alert markdown-alert-note&quot;&gt;
      &lt;p class=&quot;markdown-alert-title&quot;&gt;
       &lt;svg class=&quot;octicon octicon-info mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
        &lt;path d=&quot;M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&quot;&gt;&lt;/path&gt;
       &lt;/svg&gt;Note&lt;/p&gt;
      &lt;p&gt;coc.nvim by default link to native lsp highlight groups so &lt;code&gt;lsp_styles&lt;/code&gt; options will also apply to coc&lt;/p&gt; 
     &lt;/div&gt; 
     &lt;p&gt;In the nested tables you can set the style for the diagnostics, both &lt;code&gt;virtual_text&lt;/code&gt; (what you see on the side) and &lt;code&gt;underlines&lt;/code&gt; (what points directly at the thing (e.g. an error)).&lt;/p&gt; 
     &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;lsp_styles = {
    virtual_text = {
        errors = { &quot;italic&quot; },
        hints = { &quot;italic&quot; },
        warnings = { &quot;italic&quot; },
        information = { &quot;italic&quot; },
        ok = { &quot;italic&quot; },
    },
    underlines = {
        errors = { &quot;underline&quot; },
        hints = { &quot;underline&quot; },
        warnings = { &quot;underline&quot; },
        information = { &quot;underline&quot; },
        ok = { &quot;underline&quot; },
    },
    inlay_hints = {
        background = true,
    },
},
&lt;/code&gt;&lt;/pre&gt; 
    &lt;/details&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- coc.nvim --&gt; 
  &lt;!-- colorful-winsep.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/nvim-zh/colorful-winsep.nvim&quot;&gt;colorful-winsep.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;colorful_winsep = {
    enabled = false,
    color = &quot;red&quot;,
}
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- colorful_winsep.nvim --&gt; 
  &lt;!-- dashboard-nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/glepnir/dashboard-nvim&quot;&gt;dashboard-nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;dashboard = true
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- dashboard-nvim --&gt; 
  &lt;!-- diffview.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/sindrets/diffview.nvim&quot;&gt;diffview.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;diffview = false
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- diffview.nvim --&gt; 
  &lt;!-- dropbar.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/Bekaboo/dropbar.nvim&quot;&gt;dropbar.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;dropbar = {
    enabled = false,
    color_mode = false, -- enable color for kind&#39;s texts, not just kind&#39;s icons
},
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- dropbar.nvim --&gt; 
  &lt;!-- feline.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/freddiehaddad/feline.nvim/&quot;&gt;feline.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt;  
    &lt;details&gt; 
     &lt;summary&gt;Special&lt;/summary&gt; 
     &lt;p&gt;Update your Feline config to use the Catppuccin components:&lt;/p&gt; 
     &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;local ctp_feline = require(&#39;catppuccin.special.feline&#39;)

ctp_feline.setup()

require(&quot;feline&quot;).setup({
    components = ctp_feline.get_statusline(),
})
&lt;/code&gt;&lt;/pre&gt; 
     &lt;p&gt;Notice that calling &lt;code&gt;setup()&lt;/code&gt; is optional. You may pass a lua table in order to change assets, settings and the colors per vim mode.&lt;/p&gt; 
     &lt;p&gt;Here are the defaults:&lt;/p&gt; 
     &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;local clrs = require(&quot;catppuccin.palettes&quot;).get_palette()
local ctp_feline = require(&#39;catppuccin.special.feline&#39;)
local U = require &quot;catppuccin.utils.colors&quot;

ctp_feline.setup({
    assets = {
        left_separator = &quot;&quot;,
        right_separator = &quot;&quot;,
        mode_icon = &quot;&quot;,
        dir = &quot;󰉖&quot;,
        file = &quot;󰈙&quot;,
        lsp = {
            server = &quot;󰅡&quot;,
            error = &quot;&quot;,
            warning = &quot;&quot;,
            info = &quot;&quot;,
            hint = &quot;&quot;,
        },
        git = {
            branch = &quot;&quot;,
            added = &quot;&quot;,
            changed = &quot;&quot;,
            removed = &quot;&quot;,
        },
    },
    sett = {
        text = U.vary_color({ latte = latte.base }, clrs.surface0),
        bkg = U.vary_color({ latte = latte.crust }, clrs.surface0),
        diffs = clrs.mauve,
        extras = clrs.overlay1,
        curr_file = clrs.maroon,
        curr_dir = clrs.flamingo,
        show_modified = false, -- show if the file has been modified
        show_lazy_updates = false -- show the count of updatable plugins from lazy.nvim
                                  -- need to set checker.enabled = true in lazy.nvim first
                                  -- the icon is set in ui.icons.plugin in lazy.nvim
    },
    mode_colors = {
        [&quot;n&quot;] = { &quot;NORMAL&quot;, clrs.lavender },
        [&quot;no&quot;] = { &quot;N-PENDING&quot;, clrs.lavender },
        [&quot;i&quot;] = { &quot;INSERT&quot;, clrs.green },
        [&quot;ic&quot;] = { &quot;INSERT&quot;, clrs.green },
        [&quot;t&quot;] = { &quot;TERMINAL&quot;, clrs.green },
        [&quot;v&quot;] = { &quot;VISUAL&quot;, clrs.flamingo },
        [&quot;V&quot;] = { &quot;V-LINE&quot;, clrs.flamingo },
        [&quot;&quot;] = { &quot;V-BLOCK&quot;, clrs.flamingo },
        [&quot;R&quot;] = { &quot;REPLACE&quot;, clrs.maroon },
        [&quot;Rv&quot;] = { &quot;V-REPLACE&quot;, clrs.maroon },
        [&quot;s&quot;] = { &quot;SELECT&quot;, clrs.maroon },
        [&quot;S&quot;] = { &quot;S-LINE&quot;, clrs.maroon },
        [&quot;&quot;] = { &quot;S-BLOCK&quot;, clrs.maroon },
        [&quot;c&quot;] = { &quot;COMMAND&quot;, clrs.peach },
        [&quot;cv&quot;] = { &quot;COMMAND&quot;, clrs.peach },
        [&quot;ce&quot;] = { &quot;COMMAND&quot;, clrs.peach },
        [&quot;r&quot;] = { &quot;PROMPT&quot;, clrs.teal },
        [&quot;rm&quot;] = { &quot;MORE&quot;, clrs.teal },
        [&quot;r?&quot;] = { &quot;CONFIRM&quot;, clrs.mauve },
        [&quot;!&quot;] = { &quot;SHELL&quot;, clrs.green },
    },
    view = {
        lsp = {
            progress = true, -- if true the status bar will display an lsp progress indicator
            name = false, -- if true the status bar will display the lsp servers name, otherwise it will display the text &quot;Lsp&quot;
            exclude_lsp_names = {}, -- lsp server names that should not be displayed when name is set to true
            separator = &quot;|&quot;, -- the separator used when there are multiple lsp servers
        },
    }
})
&lt;/code&gt;&lt;/pre&gt; 
     &lt;div class=&quot;markdown-alert markdown-alert-warning&quot;&gt;
      &lt;p class=&quot;markdown-alert-title&quot;&gt;
       &lt;svg class=&quot;octicon octicon-alert mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
        &lt;path d=&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z&quot;&gt;&lt;/path&gt;
       &lt;/svg&gt;Warning&lt;/p&gt;
      &lt;p&gt;Currently feline &lt;a href=&quot;https://github.com/feline-nvim/feline.nvim/issues/302&quot;&gt;doesn&#39;t officially support custom themes&lt;/a&gt;. In order for &lt;code&gt;:colorscheme catppuccin-&amp;lt;flavour&amp;gt;&lt;/code&gt; to work you could add this autocmd as a workaround:&lt;/p&gt; 
     &lt;/div&gt; 
     &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;vim.api.nvim_create_autocmd(&quot;ColorScheme&quot;, {
    pattern = &quot;*&quot;,
    callback = function()
        package.loaded[&quot;feline&quot;] = nil
        package.loaded[&quot;catppuccin.special.feline&quot;] = nil
        require(&quot;feline&quot;).setup {
            components = require(&quot;catppuccin.special.feline&quot;).get_statusline(),
        }
    end,
})
&lt;/code&gt;&lt;/pre&gt; 
    &lt;/details&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- feline.nvim --&gt; 
  &lt;!-- fern.vim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/lambdalisue/fern.vim&quot;&gt;fern.vim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;fern = false
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- fern.vim --&gt; 
  &lt;!-- fidget.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/j-hui/fidget.nvim&quot;&gt;fidget.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;fidget = false
&lt;/code&gt;&lt;/pre&gt; 
    &lt;details&gt; 
     &lt;summary&gt;Special&lt;/summary&gt; Set `notification.window.winblend` to `0`: 
     &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&quot;fidget&quot;).setup {
    notification = {
        window = {
            winblend = 0,
        },
    }
    -- ... the rest of your fidget config
}
&lt;/code&gt;&lt;/pre&gt; 
    &lt;/details&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- fidget.nvim --&gt; 
  &lt;!-- flash.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/folke/flash.nvim&quot;&gt;flash.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;flash = true
&lt;/code&gt;&lt;/pre&gt; 
    &lt;!-- flash.nvim --&gt; 
    &lt;!-- fzf-lua --&gt; &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/ibhagwan/fzf-lua&quot;&gt;fzf-lua&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;fzf = true
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- fzf-lua --&gt; 
  &lt;!-- gitgraph.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/isakbm/gitgraph.nvim&quot;&gt;gitgraph.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;gitgraph = false
&lt;/code&gt;&lt;/pre&gt; 
    &lt;!-- gitgraph.nvim --&gt; 
    &lt;!-- gitsigns.nvim --&gt; &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/lewis6991/gitsigns.nvim&quot;&gt;gitsigns.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;gitsigns = true
&lt;/code&gt;&lt;/pre&gt; 
    &lt;details&gt; 
     &lt;summary&gt;Special&lt;/summary&gt; 
     &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;gitsigns = {
  enabled = true,
  -- align with the transparent_background option by default
  transparent = false,
}
&lt;/code&gt;&lt;/pre&gt; 
    &lt;/details&gt; 
    &lt;!-- gitsigns.nvim --&gt; 
    &lt;!-- grug-far.nvim --&gt; &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/MagicDuck/grug-far.nvim&quot;&gt;grug-far.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;grug_far = false
&lt;/code&gt;&lt;/pre&gt; 
    &lt;!-- grug-far.nvim --&gt; 
    &lt;!-- harpoon --&gt; &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/ThePrimeagen/harpoon&quot;&gt;harpoon&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;harpoon = false
&lt;/code&gt;&lt;/pre&gt; 
    &lt;!-- harpoon --&gt; 
    &lt;!-- headlines.nvim --&gt; &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/lukas-reineke/headlines.nvim&quot;&gt;headlines.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;headlines = false
&lt;/code&gt;&lt;/pre&gt; 
    &lt;!-- headlines.nvim --&gt; 
    &lt;!-- hop.nvim --&gt; &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/phaazon/hop.nvim&quot;&gt;hop.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;hop = false
&lt;/code&gt;&lt;/pre&gt; 
    &lt;!-- hop.nvim --&gt; 
    &lt;!-- indent-blankline.nvim --&gt; &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/lukas-reineke/indent-blankline.nvim&quot;&gt;indent-blankline.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;indent_blankline = {
    enabled = true,
    scope_color = &quot;&quot;, -- catppuccin color (eg. `lavender`) Default: text
    colored_indent_levels = false,
},

&lt;/code&gt;&lt;/pre&gt; 
    &lt;details&gt; 
     &lt;summary&gt;Special&lt;/summary&gt; 
     &lt;p&gt;&lt;code&gt;colored_indent_levels&lt;/code&gt; enables char highlights per indent level. Follow the instructions &lt;a href=&quot;https://github.com/lukas-reineke/indent-blankline.nvim#multiple-indent-colors&quot;&gt;here&lt;/a&gt; to set the latter up.&lt;/p&gt; 
    &lt;/details&gt; 
    &lt;!-- indent-blankline.nvim --&gt; 
    &lt;!-- leap.nvim --&gt; &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/ggandor/leap.nvim&quot;&gt;leap.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;leap = false
&lt;/code&gt;&lt;/pre&gt; 
    &lt;!-- leap.nvim --&gt; 
    &lt;!-- lightline.vim --&gt; &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/itchyny/lightline.vim&quot;&gt;lightline.vim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; 
    &lt;details&gt; 
     &lt;summary&gt;Special&lt;/summary&gt; 
     &lt;pre&gt;&lt;code class=&quot;language-vim&quot;&gt;let g:lightline = {&#39;colorscheme&#39;: &#39;catppuccin&#39;}
&lt;/code&gt;&lt;/pre&gt; 
    &lt;/details&gt; 
    &lt;!-- lightline.vim --&gt; 
    &lt;!-- lightspeed.nvim --&gt; &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/ggandor/lightspeed.nvim&quot;&gt;lightspeed.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;lightspeed = false
&lt;/code&gt;&lt;/pre&gt; 
    &lt;!-- lightspeed.nvim --&gt; 
    &lt;!-- lir.nvim --&gt; &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/tamago324/lir.nvim&quot;&gt;lir.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;lir = {
    enabled = false,
    git_status = false
}
&lt;/code&gt;&lt;/pre&gt; 
    &lt;!-- lir.nvim --&gt; 
    &lt;!-- lspsaga.nvim --&gt; &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/glepnir/lspsaga.nvim&quot;&gt;lspsaga.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;lsp_saga = false
&lt;/code&gt;&lt;/pre&gt; 
    &lt;details&gt; 
     &lt;summary&gt;Special&lt;/summary&gt; 
     &lt;p&gt;For custom Lsp Kind Icon and Color&lt;/p&gt; 
     &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&quot;lspsaga&quot;).setup {
    ui = {
        kind = require(&quot;catppuccin.groups.integrations.lsp_saga&quot;).custom_kind(),
    },
}
&lt;/code&gt;&lt;/pre&gt; 
    &lt;/details&gt; &lt;/td&gt;
  &lt;/tr&gt; 
  &lt;!-- lspsaga.nvim --&gt; 
  &lt;!-- lualine.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/nvim-lualine/lualine.nvim&quot;&gt;lualine.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- transparent_bg = opts.transparent_background and &quot;NONE&quot; or C.mantle
lualine = {
    normal = {
        a = { bg = C.blue, fg = C.mantle, gui = &quot;bold&quot; },
        b = { bg = C.surface0, fg = C.blue },
        c = { bg = transparent_bg, fg = C.text },
    },

    insert = {
        a = { bg = C.green, fg = C.base, gui = &quot;bold&quot; },
        b = { bg = C.surface0, fg = C.green },
    },

    terminal = {
        a = { bg = C.green, fg = C.base, gui = &quot;bold&quot; },
        b = { bg = C.surface0, fg = C.green },
    },

    command = {
        a = { bg = C.peach, fg = C.base, gui = &quot;bold&quot; },
        b = { bg = C.surface0, fg = C.peach },
    },
    visual = {
        a = { bg = C.mauve, fg = C.base, gui = &quot;bold&quot; },
        b = { bg = C.surface0, fg = C.mauve },
    },
    replace = {
        a = { bg = C.red, fg = C.base, gui = &quot;bold&quot; },
        b = { bg = C.surface0, fg = C.red },
    },
    inactive = {
        a = { bg = transparent_bg, fg = C.blue },
        b = { bg = transparent_bg, fg = C.surface1, gui = &quot;bold&quot; },
        c = { bg = transparent_bg, fg = C.overlay0 },
    },
},
&lt;/code&gt;&lt;/pre&gt; 
    &lt;details&gt; 
     &lt;summary&gt;Special&lt;/summary&gt; 
     &lt;p&gt;To implement color overrides in the &lt;code&gt;integrations.lualine&lt;/code&gt; spec:&lt;/p&gt; 
     &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- In your catppuccin config (integrations):
lualine = {
    -- lualine color overrides in the following hierarchy: Catppuccin Flavor -&amp;gt; Mode -&amp;gt; Lualine Section
    -- The Catppuccin flavor entry can be any Catpuccin flavor or &quot;all&quot; to apply to all flavors
    -- The flavor entry can be either a table or a function which consumes the current Catppuccin palette, just like custom_highlights and color_overrides
    all = function(colors)
        ---@type CtpIntegrationLualineOverride
        return {
            -- Specifying a normal-mode status line override for section a&#39;s background and b&#39;s foreground to use lavender like the main Catppuccin theme
            normal = {
                a = { bg = colors.lavender, gui = &quot;italic&quot; },
                b = { fg = colors.lavender },
            }
        }
    end,
    -- A macchiato-specific override, which takes priority over &#39;all&#39;. Also using the direct table syntax instead of function in case you do not rely on dynamic palette colors
    macchiato = {
        normal = {
            a = { bg = &quot;#abcdef&quot; },
        }
    },
},
--  And in your lualine config:
require(&#39;lualine&#39;).setup {
    options = {
        -- lualine will integrate with catppuccin by name or automatically via `vim.g.colors_name` by setting this to &quot;auto&quot;
        theme = &quot;catppuccin-nvim&quot;
        -- ... the rest of your lualine config
    }
}
&lt;/code&gt;&lt;/pre&gt; 
    &lt;/details&gt; 
    &lt;!-- lualine.nvim --&gt; 
    &lt;!-- markview.nvim --&gt; &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/OXY2DEV/markview.nvim&quot;&gt;markview.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;markview = false
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- markview.nvim --&gt; 
  &lt;!-- mason.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/williamboman/mason.nvim&quot;&gt;mason.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;mason = false
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- mason.nvim --&gt; 
  &lt;!-- mini.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/echasnovski/mini.nvim&quot;&gt;mini.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;mini = {
    enabled = true,
    indentscope_color = &quot;&quot;, -- catppuccin color (eg. `lavender`) Default: text
},
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- mini.nvim --&gt; 
  &lt;!-- neo-tree.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/nvim-neo-tree/neo-tree.nvim&quot;&gt;neo-tree.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;neotree = true
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- neo-tree.nvim --&gt; 
  &lt;!-- neogit --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/NeogitOrg/neogit&quot;&gt;neogit&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;neogit = true
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- neogit --&gt; 
  &lt;!-- neotest --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/nvim-neotest/neotest&quot;&gt;neotest&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;neotest = false
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- neotest --&gt; 
  &lt;!-- noice.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/folke/noice.nvim&quot;&gt;noice.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;noice = false
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- noice.nvim --&gt; 
  &lt;!-- notifier.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/vigoux/notifier.nvim&quot;&gt;notifier.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;notifier = false
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- notifier.nvim --&gt; 
  &lt;!-- nvim-cmp --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/hrsh7th/nvim-cmp&quot;&gt;nvim-cmp&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;cmp = true
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- nvim-cmp --&gt; 
  &lt;!-- nvim-copilot-vim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/github/copilot.vim&quot;&gt;copilot.vim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;copilot_vim = false,
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- nvim-copilot-vim --&gt; 
  &lt;!-- nvim-dap --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/mfussenegger/nvim-dap&quot;&gt;nvim-dap&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;dap = true
&lt;/code&gt;&lt;/pre&gt; 
    &lt;details&gt; 
     &lt;summary&gt;Special &lt;/summary&gt; 
     &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;local sign = vim.fn.sign_define

sign(&quot;DapBreakpoint&quot;, { text = &quot;●&quot;, texthl = &quot;DapBreakpoint&quot;, linehl = &quot;&quot;, numhl = &quot;&quot;})
sign(&quot;DapBreakpointCondition&quot;, { text = &quot;●&quot;, texthl = &quot;DapBreakpointCondition&quot;, linehl = &quot;&quot;, numhl = &quot;&quot;})
sign(&quot;DapLogPoint&quot;, { text = &quot;◆&quot;, texthl = &quot;DapLogPoint&quot;, linehl = &quot;&quot;, numhl = &quot;&quot;})
&lt;/code&gt;&lt;/pre&gt; 
    &lt;/details&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- nvim-dap --&gt; 
  &lt;!-- nvim-dap-ui --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/rcarriga/nvim-dap-ui&quot;&gt;nvim-dap-ui&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;dap_ui = true
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- nvim-dap-ui --&gt; 
  &lt;!-- navic --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/SmiteshP/nvim-navic&quot;&gt;navic&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;navic = {
    enabled = false,
    custom_bg = &quot;NONE&quot;, -- &quot;lualine&quot; will set background to mantle
},

&lt;/code&gt;&lt;/pre&gt; 
    &lt;details&gt; 
     &lt;summary&gt;Special&lt;/summary&gt; 
     &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- You NEED to enable highlight in nvim-navic setting or it won&#39;t work
require(&quot;nvim-navic&quot;).setup {
    highlight = true
}
&lt;/code&gt;&lt;/pre&gt; 
    &lt;/details&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- navic --&gt; 
  &lt;!-- nvim-notify --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/rcarriga/nvim-notify&quot;&gt;nvim-notify&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;notify = false
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- nvim-notify --&gt; 
  &lt;!-- nvim-surround --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/kylechui/nvim-surround&quot;&gt;nvim-surround&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;nvim_surround = false
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- nvim-surround --&gt; 
  &lt;!-- nvim-tree.lua --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/kyazdani42/nvim-tree.lua&quot;&gt;nvim-tree.lua&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;nvimtree = true
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- nvim-tree.lua --&gt; 
  &lt;!-- nvim-treesitter-context --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/nvim-treesitter/nvim-treesitter-context&quot;&gt;nvim-treesitter-context&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;treesitter_context = true
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- nvim-treesitter-context --&gt; 
  &lt;!-- nvim-ts-rainbow2 --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/HiPhish/nvim-ts-rainbow2&quot;&gt;nvim-ts-rainbow2&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;ts_rainbow2 = false
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- nvim-ts-rainbow2 --&gt; 
  &lt;!-- nvim-ts-rainbow --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/p00f/nvim-ts-rainbow&quot;&gt;nvim-ts-rainbow&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;ts_rainbow = false
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- nvim-ts-rainbow --&gt; 
  &lt;!-- nvim-ufo --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/kevinhwang91/nvim-ufo&quot;&gt;nvim-ufo&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;ufo = true
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- nvim-ufo --&gt; 
  &lt;!-- nvim-window-picker --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/s1n7ax/nvim-window-picker&quot;&gt;nvim-window-picker&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;window_picker = false
&lt;/code&gt;&lt;/pre&gt; 
    &lt;!-- nvim-window-picker --&gt; 
    &lt;!-- octo.nvim --&gt; &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/pwntester/octo.nvim&quot;&gt;octo.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;octo = false
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- octo.nvim --&gt; 
  &lt;!-- overseer.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/stevearc/overseer.nvim&quot;&gt;overseer.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;overseer = false
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- overseer.nvim --&gt; 
  &lt;!-- pounce.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/rlane/pounce.nvim&quot;&gt;pounce.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;pounce = false
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- pounce.nvim --&gt; 
  &lt;!-- rainbow-delimiters.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/HiPhish/rainbow-delimiters.nvim&quot;&gt;rainbow-delimiters.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;rainbow_delimiters = true
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- rainbow-delimiters.nvim --&gt; 
  &lt;!-- reactive.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/rasulomaroff/reactive.nvim&quot;&gt;reactive.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; 
    &lt;details&gt; 
     &lt;summary&gt;Special&lt;/summary&gt; 
     &lt;p&gt;There&#39;re 2 available presets (&lt;code&gt;cursor&lt;/code&gt; and &lt;code&gt;cursorline&lt;/code&gt;) for every flavour.&lt;/p&gt; 
     &lt;p&gt;Here is how you can use them.&lt;/p&gt; 
     &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&#39;reactive&#39;).setup {
  load = { &#39;catppuccin-mocha-cursor&#39;, &#39;catppuccin-mocha-cursorline&#39; }
}
&lt;/code&gt;&lt;/pre&gt; 
     &lt;p&gt;To use another flavour just replace &lt;code&gt;mocha&lt;/code&gt; with the one you want to use.&lt;/p&gt; 
    &lt;/details&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- reactive.nvim --&gt; 
  &lt;!-- render-markdown.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/MeanderingProgrammer/render-markdown.nvim&quot;&gt;render-markdown.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;render_markdown = true
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- render-markdown.nvim --&gt; 
  &lt;!-- snacks.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/folke/snacks.nvim&quot;&gt;snacks.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;snacks = {
    enabled = false,
    indent_scope_color = &quot;&quot;, -- catppuccin color (eg. `lavender`) Default: overlay2
}
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- snacks.nvim --&gt; 
  &lt;!-- symbols-outline.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/simrat39/symbols-outline.nvim&quot;&gt;symbols-outline.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; 
    &lt;div class=&quot;markdown-alert markdown-alert-note&quot;&gt;
     &lt;p class=&quot;markdown-alert-title&quot;&gt;
      &lt;svg class=&quot;octicon octicon-info mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
       &lt;path d=&quot;M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&quot;&gt;&lt;/path&gt;
      &lt;/svg&gt;Note&lt;/p&gt;
     &lt;p&gt;This plugin has been archived by the author, consider using &lt;a href=&quot;https://github.com/hedyhli/outline.nvim&quot;&gt;outline.nvim&lt;/a&gt;&lt;/p&gt; 
    &lt;/div&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;symbols_outline = false
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- symbols-outline.nvim --&gt; 
  &lt;!-- telekasten.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/renerocksai/telekasten.nvim&quot;&gt;telekasten.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;telekasten = false
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- telekasten.nvim --&gt; 
  &lt;!-- telescope.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/nvim-telescope/telescope.nvim&quot;&gt;telescope.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;telescope = {
    enabled = true,
}
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- telescope.nvim --&gt; 
  &lt;!-- trouble.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/folke/trouble.nvim&quot;&gt;trouble.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;lsp_trouble = false
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- trouble.nvim --&gt; 
  &lt;!-- vim-airline --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/vim-airline/vim-airline&quot;&gt;vim-airline&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; 
    &lt;details&gt; 
     &lt;summary&gt;Special&lt;/summary&gt; 
     &lt;pre&gt;&lt;code class=&quot;language-vim&quot;&gt;let g:airline_theme = &#39;catppuccin&#39;
&lt;/code&gt;&lt;/pre&gt; 
    &lt;/details&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- vim-airline --&gt; 
  &lt;!-- vim-clap --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/liuchengxu/vim-clap&quot;&gt;vim-clap&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; 
    &lt;details&gt; 
     &lt;summary&gt;Special&lt;/summary&gt; 
     &lt;p&gt;Use this to set it up:&lt;/p&gt; 
     &lt;pre&gt;&lt;code class=&quot;language-vim&quot;&gt;let g:clap_theme = &#39;catppuccin&#39;
&lt;/code&gt;&lt;/pre&gt; 
    &lt;/details&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- vim-clap --&gt; 
  &lt;!-- vim-dadbod-ui --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/kristijanhusak/vim-dadbod-ui&quot;&gt;vim-dadbod-ui&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;dadbod_ui = false
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- vim-dadbod-ui --&gt; 
  &lt;!-- vim-gitgutter --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/airblade/vim-gitgutter&quot;&gt;vim-gitgutter&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;gitgutter = false
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- vim-gitgutter --&gt; 
  &lt;!-- vim-illuminate --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/RRethy/vim-illuminate&quot;&gt;vim-illuminate&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;illuminate = {
    enabled = true,
    lsp = false
}
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- vim-illuminate --&gt; 
  &lt;!-- vim-sandwich --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/machakann/vim-sandwich&quot;&gt;vim-sandwich&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;sandwich = false
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- vim-sandwich --&gt; 
  &lt;!-- vim-signify --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/mhinz/vim-signify&quot;&gt;vim-signify&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;signify = false
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- vim-signify --&gt; 
  &lt;!-- vim-sneak --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/justinmk/vim-sneak&quot;&gt;vim-sneak&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;vim_sneak = false
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- vim-sneak --&gt; 
  &lt;!-- vimwiki --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/vimwiki/vimwiki&quot;&gt;vimwiki&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;vimwiki = false
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- vimwiki --&gt; 
  &lt;!-- which-key.nvim --&gt; 
  &lt;tr&gt; 
   &lt;td&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/folke/which-key.nvim&quot;&gt;which-key.nvim&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;td&gt; &lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;which_key = false
&lt;/code&gt;&lt;/pre&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;!-- which-key.nvim --&gt; 
 &lt;/tbody&gt;
&lt;/table&gt; 
&lt;h2&gt;Compile&lt;/h2&gt; 
&lt;p&gt;Catppuccin is a highly customizable and configurable colorscheme. This does however come at the cost of complexity and execution time. Catppuccin can pre compute the results of your configuration and store the results in a compiled Lua file. We use these pre-cached values to set it&#39;s highlights.&lt;/p&gt; 
&lt;p&gt;By default, Catppuccin writes the compiled results into the system&#39;s cache directory. See below if you&#39;d like to change the cache directory:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&quot;catppuccin&quot;).setup({ -- Note: On windows we replace `/` with `\` by default
    compile_path = vim.fn.stdpath &quot;cache&quot; .. &quot;/catppuccin&quot;
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;🙋 FAQ&lt;/h2&gt; 
&lt;h3&gt;Why do my Treesitter highlights look incorrect?&lt;/h3&gt; 
&lt;p&gt;Please disable &lt;code&gt;additional_vim_regex_highlighting&lt;/code&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&quot;nvim-treesitter.configs&quot;).setup {
    highlight = {
        enable = true,
        additional_vim_regex_highlighting = false
    },
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Why aren&#39;t my colors the same as the previews?&lt;/h3&gt; 
&lt;p&gt;Catppuccin requires that your terminal supports true color, meaning that your terminal can display the full range of 16 million colors.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Supported: iterm2 (macOS), kitty, wezterm, alacritty, &lt;a href=&quot;https://github.com/termstandard/colors#truecolor-support-in-output-devices&quot;&gt;see full list...&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;Unsupported: Terminal.app (macOS), Terminus, Terminology, &lt;a href=&quot;https://github.com/termstandard/colors#not-supporting-truecolor&quot;&gt;see full list...&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;If you use tmux, make sure to enable &lt;a href=&quot;https://gist.github.com/andersevenrud/015e61af2fd264371032763d4ed965b6&quot;&gt;true color support&lt;/a&gt; and &lt;a href=&quot;https://gist.github.com/gyribeiro/4192af1aced7a1b555df06bd3781a722&quot;&gt;italic font support&lt;/a&gt;. This will prevent issues raised in &lt;a href=&quot;https://github.com/catppuccin/nvim/issues/415&quot;&gt;#415&lt;/a&gt; and &lt;a href=&quot;https://github.com/catppuccin/nvim/issues/428&quot;&gt;#428&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;💝 Thanks to&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Current Maintainer(s)&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/vollowx&quot;&gt;vollowx&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/comfysage&quot;&gt;robin&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong&gt;Previous Maintainer(s)&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/Pocco81&quot;&gt;Pocco81&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/nullchilly&quot;&gt;nullchilly&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/mrtnvgr&quot;&gt;mrtnvgr&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;!-- panvimdoc-ignore-start --&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/catppuccin/catppuccin/main/assets/footers/gray0_ctp_on_line.svg?sanitize=true&quot; /&gt;&lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt;Copyright © 2021-present &lt;a href=&quot;https://github.com/catppuccin&quot; target=&quot;_blank&quot;&gt;Catppuccin Org&lt;/a&gt; &lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;&lt;a href=&quot;https://github.com/catppuccin/catppuccin/raw/main/LICENSE&quot;&gt;&lt;img src=&quot;https://img.shields.io/static/v1.svg?style=for-the-badge&amp;amp;label=License&amp;amp;message=MIT&amp;amp;logoColor=d9e0ee&amp;amp;colorA=363a4f&amp;amp;colorB=b7bdf8&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;!-- panvimdoc-ignore-end --&gt;</description>
      
      <media:content url="https://repository-images.githubusercontent.com/397434315/c85b3065-4b1f-477b-ab17-7dd6222fe99e" medium="image" />
      
    </item>
    
    <item>
      <title>nickjvandyke/opencode.nvim</title>
      <link>https://github.com/nickjvandyke/opencode.nvim</link>
      <description>&lt;p&gt;Integrate Neovim and OpenCode AI to stay in your flow.&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;opencode.nvim&lt;/h1&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/user-attachments/assets/077daa78-d401-4b8b-98d1-9ba9f94c2330&quot;&gt;https://github.com/user-attachments/assets/077daa78-d401-4b8b-98d1-9ba9f94c2330&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;✨ Features&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;Connect to &lt;em&gt;any&lt;/em&gt; &lt;code&gt;opencode&lt;/code&gt;, or provide an integrated instance&lt;/li&gt; 
 &lt;li&gt;Share editor context (buffer, selection, diagnostics, etc.)&lt;/li&gt; 
 &lt;li&gt;Input prompts with completions, highlights, and normal-mode support&lt;/li&gt; 
 &lt;li&gt;Select prompts from a library and define your own&lt;/li&gt; 
 &lt;li&gt;Execute commands&lt;/li&gt; 
 &lt;li&gt;Monitor and respond to events&lt;/li&gt; 
 &lt;li&gt;View, accept or reject, and reload edits&lt;/li&gt; 
 &lt;li&gt;Interact with &lt;code&gt;opencode&lt;/code&gt; via an in-process LSP&lt;/li&gt; 
 &lt;li&gt;&lt;em&gt;Vim-y&lt;/em&gt; — supports ranges and dot-repeat&lt;/li&gt; 
 &lt;li&gt;Simple, sensible defaults to get you started quickly&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;📦 Setup&lt;/h2&gt; 
&lt;h3&gt;&lt;a href=&quot;https://github.com/folke/lazy.nvim&quot;&gt;lazy.nvim&lt;/a&gt;&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;{
  &quot;nickjvandyke/opencode.nvim&quot;,
  version = &quot;*&quot;, -- Latest stable release
  dependencies = {
    {
      -- `snacks.nvim` integration is recommended, but optional
      ---@module &quot;snacks&quot; &amp;lt;- Loads `snacks.nvim` types for configuration intellisense
      &quot;folke/snacks.nvim&quot;,
      optional = true,
      opts = {
        input = {}, -- Enhances `ask()`
        picker = { -- Enhances `select()`
          actions = {
            opencode_send = function(...) return require(&quot;opencode&quot;).snacks_picker_send(...) end,
          },
          win = {
            input = {
              keys = {
                [&quot;&amp;lt;a-a&amp;gt;&quot;] = { &quot;opencode_send&quot;, mode = { &quot;n&quot;, &quot;i&quot; } },
              },
            },
          },
        },
      },
    },
  },
  config = function()
    ---@type opencode.Opts
    vim.g.opencode_opts = {
      -- Your configuration, if any; goto definition on the type or field for details
    }

    vim.o.autoread = true -- Required for `opts.events.reload`

    -- Recommended/example keymaps
    vim.keymap.set({ &quot;n&quot;, &quot;x&quot; }, &quot;&amp;lt;C-a&amp;gt;&quot;, function() require(&quot;opencode&quot;).ask(&quot;@this: &quot;, { submit = true }) end, { desc = &quot;Ask opencode…&quot; })
    vim.keymap.set({ &quot;n&quot;, &quot;x&quot; }, &quot;&amp;lt;C-x&amp;gt;&quot;, function() require(&quot;opencode&quot;).select() end,                          { desc = &quot;Execute opencode action…&quot; })
    vim.keymap.set({ &quot;n&quot;, &quot;t&quot; }, &quot;&amp;lt;C-.&amp;gt;&quot;, function() require(&quot;opencode&quot;).toggle() end,                          { desc = &quot;Toggle opencode&quot; })

    vim.keymap.set({ &quot;n&quot;, &quot;x&quot; }, &quot;go&quot;,  function() return require(&quot;opencode&quot;).operator(&quot;@this &quot;) end,        { desc = &quot;Add range to opencode&quot;, expr = true })
    vim.keymap.set(&quot;n&quot;,          &quot;goo&quot;, function() return require(&quot;opencode&quot;).operator(&quot;@this &quot;) .. &quot;_&quot; end, { desc = &quot;Add line to opencode&quot;, expr = true })

    vim.keymap.set(&quot;n&quot;, &quot;&amp;lt;S-C-u&amp;gt;&quot;, function() require(&quot;opencode&quot;).command(&quot;session.half.page.up&quot;) end,   { desc = &quot;Scroll opencode up&quot; })
    vim.keymap.set(&quot;n&quot;, &quot;&amp;lt;S-C-d&amp;gt;&quot;, function() require(&quot;opencode&quot;).command(&quot;session.half.page.down&quot;) end, { desc = &quot;Scroll opencode down&quot; })

    -- You may want these if you use the opinionated `&amp;lt;C-a&amp;gt;` and `&amp;lt;C-x&amp;gt;` keymaps above — otherwise consider `&amp;lt;leader&amp;gt;o…` (and remove terminal mode from the `toggle` keymap)
    vim.keymap.set(&quot;n&quot;, &quot;+&quot;, &quot;&amp;lt;C-a&amp;gt;&quot;, { desc = &quot;Increment under cursor&quot;, noremap = true })
    vim.keymap.set(&quot;n&quot;, &quot;-&quot;, &quot;&amp;lt;C-x&amp;gt;&quot;, { desc = &quot;Decrement under cursor&quot;, noremap = true })
  end,
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;&lt;a href=&quot;https://github.com/nix-community/nixvim&quot;&gt;nixvim&lt;/a&gt;&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-nix&quot;&gt;programs.nixvim = {
  extraPlugins = [
    pkgs.vimPlugins.opencode-nvim
  ];
};
&lt;/code&gt;&lt;/pre&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-tip&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-light-bulb mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Tip&lt;/p&gt;
 &lt;p&gt;Run &lt;code&gt;:checkhealth opencode&lt;/code&gt; after setup.&lt;/p&gt; 
&lt;/div&gt; 
&lt;h2&gt;⚙️ Configuration&lt;/h2&gt; 
&lt;p&gt;&lt;code&gt;opencode.nvim&lt;/code&gt; provides a rich and reliable default experience — see all available options and their defaults &lt;a href=&quot;https://raw.githubusercontent.com/nickjvandyke/opencode.nvim/main/lua/opencode/config.lua&quot;&gt;here&lt;/a&gt;.&lt;/p&gt; 
&lt;h3&gt;Contexts&lt;/h3&gt; 
&lt;p&gt;&lt;code&gt;opencode.nvim&lt;/code&gt; replaces placeholders in prompts with the corresponding context:&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Placeholder&lt;/th&gt; 
   &lt;th&gt;Context&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;@this&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Operator range or visual selection if any, else cursor position&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;@buffer&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Current buffer&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;@buffers&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Open buffers&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;@visible&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Visible text&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;@diagnostics&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Current buffer diagnostics&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;@quickfix&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Quickfix list&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;@diff&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Git diff&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;@marks&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Global marks&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;@grapple&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/cbochs/grapple.nvim&quot;&gt;grapple.nvim&lt;/a&gt; tags&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-tip&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-light-bulb mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Tip&lt;/p&gt;
 &lt;p&gt;&lt;code&gt;opencode&lt;/code&gt; reads referenced files from disk — save your changes!&lt;/p&gt; 
&lt;/div&gt; 
&lt;h3&gt;Prompts&lt;/h3&gt; 
&lt;p&gt;Select or reference prompts to review, explain, and improve your code:&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Name&lt;/th&gt; 
   &lt;th&gt;Prompt&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;diagnostics&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Explain &lt;code&gt;@diagnostics&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;diff&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Review the following git diff for correctness and readability: &lt;code&gt;@diff&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;document&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Add comments documenting &lt;code&gt;@this&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;explain&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Explain &lt;code&gt;@this&lt;/code&gt; and its context&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;fix&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Fix &lt;code&gt;@diagnostics&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;implement&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Implement &lt;code&gt;@this&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;optimize&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Optimize &lt;code&gt;@this&lt;/code&gt; for performance and readability&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;review&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Review &lt;code&gt;@this&lt;/code&gt; for correctness and readability&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;test&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Add tests for &lt;code&gt;@this&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h3&gt;Server&lt;/h3&gt; 
&lt;p&gt;You can manually run &lt;code&gt;opencode&lt;/code&gt;s however you like and &lt;code&gt;opencode.nvim&lt;/code&gt; will find them!&lt;/p&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-important&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-report mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Important&lt;/p&gt;
 &lt;p&gt;You &lt;em&gt;must&lt;/em&gt; run &lt;code&gt;opencode&lt;/code&gt; with the &lt;code&gt;--port&lt;/code&gt; flag to expose its server.&lt;/p&gt; 
&lt;/div&gt; 
&lt;p&gt;If &lt;code&gt;opencode.nvim&lt;/code&gt; can&#39;t find an existing &lt;code&gt;opencode&lt;/code&gt;, it uses the configured server to start one for you, defaulting to an embedded terminal.&lt;/p&gt; 
&lt;h4&gt;Keymaps&lt;/h4&gt; 
&lt;p&gt;&lt;code&gt;opencode.nvim&lt;/code&gt; sets these normal-mode keymaps in the embedded terminal for Neovim-like message navigation:&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Keymap&lt;/th&gt; 
   &lt;th&gt;Command&lt;/th&gt; 
   &lt;th&gt;Description&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;&amp;lt;C-u&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;session.half.page.up&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Scroll up half page&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;&amp;lt;C-d&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;session.half.page.down&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Scroll down half page&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;gg&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;session.first&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Go to first message&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;G&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;session.last&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Go to last message&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;&amp;lt;Esc&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;session.interrupt&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Interrupt&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h4&gt;Customization&lt;/h4&gt; 
&lt;p&gt;Example using &lt;a href=&quot;https://github.com/folke/snacks.nvim/raw/main/docs/terminal.md&quot;&gt;&lt;code&gt;snacks.terminal&lt;/code&gt;&lt;/a&gt; instead:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;local opencode_cmd = &#39;opencode --port&#39;
---@type snacks.terminal.Opts
local snacks_terminal_opts = {
  win = {
    position = &#39;right&#39;,
    enter = false,
    on_win = function(win)
      -- Set up keymaps and cleanup for an arbitrary terminal
      require(&#39;opencode.terminal&#39;).setup(win.win)
    end,
  },
}
---@type opencode.Opts
vim.g.opencode_opts = {
  server = {
    start = function()
      require(&#39;snacks.terminal&#39;).open(opencode_cmd, snacks_terminal_opts)
    end,
    stop = function()
      require(&#39;snacks.terminal&#39;).get(opencode_cmd, snacks_terminal_opts):close()
    end,
    toggle = function()
      require(&#39;snacks.terminal&#39;).toggle(opencode_cmd, snacks_terminal_opts)
    end,
  },
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;🚀 Usage&lt;/h2&gt; 
&lt;h3&gt;Ask — &lt;code&gt;require(&quot;opencode&quot;).ask()&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;Input a prompt for &lt;code&gt;opencode&lt;/code&gt;.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Press &lt;code&gt;&amp;lt;Up&amp;gt;&lt;/code&gt; to browse recent asks.&lt;/li&gt; 
 &lt;li&gt;Highlights and completes contexts and &lt;code&gt;opencode&lt;/code&gt; subagents. 
  &lt;ul&gt; 
   &lt;li&gt;Press &lt;code&gt;&amp;lt;Tab&amp;gt;&lt;/code&gt; to trigger built-in completion.&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;End the prompt with &lt;code&gt;\n&lt;/code&gt; to append instead of submit.&lt;/li&gt; 
 &lt;li&gt;Additionally, when using &lt;code&gt;snacks.input&lt;/code&gt;: 
  &lt;ul&gt; 
   &lt;li&gt;Press &lt;code&gt;&amp;lt;S-CR&amp;gt;&lt;/code&gt; to append instead of submit.&lt;/li&gt; 
   &lt;li&gt;Offers completions via in-process LSP.&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Select — &lt;code&gt;require(&quot;opencode&quot;).select()&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;Select from all &lt;code&gt;opencode.nvim&lt;/code&gt; functionality.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Prompts&lt;/li&gt; 
 &lt;li&gt;Commands&lt;/li&gt; 
 &lt;li&gt;Server controls&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Highlights and previews items when using &lt;code&gt;snacks.picker&lt;/code&gt;.&lt;/p&gt; 
&lt;h3&gt;Prompt — &lt;code&gt;require(&quot;opencode&quot;).prompt()&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;Prompt &lt;code&gt;opencode&lt;/code&gt;.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Resolves named references to configured prompts.&lt;/li&gt; 
 &lt;li&gt;Injects configured contexts.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;opencode&lt;/code&gt; will interpret &lt;code&gt;@&lt;/code&gt; references to files or subagents.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Operator — &lt;code&gt;require(&quot;opencode&quot;).operator()&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;Wraps &lt;code&gt;prompt&lt;/code&gt; as an operator, supporting ranges and dot-repeat.&lt;/p&gt; 
&lt;h3&gt;Command — &lt;code&gt;require(&quot;opencode&quot;).command()&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;Command &lt;code&gt;opencode&lt;/code&gt;:&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Command&lt;/th&gt; 
   &lt;th&gt;Description&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;session.list&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;List sessions&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;session.new&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Start a new session&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;session.select&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Select a session&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;session.share&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Share the current session&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;session.interrupt&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Interrupt the current session&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;session.compact&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Compact the current session (reduce context size)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;session.page.up&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Scroll messages up by one page&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;session.page.down&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Scroll messages down by one page&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;session.half.page.up&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Scroll messages up by half a page&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;session.half.page.down&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Scroll messages down by half a page&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;session.first&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Jump to the first message in the session&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;session.last&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Jump to the last message in the session&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;session.undo&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Undo the last action in the current session&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;session.redo&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Redo the last undone action in the current session&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;prompt.submit&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Submit the TUI input&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;prompt.clear&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Clear the TUI input&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;agent.cycle&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Cycle the selected agent&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h3&gt;LSP&lt;/h3&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-warning&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-alert mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Warning&lt;/p&gt;
 &lt;p&gt;This feature is experimental! Try it out with &lt;code&gt;vim.g.opencode_opts.lsp.enabled = true&lt;/code&gt;.&lt;/p&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;code&gt;opencode.nvim&lt;/code&gt; provides an in-process LSP to interact with &lt;code&gt;opencode&lt;/code&gt; via the LSP functions you&#39;re used to!&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;LSP Function&lt;/th&gt; 
   &lt;th&gt;&lt;code&gt;opencode.nvim&lt;/code&gt; Handler&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Hover&lt;/td&gt; 
   &lt;td&gt;Asks &lt;code&gt;opencode&lt;/code&gt; for a brief explanation of the symbol under the cursor&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Code Actions&lt;/td&gt; 
   &lt;td&gt;Asks &lt;code&gt;opencode&lt;/code&gt; to explain or fix diagnostics under the cursor&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h2&gt;👀 Events&lt;/h2&gt; 
&lt;p&gt;&lt;code&gt;opencode.nvim&lt;/code&gt; forwards &lt;code&gt;opencode&lt;/code&gt;&#39;s Server-Sent-Events as an &lt;code&gt;OpencodeEvent&lt;/code&gt; autocmd:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- Handle `opencode` events
vim.api.nvim_create_autocmd(&quot;User&quot;, {
  pattern = &quot;OpencodeEvent:*&quot;, -- Optionally filter event types
  callback = function(args)
    ---@type opencode.server.Event
    local event = args.data.event
    ---@type number
    local port = args.data.port

    -- See the available event types and their properties
    vim.notify(vim.inspect(event))
    -- Do something useful
    if event.type == &quot;session.idle&quot; then
      vim.notify(&quot;`opencode` finished responding&quot;)
    end
  end,
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Edits&lt;/h3&gt; 
&lt;p&gt;When &lt;code&gt;opencode&lt;/code&gt; edits a file, &lt;code&gt;opencode.nvim&lt;/code&gt; automatically reloads the corresponding buffer.&lt;/p&gt; 
&lt;h3&gt;Permissions&lt;/h3&gt; 
&lt;p&gt;When &lt;code&gt;opencode&lt;/code&gt; requests a permission, &lt;code&gt;opencode.nvim&lt;/code&gt; waits for idle to ask you to approve or deny it.&lt;/p&gt; 
&lt;h4&gt;Edits&lt;/h4&gt; 
&lt;p&gt;For edit requests, &lt;code&gt;opencode.nvim&lt;/code&gt; opens the target file in a new tab and uses Neovim&#39;s &lt;code&gt;:diffpatch&lt;/code&gt; to display the proposed changes side-by-side. See &lt;code&gt;:h &#39;diffopt&#39;&lt;/code&gt; for customization.&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Keymap&lt;/th&gt; 
   &lt;th&gt;Function&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;da&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Accept the entire edit request&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dr&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Reject the entire edit request&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;]c/[c&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Next/prev change&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;dp&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Natively accept &lt;em&gt;only&lt;/em&gt; the hunk under the cursor, and reject the edit request&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;do&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Natively reject &lt;em&gt;only&lt;/em&gt; the hunk under the cursor, and reject the edit request&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;q&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Close the diff&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h3&gt;Statusline&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&quot;lualine&quot;).setup({
  sections = {
    lualine_z = {
      {
        require(&quot;opencode&quot;).statusline,
      },
    }
  }
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;🙏 Acknowledgments&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;Inspired by &lt;a href=&quot;https://github.com/GeorgesAlkhouri/nvim-aider&quot;&gt;nvim-aider&lt;/a&gt;, &lt;a href=&quot;https://github.com/loukotal/neopencode.nvim&quot;&gt;neopencode.nvim&lt;/a&gt;, and &lt;a href=&quot;https://github.com/folke/sidekick.nvim&quot;&gt;sidekick.nvim&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;Uses &lt;code&gt;opencode&lt;/code&gt;&#39;s TUI for simplicity — see &lt;a href=&quot;https://github.com/sudo-tee/opencode.nvim&quot;&gt;sudo-tee/opencode.nvim&lt;/a&gt; for a Neovim frontend.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/bigcodegen/mcp-neovim-server&quot;&gt;mcp-neovim-server&lt;/a&gt; may better suit you, but it lacks customization and tool calls are slow and unreliable.&lt;/li&gt; 
&lt;/ul&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/d9563c0de350614e75eb83f31f1fd340327228e54dd06871cba84b1bd84f1a54/nickjvandyke/opencode.nvim" medium="image" />
      
    </item>
    
  </channel>
</rss>
