日曜プログラミング

休日趣味でやってるプログラミング関連記事をダラダラと

Emacs cider を 0.7.0-SNAPSHOT へ update

cider なんだがどうやら GW 前に 0.6.0 リリースがリリースされてた模様。 そこで REPL 上で 0.6.0alpha と表示されてた cider を 0.7.0-SNAPSHOT へ更新した。

更新は el-get で Github master から remove -> install と実行し、 後 leiningen プラグインである cider-nrepl の同じバージョンを指定したものを profiles.clj に追加した。

これで REPL 起動時に 0.7.0-SNAPSHOT と表示されるようになってれば OK。

良いと思った部分

stacktrace が別バッファに見易い形で出るようになった

割といい感じで色づけとフォーマットをしてくれるようになってる。 stacktrace の種類によって表示のフィルタリングもやってくれる模様。 全て表示にすれば従来の素の stacktrace も出る。

フィルタの種類がいくつかあるけど、どれがどれだかはまだ良く見てない。

repl 上もソースコードと同じような色付けしてくれるようになった

ソースコード編集時と比べ微妙に色付けが弱かった REPL も設定 ON にすれば ほぼソースコードと同じ色付けをしてくれるようになった。

Windows での REPL 改行表示設定方法に関するドキュメント追記

cider の REPL 出力で ^M が出るのが地味に気になりつつもそのまま使ってたんだが、 なにげにドキュメント見たら回避方法書いてあった。

clojure-emacs/cider · GitHub

Windows 特有だったのね。

これらは自分が良いなと思った部分で他の変更点に関しては 公式の CHANGELOG参照。

面倒だと思った部分

冒頭の更新手順でも書いたが leiningen プラグインである cider-nrepl が必須になった。 ただ CHANGELOG によれば必須になったのは現行の Github master からっぽくて 0.7.0-SNAPSHOT でなく 0.6.0 で更新すれば必須ではなさそうだけど未確認。

Windows の REPL 改行表示と同様 profiles.clj に書けば済むっちゃ済むんだが、 最初必須になったってのを見落としてて何で stacktrace 出なくなったんだとプチハマりしてた。

今回更新後の設定

profiles.clj 全体と init.el 抜粋を載せときます。

profiles.clj

{:user {:plugins [[lein-pprint "1.1.1"]
                  [lein-deps-tree "0.1.2"]
                  [codox "0.6.6"]
                  [lein-shell "0.4.0"]
                  [cider/cider-nrepl "0.7.0-SNAPSHOT"]]
        :injections [(use 'clojure.pprint)]
        :jvm-opts ["-Dline.separator=\"\n\""]}}

init.el の Clojure 含む lisp 周りのみ。 cider だけ、と言う感じになってなく少しゴチャっとしてる。

;;;
;;; elisp, clojure 他 lisp ファミリー開発
;;;

;; カッコ強調表示
(show-paren-mode)

(require 'cider-mode)

; cider 設定
(add-hook 'cider-mode-hook 'cider-turn-on-eldoc-mode)
(setq nrepl-hide-special-buffers t)
(setq cider-repl-tab-command 'indent-for-tab-command)

(setq nrepl-buffer-name-show-port t)
(setq cider-repl-display-in-current-window t)
(setq cider-repl-pop-to-buffer-on-connect t)
(setq cider-popup-stacktraces t)
(setq cider-repl-popup-stacktraces t)
(setq cider-auto-select-error-buffer t)
(setq cider-repl-print-length 2000)
(setq cider-repl-use-clojure-font-lock t)

(define-key cider-mode-map (kbd "C-.") 'complete-symbol)
(define-key cider-mode-map (kbd "RET") 'newline-and-indent)

;; イチイチ describe-function してられない
(require 'eldoc)
(setq eldoc-idle-delay 0)
(setq eldoc-echo-area-use-multiline-p t)
(add-hook 'emacs-lisp-mode-hook 'turn-on-eldoc-mode)
(add-hook 'emacs-lisp-mode-hook 'rainbow-delimiters-mode)
(add-hook 'lisp-interaction-mode-hook 'turn-on-eldoc-mode)
(add-hook 'lisp-interaction-mode-hook 'rainbow-delimiters-mode)

(add-hook 'cider-mode-hook 'rainbow-delimiters-mode)
(add-hook 'cider-repl-mode-hook 'rainbow-delimiters-mode)

;; 補完。
(define-key emacs-lisp-mode-map (kbd "C-.") 'lisp-complete-symbol)
(define-key lisp-interaction-mode-map (kbd "C-.") 'lisp-complete-symbol)

; ac-nrepl
(require 'auto-complete-config)
(ac-config-default)

(require 'ac-nrepl)
(add-hook 'cider-repl-mode-hook 'ac-nrepl-setup)
(add-hook 'cider-mode-hook 'ac-nrepl-setup)
(eval-after-load "auto-complete"
  '(add-to-list 'ac-modes 'cider-repl-mode))

(defun set-auto-complete-as-completion-at-point-function ()
  (setq completion-at-point-functions '(auto-complete)))
(add-hook 'auto-complete-mode-hook 'set-auto-complete-as-completion-at-point-function)

(add-hook 'cider-repl-mode-hook 'set-auto-complete-as-completion-at-point-function)
(add-hook 'cider-mode-hook 'set-auto-complete-as-completion-at-point-function)

(define-key cider-mode-map (kbd "C-c C-d") 'ac-nrepl-popup-doc)