About gopls

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

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

gocode から gopls へ
gocode の話については mattn さんの記事 が面白いです

gocode

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

gocodeの変遷(オリジナル)

github.com/nsf/gocode

gocodeの変遷(go 1.10 対応)

github.com/mdempsky/gocode

gocodeの変遷(go mod 対応)

github.com/stamblerre/gocode

bingo

language server protocol 対応 github.com/saibing/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 に対応
    
      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 も立っている

2020年は...

gopls!

FIN