kickstart.nvim/lua/core/keymaps/lsp.lua

71 lines
3.1 KiB
Lua

---@diagnostic disable: undefined-global
-- LSP keymaps
local M = {}
function M.setup(bufnr)
local keymaps = {
-- Go to definitions
{ mode = 'n', lhs = 'gd', rhs = function() require('telescope.builtin').lsp_definitions() end, opts = { desc = 'LSP: Go to definition' } },
{ mode = 'n', lhs = 'gr', rhs = function() require('telescope.builtin').lsp_references() end, opts = { desc = 'LSP: Find references' } },
{ mode = 'n', lhs = 'gI', rhs = function() require('telescope.builtin').lsp_implementations() end, opts = { desc = 'LSP: Go to implementation' } },
{ mode = 'n', lhs = 'gy', rhs = function() require('telescope.builtin').lsp_type_definitions() end, opts = { desc = 'LSP: Go to type definition' } },
-- Symbol navigation
{ mode = 'n', lhs = '<leader>ls', rhs = function()
require('telescope.builtin').lsp_document_symbols({ position_encoding = 'utf-16' })
end, opts = { desc = 'LSP: Document symbols' } },
{ mode = 'n', lhs = '<leader>lS', rhs = function()
local status_ok, _ = pcall(function()
require('telescope.builtin').lsp_dynamic_workspace_symbols({
position_encoding = 'utf-16',
show_line = true,
fname_width = 50,
symbol_width = 35,
attach_mappings = function(prompt_bufnr)
require("telescope.actions").select_default:replace(function()
local entry = require("telescope.actions.state").get_selected_entry()
if not entry then return end
require("telescope.actions").close(prompt_bufnr)
if entry.value and entry.value.filename then
vim.cmd(string.format('edit %s', entry.value.filename))
vim.api.nvim_win_set_cursor(0, {entry.value.lnum, entry.value.col})
end
end)
return true
end
})
end)
if not status_ok then
vim.notify("Workspace symbols not available for this language server", vim.log.levels.INFO)
end
end, opts = { desc = 'LSP: Workspace symbols' } },
-- Code actions
{ mode = 'n', lhs = '<leader>lr', rhs = vim.lsp.buf.rename, opts = { desc = 'LSP: Rename symbol' } },
{ mode = 'n', lhs = '<leader>la', rhs = vim.lsp.buf.code_action, opts = { desc = 'LSP: Code action' } },
{ mode = 'n', lhs = '<leader>lf', rhs = function() vim.lsp.buf.format({ async = true }) end, opts = { desc = 'LSP: Format code' } },
-- Documentation
{ mode = 'n', lhs = 'K', rhs = function() require('hover').hover() end, opts = { desc = 'Enhanced documentation (hover.nvim)' } },
}
-- Clear existing LSP keymaps for this buffer
local lsp_maps = { 'gd', 'gr', 'gI', 'gy', 'K', '<leader>ls', '<leader>lS', '<leader>lr', '<leader>la', '<leader>lf' }
for _, lhs in ipairs(lsp_maps) do
pcall(vim.keymap.del, 'n', lhs, { buffer = bufnr })
end
-- Set keymaps with buffer local
for _, mapping in ipairs(keymaps) do
vim.keymap.set(mapping.mode, mapping.lhs, mapping.rhs, vim.tbl_extend('force', mapping.opts, {
buffer = bufnr,
replace_keycodes = false,
nowait = true,
silent = true,
}))
end
end
return M