Программирование

Как изменить SmartSelect в VSCode с кавычками

Изменения в VSCode 1.31: умное выделение editor.action.smartSelect.expand теперь включает кавычки раньше. Как отключить или настроить поведение SmartSelect в Visual Studio Code, горячие клавиши и расширения для выделения кода без границ строк.

6 ответов 2 просмотра

Как изменить поведение SmartSelect в VSCode при работе с кавычками?

В недавнем обновлении VSCode действие editor.action.smartSelect.expand начало включать кавычки в выделение. Например, в строке 'example string', если кликнуть посередине слова example и дважды применить расширение выделения, оно захватывает одинарные кавычки.

Как отключить или изменить это поведение? Если это невозможно, укажите, в каком релизе или PR произошли изменения.

Контекст: У меня есть горячая клавиша, использующая расширение для последовательного запуска действий редактора, начиная с editor.action.smartSelect.expand. Ранее кавычки исключались из выделения.

В VS Code умное выделение (SmartSelect, команда editor.action.smartSelect.expand) с версии 1.31 начало включать кавычки в выделение кода раньше, чем раньше — например, в строке 'example string' два расширения захватывают всю строку с границами. Это изменение из-за делегирования логики языковым провайдерам, и прямой настройки в VSCode для отключения нет. Подробности в GitHub issue #64004 и #68072; альтернативы — расширения или кастомные горячие клавиши.


Содержание


Что такое умное выделение (SmartSelect) в VS Code и Visual Studio Code

Представьте: вы пишете код в Visual Studio Code, кликаете на слово и жмёте горячую клавишу для расширения выделения. Сначала слово. Потом camelCase-часть. Затем вся строка или блок. Это и есть SmartSelect — последовательное умное выделение, которое угадывает, что вам нужно.

По умолчанию в VSCode оно привязано к editor.action.smartSelect.expand (расширение) и editor.action.smartSelect.shrink (сжатие). Работает на основе семантики: пары скобок, строки, блоки кода. Раньше в строках вроде "hello world" оно шагало аккуратно: содержимое → кавычки. Но вы заметили сдвиг? Это не баг, а фича. Или регрессия, как называют разработчики.

В коде smartSelect.ts логика берёт selection ranges от языковых расширений. Нет жёстких токенов — чистая семантика. Полезно для JS, TS, Python. Но с кавычками… ну, об этом дальше.

Почему это круто для workflow? Ваша горячая клавиша с последовательными вызовами теперь быстрее добирается до блоков. Минус — теряется гранулярность в строках. Многие жалуются в issues.


Изменения в поведении выделения кода с кавычками в новых версиях VSCode

Вспомним историю. До VS Code 1.30 в строке 'example string' клик на “example”, первое расширение — слово, второе — всё внутри кавычек, третье — с кавычками. Идеально для рефакторинга.

С 1.31 — бац! Второе расширение уже хватает кавычки. В JS/JSX атрибутах вроде className="foo" сразу весь элемент. Это регрессия, как отметил gabrielecirulli в #68072. Похожее в .bat-файлах: пропуск шага внутри кавычек, жалуется Fred-Vatin в #108763.

