Документация

Мануал Som

Все пользовательские возможности Som и все опции ~/.config/som/settings.json. Отражает реальное поведение кода на момент написания.

Где что лежит

Три отдельные директории, намеренно не смешиваются друг с другом — конфигурация, извлечённые бинарники и логи никогда не попадают в одно и то же место.

ПутьНазначение
~/.config/som/settings.jsonВаша конфигурация. Создаётся из платформо-специфичного шаблона при первом запуске. Отслеживается и перезагружается на лету — правки применяются мгновенно, при невалидном JSON показывается баннер с ошибкой прямо в приложении.
~/.config/som/themes/nord.jsonВстроенная тема «Nord», записывается на диск при первом запуске.
~/.config/som/db.jsonРаскладка табов/сплитов/сессий, перезаписывается при каждом изменении таба/сплита и при выходе. Руками редактировать не стоит; описан ниже для диагностики.
~/.local/share/som/ffmpeg/ (только Windows)Встроенные библиотеки декодирования FFmpeg, автоматически извлекаются при первом запуске для видеоплеера. Предоставлять их самостоятельно не нужно.
~/.local/share/som/conpty/ (только Windows)Собственный патченый ConPTY-бэкенд Som, автоматически извлекается при первом запуске.
~/.local/state/som/logs/Ежедневные лог-файлы. Первое место для проверки, если что-то работает не так, как ожидалось.

На macOS/Linux пути для извлечённых бинарников и логов следуют собственным XDG-подобным соглашениям платформы (~/Library/Application Support/Som и ~/Library/Logs/Som на macOS; $XDG_DATA_HOME/som и $XDG_STATE_HOME/som на Linux) — одинаковым везде остаётся только ~/.config/som (settings/db/темы).

somsrv (бинарник, который деплоится на удалённые хосты для SSH-сессий с "tmux": true) копируется из встроенной в Som копии сразу во временный файл на время одного деплоя — ничего постоянного на диске для него не остаётся.

Справочник settings.json

Все поля опциональны; всё, что вы не укажете, откатывается к дефолту для вашей платформы. Неизвестные ключи молча игнорируются (без ошибки), так что опечатка в имени ключа вас не предупредит — сверяйте написание с этой таблицей.

Два поведения зафиксированы и не настраиваются: звуковой сигнал терминала всегда отключён (нет настройки для системного звука), а копирование по выделению (автокопирование выделенного текста в буфер обмена) всегда включено.

window

КлючТипЭффект
window.themeстрокаИмя активной темы (например, "Nord Dark"). Применяется корректно.
window.mode"windowed" (умолч.) / "maximized" / "minimized" / "fullscreen"Начальное положение окна, применяется при каждом запуске (не только при первом). "windowed" запоминает позицию/размер в db.json — перемещение или изменение размера окна обновляет это автоматически. Если геометрия ещё не была запомнена, по умолчанию берётся размер экрана минус 100px по каждому измерению, с позицией 50px от левого верхнего угла. window.position/window.size (ниже) могут это переопределить.
window.position.{top,left} / window.size.{width,height}число, физические пикселиЯвные позиция/размер при старте, применяются только когда window.mode = "windowed". Срабатывают только если заданы одновременно position и size, и все четыре их поля ненулевые — если хоть одно отсутствует или равно 0, всё игнорируется целиком и используется запомненная в db.json геометрия. Не запоминаются/не обновляются впоследствии — перемещение или изменение размера окна всё равно обновляет только db.json, поэтому эти значения будут применять одну и ту же фиксированную геометрию при каждом следующем запуске, пока остаются заданы.
window.padding.{top,bottom,left,right}число, пикселиОтступ между краем окна ОС и областью терминала/сплитов с этой стороны. Заголовок окна и полоса табов всегда прижаты к краю окна независимо от этой настройки. 0 (по умолчанию) означает отсутствие отступа.
window.selectionhex-строка, например "#88c0d0"Цвет подсветки выделения в терминале (фон за текстом, выделенным мышью). Заодно перекрашивает несколько других акцентных элементов UI (например, подсветку совпадений поиска), поскольку использует общий цвет темы text.accent, а не отдельный терминальный.

