読者です 読者をやめる 読者になる 読者になる

EmacsでのGo言語編集環境(Linux編)

emacs golang

http://unknownplace.org/archives/golang-editing-with-emacs.html


とだいたい同じだったんですが、微妙に違ったところがあったのでメモ。
環境は Ubuntu 13.04 64bitです。

バイナリのインストール

Ubuntuのパッケージやら PPAでありますが、公式に配布されるバイナリから
インストールすることにします。


https://code.google.com/p/go/downloads/list


から自分の環境にあったものを取得してください。
取得できたらそれを展開します。今回は /opt以下にインストールすることに
します。

% cd /opt
% sudo tar xf ~/Desktop/go1.1.1.linux-amd64.tar.gz

これでインストールできました。

環境変数の設定

環境変数 PATH, GOROOT, GOPATHをそれぞれ設定します。
bashzshの設定ファイルに以下を追加します。ここでは GOPATHを ~/local/goと
しました(~/goが一般的なようです)

# golang setting
if [ -d /opt/go ]; then
    path=($HOME/local/go/bin /opt/go/bin $path)
    export GOROOT=/opt/go
    export GOPATH=$HOME/local/go
fi

PATHは先程の tarball中の binディレクトリと GOPATHの binディレクトリに
それぞれ通しします。GOROOTは標準的なディレクトリにインストールした際は
不要なようですが(/usr/local等), 今回のように標準的でないインストールした
場合は設定が必要になります。MacOSXbrewやパッケージ管理システムを使って
インストールした場合は不要なはずです。

Emacsへの環境変数の設定

元の記事の環境変数 PATH, exec-pathに加えて、GOROOTを設定する必要があります。
(no-windowで利用される方はシェルの設定が行えていれば、特に Emacs側で設定する
必要はないと思います。環境変数がそのまま引き継がれるため)


私の設定方法については下記を参考にしてください
http://d.hatena.ne.jp/syohex/20111117/1321503477


とにかくPATH, exec-pathに加えて、以下のような設定を追加してください

(setenv "GOROOT" "/opt/go")
(setenv "GOPATH" "/home/syohei/local/go") ;; (追記) 一応 GOPATHも

go-mode, go-autocompleteのインストールと設定

両方共 MELPAに登録されていますので、package.elを使っている方は
package-installだけでインストールできます。M-x package-list-packages
からインストールするか、下記の選択して eval-region等を行ってください

(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/"))
(package-initialize)
(package-refresh-contents)
(dolist (pkg '(go-mode go-autocomplete))
  (package-install 'pkg))


go-autocomplete.elは auto-completeやら go-mode-hook周りの設定が
ファイルをロードすることでしか行えないので、package.elでインストール
しても明示的に requireする必要があります。

(eval-after-load "go-mode"
  '(progn
     (require 'go-autocomplete)))

gocode, godefのインストール

元のページと同様にインストールしてください

% go get code.google.com/p/rog-go/exp/cmd/godef
% go get -u github.com/nsf/gocode

"did you run git update-server-info on the server?"みたいな
エラーが出たらたぶんタイポしているので、打ち間違えがないか確認
するといいでしょう。(nsfを nfsって打っていてハマリました)


これでおそらく補完等が使えるようになったはずです。

Emacsのユーティリティ

helm-modeや anything-read-string-modeを使っていない人は元記事の
ように helm/anythingインタフェースで絞り込みができないので、
以下のようなものを定義すると良いと思います。

(defvar my/helm-go-source
  '((name . "Helm Go")
    (candidates . go-packages)
    (action . (("Show document" . godoc)
               ("Import package" . my/helm-go-import-add)))))

(defun my/helm-go-import-add (candidate)
  (dolist (package (helm-marked-candidates))
    (go-import-add current-prefix-arg package)))

(defun my/helm-go ()
  (interactive)
  (helm :sources '(my/helm-go-source) :buffer "*helm go*"))

(define-key go-mode-map (kbd "C-c C-d") 'my/helm-go)


documentの表示もですが、import文の追加もできます。
(複数まとめて挿入できるようにはしましたが、それぞれに対して、
importと出しているのがださいように思われます。現状 go-modeの関数を
そのまま使っているためです。)

my/helm-goの実行(markに対応)

複数の import文を一度に挿入(イケてない...)

おわりに

問題等ありましたら、お知らせください。
何かアプリケーションが書けるようにとりあえず購入した本を
読もうと思います。