> · 11 мин

Секретные настройки Claude Code — settings.json, env vars, keybindings и status line, о которых не пишут в /help

Секретные настройки Claude Code — settings.json, env vars, keybindings и status line, о которых не пишут в /help

Секретные настройки Claude Code — settings.json, env vars, keybindings и status line, о которых не пишут в /help

Открываешь Claude Code, пишешь промпт, получаешь код. Большинство разработчиков на этом и останавливаются. А под капотом — 50+ настроек в settings.json, десятки переменных окружения, кастомные шорткаты и программируемый status bar, который показывает стоимость сессии в реальном времени.

TL;DR: Разбираем все скрытые настройки Claude Code — от sandbox и permission rules до keybindings.json с chord-комбинациями и status line, который рисует прогресс-бар контекстного окна. С конкретными конфигами, которые можно скопировать и вставить.

settings.json — файл, который правит всем

settings.json — это не просто конфиг. Это иерархическая система из пяти уровней, где каждый следующий перезаписывает предыдущий:

  • User~/.claude/settings.json (для всех проектов)
  • Project.claude/settings.json (коммитится в git, для команды)
  • Local.claude/settings.local.json (gitignored, личные настройки)
  • CLI flags — аргументы при запуске
  • Managed/Library/Application Support/ClaudeCode/ на macOS (для IT-отделов, перебивает всё)

Массивы при этом мёрджатся, а не заменяются. Если в user-настройках разрешён Bash(npm run test *), а в project-настройках запрещён Bash(curl *) — работают оба правила одновременно.

Полезная мелочь: добавьте $schema в начало файла — и VS Code/Cursor подключат автокомплит для всех ключей:

{
  "$schema": "https://json.schemastore.org/claude-code-settings.json"
}

По документации Claude Code, это единственный способ получить inline-валидацию без сторонних расширений.

Ключи, которые реально меняют работу

Модель и мышление

{
  "model": "claude-sonnet-4-6",
  "alwaysThinkingEnabled": true
}

alwaysThinkingEnabled включает extended thinking по умолчанию — Claude дольше думает перед ответом, но результаты на сложных задачах заметно лучше. По наблюдениям Freek Van der Herten, это «заметно улучшает результаты на комплексных задачах».

availableModels ограничивает список моделей, которые можно выбрать через /model:

{
  "availableModels": ["sonnet", "haiku"]
}

Полезно для команд, где нужно контролировать расходы — никто не переключится на Opus случайно.

Язык ответов

{
  "language": "russian"
}

Claude будет отвечать на русском без необходимости писать «отвечай на русском» в каждом промпте. Работает глобально, для всех сессий.

Спиннер и подсказки

Пока Claude думает, внизу крутится спиннер с рандомными глаголами и подсказками. Оба настраиваются:

{
  "spinnerVerbs": {
    "mode": "append",
    "verbs": ["Размышляю", "Ковыряюсь", "Медитирую"]
  },
  "spinnerTipsEnabled": false
}

mode: "append" добавляет ваши глаголы к стандартным, mode: "replace" — полностью заменяет. spinnerTipsEnabled: false убирает подсказки, если они отвлекают.

Можно пойти дальше и заменить сами подсказки:

{
  "spinnerTipsOverride": {
    "excludeDefault": true,
    "tips": ["Используй /compact при 60%+ контекста", "Не забудь про .claudeignore"]
  }
}

Атрибуция в коммитах

По умолчанию каждый коммит получает подпись Co-Authored-By: Claude. Чтобы убрать:

{
  "attribution": {
    "commit": "",
    "pr": ""
  }
}

Или наоборот — настроить свою:

{
  "attribution": {
    "commit": "AI-assisted\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
    "pr": "Generated with Claude Code"
  }
}

Permission rules — гранулярный контроль

Permissions — это самая недооценённая часть settings.json. Большинство пользователей жмут «Allow» на каждый запрос, хотя можно один раз настроить правила и забыть.

Правила проверяются в порядке: deny → ask → allow. Первое совпадение побеждает.

