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 paq-nvim, install mason via paq-nvim. 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
19
20
21
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
27 vim.cmd.packadd('lazydev.nvim')
28 require('lazydev').setup({
29 library = {
30
31
32
33
34 { path = require('nixCats').nixCatsPath .. '/lua', words = { "nixCats" } },
35 },
36 })
37 end
38 })
39
40
41
42
43
44
45 servers.lua_ls = {
46 settings = {
47 Lua = {
48 formatters = {
49 ignoreComments = true,
50 },
51 signatureHelp = { enabled = true },
52 diagnostics = {
53 globals = { 'nixCats' },
54 disable = { 'missing-fields' },
55 },
56 },
57 telemetry = { enabled = false },
58 },
59 filetypes = { 'lua' },
60 }
61 if require('nixCatsUtils').isNixCats then
62
63
64
65
66
67 servers.nixd = {
68 settings = {
69 nixd = {
70 nixpkgs = {
71
72
73 expr = nixCats.extra("nixdExtras.nixpkgs") or [[import <nixpkgs> {}]],
74 },
75 options = {
76
77
78
79
80 nixos = {
81
82 expr = nixCats.extra("nixdExtras.nixos_options")
83 },
84
85
86
87 ["home-manager"] = {
88
89 expr = nixCats.extra("nixdExtras.home_manager_options")
90 }
91 },
92 formatting = {
93 command = { "nixfmt" }
94 },
95 diagnostic = {
96 suppress = {
97 "sema-escaping-with"
98 }
99 }
100 }
101 }
102 }
103 else
104 servers.rnix = {}
105 servers.nil_ls = {}
106 end
107
108 end
109
110 if not require('nixCatsUtils').isNixCats and nixCats('lspDebugMode') then
111 vim.lsp.set_log_level("debug")
112 end
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137 vim.api.nvim_create_autocmd('LspAttach', {
138 group = vim.api.nvim_create_augroup('nixCats-lsp-attach', { clear = true }),
139 callback = function(event)
140 require('myLuaConf.LSPs.caps-on_attach').on_attach(vim.lsp.get_client_by_id(event.data.client_id), event.buf)
141 end
142 })
143 if require('nixCatsUtils').isNixCats then
144 for server_name, cfg in pairs(servers) do
145 require('lspconfig')[server_name].setup({
146 capabilities = require('myLuaConf.LSPs.caps-on_attach').get_capabilities(server_name),
147
148
149 settings = (cfg or {}).settings,
150 filetypes = (cfg or {}).filetypes,
151 cmd = (cfg or {}).cmd,
152 root_pattern = (cfg or {}).root_pattern,
153 })
154 end
155
156 else
157 require('mason').setup()
158 local mason_lspconfig = require 'mason-lspconfig'
159 mason_lspconfig.setup {
160 ensure_installed = vim.tbl_keys(servers),
161 }
162 mason_lspconfig.setup_handlers {
163 function(server_name)
164 require('lspconfig')[server_name].setup {
165 capabilities = require('myLuaConf.LSPs.caps-on_attach').get_capabilities(server_name),
166
167
168 settings = (servers[server_name] or {}).settings,
169 filetypes = (servers[server_name] or {}).filetypes,
170 }
171 end,
172 }
173 end
174
175 ---------------------------------------------------------------------------------
176 nixCats.LSPs.caps-on_attach
177
178 The above snippet mentions another file at the end.
179
180 caps-on_attach.lua or 'myLuaConf.LSPs.caps-on_attach'
181
182 It is simply a file containing the function we want to run on LSP attach, and a
183 function to return our completion capabilities object.
184
185 It looks like this:
186
187
188 local M = {}
189 function M.on_attach(_, bufnr)
190
191
192
193 local nmap = function(keys, func, desc)
194 if desc then
195 desc = 'LSP: ' .. desc
196 end
197
198 vim.keymap.set('n', keys, func, { buffer = bufnr, desc = desc })
199 end
200
201 nmap('<leader>rn', vim.lsp.buf.rename, '[R]e[n]ame')
202 nmap('<leader>ca', vim.lsp.buf.code_action, '[C]ode [A]ction')
203
204 nmap('gd', vim.lsp.buf.definition, '[G]oto [D]efinition')
205 nmap('gr', require('telescope.builtin').lsp_references, '[G]oto [R]eferences')
206 nmap('gI', require('telescope.builtin').lsp_implementations, '[G]oto [I]mplementation')
207 nmap('<leader>D', vim.lsp.buf.type_definition, 'Type [D]efinition')
208 nmap('<leader>ds', require('telescope.builtin').lsp_document_symbols, '[D]ocument [S]ymbols')
209 nmap('<leader>ws', require('telescope.builtin').lsp_dynamic_workspace_symbols, '[W]orkspace [S]ymbols')
210
211
212 nmap('K', vim.lsp.buf.hover, 'Hover Documentation')
213 nmap('<C-k>', vim.lsp.buf.signature_help, 'Signature Documentation')
214
215
216 nmap('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration')
217 nmap('<leader>wa', vim.lsp.buf.add_workspace_folder, '[W]orkspace [A]dd Folder')
218 nmap('<leader>wr', vim.lsp.buf.remove_workspace_folder, '[W]orkspace [R]emove Folder')
219 nmap('<leader>wl', function()
220 print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
221 end, '[W]orkspace [L]ist Folders')
222
223
224 vim.api.nvim_buf_create_user_command(bufnr, 'Format', function(_)
225 vim.lsp.buf.format()
226 end, { desc = 'Format current buffer with LSP' })
227
228 end
229
230 function M.get_capabilities(server_name)
231
232
233
234
235
236 local capabilities = vim.lsp.protocol.make_client_capabilities()
237 capabilities = vim.tbl_deep_extend('force', capabilities, require('cmp_nvim_lsp').default_capabilities())
238 capabilities.textDocument.completion.completionItem.snippetSupport = true
239 return capabilities
240 end
241 return M
242
243
244
245 =================================================================================
246 vim:tw=78:ts=8:ft=help:norl: