Which Neovim configuration distro do you use/recommend? (Poll)

Posting this to see if we can make things easier for people to get into Neovim. If you use Neovim and have a favourite distro please let us know!

  • You can only pick one - if you like more than one, please pick your favourite and tell us about the other/s in the thread!
  • If you use a custom configuration, please skip the poll (unless one of them is your favourite, in which case please vote for it) and if possible please let us know about your configuration in the thread and why you prefer it over a released distro (perhaps you could you share your configuration too?) If your own configuration heavily borrows from one of those listed below, you could, if you think it deserves it, place a vote for it.

Thanks!

What is your preferred Neovim distro?
  • Abstract
  • AstroNvim
  • CodeArt
  • CosmicNvim
  • Ecovim
  • kickstart
  • LazyVim
  • LunarVim
  • LVIM IDE
  • mini.nvim
  • NormalNvim
  • NvChad
  • NvPak
  • SpaceVim
  • Other publicly released distro - please say in thread!
0 voters

See post below for detailsā€¦

This post is a wiki - please feel free to add/edit as needed (please follow the same format/alphabetical order).

Abstract - https://abstract-ide.github.io/site/

Abstract, The NeoVim configuration to achieve the power of Modern IDE

AstroNvim - https://astronvim.com/

Configure less, code more
AstroNvim is an aesthetically pleasing and feature-rich Neovim configuration that focuses on extensibility and usability.

CodeArt - https://github.com/artart222/CodeArt

Use NeoVim as general purpose IDE

CosmicNvim - https://cosmicnvim.vercel.app

CosmicNvim is a lightweight and opinionated Neovim config for web development, specifically designed to provide a :dizzy: COSMIC programming experience!

Ecovim - https://github.com/ecosse3/nvim

A non-minimal Neovim config built to work most efficiently with Frontend Development

kickstart - https://github.com/nvim-lua/kickstart.nvim

A launch point for your personal nvim configuration

LazyVim - http://www.lazyvim.org

LazyVim is a Neovim setup powered by :zzz: lazy.nvim to make it easy to customize and extend your config.

:sparkles: Features
:fire: Transform your Neovim into a full-fledged IDE
:zzz: Easily customize and extend your config with lazy.nvim
:rocket: Blazingly fast
:broom: Sane default settings for options, autocmds, and keymaps
:package: Comes with a wealth of plugins pre-configured and ready to use

LunarVim - https://www.lunarvim.org

An IDE layer for Neovim with sane defaults. Completely free and community driven.

LVIM IDE - https://github.com/lvim-tech/lvim

LVIM IDE is a modular Neovim configuration written in LUA with full customization. LSP support for 60+ languages. Debug support for c, cpp, dart, elixir, go, haskell, java, javascript/typescript, lua, php, python, ruby, rust.

mini.nvim - https://github.com/echasnovski/mini.nvim

Library of 40+ independent Lua modules improving overall Neovim (version 0.8 and higher) experience with minimal effort

NormalNvim - https://normalnvim.github.io

A normal Neovim distribution

Full Asynchronous Support
Plugins are loaded asynchronously using Lazy, making the most of available resources.

IDE Ready
Save weeks of tweaking Neovim by starting from a well tested environment.

Compiler
Press F6 to run your code, no matter the language.

You get what you see
No hidden complexity. All you see is all there is to it.

NvChad - https://nvchad.com

Enhance your Neovim workflow
Blazing fast Neovim config providing solid defaults and a beautiful UI

NvPak - https://github.com/EvolveBeyond/NvPak

Maybe you have tried to configure Neovim multiple times over the past few years. Neovim has undergone many changes, and every time, you had to follow new defaults to reach the minimum configuration and start writing your configuration for Neovim. The goal of the nvpak project is to provide these defaults.

Now you can configure only what you need by forking nvpak without any add-ons. Please note that nvpak is not a Neovim configuration and not in competition with other configurations such as NvChad or LazyVim. If you need a complete Neovim setup without any configuration, then this GitHub repository is not for you.

