diff options
Diffstat (limited to '.config/nvim/lua/plugins/lsp.lua')
-rw-r--r-- | .config/nvim/lua/plugins/lsp.lua | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/.config/nvim/lua/plugins/lsp.lua b/.config/nvim/lua/plugins/lsp.lua new file mode 100644 index 0000000..d03d9af --- /dev/null +++ b/.config/nvim/lua/plugins/lsp.lua | |||
@@ -0,0 +1,236 @@ | |||
1 | return { | ||
2 | { | ||
3 | "neovim/nvim-lspconfig", | ||
4 | dependencies = { | ||
5 | "williamboman/mason.nvim", | ||
6 | "williamboman/mason-lspconfig.nvim", | ||
7 | "j-hui/fidget.nvim", | ||
8 | "folke/neodev.nvim", | ||
9 | "RRethy/vim-illuminate", | ||
10 | "hrsh7th/cmp-nvim-lsp", | ||
11 | }, | ||
12 | config = function() | ||
13 | local map = require("helpers.keys").map | ||
14 | |||
15 | map('n', '<leader>e', vim.diagnostic.open_float, "lsp: open diagnostics float") | ||
16 | map('n', '[d', vim.diagnostic.goto_prev, "lsp: goto previous diagnostic") | ||
17 | map('n', ']d', vim.diagnostic.goto_next, "lsp: goto next diagnostic") | ||
18 | |||
19 | -- set up mason before anything else | ||
20 | require("mason").setup() | ||
21 | require("mason-lspconfig").setup({ | ||
22 | ensure_installed = { | ||
23 | "lua_ls", | ||
24 | "pylsp", | ||
25 | }, | ||
26 | automatic_installation = true, | ||
27 | }) | ||
28 | |||
29 | -- quick access via keymap | ||
30 | require("helpers.keys").map("n", "<leader>M", "<cmd>Mason<cr>", "show mason") | ||
31 | |||
32 | -- neodev setup before lsp config | ||
33 | require("neodev").setup() | ||
34 | |||
35 | -- set up cool signs for diagnostics | ||
36 | local signs = { Error = " ", Warn = "", Hint = "", Info = "" } | ||
37 | for type, icon in pairs(signs) do | ||
38 | local hl = "DiagnosticSign" .. type | ||
39 | vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = "" }) | ||
40 | end | ||
41 | |||
42 | -- Diagnostic config | ||
43 | local config = { | ||
44 | virtual_text = false, | ||
45 | signs = { | ||
46 | active = signs, | ||
47 | }, | ||
48 | update_in_insert = true, | ||
49 | underline = true, | ||
50 | severity_sort = true, | ||
51 | float = { | ||
52 | focusable = true, | ||
53 | style = "minimal", | ||
54 | border = "rounded", | ||
55 | source = "always", | ||
56 | header = "", | ||
57 | prefix = "", | ||
58 | }, | ||
59 | } | ||
60 | vim.diagnostic.config(config) | ||
61 | |||
62 | -- this function gets run when an lsp connects to a particular buffer. | ||
63 | local on_attach = function(client, bufnr) | ||
64 | map = require("helpers.keys").lsp_map | ||
65 | |||
66 | map("<leader>lr", vim.lsp.buf.rename, bufnr, "lsp: rename symbol") | ||
67 | map("<leader>la", vim.lsp.buf.code_action, bufnr, "lsp: code action") | ||
68 | map("<leader>ld", vim.lsp.buf.type_definition, bufnr, "lsp: type definition") | ||
69 | map("<leader>ls", require("telescope.builtin").lsp_document_symbols, bufnr, "lsp: document symbols") | ||
70 | |||
71 | map("gd", vim.lsp.buf.definition, bufnr, "lsp: goto definition") | ||
72 | map("gD", vim.lsp.buf.declaration, bufnr, "lsp: goto declaration") | ||
73 | map("gr", require("telescope.builtin").lsp_references, bufnr, "lsp: goto references") | ||
74 | map("gI", vim.lsp.buf.implementation, bufnr, "lsp: goto implementation") | ||
75 | map("K", vim.lsp.buf.hover, bufnr, "lsp: hover documentation") | ||
76 | map("<c-k>", vim.lsp.buf.signature_help, bufnr, "lsp: signature help") | ||
77 | |||
78 | -- Create a command `:Format` local to the LSP buffer | ||
79 | vim.api.nvim_buf_create_user_command(bufnr, "Format", function(_) | ||
80 | vim.lsp.buf.format() | ||
81 | end, { desc = "lsp: format current buffer" }) | ||
82 | |||
83 | map("<leader>fm", "<cmd>Format<cr>", bufnr, "lsp: format current buffer") | ||
84 | |||
85 | -- Attach and configure vim-illuminate | ||
86 | -- apparently this is deprecated | ||
87 | -- https://github.com/RRethy/vim-illuminate/issues/111 | ||
88 | require("illuminate").on_attach(client) | ||
89 | end | ||
90 | |||
91 | -- nvim-cmp supports additional completion capabilities, so broadcast that to servers | ||
92 | local capabilities = vim.lsp.protocol.make_client_capabilities() | ||
93 | capabilities = require("cmp_nvim_lsp").default_capabilities(capabilities) | ||
94 | |||
95 | -- lua | ||
96 | require("lspconfig")["lua_ls"].setup({ | ||
97 | on_attach = on_attach, | ||
98 | capabilities = capabilities, | ||
99 | settings = { | ||
100 | Lua = { | ||
101 | completion = { | ||
102 | callSnippet = "Replace", | ||
103 | }, | ||
104 | diagnostics = { | ||
105 | globals = { "vim" }, | ||
106 | }, | ||
107 | workspace = { | ||
108 | library = { | ||
109 | [vim.fn.expand("$VIMRUNTIME/lua")] = true, | ||
110 | [vim.fn.stdpath("config") .. "/lua"] = true, | ||
111 | }, | ||
112 | }, | ||
113 | }, | ||
114 | }, | ||
115 | }) | ||
116 | |||
117 | -- python | ||
118 | require("lspconfig")["pylsp"].setup({ | ||
119 | on_attach = on_attach, | ||
120 | capabilities = capabilities, | ||
121 | settings = { | ||
122 | pylsp = { | ||
123 | plugins = { | ||
124 | flake8 = { | ||
125 | enabled = true, | ||
126 | maxLineLength = 88, -- black's line length | ||
127 | }, | ||
128 | -- disable plugins overlapping with flake8 | ||
129 | pycodestyle = { | ||
130 | enabled = false, | ||
131 | }, | ||
132 | mccabe = { | ||
133 | enabled = false, | ||
134 | }, | ||
135 | pyflakes = { | ||
136 | enabled = false, | ||
137 | }, | ||
138 | -- use black as the formatter | ||
139 | autopep8 = { | ||
140 | enabled = false, | ||
141 | }, | ||
142 | }, | ||
143 | }, | ||
144 | }, | ||
145 | }) | ||
146 | |||
147 | -- efm | ||
148 | require("lspconfig")["efm"].setup({ | ||
149 | on_attach = on_attach, | ||
150 | filetypes = { 'sh' }, | ||
151 | capabilities = capabilities | ||
152 | }) | ||
153 | |||
154 | -- ltex | ||
155 | require("lspconfig")["ltex"].setup({ | ||
156 | capabilities = capabilities, | ||
157 | on_attach = function(client, bufnr) | ||
158 | on_attach(client, bufnr) | ||
159 | require("ltex_extra").setup { | ||
160 | load_langs = { "en-GB" }, | ||
161 | init_check = true, | ||
162 | log_level = "none", | ||
163 | } | ||
164 | end, | ||
165 | settings = { | ||
166 | ltex = { | ||
167 | -- my settings here | ||
168 | } | ||
169 | } | ||
170 | }) | ||
171 | |||
172 | -- rust-tools | ||
173 | local rust_opts = { | ||
174 | tools = { | ||
175 | runnables = { | ||
176 | use_telescope = true, | ||
177 | }, | ||
178 | inlay_hints = { | ||
179 | auto = true, | ||
180 | show_parameter_hints = true, | ||
181 | parameter_hints_prefix = "↸ ", | ||
182 | other_hints_prefix = "❱ ", | ||
183 | }, | ||
184 | }, | ||
185 | |||
186 | -- all the opts to send to nvim-lspconfig | ||
187 | -- these override the defaults set by rust-tools.nvim | ||
188 | -- see https://github.com/neovim/nvim-lspconfig/blob/master/CONFIG.md#rust_analyzer | ||
189 | server = { | ||
190 | on_attach = on_attach, | ||
191 | settings = { | ||
192 | -- to enable rust-analyzer settings visit: | ||
193 | -- https://github.com/rust-analyzer/rust-analyzer/blob/master/docs/user/generated_config.adoc | ||
194 | ["rust-analyzer"] = { | ||
195 | -- enable clippy on save | ||
196 | checkOnSave = { | ||
197 | command = "clippy", | ||
198 | }, | ||
199 | }, | ||
200 | }, | ||
201 | }, | ||
202 | } | ||
203 | |||
204 | require('rust-tools').setup(rust_opts) | ||
205 | end, | ||
206 | }, | ||
207 | { | ||
208 | "barreiroleo/ltex-extra.nvim", | ||
209 | event = "LspAttach", | ||
210 | }, | ||
211 | { | ||
212 | "j-hui/fidget.nvim", | ||
213 | tag = "legacy", | ||
214 | event = "LspAttach", | ||
215 | opts = { | ||
216 | text = { | ||
217 | spinner = "triangle", | ||
218 | commenced = "started", -- message shown when task starts | ||
219 | completed = "done", -- message shown when task completes | ||
220 | }, | ||
221 | }, | ||
222 | }, | ||
223 | { | ||
224 | "simrat39/rust-tools.nvim", | ||
225 | event = "LspAttach", | ||
226 | }, | ||
227 | -- { | ||
228 | -- "RRethy/vim-illuminate", | ||
229 | -- opts = { | ||
230 | -- filetypes_denylist = { | ||
231 | -- 'NvimTree', | ||
232 | -- 'fugitive', | ||
233 | -- }, | ||
234 | -- }, | ||
235 | -- }, | ||
236 | } | ||