1
0
Fork
You've already forked neovim
0
My Neovim configuration with native pack manager and LSP support. Requires Neovim >= 0.12
  • Lua 100%
2026年05月24日 13:59:25 -03:00
after/ftplugin First commit 2026年04月01日 20:02:35 -03:00
img First commit 2026年04月01日 20:02:35 -03:00
lsp First commit 2026年04月01日 20:02:35 -03:00
lua Added new colorscheme, J now joints line without moving 2026年05月24日 13:59:25 -03:00
snippets First commit 2026年04月01日 20:02:35 -03:00
.luacheckrc First commit 2026年04月01日 20:02:35 -03:00
init.lua Removed module w/ manual commands to update plugins. 2026年04月07日 17:32:13 -03:00
keybindings.md Updated keybinding documentation 2026年04月11日 17:22:02 -03:00
nvim-pack-lock.json Added new colorscheme, J now joints line without moving 2026年05月24日 13:59:25 -03:00
README.md updated section on how to update plugins manually 2026年04月07日 17:37:11 -03:00
stylua.toml First commit 2026年04月01日 20:02:35 -03:00

Summary

Introduction

Running Neovim 0.12

Features

Plugin management

LSP setup

Keybindings


Introduction

This Neovim configuration was designed to create a highly customizable Integrated Development Environment (IDE).

This config adopts the new Neovim's native package management, which was introduced in version 0.12.

Running Neovim 0.12

To get the Neovim 0.12 you will need to compile from source the nightly branch.

If you just want to try out this config and want to keep your stable version of Neovim, then copy the executable to some other place than your orignal (stable) version. For instance, install it in /opt/neovim12/bin/

git clone https://github.com/neovim/neovim
cd neovim
git checkout nightly
make CMAKE_BUILD_TYPE=RelWithDebInfo CMAKE_INSTALL_PREFIX=/opt/neovim12/
sudo make install

Next, copy this repo to you $HOME/.config/ folder. Remember to use a folder name different from nvim, so you can preserve your own config.

git clone https://codeberg.org/selan/nvim-12 $HOME/.config/neoslim

Finally run the Neovim 0.12 passing the path to the config, or better still, create an alias:

alias nv="NVIM_APPNAME=neoslim /opt/neovim12/bin/nvim"

Where neoslim is the folder where this config lives (e.g. $HOME/.config/neoslim), and you installed nvim in /opt/neovim12/bin.

Note

Adjuste your alias accordingly!

Now run nv file.cpp to test the config.

Features

Here some screenshots of the config in action with the nigthfox colorscheme, nordfox variation.

Some of the features displayed in this screenshots are:

  • A file explorer and manipulator (mini.files), with preview of files, similar to oil.nvim;

screen 01

  • A top bar that shows open buffers as tabs (bufferline);
  • A temporary popup window at the bottom displaying keybindings as you type (which-key);

screen 02

  • A statusbar located at the bottom of the screen (mini.statusline); and,
  • The LSP + code completion in action (blink).

screen 03

Plugin management

In this config I don't use lazy.vim (or any other plugin manager), lspconfig (for the configuration of the LSP engine), or mason-lspconfig (to set up server configs based on the packages installed).

Note

There is nothing wrong with theses excellent plugins, lazy.vim, lspconfig, or mason-lspconfig.
I moved away from them just to experiment with the Neovim's native way of managing plugins and setting up LSP servers.

All plugins will be stored in the vim-pack directory: $XDG_DATA_HOME/nvim/site/pack/core/opt.
They are all installed and managed with the command vim.pack.

Plugin update

To update the plugins, please read the instructions here.

The commands you will probably need are:

  • : checkhealth vim.pack: to check the current plugins' state.
  • : lua vim.pack.update(): to get a list of all the updates that might be applied to the installed plugins.
  • : lua vim.pack.del({'mason.nvim'}): to remove, for example, the plugin mason.nvim.

Folders organization

