Skip to main content

Switching Configs in Neovim

A ratchet set in its case, showing signs of age and rust.
Photo by Elena Mozhvilo

Learning how to configure Neovim can be overwhelming. One way to get started is to install a few pre-built configurations (like LazyVim, NvChad, AstroNvim, LunarVim or the official Neovim Kickstart) and see what you like.

Most installation instructions will tell you to replace everything in your ~/.config/nvim directory with the new configuration. But once you do, you lose the ability to launch Neovim with your previous config.

With that approach, you can only have one Neovim config installed at a time.

But what if you want to compare two configs? Or maintain different configs for different purposes (e.g. one for work and one for personal projects)?

Install each config in its own directory

To be able to use more than one config, you’ll need to make a couple changes to your setup:

  1. Instead of installing a new configuration in ~/.config/nvim, install it in a custom ~/.config subdirectory
  2. Each time you open Neovim, specify which config you want by setting the NVIM_APPNAME environment variable in your launch command

For example, assuming you’ve installed LazyVim in ~/.config/nvim-lazyvim, you’d launch it with this command:

$ NVIM_APPNAME=nvim-lazyvim nvim

Neovim uses NVIM_APPNAME to determine which config directory to load. If you don’t include it (or set it to an invalid value), Neovim will use the default config in ~/.config/nvim.

Switching configs using alias, select or fzf

Lets assume your ~/.config directory includes these subdirectories:

~/.config
β”œβ”€β”€ nvim-astrovim
β”‚   └── init.lua
β”œβ”€β”€ nvim-kickstart
β”‚   β”œβ”€β”€ init.lua
β”‚   └── lua
β”‚       β”œβ”€β”€ custom
β”‚       └── kickstart
β”œβ”€β”€ nvim-lazyvim
β”‚   β”œβ”€β”€ init.lua
β”‚   └── lua
β”‚       β”œβ”€β”€ config
β”‚       └── plugins
β”œβ”€β”€ nvim-lunarvim
β”‚   └── config.lua
└── nvim-nvchad
β”‚   β”œβ”€β”€ init.lua
β”‚   └── lua
β”‚       β”œβ”€β”€ core
β”‚       β”œβ”€β”€ custom
β”‚       └── plugins
└── nvim

To quickly open Neovim using each config, you could create an alias for each launch command:

~/.zshrc
alias v='nvim' # default Neovim config
alias vz='NVIM_APPNAME=nvim-lazyvim nvim' # LazyVim
alias vc='NVIM_APPNAME=nvim-nvchad nvim' # NvChad
alias vk='NVIM_APPNAME=nvim-kickstart nvim' # Kickstart
alias va='NVIM_APPNAME=nvim-astrovim nvim' # AstroVim
alias vl='NVIM_APPNAME=nvim-lunarvim nvim' # LunarVim

Or use select to list your configs so you can choose one:

~/.zshrc
vv() {
  select config in lazyvim kickstart nvchad astrovim lunarvim
  do NVIM_APPNAME=nvim-$config nvim $@; break; done
}

Which would produce a menu like this:

A terminal after running the command "vv", showing the options "1) lazyvim 2) kickstart 3) nvchad 4) astrovim 5) lunarvim".

Or you could get fancy and use a fuzzy finder like fzf to do the same thing:

~/.zshrc
vv() {
  # Assumes all configs exist in directories named ~/.config/nvim-*
  local config=$(fd --max-depth 1 --glob 'nvim-*' ~/.config | fzf --prompt="Neovim Configs > " --height=~50% --layout=reverse --border --exit-0)
 
  # If I exit fzf without selecting a config, don't open Neovim
  [[ -z $config ]] && echo "No config selected" && return
 
  # Open Neovim with the selected config
  NVIM_APPNAME=$(basename $config) nvim $@
}
Feel free to use 'find' or 'ls' instead of 'fd'.

Here’s what that fzf menu would look like:

A terminal after running the command "vv", showing a menu with the options "nvim-lazyvim", "nvim-kickstart", "nvim-nvchad", "nvim-astrovim" and "nvim-lunarvim".

Conclusion

Configuring Neovim can be daunting, but being able to install a few configs and compare them is a great way to gather inspiration for your own custom config.

Good luck!

Further Reading