ZedでScalaを使う話

この記事はjsysアドベントカレンダー2024、1日目の記事です。(jsysと一ミリも関係なくてごめんなさい、12/23はjsysの話を書こうと思います)

adventar.org

Zedは最近開発されているRust製の高速なエディターで、普段はあまり使っていない。

これまで自分はSOS(雙峰祭オンラインシステム)のRust開発パートで id:arata-nvm に勧められて使っていたが、Rust以外だとあまりしっくり来ず使っていなかった。

ちなみに、Rustでの使い心地は快適で何も設定せずにrust-analyzerの恩恵を受けることができ困ることはなかった。

ただ、最近はVSCodeが遅いので試しに使ってみるかということで触り始めた。 (VSCode自体は遅くはないがプラグインを入れまくった結果自分の環境では遅くなっている)

metalsをインストールする

ScalaのLSPはmetalsという公式のものがよく使われているようだ。

scalameta.org

VSCodeではなぜか何もしなくてもmetalsが使えていたが、Zedの場合は普通にインストールすると良さそうだ。

metalsのインストールはhomebrewでもできるが、今回はCoursierというパッケージマネージャーのようなものを利用した。

get-coursier.io

Coursier自体はhomebrewでサクッとインストールでき、JVMの管理などもできるようだった。

$ brew install coursier/formulas/coursier
$ cs setup

metalsのインストールもcs install metalsで終わったがException in thread "main" java.lang.UnsupportedClassVersionError: scala/meta/metals/Main has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0というエラーが出て実行できなかった。

原因は書いてあるとおりJavaのRuntimeのバージョンによるものだった。当初、自分の環境にはすでにJVMがインストールされており、そのバージョンが古かったようでmetalsをインストールしてもクラスファイルのバージョン違いで上手く実行できなかった。

最終的には、このissueを参考に cs java --setup --jvm temurin:17を実行することでmetalsを実行する環境を整えた。

github.com

metals-zedでLSPと通信する

Zedは標準ではScalaをサポートしていないがmetals-zedという拡張機能をいれることでScalaを利用することができる。

github.com

これは本当にインストールするだけで使えて便利だった。

Zedの使い心地

非常に軽量で快適に使っているが、一部困っているところがある。

VSCodeと同様Integrated Terminalが搭載されているのだが、ここに日本語入力ができないため当初はコミットメッセージを入力できず困っていた。

gitの設定でzedをエディターで使うよう指定したらなんとかなったが、たまに困る。

git config --global core.editor "zed -w"     

また、devcontainerがサポートされていないのもだいぶ困っており、remote-sshを使えばできるようだがあまり体験はよくなさそう。 (remote-ssh自体はVSCodeより高速で便利そうだが、devcontainerむけにわざわざ設定するほどではないかなという感じ)

VSCodeからの移行

VSCodeでは.vscodeというディレクトリ内に、エディタ向けの設定を書くことができる。Zedでも同様にワークスペースの.zedディレクトリ配下にエディタ向けの設定を書く。

しかし、Zedは基本的に自分しか使っていないので誤って設定ファイルをコミットしないようにする必要がある。自分は.config/git/ignoreというファイルに.zedを指定してignoreされるようにしている。

VSCodeの設定は主に4つあり、この内タスクとコンフィグについてはZedにもある。

タスクを定義するtasks.jsonはほぼ記法が同じなので、VSCodeのものをコピーして、変数*1だけ書き換えて使っている。

設定ファイルはだいぶ異なり、書き換えが必要だ。

Typescriptのサポート

Typescriptは、VSCodeの場合エディタ自体にLSPが搭載されており、Zedでは使うことができない。代わりにZedにはvtslsというLSPが搭載されている。

vtslsは興味深く、VSCodeに搭載されているLSPを完全に追従することを目的としており独自機能などは基本載せない方針のようだった。

Unlike other similar projects, this is implemented by filling VSCode APIs and applying minimal patches onto the extension to make it possible to keep up with the upstream updates and drastically reduce the burden of maintenance.

なぞのボイスチャット機能

Zedには謎のボイスチャット機能が搭載されているがイマイチ何に使えばいいのかがわかっていない。

誰か知っている人がいたら教えてほしい。

ちなみに、謎にsohosaiチャンネルも作られているが1ミリも使われていないのである。

もしZedを使っている人がいれば、お友達になりましょう。