{
  pkgs,
  lib,
  config,
  ...
}:
let
  inherit (config.my) accent theme editor;
  inherit (theme) color;
in
{
  config = {
    programs.helix = {
      enable = true;
      settings = {
        theme = "my-theme";
        editor = {
          cursorline = true;
          cursorcolumn = true;
          auto-save = true;
          line-number = "relative";
          whitespace.render = "all";
          whitespace.characters = {
            space = "·";
            tab = "→";
            newline = "¬";
          };
          lsp = {
            display-messages = true;
            display-inlay-hints = true;
          };
          cursor-shape = {
            insert = "bar";
          };
          indent-guides.render = true;
          soft-wrap.enable = true;
        };
        keys.normal = {
          # basic movement
          n = "move_char_left";
          e = "move_line_down";
          i = "move_line_up";
          o = "move_char_right";
          # search
          l = "search_next";
          L = "search_prev";
          # edits
          s = "insert_mode";
          # open newline
          h = "open_below";
          H = "open_above";
          # selections
          k = "select_regex";
          K = "split_selection";
          "C-k" = "split_selection_on_newline";
          # goto mode
          g.n = "goto_line_start";
          g.o = "goto_line_end";
        };
        keys.select = {
          # basic movement
          n = "extend_char_left";
          e = "extend_line_down";
          i = "extend_line_up";
          o = "extend_char_right";
          # search
          l = "extend_search_next";
          L = "extend_search_prev";
          # edits
          s = "insert_mode";
          # open newline
          h = "open_below";
          H = "open_above";
          # selections
          k = "select_regex";
          K = "split_selection";
          "C-k" = "split_selection_on_newline";
          # goto mode
          g.n = "goto_line_start";
          g.o = "goto_line_end";
        };
        keys.insert = {
          "A-k" = "normal_mode";
        };
      };
      languages.language = [
        {
          name = "nix";
          auto-format = true;
          formatter.command = "nixpkgs-fmt";
        }
        {
          name = "rust";
          auto-format = true;
        }
      ];

      languages.language-server = {
        intelephense.config.intelephense.format.braces = "k&r";
      };

      themes = {
        my-theme = {
          "inherits" = "gruvbox";
          "ui.menu" = "none";
          "ui.background" = {
            bg = "none";
          };
          "ui.virtual.whitespace" = color.nontxt;
          "ui.cursor.primary" = {
            fg = accent.fg;
            bg = accent.color;
          };
          "ui.cursorline.primary" = {
            bg = color.bg_dark;
          };
          "ui.cursorcolumn.primary" = {
            modifiers = [ "bold" ];
          };
          "ui.cursorline" = {
            bg = "none";
          };
          "ui.cursorcolumn" = {
            bg = "none";
          };
          "ui.linenr.selected" = {
            fg = color.txt;
          };

          function = color.normal.orange;
          module = color.normal.brown;
          palette = {
            yellow0 = color.normal.yellow;
            yellow1 = color.normal.yellow;
            green0 = color.normal.green;
            green1 = color.normal.green;
            purple0 = color.normal.magenta;
            purple1 = color.normal.magenta;

            fg0 = color.txt;
            fg1 = color.txt;
            fg2 = color.txt;
            fg3 = color.txt;
            fg4 = color.txt;
          };
        };
      };
    };
    home.sessionVariables = lib.mkIf (editor == "helix") { EDITOR = "hx"; };
  };
}
