About gopls

go の language server について紹介する


Posted on 2019年 12月 16日 (月)
Tags golang, gopls, lsp, vim, editor
golang, gopls, lsp, vim, editor

About gopls

これからの Go のコード補完について。

プログラミングにコード補完は欠かせない

gocode から gopls へ。

gocode の話については mattn さんの記事 が面白いです。

gocode

コード補完用の daemon が走り、unix domain socket を通じてエディタはコードの内容を渡す。vim-goの場合

1
gocode -sock unix -f vim ...

gocode の変遷(オリジナル)

github.com/nsf/gocode

gocode オリジナルの構成

gocode の変遷(go 1.10 対応)

github.com/mdempsky/gocode

go 1.10 対応版 gocode の構成

gocode の変遷(go mod 対応)

github.com/stamblerre/gocode

go mod 対応版 gocode の構成

bingo

language server protocol 対応 github.com/saibing/bingo

bingo の構成

golsp

Go チームがついに標準化へ動き始めた。golang.org/x/tools/cmd/golsp

しかし、その後、gopls へ rename…

そして今! gopls

go please と読むそうだ。まだ alpha (!!!)

そもそも language server protocol (lsp) とは

language server protocol (json RPC) を使って、コード補完やフォーマット、rename に対応。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{
  "jsonrpc":"2.0",
  "method":"workspace/configuration",
  "params":{"items":[
    {"scopeUri":"file:///Users/amasuda/go/src/github.com/go-zen-chu/observable-server","section":"gopls"},
    {"scopeUri":"file:///Users/amasuda/go/src/github.com/go-zen-chu/observable-server",
      "section":"gopls-/Users/amasuda/go/src/github.com/go-zen-chu/observable-server"}
  ]},
  "id":2
}

gopls の設定を json rpc で行っている。

gopls と editor

gopls と editor の関係

vim-go からの利用

vim-go ではデフォルトで gopls が有効化されている。下記のような関数

1
2
3
4
5
6
7
8
9
function! go#lsp#Completion(fname, line, col, handler) abort
  call go#lsp#DidChange(a:fname)
  let l:lsp = s:lspfactory.get()
  let l:msg = go#lsp#message#Completion(a:fname, a:line, a:col)
  let l:state = s:newHandlerState('completion')
  let l:state.handleResult = funcref('s:completionHandler', [function(a:handler, [], l:state)], l:state)
  let l:state.error = funcref('s:completionErrorHandler', [function(a:handler, [], l:state)], l:state)
  return l:lsp.sendMessage(l:msg, l:state)
endfunction

vim-go で gopls を debug mode & tcp で起動する。

1
2
let g:go_debug = ['lsp']
let g:go_gocode_socket_type = 'tcp'

tcp mode で gopls を起動すると、localhost でデバッグ用の UI が見られる。

1
2
3
4
$ lsof -iTCP -sTCP:LISTEN
COMMAND     PID    USER   FD   TYPE NODE NAME
vim       68987 amasuda    3u  IPv4  TCP localhost:49470 (LISTEN)
gopls     69001 amasuda    7u  IPv4  TCP localhost:49469 (LISTEN)

そして、prometheus exporter も立っている

2020年は… gopls!

FIN

Share


See also