Mac(homebrew)でGoのインストールと、Emacsの環境構築

Goの勉強のためまずHello worldEmacsの環境を構築をしたので、その記録。

この記事のゴール

  • homebrewでGoのインストール
    • godocによるドキュメントの表示
  • Hello worldを表示する
  • Emacsの環境構築
    • go-autocompleteで保管
    • M-x godocでドキュメント表示
    • goflaymakeで構文チェックなど
    • godefで定義ジャンプ

goをhomebrewでインストールする

$ brew install go

インストールされているか確認

$ go version
go version go1.2 darwin/amd64

Hello worldを書いてみる

適当な場所で以下のファイル(hello.go)を作成

package main

import "fmt"

func main() {
    fmt.Println("Hello World!")
}

ビルドして実行

$ go build hello.go
$ ./hello
Hello World!

godocをインストールしてドキュメントを表示する

godocを使うとコマンドのドキュメントを表示できるようになる。以下のように使う。

$ godoc fmt Println
PACKAGE DOCUMENTATION

package fmt
    import "fmt"



FUNCTIONS

func Println(a ...interface{}) (n int, err error)
    Println formats using the default formats for its operands and writes to
    standard output. Spaces are always added between operands and a newline
    is appended. It returns the number of bytes written and any write error
    encountered.

godocをインストールするにはgo getを使うようなんだけど、環境変数$GOPATHを設定していないとだめらしい。.zshrcなどに以下のように設定する。

# for go lang
if [ -x "`which go`" ]; then
  export GOROOT=`go env GOROOT`
  export GOPATH=$HOME/go
  export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
fi

GOROOT/binをPATH環境変数に追加しているのは、godocのコマンドのインストール先がここになるから。(通常は、GOPATH/binにインストールされるらしい)

Go 1.2 (devel) doesn't install godoc into bin · Issue #23281 · Homebrew/legacy-homebrew · GitHub

以下のコマンドでgodocをインストール。

$ go get code.google.com/p/go.tools/cmd/godoc

ちなみに、$GOPATHを設定してないと以下の様なエラーとなる。

$ go get code.google.com/p/go.tools/cmd/godoc
package code.google.com/p/go.tools/cmd/godoc: cannot download, $GOPATH not set. For more details see: go help gopath

Emacsの環境設定

次の記事を参考に必要なものをインストールした。

go側の必要なパッケージをインストールしておく。

$ go get code.google.com/p/go.tools/cmd/godoc
$ go get code.google.com/p/rog-go/exp/cmd/godef
$ go get github.com/nsf/gocode
$ go get -u github.com/dougm/goflymake

list-packagesで以下をインストールしておく

  • go-mode
  • go-autocomplete
  • auto-complete-mode(インストール済みだったので、ここでは特に説明しない)
  • flyamke(インストール済みだったので、ここでは特に説明しない)

init.elに以下を追加。

;; PATHの設定をシェルの設定から持ってくる
;; $SHELLで設定されているシェルの設定が使われる
(when (memq window-system '(mac ns))
  (exec-path-from-shell-initialize))

;; ==============================================
;; goの設定
;; ==============================================
(when (and (require 'go-mode nil t) (executable-find "go"))
  ;; GOROOT, GOPATH環境変数を読み込む
  (let ((envs '("GOROOT" "GOPATH")))
    (exec-path-from-shell-copy-envs envs))
  ;; go-autocompleteの読み込み
  (eval-after-load "go-mode"
    '(progn
       (require 'go-autocomplete)))
  ;; goflaymakeの読み込み
  (add-to-list 'load-path (concat (getenv "GOPATH") "/src/github.com/dougm/goflymake"))
  (require 'go-flymake)

  ;; go-eldocの設定
  ;; https://github.com/syohex/emacs-go-eldoc
  (add-hook 'go-mode-hook 'go-eldoc-setup)
  (set-face-attribute 'eldoc-highlight-function-argument nil
		      :underline t :foreground "green"
		      :weight 'bold)
  )

今回、exec-path-from-shellを使って.zshrcで設定したPATHや環境変数(GOROOT, GOPATH)を読み込むようにしている。

ちなみに、exec-path-from-shellは$SHELL環境変数に設定されているシェルの環境変数をひっぱってくるらしい。デフォルトのシェルを変更するには以下のようにする(ここでは、bashからzshに変更)

$ echo $SHELL
/bin/bash

$ chsh -s /bin/zsh
# ここで再起動

# 再起動後以下のように表示されていればOK
$ echo $SHELL
/bin/zsh

そして、Emacsを起動して、hello.goを開いてみる。fmt.Pまで入力すると以下のように保管される。

godocも使える。

M-x godocとして「fmt Println」とする。

goflymake(https://github.com/dougm/goflymake)でエラーチェックなど

定義へジャンプする。
Printlnへカーソルを持ってきて「C-c C-j」でPrintlnのソースコードへジャンプする。

とりあえず今日は環境設定で終わり。次は、何かプログラムを作ってみようかな。

追記(2014/01/14)

go-eldocを追加(init.elの設定は前述の設定に追加)

@syohex さんに教えてもらったgo-eldoc(GitHub - syohex/emacs-go-eldoc: eldoc for go language)を追加。以下のようにミニバッファにメソッドの引数がでてくる。(・∀・)イイ