n1ro°
RU

Текст и данные · Инструкция

Как исправить отступы Tab и пробелами в VS Code

Если один файл внезапно показывает Tab Size 2 вместо 4, Tab вставляет не те символы или Git видит шумные изменения.

Редакция N1RO · Проверено

Короткий ответ

Нажмите индикатор 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` в строке состояния перед массовой конвертацией: он показывает режим активного файла.

Как привести текущий файл к одному стилю

  1. Откройте файл и нажмите `Spaces: N` или `Tab Size: N` в строке состояния. Сначала выберите ожидаемый размер отступа.
  2. Если нужно изменить реальные символы, используйте Convert Indentation to Spaces либо Convert Indentation to Tabs. Простая смена Tab Size меняет представление/ввод, но не всегда переписывает существующие отступы.
  3. Сохраните файл и посмотрите diff. Массовое изменение каждой строки допустимо только если вы действительно нормализуете стиль проекта; не смешивайте его с функциональным изменением в том же commit.
  4. Для постоянного правила проекта добавьте в `.vscode/settings.json` `editor.insertSpaces` и `editor.tabSize`. Если автоопределение мешает, задайте `editor.detectIndentation: false`.
  5. Если языки требуют разных правил, используйте language-specific блоки, например `[python]`, `[javascript]` или `[markdown]`, вместо одного глобального значения.
  6. Проверьте 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.