Chienomi

VSCodeをやめてZedにするぞ!

Live With Linux::software

この記事はLinuxカテゴリです!

本文はLinux上での話をしています

Linuxに関する疑問解消や共有は日本語Linuxers

昔話をしよう。

かつて、LinuxにおけるエディタといえばviとEmacsであり、JvimとMuleであり、VimとEmacsであった。 Vim勢力とEmacs勢力はそれぞれに進化を続け、Vim勢力はNeoVIMに移行しているような気がしないでもないがまあだいたい今も生き残っている。

だが、Linuxデスクトップでの開発環境はそれにとどまらない。 プレーン寄りのエディタを愛するGedit勢力、エディタを強力にしたKDevelop勢力、そして一部Eclipse勢力がいた。

そして新たな時代が訪れる。GitHubがAtomを出してきた。 素晴らしいエディタだった。 日本語が全部シンボル扱いされるのと、めちゃくちゃ重いのと、結構クラッシュするのを除けば。

だがそれは割と明確な欠点だった。 あと、色々詰め込みすぎてて扱いにくい。

そこに彗星のごとく現れたのがVSCode(Visual Studio Code)。 ごてごてしたVisual Studioとは一線を画し、エディタとしてのあるべき姿を体現した素晴らしい開発環境であった。

あまりにも素晴らしかったのでAtomを駆逐し、Vim教徒とEmacs教徒の多くを改宗させた。 「Microsoftやるじゃん」と思ったものだ。

だが、その時代も終わり。 今やVSCodeは大量のテレメトリとMicrosoftが使わせたいものの押し付けにまみれている。

あまりにもテレメトリが増えすぎたタイミングで私はCode OSSからVSCodiumに移行したが、disableしてもAgentを押し付けてくるようになってとうとう我慢ならなくなった。

だが、移行先は結構難しい。

欲しい機能としては、指定したディレクトリをルートとするファイルブラウザ、組み込みの端末、そしてシンタックスハイライトくらいなのだが、それを揃えたエディタは……ないに等しい。 検索とか定義ジャンプとかいうといよいよVSCodeしかない。

VSCodeが嫌になっても、逃れられないのだ。

だが、そこにはひとつだけ希望が残されていた。 Zedだ。

Zed、といったらZshのラインエディタをイメージする人が圧倒的多数だと私は信じているが、ここではそうではない。 zed-industries/zedのことだ。

Zedは「Atomの後継」というように語られることが多いが、実際のところソフトウェア的にはAtomとはまるで関係がない。 そもそもElectronだったAtomと違い、Rustで書かれていて、gpuiという独自のUIフレームワークを使っている。 Atomとの関係は、Atomを作ってた人たちが作った、ということに留まっている。

Zedは当初Macのみであり、UI操作部品の少ないいけ好かないUIをしていた。 だが、現在はそれなりに操作できることも設定できることも増えている。

ざっくり所感

全体的に動作は軽い。 言語サポートはLanguage Serverに依存しているが、VSCodeと違いしっかりとセットアップされるためほぼインストールするだけで良好な言語サポートを獲得できる。 少なくともRuby, Elixirを書く上ではVSCodeよりも良い環境を得やすい。

MarkdownにおいてもFrontmatterもシンボルとして認識されるなど、より高機能だ。 一方、VSCodeにはあるMarkdownのパスの補完は効かず、プレビューでは画像は表示されない。 Chienomiを書くのにこれまでCode OSS/VSCodiumを使っており、この点は結構影響がある。

機能的にはVScodeに似ていて、ショートカットも似せてある。

不安定なところはあるが、不安定になる条件は限られている。 最近だとElixir-LSを入れて、かつerlang-dialyzerがない状態でdialyzerがないというダイアログをクリックするとフリーズ後落ちる、といったことがあった。

Fcitxは対応したとはいえインラインエディットが使えずプレエディットになるので文章を書く環境として快適かというと微妙。

コマンドラインオプションとして--user-data-dir DIRがあり、プロファイルの使い分けも可能。 ……なはずだが、うまく動作しない。 このオプションをまぜると起動しないし、混ぜなくても指定したディレクトリは使われない。

Nemo Action

[Nemo Action]
Name=Open Zed
Comment=Zeditor open here

Exec=/usr/bin/zeditor %P

Icon-Name=zed

Selection=Any
Extensions=any;
Dependencies=zeditor;

--newがいるかなと思ったけれど、いらなそう。

フォント問題

基本的なフォントの概念

FontConfigの仕様としては、要求された論理フォント名に対して、物理フォントのリストを返す。 で、FreeTypeを使って文字のラスタライズを行う。

