在 Windows 中配置 nvim 的 Go 语言环境
去年我试用了 Helix 编辑器, 感觉很好, 写了一篇介绍文章 https://geeknote.net/SuperMild/posts/976
但 Helix 没有 GUI 程序, 必须在终端里使用, 我主要是在 Windows 里使用, 遇到了快捷键冲突, 显示不正常等一些问题, 不得不弃用了.
因此, 我重新看向 vim, 抽空试用了 neovim, 这个有 GUI 程序, 试用起来感觉还不错.
我暂时只配置了 Go 语言环境, 下面详细讲解配置方法, 本文注重可操作性, 每一个细节都讲到了, 确保你可以必然一定绝对安装成功!
(如果遇到问题, 欢迎留言指出)
安装 neovim
看这里 https://github.com/neovim/neovim/wiki/Installing-Neovim
安装后, 启动 nvim-qt, 输入 :Tutor
学习基础后, 就可以开始使用了.
重要的文件夹和文件
在 nvim 中输入 :echo stdpath('data')
可以找到用来安装插件系统的文件夹,
通常是 C:\Users\username\AppData\Local\nvim-data
(以下称为 data 文件夹).
在 nvim 中输入 :echo stdpath('config')
可以找到存放配置文件的文件夹,
通常是 C:\Users\username\AppData\Local\nvim
(以下称为 config 文件夹).
config 文件夹可能还不存在, 请手动创建它.
然后, 在 config 文件夹中新建一个名为 init.vim 的文件, 后面有用.
在 config 文件夹中新建文件夹 ftplugin, 后面有用.
如上所示, 我们得到了几个重要的文件夹和文件:
- data 文件夹
- config 文件夹
- ftplugin 文件夹
- init.vim 文件
安装插件
-
在 data 文件夹中创建文件夹 site/autoload
(得到文件夹C:\Users\username\AppData\Local\nvim-data\site\autoload
) -
下载 plug.vim 文件 https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
-
把 plug.vim 文件放进上述 autoload 文件夹内.
-
在 init.vim 中添加以下内容
call plug#begin()
" Make sure you use single quotes
Plug 'nvim-treesitter/nvim-treesitter'
Plug 'neovim/nvim-lspconfig'
Plug 'ray-x/go.nvim'
Plug 'ray-x/guihua.lua'
call plug#end()
" Reload .vimrc and :PlugInstall to install plugins.
5.重启一次 nvim, 然后执行 :PlugInstall
6.重启一次 nvim, 然后执行 :TSInstall go
(温馨提示, 虽然又要重启 nvim, 但无需有心理压力, 毕竟 nvim 很轻.)
7.在 init.vim 中添加以下内容 (参考: https://github.com/neovim/nvim-lspconfig)
lua <<EOF
-- Setup language servers.
local lspconfig = require('lspconfig')
lspconfig.gopls.setup {}
-- Global mappings.
-- See `:help vim.diagnostic.*` for documentation on any of the below functions
vim.keymap.set('n', '<space>e', vim.diagnostic.open_float)
vim.keymap.set('n', '[d', vim.diagnostic.goto_prev)
vim.keymap.set('n', ']d', vim.diagnostic.goto_next)
vim.keymap.set('n', '<space>q', vim.diagnostic.setloclist)
-- Use LspAttach autocommand to only map the following keys
-- after the language server attaches to the current buffer
vim.api.nvim_create_autocmd('LspAttach', {
group = vim.api.nvim_create_augroup('UserLspConfig', {}),
callback = function(ev)
-- Enable completion triggered by <c-x><c-o>
vim.bo[ev.buf].omnifunc = 'v:lua.vim.lsp.omnifunc'
-- Buffer local mappings.
-- See `:help vim.lsp.*` for documentation on any of the below functions
local opts = { buffer = ev.buf }
vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, opts)
vim.keymap.set('n', 'gd', vim.lsp.buf.definition, opts)
vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts)
vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, opts)
vim.keymap.set('n', '<C-k>', vim.lsp.buf.signature_help, opts)
vim.keymap.set('n', '<space>wa', vim.lsp.buf.add_workspace_folder, opts)
vim.keymap.set('n', '<space>wr', vim.lsp.buf.remove_workspace_folder, opts)
vim.keymap.set('n', '<space>wl', function()
print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
end, opts)
vim.keymap.set('n', '<space>D', vim.lsp.buf.type_definition, opts)
vim.keymap.set('n', '<space>rn', vim.lsp.buf.rename, opts)
vim.keymap.set({ 'n', 'v' }, '<space>ca', vim.lsp.buf.code_action, opts)
vim.keymap.set('n', 'gr', vim.lsp.buf.references, opts)
vim.keymap.set('n', '<space>f', function()
vim.lsp.buf.format { async = true }
end, opts)
end,
})
EOF
8.在 ftplugin 文件夹内新建 go.vim 文件, 内容如下:
setlocal tabstop=4
setlocal softtabstop=4
setlocal shiftwidth=4
lua <<EOF
require('go').setup()
EOF
9.最后重启一次 nvim, 完成.
Go 语言环境配置好之后, 一些常见用法
在上面第 7 步中可以看到一些用法, 例如:
-
gd
跳转到函数的定义 -
K
查看注释
另外看这里 https://github.com/ray-x/go.nvim 有一些使用方法的说明, 例如:
-
:GoFmt
格式化 -
:GoImport
自动处理 import
也可以设置为保存时自动触发, 但我觉得手动也蛮好.
最后是 nvim 自带的功能, 例如:
-
C-n
或C-p
补充单词 -
C-o
往回跳