YAMAGUCHI::weblog

海水パンツとゴーグルで、巨万の富を築きました。カリブの怪物、フリーアルバイター瞳です。

Emacsを使ったGo言語開発手法(2013.07版)

はじめに

こんにちは、Go界の橋爪功です。以前mattnさんがVimを使ったGoの開発環境というエントリを書かれていたんですが、自分用にもEmacs版を、と思ったので、まとめておきます。

基礎からわかる Go言語

基礎からわかる Go言語

参考

設定

Go mode

Go用のメジャーモードのGo modeというのが標準で配布されています。使いましょう。load-pathにgo-mode.elとgo-mode-load.elを突っ込んでおきます。

(require 'go-mode-load)
(add-hook 'go-mode-hook
          '(lambda()
            (setq c-basic-offset 4)
            (setq indent-tabs-mode t)
            (local-set-key (kbd "M-.") 'godef-jump)
            (local-set-key (kbd "C-c C-r") 'go-remove-unused-imports)
            (local-set-key (kbd "C-c i") 'go-goto-imports)
            (local-set-key (kbd "C-c d") 'godoc)))

(add-hook 'before-save-hook 'gofmt-before-save)

Goでは標準のインデントはハードタブなのでindent-tabs-modeはtにしておいたほうがいいでしょう。「俺はハードタブなんか使いたくない!」と駄々をこねても、どうせgofmtで修正されるので諦めてください。

コードジャンプ

godef

godefを入れておくとTAGSを作成せずとも定義元まで参照できて大変便利です。

% go get code.google.com/p/rog-go/exp/cmd/godef

ctags (etags, Exuberant Ctags)

ソースコードの検索にetags使いたいんですが、まだGo言語にはデフォルトでは対応してません。でも下記の.ctagsファイル書いておけばtagsファイル生成できます。

--langdef=Go
--langmap=Go:.go
--regex-Go=/func([ \t]+\([^)]+\))?[ \t]+([a-zA-Z0-9_]+)/\2/d,func/
--regex-Go=/var[ \t]+([a-zA-Z_][a-zA-Z0-9_]+)/\1/d,var/
--regex-Go=/const[ \t]+([a-zA-Z_][a-zA-Z0-9_]+)/\1/d,const/
--regex-Go=/type[ \t]+([a-zA-Z_][a-zA-Z0-9_]+)/\1/d,type/

これを ~/.ctags として通常のctagsと同様プロジェクト内で次のコマンド実行するとEmacs用のTAGSファイルが作成される。

% cd /path/to/project
% ctags -Re

あとは M-x visit-tags-table で作成されたTAGSファイルを指定して M-. でジャンプするだけ。(上記のelispでgo-modeで定義されたgodef-jumpを利用するように変更している)

auto-complete + gocode

mattnさんの記事にもありますが、gocodeを使って自動補完を有効にします。

auto-complete

そういえば以前のものから更新してなかったので、更新しがてらinit.elの設定を確認。

(add-to-list 'load-path "~/.emacs.d/auto-complete")

;;;; auto-complete
(require 'auto-complete-config)
(global-auto-complete-mode t)
(add-to-list 'ac-dictionary-directories "~/.emacs.d/auto-complete/ac-dict")
(ac-config-default)

gocode

まずはgocodeを設定します。mattnさんのブログにあるようにGOPATHとPATHをちゃんと確認してgo getで持ってくる。

% GOPATH=/path/to/project
% PATH=$GOPATH/bin:$PATH
% go get -u https://github.com/nsf/gocode

次に go-autocomplete.el をload-pathが通っているディレクトリに突っ込んでおく。

init.elにGo modeではM-TABでauto-completeを起動するように設定を追加。(上記のものを編集)

(add-hook 'go-mode-hook
          '(lambda()
            (setq c-basic-offset 4)
            (setq indent-tabs-mode t)
            (local-set-key (kbd "M-." 'godef-jump)
            (local-set-key (kbd "C-c C-r") 'go-remove-unused-imports)
            (local-set-key (kbd "C-c i") 'go-goto-imports)
            (local-set-key (kbd "C-c d") 'godoc)
            (define-key ac-mode-map (kbd "M-TAB") 'auto-complete)))

あとは C-c C-a のimport packageを使えばだいたい幸せです。