ATOM で Go

（この記事は「[ATOM で Go — プログラミング言語 Go | text.Baldanders.info](http://text.baldanders.info/golang/golang-with-atom/)」とのマルチポストです）

[ATOM] Editor で [Go 言語]のコーディング環境を整える。環境を作る度に「どうだったっけ」とあちこちサイトを巡るので，覚え書きとしてまとめておく。

例によって Windows 環境を前提にしているので，他の環境の方は適当に脳内補完してください。

## 開発支援ツールの導入

まずは [Go 言語]用の支援ツールを導入する。
（実際には後述するパッケージが不足しているツールを自動的に `go get` してくれるのだが，紹介を兼ねて先に導入する）

```shell-session
C:> go get -v golang.org/x/tools/cmd/vet
C:> go get -v golang.org/x/tools/cmd/goimports
C:> go get -v golang.org/x/tools/cmd/oracle
C:> go get -v github.com/golang/lint/golint
C:> go get -v github.com/nsf/gocode
C:> go get -v github.com/rogpeppe/godef
```

[golint] は，いわゆる lint ツール。[vet] もコードの静的検査ツール。両方あると幸せになれる。

[goimport] はコード整形ツールで，標準の [gofmt] を置き換えることができ，かつ [gofmt] よりも若干かしこい。[gocode] は入力補完ツール。[godef] は指定したシンボルの定義定義元情報を出力するツール（出力を使って定義元へジャンプできる。実際には [oracle] と併用するらしい）。いずれも vim や emacs などでは有名だが [ATOM] でも使える。

言わずもがなだが，これらのツールには PATH を通しておくこと。 `%GOPATH%\bin` フォルダにパスを通しておけばいいだろう。

## go-plus パッケージの導入

では，上述のツールを操作できる [go-plus] パッケージを導入する。やり方は Setting（`ctrl+,`）から Install してもいいし `apm` コマンドを使ってもよい。

[go-plus] には設定項目がいくつかあるが，ほとんど既定値のままで使える。コマンドパレットから `golang` をキーワードに検索すると山程機能があるのが分かるだろう。

既定ではソースファイルを保存する度にコード整形や lint 等が走る。これを制御したい場合はパッケージの Setting で以下の項目を調整すればよい。

[![settings for go-plus (ATOM](https://farm1.staticflickr.com/735/22767398347_86d14e29f9_b.jpg)](https://www.flickr.com/photos/spiegel/22767398347/)

定義ファイルへのジャンプと復帰は `alt-cmd-g` および `alt-shift-cmd-G` にバインドされているが Windows 環境では動かないので（コマンドパレットから起動してもいいのだが）適当なキーに再割当てするといいだろう。ファンクションキーは結構空いてるので，たとえば

| Keystroke   | Command               | Selector |
|:------------|:----------------------|:---------|
| `f12`       | `golang:godef`        | `atom-text-editor[data-grammar="source go"]:not(.mini)` |
| `shift-f12` | `golang:godef-return` | `atom-text-editor[data-grammar="source go"]:not(.mini)` |

とアサインするなら `%USERPROFILE%\.atom\keymap.cson` に

```cson:keymap.cson
'atom-text-editor[data-grammar="source go"]:not(.mini)':
  'f12': 'golang:godef'
  'shift-f12': 'golang:godef-return'
```

と設定すればいい。

lint や定義ファイルのジャンプは `GOPATH` や `GOROOT` を見て外部パッケージを判断しているのだが， [gb] のようなツールでは `GOPATH` をコマンド内部で書き換えて実行するので lint ツールとは整合性が取れなくなる。 [go-plus] の設定では `GOPATH` を上書き可能なので，とりあえずこれで回避する方法もある。

[gb] への対応は “Planned Features” に挙がってるので，将来的には小細工しなくても [gb] ベースの開発ができるようになるかもしれない。てか，なってほしい。

## go-find-references パッケージが惜しい

[go-find-references] パッケージは [redefiance/go-find-references](https://github.com/redefiance/go-find-references) を使って指定したシンボルを参照しているファイルを列挙してくれる便利ツールだが， Windows 環境ではタグジャンプが上手く動かない。どうやら `C:` などのドライブレターを上手く処理できないようだ。とほほ。

## ブックマーク

- [struct にアノテーションつけてたら go vet . すべき - Qiita](http://qiita.com/amanoiverse/items/fcd25db64f341ad2471f)
- [これからGo言語を書く人への三種の神器 - Qiita](http://qiita.com/osamingo/items/d5ec42fb8587d857310a)

[Go 言語]: https://golang.org/ "The Go Programming Language"
[ATOM]: https://atom.io/ "Atom"
[golint]: https://github.com/golang/lint "golang/lint"
[vet]: https://golang.org/cmd/vet/ "vet - The Go Programming Language"
[goimport]: https://godoc.org/golang.org/x/tools/cmd/goimports "goimports - GoDoc"
[gofmt]: https://golang.org/cmd/gofmt/ "gofmt - The Go Programming Language"
[gocode]: https://github.com/nsf/gocode "nsf/gocode"
[godef]: https://github.com/rogpeppe/godef "rogpeppe/godef"
[oracle]: https://godoc.org/golang.org/x/tools/cmd/oracle "oracle - GoDoc"
[go-plus]: https://atom.io/packages/go-plus "go-plus"
[gb]: http://getgb.io/ "gb - A project based build tool for Go"
[go-find-references]: https://atom.io/packages/go-find-references "go-find-references"