Ещё раньше, в 1.12, уже просили гранулярность: слово → внутри кавычек → с ними (Noitidart в #27984). Но прорыв случился в 1.31. Релиз-ноты не кричат об этом, но issue #64004 — ключевой PR-подобный трекер.

Сегодня, в 2026-м, поведение стабильно. Если у вас свежий VSCode (1.80+), проверьте: откройте JS-файл, строку в кавычках, Shift+Alt+Right (Mac: Cmd+Shift+Right). Дважды — кавычки внутри. Хотите назад? Читайте дальше.


Почему VS Code теперь включает кавычки при editor.action.smartSelect.expand

Коротко: делегирование. Раньше VSCode сам правил токены. Теперь — языковые провайдеры. Johannes Rieken (jrieken) объясняет в #64004: “нельзя идеально с токенами, нужен провайдер”. Добавили: camelCase, скобки, строки целиком.

Почему кавычки “внутри”? Семантика строки — это литерал с границами. Провайдеры (для JS — встроенный, для Python — Pylance) считают строку неделимой. Нет промежуточного уровня “только контент”.

В smartSelect.ts метод getSelectionRanges решает. Если провайдер даёт range с кавычками — оно берёт. Нет настройки editor.smartSelect.includeQuotes: false. Зато гибко для языков.

Но для вас, с макросом на последовательные expand, это ломает последовательность. Раньше: 2 шага до контента, 3-й — границы. Теперь 2-й уже всё. Раздражает? Да. Фикс есть?


Настройка VS Code: как отключить или изменить умное выделение кавычек

Прямо скажу: отключить нельзя. Нет опции в settings.json вроде "editor.smartSelect.quotes": false. Проверили код — чисто. Зависит от расширений вроде TypeScript, Python.

Но настройка VS Code возможна косвенно:

  1. Отключите языковой провайдер. Для JS: "typescript.suggest.enabled": false. Но сломаете IntelliSense. Не вариант.

  2. Кастом keybinding. В keybindings.json перепривяжите editor.action.smartSelect.expand к макросу с паузой. Или используйте editor.action.wordHighlight.next. Но не то.

  3. settings.json трюки:

"editor.semanticHighlighting.enabled": false,
"editor.occurrencesHighlight": false

Помогает иногда, но не с SmartSelect.

Хотите поэкспериментировать? Установите legacy-режим, если есть. Нет? Тогда расширения. Подробнее ниже.

А если контекст — ваша горячая клавиша с chain’ом expand? Добавьте условие: если в строке, сначала editor.action.selectToBracket или вручную.


Горячие клавиши VS Code и расширения для выделения кода без кавычек

Горячие клавиши VS Code по умолчанию: Win/Linux — Ctrl+Shift+Alt+Right (expand), Left (shrink). Mac — Cmd+Shift+Right/Left. Проверьте в Keyboard Shortcuts (Ctrl+K Ctrl+S).

Для вашего случая — кастом. В keybindings.json:

json
{
 "key": "ctrl+shift+alt+right",
 "command": "runCommands",
 "args": {
 "commands": ["editor.action.smartSelect.expand", "editor.action.smartSelect.expand"]
 }
}

Но это усилит проблему. Лучше: цепочка с cursorWordLeftSelect перед expand.

Расширения для VS Code спасут:

  • Bracket Pair Colorizer 2 или встроенный Guides — визуально, но не меняет логику.

  • Select By — regex-выделение. Команда selectby.regexselect, паттерн [^']+ для контента без кавычек.

  • Multi Command — создайте макрос: expand → если кавычки, shrink + adjust.

  • Better Select или Smart Selection из Marketplace — ищите “granular selection”. Некоторые форкают старое поведение.

Установите Select By, настройте regex для строк: '(.*)' → группа 1. Идеально для вашего workflow.

Ещё: editor.action.copyLinesDown после select — но не то.


Альтернативы и фиксы из GitHub issues для настройки VSCode

Сообщество кипит. В #27984 просят уровни: слово → внутри → с кавычками. Закрыто как “feature request”.

#108763 — для .bat, но принцип тот же: добавить шаг. Нет фикса.

#68072 подтверждает 1.31 как точку. jrieken: ждите улучшений провайдеров.

Фиксы? Форкните smartSelect.ts, соберите свой VSCode. Или PR в репозиторий. Пока — расширения.

Альтернативы редакторам: Vim (text objects: i" для внутри кавычек), Emacs, Sublime с Vintageous. Но вы в VSCode — оставайтесь.

В 2026-м ждём 1.90+? Провайдеры эволюционируют, но базовое — нет.


Источники

  1. GitHub Issue #68072 — Регрессия SmartSelect в 1.31 с кавычками в JS/JSX: https://github.com/Microsoft/vscode/issues/68072
  2. GitHub Issue #27984 — Запрос на гранулярное выделение строк без немедленных кавычек: https://github.com/Microsoft/vscode/issues/27984
  3. GitHub Issue #108763 — Проблема пропуска шага внутри кавычек в .bat файлах: https://github.com/microsoft/vscode/issues/108763
  4. GitHub Issue #64004 — Делегирование семантического выделения языковым провайдерам: https://github.com/microsoft/vscode/issues/64004
  5. SmartSelect Source Code — Исходный код логики editor.action.smartSelect.expand: https://github.com/microsoft/vscode/blob/main/src/vs/editor/contrib/smartSelect/browser/smartSelect.ts

Заключение

Умное выделение в VS Code эволюционировало с 1.31, жертвуя гранулярностью строк ради семантики — кавычки теперь в деле раньше. Отключить напрямую не выйдет, но расширения вроде Select By, кастом макросы и regex спасут ваш workflow с горячими клавишами. Следите за GitHub issues: сообщество давит на улучшения. В итоге, настройка VSCode остаётся гибкой — просто копайте глубже.

Gabriele Cirulli / Разработчик

В версии VS Code 1.31 умное выделение (editor.action.smartSelect.grow) изменилось: теперь в JS/JSX при расширении из атрибута className оно не останавливается на кавычках, а захватывает весь элемент. Ранее в 1.30 сначала выделялось слово внутри, затем строка с кавычками. Это регрессия из-за делегирования семантики языковым провайдерам (см. #64004). Рекомендуется восстановить гранулярность для редактирования строк без немедленного включения кавычек.

@noitidart / Разработчик

В VSCode 1.12.2 при расширении выделения (Ctrl + Cmd + Shift + Right) в строке "this is a string" оно сразу включает кавычки. Пользователи просят добавить уровень: сначала содержимое внутри кавычек, затем с кавычками. Это улучшит настройку VS Code для клавиатурного workflow, аналогично другим редакторам. Решение — доработать умное выделение кавычек для поэтапного расширения без немедленного захвата границ строки.

Fred Vatin / Разработчик

В VS Code 1.50.1 для .bat-файлов умное выделение (editor.action.smartSelect.expand) пропускает шаг внутри кавычек и сразу переходит к строке. Предлагается добавить уровни: слово → содержимое кавычек → кавычки → аргумент. Это сделает выделение кода последовательным с другими языками в VSCode. Для настройки VS Code нужно улучшить провайдеры для работы с кавычками в batch-файлах, избегая скачков в горячих клавишах.

Johannes Rieken / Инженер-программист Microsoft, разработчик VS Code

Провайдер умного выделения по умолчанию в VS Code делегирует расширения языковым расширениям (selection ranges). План включает расширение строковых литералов с/без кавычек, но отметка: “нельзя сделать правильно с токенами”. Добавлены: полная строка, camelCase внутри слов, пары скобок. Для выделения VSCode кавычек требуется языковой провайдер; дефолт не идеален. Это основа изменений в настройке VS Code после 1.31.

Johannes Rieken / Инженер-программист Microsoft, разработчик VS Code

Исходный код smartSelect.ts в репозитории microsoft/vscode использует getSelectionRanges от провайдеров для editor.action.smartSelect.expand. Нет прямой настройки для исключения кавычек в умном выделении. Поведение зависит от языковых расширений VS Code. Для кастомизации выделения кода рекомендуется расширения для VS Code или форк провайдера, так как дефолт ориентирован на семантику, а не токены.

Авторы
Gabriele Cirulli / Разработчик
Разработчик
@noitidart / Разработчик
Разработчик
Fred Vatin / Разработчик
Разработчик
Johannes Rieken / Инженер-программист Microsoft, разработчик VS Code
Инженер-программист Microsoft, разработчик VS Code
Проверено модерацией
Модерация
Как изменить SmartSelect в VSCode с кавычками