n1ro°
RU

Ошибки и коды · Инструкция

В VS Code не работает автозакрытие скобок и кавычек

Автозакрытие `()`, `[]`, `{}` и кавычек зависит не только от одной глобальной настройки.

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

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

Проверьте `editor.autoClosingBrackets` и отдельно `editor.autoClosingQuotes`, затем убедитесь, что выбран правильный Language Mode. Значение `languageDefined` использует правила языка; если проблема только в одном расширении/языке, проверьте его language configuration или конфликт расширения.

Почему открывающая скобка не всегда обязана создавать пару

VS Code не просто вставляет закрывающий символ после любого `(` или `{`. При стандартном режиме `languageDefined` редактор ориентируется на конфигурацию конкретного языка: какие пары считаются скобками, где автозакрытие разрешено и в каких контекстах его нужно подавить. Например, языковая конфигурация может не закрывать кавычку внутри комментария или строки. Кроме того, при режимах `languageDefined` и `beforeWhitespace` VS Code не создаёт дубликат, если дальше уже есть подходящая незакрытая закрывающая скобка. Поведение на очень больших файлах и до завершения tokenization может быть упрощено. Поэтому тест «нажал `{` в одном сложном месте — пары нет» недостаточен. Создайте новый пустой файл нужного языка, поставьте курсор на пустую строку и проверьте `(`, `[`, `{`, одинарную и двойную кавычки отдельно. Это быстро показывает, сломана ли общая функция или сработало контекстное правило языка.

Совет: Скобки и кавычки управляются разными настройками. Исправление `editor.autoClosingBrackets` не обязано менять поведение двойных или одинарных кавычек.

Как восстановить автозакрытие

  1. Проверьте Language Mode в строке состояния. Если файл открыт как Plain Text или неверный язык, выберите правильный режим и повторите тест на пустой строке.
  2. Откройте Settings и найдите `Editor: Auto Closing Brackets`. Для стандартного поведения используйте `languageDefined`; `never` полностью отключает автозакрытие скобок.
  3. Отдельно найдите `Editor: Auto Closing Quotes`. Если скобки работают, а кавычки нет, проблема почти наверняка в этой настройке или правилах языка.
  4. Сравните User и Workspace Settings, затем language-specific настройки. Проект мог переопределить параметр только для JavaScript, Markdown или другого языка.
  5. Временно отключите keymap/typing/language extensions, если функция ломается только после их установки. Для большого набора расширений используйте Extension Bisect.
  6. Если проблема проявляется только в одном языке, откройте документацию или issue tracker его расширения: autoClosingPairs и `notIn` задаются language configuration и могут отличаться от ожиданий.

Предупреждение: Не ставьте `always` как универсальный «фикс» без проверки: этот режим может вставлять пары даже там, где рядом уже есть закрывающая скобка и стандартное поведение специально избегает дубликата.

Что проверять по симптому

  • Не закрываются никакие скобки нигде. editor.autoClosingBrackets, User Settings. Глобально стоит never
  • Скобки работают, кавычки нет. editor.autoClosingQuotes. Отдельная настройка quotes
  • Проблема только в одном языке. Language Mode + language-specific settings/config. Правила языка или extension
  • Пара не вставляется перед существующей закрывающей скобкой. Контекст курсора. Ожидаемое подавление дубликата

Как работают languageDefined, beforeWhitespace, always и never

`languageDefined` — нормальный выбор для большинства пользователей: VS Code доверяет конфигурации языка и знает допустимые пары. `beforeWhitespace` ограничивает автоматическую вставку контекстом перед пробельным символом. `always` заставляет редактор быть агрессивнее и полезен только если вы осознанно хотите пару в ситуациях, где стандартное правило её не создаёт. `never` отключает функцию. Важный нюанс: языковые расширения могут определять собственные autoClosingPairs и `notIn`, например запрет закрытия определённой кавычки внутри string/comment. Это не «игнорирование» глобальной настройки, а часть declarative language configuration. Если вы разрабатываете собственный язык/extension, исправлять нужно `language-configuration.json`, а не требовать от пользователей ставить `always`. Для обычного пользователя достаточно сравнить поведение во встроенном языке вроде JavaScript и в проблемном языке: если проблема только во втором, направление диагностики очевидно.

Важно: Для собственного language extension проверяйте autoClosingPairs, autoCloseBefore и notIn — именно они формируют ожидаемое поведение языка.

Почему проблема может казаться случайной

Контекст курсора меняется от строки к строке. Если справа уже находится подходящий закрывающий символ, VS Code может не вставить второй; если курсор внутри комментария или строки, language configuration может запрещать конкретную пару; если IntelliSense/snippet перехватывает ввод, результат тоже отличается. С несколькими курсорами автозакрытие может подавляться, если хотя бы для одного курсора обнаруживается ситуация с существующей парой. На больших файлах до полной tokenization editor может использовать упрощённое стандартное поведение. Поэтому воспроизводите проблему на одном курсоре и пустой строке, а затем постепенно возвращайте реальный контекст. Это позволяет отличить настройку `never` от корректной языковой логики. Если поведение меняется после форматирования или расширения, зафиксируйте точный фрагмент кода и список активных расширений — такого минимального примера достаточно для качественного bug report.

Совет: Тест с одним курсором на пустой строке убирает большинство контекстных причин и даёт чистый сигнал о настройке.

Автозакрытие и обрамление выделения — не одно и то же

Проверяйте два сценария отдельно: ввод открывающей скобки на пустой строке и ввод кавычки вокруг уже выделенного текста. Первый зависит от auto-closing rules, второй связан с поведением auto surround и языковой конфигурацией. Поэтому ситуация, когда пары создаются при обычном вводе, но не оборачивают выделение, не доказывает поломку автозакрытия. Аналогично расширение языка может разрешать пару в коде и запрещать её внутри строки или комментария. Для воспроизводимого теста используйте один курсор, небольшой файл и фиксированный Language Mode; только после этого возвращайте snippets, расширения и сложный контекст.

Проверка после настройки

  • Правильный Language Mode выбран.
  • editor.autoClosingBrackets не установлен в never.
  • editor.autoClosingQuotes проверен отдельно.
  • Нет workspace/language-specific переопределения.
  • На пустой строке с одним курсором пары создаются ожидаемо.
  • Если проблема только в одном языке, проверено его расширение/configuration.

Что учитывать

VS Code не просто вставляет закрывающий символ после любого `(` или `{`. При стандартном режиме `languageDefined` редактор ориентируется на конфигурацию конкретного языка: какие пары считаются скобками, где автозакрытие разрешено и в каких контекстах его нужно подавить. Например, языковая конфигурация может не закрывать кавычку внутри комментария или строки. Кроме того, при режимах `languageDefined` и `beforeWhitespace` VS Code не создаёт дубликат, если дальше уже есть подходящая незакрытая…

Источники и проверка

Фактическая часть сверена по первичным источникам (в т.ч. Basic editing). Пример и формулировки — редакция N1RO на 2026-09-20.