diff --git a/home/modules/zed/default.nix b/home/modules/zed/default.nix index 6393691..2869f97 100644 --- a/home/modules/zed/default.nix +++ b/home/modules/zed/default.nix @@ -7,6 +7,47 @@ }: let cfg = config.programs.zed-editor; + ameba-ls = pkgs.stdenv.mkDerivation rec { + pname = "ameba-ls"; + version = "0.1.0"; + + src = + let + selectSystem = attrs: attrs.${pkgs.stdenv.hostPlatform.system} or (throw "Unsupported system: ${pkgs.stdenv.hostPlatform.system}"); + in + pkgs.fetchurl (selectSystem { + x86_64-linux = { + url = "https://github.com/crystal-lang-tools/ameba-ls/releases/download/v${version}/ameba-ls-${version}-x86_64-linux-musl.tar.gz"; + hash = "sha256-NtqR8NHytuHT1XIhRVvnp7Lo4Ed9UGbISbTn/BfLGA8="; + }; + aarch64-linux = { + url = "https://github.com/crystal-lang-tools/ameba-ls/releases/download/v${version}/ameba-ls-${version}-aarch64-linux-musl.tar.gz"; + hash = "sha256-77iqdaI+Mqivk0/9jkNdGpluDbz297vsY9wzuipcPOU="; + }; + aarch64-darwin = { + url = "https://github.com/crystal-lang-tools/ameba-ls/releases/download/v${version}/ameba-ls-${version}-aarch64-apple-darwin.tar.gz"; + hash = "sha256-tDB+ZjgjlGjNg3DjX09z1dJnqTv9h/1sXiauBj7uHNc="; + }; + }); + + sourceRoot = "."; + + installPhase = '' + runHook preInstall + mkdir -p $out/bin + cp ameba-ls $out/bin/ + chmod +x $out/bin/ameba-ls + runHook postInstall + ''; + + meta = with lib; { + description = "Language server for the Ameba linter for Crystal lang"; + homepage = "https://github.com/crystal-lang-tools/ameba-ls"; + license = licenses.mit; + platforms = [ "x86_64-linux" "aarch64-linux" "aarch64-darwin" ]; + mainProgram = "ameba-ls"; + }; + }; in { options.programs.zed-editor = { @@ -83,6 +124,21 @@ in ]; }; }; + Crystal = { + language_servers = [ + "crystalline" + "ameba-ls" + ]; + formatter.external = { + command = lib.getExe pkgs.crystal; + arguments = [ + "tool" + "format" + "--no-color" + "-" + ]; + }; + }; }; lsp = with pkgs; { nixd.binary.path = lib.getExe nixd; @@ -111,6 +167,7 @@ in inputs.nixpkgs-unstable.legacyPackages.${pkgs.system}.package-version-server; eslint.settings.onIgnoredFiles = "off"; crystalline.binary.path = lib.getExe crystalline; + ameba-ls.binary.path = lib.getExe ameba-ls; rust-analyzer.binary.path = lib.getExe rust-analyzer; }; load_direnv = "shell_hook";