RGO
RGO 目前处于 MVP 阶段
运行步骤
目前 RGO 需要运行的组件有 :
- rgo_lsp_server —— lsp 插件
- rgo —— 编译期运行命令行工具
目前支持 rgo_lsp_server 的 IDE 有:
- VS-Code
- Goland / IDEA
- Emacs
- VIM/Neovim
VS-Code 和 Goland / IDEA 插件因为还未发布,所以目前只能在本地调试运行。
clone RGO 仓库
git clone https://github.com/cloudwego-contrib/rgo.git
cd rgo
编译安装 rgo
cd cmd/rgo && go install
cd ../..
配置 rgo_lsp_server
Goland / IDEA
目前插件还未发布,因此只能使用 IDEA 进行本地调试
编译生成 rgo_lsp_server
cd cmd/rgo_lsp_server && go build -o rgo_lsp_server .
mv rgo_lsp_server ../../ide_extensions/rgo_goland/src/main/resources/bin/
cd ../..
在 IDEA 中调试运行插件
在 IDEA 中打开克隆下来的 ide_extensions/rgo_goland 项目,并且安装运行所需的 gradle 配置

使用 gradle 的 runIde 启动插件虚拟机

在项目根目录创建一个 rgo_config.yaml 即可体验此插件

idl_repos:
- repo_name: kitex_example
git_url: https://github.com/cloudwego/kitex-examples.git
branch: main
commit:
idls:
- idl_path: hello/hello.thrift
repo_name: kitex_example
service_name: a.b.c
VS-Code
编译生成 rgo_lsp_server
cd cmd/rgo_lsp_server && go build -o rgo_lsp_server .
mv rgo_lsp_server ../../ide_extensions/rgo_vscode/bin/
cd ../..
在 VS-Code 中调试运行插件
在 VS-Code 中打开克隆下来的 ide_extensions/rgo_vscode 项目

在 rgo_vscode 项目根目录下执行以下命令安装依赖
若从未安装过 nodejs 依赖,macos 执行
brew install node
linux 执行
sudo apt-get install nodejs
执行以下命令安装 npm 依赖
npm install
使用快捷键 F5 即可本地启动 vscode 插件 、或参考截图

新建测试项目
然后会弹出搭载了 go-lsp 插件的 vscode 窗口,新建一个新的项目用于展示效果
mkdir -p ~/rgo_test
cd ~/rgo_test
在根目录下新建配置文件 rgo_config.yaml
idl_repos:
- repo_name: kitex_example
git_url: https://github.com/cloudwego/kitex-examples.git
branch: main
commit:
idls:
- idl_path: hello/hello.thrift
repo_name: kitex_example
service_name: a.b.c
vscode 插件
支持功能
- rgo_config.yml 配置文件解析智能提示
- 自动预下载
rgo_lsp_server
- 支持消费配置中的 idls, 做到无侵入的代码提示
支持 vscode 配置
rgo.useLanguageServer, 默认为 true, 用于控制是否开启 rgo language server,关闭后将不会有任何提示
rgo.languageServerInstall, 默认为 go install github.com/cloudwego-contrib/cmd/rgo_lsp_server@latest, 用于配置
rgo_lsp_server 的安装命令
支持的 vscode 命令
RGo: Install language server, 用于安装 rgo_lsp_server
RGo: Restart language server, 用于重启 rgo_lsp_server

效果展示

Emacs
编译安装 rgo_lsp_server
go install cmd/rgo_lsp_server
在根目录下新建配置文件 rgo_config.yaml
新建一个项目,在 rgo_config.yaml 中添加配置,示例如下:
idl_repos:
- repo_name: kitex_example
git_url: https://github.com/cloudwego/kitex-examples.git
branch: main
commit:
idls:
- idl_path: hello/hello.thrift
repo_name: kitex_example
service_name: a.b.c
配置 rgo_lsp_server
添加以下配置:
(use-package lsp-mode
:ensure t
:hook (go-mode . lsp)
:config
(setq lsp-keymap-prefix "C-c l")
;; register rgo_lsp_server
(lsp-register-client
(make-lsp-client
:new-connection (lsp-stdio-connection
(list (concat (getenv "GOPATH") "/bin/rgo_lsp_server")))
:major-modes '(go-mode)
:server-id 'rgo-lsp)))
配置通知事件
在 Emacs 中,我们需要定义一个函数来重新启动 LSP 服务器。
(defun my-restart-go-language-server ()
"Restart the Go language server."
(interactive)
(lsp-restart-workspace))
(lsp-register-custom-notification-handler
"custom/rgo/restart_language_server"
#'my-restart-go-language-server)
除此之外,还可以定义消息通知函数
(defun my-show-window-message (params)
"Show a window message from custom notification."
(let ((message (if (hash-table-p params)
(json-encode params)
params)))
(message "%s" message))) ; show in Emacs mini-buffer
(lsp-register-custom-notification-handler
"custom/rgo/window_show"
#'my-show-window-message)
效果展示

VIM
编译安装 rgo_lsp_server
go install cmd/rgo_lsp_server
在根目录下新建配置文件 rgo_config.yaml
新建一个项目,在 rgo_config.yaml 中添加配置,示例如下:
idl_repos:
- repo_name: kitex_example
git_url: https://github.com/cloudwego/kitex-examples.git
branch: main
commit:
idls:
- idl_path: hello/hello.thrift
repo_name: kitex_example
service_name: a.b.c
配置 rgo_lsp_server
为了使用 lsp,最简易的方式是使用 coc.nvim 插件
安装 vim-plug
curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
vim 在 ~/.vimrc ( Neovim 在 ~/.config/nvim/init.vim) 文件中添加以下配置
call plug#begin('~/.vim/plugged')
Plug 'neoclide/coc.nvim', {'branch': 'release'}
call plug#end()
执行命令安装插件
:PlugInstall
创建项目维度配置文件
mkdir .vim
cd ./.vim
touch coc-settings.json
添加 rgo_lsp_server 的配置
{
"languageserver": {
"rgo": {
"command": "your/local/gopath/bin/rgo_lsp_server",
"rootPatterns": ["go.mod"],
"trace.server": "verbose",
"filetypes": ["go"]
}
}
}
配置通知事件
以下是一个通过 coc.nvim 的事件监听功能配置通知事件的示例配置:
" 在你的 .vimrc 或 init.vim 中添加以下内容
" 定义函数来处理 LSP 通知
function! RgoRestartLanguageServer()
call CocAction('runCommand', 'custom/rgo/restart_language_server')
endfunction
function! RgoShowWindow(params)
let message = type(a:params) ==# 'dict' ? json_encode(a:params) : a:params
call coc#ui#show_info(message)
endfunction
" 监听 LSP 通知事件
function! OnLspNotification(method, params)
if a:method ==# 'custom/rgo/restart_language_server'
call RgoRestartLanguageServer()
elseif a:method ==# 'custom/rgo/window_show'
call RgoShowWindow(a:params)
endif
endfunction
" 注册事件监听
augroup lsp_notifications
autocmd!
autocmd User CocNotification call OnLspNotification(get(a:event, 'method'), get(a:event, 'params'))
augroup END
效果展示
