rgo

module
v0.0.0-...-539f2fd Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 21, 2024 License: Apache-2.0

README

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 配置

idea_open.png

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

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

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 项目

doc/vscode_open.png

在 rgo_vscode 项目根目录下执行以下命令安装依赖

若从未安装过 nodejs 依赖,macos 执行

brew install node

linux 执行

sudo apt-get install nodejs

执行以下命令安装 npm 依赖

npm install

使用快捷键 F5 即可本地启动 vscode 插件 、或参考截图

edit_ide.png

新建测试项目

然后会弹出搭载了 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

restart_gopls.png

效果展示

show.png

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)

效果展示

show_emacs.png

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

效果展示

show_vim.png

Directories

Path Synopsis
cmd
rgo command
rgo_lsp_server command
examples module
pkg

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL