前提条件
- 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回りのパッケージもあるみたいなのでその辺も入れてみます。
おすすめのパッケージとかコマンドあったら教えてください(>_<)