Пользовательские команды

Определяйте пользовательские команды и макеты рабочего пространства, добавив файл cmux.json в корень вашего проекта или ~/.config/cmux/. Команды отображаются в палитре команд.

Расположение файлов

cmux ищет конфигурацию в двух местах:

  • Для проекта: ./cmux.jsonнаходится в каталоге проекта, имеет приоритет
  • Глобально: ~/.config/cmux/cmux.jsonприменяется ко всем проектам, дополняет команды, не определённые локально
Локальные команды переопределяют глобальные команды с тем же именем.

Изменения применяются автоматически — перезапуск не требуется.

Схема

Файл cmux.json содержит массив commands. Каждая команда — это либо простая команда shell, либо полное определение рабочего пространства:

cmux.json
{
  "commands": [
    {
      "name": "Start Dev",
      "keywords": ["dev", "start"],
      "workspace": { ... }
    },
    {
      "name": "Run Tests",
      "command": "npm test",
      "confirm": true
    }
  ]
}

Простые команды

Простая команда выполняет команду shell в текущем сфокусированном терминале:

cmux.json
{
  "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 && для любой конкретной директории.

Команды рабочего пространства

Команда рабочего пространства создаёт новое рабочее пространство с настраиваемым макетом из разделений, терминалов и панелей браузера:

cmux.json
{
  "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Переменные среды в виде пар ключ-значение
  • urlURL для открытия (только браузер)
  • focusСфокусироваться на этой поверхности после создания

Определение рабочего каталога

  • . или опущенорабочий каталог рабочего пространства
  • ./subdirотносительно рабочего каталога рабочего пространства
  • ~/pathрасширено до домашнего каталога
  • Абсолютный путьиспользуется как есть

Полный пример

cmux.json
{
  "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
    }
  ]
}