{ helpers, ... }: let inherit (helpers) mkRaw; in { config = { autoGroups = { "highlightOnYank" = { }; "lspConfig" = { }; "restoreCursorPosition" = { }; }; autoCmd = [ { group = "highlightOnYank"; event = "TextYankPost"; pattern = "*"; callback = mkRaw # lua '' function() vim.highlight.on_yank { higroup = ( vim.fn['hlexists'] 'HighlightedyankRegion' > 0 and 'HighlightedyankRegion' or 'IncSearch' ), timeout = 200, } end ''; } { group = "restoreCursorPosition"; event = "BufReadPost"; pattern = "*"; callback = mkRaw # lua '' function() if vim.fn.line '\'"' > 0 and vim.fn.line '\'"' <= vim.fn.line '$' then vim.cmd [[execute "normal! g'\""]] end end ''; } { group = "lspConfig"; event = "LspAttach"; pattern = "*"; callback = let opts = "noremap = true, buffer = bufnr"; in mkRaw # lua '' function(opts) local bufnr = opts.buf local client = vim.lsp.get_client_by_id(opts.data.client_id) local capabilities = client.server_capabilities -- Set Omnifunc if supported if capabilities.completionProvider then vim.bo[bufnr].omnifunc = "v:lua.vim.lsp.omnifunc" end -- Enable inlay hints if supported if capabilities.inlayHintProvider then vim.lsp.inlay_hint.enable(true, { bufnr = bufnr }) end -- Some Lsp servers do not advertise inlay hints properly so enable this keybinding regardless vim.keymap.set('n', 'ht', function() vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled({bufnr = 0}), { bufnr = 0 }) end, { desc = '[H]ints [T]oggle', ${opts} } ) -- Enable hover if supported if capabilities.hoverProvider then vim.keymap.set('n', 'K', vim.lsp.buf.hover, { desc = 'Hover Documentation', ${opts} }) end -- Enable rename if supported if capabilities.renameProvider then vim.keymap.set('n', 'r', vim.lsp.buf.rename, { desc = '[R]ename', ${opts} }) end -- Enable code actions if supported if capabilities.codeActionProvider then vim.keymap.set({ 'n', 'v' }, 'fa', vim.lsp.buf.code_action, { desc = '[F]ind Code [A]ctions', ${opts} }) end -- Enable formatting if supported if capabilities.documentFormattingProvider then vim.keymap.set('n', 'w', function() require("conform").format({ lsp_fallback = true }) end, { desc = 'Format Buffer', ${opts} }) end -- Other keybinds vim.keymap.set('n', 'gd', vim.lsp.buf.definition, { desc = '[G]o to [D]efinition', ${opts} }) vim.keymap.set('n', 'gt', vim.lsp.buf.type_definition, { desc = '[G]o to [T]ype Definition', ${opts} }) vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, { desc = '[G]o to [I]mplementation', ${opts} }) end ''; } ]; }; }