Как изменить SmartSelect в VSCode с кавычками
Изменения в VSCode 1.31: умное выделение editor.action.smartSelect.expand теперь включает кавычки раньше. Как отключить или настроить поведение SmartSelect в Visual Studio Code, горячие клавиши и расширения для выделения кода без границ строк.
Как изменить поведение 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
- Изменения в поведении выделения кода с кавычками в новых версиях VSCode
- Почему VS Code теперь включает кавычки при editor.action.smartSelect.expand
- Настройка VS Code: как отключить или изменить умное выделение кавычек
- Горячие клавиши VS Code и расширения для выделения кода без кавычек
- Альтернативы и фиксы из GitHub issues для настройки VSCode
- Источники
- Заключение
Что такое умное выделение (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 возможна косвенно:
-
Отключите языковой провайдер. Для JS:
"typescript.suggest.enabled": false. Но сломаете IntelliSense. Не вариант. -
Кастом keybinding. В keybindings.json перепривяжите
editor.action.smartSelect.expandк макросу с паузой. Или используйтеeditor.action.wordHighlight.next. Но не то. -
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:
{
"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+? Провайдеры эволюционируют, но базовое — нет.
Источники
- GitHub Issue #68072 — Регрессия SmartSelect в 1.31 с кавычками в JS/JSX: https://github.com/Microsoft/vscode/issues/68072
- GitHub Issue #27984 — Запрос на гранулярное выделение строк без немедленных кавычек: https://github.com/Microsoft/vscode/issues/27984
- GitHub Issue #108763 — Проблема пропуска шага внутри кавычек в .bat файлах: https://github.com/microsoft/vscode/issues/108763
- GitHub Issue #64004 — Делегирование семантического выделения языковым провайдерам: https://github.com/microsoft/vscode/issues/64004
- 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 остаётся гибкой — просто копайте глубже.
В версии VS Code 1.31 умное выделение (editor.action.smartSelect.grow) изменилось: теперь в JS/JSX при расширении из атрибута className оно не останавливается на кавычках, а захватывает весь элемент. Ранее в 1.30 сначала выделялось слово внутри, затем строка с кавычками. Это регрессия из-за делегирования семантики языковым провайдерам (см. #64004). Рекомендуется восстановить гранулярность для редактирования строк без немедленного включения кавычек.
В VSCode 1.12.2 при расширении выделения (Ctrl + Cmd + Shift + Right) в строке "this is a string" оно сразу включает кавычки. Пользователи просят добавить уровень: сначала содержимое внутри кавычек, затем с кавычками. Это улучшит настройку VS Code для клавиатурного workflow, аналогично другим редакторам. Решение — доработать умное выделение кавычек для поэтапного расширения без немедленного захвата границ строки.
В VS Code 1.50.1 для .bat-файлов умное выделение (editor.action.smartSelect.expand) пропускает шаг внутри кавычек и сразу переходит к строке. Предлагается добавить уровни: слово → содержимое кавычек → кавычки → аргумент. Это сделает выделение кода последовательным с другими языками в VSCode. Для настройки VS Code нужно улучшить провайдеры для работы с кавычками в batch-файлах, избегая скачков в горячих клавишах.
Провайдер умного выделения по умолчанию в VS Code делегирует расширения языковым расширениям (selection ranges). План включает расширение строковых литералов с/без кавычек, но отметка: “нельзя сделать правильно с токенами”. Добавлены: полная строка, camelCase внутри слов, пары скобок. Для выделения VSCode кавычек требуется языковой провайдер; дефолт не идеален. Это основа изменений в настройке VS Code после 1.31.
Исходный код smartSelect.ts в репозитории microsoft/vscode использует getSelectionRanges от провайдеров для editor.action.smartSelect.expand. Нет прямой настройки для исключения кавычек в умном выделении. Поведение зависит от языковых расширений VS Code. Для кастомизации выделения кода рекомендуется расширения для VS Code или форк провайдера, так как дефолт ориентирован на семантику, а не токены.