SpaceVim - https://spacevim.org

Forum Thread: SpaceVim - like SpaceMacs but for Vim!

SpaceVim is a modular configuration of Vim and Neovim. Itā€™s inspired by spacemacs. It manages collections of plugins in layers, which help to collect related packages together to provide features. This approach helps keep the configuration organized and reduces overhead for the user by keeping them from having to think about what packages to install.

Vim :wink:

2 Likes

Why?

Iā€™d be curious to know why people are sticking with Vim over Neovim (and also why people may prefer not to use a distro).

1 Like

I started with LazyVim, but have diverged quite a bit over time. The pre-packaged distros are a great way to get started.

2 Likes

Im lazy so thatā€™s why :person_shrugging:t5:

2 Likes

+

Nice! I am actually leaning towards LazyVim myself! :blush:

Thatā€™s a huge part of the reason for posting this thread Andy - in fact thatā€™s why Iā€™ve posted the recent polls in this series as I am sure I am not the only one who wants to try something a little more ā€˜advancedā€™ and where seeing what other people are using or prefer (or recommend) would make that jump easier and in a better informed way - I think these polls are great for that! :smiley:

Iā€™m fairly new to LazyVim, as Iā€™m switching back and forth with Sublime Text. The only thing that bothers me (as a begginer in LazyVim/NVim) is that when I open a 5K LoC OpenAPI spec file, scrolling seems worse on nvim than Sublime Text. Maybe I misconfigured my setup :person_shrugging:t5:

2 Likes

Could you link to a sample file so others can try to reproduce the issue Jaeyson?

My first thoughts would be to try another terminal emulator to see if that helps? Hopefully someone more experienced might be able to helpā€¦

1 Like

My family uses a custom neovim config, based on Kickstarter. Weā€™re slowly improving it as we learn more. Distros are great for inspiration, but I strongly encourage users to create their own config, and Kickstart is a good place to start from. Hereā€™s a short summary of why I recommend this approach:

  • Vim is very unintuative, and itā€™s not just the modal editing. Itā€™s very unix/posix oriented, and most distros tend to make it behave like VSCode/IDEs, which removes your incentive to learn the Vim way of doing things. Whenever something feels hard to do and you want a plugin to make it more like your old editor, try hard to find out if itā€™s an XY problem. As a bonus, getting better at Vim often makes you better at the CLI in general.
  • Distros tend to install a ton of plugins, and also have a lot of duplication to satisfy different user preferences. This increases the surface area of learning from Vim itself to also all the plugins and how they are configured by that distro. You also have to learn how to override/extend the distroā€™s config. Itā€™s also harder to find free keybindings when you want to add/customize to your liking.
  • Distros also tie you to the probability of breaking changes, both to config and keybindings.
  • Neovim configured via Lua is actually very simple. I think it gets a reputation for being hard/time-consuming to configure simply because most try to force it into a full-blown IDE that behaves exactly like more familiar editors.

In general, I find it far easier to start with something very minimal and well thought-out (Kickstart), and then add/modify it at the speed of your learning. But I also run Arch and my first Linux was Gentoo, soā€¦ take that into consideration. :sweat_smile:

8 Likes

If you start nvim without your configuration and without plugins do you experience the same problem? nvim -u NONE

Iā€™m guessing itā€™s a plugin or syntax highlighting causing problems

3 Likes

Why people would not use a distro is the more interesting question for me. My answer is just that I love configuring and learning everything I can about my text editorā€”and maybe you will too! Iā€™ve used Vim and only Vim for the past 15 years, I know a lot about it, and Iā€™m very, very fast with it, even without LSP (though I have used LSP). I understand every line of my rather large vimrc and I write my own plugins. And contrary to popular belief, I do all of this in my hobby time, not ā€œinstead of getting things doneā€ (though Iā€™m not going to try and tell you Iā€™ve never edited my vimrc on the clock before).