{
  "permissions": {
    "deny": [
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(~/.ssh/**)",
      "Read(~/.aws/**)",
      "Bash(rm -rf *)",
      "Bash(curl *)"
    ],
    "ask": [
      "Bash(git push *)",
      "Bash(docker *)"
    ],
    "allow": [
      "Bash(npm run *)",
      "Bash(git diff *)",
      "Bash(git status *)",
      "Read(src/**)",
      "Edit(src/**)"
    ],
    "defaultMode": "acceptEdits"
  }
}

Паттерны поддерживают глобы: Read(**/*.key) заблокирует чтение любых .key файлов в любой вложенности. WebFetch(domain:example.com) разрешит запросы только к конкретному домену. MCP(tool_name) контролирует отдельные MCP-инструменты.

Trail of Bits выложили свой конфиг для аудиторов безопасности — там заблокированы SSH-ключи, GPG, cloud credentials, npm/PyPI-токены, shell-конфиги и macOS keychain. Плюс PreToolUse hooks, которые блокируют rm -rf и push в main.

Песочница

Sandbox — следующий уровень изоляции. Использует Seatbelt на macOS и bubblewrap на Linux для контроля файловой системы и сети на уровне ОС:

{
  "sandbox": {
    "enabled": true,
    "autoAllowBashIfSandboxed": true,
    "excludedCommands": ["git", "docker"],
    "network": {
      "allowedDomains": ["github.com", "*.npmjs.org", "registry.yarnpkg.com"],
      "allowLocalBinding": true
    },
    "filesystem": {
      "denyRead": ["~/.aws/credentials", "./.env"],
      "denyWrite": ["//etc", "//usr/local/bin"]
    }
  }
}

autoAllowBashIfSandboxed: true — ключевая фича: если sandbox включён, Claude не спрашивает разрешение на каждую bash-команду, потому что она и так изолирована. По документации, это рекомендуемый подход для --dangerously-skip-permissions — вместо отключения проверок используйте sandbox.

Префиксы путей: // — абсолютный путь от корня (//tmp/build/tmp/build), ~/ — от домашней директории, ./ — от директории settings-файла.

Переменные окружения — 30+ рычагов

Все переменные можно задать в блоке env внутри settings.json — и они будут применяться автоматически к каждой сессии:

{
  "env": {
    "CLAUDE_CODE_MAX_OUTPUT_TOKENS": "64000",
    "CLAUDE_CODE_EFFORT_LEVEL": "high",
    "CLAUDE_AUTOCOMPACT_PCT_OVERRIDE": "70"
  }
}

Производительность и контекст

  • CLAUDE_CODE_MAX_OUTPUT_TOKENS — лимит выходных токенов. По умолчанию 32000, максимум 64000. Если видите ошибку «response exceeded the 32000 output token maximum» — увеличьте до 64000. Но есть трейдофф: больше выходных токенов = меньше места для контекста.

  • CLAUDE_CODE_EFFORT_LEVEL — уровень усилий для reasoning: "low", "medium", "high". На low Claude отвечает быстрее и дешевле, на high — тщательнее думает. Для рутинных задач типа форматирования low экономит 30-50% токенов.

  • CLAUDE_AUTOCOMPACT_PCT_OVERRIDE — процент заполнения контекстного окна, при котором срабатывает auto-compact. По умолчанию ~95%, но по опыту сообщества при отключённом auto-compact вы получаете ~45K дополнительных токенов для работы, так как Claude не резервирует место под компактизацию.

  • CLAUDE_CODE_DISABLE_1M_CONTEXT — выключает расширенный контекст в 1M токенов (если доступен). Полезно, если хотите контролировать расходы — 1M контекст стоит значительно дороже.

Модели

  • ANTHROPIC_MODEL — модель по умолчанию. Но есть три отдельных переменных для каждого класса: ANTHROPIC_DEFAULT_OPUS_MODEL, ANTHROPIC_DEFAULT_SONNET_MODEL, ANTHROPIC_DEFAULT_HAIKU_MODEL. Через них можно привязать конкретные версии моделей вместо алиасов.

  • CLAUDE_CODE_SUBAGENT_MODEL — модель для субагентов. Можно поставить Haiku для дешёвых параллельных задач, а основную модель оставить на Opus.

Bash-контроль

  • BASH_DEFAULT_TIMEOUT_MS — таймаут по умолчанию для bash-команд (в мс). Если ваши тесты или билды долгие, увеличьте с дефолтных значений.
  • BASH_MAX_TIMEOUT_MS — максимальный таймаут, который Claude может выставить. По умолчанию 120 секунд, но для CI-пайплайнов может понадобиться 600000 (10 минут).
  • BASH_MAX_OUTPUT_LENGTH — сколько символов из вывода команды попадёт в контекст. Для проектов с массивными логами лучше уменьшить, чтобы не забивать контекстное окно.
  • CLAUDE_CODE_SHELL — переопределяет автоопределение шелла. Полезно, если Claude почему-то использует не тот шелл.

Приватность и телеметрия

{
  "env": {
    "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1"
  }
}

Одна переменная вместо четырёх: разом отключает autoupdater, /bug, Sentry error reporting и Statsig-телеметрию. Для параноиков есть гранулярные варианты: DISABLE_TELEMETRY, DISABLE_ERROR_REPORTING, DISABLE_AUTOUPDATER, DISABLE_COST_WARNINGS — каждый по отдельности.

CLAUDE_CODE_HIDE_ACCOUNT_INFO: "1" — скрывает email и название организации из UI. Полезно для стримов и скринкастов.

keybindings.json — 60+ действий на ваших клавишах

О том, что Claude Code поддерживает кастомные шорткаты, знают единицы. Файл лежит в ~/.claude/keybindings.json, а создаётся командой /keybindings.

Структура — массив привязок по контекстам:

{
  "$schema": "https://www.schemastore.org/claude-code-keybindings.json",
  "bindings": [
    {
      "context": "Chat",
      "bindings": {
        "ctrl+e": "chat:externalEditor",
        "ctrl+s": "chat:stash",
        "ctrl+u": null
      }
    },
    {
      "context": "Global",
      "bindings": {
        "ctrl+t": "app:toggleTodos"
      }
    }
  ]
}

Контексты

16 контекстов определяют, где действует шорткат: Global, Chat, Autocomplete, Confirmation, Transcript, HistorySearch, Task, ThemePicker, Attachments, Footer, MessageSelector, DiffDialog, ModelPicker, Select, Plugin, Settings.

Самые полезные действия

  • chat:externalEditor (Ctrl+G) — открывает промпт в вашем $EDITOR. Писать длинные промпты в vim/neovim гораздо удобнее, чем в однострочном инпуте
  • chat:stash (Ctrl+S) — сохраняет текущий промпт и очищает поле. Удобно, когда начал писать промпт, но нужно сначала сделать что-то другое
  • chat:thinkingToggle (Cmd+T) — переключает extended thinking на лету, без захода в настройки
  • chat:modelPicker (Cmd+P) — быстрое переключение модели
  • app:toggleTodos (Ctrl+T) — показывает/скрывает список задач
  • task:background (Ctrl+B) — отправляет текущую задачу в фон
  • permission:toggleDebug (Ctrl+D в контексте Confirmation) — показывает отладочную информацию по permission rules. Полезно, когда не понимаешь, почему Claude что-то запрашивает

Chord-комбинации

Chord — это последовательность из двух нажатий:

{
  "context": "Chat",
  "bindings": {
    "ctrl+k ctrl+s": "chat:stash",
    "ctrl+k ctrl+t": "chat:thinkingToggle"
  }
}

Жмёте Ctrl+K, отпускаете, жмёте Ctrl+S — и промпт сохраняется. Работает как в VS Code.

Vim mode

/vim включает vim-режим с INSERT/NORMAL-модами. Vim и keybindings работают независимо: vim управляет курсором в текстовом поле, keybindings — действиями приложения. Escape в vim переключает в NORMAL mode, а не отменяет ввод. Ctrl+key комбинации проходят сквозь vim к keybindings.

Проверить конфликты: /doctor покажет все проблемы с шорткатами — дубликаты, конфликты с tmux (Ctrl+B), screen (Ctrl+A).

Status line — приборная панель в терминале

Status line — программируемая строка внизу экрана. Claude Code запускает ваш скрипт и передаёт ему JSON с данными сессии через stdin. Скрипт выводит текст — Claude Code его рисует.

Настройка в settings.json:

{
  "statusLine": {
    "type": "command",
    "command": "~/.claude/statusline.sh"
  }
}

Или inline через jq:

{
  "statusLine": {
    "type": "command",
    "command": "jq -r '\"[\\(.model.display_name)] \\(.context_window.used_percentage // 0)% context\"'"
  }
}

Что приходит в JSON

  • model.id, model.display_name — модель (claude-opus-4-6, Opus)
  • cost.total_cost_usd — стоимость сессии в долларах
  • cost.total_duration_ms — время сессии
  • cost.total_lines_added, cost.total_lines_removed — изменённые строки кода
  • context_window.used_percentage — процент заполнения контекстного окна
  • context_window.context_window_size — размер окна (200K или 1M)
  • session_id, transcript_path — идентификатор и путь к логу
  • vim.mode — режим vim (если включён)
  • worktree.name, worktree.branch — информация о worktree

Скрипт с прогресс-баром и git

#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)
COST=$(echo "$input" | jq -r '.cost.total_cost_usd // 0')
BRANCH=$(git branch --show-current 2>/dev/null || echo "no-git")

# Цветовая индикация контекста
if [ "$PCT" -lt 40 ]; then
  COLOR="\033[32m"  # зелёный
elif [ "$PCT" -lt 70 ]; then
  COLOR="\033[33m"  # жёлтый
else
  COLOR="\033[31m"  # красный
fi
RESET="\033[0m"

# Прогресс-бар
BAR_LEN=20
FILLED=$((PCT * BAR_LEN / 100))
EMPTY=$((BAR_LEN - FILLED))
BAR=$(printf '█%.0s' $(seq 1 $FILLED 2>/dev/null))$(printf '░%.0s' $(seq 1 $EMPTY 2>/dev/null))

echo -e "[$MODEL] $BRANCH | ${COLOR}${BAR} ${PCT}%${RESET} | \$${COST}"

По документации, скрипт обновляется после каждого ответа Claude, дебаунс 300мс. Не потребляет API-токены — работает полностью локально.

Для продвинутых: ccstatusline — community-проект с Powerline-стилем, темами и кликабельными ссылками через OSC 8.

Ещё три скрытых фичи

fileSuggestion — кастомный автокомплит для @

Когда пишете @ в промпте, Claude Code предлагает файлы. Это поведение можно переопределить своим скриптом:

{
  "fileSuggestion": {
    "type": "command",
    "command": "~/.claude/file-suggestion.sh"
  }
}

Скрипт получает JSON с {"query": "src/comp"} на stdin и выводит до 15 путей. Можно подключить fuzzy search, фильтрацию по .gitignore или приоритизацию недавно изменённых файлов.

companyAnnouncements — объявления при старте

{
  "companyAnnouncements": [
    "Не забудь пройти code review перед мёржем!",
    "Новая версия API docs: https://internal.docs/v3"
  ]
}

При каждом запуске Claude Code показывает случайное объявление. Полезно для команд — напоминания о стандартах, ссылки на внутренние доки.

cleanupPeriodDays — автоочистка сессий

{
  "cleanupPeriodDays": 14
}

По умолчанию — 30 дней. Если работаете активно и .claude/ разрастается, уменьшите до 7-14.

Подводные камни

CLAUDE_CODE_MAX_OUTPUT_TOKENS не работает для субагентов. По issue #10738, субагенты игнорируют эту переменную и всегда ограничены 32K. Если субагент генерирует длинный ответ — он обрежется.

Sandbox ломает некоторые инструменты. Docker, kubectl, git с SSH-ключами — всё это может не работать внутри песочницы. Используйте excludedCommands для таких инструментов, но помните: исключённые команды выполняются без изоляции.

env в settings.json не передаётся MCP-серверам. По issue #11927, переменные из блока env видны только Claude Code, но не MCP-серверам. Если MCP-серверу нужен токен — задайте его в shell profile или в конфиге самого MCP.

Keybindings конфликтуют с tmux/screen. Ctrl+B — дефолтный prefix tmux. Если работаете в tmux, придётся нажимать Ctrl+B дважды или перебиндить task:background на другую комбинацию. /doctor покажет все конфликты.

Shell env перебивает settings.json. Если ANTHROPIC_MODEL задан и в shell profile, и в settings.json — победит shell. Это задокументированное поведение, но часто путает.

Вердикт

Из всего описанного три настройки дают максимальный эффект: permission rules (один раз настроил — больше никогда не жмёшь Allow на каждый запрос), status line (видишь контекст и стоимость без /cost), и env блок с EFFORT_LEVEL + AUTOCOMPACT_PCT_OVERRIDE (контроль расходов на автопилоте). Keybindings — приятный бонус, если проводишь в Claude Code больше часа в день. Sandbox — must have для тех, кто использует --dangerously-skip-permissions.

Как попробовать

  1. Откройте ~/.claude/settings.json (создайте, если нет) и добавьте $schema для автокомплита:
{
  "$schema": "https://json.schemastore.org/claude-code-settings.json"
}
  1. Настройте базовые permission rules — deny для .env и credentials, allow для ваших рабочих команд (см. конфиг выше)

  2. Добавьте env блок с нужными переменными:

{
  "env": {
    "CLAUDE_CODE_EFFORT_LEVEL": "medium",
    "CLAUDE_AUTOCOMPACT_PCT_OVERRIDE": "75"
  }
}
  1. Запустите /statusline show model, git branch, context percentage with progress bar and cost — Claude Code сам сгенерирует скрипт

  2. Запустите /keybindings и добавьте chat:externalEditor на удобную комбинацию — возможность писать промпты в полноценном редакторе меняет workflow

$ ls ./related/

Похожие статьи

subscribe.sh

$ cat /dev/blog/updates

> Свежие заметки о программировании,

> DevOps и AI — прямо в мессенджер

./subscribe