Skip to content

Commit fe6eef9

Browse files
committed
feat: add add_on_attach function for easily adding more on_attach functions
1 parent 609cff9 commit fe6eef9

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
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

Comments
 (0)