emacsでGoの環境構築をやる

遅刻しました 20日のアドベントカレンダーです。

Emacsを使ってたらカッコいいという理由で始めて
３年くらいつかってますが未だに使いこなせてないです。

一応参考

# 環境

OSX
Emacs 24
Go 1.5.2

Emacsは色々設定詰め込んで起動が重くなったのでemacs serverを立ち上げて
emacs clientで接続しています。
GoはHomeBrewでインストールしました。

# 環境変数にパスを通す

以下の様に環境変数を設定しています。

```zsh
export GO15VENDOREXPERIMENT=1
export GOROOT=$(brew --prefix go)/libexec
export GOPATH=$HOME/work
export PATH=$PATH:$GOPATH/bin:$GOROOT/bin
```

`GO15VENDOREXPERIMENT`はコンパイルするためのGOPATHをリポジトリ内のvendorから探すようにできるオプションです。

# パッケージのインストール

emacsにはpackage-installとかcaskとかel-getとか色々あるんですが
僕はel-getを使ってます。

el-getで初期化時に読み込んでるパッケージは以下です

```el
(el-get-bundle! go-mode)
(el-get-bundle! go-autocomplete)
(el-get-bundle! go-eldoc)
```

それとemacsに環境変数を設定します。

```el
(setenv "GOROOT" "/usr/local/opt/go/libexec")
(setenv "GOPATH" (concat (getenv "HOME") "/work"))
```

# init.elの設定

```el
(setenv "GOROOT" "/usr/local/opt/go/libexec")
(setenv "GOPATH" "/Users/kazu/work")
 
(add-hook 'go-mode-hook (lambda ()
                          (setq gofmt-command "goimports")
                          (add-hook 'before-save-hook 'gofmt-before-save)
                          (set (make-local-variable 'compile-command)
                               "go build -v && go test -v && go vet")
                          (local-set-key (kbd "M-.") 'godef-jump))
                          (go-eldoc-setup)
          )

```

# gocode

gocodeは補完を提供してくれるツールです。
auto-completeと組み合わせることで関数などの補完をしてくれます。

インストール方法

```bash
$ go get github.com/nsf/gocode
```

<img width="568" alt="スクリーンショット 2015-12-20 23.55.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/15818/b2cc12a8-5b68-d4cd-f890-217005a07e66.png">


# godoc

godocはコマンドラインからgoのドキュメントを閲覧できるようにしてくれます。
それをemacs内でも見れるようにgo-modeに設定が含まれています。

インストール方法

```bash
$ go get golang.org/x/tools/cmd/godoc
```

`M-x godoc net/http`の結果

<img width="571" alt="スクリーンショット 2015-12-21 0.03.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/15818/6343f181-02df-4870-0086-3cc88310f6f2.png">

# go-eldoc

go-eldocは下に関数の引数や戻り値を表示してくれます。
便利です

http.Getにフォーカスがあると以下の様にメッセージにでます。

```
func(url string) (resp *http.Response, err error) [2 times]
```

# goimports

Goでは使わないパッケージを読み込んでるとコンパイルができなくて
それはそれでいいんですが、試しながら書いてたり
使わないパッケージや使うために一々importを書きなおさなくてはいけなくてめんどくさいので
それを楽にしてくれるツールです。
自動でimportを加えたり消したりしてくれます。

インストール方法

```bash
$ go get golang.org/x/tools/cmd/goimports
```

init.elの設定

```el
; gofmtをgoimportsに上書き
(setq gofmt-command "goimports")
; セーブした時にgofmtを実行する
(add-hook 'before-save-hook 'gofmt-before-save)
```

これでセーブした時に自動でimportを調整してくれます。
自分はauto-saveと組み合わせて手が止まったら常にセーブするようにしておくようにしています

# goのinit.el

全体的なGoの設定

```
(setenv "GOROOT" "/usr/local/opt/go/libexec")
(setenv "GOPATH" (concat (getenv "HOME") "/work"))
 
(add-hook 'go-mode-hook (lambda ()
                          (setq gofmt-command "goimports")
                          (add-hook 'before-save-hook 'gofmt-before-save)
                          (set (make-local-variable 'compile-command)
                               "go build -v && go test -v && go vet")
                          (local-set-key (kbd "M-.") 'godef-jump))
                          (go-eldoc-setup)
          )

```

# まとめ

全然　emacsを鍛えられてないのでもっと鍛えます。

# 参考

http://unknownplace.org/archives/golang-editing-with-emacs.html
http://tleyden.github.io/blog/2014/05/27/configure-emacs-as-a-go-editor-from-scratch-part-2/