使用Neovim搭建Go语言开发环境 | 青训营笔记

7,166 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

介绍

由于 Golang 社区提供了一系列开发工具,如 gopls 这个 language server,还有 goformat 这个 formatter,所以只要能够利用到这些工具,无论是什么编辑器,开发体验都能得到极大程度的提升。

本文将介绍在Neovim中配置Go语言开发环境的方法。

image.png

基于 nvim-lsp 的基础配置

介绍

自 Neovim 0.5 开始,Neovim 便内置了对 LSP(Language Server Protocol)的支持。这意味着LSP协议的支持在 Neovim 核心中完成,并不需要额外插件。

然而除了LSP协议支持本身需要完成以外,每个 language server 所需要的不同配置,如其对应的命令、对应的文件类型还有找到项目根目录的方法还需要完成,因此除了 Neovim 本身的支持以外,我们还需要一些工作才能让 gopls 正常工作。

所幸,这些额外的工作虽然没有放入 Neovim 的核心代码中,Neovim 的核心团队也已经帮助我们完成了,这就是 nvim-lspconfig 的作用。它虽然不是 Neovim 核心代码的一部分,却是 Neovim 核心开发者们为我们提供的插件。

安装

笔者使用的插件管理器是 lazy.nvim ,这个插件管理器被作者公开不到半个月,已经在 GitHub 上面收获了 2k 以上的 stars。lazy.nvim的安装方法在其 README文件中有详细介绍,这里不再赘述。

对于 lazy.nvim,nvim-lspconfig的安装方法如下:

require("lazy").setup {
  -- Other plugins ...
  {
    "neovim/nvim-lspconfig",
    config = function()
      -- Configuration for nvim-lspconfig
    end,
  },
  -- Other plugins ...
}

即将其相关配置作为 Lua 语言中的一个 table 传给 lazy.nvim 的 setup 函数。

完成以上步骤后,下一次启动 Neovim,lazy.nvim 将自动安装nvim-lspconfig。

配置

传给 lazy.nvim 的表格中的 config 函数将会在其对应插件被加载之后调用,也就是说我们可以将插件相关配置放在这个函数的函数体中。

config = function()
  -- Configuration for nvim-lspconfig
end,

我个人推荐的方法是在这里用 Lua 的 require() 函数加载另一个文件,以此达到将配置文件分离的目的,不过在这里为了介绍方便,我们可以将配置文件先写在这个位置。

为了让 nvim-lspconfig 加载 gopls 的配置,我们只需在此添加简单的一行代码:

config = function()
  require("lspconfig").gopls.setup()
end,

自此,我们就能在 Neovim 中看到 gopls 提供的语法诊断信息了。

不过,gopls 提供了丰富的选项,可以让我们对其进行配置,选项列表参考它的文档 settings.md

这个文档的示例只有在 vscode 中有效。为了让其同样能用于 Neovim 中,我们稍加改动。例如文档提到的在 vscode 的 settings.json 中添加

"gopls": {
  "ui.completion.usePlaceholders": true,
   ...
},

在 Neovim 中,我们只需向上面的 setup() 函数传递对应的 Lua table。

config = function()
  require("lspconfig").gopls.setup {
    settings = {
      gopls = {
        ui = {
          completion = {
            usePlaceholders = true,
          },
        },
      },
    },
  }
end,

其它选项也同理。

至此,基于 nvim-lsp 的基本配置就完成了。

基于 go.nvim 的进阶配置

上面我们介绍了 gopls 在 Neovim 中的使用方法,由于 gopls 可以调用 formatter,因此我们不需要额外的 formatter 配置。然而 Golang 提供的工具链却远不止 language server 和 formatter,这些额外的工具链的支持我们可以通过 go.nvim 这个插件完成。感兴趣可以看其 README,本文对此不再深入介绍。