Skip to content

Commit 59780ab

Browse files
committed
feat: add ability to track signature help triggers for automatic signature help display
1 parent 10ca639 commit 59780ab

File tree

3 files changed

+57
-0
lines changed

3 files changed

+57
-0
lines changed

lua/astrolsp/config.lua

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
---@field codelens boolean? enable/disable codelens refresh on start (boolean; default = true)
3030
---@field inlay_hints boolean? enable/disable inlay hints on start (boolean; default = false)
3131
---@field semantic_tokens boolean? enable/disable semantic token highlighting (boolean; default = true)
32+
---@field signature_help boolean? enable/disable automatic signature help (boolean; default = false)
3233

3334
---@class AstroLSPFormatOnSaveOpts
3435
---@field enabled boolean? enable or disable format on save globally
@@ -260,6 +261,7 @@ local M = {
260261
codelens = true,
261262
inlay_hints = false,
262263
semantic_tokens = true,
264+
signature_help = false,
263265
},
264266
capabilities = {},
265267
---@diagnostic disable-next-line: missing-fields

lua/astrolsp/init.lua

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,39 @@ function M.setup(opts)
229229
-- TODO: remove check when dropping support for Neovim v0.9
230230
if vim.lsp.inlay_hint then vim.lsp.inlay_hint.enable(M.config.features.inlay_hints ~= false) end
231231

232+
-- Set up tracking of signature help trigger characters
233+
local augroup = vim.api.nvim_create_augroup("track_signature_help_triggers", { clear = true })
234+
vim.api.nvim_create_autocmd("LspAttach", {
235+
group = augroup,
236+
desc = "Add signature help triggers as language servers attach",
237+
callback = function(args)
238+
local client = vim.lsp.get_client_by_id(args.data.client_id)
239+
if client and client.supports_method "textDocument/signatureHelp" then
240+
vim.b[args.buf].signature_help_trigger = require("astrocore").list_insert_unique(
241+
vim.b[args.buf].signature_help_trigger,
242+
client.server_capabilities.signatureHelpProvider.triggerCharacters or {}
243+
)
244+
end
245+
end,
246+
})
247+
vim.api.nvim_create_autocmd("LspDetach", {
248+
group = augroup,
249+
desc = "Safely remove LSP signature help triggers when language servers detach",
250+
callback = vim.schedule_wrap(function(args)
251+
if not vim.api.nvim_buf_is_valid(args.buf) then return end
252+
local signature_help_trigger = {}
253+
for _, client in pairs((vim.lsp.get_clients or vim.lsp.get_active_clients) { bufnr = args.buf }) do
254+
if client.id ~= args.data.client_id and client.supports_method "textDocument/signatureHelp" then
255+
require("astrocore").list_insert_unique(
256+
signature_help_trigger,
257+
client.server_capabilities.signatureHelpProvider.triggerCharacters or {}
258+
)
259+
end
260+
end
261+
vim.b[args.buf].signature_help_trigger = signature_help_trigger
262+
end),
263+
})
264+
232265
vim.api.nvim_create_autocmd("LspDetach", {
233266
group = vim.api.nvim_create_augroup("astrolsp_detach", { clear = true }),
234267
desc = "Clear state when language server is detached like LSP progress messages",

lua/astrolsp/toggles.lua

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,4 +89,26 @@ function M.codelens(silent)
8989
ui_notify(silent, ("CodeLens %s"):format(bool2str(features.codelens)))
9090
end
9191

92+
--- Toggle automatic signature help
93+
---@param silent? boolean if true then don't sent a notification
94+
function M.signature_help(silent)
95+
config.features.signature_help = not config.features.signature_help
96+
ui_notify(silent, ("Global signature help %s"):format(bool2str(config.features.signature_help)))
97+
end
98+
99+
--- Toggle buffer local automatic signature help
100+
---@param bufnr? integer The buffer to toggle the auto signature help of, default the current buffer
101+
---@param silent? boolean if true then don't sent a notification
102+
function M.buffer_signature_help(bufnr, silent)
103+
bufnr = bufnr or 0
104+
local old_val = vim.b[bufnr].signature_help
105+
if old_val == nil then old_val = config.features.signature_help end
106+
if not next(vim.b[bufnr].signature_help_trigger) then
107+
ui_notify(silent, "No LSP attached with signature help triggers")
108+
return
109+
end
110+
vim.b[bufnr].signature_help = not old_val
111+
ui_notify(silent, ("Buffer signature help %s"):format(bool2str(vim.b[bufnr].signature_help)))
112+
end
113+
92114
return M

0 commit comments

Comments
 (0)