{ config, pkgs, lib, ... }: let inherit (lib) mkIf mkEnableOption mkForce getExe; cfg = config.editor.zed; in { options = { editor.zed.enable = mkEnableOption "enable zed editor"; }; config = mkIf cfg.enable { programs.zed-editor = { enable = true; extensions = [ "bash" "fsharp" "justfile" "nix" "typst" ]; userSettings = { vim_mode = true; ui_font_size = mkForce 16; buffer_font_size = mkForce 16; # features = {inline_completion_provider = "none";}; auto_update = false; languages = { "FSharp" = { language-servers = [ "fsautocomplete" ]; }; "Nix" = { language-servers = [ "nil" ]; # formatter = { # external.command = getExe pkgs.alejandra; # }; }; # "Rust" = { # formatter = { # external = { # command = getExe pkgs.rustfmt; # arguments = ["--edition" "2021"]; # }; # }; # }; "typst" = { language-servers = ["tinymist"]; format_on_save = "on"; # formatter = { # external = { # command = getExe pkgs.typstyle; # arguments = ["-i" "{buffer_path}"]; # }; # }; }; "Python" = { format_on_save = "on"; formatter = [ { language_server = { name = "ruff"; }; } ]; language_servers = ["ruff"]; }; }; lsp = { bash-language-server = { binary = { path = getExe pkgs.bash-language-server; env = { "SHELLCHECK_PATH" = getExe pkgs.shellcheck; "SHFMT_PATH" = getExe pkgs.shfmt; }; }; }; fsautocomplete = { binary = { path = getExe pkgs.fsautocomplete; }; settings = { AutomaticWorkspaceInit = true; FSharp.ExternalAutocomplete = true; FSharp.linting.fsharplint.enabled = true; FSharp.linting.fsharplint.configFile = "fsharplint.json"; FSharp.formatting.fantomas.enabled = true; }; }; clangd = { binary = { arguments = []; path = "${pkgs.clang-tools}/bin/clangd"; }; }; # rust-analyzer = { # binary = { # arguments = []; # path = getExe pkgs.rust-analyzer; # }; # }; ruff = { binary = { arguments = []; path = getExe pkgs.ruff; }; }; # nixd = { # binary = { # arguments = []; # path = getExe pkgs.nixd; # }; # initialization_options.formatting.command = [(getExe pkgs.alejandra)]; # }; nil = { binary = { arguments = []; path = getExe pkgs.nil; }; settings.formatting.command = [(getExe pkgs.alejandra)]; }; # texlab = { # binary = { # arguments = []; # path = getExe pkgs.texlab; # }; # }; tinymist = { binary = { arguments = []; path = getExe pkgs.tinymist; }; }; vscode-json-language-server = { binary = { path = getExe pkgs.nodePackages.vscode-json-languageserver; }; }; yaml-language-server = { binary = { path = getExe pkgs.yaml-language-server; }; }; }; telemetry = { diagnostics = false; metrics = false; }; }; }; }; }