---LSP OnAttach ---@param client vim.lsp.Client ---@param buf integer function Lsp(client, buf) vim.keymap.set('n', 'gwl', function() local dir = vim.lsp.buf.list_workspace_folders() vim.ui.select(dir, { prompt = 'Workspace Dir: ', }, function(result) if result then vim.api.nvim_set_current_dir(result) end end) end, { buffer = buf }) vim.keymap.set('n', 'grt', function() vim.lsp.buf.type_definition() end, { desc = 'vim.lsp.buf.type_definition()' }) vim.api.nvim_buf_create_user_command(buf, "Symbols", function(args) if args.args == "" then vim.lsp.buf.workspace_symbol() else vim.lsp.buf.workspace_symbol(args.args) end end, { nargs = "?" }) if client:supports_method('textDocument/inlayHint') then vim.lsp.inlay_hint.enable() vim.keymap.set('n', 'ih', function() vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled()) end, { buffer = buf }) end if client:supports_method('textDocument/completion') then local chars = {} for i = 32, 126 do table.insert(chars, string.char(i)) end client.server_capabilities.completionProvider.triggerCharacters = chars vim.lsp.completion.enable(true, client.id, buf, { autotrigger = true }) end if client:supports_method('textDocument/documentHighlight') then local highlight_augroup = vim.api.nvim_create_augroup('lsp-highlight', { clear = false }) vim.api.nvim_create_autocmd({ 'CursorHold', 'CursorHoldI' }, { buffer = buf, group = highlight_augroup, callback = vim.lsp.buf.document_highlight, }) vim.api.nvim_create_autocmd({ 'CursorMoved', 'CursorMovedI' }, { buffer = buf, group = highlight_augroup, callback = vim.lsp.buf.clear_references, }) vim.api.nvim_create_autocmd('LspDetach', { callback = function(event) vim.lsp.buf.clear_references() vim.api.nvim_clear_autocmds { group = highlight_augroup, buffer = event.buf } end, }) end if client:supports_method('textDocument/foldingRange') then local win = vim.api.nvim_get_current_win() vim.wo[win][0].foldmethod = "expr" vim.wo[win][0].foldexpr = 'v:lua.vim.lsp.foldexpr()' end if client:supports_method('textDocument/codelens') then vim.keymap.set({ 'n', 'v' }, 'grl', function() vim.lsp.codelens.run() end, { buffer = buf }) vim.lsp.codelens.refresh { bufnr = buf } vim.api.nvim_create_autocmd({ 'CursorHold', 'InsertLeave' }, { buffer = buf, callback = function() vim.lsp.codelens.refresh { bufnr = buf } end, }) end end return Lsp