2021年版 vim + goplsの設定

Posted on Jun 16, 2021

goplsが出てから, vimでも定義ジャンプやシンボル検索、ドキュメント参照等が行えるようになった。

たまにVSCodeを触りvimでの作業を改善できないか考える中で、自身の設定が古いことに気付いた。また、ググってもなかなか出てこなかったのでメモとして記述する。

cf. GitHub dotfiles

いきなりだが、vimrcとvim-lsp-settings/settings.jsonを抜粋して貼り付ける。

以前、GoではLspCodeAction, LspCodeLens等をサポートしていなかったが、今では使えるようになっている。

キーマップに設定している関数は全てGoで使用出来る。

ただし、カーソルがどこにいても実行出来るわけではないので注意が必要。

LspCodeActionはカーソルの位置によって実行内容が変わるのでそこも注意。

...
Plug 'prabirshrestha/vim-lsp'
Plug 'mattn/vim-lsp-settings'
Plug 'prabirshrestha/asyncomplete-lsp.vim'
Plug 'mattn/vim-gomod'
...

" ------------------------------------------------------------------------------
" vim-lsp
" ------------------------------------------------------------------------------
function! s:on_lsp_buffer_enabled() abort
    setlocal omnifunc=lsp#complete
    setlocal signcolumn=yes
    if exists('+tagfunc') | setlocal tagfunc=lsp#tagfunc | endif
    nmap <buffer> <leader>ac <plug>(lsp-code-action)
    nmap <buffer> <leader>cl <plug>(lsp-code-lens)
    nmap <buffer> <leader>df <plug>(lsp-definition)
    nmap <buffer> <leader>dd <plug>(lsp-document-diagnostics)
    nmap <buffer> <leader>im <plug>(lsp-implementation)
    nmap <buffer> <leader>pdf <plug>(lsp-peek-definition)
    nmap <buffer> <leader>sm <plug>(lsp-document-symbol-search)
    nmap <buffer> <leader>Sm <plug>(lsp-workspace-symbol-search)
    nmap <buffer> <leader>rf <plug>(lsp-references)
    nmap <buffer> <leader>td <plug>(lsp-type-definition)
    nmap <buffer> <leader>rn <plug>(lsp-rename)
    nmap <buffer> <leader>en <plug>(lsp-next-error)
    nmap <buffer> <leader>ep <plug>(lsp-previous-error)
    nmap <buffer> <leader>ho <plug>(lsp-hover)

    let g:lsp_format_sync_timeout = 500
    autocmd! BufWritePre *.rs,*.go call execute('LspDocumentFormatSync')

    " refer to doc to add more commands
endfunction

augroup lsp_install
    au!
    " call s:on_lsp_buffer_enabled only for languages that has the server registered.
    autocmd User lsp_buffer_enabled call s:on_lsp_buffer_enabled()
augroup END
// vim-lsp-settings/settings.json
{
  "go": {
    "gopls": {
      "initialization_options": {
        "analyses" : {"fillstruct":true},
        "staticcheck": true,
        "directoryFilters": [
          "-debug"
        ],
        "completeUnimported": true, "usePlaceholders": true,
        "matcher": "fuzzy",
        "codelenses": {
          "gc_details": false,
          "generate": true,
          "test": true,
          "tidy": true,
          "vendor": false
        },
        "hoverKind": "SynopsisDocumentation"
      }
    }
  }
}

vim + goplsで新しく設定したこと

LspCodeAction

vim-lspのhelpにあるように、LspCodeActionが実行出来る行では A> が表示される。

Goで出来るCodeAction全体はわからないが、今のところは下記が出来ることを確認した。

  • structを初期値で補完 (要設定: "analyses": {"fillstruct": true})
  • returnで関数フォーマットを補完
":help vim-lsp.txt
g:lsp_document_code_action_signs_enabled
                               *g:lsp_document_code_action_signs_enabled*
...
    `LspCodeActionText` defaults to `A>`.
...

LspCodeAction

LspDocumentDiagnostics

(これは以前から設定できたみたい。)

golintがdeprecatedになったので、linterにstaticcheckを設定したかった。

また、VSCodeのタブ PROBLEMS のようにコードでの問題箇所を確認したかった。

(staticcheckのどのケースにひっかかったのかがわからない…。AXXXも出力したい。)

LspDocDiagnostics

LspCodeLens

vim-lsp-settings/settings.jsonにある機能がファイルに応じて出来るようになる。

  • _test.go -> go test

LspCodeLens-test

  • go.mod -> go tidy (go.modのfiletypeをgo or gomodにする必要がある。mattn/vim-gomodを入れるのが無難。)

LspCodeLens-tidy

":help vim-lsp.txt
LspCodeLens                                                   *:LspCodeLens*

Gets a list of possible commands that can be executed on the current document.

まとめ

2021年になり、goplsはとても使い心地よく改善されてきました。

まだ手の届かないところがありますが、たくさんのプラグインを入れることなくgoplsで出来るだけ済むように設定することでメンテしやすくなったと思います。