@@ -54,6 +54,24 @@ function M.lsp_setup(server)
5454 if handler then handler (server ) end
5555end
5656
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+
5775--- The `on_attach` function used by AstroNvim
5876--- @param client vim.lsp.Client The LSP client details when attaching
5977--- @param bufnr integer The buffer that the LSP client is attaching to
@@ -223,13 +241,11 @@ function M.setup(opts)
223241 vim .lsp .config (" *" , { capabilities = M .config .capabilities , flags = M .config .flags })
224242
225243 -- 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+ },
233249 })
234250
235251 vim .tbl_map (M .lsp_setup , M .config .servers )
@@ -272,22 +288,22 @@ function M.setup(opts)
272288
273289 -- Set up tracking of signature help trigger characters
274290 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
288298 end
299+ vim .b [bufnr ][set_var ] = triggers
289300 end
290- end ,
301+ end
302+ end , {
303+ autocmd = {
304+ group = augroup ,
305+ desc = " Add signature help triggers as language servers attach" ,
306+ },
291307 })
292308 vim .api .nvim_create_autocmd (" LspDetach" , {
293309 group = augroup ,
0 commit comments