Posted at
GoDay 20

emacsでGoの環境構築をやる

More than 3 years have passed since last update.

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

Emacsを使ってたらカッコいいという理由で始めて

3年くらいつかってますが未だに使いこなせてないです。

一応参考


環境

OSX

Emacs 24

Go 1.5.2

Emacsは色々設定詰め込んで起動が重くなったのでemacs serverを立ち上げて

emacs clientで接続しています。

GoはHomeBrewでインストールしました。


環境変数にパスを通す

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

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-get-bundle! go-mode)

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

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

(setenv "GOROOT" "/usr/local/opt/go/libexec")

(setenv "GOPATH" (concat (getenv "HOME") "/work"))


init.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と組み合わせることで関数などの補完をしてくれます。

インストール方法

$ go get github.com/nsf/gocode


godoc

godocはコマンドラインからgoのドキュメントを閲覧できるようにしてくれます。

それをemacs内でも見れるようにgo-modeに設定が含まれています。

インストール方法

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

M-x godoc net/httpの結果


go-eldoc

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

便利です

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

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


goimports

Goでは使わないパッケージを読み込んでるとコンパイルができなくて

それはそれでいいんですが、試しながら書いてたり

使わないパッケージや使うために一々importを書きなおさなくてはいけなくてめんどくさいので

それを楽にしてくれるツールです。

自動でimportを加えたり消したりしてくれます。

インストール方法

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

init.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/