【Go × Vim】 VimでGoを書く - 2015 Spring

# 快適にGoを書くための設定たち \- 2015 Spring
インターネット上に転がってる情報は古いものも多いので，Goはじめるついでに2015年4月中旬ごろのトレンドっぽい？設定を探してみました．
なんかおかしな点や抜けてるところ等あればご教授いただけると幸いです．

```
＼ Go! Go! ／
   ʕ◔ϖ◔ʔ
```

## Goのインストール
[Homebrew](http://brew.sh/)から．

```shell-session
$ brew install go
```

環境変数`GOPATH`及び`PATH`を設定しておく（2015/04/14 18:15 追記: `GOROOT`については[記事の末尾](http://qiita.com/izumin5210/items/1f3c312edd7f0075b09c#goroot%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A620150414-1815-%E8%BF%BD%E8%A8%98)に追記したので参照されたい）．

```bash
export GOPATH=$HOME/go
export PATH=$PATH:/usr/local/opt/go/libexec/bin:$GOPATH/bin
```


## Vimの設定
### インデントの設定
Goはスペースでなくハードタブでのインデントが推奨されているので，その設定を追加する．

> We use tabs for indentation and gofmt emits them by default. Use spaces only if you must. <cite><small>\- [formatting | Effective Go - The Go Programming Language](https://golang.org/doc/effective_go.html#formatting)</small></cite>

`~/.vim/after/ftplugin/<filetype>.vim`に書くことでFileTypeごとの設定を記述できる．

```vim:.vim/after/ftplugin/go.vim
set noexpandtab
set tabstop=4
set shiftwidth=4
```

### 便利コマンド
※ **注意**: `$GOROOT/misc/vim`は消滅したらしい（参考: <cite>[vim-jp » vim-go-extra を公開致します。](http://vim-jp.org/blog/2014/09/02/vim-go-extra.html)</cite>）

ここでは`google/vim-ft-go`（Vimに取り込まれてる）と`$GOROOT/misc/vim`の差分になる[**vim-jp/vim-go-extra**](https://github.com/vim-jp/vim-go-extra)を導入する．
（c.f. [**faith/vim-go**](https://github.com/fatih/vim-go): たぶんこっちのが高機能です．お好みでどうぞ．）

> `vim-ft-go` には `misc/vim` の一部のみが含まれています。`misc/vim` からは以下のコマンドが削除されました。
>
> * `:Godoc` コマンド
> * `:Fmt` コマンド
> * `:Import` コマンド
> 
> これらのコマンドは Fatih Arslan 氏が提供する `vim-go` にコマンド名称を変えて含まれておりますが、`vim-go` に含まれている syntax 等は vim のリポジトリに含まれている物と現在バッティングしています。 そこで vim-jp では上記の消えたコマンド群のみを集めた `vim-go-extra` というリポジトリを提供する事にしました。
> <cite><small>\- [vim-jp » vim-go-extra を公開致します。](http://vim-jp.org/blog/2014/09/02/vim-go-extra.html)</small></cite>

```vim
NeoBundle 'vim-jp/vim-go-extra'
```

以下は`vim-jp/vim-go-extra`の便利コマンド群．

#### `:Godoc`
パッケージとかのドキュメントを見れる`godoc`をVimから見れる．
![vim-go-godoc-demo.gif](https://qiita-image-store.s3.amazonaws.com/0/14845/2769f274-72b4-67c1-4634-9dbb5f1d532c.gif)

#### `:Fmt`
Goのフォーマット整形ツール`go fmt`を実行する．
![vim-go-fmt-demo.gif](https://qiita-image-store.s3.amazonaws.com/0/14845/df850cc2-295f-3f4a-60b0-8106b3b5b8f1.gif)

#### `:Import`
パッケージの`import`を挿入してくれる．
![vim-go-import-demo.gif](https://qiita-image-store.s3.amazonaws.com/0/14845/59fac249-176b-5101-fbee-fd2ddafb9f66.gif)

### 補完
[**gocode**](https://github.com/nsf/gocode)をいれる．これだけ．

```shell-session
$ go get -u github.com/nsf/gocode
```

![vim-go-gocode-demo.gif](https://qiita-image-store.s3.amazonaws.com/0/14845/631a5862-5cd7-71bf-ca55-b1a32b0bc446.gif)

ググってみると`exe "set rtp+=".globpath($GOPATH, "src/github.com/nsf/gocode/vim")`みたいなのを`.vimrc`に追記してる記事が多いが，実は不要っぽい？（gocodeのREADMEにも書いてない）

### 構文チェック
[**golint**](https://github.com/golang/lint)と[**syntastic**](https://github.com/scrooloose/syntastic)を組み合わせる．

```vim
NeoBundle 'scrooloose/syntastic'

let g:syntastic_mode_map = { 'mode': 'passive',
    \ 'active_filetypes': ['go'] }
let g:syntastic_go_checkers = ['go', 'golint']
```

保存時に`go`でのコンパイルエラーのチェック及び`golint`でのlintのエラーチェックが走る．

![vim-go-lint-demo.gif](https://qiita-image-store.s3.amazonaws.com/0/14845/f6185d23-2064-4e08-8bd8-65a5b0f89e20.gif)

## 毎回入れるプラグインとか
それっぽいShellScriptをdotfilesに書く？（c.f. [izumin5210/dotfiles](https://github.com/izumin5210/dotfiles/blob/master/bootstrap.d/Gofile)）．
もっといい方法あれば教えて下さい．

## `GOROOT`について（2015/04/14 18:15 追記）
@mattn さんからはてブでご指摘があった点になります．Twitter上で非常にわかりやすく丁寧に解説してくださいました．ありがとうございました！

> `GOROOT` must be set only when installing to a custom location. <cite><small>\- [Installing to a custom location | Getting Started - The Go Programming Language](https://golang.org/doc/install#tarball_non_standard)</small></cite>

<blockquote class="twitter-tweet" data-conversation="none" lang="en"><p><a href="https://twitter.com/izumin5210">@izumin5210</a> go のバイナリには GOROOT が埋め込まれていて、それと異なる場所に置く場合には必要になります。なので brew のインストール先に従うのであれば必要は無いです。brew の指定するロケーションが気に入らない場合は GOROOT で変更可能です。</p>&mdash; mattn (@mattn_jp) <a href="https://twitter.com/mattn_jp/status/587902856851689473">April 14, 2015</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

と，いうことで本記事の例だと`GOROOT`は設定不要です．

<blockquote class="twitter-tweet" data-conversation="none" lang="en"><p><a href="https://twitter.com/izumin5210">@izumin5210</a> 異なるロケーションに複数入れる場合は必須になりますが、そうでない場合は必須ではないです。 <a href="http://t.co/KWkzDqxpO7">http://t.co/KWkzDqxpO7</a> doc の Note: 部分を読んで下さい。</p>&mdash; mattn (@mattn_jp) <a href="https://twitter.com/mattn_jp/status/587896462953988096">April 14, 2015</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


# Ref
* [vim-jp » vim-go-extra を公開致します。](http://vim-jp.org/blog/2014/09/02/vim-go-extra.html)
* [formatting | Effective Go - The Go Programming Language](https://golang.org/doc/effective_go.html#formatting)
* [WEB+DB PRESS Vol.82](http://www.amazon.co.jp/gp/product/4774166278/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4774166278&linkCode=as2&tag=masayuki5210-22)
* [Installing to a custom location | Getting Started - The Go Programming Language](https://golang.org/doc/install#tarball_non_standard)（2015/04/14 18:15 追記）
* [You don’t need to set GOROOT, really | Dave Cheney](http://dave.cheney.net/2013/06/14/you-dont-need-to-set-goroot-really)（2015/04/14 18:35 追記）

## Vim plugins
* [vim-jp/vim-go-extra](https://github.com/vim-jp/vim-go-extra)
* [faith/vim-go](https://github.com/fatih/vim-go)
* [scrooloose/syntastic](https://github.com/scrooloose/syntastic)

## Golang packages
* [nsf/gocode](https://github.com/nsf/gocode)
* [golang/lint](https://github.com/golang/lint)