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たのしいです。


2013年11月25日月曜日

festivalを無限再生(Golang利用)

Lookup.elで調べた英単語をファイル保存しているけど、helmでヒストリー表示
するくらいしかしてなかったのでgolangを利用してずっと再生するようにして
みた。通常のfestivalだと大量の文章だと合成音声を作るのに時間がかかるので
改行で分割して、ちょっとずつ再生するようにしています。
ここ からクローンできます。
名前はgofestivalにしました。(なんか楽しそう)

インストール

cd INSTALL_DIRECTORY
git clone https://github.com/yuutayamada/gofestival.git
cd gofestival
go install

使い方

$GOBINを設定していた場合そこにgofestivalでインストールされるので、
ファイル指定するか(絶対パスのみ。。)

$GOBIN/gofestival -file FILENAME

または
文字列指定してください。

$GOBIN/gofestival -text "hello"

ずっと再生したい場合は、-loopオプションをつけてください。
(止めるときは、C-cかC-dで)

$GOBIN/gofestival -text "hello" -loop

終わり

初めてGolangでちょっとしたものをつくりましたが、channelとか面白いと
思いました。


2013年11月5日火曜日

org trelloの導入

Trello をEmacsからつかう拡張の org-trello.el を導入した。
なんか忘れそうなのでメモ。

インストール

たぶんpackage installでインストールしたほうが楽(githubのページみるかぎり)
だけどなぜかel-getでインストールした。

(push '(:name org-trello
:type git
:url "https://github.com/ardumont/org-trello.git"
:depends (dash request elnode cl-lib json elnode esxml))
el-get-sources)

設定

普通のorg-modeとtrelloがまざるのはいやなので~/trello以下の場合
trello-modeになるようにした。

(require 'org-trello nil 'noerror)
(setq *ORGTRELLO-PROXY-PORT* 9876)
(add-hook 'org-mode-hook
'(lambda ()
(when (string-match
(expand-file-name "~/trello/") buffer-file-name)
(org-trello-mode))))

キーバインドとか

API keyの取得C-c o i
ボードをリストから選択C-c o I
同期 orgからtrelloへC-c o s
同期 trelloからorgへC-c o S
killC-c o k
kill allC-c o K
Clean up all setupC-c o x
insert deadlineC-c C-d
create boardC-c o b

最初にAPI keyの取得はmustやらないと使えない。
次にC-c o Iでボード選択これはweb側で事前に作ってたから
もし作ってなかった場合はどうなるかよくわからない。
たぶんC-c o bのorg-trello/create-boardコマンド
を使うのかと思うけど使ってない。


2013年11月1日金曜日

flycheckのエラーをpopup.elのツールチップで表示するflycheck-tip.elをリリ ースしました。

golangを最近勉強し始めました。flycheckは標準でgoに対応しているらしいの
インストールしましたがflycheckのエラー表示が僕はあまり好きではないので、
popup.elのtooltipで表示できるようにしました。
MELPAにアップロードしたので、M-x list-packagesやpackage-installから
flycheck-tipでインストールできます。

el-getでインストールしたい場合は

(push
'(:name flycheck-tip
:depends (flycheck) ; popupがない場合はpopupも追加する
:type github
:pkgname "yuutayamada/flycheck-tip")
el-get-sources)

を評価したあとM-x el-get-install flycheck-tipでインストールできると思
います。dependsのpopup.elはauto-complete.elがすでにインストールされてい
ればその中に同封されているので必要ありません。

設定

MELPAからインストールした場合,require節は必要ないかもしれません。
キーバインドの設定は適当に行ってください。

(require 'flycheck-tip)
(define-key your-prog-map (kbd "C-c C-n") 'flycheck-tip-cycle)
(define-key your-prog-map (kbd "C-c C-n") 'flycheck-tip-cycle-reverse)

イメージ

注意

このプログラムはタイマー後にminibufferに出るメッセージとpopup-tipででる
メッセージが重複するので flycheck-show-error-at-point 関数を無効化し
ます。もしこの挙動が嫌な場合は、以下の設定で元に戻せます。

(setq flycheck-tip-avoid-show-func nil)

Popular Posts

Blogger templates

Blogger news