My Nvim Configuration
Have a look at my rice how my Linux machine is configured and at my mac-setup how my MBP is configured. My dotfiles are also on GitHub.
More Screenshots
Terminal: alacritty
Font: Jetbrains Mono
Motivation
There are many great Neovim configurations (see Inspiration), that give you a pleasant experience right out of the box, available. However, I am a long time (Neo)Vim user with a specific workflow and needs. Additionally, I do not have any Lua background and was not willing to spent too much time into that. Therefore, it was quite hard for me to customize and strip down the existing configs to my needs especially because the code is quite sophisticated.
I decided to move to my own fresh Lua based Neovim from my good old vimrc trying to accomplish the following principles.
Principles
- Migrate to Lua based alternative plugins respectively use only Lua based plugins (if possible).
- Keep the config as maintainable as possible knowing that this would possibly impact the code quality.
- Modular and meaningful directory structure and file naming.
- Just make it work and not make it beautiful
π . Of course, Neovim itself must look beautiful, but my focus is not on beautiful code or on utilizing all Lua features.
Features
General βοΈ
- Package management and plugin configuration via lazy.nvim
- Mnemonic keyboard mappings inspired by Spacemacs via which-key.nvim; no more than three keystrokes for each keybinding
- Submodes powered by Hydra.nvim
- Complete transformation via noice.nvim
- Fully featured status line via mini.nvim
- Terminal integration via nvim-toggleterm.lua
- Fancy notifications via nvim-notify
- Better writing with ltex-ls
- Dashboard via alpha.nvim with recent files and quick links
- Multiple preconfigured themes like catppuccin, tokyonight, nightfox, and more
- Fast startup < 150 ms
π
π§
Navigation - Telescope.nvim for all your search needs
- Project management with Project.nvim
- File tree navigation/manipulation via neo-tree
- Better Tmux navigation with your home row via Navigator.nvim
- Convenient jumping through windows with nvim-window-picker
π₯οΈ
Coding - Auto completion powered by nvim-cmp
- Built-in LSP configured via nvim-lspconfig, mason, and mason-lspconfig
- Debugging for Go, Python, and Rust via nvim-dap and friends
- Treesitter and Tresitter-textobjects for your syntax needs
- Auto formatting via null-ls.nvim
- Excellent Go support via LSP and go.nvim including sensible keybindings
- Excellent Rust support via LSP and rust-tools.nvim including sensible keybindings
- Always know where you are in your code via nvim-navic
- Git integration via Neogit and gitsigns
- Outlining symbols with symbols-outline.nvim
- Snippets provided by Luasnip and friendly snippets with autocompletion
- Schema integration via LSPs for Kubernetes, package.json, GitHub workflows, gitlab-ci.yml, kustomization.yaml, and more
Try out
If you have Docker on your system you can try out this config via the provided Dockerfile
Build the image
There are some issues with building a multi architecture Docker image via GitHub Action. Until I sorted that out, you can build the Docker image locally on your own
docker build -t nvim .
Just start nvim
docker run --name nvim --rm -it nvim
Mount a local directory (to ~/mount) and start nvim
docker run --name nvim --rm -it -v ${HOME}/tmp:/home/nvim/mount nvim
Start container in bash instead of nvim
docker run --name nvim --rm -it --entrypoint=/bin/bash nvim
Installation
I created an installation script that sets up all required tools on a fresh machine to work with my Neovim config.
For now, it works on Debian/Ubuntu and Arch. MacOS will be added soon.
USE AT YOUR OWN RISK!!
Requirements
There are some tools that are required in order to use some features/plugins:
Tools
- ripgrep
- fd
- fzf
- make and gcc or clang for telescope-fzf-native.nvim
For neo-tree delete functionality:
For Latex functionality:
LSPs, Formatting, Linters, DAP
The following programs should be installed on your system so that the appropriate tools can be installed:
- Go
- Python
- NodeJs > 12
- Cargo
Go
Go related dependencies are managed by go.nvim
and are installed by running :GoInstallBinaries
(when a Go file is loaded). They are installed in your $GOPATH
.
All other
All other dependencies are managed by Mason. Tools are installed by running :MasonToolsInstall
(in vim.fn.std path("data") .. "mason"
). [Mason requirements](https://GitHub.com/William beman/mason.nvim#requirements) must be available on your system.
Bindings
Mode | key | binding |
---|---|---|
n | space | Leader key |
n | <c-h | j | k | l> | Change window focus (including Tmux panes) |
n | <leader>Tab | Switch to previously opened buffer |
n | <Tab> | Switch to next buffer (bnext) |
n | <S-Tab> | Switch to previous buffer (bprevious) |
n | st | Visual selection with Treesitter hint textobject |
v | sa | Add surrounding |
n | sd | Delete surrounding |
n | sr | Replace surrounding |
n | <c-Tab> | Start auto completion (without typing anything) |
n/v | ga | Start mini.align (align text) |
n | gcc | ToggleΒ line comment |
n/v | gc | ToggleΒ line comment (works with movements like gcip ) |
n | s | Jump to character(s) (flash.nvim) |
i/s | <c-j> | Luasnip expand/forward |
i/s | <c-k> | Luasnip backward |
i | <c-h> | Luasnip select choice |
n | <c-n> | Toggleterm (opens/hides a full terminal in Neovim) |
i | <c-l> | Move out of closing brackets |
n | <CR> | Start incremental selection |
v | <Tab> | Increment selection |
v | <S-Tab> | Decrement selection |
n | <c-f> | Search buffer |
i/v/n/s | <c-s> | Save file |
Hit <leader>
to start which-key
which gives you more mappings grouped by topic.
Structure
tree1 .
.
βββ after # file specific settings
βββ init.lua # main entry point
βββ lazy-lock.json # Lockfile for Lazy.nvim
βββ lua/core # lua configuration
βββ snippets # snippets directory (luasnip style)
βββ spell # my spell files linked from another repo
tree1 lua/core
lua/core
βββ autocmd.lua # autocmds for various things
βββ config # configuration folder for plugins
βββ globals.lua # global functions
βββ lazy.lua # Lazy configuration
βββ mappings.lua # key bindings
βββ options.lua # vim options
βββ plugins # plugins and their configuration
βββ settings.lua # user settings to configure
Each plugin to be installed is defined in ./lua/core/plugins/
in a separate file.
User configuration
The intention of my Neovim configuration was never to be a fully customizable "distribution" like LunarVim, SpaceVim, etc. but from time to time I like to change my color scheme and the idea of making this configurable came to my mind. Based upon this idea I implemented some further lightweight configuration options that might be useful.
All options can be found in ./lua/core/settings.lua
.
Adding LSPs
You can add LSPs via lsp_servers
in settings.lua. The server will be installed by Mason und loaded by nvim-lspconfig. If you want to pass settings for the LSP have a look at ./lua/core/plugins/lsp/settings/
how to add settings for specific LSPs.
Remove plugins
You can remove unwanted plugins by just removing the appropriate file in ./lua/core/plugins/
. Lazy will take care of removing the plugin.
Keep in mind that some plugins are configured to work in conjunction with other plugins. For instance, autopairs is configured in ./lua/vim/config/treesitter.lua
. For now there is no logic implemented that cross-checks such dependencies.
Add plugins
If you want to follow my method adding a plugin is straight forward:
Create a file in ./lua/core/plugins/
following the expected format of Lazy.
Open another instance of Neovim (I always try to keep one running instance of Neovim open in case I messed up my config) and run Lazy sync
.