Skip to content

Commit c9ec8d0

Browse files
committed
feat: add add_on_attach function for easily adding more on_attach functions
1 parent 712b5fd commit c9ec8d0

File tree

1 file changed

+37
-21
lines changed

1 file changed

+37
-21
lines changed

lua/astrolsp/init.lua

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,24 @@ function M.lsp_setup(server)
5454
if handler then handler(server) end
5555
end
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

Comments
 (0)