attach = on_attach
})
lspcfg.pyright.setup({
capabilities = capabilities,
on_attach = on_attach
})
lspcfg.rust_analyzer.setup({
capabilities = capabilities,
on_attach = on_attach
})
end,
},
仍然是最简单的解释一下:
- 使用了 nvim-lspconfig 插件来做 LSP 的配置;
- 不同的编程语言要安装不同的语言服务,使用 mason 来统一管理这些语言服务组件;
- 自动安装 bash、c/c++、js/ts、python、rust 语言服务;
- 集成上述编程语言的语义化自动完成功能;
其中有个 on_attach
在给出的配置代码中暂未给出,是因为这是个公用函数,下文的代码格式化也会用到,所以稍后再描述。
格式化及诊断
这两项内容均使用 null-ls 插件实现,配置如下:
{
"jose-elias-alvarez/null-ls.nvim",
dependencies = {
"nvim-lua/plenary.nvim",
},
config = function()
local nl = require("null-ls")
local sources = {
nl.builtins.diagnostics.eslint_d,
nl.builtins.diagnostics.ruff,
nl.builtins.formatting.beautysh,
nl.builtins.formatting.black,
nl.builtins.formatting.clang_format,
nl.builtins.formatting.prettierd,
nl.builtins.formatting.rustfmt,
nl.builtins.formatting.sql_formatter,
}
nl.setup({
sources = sources,
on_attach = on_attach,
})
end,
},
很明显,诊断与格式化也都与编程语言相关,同样依赖一些第三方组件。尽管上述配置没用明确给出,也可以通过 mason 管理,之前已经安装过些插件。输入 :Mason
即可打开其界面如下:
可以看到我已经安装了 LSP 及格式化与诊断相关的几个组件。
是时候说一下 on_attach
了,其代码如下:
local on_attach = function(client, bufnr)
vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc')
local bufopts = { noremap=true, silent=true, buffer=bufnr }
vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, bufopts)
vim.keymap.set('n', 'gd', vim.lsp.buf.definition, bufopts)
vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, bufopts)
vim.keymap.set('n', 'gr', vim.lsp.buf.references, bufopts)
vim.keymap.set('n', 'K', vim.lsp.buf.hover, bufopts)
vim.keymap.set('n', '<C-k>', vim.lsp.buf.signature_help, bufopts)
vim.keymap.set('n', '<leader>wa', vim.lsp.buf.add_workspace_folder, bufopts)
vim.keymap.set('n', '<leader>wr', vim.lsp.buf.remove_workspace_folder, bufopts)
vim.keymap.set('n', '<leader>wl', function()
print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
end, bufopts)
vim.keymap.set('n', '<leader>D', vim.lsp.buf.type_definition, bufopts)
vim.keymap.set('n', '<leader>rn', vim.lsp.buf.rename, bufopts)
vim.keymap.set('n', '<leader>ca', vim.lsp.buf.code_action, bufopts)
vim.keymap.set('n', '<leader>f', function()
vim.lsp.buf.format { async = true }
end, bufopts)
local augroup = vim.api.nvim_create_augroup("LspFormatting", {})
if client.supports_method("textDocument/formatting") then
vim.api.nvim_clear_autocmds({ group = augroup, buffer = bufnr })
vim.api.nvim_create_autocmd("BufWritePre", {
group = augroup,
buffer = bufnr,
callback = function()
vim.lsp.buf.format({
filter = function(client)
return client.name == "null-ls"
end,
bufnr = bufnr,
})
end,
})
end
end
主要是定义了一些快捷键,例如:
gd
可以跳转至关键字定义;
gi
可以跳转至类型实现;
,D
可以跳转至类型定义;
,f
代码格式化;
- 保存时自动进行代码格式化;
其它
- 注释,使用插件:comment.nvim;
- 错误列表,使用插件:trouble.nvim;
完整配置
vim.o.listchars = "eol:?,lead:?"
vim.wo.list = true
vim.wo.number = true
vim.wo.signcolumn = "yes"
vim.wo.colorcolumn = "80"
vim.g.shiftround = true
vim.bo.expandtab = true
vim.bo.shiftwidth = 4
vim.bo.softtabstop = 4
vim.bo.tabstop = 4
vim.g.termguicolors = true
vim.g.complet