Что sim умеет сегодня
Что sim умеет сегодня, сгруппировано по назначению. Для каждой возможности указаны идентификаторы требований из спецификации проекта, которые её подтверждают. Запланированные возможности собраны только в разделе «Дорожная карта».
Отказывает там, где нужно, и бережёт ваш текст
Ничей текст не теряется без явного действия, а файлы не могут перенастроить редактор.
Никаких строк режима (modeline), файлов конфигурации и плагинов
Настройки и команды никогда не читаются из содержимого файла, поэтому файл не может перенастроить редактор. Нет файла конфигурации, который загружался бы из репозитория, нет API плагинов, а сам sim не открывает сетевых соединений. Запоминаются только ваш выбор оформления, значков и вида Markdown, по одному слову.
Спецификация: SAFE-9
Сохранение, которое не бывает наполовину записанным
При сохранении рядом с оригиналом создаётся временный файл (с режимом 0600 и O_EXCL), для него выполняется fsync, он переименовывается поверх оригинала, затем выполняется fsync каталога, поэтому вы видите либо старый файл, либо новый, но не смесь. Файл, принадлежащий другому пользователю, файл с жёсткими ссылками и файл в каталоге только для чтения сохраняются на месте после создания копии для восстановления. sim отказывается записывать через ссылку, принадлежащую другому пользователю. Если открыть файл и сохранить без правок, результат побайтово совпадает с исходным.
Спецификация: SAFE-1, SAFE-2, SAFE-3, SAFE-5
При сбое ничего не пропадает
Несохранённые изменения сохраняются снимками не чаще раза в секунду в приватный каталог состояния (0700). После сбоя,
kill -9или закрытия терминала при повторном открытии файла sim предлагает вернуть их одним шагом отмены. Теряется не больше секунды работы.Спецификация: SAFE-6
Поиск никогда не запускает то, чем управляет репозиторий
sim сам находит ripgrep среди абсолютных записей
PATHи запускает его с пустым окружением и--no-config, но никогда с--pre, поэтому репозиторий не может заставить поиск выполнить свой код. Поиск ничего не записывает и не переходит по символической ссылке за пределы проекта.Спецификация: GREP-7, GREP-8
Файлы, не являющиеся текстом, открываются только для чтения
Файл, который не является корректным UTF-8 или содержит NUL в первых 8 КБ, открывается только для чтения с указанием причины, а некорректные байты рисуются как U+FFFD. Правки и запись отклоняются, потому что текст на экране не был бы файлом.
Спецификация: SAFE-4
Сохранение при конфликте оставляет обе версии
Если при сохранении оказывается, что файл на диске изменился, ничего не теряется ни с одной стороны.
:w!оставляет вашу версию, предварительно скопировав чужую в каталог состояния, а:e!берёт чужую после снимка вашей.Спецификация:
--plain: никаких внешних процессовsim --plain— это одно лишь ядро: оформление calm, один файл, без панели, и sim сам не запускает никаких программ: ни git, ни ripgrep, ни фильтра, ни хука. Это режим по умолчанию от root и в роли редактора sudoedit, а строка состояния показываетplain.Спецификация:
Доступность и скорость
Минимум шагов от мысли «тот самый файл» до чтения.
Дерево файлов, которое никогда не прыгает
simоткрывается с деревом текущего каталога. Сначала идут каталоги, потом файлы, каждые по имени, всегда в одном и том же порядке, а раскрытые папки остаются раскрытыми так, как вы их оставили, поэтому файлы находятся по положению, а не чтением списка. Каталоги читаются в фоне: записи появляются по мере поступления и ничего выше себя не сдвигают.Спецификация: TREE-1, TREE-3, TREE-4, TREE-5
Поиск файлов и текста в плавающем окне
Ctrl-pищет файлы нечётким совпадением по пути и упорядочивает их по качеству совпадения и по вероятности, что вы откроете именно этот файл.Ctrl-fищет по содержимому всех файлов по мере ввода (через ripgrep, если он есть вPATH), результаты сгруппированы по файлам, а выбранная строка показывается в предпросмотре.Escвозвращает всё как было.Спецификация: FIND-2, FIND-4, GREP-1, GREP-5, PICK-1
Вероятные файлы помечены на своих местах
sim запоминает, какие файлы вы открываете, и ранжирует их по давности и частоте вместе. Пять самых вероятных помечены в дереве значком
•. Одна клавиша,., сужает дерево до файлов, которые изменены, открыты или были открыты недавно.Спецификация: MARK-2, MARK-3
Несколько файлов, и у каждого — полноценный редактор
У каждого открытого файла собственные отмена, снимки, слежение и сохранение. Панель вкладок показывает их, а жирный
●означает несохранённые изменения. ПереключаютTabиShift-Tab.Спецификация: BUF-1, BUF-2, UI-4
Достаточно быстро, чтобы не замечать
В бенчмарке проекта (релизная сборка, файл на 100 000 строк, панель открыта, подсветка включена) обработка клавиши занимает не более 1 мс на p99 на экранах от 80×24 до 240×60. В репозитории со 100 000 файлов первый кадр рисуется до того, как прочитан список файлов: измерено от 1,8 до 8,7 мс при требовании 20 мс. Всё медленное (обход дерева, запросы к git, разбор для подсветки) выполняется в фоновом потоке.
Спецификация: SPEED-1, SPEED-2
Один исполняемый файл: sim
Отдельный исполняемый файл
siвлился вsim: одна команда для установки и одна для запуска. Ядро — библиотекаsim-editor-core, на которой построенsim.sim --versionиsim --helpвыводят результат и завершаются, не трогая терминал.Спецификация:
Выбор вкладки по букве
<Space>bpставит букву на каждую вкладку, и нажатие буквы переходит к файлу этой вкладки.<Space>bcделает то же, чтобы закрыть вкладку, и никогда не закрывает изменённый файл. Подсказка называетTabиShift-Tabпри первом открытии второго файла и показывается, пока вы не воспользуетесь ими три раза.Спецификация:
Дерево изменений относительно git HEAD
<Space>geпоказывает дерево только с файлами, которые отличаются отHEAD: проиндексированными, непроиндексированными и неотслеживаемыми, у каждого — буква статуса и+n −n, у каждой папки — суммы. Enter открывает версию файла изHEADтолько для чтения.Спецификация: GIT-1, GIT-2, GIT-3, GIT-4, DIFF-1, DIFF-3, DIFF-4
Удобство чтения
Цвета и вёрстка вычисляются, а не подбираются на глаз.
Цвета синтаксиса из вашей собственной палитры
Цвета берутся из палитры вашего терминала (читается через OSC 4). Оттенок они сохраняют, но по светлоте смещаются, пока текст не достигнет |Lc| 75 относительно фона. Ключевые слова красные, строки и числа зелёные, типы жёлтые, функции бирюзовые, комментарии серые курсивом; синий и пурпурный в коде не используются никогда. Язык определяется по имени файла, расширению или первой строке с помощью набора синтаксисов bat.
zhотключает цвета.Спецификация: SYN-1, SYN-2, SYN-4
Режим чтения Markdown
В файле Markdown каждая строка, кроме строки с курсором, рисуется так, как читается: знаки выделения и кода не рисуются, таблицы выравниваются по ширине отображения, а врезки (
> [!NOTE]) показывают слово своего вида. Скрываются только эти знаки, никогда не#, не скобка, не URL и не символ текста, а<Space>umпоказывает исходный текст.Спецификация: UI-8, MD-1, MD-10, MD-11
Три оформления
Calm — простое: четыре стиля и один цветной фон. Flat показывает дифф зелёным и красным, с подкрашенными строками. Depth, по умолчанию, добавляет рамки, линейку обзора и туман, который тускнит текст по мере удаления от курсора.
zlпереключает их по кругу. Calm — оформление для тех, кто не различает красный и зелёный.Спецификация: LOOK-1, LOOK-2, LOOK-3
Читаемость, подтверждённая измерением
Основной текст — |Lc| 90, второстепенный — |Lc| 60 (APCA), и считаются они от фона вашего терминала. В calm единственный цвет изменений остаётся различимым при протан-, дейтан- и тритан-типах цветового зрения. Один оттенок во всём интерфейсе означает одно: серый — структуру, синий — место, где вы действуете, зелёный, янтарный и красный — изменение, пурпурный — только скрытое или опасное.
Спецификация: VIS-4, VIS-5, COLOR-1, UI-12
Редактор, в котором можно жить
Значки в дереве файлов (нужен Nerd Font;
ziих отключает), панель вкладок, строка пути как заголовок редактора (src › sim.rs › leader_key), строка состояния с режимом, веткой, изменениями относительно HEAD и позицией (кодировку и тип перевода строки она называет, только если это не UTF-8 или LF), относительные номера строк, направляющие отступов, полоса прокрутки с метками и вспышка на только что скопированном.Спецификация: UI-2, UI-5, UI-6, UI-10, UI-11
Японский и другой CJK-текст
Широкие символы занимают две колонки, проза переносится по японским правилам кинсоку, перемещения по словам разделяют CJK-текст там, где меняется система письма, а при включённом IME клавиши полной ширины работают как команды.
Спецификация: VIS-7, VI-10
Работает без цвета и никогда не полагается только на цвет
NO_COLORи терминалы менее чем с 8 цветами рисуют только жирностью, подчёркиванием и инверсией, а sim не запрашивает у терминала никаких цветов. Смысл никогда не зависит только от цвета: изменённая строка — это┆на боковом поле, у папок видна буква самого сильного статуса git, а вкладка показывает↯для файла, изменённого на диске. При выключенных значках глиф из области частного использования не рисуется.Спецификация:
Значки по умолчанию включены там, где вероятен Nerd Font
Для значков нужен Nerd Font, а терминал не может сообщить, есть ли он. В Ghostty, kitty и WezTerm они включены с самого начала, в остальных выключены, и в строке состояния один раз появляется подсказка:
zi: icons (needs a Nerd Font). Последний выбор, сделанный черезzi, всегда главнее.Спецификация:
Скопированное подсвечивается в любом оформлении
То, что вы только что скопировали командой yank, подсвечивается на 150 ms. Calm, простое оформление, теперь тоже подсвечивает: серым цветом выделения или подчёркиванием там, где выделения нет. Строка, которую другой процесс только что записал в открытый файл, подсвечивается на 400 ms.
Спецификация: UI-13, UI-19
Клавиши
Грамматика vi — без его странностей.
Клавиши vi, которые помнят руки
Перемещения, операторы, текстовые объекты, счётчики,
., визуальный режим, поиск со smartcase,:sи диапазоны — без странностей vi:Yкопирует до конца строки,Uповторяет отменённое,Ctrl-sсохраняет, аqвыходит. Стрелки, Home, End и Delete работают везде.Спецификация: VI-1, VI-2, VI-3, VI-4, VI-5, VI-6, VI-7
Скопированное попадает в системный буфер обмена
Всё скопированное (yank) без имени регистра также уходит в системный буфер обмена через OSC 52, в том числе внутри tmux. Удаление и замена заполняют только регистр, поэтому
xиddникогда не затирают то, что вы скопировали.Спецификация: VI-8
Мышь без сюрпризов
Щелчок открывает файл или ставит курсор, колесо прокручивает, перетаскивание выделяет. Мышь сама никогда ничего не правит, не сохраняет и не создаёт снимков.
Спецификация: PTR-1, PTR-2
Space — клавиша-лидер, с окном which-key
Пауза на префиксе (
Space,g,z,Z,[,]или оператор вродеd) открывает небольшое окно, в котором перечислены клавиши, которые могут идти дальше. Если продолжать набирать клавиши, всё работает точно так же, как без окна.Спецификация:
:helpи F1: список всех клавиш с поиском:helpиF1открывают список всех клавиш и команд с поиском и с предпросмотром того, что делает каждая из них.:help tabнаходитTab,Shift-Tabи<Space>bp. Этот список — единая таблица клавиш продукта, поэтому он не может разойтись с клавишами.Спецификация:
Поиск показывает, где вы находитесь
Пока совпадения поиска подсвечены, строка состояния показывает, на каком из них стоит курсор и сколько их всего:
[3/12].Спецификация:
Регистры Vim
"a—"zхранят текст,"A—"Zдописывают в него;"0— последний yank,"1—"9— последние удаления, а"_принимает что угодно и ничего не хранит.:registersперечисляет их. Они живут только в памяти, и все открытые файлы пользуются ими вместе. Yank без имени по-прежнему попадает в системный буфер обмена через OSC 52; удаление — нет.Спецификация: VI-15
Метки
ma—mzставят метку в файле;'aпереходит на её строку, а клавиша с обратным апострофом — на её точное место, в том числе вместе с оператором (d'a).''возвращает туда, где был курсор до последнего перехода. Метка следует за своим текстом при правках, отмене и изменениях извне, а:marksперечисляет их. Метки живут только в памяти.Спецификация: VI-17
:tutorОколо пятнадцати минут коротких уроков в черновом буфере, на языке вашей локали (English, 日本語, 简体中文, 繁體中文, 한국어, Español, Português, Français, Deutsch или Русский; для любой другой — English). Упражнения сами отмечаются знаками ✗ и ✓, пока вы печатаете.
Спецификация: TUTOR-1, TUTOR-2, TUTOR-3, TUTOR-4
Дорожная карта
Запланировано, но не выпущено. Ничего из этого списка пока нельзя использовать, а порядок не является обещанием.
Макросы
Запланировано
Запись и воспроизведение нажатий клавиш. Сегодня в sim их нет.
Интеграция с буфером обмена
Запланировано
Больше, чем сегодняшнее копирование через OSC 52.
Языковые серверы в песочнице
Запланировано
Клиент языкового сервера, чей сервер работает в песочнице, и индикатор в строке состояния: доверен ли корень проекта.
Графический интерфейс с настоящей глубиной
Запланировано
Графический интерфейс с настоящими тенями и возвышением (elevation). Он начат как прототип; устанавливать пока нечего.
Другие способы установки
Запланировано
Пакеты для AUR и crates.io скоро появятся.