设为首页 加入收藏

TOP

Neovim,要尝一口不?(四)
2023-07-23 13:35:23 】 浏览:104
Tags:Neovim
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
首页 上一页 1 2 3 4 5 6 下一页 尾页 4/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Linux 修改系统时间的两种方式 下一篇keepalived高可用(nginx)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目