このエントリーをはてなブックマークに追加

概要

Emacsでの Go言語をプログラミングする際の環境構築について示す.

事前準備

コード補完のために gocode, 定義元へのジャンプのために godefをインストールしておく

 % go get -u github.com/nsf/gocode
 % go get -u github.com/rogpeppe/godef

推奨パッケージ

これらのパッケージはすべて MELPAからインストールできる

go-modeの各種コマンド(利用頻度が高いもの)

go-import-add (Default: C-c C-a)

指定したパッケージの import文を追加する.

godef-jump (Default: C-c C-j)

関数, インタフェース, 変数等の定義元にジャンプする. コードリーティング等, コードの流れを把握したいときに非常に有用となる. godefコマンドが必要に なるので, 事前にインストールしておく. M-,で元の場所に戻れる.

MEMO

M-.に bindすると, 他のモードと同じになって, 使いやすいかもしれない.

godef-describe(Default: C-c C-d)

後述の go-eldocを使うことで, 自動的に情報を表示できる.

gofmt

gofmtコマンドを現在のバッファに適用する.

保存時自動的にこのコマンドを実行したい場合は 以下のように gofmt-before-saveを保存のための hookに登録すればよい.

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

go-autocomplete

gocodeを利用した autocompleteの Go拡張. 高速であり, 精度の高い補完能力を持つ.

go-autocomplete-screenshot

company-go

gocodeの company backend

引数スニペットの挿入

go-autocomplete, company-go共にデフォルトで関数名を補完した際, 引数のスニペットが挿入される. 無効にする場合は, auto-completeでは ac-go-expand-arguments-into-snippets, company-modeでは company-go-insert-argumentsを無効にする.

(custom-set-variables
 '(ac-go-expand-arguments-into-snippets nil) ; auto-complete
 '(company-go-insert-arguments nil))         ; company-mode

go-eldoc

Go用の eldoc. カーソル下の関数のシグネチャ, typeされた型の情報を minibufferに表示する.

go-eldoc-screenshot

その他パッケージ

flycheck

flycheckは Goが標準でサポートしている.

flymake-go

Go用 flymake

go-errcheck

compilationインタフェースでエラーを指摘するツール. next-errorコマンドなどで エラー箇所に移動できる. Goは指摘されるエラーが多いので, flymakeの類だと, 頻繁に エラーが指摘されてしまう. 一気にコードを書きって後でエラーをまとめて修正したい というような方はこちらのパッケージの方が良いと思われる.

go-direx

direxを使った Goのツリービューア

helm-tips

(defvar my/helm-go-source
  '((name . "Helm Go")
    (candidates . (lambda ()
                    (cons "builtin" (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*"))

Screenshot


go-helm-util1


go-helm-util2

設定例

(with-eval-after-load 'go-mode
  ;; auto-complete
  (require 'go-autocomplete)

  ;; company-mode
  (add-to-list 'company-backends 'company-go)

  ;; eldoc
  (add-hook 'go-mode-hook 'go-eldoc-setup)

  ;; key bindings
  (define-key go-mode-map (kbd "M-.") 'godef-jump)
  (define-key go-mode-map (kbd "M-,") 'pop-tag-mark))

参考