log

КлючТипПо умолчаниюЭффект
log.levelстрока"all" ("trace" в Windows-шаблоне)Уровень фильтрации логов, читается один раз при старте.
log.daysчисло7Только Windows: сколько дней ротированных лог-файлов хранить.

font

КлючТипЭффект
font.faceстрокаСемейство шрифта терминала И интерфейсного буфера.
font.sizeчислоРазмер шрифта терминала (px).
font.weightцелое, 100-900Насыщенность шрифта терминала И интерфейсного буфера (400 = обычный, 700 = жирный). Значения вне диапазона обрезаются.
font.lineHeightчислоМножитель высоты строки терминала.
font.featuresобъектOpenType-фичи шрифта — см. «Лигатуры и фичи шрифта» ниже.

Лигатуры и фичи шрифта

font.features сопоставляет 4-символьный тег OpenType-фичи либо булеву значению (true/false, включить/выключить), либо целому числу (для фич с несколькими вариантами, например стилистических наборов):

"font": {
  "face": "FiraCode Nerd Font",
  "features": {
    "calt": true,
    "cv02": 1,
    "cv01": 7
  }
}

calt — стандартный OpenType-тег для контекстных альтернатив, именно его используют большинство шрифтов (включая FiraCode, Cascadia Code, JetBrains Mono) для отрисовки лигатур вроде ->, =>, !=, >=, && как единых слитных глифов. Лигатуры по умолчанию выключены — задайте "calt": true, чтобы включить их (сам шрифт должен поддерживать лигатуры; Som их не синтезирует). Невалидные теги (не ровно 4 буквенно-цифровых символа) или невалидные значения (что угодно, кроме булева или неотрицательного целого) логируются и пропускаются, не ломая остальные настройки.

cursor

КлючТипЭффект
cursor.shape"block" / "bar" / "underline" / "hollow"Форма курсора.
cursor.colorhex-строкаЦвет курсора.
cursor.blinking"on" / "off" / что угодно ещё"on"/"off" применяются буквально; любое другое значение означает «управляется терминалом» (мигание следует escape-последовательностям самого приложения в шелле).

scroll

КлючТипПо умолчаниюЭффект
scroll.scrollMultiplierчисло3.0Множитель скорости прокрутки колесом мыши.
scroll.maxScrollHistoryчисло10000Лимит строк scrollback (0 отключает прокрутку; внутренне ограничен 100 000).
scroll.alternateScroll"on" / "off""on"Отправлять ли колесо мыши как стрелки внутри alt-screen приложений (vim, less, htop).

tabs

Упорядоченный массив профилей табов. Голое действие NewTab (Ctrl+Shift+=/Cmd+Shift+= в поставляемых дефолтах) открывает профиль по умолчанию: тот, что помечен "default": true, либо tabs[0], если ни один не помечен. Записи 2-9 доступны через Ctrl+Shift+2..Ctrl+Shift+9 в Windows-шаблоне независимо от того, какой профиль дефолтный (шаблоны macOS/Linux сейчас подключают только профиль 1).

"tabs": [
  { "name": "shell", "icon": "", "shell": "$SHELL", "home": "~" },
  { "name": "server", "shell": "ssh myhost", "home": "~", "tmux": true, "default": true }
]
КлючТипПо умолчаниюЭффект
nameстрока""Заголовок таба и подпись в выпадающем списке профилей.
iconстроканетГлиф, показываемый на табе (лучше всего работает с Nerd Font — см. font.face).
shellстрокасистемный шеллКоманда для запуска. Поддерживает обычные шеллы, вызовы ssh <host> и wsl.
homeстроканетРабочая директория; ~ разворачивается. Должна указывать на существующую директорию, иначе игнорируется.
tmuxboolfalseВключить бэкенд somsrv для этого профиля — сохраняет сессию живой между перезапусками Som. См. somsrv.
defaultboolfalseПомечает этот профиль как тот, что открывает кнопка +/голое действие NewTab, вместо tabs[0]. Пометить так можно не более одного профиля — settings.json не парсится (откат к встроенным дефолтам с баннером «Invalid settings.json»), если помечено больше одного.

