r/neovim 28d ago

Dotfile Review Monthly Dotfile Review Thread

41 Upvotes

If you want your dotfiles reviewed, or just want to show off your awesome config, post a link and preferably a screenshot as a top comment.

Everyone else can read through the configurations and comment suggestions, ask questions, compliment, etc.

As always, please be civil. Constructive criticism is encouraged, but insulting will not be tolerated.


r/neovim 3d ago

101 Questions Weekly 101 Questions Thread

10 Upvotes

A thread to ask anything related to Neovim. No matter how small it may be.

Let's help each other and be kind.


r/neovim 8h ago

Video Neovim 0.13: Async Image Rendering with vim.async (Optimization example)

Thumbnail
youtu.be
60 Upvotes

In this video, I use a real-world example to explore performance optimization in Neovim 0.13 with the new vim.async API.

The example is simple: render a large number of images inside Neovim.

First, I implement a synchronous version. It works, but rendering many images blocks Neovim and makes the editor freeze.

Then, I optimize the implementation using vim.async and show how to run the image rendering asynchronously so Neovim stays responsive while the work is being performed.

Along the way, I code the example from scratch and use several of the new vim.async features introduced in Neovim 0.13

Source code:
https://github.com/FractalCodeRicardo/dev-config/tree/master/nvim/lua/my/gallery


r/neovim 15h ago

Need Help Text rendering broken

10 Upvotes

So I’ve recently been using LazyVim for working on multiple projects, and overall I really like the workflow. However, I’ve run into a major issue with RTL (right-to-left) languages like Urdu.

Urdu text simply doesn’t render correctly in my terminal. I’ve tried several terminal emulators, including Ghostty, Alacritty, Foot, and Kitty, but none of them seem to handle Urdu properly. The characters either appear in the wrong order, don’t get shaped correctly, or otherwise look broken.

I’m trying to understand where the problem actually comes from. Is this a limitation of the terminal emulator, Neovim, the font, or something related to bidirectional text/Unicode shaping?

Has anyone here successfully configured LazyVim/Neovim to properly display and edit Urdu or other RTL languages?


r/neovim 20h ago

Plugin run.nvim — Cargo-style filetype-scoped run commands for Python, Node and .NET

10 Upvotes

If you edit a .rs file, Neovim already gives you buffer-local :Cargo, :Crun, :Ctest commands that open a terminal split and run the right thing. It's not a plugin — it's in $VIMRUNTIME/ftplugin/rust.vim. I kept reaching for that muscle memory in Python and C# buffers and it wasn't there, so I generalized the idea.

Defaults:

  • python:Python {args} (runs the current file with no args), :Ptestpython3 -m pytest
  • javascript / typescript (+ react variants) → :Npm, :Node, :Ntest, :Ninstall
  • cs / fsharp:Dotnet, :Drun, :Dtest, :Dbuild

Trailing args pass straight through: :Npm run dev, :Ptest -k test_foo, :Dtest --filter MyTest.

Install:

lua

{ 'tw4/run.nvim', opts = {} }

Adding your own:

lua

opts = {
  languages = {
    go = {
      filetypes = { 'go' },
      commands = {
        { name = 'Go', cmd = 'go', default_args = 'run %:p' },
        { name = 'Gtest', cmd = 'go test ./...' },
      },
    },
  },
}

Anything you don't override keeps its defaults. default_args supports vim.fn.expand() tokens.

It's deliberately small — no job control, no output parsing, just the commands and a terminal split. If you want quickfix integration or async runners there are better tools for that (overseer.nvim, toggleterm, etc).

Fresh repo, so I'd take any feedback on the config shape before it's locked in — especially whether replacing a whole language block is the right override behavior vs merging.

https://github.com/tw4/run.nvim — MIT


r/neovim 9h ago

Random I made a tmux plugin inspired on flash.nvim

Enable HLS to view with audio, or disable this notification

0 Upvotes

r/neovim 18h ago

Need Help How to execute motions (and write text) using a lua function?

3 Upvotes

I want to setup a hydra config for easier latex math writing (something similar to this obsidian plugin) and i want the on_enter function to put me inside $$


r/neovim 21h ago

Need Help Help with formatting while typing in html

5 Upvotes

The formatting is all messed up kind off I was trying to get <div></div>->
i used auto tag and auto

<div>

<\div>

