EmacsでGo言語開発環境を構築したのでメモ


# 前提条件
- Mac (OS X El Capitan 10.11.4)
- Homebrewインストール済み
- Emacs

elispの書き方がある程度わかる人には問題ないとは思うけど、[use-package](https://github.com/jwiegley/use-package)と[el-get](https://github.com/dimitri/el-get)を使ったコードを示すのでその辺の知識。

# Goをインストール
Homebrewからインストールするのが楽なので

```:ターミナル
$ brew install go
```

これでインストールできるはず。インストールが終了したら`go`と打って次のようなればインストールできている。

```:ターミナル
$ go
Go is a tool for managing Go source code.

Usage:

	go command [arguments]

The commands are:

	build       compile packages and dependencies
	clean       remove object files
	doc         show documentation for package or symbol
	env         print Go environment information
	fix         run go tool fix on packages
	fmt         run gofmt on package sources
	generate    generate Go files by processing source
	get         download and install packages and dependencies
	install     compile and install packages and dependencies
	list        list packages
	run         compile and run Go program
	test        test packages
	tool        run specified go tool
	version     print Go version
	vet         run go tool vet on packages

Use "go help [command]" for more information about a command.

Additional help topics:

	c           calling between Go and C
	buildmode   description of build modes
	filetype    file types
	gopath      GOPATH environment variable
	environment environment variables
	importpath  import path syntax
	packages    description of package lists
	testflag    description of testing flags
	testfunc    description of testing functions

Use "go help [topic]" for more information about that topic.
```

# GOPATHの設定
`GOROOT`は設定しなくても良い(?)みたいなので`GOPATH`と`$GOPATH/bin`への`PATH`を設定します。

`GOPATH`をどこに通すのが良いかは、自分にはわからないのでここでは取り敢えず次のようにします。

```:.bash_profile
export GOPATH="$HOME/go"
export PATH="$GOPATH/bin:$PATH"
```

`GOPATH`はホームディレクトリ直下に`go`というフォルダを作り、そこに通します。また、`PATH`に対して`$GOPATH/bin`へのパスも追加します。

# Eamacsの設定
## PATHを通す
Emacsでgoの恩恵を受けるために`init.el`等に次の記述を追加してパスを通します。`username`には自分のユーザー名で置き換えてください。

```elisp:init.el
(setenv "GOPATH" "/Users/username/go")
(add-to-list 'exec-path (expand-file-name "/Users/username/go/bin"))
```

Emacsの設定の中で`PATH`を引き継ぐように設定していても自分の環境では2行が必要でした。理由はわかりませんが、各自動作を確認して削除しても問題ないかもしれません。

## パッケージのインストール
自分は次のパッケージとコマンドを入れました。

パッケージ

- go-mode
- go-eldoc

コマンド

- godef
- goimports
- gocode

### パッケージのインストール
`init.el`等に以下の記述を追加し、各行の末尾で`C-x C-e`を押すかEmacsを再起動すればパッケージをインストールできます。(el-get-bundleを使っていること前提)

```elisp
(el-get-bundle go-mode)
(el-get-bundle go-eldoc)
```

### コマンドのインストール
コマンドはターミナルからgoコマンドを使ってインストールしていきます。

```:ターミナル
$ go get -v github.com/rogpeppe/godef
$ go get golang.org/x/tools/cmd/goimports
$ go get -u github.com/nsf/gocode
```

## 設定
```elisp
(use-package go-mode
  :config
  (bind-keys :map go-mode-map
	     ("M-." . godef-jump)
	     ("M-," . pop-tag-mark))
  (add-hook 'go-mode-hook '(lambda () (setq tab-width 2)))
  (setq gofmt-command "goimports")
  (add-hook 'before-save-hook 'gofmt-before-save))

(use-package go-eldoc
  :config
  (add-hook 'go-mode-hook 'go-eldoc-setup))
```

簡単に説明すると

```elisp
(bind-keys :map go-mode-map
	     ("M-." . godef-jump)
	     ("M-," . pop-tag-mark))
```

ここでは`M-.`を定義ジャンプに割り当てて、`M-,`で元の位置に戻るようにしています。
ただし、これは簡易的な方法なので定義ジャンプで言った先でマークーを使うと正しく動作しません。
ネットの海のどこかにちゃんと動作するようにしたコードが落ちてた気がします。
定義ジャンプで他のウィンドウで開きたい人は`godef-jump`を`godef-jump-other-window`に変えてください。

```elisp
(add-hook 'go-mode-hook '(lambda () (setq tab-width 2)))
```

Go言語はインデントでタブ文字を採用しており、`go-mode`ではEmacsではデフォルトでタブ幅が4に設定されているため、これを2にしています。
自分の場合は幅が気になったのでこうしましたが、気にならない人はいらない設定でしょう。

```elisp
(setq gofmt-command "goimports")
(add-hook 'before-save-hook 'gofmt-before-save))
```

これはファイルを保存する度に整形及びインポートの追加を自動で行うための設定です。
インポートを自動で追加する必要がない人は一行目を消せばおkです。
Go言語は整形するための`gofmt`というコマンドを用意しているくらいなので2行目の設定はしておいた方がいいと思います。

```elisp
(use-package go-eldoc
  :config
  (add-hook 'go-mode-hook 'go-eldoc-setup))
```

これで`go-eldoc`を使えるようにしています。
`go-eldoc`はカーソル位置のメソッドのドキュメント(引数の型と帰り値の型)がmini bufferに出るようになります。

---

今のところこんな感じですが、helm回りのパッケージもあるみたいなのでその辺も入れてみます。

おすすめのパッケージとかコマンドあったら教えてください(>_<)