GtkやQtの場合、グリフ不足があればグリフが埋まるまでリストを順に適用していく。

が、それはFreeTypeの中で完結しているわけではないため、FreeTypeに描画させることとフォントをフォールバックさせることは別の処理。 GtkやQtはこのフォールバック処理が組み込まれているため、特に意識することなくFontConfigの機能を活用することができる。

そもそも一般的なプログラマがFontConfigとFreeTypeを直接に意識することはほとんどない。 フォントに関する抽象レイヤーが存在しているのが当たり前だからだ。 だが、直接触る前提で言うと、FreeTypeとFontConfigは特に一体になっているわけではなく、別々に呼び出すことになる。

このため、FontConfigのリスト全体を適用するかはプログラム側の実装による。 分かりやすいところで言うと、FirefoxやGoogle ChromeはCSSで指定されたフォントはFontConfigで引いたリストの先頭だけを使い、それでグリフが足りない場合はFontConfigが返したリストで埋めるわけではなく、CSSで指定された次の候補で埋めようとする。 ただし、これらがFontConfigのリストを扱えないわけではなく、CSSで何も指定されていない場合に適用されるデフォルトフォントに関しては最後まで適用する。

もう分かったかと思うが、Zedではフォントのフォールバックを行わない場合がある。 ui_font_fallbacksbuffer_font_fallbacks といった設定項目自体は存在するが、これらは指定されたフォントが存在しない場合に適用されるもので、グリフが足りないという判断はなされない。 これがそういうものなのか、本来はグリフを埋めるものなのかは不明だが、現状ではこのfallback自体が「Linuxでは動作しない」という扱いらしい。

フォント指定

とにかく、安全策としてはフォントはFontConfigに頼らず日本語グリフを含むフォントを指定したほうが良い。

日本語グリフを含むコーディングフォントとしては

  • 源ノ角ゴシック Code JP
  • M PLUS 1 Code
  • VLゴシック
  • M+ 1m / M+ 2m / M+ 1mn

がある。

合成フォントであればMigu, Cicaなど色々ある。 個人的にはFira CodeとIBM Plex JPの合成フォントであるFirple Slimを使っている。

Markdownプレビューのフォント

MarkdownプレビューはUI fontを使って描画され、なおかつフォールバックされないため、UI fontを欧文フォントにしていると日本語文書は豆腐まみれになる。

UIでは豆腐にならないからちょっと盲点だ。

その他知っておいたほうが良いこと

IME

ZedにはIMEのコミットに関して問題があり、0.208で修正されたのだが、依然としてIME関連は不安定な挙動が多い。

Fcitxが有効にならず、Zedを再起動しまくってるとそのうち有効になる、みたいなやつもある。

また、Quick phraseやUnicode palette、あるいはClipboardといったFcitxがウィンドウを生成するタイプの機能はうまく動作しないことがある。 その場合は連打しているとうまくいったりする。

Markdownプレビュー

Markdownプレビューはカーソル位置には追従するが、スクロールには追従しない。

Markdownプレビュー側でスクロールするという意識が必要。

キーワード問題

日本語は全部が\w扱いになって日本語文字列を補完しようとする。

これは基本的にAtomと同じ挙動だが、Atomよりはいくらかマシな出方をする。

Language Server

Zedは言語サポートとしてLanguage Serverを使う方式なのだけど、Language Serverに必要なコンポーネントや設定をZed内に持っていて、制御できない。

これにより、LinterやForamtterが意図せぬ挙動を引き起こすことがある。 プロジェクト内にLinterやFormatterの制御を含む場合はそれでコントロールできるので問題ないが、含まない場合は非常に厄介になる。

設定

最近設定ウィンドウができたが、全部が設定できるわけではない。

設定は基本的には設定ファイルでやったほうが良い。

最終ラインの扱い

ZedはAtomと同じように、最後に1つだけ空行がある状態に強制的にしてしまう。

これはsettings.json

{
  "ensure_final_newline_on_save": false,
}

で良い。

AI関連

私がVSCodeでキレたAIを無効化できない問題だが、Zedはちゃんと完全無効化が可能。 こんな感じ。

{
  "disable_ai": true,
  "collaboration_panel": {
    "button": false
  }
}

サインイン

サインインボタンが邪魔なら

{
  "title_bar": {
    "show_sign_in": false
  }
}

自動フォーマット

デフォルトだと保存時にフォーマッタを起動させる。 好ましくないなら

{
  "format_on_save": "off"
}

総合的な所感

完全に代替可能かというとまだまだな部分もあるが、ユーザー少なくとも普通に使えるレベルにはなってきている。

もしVSCodeに対して強い不満があるのなら、試してみる価値はあるだろう。