aboutsummaryrefslogtreecommitdiffstats
path: root/lsp/elixirls.lua
diff options
context:
space:
mode:
authorLorenzo Bellina <59364991+TheRealLorenz@users.noreply.github.com>2025-04-13 00:15:43 +0200
committerGitHub <noreply@github.com>2025-04-12 15:15:43 -0700
commit81a570f58b2113cc2d538efae743ad38d6ab564f (patch)
tree74f9691bbb1b303cd7cfaab7b543f82cb0dc6b46 /lsp/elixirls.lua
parentrefactor: replace vim.loop with vim.uv #3703 (diff)
downloadnvim-lspconfig-81a570f58b2113cc2d538efae743ad38d6ab564f.tar
nvim-lspconfig-81a570f58b2113cc2d538efae743ad38d6ab564f.tar.gz
nvim-lspconfig-81a570f58b2113cc2d538efae743ad38d6ab564f.tar.bz2
nvim-lspconfig-81a570f58b2113cc2d538efae743ad38d6ab564f.tar.lz
nvim-lspconfig-81a570f58b2113cc2d538efae743ad38d6ab564f.tar.xz
nvim-lspconfig-81a570f58b2113cc2d538efae743ad38d6ab564f.tar.zst
nvim-lspconfig-81a570f58b2113cc2d538efae743ad38d6ab564f.zip
feat: migrate to vim.lsp.config #3659
Problem: Nvim 0.11 has vim.lsp.config, which mostly replaces the legacy nvim-lspconfig "framework". Solution: Migrate all configs to `lsp/*` variants. The old configs in `lua/lspconfig/` are "frozen". The new configs include these changes: - `commands` field became raw calls to `vim.api.nvim_buf_create_user_command` inside `on_attach`. - `root_dir` became: - `root_markers` whenever the file list was simple didn't need to mach `*` - if the logic was complicated, or needed to match something like '\*.c', it was defined as a vim.lsp.Config `root_dir` callback. - `on_config_change` became `before_init`. I don't actually know if this is the correct approach, but looking around the documentation of `nvim-lspconfig` a saw that it was defined as the function that gets called as soon as the config have `root_dir`, and so I thought `before_init` might be the closest alternative. - `docs.description` became a luadoc `@brief` docstring. - `single_file_support = false`? Co-authored-by: Aliou Diallo <aliou@users.noreply.github.com> Co-authored-by: Justin M. Keyes <justinkz@gmail.com>
Diffstat (limited to 'lsp/elixirls.lua')
-rw-r--r--lsp/elixirls.lua38
1 files changed, 38 insertions, 0 deletions
diff --git a/lsp/elixirls.lua b/lsp/elixirls.lua
new file mode 100644
index 00000000..372e7de6
--- /dev/null
+++ b/lsp/elixirls.lua
@@ -0,0 +1,38 @@
+---@brief
+---
+---https://github.com/elixir-lsp/elixir-ls
+--
+-- `elixir-ls` can be installed by following the instructions [here](https://github.com/elixir-lsp/elixir-ls#building-and-running).
+--
+-- 1. Download the zip from https://github.com/elixir-lsp/elixir-ls/releases/latest/
+-- 2. Unzip it and make it executable.
+-- ```bash
+-- unzip elixir-ls.zip -d /path/to/elixir-ls
+-- # Unix
+-- chmod +x /path/to/elixir-ls/language_server.sh
+-- ```
+--
+-- **By default, elixir-ls doesn't have a `cmd` set.** This is because nvim-lspconfig does not make assumptions about your path. You must add the following to your init.vim or init.lua to set `cmd` to the absolute path ($HOME and ~ are not expanded) of your unzipped elixir-ls.
+--
+-- ```lua
+-- vim.lsp.config('elixirls', {
+-- -- Unix
+-- cmd = { "/path/to/elixir-ls/language_server.sh" };
+-- -- Windows
+-- cmd = { "/path/to/elixir-ls/language_server.bat" };
+-- ...
+-- })
+-- ```
+--
+-- 'root_dir' is chosen like this: if two or more directories containing `mix.exs` were found when searching directories upward, the second one (higher up) is chosen, with the assumption that it is the root of an umbrella app. Otherwise the directory containing the single mix.exs that was found is chosen.
+return {
+ filetypes = { 'elixir', 'eelixir', 'heex', 'surface' },
+ root_dir = 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,
+}