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 件のコメント:
コメントを投稿