{ pkgs, config, lib, ... }: let inherit (lib) mkIf mkEnableOption getExe; cfg = config.editor.helix; in { options = { editor.helix.enable = mkEnableOption "enable helix editor"; }; config = mkIf cfg.enable { programs.helix = { enable = true; # vim-like editor in rust defaultEditor = true; settings = { editor = { bufferline = "multiple"; cursorline = true; inline-diagnostics.cursor-line = "warning"; line-number = "relative"; lsp = { display-messages = true; display-inlay-hints = true; }; cursor-shape = { insert = "bar"; normal = "block"; select = "underline"; }; statusline = { left = ["mode" "spinner" "version-control"]; center = ["file-name"]; right = ["diagnostics" "selections" "position" "file-encoding" "file-line-ending" "file-type"]; separator = "|"; }; soft-wrap = { enable = true; max-wrap = 25; max-indent-retain = 0; wrap-indicator = ""; }; }; keys = { insert.C-c = "normal_mode"; normal = { esc = ["collapse_selection" "keep_primary_selection"]; space = { space = "file_picker"; w = ":w"; q = ":q"; x = ":x"; n = ":n"; "," = "goto_previous_buffer"; "." = "goto_next_buffer"; l = ":reflow"; }; }; }; }; languages = { language-server = { # markdown-oxide.command = getExe pkgs.markdown-oxide; # nixd.command = getExe pkgs.nixd; # pyright = { # command = getExe pkgs.pyright; # args = ["-"]; # }; # rust-analyzer.command = getExe pkgs.rust-analyzer; # texlab.command = getExe pkgs.texlab; bash-language-server = { command = getExe pkgs.bash-language-server; environment = { "SHELLCHECK_PATH" = getExe pkgs.shellcheck; "SHFMT_PATH" = getExe pkgs.shfmt; }; }; clangd.command = "${pkgs.clang-tools}/bin/clangd"; fsac = { command = getExe pkgs.fsautocomplete; config = { # editor.formatOnSave = true; AutomaticWorkspaceInit = true; FSharp.ExternalAutocomplete = true; FSharp.linting.fsharplint.enabled = true; FSharp.linting.fsharplint.configFile = "fsharplint.json"; FSharp.formatting.fantomas.enabled = true; }; }; nil = { command = getExe pkgs.nil; config = { formatting.command = [(getExe pkgs.alejandra)]; }; }; ruff = { command = getExe pkgs.ruff; args = ["server"]; }; tinymist.command = getExe pkgs.tinymist; vscode-json-language-server.command = getExe pkgs.nodePackages.vscode-json-languageserver; yaml-language-server.command = getExe pkgs.yaml-language-server; zk = { command = getExe pkgs.zk; args = ["lsp"]; }; }; language = [ { name = "nix"; auto-format = true; language-servers = ["nil"]; } { name = "typst"; auto-format = true; formatter.command = getExe pkgs.typstyle; language-servers = ["tinymist"]; } { name = "markdown"; # auto-format = true; language-servers = ["zk" "markdown-oxide"]; } { name = "c"; auto-format = true; # formatter.command = "${pkgs.clang-tools}/bin/clang-format"; } { name = "cpp"; auto-format = true; # formatter.command = "${pkgs.clang-tools}/bin/clang-format"; } { name = "fsharp"; auto-format = true; language-servers = ["fsac"]; scope = "source.fs"; roots = ["fsproj" "sln" ".git"]; } # { # name = "rust"; # auto-format = true; # language-servers = ["rust-analyzer"]; # formatter.command = getExe pkgs.rustfmt; # } { name = "json"; auto-format = true; formatter.command = getExe pkgs.jq; language-servers = ["vscode-json-language-server"]; } { name = "yaml"; auto-format = true; formatter.command = getExe pkgs.yamlfmt; formatter.args = ["-"]; language-servers = ["yaml-language-server"]; } { name = "bash"; auto-format = true; # formatter.command = getExe pkgs.shfmt; # formatter.args = ["-"]; } { name = "python"; auto-format = true; language-servers = [ { name = "ruff"; # only-features = ["format" "diagnostics"]; } # { # name = "pyright"; # except-features = ["format" "diagnostics"]; # } ]; } ]; }; }; }; }