Текст и данные · Инструкция
Как исправить отступы Tab и пробелами в VS Code
Если один файл внезапно показывает Tab Size 2 вместо 4, Tab вставляет не те символы или Git видит шумные изменения.
Короткий ответ
Нажмите индикатор Spaces/Tab Size в строке состояния, выберите нужный размер и при необходимости Convert Indentation to Spaces/Tabs. Для нестандартных правил отключите `editor.detectIndentation` и задайте `editor.tabSize`/`editor.insertSpaces` в workspace или language-specific settings.
Почему глобальный Tab Size иногда будто игнорируется
По умолчанию VS Code умеет автоматически определять отступы открытого файла. Этот механизм смотрит на существующий текст и может временно заменить ваши обычные `editor.tabSize` и `editor.insertSpaces` для конкретного документа. Поэтому пользователь ставит четыре пробела в Settings, открывает файл с двухпробельным стилем и видит в строке состояния `Spaces: 2` — это не обязательно поломка или конфликт расширения. Документация указывает, что автоопределение распознаёт распространённые размеры 2, 4, 6 и 8 пробелов; необычный стиль, например три пробела, лучше задавать явно. Важно различать отображаемый размер табуляции и реальные символы в файле: Tab может означать один символ табуляции, который визуально занимает несколько колонок, либо редактор может вставлять несколько обычных пробелов. Именно смешение этих двух вариантов часто создаёт «прыгающее» выравнивание в другом редакторе или на GitHub.
Совет: Смотрите индикатор `Spaces`/`Tab Size` в строке состояния перед массовой конвертацией: он показывает режим активного файла.
Как привести текущий файл к одному стилю
- Откройте файл и нажмите `Spaces: N` или `Tab Size: N` в строке состояния. Сначала выберите ожидаемый размер отступа.
- Если нужно изменить реальные символы, используйте Convert Indentation to Spaces либо Convert Indentation to Tabs. Простая смена Tab Size меняет представление/ввод, но не всегда переписывает существующие отступы.
- Сохраните файл и посмотрите diff. Массовое изменение каждой строки допустимо только если вы действительно нормализуете стиль проекта; не смешивайте его с функциональным изменением в том же commit.
- Для постоянного правила проекта добавьте в `.vscode/settings.json` `editor.insertSpaces` и `editor.tabSize`. Если автоопределение мешает, задайте `editor.detectIndentation: false`.
- Если языки требуют разных правил, используйте language-specific блоки, например `[python]`, `[javascript]` или `[markdown]`, вместо одного глобального значения.
- Проверьте formatter и `.editorconfig`, если проект использует EditorConfig через расширение или другой инструмент. Форматтер на save может переписать отступы поверх настроек ввода VS Code.
Предупреждение: Не запускайте Convert Indentation на всём репозитории без отдельного commit: такой diff скрывает реальные изменения кода и усложняет blame/review.
Какая настройка за что отвечает
- editor.tabSize. Ширину шага отступа/Tab в редакторе. Проект требует 2, 3, 4 и т. п. колонок
- editor.insertSpaces. Tab вставляет пробелы вместо символа табуляции. Стиль проекта основан на spaces
- editor.detectIndentation. Разрешает файлу переопределять tabSize/insertSpaces по содержимому. Выключить для строгого нестандартного стандарта
- Convert Indentation. Переписывает существующие leading whitespace. Нормализация уже созданного файла
Почему formatter может отменять ручную настройку
Отступ — это не только поведение клавиши Tab. Prettier, Black, clang-format, ESLint fixes и другие форматтеры способны переписать indentation при Format Document или при save, если включён formatOnSave. Если вы вручную выставили четыре пробела, а после сохранения файл снова стал двухпробельным, проверьте default formatter для языка и конфигурацию самого форматтера. В командном проекте источником истины может служить `.editorconfig` (если он реально применяется инструментами проекта) или конфиг форматтера, а `.vscode/settings.json` лишь помогает локальному редактору следовать тем же правилам. Не создавайте конфликт, где VS Code вводит tabs, а formatter мгновенно превращает их в spaces: это даёт ощущение, что настройка «не сохраняется». Сначала выясните стандарт репозитория по соседним файлам и конфигурации, затем согласуйте ввод и форматирование. Если стандарт меняется, сделайте миграцию отдельным изменением и предупредите команду, чтобы параллельные ветки не получили тысячи конфликтов.
Важно: Если в проекте есть `.editorconfig`, сначала проверьте, каким расширением/форматтером он применяется. Само наличие файла ещё не доказывает, что именно он меняет отступы.
Как работать с файлами, где смешаны tabs и spaces
Смешанные отступы не всегда можно безопасно исправить механически. В языках, где whitespace влияет на синтаксис, например Python, сначала убедитесь, что текущая структура блоков верна. В Makefile символ Tab может быть семантически значимым, поэтому глобальная конвертация в пробелы способна сломать сборку. В Markdown пробелы в конце строки могут означать перенос, а в табличных/фиксированных форматах отступ может быть частью данных. Перед преобразованием просмотрите diff и запустите тесты или линтер проекта. Для обычного JavaScript/TypeScript или JSON механическая нормализация чаще безопаснее, но всё равно отделяйте её от функциональных правок. Если задача только визуальная — например, Tab выглядит слишком широким — не обязательно переписывать файл: иногда достаточно изменить отображаемый tabSize для текущего файла, сохранив исходные символы.
Важно: Для Makefile и whitespace-sensitive языков массовая конвертация может менять поведение, а не только внешний вид.
Когда не стоит нормализовать весь проект сразу
Даже правильный стиль отступов лучше вводить контролируемо. Если старый репозиторий содержит смешанные tabs и spaces, массовое форматирование всех файлов одновременно создаст огромный diff и затруднит проверку функциональных изменений. Сначала закрепите ожидаемые параметры для новых и редактируемых файлов, затем преобразуйте отдельный каталог или модуль и проверьте сборку и тесты. В проектах с generated-файлами выясните, кто создаёт их отступы: ручная правка результата генератора исчезнет при следующей генерации. Цель настройки VS Code — предсказуемое редактирование, а не косметический rewrite без пользы.
Проверка после исправления
- Индикатор строки состояния показывает ожидаемый Spaces/Tabs и размер.
- Новый Tab вставляет ожидаемые символы.
- Save/formatter не возвращает старый стиль.
- Git diff не содержит случайных изменений всего файла без необходимости.
- Линтер/тесты проекта проходят после конвертации.
Что учитывать
По умолчанию VS Code умеет автоматически определять отступы открытого файла. Этот механизм смотрит на существующий текст и может временно заменить ваши обычные `editor.tabSize` и `editor.insertSpaces` для конкретного документа. Поэтому пользователь ставит четыре пробела в Settings, открывает файл с двухпробельным стилем и видит в строке состояния `Spaces: 2` — это не обязательно поломка или конфликт расширения. Документация указывает, что автоопределение распознаёт распространённые размеры 2…
Источники и проверка
Фактическая часть сверена по первичным источникам (в т.ч. Basic editing). Пример и формулировки — редакция N1RO на 2026-09-20.