{
  config,
  lib,
  pkgs,
  ...
}:
with lib; let
  cfg = config.local.apps.neovim;
in {
  options.local.apps.neovim = {
    enable = mkEnableOption "Neovim settings";
  };
  config = mkIf cfg.enable {
    programs.neovim = {
      enable = true;
      viAlias = true;
      vimAlias = true;
      defaultEditor = true;

      extraConfig = ''
        set nobackup
        set showmatch               " show matching
        set hlsearch                " highlight search
        set incsearch               " incremental search
        set tabstop=4               " number of columns occupied by a tab
        set softtabstop=4           " see multiple spaces as tabstops so <BS> does the right thing
        set shiftwidth=4            " width for autoindents
        set autoindent              " indent a new line the same amount as the line just typed
        set number                  " add line numbers
        set wildmode=longest,list   " get bash-like tab completions
        set cc=80                   " set an 80 column border for good coding style
        filetype plugin indent on   " allow auto-indenting depending on file type
        syntax on                   " syntax highlighting
        set mouse=a                 " enable mouse click
        set clipboard=unnamedplus   " using system clipboard
        filetype plugin on
        set cursorline              " highlight current cursorline
        set ttyfast                 " Speed up scrolling in Vim
        set noswapfile              " disable creating swap file
      '';

      plugins = with pkgs.vimPlugins; [
        barbar-nvim
        nvim-web-devicons
        vim-nix
        vim-visual-multi
        {
          plugin = nvim-tree-lua;
          type = "lua";
          config = ''
            require("nvim-tree").setup({
              renderer = {
                icons = {
                  show = {
                    file = true,
                    folder = true,
                    folder_arrow = true,
                    git = true,
                  },
                  glyphs = {
                    git = {
                      unstaged = "",
                      staged = "",
                      unmerged = "",
                      renamed = "",
                      untracked = "",
                      deleted = "",
                      ignored = "",
                    },
                  },
                },
              },
              view = {
                width = 30,
                side = 'left',
              },
              sync_root_with_cwd = true, --fix to open cwd with tree
              respect_buf_cwd = true,
              update_cwd = true,
              update_focused_file = {
                enable = true,
                update_cwd = true,
                update_root = true,
              },
            })

            vim.g.nvim_tree_respect_buf_cwd = 1

            -- use g? for bindings help while in tree
          '';
        }
        {
          plugin = gruvbox-nvim;
          type = "lua";
          config = ''
            require("gruvbox").setup({
              contrast = "high",
            })
            vim.o.background = "dark"
            vim.cmd([[colorscheme gruvbox]])
          '';
        }
      ];
    };
    home.sessionVariables = {
      "EDITOR" = mkForce "neovim";
    };
  };
}