.
├── init.lua --> The entry point of the configuration
├── lsp --> LSP server configs
│  ├── bashls.lua --> LSP for bash script
│  ├── clangd.lua --> LSP for C/C++ language
│  ├── lua_ls.lua --> LSP for Lua language
│  ├── marksman.lua --> LSP for markdown files
│  ├── jdtls.lua --> LSP for Java language
│  ├── texlab.lua --> LSP for Latex language
│  ├── rnix.lua --> LSP for Nix language
│  └── rust_analyzer.lua --> LSP for rust language
├── lua
│  ├── config
│  │  ├── autocommands.lua --> Autocommands definitions
│  │  ├── enable_lsp.lua --> Manages which LSP servers to enable
│  │  ├── options.lua --> Neovim global options
│  │  └── plugin_updater.lua --> Functions and commands to update plugins
│  └── plugins
│  ├── colorschemes --> Folder with colorscheme plugins
│  ├── init.lua --> requires the plugins
│  ├── interface --> Folder with GUI-related plugins
│  ├── misc --> Folder with complementary plugins
│  ├── OFF --> Folder to store plugins you want to (temporarily) disable
│  └── programming --> Folder with programming workflow plugins
└── README.md

Plugin loading structure

I created a lua file for each plugin I want to add, with the following overall structure:

-- [1]: Add the package URL.
vim.pack.add({{src=plugin-URL}})
-- [2]: Define any local functions, if needed.
local function foo_bar(params)
 -- function implemention
end
-- [3]: Setup the plugin.
require("package-name").setup({
 -- configuration goes here
})
-- [4]: Define any related keybindings, if needed.
vim.keymap.set("n", "K", function() ... end, {desc="description"})
-- [5]: Set any options related to the plugin, if needed.
vim.o.something = value
-- [6]: Define autocommands, when required by the plugin
vim.api.nvim_create_autocmd({ "BufEnter", "BufWritePost", "InsertLeave", "TextChanged" }, {
 group = package_autogroup,
 callback = function()
 -- some action goes here
 end,
})

Plugins list

I tried to include the minimal list of plugins to get my programming workflow running. I have organized my plugins by 3 categories:

  • interface: plugins that modify the GUI;
  • programming: plugins that improves my programming experience; and,
  • miscellaneous: plugins that improves my workflow but do not fit cleanly in the two previous categories.
  • OFF: disabled plugins you might find useful.

I left in the OFF folder some plugins I had installed in previous iteration of this config, in case you want to try those yourself. The plugins I moved there I marked with (*).

Interface customization

These are plugins that modify the user interaction or improve the graphical user interface (GUI).

auto-session

  • Description: Automatically reopen the files and windows you had open. It's like you never left!

  • Source: rmagatti/auto-session

better-escape (*)

If you want to remove this plugin and keep the same functionality, create the following keybindings:

-- Escape from Insertion into Normal mode.
vim.keymap.set("i", "jj", "<Esc>", { noremap = true, silent = true })
vim.keymap.set("i", "jk", "<Esc>", { noremap = true, silent = true })
-- If you are a fast typist, then set:
vim.opt.timeoutlen = 300

bufdelete

  • Description: Adds new commands to delete a buffer without messing up your window layout.

  • Source: famiu/bufdelete.nvim

If you want to remove this plugin, replace the command Bdelete by the native bdelete for the keybinding <leader>c, which closes the current buffer. This keybinding is defined in the which-key.lua file.

bufferline

  • Description: Creates and manages GUI tabs associated with open buffers.

  • Dependency: this plugins calls Bdelete command to close a tab. This command is defined by the bufdelete plugin.

  • Source: akinsho/bufferline.nvim

devicons

mini

  • Description: Library of 40+ independent Lua modules improving Neovim (version 0.9 and higher) experience with minimal effort. Only the modules you select are downloaded.

  • Modules used:

    • mini-ai: extend and create a/i textobjects.
    • mini-comment: comment lines.
    • mini-files: navigate and manipulate file system.
    • mini-icons: additional icon provider.
    • mini-pairs: enable autopairs.
    • mini-statusline: simple and functional statusline.
    • mini-surround: surround objects actions.
  • Source: echasnovski/mini.nvim

snacks

  • Description: A collection of small plugins, similar to mini.

  • Modules used:

    • image: image viewer inside Neovim.
    • input: better vim.ui.input.
    • notifier: pretty vim.notify.
    • picker: collection of pickers for selecting items.
    • quickfile: render file as quick as possible while loading plugins.
    • rename: LSP-integrated file renaming with support for plugin mini-files.
    • statuscolumn: pretty status column.
  • Source: folke/snacks.nvim

vim-tmux-navigatior

  • Description: When combined with a set of tmux key bindings, the plugin will allow you to navigate seamlessly between vim and tmux splits using a consistent set of hotkeys. Requires tmux v1.8 or higher.

  • Source: christoomey/vim-tmux-navigator

If you don't use tmux then remove this plugin. If you DO use tmux, you may want to checkout my tmux config.

which-key

Have a good memory? Then you don't need this plugin!!!

But, remember to move the keybindings set there to another file, say ./lua/config/mappings.lua.

Programming Workflow

The following plugins help to improve the way we interact with Neovim while programming.
For instance, they offer better autocomplete, listing of code components (classes, methods, functions), code formatting and linting, display git-related indicators, etc.

aerial

If you want to remove this plugin, create a new keybinding that call one of the snack's picker.

vim.keymap.set("n", "<leader>ls", function()
 Snacks.picker.lsp_symbols({
 layout = "sidebar",
 -- make the picker start in normal mode, rather than insert mode.
 on_show = function()
 vim.cmd.stopinsert()
 end,
 })
end, { desc = "List [S]ymbols" })
  • Description: A completion plugin with support for LSPs, cmdline, signature help, and snippets. It uses an optional custom fuzzy matcher for typo resistance. It provides extensibility via pluggable sources (LSP, buffer, snippets, etc), component based rendering and dynamic configuration. It replaces the native nvim ominicompletion mechanism (C-x C-o).

  • Source: Saghen/blink.cmp

If you don't want to use this plugin, remember to activate the native nvim ominicompletion mechanism (C-x C-o), so that you can have autocomplete suggestions.

Change this autocommand inside lua.config.enable_lsp.lua.

