Elixir流行ってますね。流行りものに極度に弱い私ですので、すぐに飛びつきました。今はチュートリアルをひと通りおさらいしてmixの使い方の初歩の初歩が分かった程度です。Lispはなんでもかんでもlambdaに包み込んでいましたが、Elixirは更にプロセスに包み込む感じですかね。面白いですけど頭がついていけるかどうか…
私はEmacsを使っていますから、即座にelixir-modeとAlchemistをインストールして使っています。とはいっても右も左もわからない状態ですので、M-x alchemist-iex-run
をやってコードの断片を実行して様子を見るということをやっています。
さてAlchemistには編集中のバッファからIExにコードの断片を送って実行できる関数がいくつか実装されています。
-
alchemist-iex-send-last-sexp
直前のブロック全体を送る -
alchemist-iex-send-region
リージョンを送る -
alchemist-iex-send-region-and-go
リージョンを送ってIExバッファに移動 -
alchemist-iex-send-current-line
カーソル行を送る -
alchemist-iex-send-current-line-and-go
カーソル行を送ってIExバッファに移動
…こんなの使い分けられないよ。
まず最初のやつ、これってelisp-modeのeval-last-sexp (C-x C-e)
っぽいですよね。なのでElixir-modeにおいてC-x C-e
を当てることにしました。
残りのやつ。リージョンを選択してるかどうかで自動的に送る対象を変えて欲しいっすよね。あとuniversal argument (C-u
) を与えるかどうかでIExバッファに移動するかどうかを変えるようにしたらいいかなと思いました。C-u
がついていたら、IExバッファに移動です。それらを判別して右記した関数を選択して呼ぶ関数を作りました。いちおうC-M-x
にバインドしました。これもelisp-modeにおけるeval-defun
っぽいかなと思いまして。でもぜんぜん違うな…。まあいいや。
ということでこんなのを~/.emacs.d/init.el
に書いてみました。docstringの英語が変かもしれません。突っ込みがありましたらよろしくお願いします。あと今気づきましたけどコメント日本語っすね。こっちも英語にしろと思いましたが、とりあえずこのままにしときます。
(eval-after-load "alchemist"
#'(progn
(eval-after-load "elixir-mode"
#'(progn
(define-key alchemist-mode-map (kbd "C-x C-e") 'alchemist-iex-send-last-sexp)
(defun my-alchemist-iex-electric-send-thing (uarg)
"Sends the code fragment to the inferior IEx process.
If universal argument (C-u) is given, jump to the buffer.
when region is active, sends the marked region.
Otherwise sends the current line."
(interactive "P")
(cond
;; regionがアクティブかつC-uが押されている
((and uarg (use-region-p))
(alchemist-iex-send-region-and-go))
;; regionがアクティブ
((and (not uarg) (use-region-p))
(alchemist-iex-send-region (point) (mark)))
;; regionなし、かつC-uが押されている
((and uarg (not (use-region-p)))
(alchemist-iex-send-current-line-and-go))
;; なんにもなし
((and (not uarg) (not (use-region-p)))
(alchemist-iex-send-current-line))))
(define-key alchemist-mode-map (kbd "C-M-x") 'my-alchemist-iex-electric-send-thing)))))