aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/nvim/.config/nvim/lua/tobyvin/lsp.lua
blob: b97c80928fd435f6458a321c3849e17bd0b7e1a0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
local augroup = vim.api.nvim_create_augroup("lsp", { clear = true })

for method, handler in pairs(require("tobyvin.lsp.handlers")) do
	vim.lsp.handlers[method] = handler
end

vim.api.nvim_create_autocmd("LspAttach", {
	group = augroup,
	desc = "setup lsp",
	callback = function(args)
		---@type lsp.Client
		local client = vim.lsp.get_client_by_id(args.data.client_id)

		if client.server_capabilities.documentHighlightProvider then
			vim.api.nvim_create_autocmd({ "CursorHold", "CursorHoldI" }, {
				group = augroup,
				buffer = args.buf,
				callback = vim.lsp.buf.document_highlight,
				desc = "highlight references",
			})

			vim.api.nvim_create_autocmd({ "CursorMoved", "CursorMovedI" }, {
				group = augroup,
				buffer = args.buf,
				callback = vim.lsp.buf.clear_references,
				desc = "clear references",
			})
		end

		if client.server_capabilities.documentFormattingProvider then
			vim.keymap.set("n", "gqq", vim.lsp.buf.format, { desc = "format", buffer = args.buf })
			vim.keymap.set("n", "<leader>lf", vim.lsp.buf.format, { desc = "format", buffer = args.buf })
		end

		if client.server_capabilities.documentRangeFormattingProvider then
			vim.keymap.set("v", "<leader>lf", vim.lsp.buf.format, { desc = "format", buffer = args.buf })
		end

		if client.server_capabilities.hoverProvider then
			vim.keymap.set({ "n", "v" }, "K", vim.lsp.buf.hover, { desc = "hover", buffer = args.buf })
		end

		if client.server_capabilities.signatureHelpProvider then
			vim.keymap.set("n", "<C-k>", vim.lsp.buf.signature_help, {
				desc = "signature help",
				buffer = args.buf,
			})
		end

		local on_list = function(options)
			vim.fn.setqflist({}, " ", options)
			vim.api.nvim_command("cfirst")
		end

		if client.server_capabilities.declarationProvider then
			vim.keymap.set("n", "gD", function()
				vim.lsp.buf.declaration({ on_list = on_list })
			end, { desc = "declaration", buffer = args.buf })
		end

		if client.server_capabilities.definitionProvider then
			vim.keymap.set("n", "gd", function()
				vim.lsp.buf.definition({ on_list = on_list })
			end, { desc = "definition", buffer = args.buf })
		end

		if client.server_capabilities.typeDefinitionProvider then
			vim.keymap.set("n", "go", function()
				vim.lsp.buf.type_definition({ on_list = on_list })
			end, { desc = "type definition", buffer = args.buf })
		end

		if client.server_capabilities.implementationProvider then
			vim.keymap.set("n", "gi", function()
				vim.lsp.buf.implementation({ on_list = on_list })
			end, { desc = "implementation", buffer = args.buf })
		end

		if client.server_capabilities.referencesProvider then
			vim.keymap.set("n", "gr", function()
				vim.lsp.buf.references(nil, { on_list = on_list })
			end, { desc = "references", buffer = args.buf })
		end

		if client.server_capabilities.renameProvider then
			vim.keymap.set("n", "<leader>lr", vim.lsp.buf.rename, {
				desc = "rename",
				buffer = args.buf,
			})
		end

		if client.server_capabilities.codeActionProvider then
			vim.keymap.set("n", "<leader>la", vim.lsp.buf.code_action, {
				desc = "code action",
				buffer = args.buf,
			})
		end

		if client.server_capabilities.experimental then
			if client.server_capabilities.experimental.externalDocs then
				vim.keymap.set("n", "gx", vim.lsp.buf.external_docs, {
					desc = "external_docs",
					buffer = args.buf,
				})
			end
		end
	end,
})