Simple Golang Development Environment in Emacs

2014-03-18

最近心血來潮,花了幾天的時間把 A Tour of Go 的練習題做完了。主要開發的環境是 Emacs,因此這次想要分享一些研究時發現的資料,希望能給其他有需要的人一點幫助。標題下的 Simple 一詞是因為我的設定並無考慮到比較複雜的開發環境需要,目的僅是為了能在 Emacs 寫 Go。

go-mode

Go 的社群裡有許多人幫各種開發工具寫了官方的 plugin,Emacs 當然也不例外。go-modeGo 官方的 major mode,裡面除了基本的語法上色外,還整合了一些 Go 的官方工具,簡單好上手。Go 所發佈的檔案裡,就有直接附上了這些檔案。假設安裝在 /usr/local/go,那麼 go-mode 的檔案位置就在 /usr/local/go/misc/emacs

(add-to-list 'load-path "/usr/local/go/misc/emacs/go-mode-load.el" t)
(require 'go-mode-load)

這樣子設定,Emacs 只要開啟 go 檔案就會進入 go-mode 了。

除了官方的檔案之外,Emacs 的 Package Archive 像 MarmaladeMelpa 也都提供安裝 go-mode 的檔案。這些地方的更新會比等 Go 新版本發佈的檔案來的快,因此我個人是從 Melpa 安裝的。

godef

go-mode 目前有一個外部的 dependency : godef,主要是為了顯示 Document,還有方便直接找尋 Go 的 source code。安裝的方式是使用 go command 。

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

Features

這邊簡單的介紹一些 go-mode 的功能 :

  • c-c c-a : go-import-add,自動 import 所選擇的 package,裡面列出 Go 預設和 workspace 內有的 package。
  • go-remove-unused-imports : 移除無用的 import。
  • c-c c-j : godef-jump,自動跳到游標所在位置程式的原始碼。
  • c-c c-d : godef-describe,在 minibuffer 顯示該程式碼的宣告。

gofmt

Go 解決 convention 問題的方式是寫了一個 gofmt 工具來做自動排版,並建議大家都用它。因此當然也需要將它納入環境中。目前最常見的方式是讓 gofmt 在儲存時自動執行。

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

此外,由於 Go 是建議使用 tab 字元縮排,因此記得在 go-mode-hook 裡設定 indent-tabs-mode

flycheck

Flycheck 是 Emacs 即時語法檢查的 plugin 之一,它也有支援 Go。並且使用像 gofmtgolint等工具做為檢查的依據,非常推薦。

flycheck in go

GOROOT, GOPATH in terminal

由於我習慣在 Emacs 內使用 terminal,因此同樣地也希望我能在 term-mode 下正常讀取 GO 的環境變數。

由於 GOPATH 需要指向 Go 的 Workspace,以方便開發和使用官方的 go command。但就我所知,目前官方並沒有方便獨立各個開發環境的方案;而一堆人寫自己的 goenv file和較複雜的 GVM 都讓我不知道如何是好。反正只是為了寫練習題,就先暫時不解決這問題,一律使用同一個 workspace。

而將環境參數帶入 terminal 的方式,我個人是使用 exec-path-from-shell 來將環境參數自動帶到 term-modeshell-modeeshell-mode

(setq-default exec-path-from-shell-variables '("PATH" "MANPATH" "GOROOT" "GOPATH"))
(exec-path-from-shell-initialize)

Conclusion

到這邊為止,就是我主要的 Go 開發環境。雖然只有很基本的東西,不過已經足夠滿足我寫完練習題的需求。其他像是用 gocode 做自動完成;使用 YASnippet 設定常用的 snippets;使用 go-eldoc 讓 eldoc 也能顯示 go 的宣告... 等等。這些都是可以進一步再去加強的地方。

希望這篇介紹可以讓需要的人對 Emacs 裡 Go 的開發環境有初步的認識。