sim editor · Rust · Linux и macOS

Vim нового поколения. Он показывает скрытое.

sim — это Vim нового поколения: написанный с нуля на Rust, он сохраняет модальное редактирование и основные клавиши Vim.

Он не читает строки режима, не загружает плагины и не открывает сетевых соединений, а то, что обычно скрыто, выводит на экран: невидимые символы, записи извне редактора, репозитории, которые выполнили бы код.

Без плагинов. Без строк режима. Без сети.

Бесплатно, с открытым исходным кодом (MIT OR Apache-2.0). Установите через Homebrew или соберите из исходников. Примечания к выпуску: v0.2.0

sim показывает notes/access.py. В строках с переопределением направления письма «справа налево» и символами изоляции они показаны как <U+202E> и <U+2066> на пурпурных блоках. Пробел в конце строки показан тремя точками, неразрывный пробел — маленьким квадратиком.
Настоящий U+202E и буквальный текст <U+202E> в одной строке: пурпурный блок получает только настоящий символ. Ниже — строка в стиле Trojan Source, пробел в конце строки (·) и неразрывный пробел (⍽). Дерево файлов показывает статус git, боковое поле — изменения относительно HEAD.

Одно правило: показывать скрытое

Большинство атак через редакторы работают потому, что редактор показывает файл не таким, какой он есть. Оформление sim (depth, туман, красные и зелёные диффы, пурпурный предупреждающий значок) существует ради одного: сделать скрытое видимым. Цвет подчиняется строгому правилу, поэтому каждый цвет всегда означает одно и то же.

Что означает каждый цвет

  • СерыйНейтральные серые тона и жирность шрифта передают структуру: текст, числа, значки, границы.
  • СинийЕдинственный акцентный цвет означает «здесь действуйте»: режим, текущая вкладка, совпадение при поиске, ссылка.
  • Зелёный, янтарный, красныйЗелёный, янтарный и красный означают изменение и ничего другого.
  • ПурпурныйПурпурный означает только скрытое или опасное: символ, показанный не таким, какой он есть, или git, пропущенный из соображений безопасности.

Что sim выводит на экран

Пять вещей, которые скрывают файлы и репозитории. sim показывает каждую.

  • Невидимые и двунаправленные символы показываются

    Переопределение направления письма «справа налево» или пробел нулевой ширины в любом состоянии отображается как <U+202E> или <U+200B> на пурпурном блоке и никогда не отправляется в терминал как есть. Буквальный текст <U+202E> блока не получает, поэтому их можно отличить друг от друга.

    Читать далее: Невидимые и двунаправленные символы показываются

  • Пробелы, которых не видно, помечаются

    Пробелы в конце строки отображаются как ·, неразрывный пробел — как ⍽, а табуляция — как »: эти метки не встречаются в коде, рисуются поверх текста и никогда не становятся его частью.

    Читать далее: Пробелы, которых не видно, помечаются

  • Записи извне помечаются

    Когда другой процесс перезаписывает открытый вами файл, sim отмечает изменения в тексте, на вкладке и в дереве файлов, а сохранение ничего не записывает, если файл изменился после того, как вы его прочитали.

    Читать далее: Записи извне помечаются

  • Изменения относительно git HEAD с первого взгляда

    Знаки на боковом поле, буква статуса у каждого файла в дереве и +n ~n -n в строке состояния: всё это берётся из git и выполняется в фоне.

    Читать далее: Изменения относительно git HEAD с первого взгляда

  • Собственная конфигурация репозитория не может заставить git запустить команду

    Собственная конфигурация репозитория не может заставить git запустить команду: монитор, хуки и фильтры отключаются, а там, где конфигурация всё же могла бы запустить команду (core.sshCommand, include), git не запускается. Рамка сообщает, что именно произошло, а строка состояния называет ключ и файл.

    Читать далее: Собственная конфигурация репозитория не может заставить git запустить команду

sim в терминале

sim показывает store.py после записи извне. Две изменённые строки на зелёном фоне, на верхней границе — зелёный значок 2 changes on disk, а вкладка показывает ↯.
Другой процесс перезаписал открытый файл. Изменённые строки отмечены, в рамке написано «2 changes on disk», вкладка показывает ↯, и в буфере ничего не потеряно.
Плавающее окно с заголовком Live grep поверх дерева файлов: найденные строки сгруппированы по файлам, ниже — предпросмотр с подсветкой синтаксиса.
Ctrl-f ищет по содержимому всех файлов по мере ввода и показывает предпросмотр выбранной строки.
sim показывает README.md: заголовки на полосах, блок кода в ограждении, таблицу, выровненную чертами, список задач и полосу цитаты; первая строка, где стоит курсор, показывает свой # как набрано.
README в режиме чтения: заголовки, таблица, выровненная по ширине отображения, список задач и цитата, нарисованные так, как они читаются. Строка с курсором — это текст самого файла.
sim в репозитории, конфигурация которого задаёт core.sshCommand. Верхняя граница рамки дерева несёт пурпурный значок 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. В репозитории со 100 000 файлов первый кадр рисуется до того, как прочитан список файлов: измерено от 1,8 до 8,7 мс.

Измерено проектом на AMD Ryzen 9 9950X (SPEED-1, SPEED-2 в его спецификации). На вашем компьютере результаты будут отличаться.

Против Vim, Neovim и Helix

Таблица с источниками: плагины, строки режима, настройки проекта, скрытые символы и записи извне. В ней сказано и о том, где другие редакторы пока лучше.

Читать сравнение

Дорожная карта

Запланировано, но не выпущено. Ничего из этого сегодня нельзя использовать.

  • Макросы

    Запланировано

  • Интеграция с буфером обмена

    Запланировано

  • Языковые серверы в песочнице

    Запланировано

  • Графический интерфейс с настоящей глубиной

    Запланировано

  • Другие способы установки

    Запланировано

Все запланированные возможности

Запустите Vim нового поколения

Установите через Homebrew или соберите из исходников. Пакеты для AUR и crates.io скоро появятся.