SpacemacsのClojure LayerでLSPを強制されてしまう話

おきもち書いてるだけなのでqiitaじゃなくてnoteにしました。

前提

2020/11/25 [clojure] Add lsp server support によって、LSP Layerが有効な状態でClojureファイルを開くと勝手にLSPを起動するようになりました。
2021/1/20時点でも、特に変化ないようです。

2021/4/4、公式で修正されたようです🎉
https://github.com/syl20bnr/spacemacs/commit/4bf350148863a63ec1f961aad6cd248503026483

↓記事本文は、それより以前に喰らい続けていた当時のおきもちとしてご覧ください。


起動するサーバ (backend)を選ぶことは可能で、デフォルトは 'cider みたいです。
cf. [clojure] Add instructions to disable lsp server support

※backendを選べるだけなので、依然としてLSPが起動します…😇


もちろんLSPはメリットだらけ*1 なのですが、Clojureだけは例外だなというおきもちでいます。


*1 僕もScalaのmetalsやPythonのpyrightなど様々なLSPにお世話になっていますし、それらをSpacemacsに設定するためのメモを残したりSpacemacsで利用可能なLSPを増やしたりしていました。


どう困るのだろう

# CPU激重😇
metalsも同じく激重なのですが、あっちは使うだけの恩恵があるので良いです。
Clojureの場合はcider-jack-inしていた時と機能的に大差ない体験のわりにCPU使用率が3倍超えでつらいのが問題でした。
別にLSPが無くても定義ジャンプとかできたんです。

# メモリいっぱい😇
metalsほどじゃないと思いますが、まあLSPなのでメモリいっぱい使ってる感じはあります。

# 巨大なファイルが凍結する😇
メモリのせいかはわかりませんが、cider-jack-inの頃は「重いなぁ…」程度で済んでいた5000行超えのおっきい.cljファイルをLSP付きで操作しようとすると、コピペの度に4秒ほど & 保存の度に4分ほどバッファが凍結しました (合わせてSpacemacs自体が時を止める😇😇😇)
LSPを止めたら元気に動くのでつらい…

# 既存のフォーマット機能と激しい競合がある😇
何かが競合しているらしく、Spacemacsでaggressive-indent機能を有効にしていると1文字も入力できなくなりました😇😇😇
仕方ないのでaggressive-indentのほうでclojure-modeを除外してLSPのフォーマット機能を使っていますが、aggressive-indentを使っていた頃はわざわざキー操作でフォーマットしなくても入力したそばからインデント修正されて実質フォーマット完了していたので、LSPだと手間が増えて効果が減った感じです (Lisp全体がそんな感じかもしれませんが、Clojureはインデントさえ合っていればほぼ大丈夫でした)


コミュニティの反応 (?)

困っているのは自分だけかと思っていましたが、当該commitで議論がありました。ClojureにおいてLSPを強制されることは、他のユーザにとっても嬉しくないらしいです (?)。


他の場所でも議論を見かけたので、こちらにもメモしておきます。


zilti16:12:57
Question to the Spacemacs users in here: how do I disable the Clojure layer from using clojure-lsp? It's an annoying memory hog for me

- Clojure Layerでclojure-lspを使わんようにする方法知らんか?メモリをクソみたいに食い潰してきてたまらんわ

practicalli16:12:27
@zilti The Spacemcs Clojure layer does not include any configuration for clojure-lsp, so you cant disable it in the Clojure layer. I assume you have the Spacemacs lsp layer installed and clojure-lsp binary, and some configuration in your .spacemacs file (probably in dotspacemacs/user-config) that configures clojure-lsp to run when in clojure-mode.

- Clojure Layerにそういう設定はないやで。

practicalli16:12:55
Remove the lsp layer from .spacemacs and restart Emacs, this should be the quickest way to remove it. I would need to see your .spacemacs config to help further

- LSP Layerを.spacemacsから消して、どうぞ

zilti16:12:14
Yes, it does now: https://develop.spacemacs.org/layers/+lang/clojure/README.html#optional-lsp-server

- や まあ今はそうやけど

zilti16:12:31
I need lsp-mode for other things, so I want to keep the lsp layer

- 他のLayerではLSP使いたいんじゃ!だからLSP Layerは残したいンゴ

practicalli16:12:26
Thats very bad if someone just added it without telling people. Its also using quite negative tone against the well established CIDER approach. I will investigate and raise this with the Spacemacs maintainers...

- 特に告知もなく追加してるのチョベリバなんだよな。既存のCIDERアプローチに対してしんどいわ。Spacemacsメンテナーと一緒に調べて提起するで

zilti16:12:55
Especially having it enabled by default. All other languages I use require you to set a variable to enable it

- これデフォで有効になっちゃったんだよなあ。ワイが使ってる他言語だと変数で有効にするんやけど

practicalli16:12:24
Yes, this is really badly though through. It forces anyone who does not want lsp for clojure to add another vairable to their .spacemacs layer config. I believe this should switch it off..

```
clojure :variables
clojure-backend 'cider
```

- ほんまつっかえ!clojureでLSP使いたくない人はLayer設定に別の変数を追加せなあかんで。ワイはこっちの設定でoffにすべきやと思うが…

practicalli16:12:40
Thanks for raising this. Using clojure-lsp would kill my startup times, turning a few seconds into several minutes whilst clojure-lsp goes and re-indexes all the project where I have a clojure buffer open....

- うpありです^^ clojure-lsp強制でclojureバッファのインデックス張り替え入って待ち時間が秒から分になったわ

zilti16:12:52
Sure. And thank you for the off switch 🙂 it works.

- offスイッチ㌧クス。動いたわ

practicalli17:12:03
Yes, they didnt even bother documenting how to switch it off properly either... I would be interested in using clojure-lsp but is very heavyweight around the UI and I found a lot of clashes with CIDER when I ran them both together earlier in the year. I also need to tell it to not index all my projects on Emacs startup, otherwise its there for minutes each time... clojure-lsp doesnt seem to work with Java 11 unless you compile it yourself, so some more work there. I would like to see some documentation that explains how to configure clojure-lsp before I try it again.

- CIDERと衝突しまくってるんだよな。インデックスも付けて回らんように設定せなあかん。clojure-lspは自力でコンパイルせんとJava11で動かんらしいな?

ericdallo17:12:05
It's in my backlog adding a tutorial using CIDER with clojure-lsp 😅 https://emacs-lsp.github.io/lsp-mode/tutorials/CPP-guide/

- clojure-lspでCIDERを使うチュートリアル作成はワイのバックログやでぇ…

ericdallo17:12:44
But I agree, it's missing docs explaining how to use both, after some tweaks they work together and work really nice

- まあええわ。両方使う方法がdocsにないけど調整すればうまく動いてる

や、翻訳してるんではなくおきもちを書いています😇

議論中に出ている通り、他のLayerだとbackend=nilができたはずで、その場合はCompanyの補完機能くらいしか使ってなかったような気がします (少なくともLSPを起動し始めたりはしない)。


今後どうしようか

コミュニティ内で課題意識を持っていることがわかったので、近いうちに修正される望みがあります (それを期待して待ちます)。

できれば手元で直ちに修正したいですが、どうすれば良いのかわからない…😇

ひとまずはClojureにおいてLSPを起動した端から閉じていくことにします。

デフォルトLSPでこんなに困ることもあるんだなぁという気づきを得ました (Clojure使っていると例外的なアクシデントに遭いやすいと思わなくもないですが)


この記事が気に入ったらサポートをしてみませんか?