AtomでClojureの開発環境を構築する

[Atom Clojure Setup](https://gist.github.com/jasongilman/d1f70507bed021b48625)
を参考にすると、AtomでClojureのコードを書く環境がある程度できますが
さらに便利にするために、以下を行うといい感じの環境になります。

## 追加で導入するパッケージ
* maximize-panes 別Paneで開くREPLタブの表示/非表示がctrl-shift-enterでできて便利

## パッケージの設定
* language-clojureのNon Word Charactersは ()",;~@[]{}` に
* lisp-pareditのIndentation Formsは`try, catch, finally, /^let/, are, /^def/, fn, case, /^condp?/, /^if/, for, /^when/, testing, /^do/, loop, ns, binding, /^with/, comment, proxy, reify, locking, future, /^extend/, while`に
* proto-replのLein Pathを設定する

## Atomの設定
* Packages With Keymaps Disabledの設定にinkも加えて、`lisp-paredit, ink` に

## init.cljsとkeymap.csonの設定
[Atomのinit.coffeeをinit.cljs（ClojureScript）で置き換える方法](http://qiita.com/kurogelee/items/b198733771ae1c7e35ac) を導入したうえで

```init.cljs
(def workspace global.atom.workspace)
(def commands global.atom.commands)
(def views global.atom.views)

(defn get-editor [] (.getActiveTextEditor workspace))
(defn get-editor-view [] (.getView views (get-editor)))
(defn get-cursor [] (.getLastCursor (get-editor)))
(defn get-cursors [] (.getCursors (get-editor)))

(defn add-command [name & fs]
  (.add commands "atom-text-editor" name #(doseq [f fs] (f))))
(defn dispatch [name] (.dispatch commands (get-editor-view) name))


; S式の選択
(add-command "cljs:select-sexp"
             #(dispatch "lisp-paredit:up-sexp")
             #(dispatch "lisp-paredit:expand-selection"))

; S式内部の選択
(add-command "cljs:select-sexp-inside"
             #(dispatch "core:move-left")
             #(dispatch "core:move-right")
             #(dispatch "bracket-matcher:select-inside-brackets"))

; Enter
(add-command "cljs:enter"
             #(if (.isAtEndOfLine (get-cursor))
                (dispatch "editor:newline")
                (dispatch "lisp-paredit:newline")))

; コード実行
(add-command "cljs:execute-block"
             #(if (pos? (count (.getSelectedText (get-editor))))
                (dispatch "proto-repl:execute-selected-text")
                (dispatch "proto-repl:execute-top-block")))

; 自動で閉じる挙動をOFFにしてシングルクオート
(add-command "cljs:single-quote"
             #(doseq [s (.getSelections (get-editor))]
                (.insertText s "'")))

; 選択部分のマクロ展開
(add-command "cljs:macro-expand"
             #(let [s (.getLastSelection (get-editor))
                    code (str "(macroexpand-1 '" (.getText s) ")")
                    options (clj->js {:inlineOptions {:editor (get-editor)
                                                      :range (.getBufferRange s)}})]
                (.executeCodeInNs global.protoRepl code options)))

```

```keymap.cson
'atom-text-editor':
  'ctrl-q': 'tree-view:toggle'
  'ctrl-t': 'tool-bar:toggle'

'atom-workspace atom-text-editor[data-grammar~="clojure"].autocomplete-active':
  'enter': 'autocomplete-plus:confirm'

'atom-text-editor[data-grammar~="clojure"]:not([mini])':
  'enter': 'cljs:enter'
  'shift-enter': 'cljs:execute-block'
  'f4': 'cljs:select-sexp'
  'f5': 'cljs:select-sexp-inside'
  'ctrl-i': 'lisp-paredit:indent'
  'ctrl-d': 'proto-repl:print-var-documentation'
  'ctrl-delete': 'editor:delete-to-end-of-line'
  'insert right': 'lisp-paredit:slurp-forwards'
  'alt-c': 'inline-results:clear-all'
  'ctrl-e': 'cljs:macro-expand'
  '&': 'cljs:single-quote'
```

* keymap.csonの`'&': 'cljs:single-quote'`は、日本語キーボードでの（？）シングルクオートのキーで発行されるコマンドです。