Пользовательские команды
Определяйте пользовательские команды и макеты рабочего пространства, добавив файл cmux.json в корень вашего проекта или ~/.config/cmux/. Команды отображаются в палитре команд.
Расположение файлов
cmux ищет конфигурацию в двух местах:
- Для проекта:
./cmux.json— находится в каталоге проекта, имеет приоритет - Глобально:
~/.config/cmux/cmux.json— применяется ко всем проектам, дополняет команды, не определённые локально
Изменения применяются автоматически — перезапуск не требуется.
Схема
Файл cmux.json содержит массив commands. Каждая команда — это либо простая команда shell, либо полное определение рабочего пространства:
{
"commands": [
{
"name": "Start Dev",
"keywords": ["dev", "start"],
"workspace": { ... }
},
{
"name": "Run Tests",
"command": "npm test",
"confirm": true
}
]
}Простые команды
Простая команда выполняет команду shell в текущем сфокусированном терминале:
{
"commands": [
{
"name": "Run Tests",
"keywords": ["test", "check"],
"command": "npm test",
"confirm": true
}
]
}Поля
name— Отображается в палитре команд (обязательно)description— Необязательное описаниеkeywords— Дополнительные поисковые термины для палитры командcommand— Команда shell для выполнения в сфокусированном терминалеconfirm— Показать диалог подтверждения перед выполнением
Простые команды выполняются в текущей рабочей директории активного терминала. Если команда использует пути относительно проекта, добавьте префикс cd "$(git rev-parse --show-toplevel)" && для запуска из корня репозитория, или cd /your/path && для любой конкретной директории.
Команды рабочего пространства
Команда рабочего пространства создаёт новое рабочее пространство с настраиваемым макетом из разделений, терминалов и панелей браузера:
{
"commands": [
{
"name": "Dev Environment",
"keywords": ["dev", "fullstack"],
"restart": "confirm",
"workspace": {
"name": "Dev",
"cwd": ".",
"layout": {
"direction": "horizontal",
"split": 0.5,
"children": [
{
"pane": {
"surfaces": [
{
"type": "terminal",
"name": "Frontend",
"command": "npm run dev",
"focus": true
}
]
}
},
{
"pane": {
"surfaces": [
{
"type": "terminal",
"name": "Backend",
"command": "cargo watch -x run",
"cwd": "./server",
"env": { "RUST_LOG": "debug" }
}
]
}
}
]
}
}
}
]
}Поля рабочего пространства
name— Имя вкладки рабочего пространства (по умолчанию — имя команды)cwd— Рабочий каталог для рабочего пространстваcolor— Цвет вкладки рабочего пространстваlayout— Дерево макета, определяющее разделения и панели
Поведение при перезапуске
Управляет тем, что происходит, когда рабочее пространство с тем же именем уже существует:
"ignore"— Переключиться на существующее рабочее пространство (по умолчанию)"recreate"— Закрыть и пересоздать без запроса"confirm"— Спросить пользователя перед пересозданием
Дерево макета
Дерево макета определяет расположение панелей с помощью рекурсивных узлов разделения:
Узел разделения
Делит пространство на двух потомков:
direction—"horizontal"или"vertical"split— Положение разделителя от 0.1 до 0.9 (по умолчанию 0.5)children— Ровно два дочерних узла (разделение или панель)
Узел панели
Листовой узел, содержащий одну или несколько поверхностей (вкладки внутри панели).
Определение поверхности
Каждая поверхность в панели может быть терминалом или браузером:
type—"terminal"или"browser"name— Пользовательский заголовок вкладкиcommand— Команда shell для автоматического запуска при создании (только терминал)cwd— Рабочий каталог для этой поверхностиenv— Переменные среды в виде пар ключ-значениеurl— URL для открытия (только браузер)focus— Сфокусироваться на этой поверхности после создания
Определение рабочего каталога
.или опущено — рабочий каталог рабочего пространства./subdir— относительно рабочего каталога рабочего пространства~/path— расширено до домашнего каталога- Абсолютный путь — используется как есть
Полный пример
{
"commands": [
{
"name": "Web Dev",
"description": "Docs site with live preview",
"keywords": ["web", "docs", "next", "frontend"],
"restart": "confirm",
"workspace": {
"name": "Web Dev",
"cwd": "./web",
"color": "#3b82f6",
"layout": {
"direction": "horizontal",
"split": 0.5,
"children": [
{
"pane": {
"surfaces": [
{
"type": "terminal",
"name": "Next.js",
"command": "npm run dev",
"focus": true
}
]
}
},
{
"direction": "vertical",
"split": 0.6,
"children": [
{
"pane": {
"surfaces": [
{
"type": "browser",
"name": "Preview",
"url": "http://localhost:3777"
}
]
}
},
{
"pane": {
"surfaces": [
{
"type": "terminal",
"name": "Shell",
"env": { "NODE_ENV": "development" }
}
]
}
}
]
}
]
}
}
},
{
"name": "Debug Log",
"description": "Tail the debug event log from the running dev app",
"keywords": ["log", "debug", "tail", "events"],
"restart": "ignore",
"workspace": {
"name": "Debug Log",
"layout": {
"direction": "horizontal",
"split": 0.5,
"children": [
{
"pane": {
"surfaces": [
{
"type": "terminal",
"name": "Events",
"command": "tail -f /tmp/cmux-debug.log",
"focus": true
}
]
}
},
{
"pane": {
"surfaces": [
{
"type": "terminal",
"name": "Shell"
}
]
}
}
]
}
}
},
{
"name": "Setup",
"description": "Initialize submodules and build dependencies",
"keywords": ["setup", "init", "install"],
"command": "./scripts/setup.sh",
"confirm": true
},
{
"name": "Reload",
"description": "Build and launch the debug app tagged to the current branch",
"keywords": ["reload", "build", "run", "launch"],
"command": "./scripts/reload.sh --tag $(git branch --show-current)"
},
{
"name": "Run Unit Tests",
"keywords": ["test", "unit"],
"command": "./scripts/test-unit.sh",
"confirm": true
}
]
}