vim.api.nvim_create_autocmd({ "LspAttach" }, {
 callback = function(ev)
 setup_keymaps(ev)
 -- =========================================================================
 -- Use the code below to activate omni-complete (C-X,C-O)
 -- =========================================================================
 local client = vim.lsp.get_client_by_id(ev.data.client_id)
 if client and client:supports_method("textDocument/completion") then
 -- Optional: trigger autocompletion on EVERY keypress. May be slow!
 -- local chars = {}; for i = 32, 126 do table.insert(chars, string.char(i)) end
 -- client.server_capabilities.completionProvider.triggerCharacters = chars
 vim.lsp.completion.enable(true, client.id, ev.buf, {
 autotrigger = true,
 convert = function(item)
 return { abbr = item.label:gsub('%b()', '') }
 end,
 })
 end
 -- =========================================================================
 end,

colorizer

conform

  • Description: Conform is a lightweight and powerful formatter plugin for Neovim that supports range formatting, embedded code blocks, and custom formatters. It hooks into the LSP handler and fixes bad-behaving LSP formatters.

  • Source:https://github.com/stevearc/conform.nvim.

If you remove this plugin, remember to set the formatting keybindings to call the LSP formatting service with vim.lsp.buf.format().

gitsigns

  • Description: gitsigns provides fast git decorations. It offers signs for added, removed, and changed lines, asynchronous operations, navigation between hunks, stage and reset hunks, preview diffs, customizable settings, status bar integration, and more.

  • Source: https://github.com/lewis6991/gitsigns.nvim.

mason

  • Description: Portable package manager for Neovim that runs everywhere Neovim runs. Easily install and manage LSP servers, DAP servers, linters, and formatters.

  • Source: https://github.com/mason-org/mason.nvim.

This is an optional plugin you may skip, if installing external programs manually.

nvim-lint (*)

nvim-treesitter

  • Description: The goal of nvim-treesitter is both to provide a simple and easy way to use the interface for tree-sitter in Neovim and to provide some basic functionality such as highlighting based on it, as well as indentation and incremental selection.

    Tree-sitter is a parser generator tool (external program) and an incremental parsing library. It can build a concrete syntax tree for a source file and efficiently update the syntax tree as the source file is edited.

  • Source: https://github.com/nvim-treesitter/nvim-treesitter.

nvim-ufo

todo-comments

This is an optional plugin.

trouble (*)

  • Description: A pretty list for showing diagnostics, references, telescope results, quickfix and location lists to help you solve all the trouble your code is causing.

  • Source: https://github.com/folke/trouble.nvim.

If you want to remove this plugin, create a new keybinding that call one of the snack's picker.

vim.keymap.set("n", "<leader>le", function()
 Snacks.picker.diagnostics_buffer({
 layout = "sidebar",
 on_show = function()
 vim.cmd.stopinsert()
 end,
 })
end, { desc = "List [e]rros (diagnostics) of current buffer" })
vim.keymap.set("n", "<leader>lE", function()
 Snacks.picker.diagnostics({
 layout = "sidebar",
 on_show = function()
 vim.cmd.stopinsert()
 end,
 })
end, { desc = "List [E]rrors in all files" })

After invoking this picker, just press <C-q> to transfer the diagnostics to a quickfix. To navigate the components of a quickfix use ]q (next item) or [q (prev item).

Miscellaneous

These are plugins that add extra features to Neovim.

markdown-preview

render-markdown (*)

LSP setup

The LSP setup was done following the approach introduced in Neovim 0.11.
This means I am not using traditional external plugins related with LSP, such as nvim-lspconfig or mason-lspconfig.

Next you will find the steps to setup LSP.

1. Install the servers you want

Make sure the LSP servers you need are installed and available in your system, as external stand-alone programs.

You may install your LSP server via the main package manager of your system (eg. pacman, apt-install, etc.) or you may choose to install mason, which is kind of a package manager that runs inside Neovim.

If you have installed mason, then you may install the LSP servers of this config with:

:MasonInstall clangd
:MasonInstall jtdls
:MasonInstall prettier
:MasonInstall latexindent
:MasonInstall rust-analyzer
:MasonInstall stylua
:MasonInstall texlab
:MasonInstall rnix-lsp

2. Create the servers configuration

You need to provide a configuration for each server you want to enable. In a nutshell, the server configuration controls how to establish the connection between the LSP client (Neovim) and the LSP server (clangd, for instance), and defines the exchange capabilities (of communication) they support.

One way of providing LSP server configuration, described in the Neovim documentation, is to create a lsp folder anywhere in the runtimepath. Inside this folder we add a file for each server we want to configure. You may copy the default configuration file directly from nvim-lspconfig and modify it to suit your needs.

Note

The name of the LSP server configuration must match the server name you have installed. For instance, C++ LSP server is called clangd, and the server configuration file must, therefore, be named clandg.lua.

In my Neovim config I've setup seven LSP servers. Here is how the lsp folder was organized:

├── lsp
│  ├── bashls.lua --> LSP for bash script
│  ├── clangd.lua --> LSP for C/C++ language
│  ├── jdtls.lua --> LSP for Java language
│  ├── rust_analyzer.lua --> LSP for rust language
│  ├── lua_ls.lua --> LSP for Lua language
│  ├── texlab.lua --> LSP for Latex language
│  ├── nixd.lua --> LSP for nix language
│  └── marksman.lua --> LSP for markdown files

3. Enable the servers

The last step is to enable the servers you've configured.

Here is a summary of all steps together:

  1. [recommended] Setup keybindings associated with native LSP vim commands.
  2. [optional] Configure the way diagnostics are displayed.
  3. [optional] Customize the behavior of any LSP handlers1 .
  4. [required] Enable the servers.

I did all these steps in the file lua.config.enable_lsp.lua.

That's it!
Your LSP configuration should be good to go.

Tip

To check whether the LSP server has been successfully assigned to the client, run the following command:

:checkhealth lsp

Look for the session vim.lsp: Active Clients.

To learn more on how to setup LSP, access the excellent Neovim documentation on LSP.

Keybindings

You may have a look at some of the keybindings defined in this config here.


  1. LSP handlers are functions that handle lsp-responses to requests made by Nvim to the server. ↩︎