blob: 3755d640de20f2613d3d85a4ad6d067d58955671 (
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
|
(fn map-to-capabilities [{: client : buf} format]
(fn bo [name value]
(vim.api.nvim_buf_set_option buf name value))
(fn bm [mode key cb]
(vim.keymap.set mode key cb {:silent true :noremap true :buffer buf}))
(fn lspdo [action]
(. vim.lsp.buf action))
(fn use [cpb]
(match cpb
:completionProvider (bo :omnifunc "v:lua.vim.lsp.omnifunc")
:renameProvider (bm :n :<leader>gr (lspdo :rename))
:signatureHelpProvider (bm :n :<leader>gs (lspdo :signature_help))
:definitionProvider (bm :n :<leader>gd (lspdo :definition))
:declaration (bm :n :<leader>gD (lspdo :declaration))
:implementationProvider (bm :n :<leader>gi (lspdo :implementation))
:referencesProvider (bm :n :<leader>gi (lspdo :references))
:documentSymbolProvider (bm :n :<leader>gds (lspdo :workspace_symbol))
:codeActionProvider (bm :n :<leader>ga (lspdo :code_action))
:codeLensProvider (bm :n :<leader>gl
(lambda []
(vim.lsp.codelens.run)))
:hoverProvider (bo :keywordprg ":LspHover")
:documentFormattingProvider (if format
((fn []
(bo :formatexpr
"v:lua.vim.lsp.format()")
(bm :n :<leader>gq
#(vim.lsp.buf.format {:async true})))))))
(each [cpb enabled? (pairs client.server_capabilities)]
(if enabled?
(use cpb)))
{: client : buf})
(fn register-handlers [{: client : buf}]
(tset (. client :handlers) :textDocument/publishDiagnostics
(vim.lsp.with (fn [_ result ctx config]
(vim.lsp.diagnostic.on_publish_diagnostics _ result ctx
config)
(vim.diagnostic.setloclist {:open false}))
{:virtual_text false
:underline true
:update_in_insert false
:severity_sort true}))
{: client : buf})
(var format-on-save true)
(fn toggle-format-on-save []
(set format-on-save (not format-on-save)))
(vim.api.nvim_create_user_command :LspToggleOnSave toggle-format-on-save
{:nargs 1 :complete (fn [] [:format])})
(fn events [{: client : buf}]
(match client.server_capabilities
{:documentFormattingProvider true}
(let [format-events-group (vim.api.nvim_create_augroup :format-events
{:clear true})]
(vim.api.nvim_create_autocmd [:BufWritePre]
{:group format-events-group
:callback (lambda []
(if format-on-save
(vim.lsp.buf.format)))
:buffer buf}))))
(fn attach [client buf format]
(-> {: client : buf}
(register-handlers)
(map-to-capabilities format)
(events)))
{: attach}
|