HOME TOC REPO
1   =================================================================================
2   MASON AND LSPCONFIG                                             nixCats.LSPs
3                                                             nixCats.LSPs.mason
4   
5   This is a method you may use to make sure mason only tries to download stuff
6   when you did not install neovim via nixCats
7   
8   It functions the same as what kickstart.nvim does for its mason setup.
9   However, when loaded via nix,
10  it skips mason and passes them straight to nvim-lspconfig
11  
12  When installing via pckr, install mason via pckr. Then wherever you set up
13  mason, do this.
14  The stuff added to servers table is what is passed to lspconfig/mason
15  
16  
17    if nixCats('neonixdev') then
18      -- NOTE: Lazydev will make your lua lsp stronger for neovim config
19      -- NOTE: we are also using this as an opportunity to show you how to lazy load plugins!
20      -- This plugin was added to the optionalPlugins section of the main flake.nix of this repo.
21      -- Thus, it is not loaded and must be packadded.
22      vim.api.nvim_create_autocmd('FileType', {
23        group = vim.api.nvim_create_augroup('nixCats-lazydev', { clear = true }),
24        pattern = { 'lua' },
25        callback = function(event)
26          -- NOTE: Use `:NixCats pawsible` to see the names of all plugins downloaded via nix for packadd
27          vim.cmd.packadd('lazydev.nvim')
28          require('lazydev').setup({
29            library = {
30            --   -- See the configuration section for more details
31            --   -- Load luvit types when the `vim.uv` word is found
32            --   -- { path = "luvit-meta/library", words = { "vim%.uv" } },
33              -- adds type hints for nixCats global
34              { path = require('nixCats').nixCatsPath .. '/lua', words = { "nixCats" } },
35            },
36          })
37        end
38      })
39      -- NOTE: use BirdeeHub/lze to manage the autocommands for you if the above seems tedious.
40      -- Or, use the wrapper for lazy.nvim included in the luaUtils template.
41      -- NOTE: AFTER DIRECTORIES WILL NOT BE SOURCED BY PACKADD!!!!!
42      -- this must be done by you manually if,
43      -- for example, you wanted to lazy load nvim-cmp sources
44  
45      servers.lua_ls = {
46        Lua = {
47          formatters = {
48            ignoreComments = true,
49          },
50          signatureHelp = { enabled = true },
51          diagnostics = {
52            globals = { 'nixCats' },
53            disable = { 'missing-fields' },
54          },
55        },
56        telemetry = { enabled = false },
57        filetypes = { 'lua' },
58      }
59    if require('nixCatsUtils').isNixCats then
60      servers.nixd = {
61        nixd = {
62          nixpkgs = {
63            -- nixd requires some configuration in flake based configs.
64            -- luckily, the nixCats plugin is here to pass whatever we need!
65            -- we passed this in via the `extra` table in our packageDefinitions
66            expr = [[import (builtins.getFlake "]] .. nixCats.extra("nixdExtras.nixpkgs") .. [[") { }   ]],
67          },
68          formatting = {
69            command = { "nixfmt" }
70          },
71          diagnostic = {
72            suppress = {
73              "sema-escaping-with"
74            }
75          }
76        }
77      }
78      -- If you integrated with your system flake,
79      -- you should pass inputs.self as nixdExtras.flake-path
80      -- that way it will ALWAYS work, regardless
81      -- of where your config actually was.
82  
83      -- If you are using a standalone flake, but installed it in your system
84      -- config, you may use override to add these values as well.
85      -- for more info on that, cd to an empty directory and run:
86      -- nix flake init -t github:BirdeeHub/nixCats-nvim#overriding
87      -- for a walkthrough of useage.
88  
89      -- otherwise flake-path could be an absolute path to your system flake, or nil or false
90      if nixCats.extra("nixdExtras.flake-path") then
91        local flakePath = nixCats.extra("nixdExtras.flake-path")
92        if nixCats.extra("nixdExtras.systemCFGname") then
93          -- (builtins.getFlake "<path_to_system_flake>").nixosConfigurations."<name>".options
94          servers.nixd.nixd.options.nixos = {
95            expr = [[(builtins.getFlake "]] .. flakePath ..  [[").nixosConfigurations."]] ..
96              nixCats.extra("nixdExtras.systemCFGname") .. [[".options]]
97          }
98        end
99        if nixCats.extra("nixdExtras.homeCFGname") then
100         -- (builtins.getFlake "<path_to_system_flake>").homeConfigurations."<name>".options
101         servers.nixd.nixd.options["home-manager"] = {
102           expr = [[(builtins.getFlake "]] .. flakePath .. [[").homeConfigurations."]]
103             .. nixCats.extra("nixdExtras.homeCFGname") .. [[".options]]
104         }
105       end
106     end
107   else
108     servers.rnix = {}
109     servers.nil_ls = {}
110   end
111 
112   end
113 
114   if not require('nixCatsUtils').isNixCats and nixCats('lspDebugMode') then
115     vim.lsp.set_log_level("debug")
116   end
117 
118   -- This is this flake's version of what kickstarter has set up for mason handlers.
119   -- This is a convenience function that calls lspconfig on the lsps we downloaded via nix
120   -- This will not download your lsp. Nix does that.
121 
122   --  Add any additional override configuration in the following tables. They will be passed to
123   --  the `settings` field of the server config. You must look up that documentation yourself.
124   --  All of them are listed in https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md
125   --
126   --  If you want to override the default filetypes that your language server will attach to you can
127   --  define the property 'filetypes' to the map in question.
128   --  You may do the same thing with cmd
129 
130   -- servers.clangd = {}
131   -- servers.gopls = {}
132   -- servers.pyright = {}
133   -- servers.rust_analyzer = {}
134   -- servers.tsserver = {}
135   -- servers.html = { filetypes = { 'html', 'twig', 'hbs'} }
136 
137 
138   -- If you were to comment out this autocommand
139   -- and instead pass the on attach function directly to
140   -- nvim-lspconfig, it would do the same thing.
141   vim.api.nvim_create_autocmd('LspAttach', {
142     group = vim.api.nvim_create_augroup('nixCats-lsp-attach', { clear = true }),
143     callback = function(event)
144       require('myLuaConf.LSPs.caps-on_attach').on_attach(vim.lsp.get_client_by_id(event.data.client_id), event.buf)
145     end
146   })
147   if require('nixCatsUtils').isNixCats then
148     for server_name, cfg in pairs(servers) do
149       require('lspconfig')[server_name].setup({
150         capabilities = require('myLuaConf.LSPs.caps-on_attach').get_capabilities(server_name),
151         -- this line is interchangeable with the above LspAttach autocommand
152         -- on_attach = require('myLuaConf.LSPs.caps-on_attach').on_attach,
153         settings = cfg,
154         filetypes = (cfg or {}).filetypes,
155         cmd = (cfg or {}).cmd,
156         root_pattern = (cfg or {}).root_pattern,
157       })
158     end
159 
160   else
161     require('mason').setup()
162     local mason_lspconfig = require 'mason-lspconfig'
163     mason_lspconfig.setup {
164       ensure_installed = vim.tbl_keys(servers),
165     }
166     mason_lspconfig.setup_handlers {
167       function(server_name)
168         require('lspconfig')[server_name].setup {
169           capabilities = require('myLuaConf.LSPs.caps-on_attach').get_capabilities(server_name),
170           -- this line is interchangeable with the above LspAttach autocommand
171           -- on_attach = require('myLuaConf.LSPs.caps-on_attach').on_attach,
172           settings = servers[server_name],
173           filetypes = (servers[server_name] or {}).filetypes,
174         }
175       end,
176     }
177   end
178 
179 ---------------------------------------------------------------------------------
180                                                  nixCats.LSPs.caps-on_attach
181 
182 The above snippet mentions another file at the end.
183 
184 caps-on_attach.lua or 'myLuaConf.LSPs.caps-on_attach'
185 
186 It is simply a file containing the function we want to run on lsp attach, and a
187 function to return our completion capabilities object.
188 
189 It looks like this:
190 
191 
192   local M = {}
193   function M.on_attach(_, bufnr)
194     -- we create a function that lets us more easily define mappings specific
195     -- for LSP related items. It sets the mode, buffer and description for us each time.
196 
197     local nmap = function(keys, func, desc)
198       if desc then
199         desc = 'LSP: ' .. desc
200       end
201 
202       vim.keymap.set('n', keys, func, { buffer = bufnr, desc = desc })
203     end
204 
205     nmap('<leader>rn', vim.lsp.buf.rename, '[R]e[n]ame')
206     nmap('<leader>ca', vim.lsp.buf.code_action, '[C]ode [A]ction')
207 
208     nmap('gd', vim.lsp.buf.definition, '[G]oto [D]efinition')
209     nmap('gr', require('telescope.builtin').lsp_references, '[G]oto [R]eferences')
210     nmap('gI', require('telescope.builtin').lsp_implementations, '[G]oto [I]mplementation')
211     nmap('<leader>D', vim.lsp.buf.type_definition, 'Type [D]efinition')
212     nmap('<leader>ds', require('telescope.builtin').lsp_document_symbols, '[D]ocument [S]ymbols')
213     nmap('<leader>ws', require('telescope.builtin').lsp_dynamic_workspace_symbols, '[W]orkspace [S]ymbols')
214 
215     -- See `:help K` for why this keymap
216     nmap('K', vim.lsp.buf.hover, 'Hover Documentation')
217     nmap('<C-k>', vim.lsp.buf.signature_help, 'Signature Documentation')
218 
219     -- Lesser used LSP functionality
220     nmap('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration')
221     nmap('<leader>wa', vim.lsp.buf.add_workspace_folder, '[W]orkspace [A]dd Folder')
222     nmap('<leader>wr', vim.lsp.buf.remove_workspace_folder, '[W]orkspace [R]emove Folder')
223     nmap('<leader>wl', function()
224       print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
225     end, '[W]orkspace [L]ist Folders')
226 
227     -- Create a command `:Format` local to the LSP buffer
228     vim.api.nvim_buf_create_user_command(bufnr, 'Format', function(_)
229       vim.lsp.buf.format()
230     end, { desc = 'Format current buffer with LSP' })
231 
232   end
233 
234   function M.get_capabilities(server_name)
235     -- you may wish to know which server you're using to set different capabilities
236     -- if server_name is omitted, it will be nil
237 
238     -- nvim-cmp supports additional completion capabilities, so broadcast that to servers
239     -- if you make a package without it, make sure to check if it exists with nixCats!
240     local capabilities = vim.lsp.protocol.make_client_capabilities()
241     capabilities = vim.tbl_deep_extend('force', capabilities, require('cmp_nvim_lsp').default_capabilities())
242     capabilities.textDocument.completion.completionItem.snippetSupport = true
243     return capabilities
244   end
245   return M
246 
247 
248 
249 =================================================================================
250 vim:tw=78:ts=8:ft=help:norl: