About gopls
これからの Go のコード補完についてプログラミングにコード補完は欠かせない
gocode から gopls へ
gocode の話については mattn さんの記事 が面白いですgocode
コード補完用の daemon が走り、unix domain socket を通じてエディタはコードの内容を渡す。
vim-goの場合
gocode -sock unix -f vim ...
そして今!
go please と読むそうだ。まだ alpha (!!!)そもそも language server protocol (lsp) とは
language server protocol (json RPC) を使って、コード補完やフォーマット、rename に対応
request = {
"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
vim-go からの利用
vim-go ではデフォルトで gopls が有効化されている。
下記のような関数
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 からの利用
vim-go で gopls を debug mode & tcp で起動する
let g:go_debug = ['lsp']
let g:go_gocode_socket_type = 'tcp'
vim-go からの利用
tcp mode で gopls を起動すると、localhost でデバッグ用の UI が見れる
$ 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 も立っている