@@ -54,6 +54,24 @@ function M.lsp_setup(server)
54
54
if handler then handler (server ) end
55
55
end
56
56
57
+ --- Set up a given `on_attach` function to run when language servers are attached
58
+ --- @param on_attach fun ( client : vim.lsp.Client , bufnr : integer ) the ` on_attach` function to run
59
+ --- @param opts ? { client_name : string ?, autocmd : vim.api.keyset.create_autocmd ? } options for configuring the ` on_attach`
60
+ --- @return integer autocmd_id The id for the created LspAttach autocommand
61
+ function M .add_on_attach (on_attach , opts )
62
+ if not opts then opts = {} end
63
+ local client_name , autocmd_opts = opts .client_name , opts .autocmd or {}
64
+ return vim .api .nvim_create_autocmd (
65
+ " LspAttach" ,
66
+ vim .tbl_deep_extend (" force" , autocmd_opts , {
67
+ callback = function (args )
68
+ local client = vim .lsp .get_client_by_id (args .data .client_id )
69
+ if client and (not client_name or client_name == client .name ) then return on_attach (client , args .buf ) end
70
+ end ,
71
+ })
72
+ )
73
+ end
74
+
57
75
--- The `on_attach` function used by AstroNvim
58
76
--- @param client vim.lsp.Client The LSP client details when attaching
59
77
--- @param bufnr integer The buffer that the LSP client is attaching to
@@ -223,13 +241,11 @@ function M.setup(opts)
223
241
vim .lsp .config (" *" , { capabilities = M .config .capabilities , flags = M .config .flags })
224
242
225
243
-- Set up tracking of signature help trigger characters
226
- vim .api .nvim_create_autocmd (" LspAttach" , {
227
- group = vim .api .nvim_create_augroup (" astrolsp_on_attach" , { clear = true }),
228
- desc = " AstroLSP on_attach function" ,
229
- callback = function (args )
230
- local client = vim .lsp .get_client_by_id (args .data .client_id )
231
- if client then M .on_attach (client , args .buf ) end
232
- end ,
244
+ M .add_on_attach (M .on_attach , {
245
+ autocmd = {
246
+ group = vim .api .nvim_create_augroup (" astrolsp_on_attach" , { clear = true }),
247
+ desc = " AstroLSP on_attach function" ,
248
+ },
233
249
})
234
250
235
251
vim .tbl_map (M .lsp_setup , M .config .servers )
@@ -272,22 +288,22 @@ function M.setup(opts)
272
288
273
289
-- Set up tracking of signature help trigger characters
274
290
local augroup = vim .api .nvim_create_augroup (" track_signature_help_triggers" , { clear = true })
275
- vim .api .nvim_create_autocmd (" LspAttach" , {
276
- group = augroup ,
277
- desc = " Add signature help triggers as language servers attach" ,
278
- callback = function (args )
279
- local client = vim .lsp .get_client_by_id (args .data .client_id )
280
- if client and client :supports_method (" textDocument/signatureHelp" , args .buf ) then
281
- for _ , set in ipairs { " triggerCharacters" , " retriggerCharacters" } do
282
- local set_var = " signature_help_" .. set
283
- local triggers = vim .b [args .buf ][set_var ] or {}
284
- for _ , trigger in ipairs (client .server_capabilities .signatureHelpProvider [set ] or {}) do
285
- triggers [trigger ] = true
286
- end
287
- vim .b [args .buf ][set_var ] = triggers
291
+ M .add_on_attach (function (client , bufnr )
292
+ if client :supports_method (" textDocument/signatureHelp" , bufnr ) then
293
+ for _ , set in ipairs { " triggerCharacters" , " retriggerCharacters" } do
294
+ local set_var = " signature_help_" .. set
295
+ local triggers = vim .b [bufnr ][set_var ] or {}
296
+ for _ , trigger in ipairs (client .server_capabilities .signatureHelpProvider [set ] or {}) do
297
+ triggers [trigger ] = true
288
298
end
299
+ vim .b [bufnr ][set_var ] = triggers
289
300
end
290
- end ,
301
+ end
302
+ end , {
303
+ autocmd = {
304
+ group = augroup ,
305
+ desc = " Add signature help triggers as language servers attach" ,
306
+ },
291
307
})
292
308
vim .api .nvim_create_autocmd (" LspDetach" , {
293
309
group = augroup ,
0 commit comments