If you are interested in becoming really proficient in Vim, as @AndyL said, distros are a great starting point. If you just want to learn Vim motions and be done with it, Vim distros are great! Most other editors have a plugin for Vim motions if thatā€™s what you want, too.

As for Vim vs NeoVim, I donā€™t want to start a flamewar. I did use NeoVim for a couple of months back when it had async and Vim didnā€™t. When Vim got async, I switched back. These days, NeoVim doesnā€™t offer anything compelling enough for me to switch. The only thing that makes me feel I should be using NeoVim is that it is the clear preference of the Elixir community. Otherwise, Iā€™ll fully admit there is an emotional aspect to it and that the post-Bram Vim team is more interesting to me than the NeoVim community. Also, when it comes to scripting Vim, Vim9script is a much nicer language than Luaā€”as an Elixirist: DSLs FTW :wink:

4 Likes

With Neovim you can experiment with multiple distros and custom configurations using the NVIM_APPNAME environment variable. Hereā€™s an explanation, courtesy of AnthropicAI:

NVIM_APPNAME is an environment variable in Neovim that defines the application name used for storing configuration files and runtime data. By default, itā€™s set to ā€œnvimā€, which is why Neovim typically looks for its configuration in ~/.config/nvim/ on Unix-like systems.

You can customize NVIM_APPNAME to maintain multiple separate Neovim configurations. For example, if you set:

export NVIM_APPNAME=custom_nvim

Neovim will then look for its configuration in ~/.config/custom_nvim/ instead of the default location. This is particularly useful for:

  1. Testing different configurations without affecting your main setup
  2. Maintaining separate configurations for different use cases (e.g., one for coding, another for writing)
  3. Trying out plugins or settings in isolation

For instance, you could start Neovim with a different configuration by running:

NVIM_APPNAME=test_config nvim

This feature was introduced to make it easier to manage multiple Neovim configurations without having to use symlinks or complex file management solutions.

4 Likes

I believe itā€™s NVIM_APPNAME, at least thatā€™s what Iā€™ve used

2 Likes

Yes, I changed NV_APPNAME to NVIM_APPNAME - thanks for the correction.

1 Like

Using Ghostty:

  • v1.0.1
  • Build 8696
  • Commit 3f7c3afa

And NVim:

  • v0.10.3
  • LuaJIT 2.1.1734355927
-- ~/.config/nvim/init.lua
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not (vim.uv or vim.loop).fs_stat(lazypath) then
  local lazyrepo = "https://github.com/folke/lazy.nvim.git"
  local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath })
  if vim.v.shell_error ~= 0 then
    vim.api.nvim_echo({
      { "Failed to clone lazy.nvim:\n", "ErrorMsg" },
      { out, "WarningMsg" },
      { "\nPress any key to exit..." },
    }, true, {})
    vim.fn.getchar()
    os.exit(1)
  end
end
vim.opt.rtp:prepend(lazypath)

-- Make sure to setup `mapleader` and `maplocalleader` before
-- loading lazy.nvim so that mappings are correct.
-- This is also a good place to setup other settings (vim.opt)
vim.g.mapleader = " "
vim.g.maplocalleader = ","

