@@ -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 local rename_augroup = vim .api .nvim_create_augroup (" astrolsp_rename_operations" , { clear = true })
@@ -270,22 +286,22 @@ function M.setup(opts)
270286
271287 -- Set up tracking of signature help trigger characters
272288 local augroup = vim .api .nvim_create_augroup (" track_signature_help_triggers" , { clear = true })
273- vim .api .nvim_create_autocmd (" LspAttach" , {
274- group = augroup ,
275- desc = " Add signature help triggers as language servers attach" ,
276- callback = function (args )
277- local client = vim .lsp .get_client_by_id (args .data .client_id )
278- if client and client :supports_method (" textDocument/signatureHelp" , args .buf ) then
279- for _ , set in ipairs { " triggerCharacters" , " retriggerCharacters" } do
280- local set_var = " signature_help_" .. set
281- local triggers = vim .b [args .buf ][set_var ] or {}
282- for _ , trigger in ipairs (client .server_capabilities .signatureHelpProvider [set ] or {}) do
283- triggers [trigger ] = true
284- end
285- vim .b [args .buf ][set_var ] = triggers
289+ M .add_on_attach (function (client , bufnr )
290+ if client :supports_method (" textDocument/signatureHelp" , bufnr ) then
291+ for _ , set in ipairs { " triggerCharacters" , " retriggerCharacters" } do
292+ local set_var = " signature_help_" .. set
293+ local triggers = vim .b [bufnr ][set_var ] or {}
294+ for _ , trigger in ipairs (client .server_capabilities .signatureHelpProvider [set ] or {}) do
295+ triggers [trigger ] = true
286296 end
297+ vim .b [bufnr ][set_var ] = triggers
287298 end
288- end ,
299+ end
300+ end , {
301+ autocmd = {
302+ group = augroup ,
303+ desc = " Add signature help triggers as language servers attach" ,
304+ },
289305 })
290306 vim .api .nvim_create_autocmd (" LspDetach" , {
291307 group = augroup ,
0 commit comments