header

2013年11月28日木曜日

Emacsで Go lang の設定

Golangについて興味がわいたのでEmacs環境を整えた。
ここ を参考にした。

他web上の情報とか:
Tour of go
Effective go
http://www.golang-book.com/
Go(wikipedia)

install

Hg でリポジトリからとってきた。
hg branches でブランチがみえるので、最新っぽいgo1.2rc2を入れた
(http://golang.org/doc/devel/release.html でリリース情報がみれる)
でも最近はgoenvなんてあるらしいのでそちらのほうがおすすめ。たぶん。

cd $HOMEhg clone https://go.googlecode.com/hg/ go
cd $HOME/go/src
hg update go1.2rc2
bash all.bash

goのパッケージ

godefで関数ジャンプ、gocodeはautocomplete(たぶん)するためにいれた。
godocはなんかエラーがでて、ぐぐったらgodocのバージョンが古いらしく
godocを削除して入れ直せと書いてあったので入れなおしている。

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

elispの設定

go-modeはgithub版のほうが新しそうなので、github版のものをつかう
go-autocomplete.elは下の場所にあったのでパスをとおしただけ。

$HOME/go/src/pkg/github.com/nsf/gocode/emacs/go-autocomplete.el

go-eldocという、eldocのGo版があったのでこれもインストールした。
flycheckは古いEmacsだとはいってないかも..

(require 'go-mode)
(require 'go-autocomplete)
(require 'go-eldoc)
(require 'flycheck)
(defconst tab-width 2)

(add-hook 'go-mode-hook
'(lambda()
(flycheck-mode t)
(go-eldoc-setup)))

;; 後述
(defvar my/go-packages (go-packages))

(defun my/go-before-save-function ()
(when (equal major-mode 'go-mode)
;; flycheckのエラー時 & org-modeのsrc buffer内の場合は
;; なにもしない
(unless (and (bound-and-true-p flycheck-current-errors)

(org-src-edit-buffer-p))
(gofmt-before-save)
;; 後述
(setq my/go-packages (go-packages)))))

(add-hook 'before-save-hook 'my/go-before-save-function)

パッケージ名のあと大文字にするのがルールのようなので、
fmt.のあとなど大文字にキャピタライズする設定、
よくわかってないので、go-packages変数にマッチする場合だけ
大文字にする。上のコードで後述と書いてある部分は、
go-packagesの読込が(少しだけ)時間がかかるので、
変数に保存するようにした。
コメントfaceと文字列のfaceの時は無視する。

(defadvice self-insert-command  (around ad-capitalize-method-head-in-go activate)
ad-do-it
(my/go-capitalize-auto))

(defun my/go-capitalize-auto ()
(when (equal major-mode 'go-mode)
(lexical-let
((current-face (nth 1 (text-properties-at (1- (point))))))
(if (and (equal "." (char-to-string (char-before (1- (point)))))
(case current-face
(font-lock-string-face)
(font-lock-comment-face)
(t t)))
(when (my/go-package-p)
(capitalize-word -1))))))

(defun my/go-package-p ()
"Return non-nil, if pre word is package."
(interactive)
(if (loop with pre-word = (save-excursion
(backward-char 2)
(word-at-point))
for pkg in my/go-packages
for subpkg = (when pkg (nth 1 (split-string pkg "/")))
if (and (stringp pkg)
(or (string-match (format "^%s$" pkg) pre-word)
(string-match (format "^%s$" subpkg) pre-word)))
do (return (or subpkg pkg)))
t
nil))

helmでGoの関数表示するelispパッケージ作った。

helmで関数名で検索したかったのでつくった。
godoc packge名の出力をfuncとtypeで正規表現で抜き出して
保存する非常にダサいコード。(もっとGo力があれば…)
https://github.com/yuutayamada/helm-go
名前はもしかしたらhelm-go-functionsとかに変更するかもしれない。
必要なもの:
helm.el, helm-ag-r.el, go-mode.el
ag(the silver searcher), godoc
helm-ag-rのインストールは ここ を参考にしてください。

helm-goはel-getとかで適当にインストールしたら後の設定は

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

のような感じで初回はhelm-go-save-documentsで関数名とtype名を保存する必
要があります。

おわり

全然つかいこなせてないけどGolangたのしいです。


0 件のコメント:

コメントを投稿

Popular Posts

Blogger templates

Blogger news