Something went wrong. Try again.
Neovim config
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173local lsp_buf = vim.lsp.buflocal opts = require("utils.map").new_opts
local function telepick(action, fallback, picker_opts) fallback = fallback or action picker_opts = picker_opts or {} local is_avail, tb = pcall(require, "telescope.builtin") if is_avail then tb["lsp_" .. action](picker_opts) else lsp_buf[fallback]() endend
-- workaround for efm directly pushing formatter stdout to bufferlocal function fmt_with_edit() local win_state = vim.call("winsaveview")
vim.lsp.buf.format({ name = "efm" })
vim.cmd("edit!") vim.call("winrestview", win_state)end
local function efm_fmt(buf) local matched_clients = vim.lsp.get_clients({ name = "efm", bufnr = buf })
if vim.tbl_isempty(matched_clients) then return end
local efm = matched_clients[1] local ft = vim.api.nvim_get_option_value("filetype", { buf = buf }) local formatters = efm.config.settings.languages[ft]
local matches = vim.tbl_filter(function(fmt) return not fmt.formatStdin end, formatters)
if not vim.tbl_isempty(matches) then fmt_with_edit() else vim.lsp.buf.format({ name = "efm", timeout_ms = 5000, async = true }) endend
local M = {}
function M.keymaps(bufnr) return { imap = { { "<C-s>", lsp_buf.signature_help }, },
nxmap = { { "<localleader>ff", function() lsp_buf.format({ filter = function(client) local exclude = { "efm", "sqls" } return not vim.tbl_contains(exclude, client.name) end, timeout_ms = 5000, async = true, }) end, opts(bufnr), }, { "<localleader>fe", function() efm_fmt(bufnr) end, opts(bufnr, "Format with efm"), }, },
nmap = { { "K", function() lsp_buf.hover({ border = "single" }) end, opts(bufnr), }, { "<localleader>r", lsp_buf.rename, opts(bufnr), }, { "<localleader>a", lsp_buf.code_action, opts(bufnr), }, { "<localleader>s", function() lsp_buf.signature_help({ border = "single" }) end, opts(bufnr), }, { "<localleader>t", lsp_buf.type_definition, opts(bufnr), }, { "<localleader>o", vim.diagnostic.open_float, opts(bufnr), }, { "<localleader>d", vim.diagnostic.setloclist, opts(bufnr), }, { "]d", function() vim.diagnostic.jump({ count = 1, float = true }) end, opts(bufnr), }, { "[d", function() vim.diagnostic.jump({ count = -1, float = true }) end, opts(bufnr), }, { "gd", function() telepick("definitions", "definition") end, opts(bufnr), }, { "gi", function() telepick("implementations", "implementation") end, opts(bufnr), }, { "gr", function() telepick("references") end, opts(bufnr), }, { "<localleader>w", function() telepick("dynamic_workspace_symbols", "workspace_symbol", { fname_width = 40 }) end, opts(bufnr), }, { "<localleader>i", function() vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled({})) end, opts(bufnr), }, }, }end
return M