EmacsでClojureの開発環境を整えるためにCIDERを入れる

なんだか最近急に寒くなってきた。

先週までジーパンにTシャツ一枚みたいな軽装だったのに今日は普通にジャケットを来て外に出てた。

多分このまま気温が急降下するんだろうなと思って勢いでダウンジャケットなどをポチり、明日か明後日には届くらしいのでちょっと楽しみにしている。

夏服よりも冬服の方が好きなので冬のコーディネートは全力で楽しんでいく予定。

そんな最近なんだけれども、この頃Clojureに興味を持ち始めてちょっと勉強してみたところ割と手に馴染んだので、本格的にClojure²手を出してみようかなと思い始めた。

で、そのためにClojureの開発環境の構築を行っていたわけだけれど、案の定やはり手間取ってしまった。

一応なんとか解決したので今回はそれの作業メモとしてのエントリー。

最初に

とりあえずGoogleの検索ボックスにClojure 開発環境 macと入れて検索してみたらそれっぽい記事があった。

qiita.com

一応すでにLeiningenはHomebrew経由で入れてあってREPL上ではClojureは触っていたのだけれど、Emacsでの開発環境を整えていなかったのでそこらへんを確認すると

の3つがあるらしい。

ここらへんがそれぞれ何なのかは先ほどの記事を参照してもらうとして、とりあえず一つずつ入れていく。

まずはじめに、テキトーにhoge.cljみたいなファイルを作って、中にテキトーなコードを書いておく。

(let [long-long-var 10
        v 99])

(def m {:some-key 1
              :key2 10})

(defn hello []
  (println "Hello World !"))

これをEmacsで開いてみるとシンタックスハイライトは効いておらず、全部白黒。

さて、M-x package-install RET clojure-mode RETとしてClojure-modeを入れてみる。

再起動してもう一度コードを開いてみるとちゃんとシンタックスハイライトもついている。

先ほどのコードの中で2行目のv 99])のところにカーソルを合わせ、C-c SPCとするとインデントを整えてくれる。

うん、すごい。Clojure-modeすごい。すごすぎてちょっとキモい。

とりあえずClojure-modeの確認はできたので今度は2つ目のCIDERを入れる。

先ほどと同様にM-x package-install RET cider RETと打ち込む。

ここで事件は起こった....

Emacs何もわからんになった

CIDERをインストールしようとすると

Package 'queue-0.2' is unavailable

というメッセージ。

よくわからんけど、多分CIDERが依存している別のパッケージが死んでるらしい。

とりあえずGNU ELPAのパッケージをブラウザ上で確認してみる。

ちなみにELPAとはEmacs Lisp Package Archiveのこと。

見てみたらちゃんとqueueは存在する。

elpa.gnu.org

あれ?ちゃんと存在してるのに何でインストールできないの?

一度Emacsの設定ファイルの.emacs.d/init.elを開いて、パッケージの参照先を確認。

自分のパッケージ参照についてはこんな感じになっている。

;; パッケージ設定
(require 'package)
(add-to-list 'package-archives '("gnu" . "https://elpa.gnu.org/packages/") t)
(add-to-list 'package-archives '("melpa-stable" . "http://stable.melpa.org/packages/") t)
(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))
(package-initialize)
(unless package-archive-contents (package-refresh-contents))

多分melpamelpa-stableが衝突したんかなーとか思ってテキトーにコメントアウトしてCIDERをインストールし直すも動かず。

そもそもでgnuの参照がちゃんと見れてるのか不安になり、一度パッケージの参照先をgnuだけにしてみてM-x list-packagesでパッケージのリストを見てみる。

GNU ELPAのパッケージリストと全く一致していないことを発見。

色々調べてみたけど謎だった。

とりあえずこの謎は放置するとして、パッケージの参照先にmelpaなどを追加してみてもう一度M-x list-packagesを見てみると、そこにはqueueがある。

うーん、どういうことなんだろう。

Issueにて同様の問題を発見

困ってどうしようもなかったので、なんとなく最初のエラーメッセージのPackage 'queue-0.2' is unavailableGoogleの検索ボックスに打ち込む。

そうするとCIDERのインストールで詰まっているような内容がちょこちょこ見つかる。

どうやら今回の問題は割と他の人たちもハマっていたらしい。

そこでIssueでのdiscussionを眺めていると、以下のコメントを発見。

github.com

debbugs.gnu.org

どうやらOpenSSLあたりでTLSが衝突していることが原因でつまづいているらしく、TLSの優先順位をつけることによって解決できるらしい。

ということでEmacsの設定ファイルに

(setq gnutls-algorithm-priority "NORMAL:-VERS-TLS1.3")

と書いておけば解決するらしい。

なるほどなるほど。とりあえず試してみる。

設定ファイルのパッケージ周りのところに

;; パッケージ設定
(require 'package)
(add-to-list 'package-archives '("gnu" . "https://elpa.gnu.org/packages/") t)
(add-to-list 'package-archives '("melpa-stable" . "http://stable.melpa.org/packages/") t)
(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))
(package-initialize)
(unless package-archive-contents (package-refresh-contents))
(setq gnutls-algorithm-priority "NORMAL:-VERS-TLS1.3")

; brah brah brah

と追記して、M-x package-install RET cider RETとしてみる。

ちゃんと入った。めでたい。

早速試してみる。

先ほどのゴミコードを開いてCIDERを立ち上げ、関数定義の部分にカーソルを合わせてC-c C-cとしてみる。

f:id:komi1230:20191016233754p:plain
CIDERが動いてる!

うん、ちゃんと動いてる。しっかりSLIMEみたいに開発ができる。

これで欲しがってた環境が完成した。

まとめ

かなり紆余曲折あって何とかClojureの開発環境を手に入れた。

まさかパッケージが入らない問題がTLSの衝突とは予想外だった(てかなぜ今までその問題にぶつかることなくパッケージが入れられていたのか...)

実を言うと今まで何回かノリでClojureの環境構築に挑んだことがあるのだが、毎回このCIDERが入らない問題で挫折していたので、今回ようやくそれを乗り越えられたのでとても幸せな気分。

よし、明日から開発がんばっていこう。