-- Setup lazy.nvim
require("lazy").setup({
  spec = {
    -- add your plugins here
    { "catppuccin/nvim", name = "catppuccin", priority = 1000 },
    {
      "nvim-neo-tree/neo-tree.nvim",
      branch = "v3.x",
      dependencies = {
        "nvim-lua/plenary.nvim",
        "nvim-tree/nvim-web-devicons", -- not strictly required, but recommended
        "MunifTanjim/nui.nvim",
        -- "3rd/image.nvim", -- Optional image support in preview window: See `# Preview Mode` for more information
      }
    },
    {
      "folke/which-key.nvim",
      event = "VeryLazy",
      opts = {
        -- your configuration comes here
        -- or leave it empty to use the default settings
        -- refer to the configuration section below
      },
      keys = {
        {
          "<leader>?",
          function()
            require("which-key").show({ global = false })
          end,
          desc = "Buffer Local Keymaps (which-key)",
        },
      },
    },
    {
      "folke/flash.nvim",
      event = "VeryLazy",
      ---@type Flash.Config
      opts = {},
      -- stylua: ignore
      keys = {
        { "s", mode = { "n", "x", "o" }, function() require("flash").jump() end, desc = "Flash" },
        { "S", mode = { "n", "x", "o" }, function() require("flash").treesitter() end, desc = "Flash Treesitter" },
        { "r", mode = "o", function() require("flash").remote() end, desc = "Remote Flash" },
        { "R", mode = { "o", "x" }, function() require("flash").treesitter_search() end, desc = "Treesitter Search" },
        { "<c-s>", mode = { "c" }, function() require("flash").toggle() end, desc = "Toggle Flash Search" },
      },
    },
    {
      'windwp/nvim-autopairs',
      event = "InsertEnter",
      config = true
      -- use opts = {} for passing setup options
      -- this is equivalent to setup({}) function
    },
    {
      "lewis6991/gitsigns.nvim",
      config = function()
        require("gitsigns").setup({})
      end
    },
    {
      "kylechui/nvim-surround",
      version = "*", -- Use for stability; omit to use `main` branch for the latest features
      event = "VeryLazy",
      config = function()
        require("nvim-surround").setup({})
      end
    },
    {
      "lewis6991/hover.nvim",
      config = function()
        require("hover").setup({
          init = function()
            -- Require providers
            require("hover.providers.lsp")
            require('hover.providers.gh')
            require('hover.providers.gh_user')
            -- require('hover.providers.jira')
            -- require('hover.providers.dap')
            require('hover.providers.fold_preview')
            require('hover.providers.diagnostic')
            require('hover.providers.man')
            require('hover.providers.dictionary')
          end,
          preview_opts = {
            border = 'single'
          },
          -- Whether the contents of a currently open hover window should be moved
          -- to a :h preview-window when pressing the hover keymap.
          preview_window = false,
          title = true,
          mouse_providers = {
            'LSP'
          },
          mouse_delay = 300
        })

        -- Setup keymaps
        vim.keymap.set("n", "K", require("hover").hover, {desc = "hover.nvim"})
        vim.keymap.set("n", "gK", require("hover").hover_select, {desc = "hover.nvim (select)"})
        vim.keymap.set("n", "<C-p>", function() require("hover").hover_switch("previous") end, {desc = "hover.nvim (previous source)"})
        vim.keymap.set("n", "<C-n>", function() require("hover").hover_switch("next") end, {desc = "hover.nvim (next source)"})

        -- Mouse support
        -- vim.keymap.set('n', '<MouseMove>', require('hover').hover_mouse, { desc = "hover.nvim (mouse)" })
        -- vim.o.mousemoveevent = true
      end
    },
    {
      "neovim/nvim-lspconfig",
      config = function()
        local lspconfig = require("lspconfig")
        local capabilities = require("cmp_nvim_lsp").default_capabilities()

        lspconfig.elixirls.setup({
          -- you need to specify the executable command mannualy for elixir-ls
          cmd = { "elixir-ls" },
          -- set default capabilities for cmp lsp completion source
          capabilities = capabilities,
          filetypes = { "elixir", "eelixir", "heex", "surface", "exs" },
        })
        lspconfig.tailwindcss.setup({
          init_options = {
            userLanguages = {
              elixir = "html-eex",
              eelixir = "html-eex",
              heex = "html-eex",
            },
          },
          validate = true
        })
      end,
    },
    {
      "nvim-treesitter/nvim-treesitter",
      config = function()
        require("nvim-treesitter.configs").setup({
          ensure_installed = { "elixir", "eex", "heex", "erlang", "html" },
          highlight = { enable = true },
          indent = { enable = true },
        })
      end,
    },
    {
      "hrsh7th/nvim-cmp",
      dependencies = {
        -- install different completion source
        "hrsh7th/cmp-nvim-lsp",
        "hrsh7th/cmp-buffer",
        "hrsh7th/cmp-path",
      },
      config = function()
        local cmp_autopairs = require('nvim-autopairs.completion.cmp')
        local cmp = require("cmp")
        cmp.setup({
          -- add different completion source
          sources = cmp.config.sources({
            { name = "nvim_lsp" },
            { name = "buffer" },
            { name = "path" },
          }),
          -- using default mapping preset
          mapping = cmp.mapping.preset.insert({
            ["<C-Space>"] = cmp.mapping.complete(),
            ["<CR>"] = cmp.mapping.confirm({ select = true }),
          }),
          snippet = {
            -- you must specify a snippet engine
            expand = function(args)
              -- using neovim v0.10 native snippet feature
              -- you can also use other snippet engines
              vim.snippet.expand(args.body)
            end,
          },
        })
        cmp.event:on(
          'confirm_done',
          cmp_autopairs.on_confirm_done()
        )
      end,
    },
  },
  -- Configure any other settings here. See the documentation for more details.
  -- colorscheme that will be used when installing plugins.
  install = { colorscheme = { "catppuccin" } },
  -- automatically check for plugin updates
  checker = { enabled = true },
})

