Brugerdefinerede kommandoer
Definer brugerdefinerede kommandoer og workspace-layouts ved at tilføje en cmux.json-fil til din projektrod eller ~/.config/cmux/. Kommandoer vises i kommandopaletten.
Filplaceringer
cmux leder efter konfiguration to steder:
- Per projekt:
./.cmux/cmux.json- befinder sig i din projektmappe, har forrang - Lokal fallback:
./cmux.json- understøttes stadig for eksisterende repos - Global konfiguration:
~/.config/cmux/cmux.json- gælder for alle projekter, udfylder kommandoer, der ikke er defineret lokalt
actions, shortcut eller ui.surfaceTabBar.buttons.Rediger cmux.json, og tryk derefter Cmd+Shift+, eller kør cmux reload-config for at anvende ændringer.
Skema
commands definerer stadig genbrugelige shellkommandoer og workspace-layouts. Nightly-builds tilføjer et actions-register. Handlinger er de offentlige ID’er, som deles af surface-fanelinjen, Command Palette og handlingsgenveje.
{
"actions": {
"cmux.newTerminal": {
"type": "command",
"title": "Codex",
"subtitle": "Open Codex in a new terminal tab",
"command": "codex --dangerously-bypass-approvals-and-sandbox",
"target": "newTabInCurrentPane",
"shortcut": "cmd+t",
"icon": { "type": "image", "path": "./icons/codex.svg" }
},
"claude": {
"type": "command",
"title": "Claude Code",
"command": "claude --dangerously-skip-permissions",
"target": "newTabInCurrentPane",
"shortcut": "cmd+shift+c",
"icon": { "type": "image", "path": "./icons/claude.svg" }
},
"opencode": {
"type": "command",
"title": "OpenCode",
"command": "opencode",
"target": "newTabInCurrentPane",
"palette": false,
"icon": { "type": "emoji", "value": "🧪", "scale": 0.9 }
},
"web-dev": {
"type": "workspaceCommand",
"title": "Web Dev",
"commandName": "Web Dev"
}
},
"ui": {
"surfaceTabBar": {
"buttons": [
"cmux.newTerminal",
"cmux.newBrowser",
"cmux.splitRight",
"cmux.splitDown",
"claude"
]
}
},
"commands": [
{
"name": "Web Dev",
"keywords": ["dev", "start"],
"workspace": { ... }
}
]
}Nightly-handlingsregister
actions knytter stabile ID’er til kørbar adfærd. Brug de indbyggede ID’er cmux.newTerminal, cmux.newBrowser, cmux.splitRight og cmux.splitDown til at tilsidesætte standarderne. Brug dine egne ID’er til projektspecifikke værktøjer.
palette er som standard true. Sæt den til false for at skjule en handling fra Command Palette, mens den stadig er tilgængelig for surface-fanelinjen eller en genvej. shortcut bruger samme syntaks som indstillingsgenveje, for eksempel cmd+shift+c eller ["cmd+k", "cmd+c"].
ui.surfaceTabBar.buttons erstatter standardknaplisten, når den findes. Udelad et indbygget ID for at skjule det. Ikoner bruger altid objektformen: { "type": "symbol", "name": "play.circle" }, { "type": "emoji", "value": "🧪", "scale": 0.9 } eller { "type": "image", "path": "./icons/codex.svg" }. Billedstier er relative til konfigurationsfilen. Emoji scale er valgfri og er som standard 1. SVG, PDF, PNG, JPEG, GIF, TIFF, BMP, HEIC, HEIF, WebP, AVIF, ICO og ICNS understøttes.
Hver knapindgang kan enten være en handlings-ID-streng eller et knapobjekt. Brug et knapobjekt, når du vil bruge den samme handling med en anden surface-label, et andet ikon eller tooltip. Den løste knaptitel bruges også som titel i tillidsprompten.
Sæt approval- eller permission-flags direkte i den kommandostreng, du faktisk vil køre. Standardmålet for handlinger er newTabInCurrentPane, så det almindelige mønster er at åbne en ny terminalfane i den aktuelle rude og starte Codex, Claude Code eller OpenCode dér.
Brugerdefinerede handlinger og Command Palette
En actions-post er den genbrugelige ting, som cmux kører. Brug handlinger, når den samme adfærd skal være tilgængelig fra Command Palette, overfladens fanelinje, genveje eller plusknappens menu. Behold commands til genbrugelige shell-kommandoer og arbejdsområdelayouts. Sæt palette til false, når en handling ikke skal vises i Command Palette.
Handlingstyper
"builtin": Opret et alias til en indbygget cmux-handling som cmux.newTerminal, cmux.newBrowser, cmux.splitRight eller cmux.splitDown."command": Kør shelltekst i en terminal. Brug target til at vælge den aktuelle terminal eller en ny fane i den aktuelle rude."agent": Start en understøttet kodeagent. I dag understøttes codex og claude med valgfrie argumenter."workspaceCommand": Kør en navngiven arbejdsområdedefinition fra commands. Brug dette til layouts med flere ruder, brugerdefinerede arbejdsmapper og startkommandoer.
Handlingsfelter
title: Titel i Command Palette, etiket på overfladeknap, menupunkttitel og titel i tillidsdialogen, medmindre en post tilsidesætter den.subtitle/description: Sekundær tekst i Command Palette. description accepteres som alias for subtitle.keywords: Ekstra søgeord til Command Palette.palette: Standard er true for brugerdefinerede handlinger. Sæt false for at skjule handlingen fra Command Palette, mens den stadig kan kaldes andre steder.shortcut: Valgfri handlingsgenvej med samme syntaks for enkelttryk eller tostegsakkorder som indstillingsgenveje.target: Kun for command- og agent-handlinger. Brug currentTerminal eller newTabInCurrentPane.confirm: Spørg før handlingen køres.
Command Palette-adfærd
Command Palette læser det opløste handlingsregister. Brugerdefinerede handlings-id’er tilføjes som rækker, når palette ikke er false. Ældre commands tilføjes automatisk som brugerdefinerede rækker, medmindre en handling med samme genererede id allerede findes. Indbyggede kommandoer beholder deres normale paletnavne, men tilsidesættelse af et indbygget id som cmux.newTerminal ændrer adfærden bag det fælles indgangspunkt.
Tilpassede handlinger for plusknappen
Brug ui.newWorkspace.action til at tilsidesætte, hvad plusknappen gør. Brug ui.newWorkspace.contextMenu (eller aliaset rightClick) til at definere den ordnede højreklikmenu. Menupunkter kan være handlings-ID’er, handlingsobjekter eller { "type": "separator" }.
{
"actions": {
"worktree-agents": {
"type": "workspaceCommand",
"title": "Worktree Agents",
"commandName": "Worktree Agents",
"icon": { "type": "symbol", "name": "folder.badge.plus" }
}
},
"ui": {
"newWorkspace": {
"action": "worktree-agents",
"contextMenu": [
{ "action": "worktree-agents", "title": "Worktree Agents" },
{ "type": "separator" },
{ "action": "cmux.newTerminal", "title": "New Terminal" },
{ "action": "cmux.newBrowser", "title": "New Browser" }
]
}
},
"commands": [
{
"name": "Worktree Agents",
"description": "Create a fresh Git worktree and start Codex and Claude inside it",
"workspace": {
"name": "Worktree Agents",
"cwd": ".",
"layout": {
"direction": "horizontal",
"split": 0.38,
"children": [
{
"pane": {
"surfaces": [
{
"type": "terminal",
"name": "Worktree",
"command": "set -euo pipefail; state=\"${TMPDIR:-/tmp}/cmux-worktree-${CMUX_WORKSPACE_ID:-manual}.dir\"; rm -f \"$state\"; repo=$(git rev-parse --show-toplevel); mkdir -p \"$repo/../worktrees\"; slug=agents-$(date +%Y%m%d-%H%M%S); dir=\"$repo/../worktrees/$slug\"; git -C \"$repo\" worktree add -b \"$slug\" \"$dir\"; printf \"%s\\n\" \"$dir\" > \"$state\"; cd \"$dir\"; exec \"${SHELL:-/bin/zsh}\" -l",
"focus": true
}
]
}
},
{
"direction": "vertical",
"split": 0.5,
"children": [
{
"pane": {
"surfaces": [
{
"type": "terminal",
"name": "Codex",
"command": "state=\"${TMPDIR:-/tmp}/cmux-worktree-${CMUX_WORKSPACE_ID:-manual}.dir\"; echo \"Waiting for worktree...\"; while [ ! -s \"$state\" ]; do sleep 0.2; done; dir=$(cat \"$state\"); cd \"$dir\"; exec codex --dangerously-bypass-approvals-and-sandbox"
}
]
}
},
{
"pane": {
"surfaces": [
{
"type": "terminal",
"name": "Claude",
"command": "state=\"${TMPDIR:-/tmp}/cmux-worktree-${CMUX_WORKSPACE_ID:-manual}.dir\"; echo \"Waiting for worktree...\"; while [ ! -s \"$state\" ]; do sleep 0.2; done; dir=$(cat \"$state\"); cd \"$dir\"; exec claude --dangerously-skip-permissions"
}
]
}
}
]
}
]
}
}
}
]
}Dette eksempel får et almindeligt plusklik til at køre handlingen worktree-agents. Arbejdsområdekommandoen fra commands bruger en synlig opsætningsterminal til først at oprette Git-worktree. Codex og Claude starter samtidig, venter på den arbejdsområdespecifikke tilstandsfil og skifter derefter til den oprettede mappe før exec.
Simple kommandoer
En simpel kommando kører en shell-kommando i den aktuelt fokuserede terminal:
{
"commands": [
{
"name": "Run Tests",
"keywords": ["test", "check"],
"command": "npm test",
"confirm": true
}
]
}Felter
name: Vises i kommandopaletten (påkrævet)description: Valgfri beskrivelsekeywords: Ekstra søgetermer til kommandopalettencommand: Shell-kommando der skal køres i den fokuserede terminalconfirm: Vis en bekræftelsesdialog før kørsel
Simple kommandoer køres i den fokuserede terminals aktuelle arbejdsmappe. Hvis din kommando afhænger af projektrelative stier, sæt foran med cd "$(git rev-parse --show-toplevel)" && for at køre fra repo-roden, eller cd /your/path && for enhver specifik mappe.
Workspace-kommandoer
En workspace-kommando opretter et nyt workspace med et brugerdefineret layout af opdelte terminaler og browserpaneler:
{
"commands": [
{
"name": "Dev Environment",
"keywords": ["dev", "fullstack"],
"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" }
}
]
}
}
]
}
}
}
]
}Workspace-felter
name: Workspace-fanenavn (standard er kommandoens navn)cwd: Arbejdsmappe for workspacetcolor: Farve på workspace-fanenlayout: Layouttræ der definerer opdelinger og paneler
Genstartsadfærd
Styrer hvad der sker, når der allerede eksisterer et workspace med samme navn:
"new": Opret et nyt workspace (standard)"ignore": Skift til det eksisterende workspace"recreate": Luk og genskab uden at spørge"confirm": Spørg brugeren inden genskabelse
Layouttræ
Layouttræet definerer, hvordan paneler arrangeres ved hjælp af rekursive opdelingsknuder:
Opdelingsknude
Deler plads i to børn:
direction:"horizontal"eller"vertical"split: Delergitterposition fra 0.1 til 0.9 (standard 0.5)children: Præcis to underknuder (opdeling eller panel)
Panelknude
En bladknude der indeholder én eller flere overflader (faner inden i panelet).
Overfladedefinition
Hver overflade i et panel kan være en terminal eller en browser:
type:"terminal"eller"browser"name: Brugerdefineret fanetitelcommand: Shell-kommando der automatisk køres ved oprettelse (kun terminal)cwd: Arbejdsmappe for denne overfladeenv: Miljøvariabler som nøgle-værdi-parurl: URL der skal åbnes (kun browser)focus: Fokuser på denne overflade efter oprettelse
Opløsning af arbejdsmappe
.eller udeladt: workspace-arbejdsmappe./subdir: relativ til workspace-arbejdsmappe~/path: udvidet til hjemmemappen- Absolut sti: bruges som den er
Fuldt eksempel
{
"actions": {
"web-dev": { "type": "workspaceCommand", "commandName": "Web Dev" },
"cmux.newTerminal": {
"type": "command",
"title": "Codex",
"command": "codex --dangerously-bypass-approvals-and-sandbox",
"target": "newTabInCurrentPane",
"shortcut": "cmd+t",
"icon": { "type": "image", "path": "./icons/codex.svg" }
},
"claude": {
"type": "command",
"title": "Claude Code",
"command": "claude --dangerously-skip-permissions",
"target": "newTabInCurrentPane",
"shortcut": "cmd+shift+c",
"icon": { "type": "image", "path": "./icons/claude.svg" }
},
"start-dev": {
"type": "command",
"command": "npm run dev",
"target": "newTabInCurrentPane",
"icon": { "type": "symbol", "name": "play.circle" }
}
},
"ui": {
"surfaceTabBar": {
"buttons": [
"cmux.newTerminal",
"cmux.newBrowser",
"cmux.splitRight",
"cmux.splitDown",
{
"action": "claude",
"title": "Claude Here"
},
"start-dev"
]
}
},
"commands": [
{
"name": "Web Dev",
"description": "Docs site with live preview",
"keywords": ["web", "docs", "next", "frontend"],
"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"],
"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
}
]
}