golang为Vim/Neovim添加gopls语言服务器功能的插件coc-go使用

coc-go:为Vim/Neovim添加gopls语言服务器功能的插件

coc-go是一个使用gopls为coc.nvim提供Go语言服务器支持的扩展插件。

安装

在Vim/Neovim中运行以下命令安装:

:CocInstall coc-go

功能特性

coc-go提供了gopls的所有功能特性。

命令

除了gopls提供的命令外,coc-go还提供了以下额外命令:

命令 描述
go.gopls.tidy 运行gopls.tidy LSP命令
go.impl.cursor 生成接口存根
go.install.gomodifytags 安装/更新gomodifytags
go.install.goplay 安装/更新goplay
go.install.gopls 安装/更新gopls
go.install.gotests 安装/更新gotests
go.install.impl 安装/更新impl
go.install.tools 安装/更新所有工具
go.playground 在Go playground上运行
go.tags.add 为结构体字段添加标签
go.tags.add.line 为当前行的结构体字段添加标签
go.tags.add.prompt 为结构体字段添加标签(交互式)
go.tags.clear 清除结构体字段的所有标签
go.tags.clear.line 清除当前行结构体字段的所有标签
go.tags.remove 移除结构体字段的标签
go.tags.remove.line 移除当前行结构体字段的标签
go.tags.remove.prompt 移除结构体字段的标签(交互式)
go.test.generate.exported 为文件中的导出函数生成单元测试
go.test.generate.file 为文件生成单元测试
go.test.generate.function 为当前函数生成单元测试
go.test.toggle 切换测试文件
go.version 打印扩展版本

示例

添加或移除特定标签

" 添加yaml标签
CocCommand go.tags.add yaml

" 添加多个标签
CocCommand go.tags.add yaml json xml 

" 移除xml标签
CocCommand go.tags.remove xml

保存时自动添加缺失的import

" 在保存Go文件时自动组织import
autocmd BufWritePre *.go :silent call CocAction('runCommand', 'editor.action.organizeImport')

为命令映射快捷键

" 为常用标签操作设置快捷键
autocmd FileType go nmap gtj :CocCommand go.tags.add json<cr>
autocmd FileType go nmap gty :CocCommand go.tags.add yaml<cr>
autocmd FileType go nmap gtx :CocCommand go.tags.clear<cr>

代码片段

代码片段是从golang/vscode-go导入的,需要安装coc-snippets才能使用。

配置选项

coc-go提供了丰富的配置选项,可以在coc-settings.json中设置。以下是一些主要配置项:

配置项 描述 默认值
go.checkForUpdates 启动时检查gopls更新 install
go.goplsOptions gopls选项设置 -
go.goplsPath gopls二进制文件路径 -
go.goplsUseDaemon 以daemon模式运行gopls true
go.tags 标签相关设置 -
go.tests 测试相关设置 -
go.trace.server gopls跟踪级别 off

示例配置

{
  "go.goplsOptions": {
    "completeUnimported": true
  }
}

开发

  1. 运行 npm run buildnpm run build:watch
  2. 链接扩展: npm run link / npm run unlink

相关工具

coc-go依赖于以下Go工具:

  • gomodifytags - 用于结构体标签操作
  • goplay - 用于Go playground
  • gopls - Go语言服务器
  • gotests - 用于生成测试
  • impl - 用于生成接口实现

常见问题

coc-go与vim-go比较

coc-go的目标不是重现vim-go的所有功能,而是提供一个方便的方式来安装和使用gopls与coc.nvim集成。

使用coc-go与wasm

在coc-settings.json中添加以下配置:

{
  "go.goplsEnv": {
    "GOOS": "js",
    "GOARCH": "wasm"
  }
}

以daemon模式运行gopls

coc-go默认以daemon模式运行gopls(通过传递-remote=auto参数)。要禁用此行为,可将go.goplsUseDaemon设置为false

许可证

MIT © Josa Gesell


更多关于golang为Vim/Neovim添加gopls语言服务器功能的插件coc-go使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang为Vim/Neovim添加gopls语言服务器功能的插件coc-go使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用coc-go为Vim/Neovim添加gopls语言服务器功能

coc-go是一个基于coc.nvim的Go语言插件,它为Vim/Neovim提供了gopls语言服务器的集成支持,可以带来智能代码补全、定义跳转、代码格式化等现代化IDE功能。

安装准备

1. 安装依赖

首先需要安装以下依赖:

  • Neovim (推荐) 或 Vim 8.1+
  • Node.js (用于运行coc.nvim)
  • Go工具链 (go命令)

2. 安装coc.nvim

coc-go是基于coc.nvim的插件,所以需要先安装coc.nvim:

" 使用vim-plug安装
Plug 'neoclide/coc.nvim', {'branch': 'release'}

然后运行:PlugInstall安装插件。

安装coc-go

方法1:通过coc安装

在Vim/Neovim中执行:

:CocInstall coc-go

方法2:使用插件管理器

如果你使用vim-plug等插件管理器:

Plug 'josa42/coc-go'

配置coc-go

基本配置

在vim配置文件中添加(通常是~/.config/nvim/init.vim~/.vimrc):

" 启用coc-go
let g:coc_global_extensions = ['coc-go']

" 设置gopls路径(可选)
let g:go_gopls_enabled = 1
let g:go_gopls_options = ['-remote=auto']

" 快捷键映射
nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)
nmap <silent> rn <Plug>(coc-rename)

高级配置

可以创建~/.config/nvim/coc-settings.json进行更详细的配置:

{
  "go.goplsOptions": {
    "staticcheck": true,
    "completeUnimported": true,
    "usePlaceholders": true
  },
  "go.trace.server": "verbose",
  "go.testFlags": ["-v"],
  "go.formatTool": "goimports",
  "go.lintTool": "golangci-lint",
  "go.lintOnSave": "package"
}

常用功能

代码补全

在编辑Go文件时,输入时会自动触发补全,按<C-Space>可以手动触发。

跳转定义

  • gd - 跳转到定义
  • gy - 跳转到类型定义
  • gi - 跳转到实现
  • gr - 查看引用

代码操作

  • K - 显示文档
  • rn - 重命名符号
  • <leader>a - 代码操作(如添加缺失的导入)

测试支持

  • :CocCommand go.test.generate - 为当前函数生成测试
  • :CocCommand go.test.file - 运行当前文件的测试
  • :CocCommand go.test.package - 运行当前包的测试

常见问题解决

1. gopls未启动

确保已安装gopls:

go install golang.org/x/tools/gopls@latest

2. 补全不工作

检查coc-go是否已正确安装:

:CocList extensions

3. 性能问题

可以尝试调整gopls内存设置:

{
  "go.goplsOptions": {
    "memoryMode": "DegradeClosed",
    "build.experimentalWorkspaceModule": true
  }
}

自定义命令

可以创建自定义命令来增强体验:

" 格式化Go代码
command! -nargs=0 Format :call CocAction('format')

" 组织导入
command! -nargs=0 OR :call CocAction('runCommand', 'editor.action.organizeImport')

" 添加当前文件所有缺失的导入
command! -nargs=0 AddAllMissingImports :call CocAction('runCommand', 'go.import.add.all')

coc-go为Vim/Neovim提供了强大的Go语言开发支持,结合gopls的功能,可以让你的Go开发体验接近现代IDE的水平。

回到顶部