sim editor ・ Rust 製 ・ Linux と macOS

新時代の Vim。隠れたものまで、見える。

sim は、Rust でゼロから書いた新時代の Vim です。モーダル編集と Vim の基本のキーを受け継いでいます。

モードラインは読まず、プラグインは読み込まず、ネットワークにもつながりません。そのうえで、ふだんは見えないもの(不可視文字、エディタの外からの書き込み、コードを実行しうるリポジトリ)を画面に出します。

プラグインなし。モードラインなし。ネットワークなし。

無料のオープンソース(MIT OR Apache-2.0)。Homebrew でインストールするか、ソースからビルドします。 リリースノート: v0.2.0

notes/access.py を開いた sim。右から左への上書き文字と分離文字を含む行で、それらがマゼンタのブロックの <U+202E> と <U+2066> として表示されている。行末の空白は 3 つの点、ノーブレークスペースは小さな箱で示されている。
本物の U+202E と、文字列としての <U+202E> が同じ行にあります。マゼンタのブロックがつくのは本物の文字だけです。その下に Trojan Source 風の行、行末の空白(·)、ノーブレークスペース(⍽)。ツリーは git のステータス、行の横は HEAD との差分です。

ひとつの規則: 隠れたものは、見せる

エディタを使った攻撃の多くは、エディタがファイルを実際とは違う姿で見せることで成り立ちます。sim の見た目(depth、フォグ、赤と緑の差分、マゼンタの警告バッジ)は、隠れたものを見えるようにするためだけにあります。色には決まった意味があり、同じ色はいつも同じことを表します。

それぞれの色の意味

  • グレー無彩色のグレーと文字の太さが構造を表します。本文、行番号、アイコン、枠線です。
  • 青ただ一つのアクセントは「ここで操作する」の意味です。モード、いまのタブ、検索のマッチ、リンクに使います。
  • 緑・琥珀・赤緑・琥珀・赤は変更を表し、それ以外には使いません。
  • マゼンタマゼンタは、隠れているものか危険なものだけです。本来の姿で表示されない文字と、安全のために git を実行しなかったときです。

sim が画面に出すもの

ファイルとリポジトリが隠す 5 つのこと。sim は、そのすべてを見せます。

  • 不可視文字と双方向制御文字を見せる

    右から左への上書き文字やゼロ幅スペースは、どんな状態でも <U+202E> や <U+200B> としてマゼンタのブロックで描かれ、端末にそのまま送られることはありません。ファイルに書かれた文字列 <U+202E> にはブロックがつかないので、見分けられます。

    詳しく読む: 不可視文字と双方向制御文字を見せる

  • 何も見えない空白に印をつける

    行末の空白は ·、ノーブレークスペースは ⍽、タブは » で示します。コードで使われない記号を、本文の上に重ねて描くだけで、本文には含まれません。

    詳しく読む: 何も見えない空白に印をつける

  • 外部からの書き込みに印をつける

    開いているファイルを別のプロセスが書き換えると、本文・タブ・ツリーに変更箇所の印がつきます。読み込んだあとにファイルが変わっていれば、保存は何も書き込みません。

    詳しく読む: 外部からの書き込みに印をつける

  • git HEAD との差分がひと目でわかる

    行の横の変更記号、ツリーの各ファイルのステータス文字、ステータス行の +n ~n -n。すべて git から取得し、バックグラウンドで実行します。

    詳しく読む: git HEAD との差分がひと目でわかる

  • リポジトリ自身の設定では、git にコマンドを実行させられない

    リポジトリ自身の設定では、git にコマンドを実行させられません。監視、フック、フィルタは無効にし、それでもコマンドを実行しうる設定(core.sshCommand、include など)があるときは、git を実行しません。枠にその旨が出て、ステータス行には原因のキーとファイルが出ます。

    詳しく読む: リポジトリ自身の設定では、git にコマンドを実行させられない

ターミナルの中の sim

外部からの書き込みのあとの store.py を表示した sim。変更された 2 行が緑の背景になり、上の枠線に緑色のバッジ「2 changes on disk」が出て、タブに ↯ がついている。
開いているファイルが別のプロセスに書き換えられた場面です。変更行に印がつき、枠に「2 changes on disk」、タブに ↯ が出ます。バッファの内容は何も失われていません。
プロジェクトツリーの上に浮かぶ「Live grep」ウィンドウ。一致した行がファイルごとにまとまり、下にシンタックスカラーつきのプレビューがある。
Ctrl-f は、入力するそばから全ファイルの中身を検索し、選んだ行のプレビューを見せます。
README.md を開いた sim。帯の上の見出し、フェンス付きのコードブロック、罫線でそろえた表、タスクリスト、引用の線がある。カーソルのある先頭行は、入力されたままの形で出ている。
閲覧ビューの README です。見出し、表示幅でそろえた表、タスクリスト、引用が、読んだとおりの見た目で描かれます。カーソルのある行は、ファイルそのままです。
core.sshCommand を設定したリポジトリの sim。ツリーの枠の上辺にマゼンタのバッジ git not run が出て、ステータス行には git skipped: core.sshcommand in .git/config could run a command と出ている。
リポジトリの .git/config が core.sshCommand を設定していると、sim は git を実行しません。ツリーの枠に git not run と出て、ステータス行に原因のキーとファイルが出ます。

速い。主張ではなく、測定で。

プロジェクト自身のベンチマーク(リリースビルド、100,000 行のファイル、パネルを開いてハイライトを有効にした状態)で、1 キーの処理は p99 で 1 ms 未満です。10 万ファイルのリポジトリでは、ファイル一覧を読む前に最初のフレームを描き、実測で 1.8〜8.7 ms でした。

プロジェクトが AMD Ryzen 9 9950X で測った値です(仕様の SPEED-1、SPEED-2)。お使いの環境では変わります。

Vim・Neovim・Helix と並べて

出典つきの比較表です。プラグイン、モードライン、プロジェクト設定、不可視文字、外部書き込みを扱い、他のエディタがまだ勝っている点も書いています。

比較を読む

ロードマップ

予定のもので、まだ提供していません。ここにあるものは、いまは使えません。

  • マクロ

    予定

  • クリップボードとの連携

    予定

  • サンドボックス内の言語サーバー

    予定

  • 本物の奥行きをもつ GUI

    予定

  • ほかのインストール方法

    予定

予定している機能をすべて見る

新時代の Vim を動かす

Homebrew でインストールするか、ソースからビルドします。 AUR、crates.io のパッケージは近日公開です。