function custom_fold_text()
  local line = vim.fn.getline(vim.v.foldstart)
  local line_count = vim.v.foldend - vim.v.foldstart + 1
  return " āš” " .. line .. ": " .. line_count .. " lines"
end

vim.opt.encoding = "utf-8"
vim.cmd.colorscheme "catppuccin-frappe"
vim.opt.updatetime = 100
vim.opt.number = true
vim.opt.expandtab = true
vim.opt.shiftwidth = 2
vim.opt.softtabstop = 2
vim.opt.listchars = {
  tab = "tab",
  trail = "Ā·",
  nbsp = "Ā·"
}
vim.opt.list = true
vim.opt.foldcolumn = "0"
vim.opt.foldlevelstart = 99
vim.opt.foldnestmax = 4
vim.opt.foldmethod = "expr"
vim.opt.foldexpr = "v:lua.vim.treesitter.foldexpr()"
vim.opt.foldenable = true
vim.opt.foldtext = "v:lua.custom_fold_text()"

vim.api.nvim_create_autocmd({"BufWinLeave"}, {
  pattern = {"*.*"},
  desc = "save view (folds), when closing file",
  command = "mkview",
})

vim.api.nvim_create_autocmd({"BufWinEnter"}, {
  pattern = {"*.*"},
  desc = "load view (folds), when opening file",
  command = "silent! loadview"
})

vim.keymap.set("n", "<D-/>", "gcc", { remap = true })
vim.keymap.set("v", "<D-/>", "gc", { remap = true })

vim.keymap.set("n", "<space>fb", ":Telescope file_browser<CR>")
vim.g.python3_host_prog = "/opt/homebrew/bin/python3"
vim.api.nvim_set_option("clipboard", "unnamedplus")
vim.api.nvim_create_autocmd("FileType", {
  pattern = "elixir",
  callback = function()
    vim.opt_local.commentstring = "# %s"
  end,
})
3 Likes

Try what Jacob suggested Jaeyson:

Ridiculously fast when using nvim -u NONE path/to/file!!!

How do I troubleshoot? introduce plugin one by one?

1 Like

Things like LSP/treesitter/highlighting can negatively affect performance on large files. There are plugins that automatically turn slow features off for large files, but I canā€™t recommend one as I havenā€™t looked into it yet.

3 Likes

Removed neo-tree nvim and feels like snappy now, not sure if thats the workaround that I needed.

1 Like