“vim-go”を使って Vim での Go 開発を効率化する

はじめに

いつも使っているエディタは NeoVim です。
NeoVim は、Vim の改良版であり、多くの Vim ユーザーから熱狂的な支持を受けています。
本当はなんどか VS Code への移行も試みましたが、どうしても指が慣れて他のエディタや IDE に移行できません。
結局 coc.vim を導入した NeoVim 住民として生活し続けています。

少しでも VS Code に近い開発効率の良い環境を作ろうと、いくつかのプラグインを導入しています。
その一つとして coc.vim があります。
coc.vim は、Vim のための統合型コード補完ツールであり、Go 言語をはじめとした様々なプログラミング言語に対応しています。
coc.vim を使えば、コード補完やシンタックスハイライトなどの機能を実現することができます。

Vim による Go 言語の開発を効率化するためのプラグインとしてもう一つ重要「vim-go」があります。
今回は "vim-go" について調べたことをまとめたいと思います。

"vim-go" とは?

以下の Github Page で公開されているツールです。

Go 言語を開発する上で、NeoVim と vim-go の組み合わせは非常に便利です。
これらを使いこなすことで、開発効率をさらに向上させることができます。

vim-go が提供する機能は非常に多岐にわたるため、全てを理解するには時間がかかります。
しかし、vim-go を使いこなせば、コード記述やリファクタリング、テスト、デバッグなどの作業を非常にスムーズに行うことができるでしょう。

vim-go は、Go 言語の開発者にとって非常に便利なプラグインであり、Go 言語を開発するために必要なほとんどのツールが含まれています。

このプラグインを使用することで、バグの検出、文法のチェック、コード補完、デバッグなどの作業を簡単に実行できます。

「vim-plug」などのプラグインマネージャーを使用して vim-go をインストールすることができますが、インストール方法についてはここでは紹介しません。

"vim-go" の機能 ( 一部抜粋 )

vim-go が提供する機能には、以下のようなものがあります。

以上のように、vim-go は Go 言語の開発をビルド、テスト、デバッグ、およびデプロイするために必要なすべてのツールを提供します。
このプラグインを使用することで、開発者は時間を節約し快適な開発環境を手に入れることができます。
是非、お試しください。

"vim-go" の特徴

以下のような特徴があります。

  • :GoBuild コマンドでビルド、 :GoInstall コマンドでインストール、 :GoTest コマンドでテストが
  • :GoTestFunc コマンドで単一のテストケースを実行
  • :GoRun で現在開いているファイルを直ちに実行
  • GoDebugStartdelve を使ったデバッグ
  • gopls を使った補完、コードチェックなど
  • :GoDoc または :GoDocBrowser でドキュメントを確認
  • :GoRename で関数、変数、構造体のリネーム
  • :GoCoverage でテストのコードカバレッジを確認
  • :GoAddTags ( OR :GoemoveTags ) で構造体のフィールドにタグを付与、削除
  • :GoList または :GoMetaLinter によるコードの Lint、 :GoVet によるコードの静的解析
  • :GoImpl で interface 実装の雛形作成
  • :GoInstallBinaries で "vim-go" が利用する実行バイナリファイルをインストール

"vim-go" のコマンドをいくつか使ってみた

:GoDoc / :GoDocBrowser

組み込み関数 math.Abs() にカーソルがあたっている状態で :GoDoc を実行する。

上部に関数の説明が表示されました。
便利。

:GoDocBrowser だとブラウザで関数の説明ページが表示されました。

自作の関数でもちゃんとドキュメントが表示されました。

:GoRename

h にカーソルがあたっている状態で :GoRename を実行してみます。

func (h *Human) Say() string {
    return "Hello, " + h.Name
}

新しい名前を入力するように聞かれるので、ここでは human としてみました。
結果以下のようになりました。
想定通り。

func (human *Human) Say() string {
    return "Hello, " + human.Name
}

:GoCoverage

以下のようなコードを用意しました。

mymath.go

package mymath

func Multiply(x, y int) int {
    return x * y
}

func Add(x, y int) int {
    return x + y
}

以下のようなテストコードを用意しました。

mymath_test.go

package mymath

import "testing"

func TestMultiply(t *testing.T) {
    if Multiply(2, 3) != 6 {
        t.Error("Expected 6")
    }
}

:GoCoverage を実行すると、テスト対象コードのうち実行された部分は緑色、実行されなかった部分は赤色でハイライト表示されました。

:GoAddTags

内部で gomodifytags を使っているようなので、事前にインストールしておきます。

$ go install github.com/fatih/gomodifytags@latest

以下のような構造体にカーソルがあたっている状態で :GoAddTags を実行してみます。


type Human struct {
    Name string
    Age  int
}

結果、JSON の Marshal、Unmarshal のためのタグがあっという間に付与されました。
これまた便利。

type Human struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

:GoImplements

以下のコードにて、構造体 Human にカーソルがあたっている状態で :GoImplements を実行します。

type Sayable interface {
    Say() string
}

type Human struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

対象とするインターフェイス名を聞かれるので Sayable と入力すると雛形が作成されました。

func (h *Human) Say() string {
    panic("not implemented") // TODO: Implement
}

io.Writer インターフェイスを指定するとどうなるでしょう?

func (h *Human) Write(p []byte) (n int, err error) {
    panic("not implemented") // TODO: Implement
}

ちゃんと作成されました。
すごい。

:GoImple io.Writer のように引数に指定して呼び出しても同じ結果となりました。

:GoAlternate

mymath.go ファイルを開いているときに実行すると mymath_test.go ファイルが、 mymath_test.go ファイルを開いているときに実行すると mymath.go ファイルが開かれます。

交互に編集するときに便利。

以下の設定をすることで、 :A だけで切り替えたり、:AV で左右に分割されたタブで開くことも可能。

    augroup go
      autocmd!
      autocmd Filetype go
        \  command! -bang A call go#alternate#Switch(<bang>0, 'edit')
        \| command! -bang AV call go#alternate#Switch(<bang>0, 'vsplit')
        \| command! -bang AS call go#alternate#Switch(<bang>0, 'split')
    augroup END

ひとこと

よく使いそうな機能を覚えました。
開発効率をあげていくぞ。

Posted by genzouw