vim.api.nvim_create_autocmd("LspAttach", {
group = vim.api.nvim_create_augroup("lsp-attach", { clear = true }),
callback = function(event)
local map = function(keys, func, desc, mode)
vim.keymap.set(mode, keys, func, { buffer = event.buf, desc = "LSP: " .. desc })
-- 设置一些快捷键,你可以使用这些快捷键进行LSP有关的操作
map("grn", vim.lsp.buf.rename, "[R]ename")
map("grs", require("telescope").extensions.aerial.aerial, "LSP Symbols")
map("gra", vim.lsp.buf.code_action, "[G]oto Code [A]ction", { "n", "x" })
map("grr", require("telescope.builtin").lsp_references, "[G]oto [R]eferences")
map("gri", require("telescope.builtin").lsp_implementations, "[G]oto [I]mplementation")
map("grd", require("telescope.builtin").lsp_definitions, "[G]oto [D]efinition")
map("grD", vim.lsp.buf.declaration, "[G]oto [D]eclaration")
map("gO", require("telescope.builtin").lsp_document_symbols, "Open Document Symbols")
map("grw", require("telescope.builtin").lsp_dynamic_workspace_symbols, "Open Workspace Symbols")
map("grt", require("telescope.builtin").lsp_type_definitions, "[G]oto [T]ype Definition")
map("grh", vim.lsp.buf.hover, "Hover")
local function client_supports_method(client, method, bufnr) return client:supports_method(method, bufnr) end
-- 自动高亮你光标下内容的引用,并在光标移动时清除
local client = vim.lsp.get_client_by_id(event.data.client_id)
and client_supports_method(client, vim.lsp.protocol.Methods.textDocument_documentHighlight, event.buf)
local highlight_augroup = vim.api.nvim_create_augroup("lsp-highlight", { clear = false })
vim.api.nvim_create_autocmd({ "CursorHold", "CursorHoldI" }, {
group = highlight_augroup,
callback = vim.lsp.buf.document_highlight,
vim.api.nvim_create_autocmd({ "CursorMoved", "CursorMovedI" }, {
group = highlight_augroup,
callback = vim.lsp.buf.clear_references,
vim.api.nvim_create_autocmd("LspDetach", {
group = vim.api.nvim_create_augroup("lsp-detach", { clear = true }),
callback = function(event2)
vim.lsp.buf.clear_references()
vim.api.nvim_clear_autocmds {
-- 创建一个快捷键,以便切换是否启用 Inlay Hints(如果可用)
if client and client_supports_method(client, vim.lsp.protocol.Methods.textDocument_inlayHint, event.buf) then
vim.lsp.inlay_hint.enable(true) -- 默认启用,你可以把它改为false
vim.keymap.set("n", "<leader>uh", function()
vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled { bufnr = event.buf })
if vim.lsp.inlay_hint.is_enabled { bufnr = event.buf } then
vim.notify("Inlay hints: " .. "ON")
vim.notify("Inlay hints: " .. "OFF")
end, { desc = "Toggle Inlay Hints" })
-- 查看 :help vim.diagnostic.Opts
float = { border = "rounded", source = "if_many" },
underline = { severity = vim.diagnostic.severity.ERROR },
[vim.diagnostic.severity.ERROR] = " ", -- 这里配置“错误”的图标,需要nerd font字体
[vim.diagnostic.severity.WARN] = " ",
[vim.diagnostic.severity.INFO] = " ",
[vim.diagnostic.severity.HINT] = " ",
format = function(diagnostic)
local diagnostic_message = {
[vim.diagnostic.severity.ERROR] = diagnostic.message,
[vim.diagnostic.severity.WARN] = diagnostic.message,
[vim.diagnostic.severity.INFO] = diagnostic.message,
[vim.diagnostic.severity.HINT] = diagnostic.message,
return diagnostic_message[diagnostic.severity]
function() vim.diagnostic.jump { severity = vim.diagnostic.severity.HINT, count = -1 } end,
{ desc = "Previous hint" }
function() vim.diagnostic.jump { severity = vim.diagnostic.severity.HINT, count = 1 } end,
function() vim.diagnostic.jump { severity = vim.diagnostic.severity.INFO, count = -1 } end,
{ desc = "Previous info" }
function() vim.diagnostic.jump { severity = vim.diagnostic.severity.INFO, count = 1 } end,
function() vim.diagnostic.jump { severity = vim.diagnostic.severity.WARN, count = -1 } end,
{ desc = "Previous warning" }
function() vim.diagnostic.jump { severity = vim.diagnostic.severity.WARN, count = 1 } end,
{ desc = "Next warning" }
function() vim.diagnostic.jump { severity = vim.diagnostic.severity.ERROR, count = -1 } end,
{ desc = "Previous error" }
function() vim.diagnostic.jump { severity = vim.diagnostic.severity.ERROR, count = 1 } end,
-- 当光标处有诊断信息时自动显示vim.api.nvim_create_autocmd("CursorHold", {
vim.diagnostic.open_float(nil, {
close_events = { "CursorMoved", "CursorMovedI", "BufHidden", "InsertCharPre" },