Коротко — это чаще всего не «случайный глюк VSCode», а проблема с токенизатором (TextMate‑грамматикой) или с расширением, которое эту грамматику даёт. Когда грамматика встречает правило/регулярное выражение, которое падает или застревает в особом состоянии, VSCode может перестать токенизировать (разбивать на токены/скоупы) последующие строки и показать их однотонно. Такое поведение видно только в VSCode, потому что другие редакторы используют другие грамматики/движки.
Что делать быстро (быстрые способы восстановления)
- Reload Window — Cmd+Shift+P → «Developer: Reload Window». Часто сразу восстанавливает подсветку.
- Переоткрыть файл (закрыть → открыть) или переключить язык файла в строке состояния (правый нижний угол) на другой и обратно.
- Отключить все расширения (Cmd+Shift+P → «Extensions: Disable All Installed Extensions») или запустить VSCode без расширений (если у вас доступна команда code, то: code --disable-extensions), чтобы проверить, связано ли это с каким‑то расширением.
- Временное решение: выбрать другой синтаксис (например «Bash» вместо «Shell Script») — иногда другая грамматика проблем не содержит.
Как выяснить причину (диагностика)
1. Посмотрите в консоль разработчика: Cmd+Shift+P → «Developer: Toggle Developer Tools» → Console. Если токенизация падает, там обычно появляются ошибки/исключения с указанием грамматики или регулярного выражения.
2. Откройте Output → Log (Extension Host) — там тоже могут быть ошибки.
3. Используйте Cmd+Shift+P → «Developer: Inspect Editor Tokens and Scopes» — можно увидеть, где токенизация перестаёт работать и какие правила применяются.
4. Поочерёдно выключайте расширения (особенно те, которые дают грамматики для shell/C++), чтобы найти виновника.
Долгосрочные решения
- Обновите VSCode и установленные расширения — многие такие баги фиксили в новых версиях.
- Если виновата конкретная грамматика/расширение — откройте issue у его автора и приложите минимальный пример файла + логи из Developer Tools/Extension Host. Это поможет автору найти и исправить ошибку (обычно проблема — некорректное регулярное выражение в TextMate‑грамматике).
- В крайнем случае можно заменить расширение на другое, дающее ту же подсветку, либо временно отключить семантическую подсветку (если она участвует): "editor.semanticHighlighting.enabled": false.
Почему это случается только в определённых файлах/местах
- Грамматика — это набор правил; конкретная последовательность символов (например, сложный here‑doc, вложенные шаблоны, редкая комбинация символов) может активировать проблемное правило. Поэтому файл может выглядеть нормально в других редакторах, но «сломать» грамматику VSCode именно в этом месте.
Если хотите, могу:
- Подсказать конкретные шаги по сбору логов,
- Помочь найти виновное расширение, если пришлёте имя расширений/пример фрагмента файла,
- Подсказать, какие настройки временно включить/выключить на macOS.