diff --git a/extra.nix b/extra.nix index 55a2f6a..e80abaa 100644 --- a/extra.nix +++ b/extra.nix @@ -33,6 +33,7 @@ inputs: let nvimCodeActionMenu.enable = true; trouble.enable = true; lspSignature.enable = true; + elixir.enable = isMaximal; rust.enable = isMaximal; python = isMaximal; clang.enable = isMaximal; diff --git a/flake.lock b/flake.lock index baa79ca..3680042 100644 --- a/flake.lock +++ b/flake.lock @@ -321,6 +321,38 @@ "type": "github" } }, + "elixir-ls": { + "flake": false, + "locked": { + "lastModified": 1681462421, + "narHash": "sha256-pIwZFiCLJ0f7OXi1iTza04KSn7rpFpvUsNYrFh0FoEM=", + "owner": "elixir-lsp", + "repo": "elixir-ls", + "rev": "85cfc5604edeadb0a6a683c41abff60a0c959de7", + "type": "github" + }, + "original": { + "owner": "elixir-lsp", + "repo": "elixir-ls", + "type": "github" + } + }, + "elixir-tools": { + "flake": false, + "locked": { + "lastModified": 1681453321, + "narHash": "sha256-7QgWrdq4p5t8WVnFhL5P948JFPR0i2C06kisxl30D2U=", + "owner": "elixir-tools", + "repo": "elixir-tools.nvim", + "rev": "8ccb696c048eca667486ee005f4386c0db8c5e14", + "type": "github" + }, + "original": { + "owner": "elixir-tools", + "repo": "elixir-tools.nvim", + "type": "github" + } + }, "fidget-nvim": { "flake": false, "locked": { @@ -1319,6 +1351,8 @@ "dashboard-nvim": "dashboard-nvim", "diffview-nvim": "diffview-nvim", "dressing-nvim": "dressing-nvim", + "elixir-ls": "elixir-ls", + "elixir-tools": "elixir-tools", "fidget-nvim": "fidget-nvim", "flake-parts": "flake-parts", "flake-utils": "flake-utils", diff --git a/flake.nix b/flake.nix index ea6eaac..da89f51 100644 --- a/flake.nix +++ b/flake.nix @@ -92,22 +92,27 @@ url = "github:neovim/nvim-lspconfig"; flake = false; }; + lspsaga = { url = "github:tami5/lspsaga.nvim"; flake = false; }; + lspkind = { url = "github:onsails/lspkind-nvim"; flake = false; }; + trouble = { url = "github:folke/trouble.nvim"; flake = false; }; + nvim-treesitter-context = { url = "github:lewis6991/nvim-treesitter-context"; flake = false; }; + nvim-lightbulb = { url = "github:kosayoda/nvim-lightbulb"; flake = false; @@ -117,18 +122,22 @@ url = "github:weilbith/nvim-code-action-menu"; flake = false; }; + lsp-signature = { url = "github:ray-x/lsp_signature.nvim"; flake = false; }; + null-ls = { url = "github:jose-elias-alvarez/null-ls.nvim"; flake = false; }; + sqls-nvim = { url = "github:nanotee/sqls.nvim"; flake = false; }; + rust-tools = { url = "github:simrat39/rust-tools.nvim"; flake = false; @@ -139,6 +148,16 @@ flake = false; }; + elixir-ls = { + url = "github:elixir-lsp/elixir-ls"; + flake = false; + }; + + elixir-tools = { + url = "github:elixir-tools/elixir-tools.nvim"; + flake = false; + }; + # Copying/Registers registers = { url = "github:tversteeg/registers.nvim"; diff --git a/lib/types/plugins.nix b/lib/types/plugins.nix index 3ff9dd1..2c1aaa9 100644 --- a/lib/types/plugins.nix +++ b/lib/types/plugins.nix @@ -79,6 +79,8 @@ with lib; let "vim-repeat" "smartcolumn" "project-nvim" + "elixir-ls" + "elixir-tools" ]; # You can either use the name of the plugin or a package. pluginsType = with types; diff --git a/modules/lsp/config.nix b/modules/lsp/config.nix index 581556e..6a6810c 100644 --- a/modules/lsp/config.nix +++ b/modules/lsp/config.nix @@ -19,25 +19,20 @@ in { [ "nvim-lspconfig" "null-ls" - ( - if (config.vim.autocomplete.enable && (config.vim.autocomplete.type == "nvim-cmp")) - then "cmp-nvim-lsp" - else null - ) - ( - if cfg.sql - then "sqls-nvim" - else null - ) ] - ++ ( - if cfg.rust.enable - then [ - "crates-nvim" - "rust-tools" - ] - else [] - ); + ++ optionals (cfg.rust.enable) [ + "crates-nvim" + "rust-tools" + ] + ++ optionals (cfg.elixir.enable) [ + "elixir-ls" + ] + ++ optionals ((config.vim.autocomplete.enable) && (config.vim.autocomplete.type == "nvim-cmp")) [ + "cmp-nvim-lsp" + ] + ++ optionals (cfg.sql) [ + "sqls-nvim" + ]; vim.configRC.lsp = nvim.dag.entryAnywhere '' ${ @@ -346,6 +341,13 @@ in { cmd = { "${pkgs.nodePackages.typescript-language-server}/bin/typescript-language-server", "--stdio" } } ''} + + ${writeIf cfg.elixir.enable '' + lspconfig.elixirls.setup { + cmd = { "${lib.getExe pkgs.elixir-ls}" }, + on_attach = on_attach + } + ''} ''; } ); diff --git a/modules/lsp/default.nix b/modules/lsp/default.nix index db4f027..cb88e3d 100644 --- a/modules/lsp/default.nix +++ b/modules/lsp/default.nix @@ -11,7 +11,8 @@ ./lsp-signature ./lightbulb - # flutter-tools - ./flutter-tools-nvim + # language specific modules + ./flutter-tools-nvim # dart & flutter + ./elixir # elixir ]; } diff --git a/modules/lsp/elixir/config.nix b/modules/lsp/elixir/config.nix new file mode 100644 index 0000000..1b1e2a5 --- /dev/null +++ b/modules/lsp/elixir/config.nix @@ -0,0 +1,67 @@ +{ + config, + lib, + pkgs, + ... +}: +with lib; +with builtins; let + cfg = config.vim.lsp.elixir; +in { + config = mkIf (cfg.enable) { + vim.startPlugins = [ + "elixir-tools" + "plenary-nvim" + ]; + + vim.luaConfigRC.elixir-tools = nvim.dag.entryAnywhere '' + local elixir = require("elixir") + local elixirls = require("elixir.elixirls") + + elixir.setup { + elixirls = { + + + -- alternatively, point to an existing elixir-ls installation (optional) + -- not currently supported by elixirls, but can be a table if you wish to pass other args `{"path/to/elixirls", "--foo"}` + cmd = "${lib.getExe pkgs.elixir-ls}", + + -- default settings, use the `settings` function to override settings + settings = elixirls.settings { + dialyzerEnabled = true, + fetchDeps = false, + enableTestLenses = false, + suggestSpecs = false, + }, + + on_attach = function(client, bufnr) + local map_opts = { buffer = true, noremap = true} + + -- run the codelens under the cursor + vim.keymap.set("n", "r", vim.lsp.codelens.run, map_opts) + -- remove the pipe operator + vim.keymap.set("n", "fp", ":ElixirFromPipe", map_opts) + -- add the pipe operator + vim.keymap.set("n", "tp", ":ElixirToPipe", map_opts) + vim.keymap.set("v", "em", ":ElixirExpandMacro", map_opts) + + -- bindings for standard LSP functions. + vim.keymap.set("n", "df", "lua vim.lsp.buf.format()", map_opts) + vim.keymap.set("n", "gd", "lua vim.diagnostic.open_float()", map_opts) + vim.keymap.set("n", "dt", "lua vim.lsp.buf.definition()", map_opts) + vim.keymap.set("n", "K", "lua vim.lsp.buf.hover()", map_opts) + vim.keymap.set("n", "gD","lua vim.lsp.buf.implementation()", map_opts) + vim.keymap.set("n", "1gD","lua vim.lsp.buf.type_definition()", map_opts) + -- keybinds for fzf-lsp.nvim: https://github.com/gfanto/fzf-lsp.nvim + -- you could also use telescope.nvim: https://github.com/nvim-telescope/telescope.nvim + -- there are also core vim.lsp functions that put the same data in the loclist + vim.keymap.set("n", "gr", ":References", map_opts) + vim.keymap.set("n", "g0", ":DocumentSymbols", map_opts) + vim.keymap.set("n", "gW", ":WorkspaceSymbols", map_opts) + vim.keymap.set("n", "d", ":Diagnostics", map_opts) + end + } + } + ''; + }; +} diff --git a/modules/lsp/elixir/default.nix b/modules/lsp/elixir/default.nix new file mode 100644 index 0000000..b8ea9be --- /dev/null +++ b/modules/lsp/elixir/default.nix @@ -0,0 +1,6 @@ +_: { + imports = [ + ./config.nix + ./elixir-tools.nix + ]; +} diff --git a/modules/lsp/elixir/elixir-tools.nix b/modules/lsp/elixir/elixir-tools.nix new file mode 100644 index 0000000..d3fe1ec --- /dev/null +++ b/modules/lsp/elixir/elixir-tools.nix @@ -0,0 +1,10 @@ +{ + config, + lib, + ... +}: +with lib; +with builtins; { + options.vim.lsp.elixir = { + }; +} diff --git a/modules/lsp/module.nix b/modules/lsp/module.nix index a6b95d9..87df9db 100644 --- a/modules/lsp/module.nix +++ b/modules/lsp/module.nix @@ -65,6 +65,10 @@ in { }; }; + elixir = { + enable = mkEnableOption "Elixir LSP"; + }; + sql = mkEnableOption "SQL Language LSP"; go = mkEnableOption "Go language LSP"; ts = mkEnableOption "TS language LSP"; diff --git a/modules/treesitter/treesitter.nix b/modules/treesitter/treesitter.nix index ab3cea6..550e7fe 100644 --- a/modules/treesitter/treesitter.nix +++ b/modules/treesitter/treesitter.nix @@ -45,6 +45,8 @@ with builtins; { graphql json zig + elixir + heex ] ++ (optional config.vim.notes.orgmode.enable org); # add orgmode grammar if enabled description = ''