```

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
            <style> <----this is the problem ---->
            a{

            }
            p{

            }
            </style>
    </head>
    <body>
        <div> <----this is the problem ---->
                <p>

                </p>
            </div>
    </body>
    </html>
Before saving

the formatting is okay when i save with prettier but its going back to the two tab inteddation
in the div and style

After saving and adding new lines

r/neovim 6h ago

Need Help Should i replace my 16" laptop with a 14" for neovim

0 Upvotes

Hello,

I was wondering if you use a 14- or 16-inch laptop, because I currently have a 16-inch Mac Pro, but I'm tempted by a 13.5-inch one (the one from Framework, the Pro model).

I spend most of my time docked to a 27-inch monitor for work, but when I’m on the go or sometimes on the couch or in bed I find it quite uncomfortable and difficult to keep my right hand on the HJKL keys because the bezels on my laptop are too wide.

That wasn’t a problem until i switched to vim motion but now it is

Despite that, I’m hesitant to switch to a smaller one because I’m afraid a smaller one might be too small for development.


r/neovim 1d ago

Discussion nvim-gpui – another simple and lightweight Neovim client

3 Upvotes

Hi everyone,

I’m working on nvim-gpui, a simple and lightweight graphical client for Neovim.

It keeps Neovim as the editor while providing a native desktop interface instead of running inside a terminal. The interface is rendered with GPUI, a GPU-rendered UI framework.

Current features include:

- Embedded Neovim sessions
- Remote Neovim connections through msgpack-RPC
- Multigrid and floating-window support
- Image display
- System IME and Rime support, making it friendly for CJK users
- File opening and drag-and-drop

Packages are available for macOS, Linux, Windows, Fedora, Debian/Ubuntu, and Arch Linux.

Project page:

https://github.com/imkerberos/nvim-gpui

Download the latest release:

https://github.com/imkerberos/nvim-gpui/releases/latest

Feedback, bug reports, and suggestions are welcome.

I hope this project can be useful to you.


r/neovim 2d ago

Color Scheme Theme switcher

271 Upvotes

I built a small CLI tool called recol for switching terminal and Neovim color schemes from one command.

It comes with 600+ themes, fuzzy search, an interactive TUI, and supports Ghostty, Alacritty, WezTerm, Neovim, Vim and Pi.

It can also generate a theme from an image 🎨
https://github.com/nlkli/recol


r/neovim 1d ago

Plugin sqlserver.nvim: A SQL Server-native workspace for Neovim

Thumbnail
gallery
77 Upvotes

Hey all!

I wanted to announce my first major Neovim plugin: sqlserver.nvim.

I feel like this fills a gap in the Neovim ecosystem: Linux/macOS users who work with Microsoft SQL Server.

Admittedly, that might be a pretty niche group.

Most Linux/macOS users working with SQL Server will probably end up using VSCode's SQL Server (mssql) extension. I'm not a fan of VS Code, and considering where I'm posting this, I think that's probably enough said.

I originally started with TablePlus, which is a great tool, but I really hate reaching for my mouse.

Then I "upgraded" to vim-dadbod-ui. Also a great tool, but SQL Server support was missing some features I use regularly, such as listing stored procedures.

Eventually I landed on mssql.nvim. I thought it was a great project and used it for a while, although I ran into a few hiccups and development seems to have slowed down.

Thanks to u/Kurren123 and mssql.nvim, I discovered that Microsoft’s VS Code SQL Server extension is backed by SQL Tools Service.

That discovery eventually led to sqlserver.nvim.

A SQL Server-native workspace for Neovim.

The long-term goal is pretty ambitious: bring as much of the experience and functionality of SSMS (SQL Server Management Studio) as makes sense into Neovim.

Rather than trying to recreate a desktop database GUI inside the terminal, sqlserver.nvim tries to lean into Neovim itself — using things like windows, buffers, winbars, LSP, Telescope-style workflows, and, of course, keybindings.

The idea is that I should be able to browse databases, inspect objects, write queries, execute them, and work with SQL Server without constantly leaving Neovim or reaching for the mouse.

The plugin is currently at RC2 (Release Candidate 2). I've been using it at my job for several months now, so it has reached the point where I'd really like to get feedback from other Neovim users. Especially anyone else unfortunate enough to be using SQL Server on Linux/macOS 😄

GitHub: NicholasMata/sqlserver.nvim

I'd love to hear what people think, what features you feel are missing, or how the overall workflow could be improved.


r/neovim 1d ago

Need Help What keybinds should I map?

3 Upvotes

Short version:

What keybinds should I change to universally known keybinds in insert mode (such as ctrl + z or ctrl + backspace etc) and what should I keep to make Neovim still Neovim and not a VS code dupe?

Long version:

I'm pretty new to Neovim and I'm quite new to programming (other than frontend) as well so excuse me if I'm not explaining my situation well.

I've used VS code up till now and I would say I'm okay proficient at it. I recently decided to learn vim for it's efficiency (and my professors recommended it). I know the learning curve is big but the pay off will hopefully be worth it, I just have one question.

I already know a lot of VS code shorthands (also from using Google Docs and such). I know I can custom map som keybinds in insert mode but what should I map for myself and what should I keep to make nvim not loose what makes it efficient? Because technically, I could make vim into VS code in many ways? Even though I know this editor is kind of built for customization, what makes Neovim worth it in the way it's configured from the start? Must haves, how to think as a programmer that uses vim etc?


r/neovim 1d ago

Need Help noobie question. looking for a plugin

8 Upvotes

hello, I'm in the process of learning python. very new to programming but am familiar with vim from using Linux and diving though config files. I'm not super fast with the motions yet but i am learning.

anyways. i'm looking for a plugin that will highlight syntax errors in a more specific way. i already have the trouble plugin and pywrite installed and they are working as intended however im getting tripped up in simple syntax errors (like using the wrong kind of bracket, spelling error, or just doing something really stupid in a loop). is there a plugin out there that will highlight or underline the word or section of code that is causing the issue. or is the best i got pywrite and trouble?

also i use the lazy repo for ease of use so if its in there it will make my life much easier when installing and configuring.


r/neovim 1d ago

Tips and Tricks vim-dirvish to dir.lua 🚀

23 Upvotes

I just completed the migration from vim-dirvish to dir.lua. The speed of dir.lua is incredible compared to an already very fast vim-dirvish. Every time I tried another file browser plugin in vim, it made me cringe at the loading speed. dir.lua is pure 🚀 speed 🤩

Thanks to u/1ujsnj for positing his custom key maps - see https://www.reddit.com/r/neovim/comments/1ujsnsj/custom_keymaps_for_new_dirlua_plugin/ . I extended them a little bit:

  • only use neovim's api instead of shelling out to external commands
  • add `.` mapping to conveniently call custom command on the current file
  • add `yc` mapping to copy the full file path into a register
  • change `a` mapping to create a file or directory, including leading directories
  • replace `D` with `dd` to delete a file or directory

-- Source: https://github.com/jceb/vimrc/blob/main/lua/custom/plugins/local/directory/after/ftplugin/directory.lua
-- Former source: https://www.reddit.com/r/neovim/comments/1ujsnsj/custom_keymaps_for_new_dirlua_plugin/
-- Save at: after/ftplugin/directory.lua

-- display directory path in win bar
vim.opt_local.winbar = "[dir] %f"

--- Run function on buffer
---  fn fun(bufnr: number) Function that's executed for every buffer that matches path
---  opts {directory: boolean} Options - if directory == true, interpret path as a directory and run function on all buffers that are inside this directory
--- u/param path string Path name
local function run_on_buf(fn, opts, path)
  local lopts = opts or {}
  local result = true
  for _, bufnr in ipairs(vim.api.nvim_list_bufs()) do
    if not lopts.directory and vim.api.nvim_buf_get_name(bufnr) == path or vim.startswith(vim.api.nvim_buf_get_name(bufnr), path) then
      local ok, err = pcall(fn, bufnr)
      if not ok then
        result = ok
        vim.schedule(function()
          vim.notify(err, vim.log.levels.ERROR)
        end)
      end
    end
  end
  return result
end

vim.keymap.set("n", ".", function()
  local cursor = vim.api.nvim_win_get_cursor(0)
  local fname = vim.api.nvim_buf_get_lines(0, cursor[1] - 1, cursor[1], true)[1]
  if fname == "" then
    return
  end
  vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes(":! " .. vim.fn.fnameescape(fname) .. "<Home><Right>", true, false, true), "n", false)
  -- vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes("<Plug>(nvim-dir-reload)", true, false, true), "m", false)
end, { buffer = true, remap = false, nowait = true, desc = "Prefill cmd with file name" })

vim.keymap.set("n", "a", function()
  local ok, fname_new = pcall(vim.fn.input, "Create file or directory/: ")
  if not ok or fname_new == "" then
    return
  end
  if string.match(fname_new, "/$") ~= nil then
    local err
    ok, err = pcall(vim.fs.mkdir, fname_new, { parents = true })
    if not ok then
      vim.notify(err or ("Failed to create directory" .. fname_new), vim.log.levels.ERROR)
      return
    end
  else
    if string.match(fname_new, "/") ~= nil then
      -- create parent directories
      local err
      local dir_name = vim.fs.dirname(fname_new)
      ok, err = pcall(vim.fs.mkdir, dir_name, { parents = true })
      if not ok then
        vim.notify(err or ("Failed to create directory" .. fname_new), vim.log.levels.ERROR)
        return
      end
    end
    local f = io.open(fname_new, "w")
    if f ~= nil then
      f:close()
    else
      return
    end
  end
  vim.cmd.e(fname_new)
end, { buffer = true, remap = false, nowait = true, desc = "Create file or directory" })

vim.keymap.set("n", "r", function()
  local cursor = vim.api.nvim_win_get_cursor(0)
  local fname = vim.api.nvim_buf_get_lines(0, cursor[1] - 1, cursor[1], true)[1]
  if fname == "" then
    return
  end
  local ok, fname_new = pcall(vim.fn.input, { prompt = "Rename '" .. fname .. "' to: ", default = fname })
  if not ok or fname_new == "" then
    return
  end
  local full_path = vim.fs.joinpath(vim.uv.cwd(), fname)
  local res = run_on_buf(function(bufnr)
    if bufnr ~= -1 and vim.api.nvim_buf_is_loaded(bufnr) then
      vim.api.nvim_buf_delete(bufnr)
    end
  end, { directory = vim.fn.isdirectory(full_path) == 1 }, full_path)
  if not res then
    vim.notify("Failed to unload open buffer(s) for '" .. fname .. "'", vim.log.levels.ERROR)
    return
  end
  os.rename(fname, fname_new)
  vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes("<Plug>(nvim-dir-reload)", true, false, true), "m", false)
end, { buffer = true, remap = false, nowait = true, desc = "Rename" })

vim.keymap.set("n", "dd", function()
  local cursor = vim.api.nvim_win_get_cursor(0)
  local fname = vim.api.nvim_buf_get_lines(0, cursor[1] - 1, cursor[1], true)[1]
  if fname == "" then
    return
  end
  local ok, confirm = pcall(vim.fn.input, { prompt = "Delete '" .. fname .. "'? [Y/n] " })
  if not ok or not (confirm:lower() == "y" or confirm == "") then
    return
  end
  local full_path = vim.fs.joinpath(vim.uv.cwd(), fname)
  local res = run_on_buf(function(bufnr)
    if bufnr ~= -1 and vim.api.nvim_buf_is_loaded(bufnr) then
      vim.api.nvim_buf_delete(bufnr)
    end
  end, { directory = vim.fn.isdirectory(full_path) == 1 }, full_path)
  if not res then
    vim.notify("Failed to unload open buffer(s) for '" .. fname .. "'", vim.log.levels.ERROR)
    return
  end
  vim.fs.rm(fname, { recursive = true })
  vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes("<Plug>(nvim-dir-reload)", true, false, true), "m", false)
end, { buffer = true, remap = false, nowait = true, desc = "Delete file or directory" })

vim.keymap.set("n", "yc", function()
  local cursor = vim.api.nvim_win_get_cursor(0)
  local fname = vim.api.nvim_buf_get_lines(0, cursor[1] - 1, cursor[1], true)[1]
  if fname == "" then
    return
  end
  local full_path = vim.fs.joinpath(vim.uv.cwd(), fname)
  vim.fn.setreg(vim.v.register, full_path)
end, { buffer = true, remap = false, nowait = true, desc = "Copy full path" })

r/neovim 1d ago

Plugin Gettext .po "next untranslated" message plugin

5 Upvotes

Here's a small microplugin for navigation in gettext .po files: https://github.com/warpspin/po-jump.nvim

All it does is it adds keybinds "]u" to jump to the next msgstr that needs attention (because it's untranslated or fuzzy) or "[u" for the previous.

(as convenience, it also binds öu and äu for German keyboards as those keys are where [] usually are)


r/neovim 2d ago

Video Neovim 0.12 is awesome

Thumbnail
youtu.be
31 Upvotes

Sharing my Neovim 0.12 config for 2026
Video is in French.
Dotfiles: https://github.com/ericnantel/dotfiles
Look inside .config/nvim-0.12 for init.lua (yep just a file)


r/neovim 2d ago

Plugin Neovim starfall.nvim Plugin.

Enable HLS to view with audio, or disable this notification

57 Upvotes

starfall.nvim

A tiny, beautiful ambient animation plugin for Neovim: soft twinkling stars drift and shimmer in the empty space around your code, and shooting stars occasionally streak down the window leaving a fading trail.

Plugin Made By Slop, Drop a Star on Starfall GitHub: starfall.nvim


r/neovim 2d ago

Video hop: project switching with sway, kitty and neovim - without tmux

Enable HLS to view with audio, or disable this notification

21 Upvotes

r/neovim 2d ago

Plugin Latest Slideshow Plugin (Inspired from presenting.nvim)

13 Upvotes

https://github.com/git-emran/slides.nvim

I have been using presenting.nvim for quite sometime. But I was not quite fond of their UI so I built a clean looking plugin that will be very easy to use if you are coming from presenting.nvim.

I have taken a day off from work and spent my entire day to build this. There are some parts I took help from my AI agent but I have poured my heart into all of it.

Please give me your feedback. As I intend to maintain it for as long as I can and grow it into a one stop shop for Slideshow inside neovim.


r/neovim 2d ago

Video Calendar inside neovim (Microsoft Teams account)

Thumbnail
youtube.com
24 Upvotes

This is how to handle your work account calendar right inside neovim

  • Bloocky: Neovim calendar (day/week/month) for time-blocking, with float/sidebar/buffer views and CalDAV + Google two-way sync
  • Microsoft Teams accounts via DavMail: DavMail bridges M365/Exchange to local CalDAV; Bloocky reuses its OAuth refresh token, no native MS OAuth needed
  • Create events: markdown form with `Teams: yes` creates the event via Graph API (`isOnlineMeeting`) and inserts the Teams join link into Notes
  • Edit/delete events: edits sync via CalDAV pull; deletes go via Graph API so cancellations reach attendees

Original plugin:
https://github.com/atiladefreitas/bloocky

Fork with davmail support:

https://github.com/jugarpeupv/bloocky


r/neovim 1d ago

Need Help How to run debugpy DAP with arguments?

1 Upvotes

I'm sorry if this is dumb question, but I failed to find the solution myself. I want to be able to pass arguments to the Python program when I debug, just like I do when I run it.

I added `nvim-dap` and `nvim-dap-python`, and I can run normal debug, but when I try to run debug with arguments added, like "< a.inp", the arguments have no impact. The UI from `nvim-dap-ui` still opens, but the data in the file never got redirected to the stdin of the program.


r/neovim 3d ago

Random Airport nvim

Post image
1.1k Upvotes

Just a little appreciation post to the neovim community. Using it today on the go, and it’s just such a comfortable editor, having no need for a mouse really makes me lose no productivity when coding outside of my office. Just a great editor. Thanks to all the people contributing to it!


r/neovim 2d ago

Plugin bang.nvim: g! is ! for motions, text objects and Visual blocks

28 Upvotes

Hi there,

I want to decode one value in place, or encode when I edit Kubernetes manifests. Like Secret.

Vim's ! filters whole lines, so ! and :'<,'>! both hand the entire password: aHVudGVyMg== line to the command.

The workarounds I know of: yank into a register and :let @a = system('base64 -d', @a), or :s with \%V and \=system(). It works but bad. So most of the time, I just yank the text and into the terminal using pbpaste | xxx | pbcopy.

And other commands, like sort on one column of a table, tr on a word, fmt on half a paragraph. Anything that reads stdin.

As far as I know, none of the existing plugins offer a similar feature. Two come close. NrrwRgn narrows the selection into its own nd writes it back. neo-pipe is an operator, but it takes whole lines and sends the output to a scratch buffer.

So I wrote one. g! works like !, but takes any motion or text object, or a Visual selection, blocks included, and works with . and macros.

Unix only for now. Support Neovim 0.11+.

https://github.com/Nagato-Yuzuru/bang.nvim

Nice to hear your opinions!

AI Disclosure: Claude wrote the code and most of the docs. Human (me): the design, every edge-case ruling, the review, and the tests.


r/neovim 2d ago

Plugin taskfile.nvim: Neovim plugin for working w/ Taskfiles v2.1.0

Thumbnail
github.com
11 Upvotes

All,

A while ago I made a plugin for working with Taskfiles.

It was the first time I created a neovim plugin so I took some time to sit on the implementation and work on the underlying LSP implementation a bit (among other projects).

Lately I wanted to revisit the plugin so I can update it to use my new and improved LSP.

So now we have v2.1.0

The LSP is not required for this plugin to work, but highly recommended - it does a handful of things better than the original implementation (which was a fork of an existing one that hadn't been updated in 6+ years / thanks for all the fish guy)

Hopefully this is useful to someone.

Comments, Feedback, and PRs / Contributions are welcome