keys

Плоская карта сочетание-клавиш → имя действия. Пользовательские записи объединяются с платформенными дефолтами по ключу (нужно перечислить только те клавиши, которые хотите изменить или добавить; остальное сохраняет дефолт).

"keys": {
  "ctrl-shift-=": "NewTab",
  "ctrl-shift--": "CloseTab",
  "ctrl-shift-left": "PrevTab"
}

Распознаваемые имена действий: Copy, Paste, CloseTab, NewPane, ClosePane, NextPane, PrevPane, NextTab, PrevTab, Quit, IncreaseFont, DecreaseFont, ResetFont, NewTab, NewTab1..NewTab10. Любая другая строка молча игнорируется — привязка не создаётся, ошибка не показывается, так что сверяйте написание внимательно по этому списку.

NewTab1..NewTab10 открывают tabs[0]..tabs[9] по позиции — если в settings.json меньше профилей (например, NewTab9 при всего 5 записях в tabs[]), нажатие этой клавиши покажет уведомление «No profile #9…» вместо того, чтобы молча открыть другой профиль. С голым NewTab так случиться не может: он всегда резолвится в дефолтный профиль, который гарантированно существует.

Соглашение об именовании: специфичные для Som действия табов/панелей (NewTab*, CloseTab, NewPane, ClosePane, PrevPane/NextPane, PrevTab/NextTab) задуманы на сочетаниях Ctrl+Shift+* в поставляемых дефолтах, чтобы не конфликтовать с Copy/Paste/Quit/шрифтовыми сочетаниями, которые следуют стандартным системным конвенциям без Shift.

Синтаксис сочетаний следует конвенциям GPUI: строчные буквы, модификаторы через дефис, например ctrl-shift-c, cmd-v, alt-f4.

Горячие клавиши по умолчанию

Windows

Ctrl+Insert / Ctrl+Shift+CКопировать
Shift+Insert / Ctrl+VВставить
Ctrl+= / Ctrl+- / Ctrl+0Увеличить / уменьшить / сбросить размер шрифта (только на сессию)
Ctrl+ScrollМасштаб шрифта колесом мыши (только на сессию)
Ctrl+Shift+=Новый таб из профиля по умолчанию
Ctrl+Shift+1Ctrl+Shift+9 / Ctrl+Shift+0Новый таб из профиля 1-9 / профиля 10
Ctrl+Shift+-Закрыть активный таб
Ctrl+Shift+\Разделить активную панель (новый сплит)
Ctrl+Shift+BackspaceЗакрыть активную панель сплита
Ctrl+Shift+Up / Ctrl+Shift+DownФокус на предыдущую / следующую панель сплита
Ctrl+Shift+Left / Ctrl+Shift+RightАктивировать предыдущий / следующий таб
Alt+F4Выход

macOS

Cmd+CКопировать
Cmd+VВставить
Cmd+= / Cmd+- / Cmd+0Увеличить / уменьшить / сбросить размер шрифта (только на сессию)
Cmd+ScrollМасштаб шрифта колесом мыши (только на сессию)
Cmd+Shift+=Новый таб из профиля по умолчанию
Cmd+Shift+1Cmd+Shift+9 / Cmd+Shift+0Новый таб из профиля 1-9 / профиля 10
Cmd+Shift+-Закрыть активный таб
Cmd+Shift+\Разделить активную панель (новый сплит)
Cmd+Shift+BackspaceЗакрыть активную панель сплита
Cmd+Shift+Up / Cmd+Shift+DownФокус на предыдущую / следующую панель сплита
Cmd+Shift+Left / Cmd+Shift+RightАктивировать предыдущий / следующий таб
Cmd+QВыход

