{
  pkgs,
  lib,
  config,
  inputs,
  ...
}: {
  options.mods.terminal.development.enable =
    lib.mkEnableOption "enables cli editor";

  imports = [inputs.nvf.homeManagerModules.default];

  config = lib.mkIf config.mods.terminal.development.enable {
    home.packages = with pkgs; [
      # Nix
      nil

      # Rust
      rust-analyzer
      lldb_18

      # Shaders
      glsl_analyzer
      wgsl-analyzer

      # Python
      black
    ];

    programs.direnv = {
      enable = true;
      nix-direnv.enable = true;
      enableZshIntegration = lib.mkIf config.mods.terminal.zsh.enable true;
    };

    home.sessionVariables.EDITOR = "hx";
    programs.zsh.sessionVariables.EDITOR = "hx";

    programs.helix = {
      enable = true;
      package = pkgs.evil-helix;

      settings = {
        keys.normal = {
          "esc" = ["collapse_selection" "keep_primary_selection"];
          "Z" = {
            "Q" = ":quit!";
            "Z" = ":write-quit!";
          };
          "V" = ["select_mode" "extend_to_line_bounds"];
        };
        editor = {
          line-number = "relative";
          completion-replace = true;
          bufferline = "always";
          rulers = [80];
          soft-wrap.enable = true;
          indent-guides.render = true;
          cursor-shape = {
            normal = "block";
            insert = "bar";
            select = "underline";
          };
        };
      };

      languages.language-server = {
        glsl.command = "${pkgs.glsl_analyzer}/bin/glsl_analyzer";
        wgsl.command = "${pkgs.wgsl-analyzer}/bin/wgsl-analyzer";
      };

      languages.language = [
        {
          name = "nix";
          auto-format = true;
          formatter.command = "${pkgs.nixfmt-classic}/bin/nixfmt";
        }
        {
          name = "rust";
          auto-format = true;
          formatter.command = "rustfmt";
        }
        {
          name = "glsl";
          language-servers = ["glsl"];
        }
        {
          name = "wgsl";
          language-servers = ["wgsl"];
        }
        {
          name = "python";
          auto-format = true;
          formatter = {
            command = "${pkgs.black}/bin/black";
            args = ["-" "--quiet" "--line-length=79"];
          };
        }
      ];
    };

    programs.nvf = {
      enable = true;
      settings = {
        vim = {
          viAlias = false;
          vimAlias = true;
          lsp = {
            enable = true;
            formatOnSave = true;
          };

          languages = {
            enableFormat = true;
            enableTreesitter = true;
            enableExtraDiagnostics = true;

            nix.enable = true;
            nix.lsp.server = "nixd";

            markdown.enable = true;
            bash.enable = true;
            rust.enable = true;
            rust.crates.enable = true;

            python.enable = true;
            python.lsp.server = "pyright";
            # python.lsp.package = [(lib.getExe pkgs.ruff) "server"];
            python.format.type = "ruff";

            clang = {
              enable = true;
              cHeader = true;
            };
          };

          statusline.lualine.enable = true;
          telescope.enable = true;
          autocomplete.nvim-cmp.enable = true;
          autopairs.nvim-autopairs.enable = true;
          tabline.nvimBufferline.enable = true;
          treesitter.context.enable = true;
          dashboard.alpha.enable = true;
          comments.comment-nvim.enable = true;

          options = {
            tabstop = 2;
            shiftwidth = 0;
          };

          notes = {
            # orgmode.enable = true;
            todo-comments.enable = true;
          };

          spellcheck = {enable = true;};

          binds = {
            whichKey.enable = true;
            cheatsheet.enable = true;
          };

          git = {
            enable = true;
            gitsigns.enable = true;
            gitsigns.codeActions.enable =
              false; # throws an annoying debug message
          };

          terminal = {
            toggleterm = {
              enable = true;
              lazygit.enable = true;
            };
          };

          utility = {
            diffview-nvim.enable = true;
            surround.enable = true;
            # multicursors.enable = true;
            undotree.enable = true;

            motion = {
              hop.enable = true;
              leap.enable = true;
            };
          };

          visuals = {
            nvim-web-devicons.enable = true;
            nvim-cursorline.enable = true;
            cinnamon-nvim.enable = true;
            fidget-nvim.enable = true;

            highlight-undo.enable = true;
            indent-blankline.enable = true;
          };

          ui = {
            borders.enable = true;
            noice.enable = true;
            colorizer.enable = true;
            illuminate.enable = true;
            smartcolumn.enable = true;
            fastaction.enable = true;
          };
        };
      };
    };
  };
}
