{
  config,
  lib,
  ...
}: let
  cfg = config.soispha.programs.nvim;
in {
  config.home-manager.users.soispha = lib.mkIf cfg.enable {
    programs.nixvim = {
      autoGroups = {
        cursor_off = {clear = true;};
        colorcolumn_toggle = {clear = true;};
        numbertoggle = {clear = true;};
        coloroverride = {clear = true;};
        highlight_on_yank = {clear = true;};
        create_dir = {clear = true;};
      };

      autoCmd = [
        {
          # Taken from: https://github.com/jghauser/mkdir.nvim
          event = ["BufWritePre"];
          pattern = ["*"];
          callback = {
            __raw = ''
              function()
                -- Get current filename, get full path (:p) and leave only the head (:h)
                local dir = vim.fn.expand('<afile>:p:h')

                -- This handles URLs using netrw. See ':help netrw-transparent' for details.
                if dir:find('%l+://') == 1 then
                  return
                end

                if vim.fn.isdirectory(dir) == 0 then
                  vim.fn.mkdir(dir, 'p')
                end
              end
            '';
          };
          group = "create_dir";
          desc = "Create the directory of the target file on write";
        }
        {
          event = ["TextYankPost"];
          pattern = ["*"];
          callback = {
            __raw = ''
              function()
                vim.highlight.on_yank()
              end
            '';
          };
          group = "highlight_on_yank";
          desc = "Highlight the yanked text";
        }
        {
          event = ["BufWritePre"];
          pattern = ["*"];
          command = ''
            ks | if search("\\s\\+$", 'n') != 0 | :%s/\s\+$// | endif | 's
          '';
          desc = ''
            Remove trailing whitespace on safe
            :%s/\s\+$\| \+\ze\t//g >> For trailing spaces and spaces before tabstops
          '';
        }

        {
          event = ["WinLeave"];
          pattern = ["*"];
          command = "set nocursorline"; # TODO: possible also nocursorcolumn
          group = "cursor_off";
          desc = "Display cursorline and cursorcolumn ONLY in active window.";
        }
        {
          event = ["WinEnter"];
          pattern = ["*"];
          command = "set cursorline"; # TODO: possible also cursorcolumn
          group = "cursor_off";
          desc = "Display cursorline and cursorcolumn ONLY in active window.";
        }

        {
          event = ["InsertEnter"];
          pattern = ["*"];
          command = "set colorcolumn=${config.home-manager.users.soispha.programs.nixvim.opts.colorcolumn}";
          group = "colorcolumn_toggle";
          desc = "Only activate the colorcolumn when focused";
        }
        {
          event = ["BufLeave" "FocusLost" "InsertLeave" "WinLeave"];
          pattern = ["*"];
          command = "set colorcolumn=0";
          group = "colorcolumn_toggle";
          desc = "Only activate the colorcolumn when focused";
        }

        {
          event = ["BufEnter" "FocusGained" "InsertLeave" "WinEnter"];
          pattern = ["*"];
          command = "if &nu && mode() != \"i\" | set rnu   | endif";
          group = "numbertoggle";
          desc = "Change line numbers, when not focused";
        }
        {
          event = ["BufLeave" "FocusLost" "InsertEnter" "WinLeave"];
          pattern = ["*"];
          command = "if &nu | set nornu | endif";
          group = "numbertoggle";
          desc = "Change line numbers, when not focused";
        }

        {
          # Override LineNr
          event = ["ColorScheme"];
          pattern = ["*"];
          command = "highlight LineNr  ctermfg=DarkGrey guifg=DarkGrey ";
          group = "coloroverride";
          desc = "Changes Line number colors";
        }
        {
          # Override CursorLineNr
          event = ["ColorScheme"];
          pattern = ["*"];
          command = "highlight CursorLineNr  ctermfg=White guifg=White ";
          group = "coloroverride";
          desc = "Changes Line number colors";
        }
      ];
    };
  };
}