diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index bf9e506b..b89b5fec 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -6,6 +6,7 @@ ./basedpyright.nix ./bash-language-server.nix ./deno.nix + ./elixir-ls.nix ./elm-language-server.nix ./emmet-ls.nix ./fsautocomplete.nix diff --git a/modules/plugins/lsp/presets/elixir-ls.nix b/modules/plugins/lsp/presets/elixir-ls.nix new file mode 100644 index 00000000..e1749f25 --- /dev/null +++ b/modules/plugins/lsp/presets/elixir-ls.nix @@ -0,0 +1,34 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + inherit (lib.generators) mkLuaInline; + + cfg = config.vim.lsp.presets.elixir-ls; +in { + options.vim.lsp.presets.elixir-ls = { + enable = mkEnableOption "the Elixir Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.elixir-ls = { + enable = true; + cmd = [(getExe pkgs.elixir-ls)]; + root_dir = mkLuaInline '' + function(bufnr, on_dir) + local fname = vim.api.nvim_buf_get_name(bufnr) + local matches = vim.fs.find({ 'mix.exs' }, { upward = true, limit = 2, path = fname }) + local child_or_root_path, maybe_umbrella_path = unpack(matches) + local root_dir = vim.fs.dirname(maybe_umbrella_path or child_or_root_path) + + on_dir(root_dir) + end + ''; + }; + }; +}