Skip to content

Instantly share code, notes, and snippets.

@elijahmanor
Created March 27, 2023 04:59
Show Gist options
  • Select an option

  • Save elijahmanor/b279553c0132bfad7eae23e34ceb593b to your computer and use it in GitHub Desktop.

Select an option

Save elijahmanor/b279553c0132bfad7eae23e34ceb593b to your computer and use it in GitHub Desktop.
Neovim Switcher
alias nvim-lazy="NVIM_APPNAME=LazyVim nvim"
alias nvim-kick="NVIM_APPNAME=kickstart nvim"
alias nvim-chad="NVIM_APPNAME=NvChad nvim"
alias nvim-astro="NVIM_APPNAME=AstroNvim nvim"
function nvims() {
items=("default" "kickstart" "LazyVim" "NvChad" "AstroNvim")
config=$(printf "%s\n" "${items[@]}" | fzf --prompt=" Neovim Config  " --height=~50% --layout=reverse --border --exit-0)
if [[ -z $config ]]; then
echo "Nothing selected"
return 0
elif [[ $config == "default" ]]; then
config=""
fi
NVIM_APPNAME=$config nvim $@
}
bindkey -s ^a "nvims\n"
@ashishmgofficial
Copy link

I just set the NVIM_APPNAME env variable to the directory name as per the commit. And so I just use the nvims function to set the desired config as environment variable. After this I can just use the regular nvim command to start the neovim in my desired config:

-- .zshrc

export DEFAULT_NVIM=<Your default conf directory within .config>
export NVIM_APPNAME=${DEFAULT_NVIM}

# Function to dynamically find and select Neovim configurations
function nvims() {
  local config_dirs
  config_dirs=$(find -L "${XDG_CONFIG_HOME:-$HOME/.config}" -mindepth 2 -maxdepth 2 -name init.lua -o -name init.vim | awk -F/ '{print $(NF-1)}')
  
  local config
  config=$(printf "%s\n" "default" $config_dirs | fzf --prompt=" Neovim Config  " --height=~50% --layout=reverse --border --exit-0)
  
  if [[ -z $config ]]; then
    echo "Nothing selected"
    return 0
  elif [[ $config == "default" ]]; then
    config=${DEFAULT_NVIM:-""}
  fi
  
  export NVIM_APPNAME=$config
}

You can set the default to your most frequently used

@rafisics
Copy link

bind \ca 'nvims\n'
Pressing ctrl+A shows:

❯ nvims
: command not found

@farawayisland
Copy link

farawayisland commented Nov 17, 2025

I personally prefer to put the default config inside ~/.config/nvim and the other configs inside ~/.config/nvims/<config_or_distro_name> so here's my version of nvims (renamed to nvim_switch_configuration) which combines andyantrim's and mikeslattery's approaches which might be useful for some:

alias nv='nvim'
alias nvs='nvim_switch_configuration'

nvim_switch_configuration () {
  config="$(
    find -L "${XDG_CONFIG_HOME:-$HOME/.config}" -maxdepth 3 -mindepth 2 -name "init.lua" -o -name "init.vim" \
    | awk -F"${XDG_CONFIG_HOME:-$HOME/.config}/" '{sub(/nvims\//, ""); sub(/nvim/, "default"); sub(/\/init.*/, ""); print $NF}' \
    | fzf --border --exit-0 --height=~50% --layout=reverse --prompt ' Neovim configuration switcher  ')"
  if [[ -z $config ]]; then
    printf "%s\n" "No configuration selected."
    return 0
  elif [[ $config == "default" ]]; then
    config=""
  else
    config="nvims/$config"
    alias nv="NVIM_APPNAME=$config nvim"
  fi
  NVIM_APPNAME=$config nvim $@
}

Here's also a version using fd instead of find:

alias nv='nvim'
alias nvs='nvim_switch_configuration'

nvim_switch_configuration () {
  config="$(
    fd -d 3 -L --min-depth 2 --regex "init\.(lua|vim)" -p "${XDG_CONFIG_HOME:-$HOME/.config}" \
    | awk -F"${XDG_CONFIG_HOME:-$HOME/.config}/" '{sub(/nvims\//, ""); sub(/nvim/, "default"); sub(/\/init.*/, ""); print $NF}' \
    | fzf --border --exit-0 --height=~50% --layout=reverse --prompt ' Neovim configuration switcher  ')"
  if [[ -z $config ]]; then
    printf "%s\n" "No configuration selected."
    return 0
  elif [[ $config == "default" ]]; then
    config=""
  else
    config="nvims/$config"
    alias nv="NVIM_APPNAME=$config nvim"
  fi
  NVIM_APPNAME=$config nvim $@
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment