前提条件
- Mac (OS X El Capitan 10.11.4)
- Homebrewインストール済み
- Emacs
elispの書き方がある程度わかる人には問題ないとは思うけど、use-packageと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をどこに通すのが良いかは、自分にはわからないのでここでは取り敢えず次のようにします。
export GOPATH="$HOME/go"
export PATH="$GOPATH/bin:$PATH"
GOPATHはホームディレクトリ直下にgoというフォルダを作り、そこに通します。また、PATHに対して$GOPATH/binへのパスも追加します。
Eamacsの設定
PATHを通す
Emacsでgoの恩恵を受けるためにinit.el等に次の記述を追加してパスを通します。usernameには自分のユーザー名で置き換えてください。
(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を使っていること前提)
(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
設定
(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))
簡単に説明すると
(bind-keys :map go-mode-map
	     ("M-." . godef-jump)
	     ("M-," . pop-tag-mark))
ここではM-.を定義ジャンプに割り当てて、M-,で元の位置に戻るようにしています。
ただし、これは簡易的な方法なので定義ジャンプで言った先でマークーを使うと正しく動作しません。
ネットの海のどこかにちゃんと動作するようにしたコードが落ちてた気がします。
定義ジャンプで他のウィンドウで開きたい人はgodef-jumpをgodef-jump-other-windowに変えてください。
(add-hook 'go-mode-hook '(lambda () (setq tab-width 2)))
Go言語はインデントでタブ文字を採用しており、go-modeではEmacsではデフォルトでタブ幅が4に設定されているため、これを2にしています。
自分の場合は幅が気になったのでこうしましたが、気にならない人はいらない設定でしょう。
(setq gofmt-command "goimports")
(add-hook 'before-save-hook 'gofmt-before-save))
これはファイルを保存する度に整形及びインポートの追加を自動で行うための設定です。
インポートを自動で追加する必要がない人は一行目を消せばおkです。
Go言語は整形するためのgofmtというコマンドを用意しているくらいなので2行目の設定はしておいた方がいいと思います。
(use-package go-eldoc
  :config
  (add-hook 'go-mode-hook 'go-eldoc-setup))
これでgo-eldocを使えるようにしています。
go-eldocはカーソル位置のメソッドのドキュメント(引数の型と帰り値の型)がmini bufferに出るようになります。
今のところこんな感じですが、helm回りのパッケージもあるみたいなのでその辺も入れてみます。
おすすめのパッケージとかコマンドあったら教えてください(>_<)