2014/02/13

Recent entries from same category

  1. VimConf 2023 Tiny に参加しました
  2. Vim で Go 言語を書くために行った引越し作業 2020年度版
  3. Vim をモダンな IDE に変える LSP の設定
  4. ぼくがかんがえたさいきょうの Vim のこうせい 2019年 年末版
  5. VimConf 2019 を終えて

先日、Go言語バージョン1.1がリリースされました。安定しているのは勿論、幾つか新機能が追加されましたが、何よりもパフォーマンスチューニングが施された一番嬉しいですね。
Go 1.1 performance improvements | Dave Cheney

This is the first in a series of articles analysing the performance improvements in the Go 1.1 relea...

http://dave.cheney.net/2013/05/21/go-11-performance-improvements
さて今日はVimを使ってGo言語を開発する方法を紹介したいと思います。
VimでGo言語を開発するには、Go言語のリポジトリに含まれる misc/vim にランタイムパスを追加します。以下を vimrc に追加します。
set rtp+=$GOROOT/misc/vim

入力補完を行う

入力補完として gocode を入れます。正直、これは必須と言っていいです。
$ go get github.com/nsf/gocode
を実行します。$GOPATH/bin にインストールされるのでパスを通しておきましょう。
$GOROOT に入ってしまった人は一度削除して、$GOPATH を設定後にもう一度、上記のコマンドを実行します。
$GOPATH にインストールされているはずなので以下の様にvimrcに追加します。
exe "set rtp+=".globpath($GOPATH"src/github.com/nsf/gocode/vim")
gocodeを入れると、パッケージ名の途中であったり変数の後の "." をタイプした後<c-x><c-o> をタイプすると、あり得る関数名や、メソッド名がずらずらーっと補完出来ます。
gocode
その際、completeopt というオプションに preview を足しておくと、補完内容が詳細に表示されて分かりやすくなります。
set completeopt=menu,preview

パッケージをインポートする

Go言語でも、欲しい機能があればパッケージをインポートします。その際、いちいちファイルの先頭に移動して、import を追加したりしてませんか?上記のオフィシャルが提供しているVimプラグインを使っているのであれば、以下の様に実行しましょう。
:Import fmt
before
package main

func main() {
    fmt.Println("hello world")
}
after
package main

import (
    "fmt"
)

func main() {
    fmt.Println("hello world")
}
カーソルの移動もありませんので、引き続きコーディングが再開出来ます。また、コマンドの引数でパッケージ名の補完が効きます。net/ht までタイプして <tab> をタイプすれば net/http を補完してくれますし、ありえる候補も補完してくれます。

ドキュメントを見る

Go言語には godoc というツールが付属しています。コマンドラインから使っても便利なのですが、Vimから使うともっと便利になります。
:Godoc net/http
godoc

:Import と同様にパッケージ名が補完出来ます。

整形する

Go言語には go fmt というコマンドが付属しており、相応しいソースに整形する事が出来ます。
インデントが崩れたりした場合でも :Fmt
を実行するだけで、綺麗なソースコードに整形されます。

テンプレートを使う

手前味噌ですが、僕が作ってる sonictemplate-vim を使うと、ソースの書き始めが一気に楽になります。
mattn/sonictemplate-vim - GitHub
https://github.com/mattn/sonictemplate-vim
これを bundle ディレクトリ等に入れておき、goのファイルを新規で開きます。そこで
:Template web-app
を実行すれば以下のコードが展開されます。
package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/"func (w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "")
    })
    http.ListenAndServe(":8080"nil)
}
この後、http.ListenAndServe(":8080", nil) の1行上で空行を開け、:Template <tab> をタイプすると、web-app に特化した候補が優先的に表示されます。
sonictemplate
sonictemplate-vim はGo言語だけでなく、他の言語でも同様に便利なテンプレートが用意されています。よろしければ使ってみて下さい。また pull-req によるテンプレートの追加もお待ちしています。

これだけあれば、この夏のビーチでモテモテ間違いなしですね!

Posted at by