fix issue with gd

This commit is contained in:
Walter Jenkins 2025-12-01 12:19:37 -06:00
parent eea5afaa74
commit 15127f310e
4 changed files with 121 additions and 57 deletions

View File

@ -53,6 +53,7 @@ return {
-- ✅ Disable project module to avoid error -- ✅ Disable project module to avoid error
opts.config.project = { enable = false } opts.config.project = { enable = false }
pcall(vim.keymap.del, "n", "g")
end, end,
}, },
} }

View File

@ -1,49 +1,113 @@
-- lua/plugins/lsp-keymaps.lua -- lua/plugins/lsp-keymaps.lua
return { return {
-- Attach to the existing LSP config plugin -- Attach to the existing LSP config plugin
'neovim/nvim-lspconfig', "neovim/nvim-lspconfig",
-- We just need this to run once; inside we create an LspAttach autocmd -- We just need this to run once; inside we create an LspAttach autocmd
event = 'VeryLazy', event = "VeryLazy",
config = function() config = function()
-- Only define the autocmd once local group = vim.api.nvim_create_augroup("UserLspKeymaps", { clear = true })
vim.api.nvim_create_augroup('UserLspKeymaps', { clear = true })
vim.api.nvim_create_autocmd('LspAttach', { vim.api.nvim_create_autocmd("LspAttach", {
group = 'UserLspKeymaps', group = group,
callback = function(ev) callback = function(ev)
local bufnr = ev.buf local bufnr = ev.buf
local opts = function(extra)
return vim.tbl_extend('force', { buffer = bufnr, silent = true, noremap = true }, extra or {}) -- Helper to build opts for this buffer
local function opts(desc)
return {
buffer = bufnr,
silent = true,
noremap = true,
desc = desc,
}
end
-- Smarter "go to definition":
-- - Ask for definition
-- - If it points to an import line in the same file, fall back to implementation
local function goto_definition_preferring_source()
local params = vim.lsp.util.make_position_params()
local function jump_to(loc)
if not loc then return end
vim.lsp.util.jump_to_location(loc, "utf-8")
end
vim.lsp.buf_request(bufnr, "textDocument/definition", params, function(err, result)
if err or not result then
return
end
local locations = result
if not vim.tbl_islist(locations) then
locations = { locations }
end
if #locations == 0 then
return
end
local first = locations[1]
local uri = first.uri or first.targetUri
local range = first.range or first.targetRange
if not (uri and range) then
return jump_to(first)
end
local def_bufnr = vim.uri_to_bufnr(uri)
local cur_bufnr = bufnr
-- If TS says "definition is this import in the same file", try implementation instead.
if def_bufnr == cur_bufnr then
local line_nr = range.start.line
local line = vim.api.nvim_buf_get_lines(def_bufnr, line_nr, line_nr + 1, false)[1] or ""
if line:match("^%s*import") then
vim.lsp.buf_request(bufnr, "textDocument/implementation", params, function(err2, impl)
if err2 or not impl then
return jump_to(first)
end
local impl_locs = impl
if not vim.tbl_islist(impl_locs) then
impl_locs = { impl_locs }
end
jump_to(impl_locs[1] or first)
end)
return
end
end
jump_to(first)
end)
end end
-- Core LSP maps -- Core LSP maps
vim.keymap.set('n', '<leader>cl', '<cmd>LspInfo<CR>', opts { desc = 'LSP Info' }) vim.keymap.set("n", "<leader>cl", "<cmd>LspInfo<CR>", opts("LSP Info"))
vim.keymap.set('n', 'gd', vim.lsp.buf.definition, opts { desc = 'Go to Definition' }) vim.keymap.set("n", "gd", goto_definition_preferring_source, opts("Go to Definition"))
vim.keymap.set('n', 'gr', vim.lsp.buf.references, opts { desc = 'References' }) vim.keymap.set("n", "gr", vim.lsp.buf.references, opts("References"))
vim.keymap.set('n', 'gI', vim.lsp.buf.implementation, opts { desc = 'Go to Implementation' }) vim.keymap.set("n", "gI", vim.lsp.buf.implementation, opts("Go to Implementation"))
vim.keymap.set('n', 'gy', vim.lsp.buf.type_definition, opts { desc = 'Go to Type Definition' }) vim.keymap.set("n", "gy", vim.lsp.buf.type_definition, opts("Go to Type Definition"))
vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, opts { desc = 'Go to Declaration' }) vim.keymap.set("n", "gD", vim.lsp.buf.declaration, opts("Go to Declaration"))
vim.keymap.set('n', 'gK', vim.lsp.buf.signature_help, opts { desc = 'Signature Help' }) vim.keymap.set("n", "gK", vim.lsp.buf.signature_help, opts("Signature Help"))
vim.keymap.set('i', '<C-k>', vim.lsp.buf.signature_help, opts { desc = 'Signature Help' }) vim.keymap.set("i", "<C-k>", vim.lsp.buf.signature_help, opts("Signature Help"))
vim.keymap.set({ 'n', 'v' }, '<leader>ca', vim.lsp.buf.code_action, opts { desc = 'Code Action' }) vim.keymap.set({ "n", "v" }, "<leader>ca", vim.lsp.buf.code_action, opts("Code Action"))
-- Rename symbol -- Rename symbol
vim.keymap.set('n', '<leader>cr', vim.lsp.buf.rename, opts { desc = 'Rename' }) vim.keymap.set("n", "<leader>cr", vim.lsp.buf.rename, opts("Rename"))
-- Rename file via Snacks, but **safely** -- Rename file via Snacks, but safely
vim.keymap.set('n', '<leader>cR', function() vim.keymap.set("n", "<leader>cR", function()
local ok, snacks = pcall(require, 'snacks') local ok, snacks = pcall(require, "snacks")
if ok and snacks.rename and snacks.rename.rename_file then if ok and snacks.rename and snacks.rename.rename_file then
snacks.rename.rename_file() snacks.rename.rename_file()
else else
print 'Snacks rename not available' print("Snacks rename not available")
end end
end, opts { desc = 'Rename File' }) end, opts("Rename File"))
end, end,
}) })
end, end,

View File

@ -71,37 +71,37 @@ return {
}, },
}) })
-- ============================== -- -- ==============================
-- TypeScript / JavaScript (ts_ls OR tsserver fallback) -- -- TypeScript / JavaScript (ts_ls OR tsserver fallback)
-- ============================== -- -- ==============================
local ts_server = lspconfig.ts_ls or lspconfig.tsserver -- local ts_server = lspconfig.ts_ls or lspconfig.tsserver
if ts_server then -- if ts_server then
ts_server.setup({}) -- ts_server.setup({})
end -- end
--
-- ============================== -- -- ==============================
-- Astro (guard if missing) -- -- Astro (guard if missing)
-- ============================== -- -- ==============================
if lspconfig.astro then -- if lspconfig.astro then
local function get_typescript_lib() -- local function get_typescript_lib()
local mason_ts = vim.fs.normalize( -- local mason_ts = vim.fs.normalize(
"~/.local/share/nvim/mason/packages/typescript-language-server/node_modules/typescript/lib" -- "~/.local/share/nvim/mason/packages/typescript-language-server/node_modules/typescript/lib"
) -- )
if vim.fn.isdirectory(mason_ts) == 1 then return mason_ts end -- if vim.fn.isdirectory(mason_ts) == 1 then return mason_ts end
--
local global_ts = (vim.fn.system("npm root -g"):gsub("\n", "")) .. "/typescript/lib" -- local global_ts = (vim.fn.system("npm root -g"):gsub("\n", "")) .. "/typescript/lib"
if vim.fn.isdirectory(global_ts) == 1 then return global_ts end -- if vim.fn.isdirectory(global_ts) == 1 then return global_ts end
--
return vim.fs.normalize( -- return vim.fs.normalize(
"~/.local/share/nvim/mason/packages/astro-language-server/node_modules/typescript/lib" -- "~/.local/share/nvim/mason/packages/astro-language-server/node_modules/typescript/lib"
) -- )
end -- end
--
lspconfig.astro.setup({ -- lspconfig.astro.setup({
init_options = { typescript = { tsdk = get_typescript_lib() } }, -- init_options = { typescript = { tsdk = get_typescript_lib() } },
}) -- })
end -- end
--
-- ============================== -- ==============================
-- templ (register config if missing) -- templ (register config if missing)
-- ============================== -- ==============================

View File

@ -1,4 +1,3 @@
-- lua/plugins/mason.lua -- lua/plugins/mason.lua
return { return {
{ {
@ -13,9 +12,9 @@ return {
lazy = false, lazy = false,
dependencies = { "williamboman/mason.nvim" }, dependencies = { "williamboman/mason.nvim" },
opts = { opts = {
ensure_installed = { "gopls", "ts_ls", "templ", "astro" }, ensure_installed = { "gopls", "templ", "vtsls" }, -- 👈 add this
automatic_installation = true, automatic_installation = true,
automatic_setup = false, -- IMPORTANT: don't auto-setup servers automatic_setup = false,
}, },
}, },
} }