Output Styles, Status Line & More
|
This content was generated with the assistance of AI and should be verified against the official documentation of each tool and framework before being relied on in production. This section’s bibliography lists the reference material consulted while preparing these pages. |
This page is written against the Claude Code CLI 2.1.283, VS Code 1.139 with the GitHub Copilot Chat extension, and the GitHub Copilot CLI 1.0.88, all re-verified as current as of 2026-09-28; re-check the linked docs before relying on an exact field name, since these surfaces change often. The four surfaces below are, in varying degrees, specific to the Claude Code CLI: output styles and the status line have no direct Copilot equivalent, keybindings are a general editor/CLI mechanism both tools happen to offer in their own way, and environment variables exist in every one of these tools but under different, tool-specific names. Each section says plainly where Copilot has nothing comparable.
Output styles
An output style is a set of instructions that sets Claude’s role, tone and response format for an entire
session, so a preference doesn’t have to be repeated in every prompt. Claude Code ships five styles — default plus four built-ins — verified against
Claude Code — Output styles:
| Style | What changes | Use it when |
|---|---|---|
Default |
No style instructions added; Claude follows Claude Code’s standard software-engineering system prompt. |
No style has been selected. |
Proactive |
Claude starts implementing right away and makes reasonable assumptions about routine decisions instead of asking, while still checking in before anything that deletes data or touches a shared/production system. |
You want fewer routine questions and will redirect Claude if an assumption is wrong. |
Concise |
Responses lead with the result; preamble, step-by-step narration and closing recaps are dropped. Error reports, failing tests, security warnings and destructive-action confirmations still print in full. |
Default responses run longer than you want. Requires Claude Code v2.1.237 or later. |
Explanatory |
Claude adds short |
You’re getting to know a codebase and want the "why" alongside the "what". |
Learning |
Same |
You want hands-on practice while the task still gets done. |
Switching styles never changes the active permission mode — Proactive still asks for anything the permission mode itself requires.
Selecting a style
/output-style <style> switches style starting with your next message and saves the choice to
.claude/settings.local.json, so it persists for the project (the command ignores case); /output-style with no
argument lists the choices and marks the current one. /config → Output style does the same from a menu. The
same choice can be set directly in a settings file, where the value is case-sensitive — write the built-in
names as Proactive, Concise, Explanatory and Learning, since a value that matches no style, such as
explanatory, falls back to Default:
.claude/settings.local.json{
"outputStyle": "Explanatory"
}
Setting outputStyle in ~/.claude/settings.json makes it the default across projects; a project’s own
settings file still takes precedence, per the settings precedence
Permissions
& Settings covers. See Claude Code — Output styles.
Custom output styles
A custom style is a Markdown file: YAML frontmatter, then free-form instructions for Claude. It is saved as
~/.claude/output-styles/<name>.md (user scope), .claude/output-styles/<name>.md (project scope), or under a
managed-settings directory; a plugin can also ship one under its own output-styles/ directory. The file name
becomes the style’s name unless name is set in frontmatter. Claude Code reads style files at startup, so
restart it after creating or editing one.
| Key | Type | Required | What it does |
|---|---|---|---|
|
string |
No |
Display name in the |
|
string |
No |
Description shown in the |
|
boolean |
No |
When |
|
boolean |
No |
Plugin output styles only: applies the style automatically whenever the plugin is enabled, overriding the
user’s own |
.claude/output-styles/diagrams-first.md---
name: Diagrams first
description: Lead every explanation with a diagram
keep-coding-instructions: true
---
When explaining code, architecture, or data flow, start with a Mermaid diagram showing the structure, then
explain in prose.
## Diagram conventions
Use `flowchart TD` for control flow and `sequenceDiagram` for request paths. Keep diagrams under 15 nodes.
GitHub Copilot’s and VS Code’s customization docs describe no equivalent surface — no session-wide, swappable
"role and tone" instruction file that replaces the built-in system prompt the way outputStyle does, as of
2026-09-28. The closest available lever
is a custom agent's own system-prompt body,
which shapes one agent’s behavior rather than the whole session’s.
The status line
The status line is a customizable bar Claude Code renders in its own row above the built-in footer badges,
driven by a shell script that
receives session data as JSON on stdin and prints whatever the script wants displayed. It is configured with a
statusLine object in a settings file, verified against
Claude Code — Customize your status line:
~/.claude/settings.json{
"statusLine": {
"type": "command",
"command": "~/.claude/statusline.sh",
"padding": 2
}
}
type is currently always "command". command is a shell command or script path, run in a shell, so an
inline one-liner works too (e.g. piped through jq). padding is an optional integer, defaulting to 0, that
adds extra horizontal spacing in characters on top of the interface’s own indentation. An optional
refreshInterval (in seconds, minimum 1) also re-runs the command on a timer, for time-based data such as a
clock. Running /statusline
(optionally describing what to show) generates and wires up a script for you; /statusline delete (or clear,
or remove it) removes the configuration again.
The script’s input contract
Claude Code runs the command when a session starts or resumes, then again when a new assistant message arrives,
/compact finishes, the permission mode or vim mode changes, the command itself changes, or a
refreshInterval timer elapses — debounced at 300 ms, so a burst of changes runs the script once. Each run
feeds it a JSON object on stdin. The commonly used fields, verified against the same page:
| Field | What it holds |
|---|---|
|
The current model’s identifier and display name. |
|
The current working directory (same value in both; |
|
The directory Claude Code was launched from, which can differ from |
|
Estimated session cost in USD, computed client-side; resets to 0 on |
|
Total session wall-clock time, and time spent waiting on API responses, in milliseconds. |
|
The model’s maximum context size in tokens and how much of it is currently used. |
|
The name of the currently active output style. |
|
The session’s unique id, and the running Claude Code version. |
~/.claude/statusline.sh#!/usr/bin/env bash
# Read JSON data that Claude Code sends to stdin
input=$(cat)
MODEL=$(echo "$input" | jq -r '.model.display_name')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0')
echo "[$MODEL] 📁 $(basename "$DIR") | ${PCT}% context"
GitHub Copilot’s and VS Code’s docs describe no scriptable equivalent, as of 2026-09-28: nothing there drives a
status bar from a user-supplied script reading a documented JSON contract the way statusLine does.
Keybindings
~/.claude/keybindings.json rebinds Claude Code’s own keyboard shortcuts; /keybindings creates or opens it.
Verified against Claude Code — Customize keyboard shortcuts, the
file is a single object with a bindings array, each entry naming a context (where the bindings apply) and a
map of keystrokes to actions (namespace:action, e.g. chat:submit). Changes are picked up automatically,
with no restart needed.
| Field | Type | What it does |
|---|---|---|
|
string |
Optional JSON Schema URL for editor autocompletion. |
|
string |
Optional documentation URL, informational only. |
|
array |
The binding blocks, each with a |
~/.claude/keybindings.json{
"$schema": "https://www.schemastore.org/claude-code-keybindings.json",
"$docs": "https://code.claude.com/docs/en/keybindings",
"bindings": [
{
"context": "Chat",
"bindings": {
"ctrl+e": "chat:externalEditor",
"ctrl+u": null
}
}
]
}
Setting an action to null unbinds the default shortcut for that key in that context instead of assigning a
new one. Contexts include Global (applies everywhere), Chat (the main prompt), Autocomplete,
Confirmation (permission and other yes/no dialogs), Transcript, Task, ThemePicker, Settings and
several others, each exposing its own set of actions — for example app:toggleTodos (Ctrl+T, Global) and
chat:externalEditor (Ctrl+G, Chat). Claude Code validates the file when it loads and warns about parse
errors, invalid context names, unknown actions, reserved-shortcut conflicts and duplicates; a binding with an
unknown action name is skipped, and any default for that key stays in effect.
VS Code has its own general, editor-wide keybindings.json (opened via the Keyboard Shortcuts editor’s "Open
Keyboard Shortcuts (JSON)" command), a JSON array of {"key", "command", "when"} rule objects, verified against
VS Code — Keybindings. It rebinds VS Code and its
extensions' commands generally, including Copilot Chat’s own commands, rather than being specific to Copilot the
way Claude Code’s file is specific to Claude Code.
Environment variables
Claude Code reads a large set of environment variables; the table below covers the commonly used ones, verified against Claude Code — Environment variables:
| Variable | Purpose |
|---|---|
|
API key sent as the |
|
The model to use. |
|
The concrete model ID each alias ( |
|
Overrides the API endpoint, for a proxy or gateway; also disables MCP tool search and Remote Control on a non-first-party host. |
|
Set to any non-empty value to opt out of telemetry — even |
|
Set to any non-empty value to opt out of error reporting (same "even |
|
Set to any non-empty value to disable non-essential network traffic: auto-updates, telemetry, error
reporting, |
|
Default (120000) and maximum (600000) timeouts, in milliseconds, for a long-running Bash command. |
A settings file’s env block applies a variable to every session (and every subprocess Claude Code starts);
a value there overwrites the same variable exported in your shell. Its values are stored in plain text, so keep
credentials out of it entirely — and never commit one to a project’s .claude/settings.json. For the API
credential, point apiKeyHelper at a command that fetches it from a secret manager instead:
~/.claude/settings.json{
"apiKeyHelper": "~/.claude/bin/fetch-anthropic-key.sh",
"env": {
"BASH_DEFAULT_TIMEOUT_MS": "300000"
}
}
Claude Code runs the helper through the system shell, sends its output as the API credential, caches it for
five minutes by default and re-runs it after a 401/403. See
Claude Code — Settings reference
(apiKeyHelper) and (env). GitHub Copilot and VS Code
also read environment variables (for example, for proxy configuration), but under their own tool-specific
names, not the ANTHROPIC_*/Claude-Code-specific ones above; consult each tool’s own documentation before
assuming a name carries over.