Linux

Ctrl+Insert / Ctrl+Shift+CКопировать
Shift+Insert / Ctrl+VВставить
Ctrl+= / Ctrl+- / Ctrl+0Увеличить / уменьшить / сбросить размер шрифта (только на сессию)
Ctrl+ScrollМасштаб шрифта колесом мыши (только на сессию)
Ctrl+Shift+=Новый таб из профиля по умолчанию
Ctrl+Shift+1Ctrl+Shift+9 / Ctrl+Shift+0Новый таб из профиля 1-9 / профиля 10
Ctrl+Shift+-Закрыть активный таб
Ctrl+Shift+\Разделить активную панель (новый сплит)
Ctrl+Shift+BackspaceЗакрыть активную панель сплита
Ctrl+Shift+Up / Ctrl+Shift+DownФокус на предыдущую / следующую панель сплита
Ctrl+Shift+Left / Ctrl+Shift+RightАктивировать предыдущий / следующий таб
Alt+F4Выход

Всегда активны, не настраиваются через settings.json

КлавишаКонтекстДействие
Up / Down / Tabлюбое открытое меню/списокПереместить выделение
Enterлюбое открытое меню/списокПодтвердить выбор
Escapeлюбое открытое меню/списокЗакрыть меню
Ctrl+= / Ctrl+-глобальноИзменение размера шрифта (только на сессию)

Табы

Сплиты

Сохранение сессии (db.json)

Som запоминает открытые табы, их раскладку сплитов, (для табов с tmux: true) ID их удалённых сессий и — когда window.mode = "windowed" — последнюю позицию и размер окна, всё в ~/.config/som/db.json. Перезапуск Som возвращает вас туда, где вы остановились, включая переподключение к всё ещё работающим удалённым шеллам вместо запуска новых.

Этот файл перезаписывается автоматически при каждом открытии/закрытии таба или сплита, переключении табов, изменении размера/перемещении окна или выходе — руками его трогать не нужно. Если он вдруг отсутствует или повреждён, Som просто откатывается к одному пустому табу (и позиции окна по умолчанию), а не отказывается запускаться.

Восстановление при запуске

При старте Som не ждёт медленных подключений, прежде чем показать окно:

somsrv: живучие удалённые сессии

Установка "tmux": true в профиле таба направляет терминал этого таба через небольшой сопутствующий процесс (somsrv) вместо обычного PTY:

У этой фичи нет отдельного переключателя в settings.json помимо "tmux": true на уровне профиля — глобального включения/выключения нет.

Картинки в терминале (Som Rich Protocol)

Som реализует собственный бинарный протокол для передачи насыщенного контента (пока изображения/GIF, аудио/markdown/видео зарезервированы на будущее) через PTY — утилита somcat, идущая вместе с Som, служит эталонным клиентом: somcat some.gif передаёт файл и показывает его прямо в терминале. Отдельного переключателя в settings.json для этого нет: функция всегда включена.

Темы

Som поставляется с одной встроенной темой, «Nord Dark» (дефолт window.theme), записываемой в ~/.config/som/themes/nord.json при первом запуске. Базовый движок тем поддерживает произвольные файлы тем с примерно 150 индивидуально адресуемыми цветами, но Som пока не предоставляет отдельного способа установки дополнительных тем, кроме ручного размещения совместимого JSON-файла темы в директории тем и указания её имени в window.theme.

Поскольку формат тем Som — тот же самый, что использует сам Zed, любой JSON-файл темы Zed работает как есть. Несколько популярных:

Чтобы установить: скачайте JSON-файл темы в ~/.config/som/themes/, затем укажите в settings.json в поле window.theme значение поля "name" из самого файла (откройте файл и проверьте — оно не всегда совпадает с именем файла, а некоторые файлы описывают сразу несколько именованных вариантов).