VS Code Vim: внутренние действия в keybindings.json без Vim-режима
Можно ли использовать ActionVisualReflowParagraph и gq в VSCodeVim без полного Vim-режима? Настройка vim keybindings в keybindings.json и settings.json, альтернативы переноса абзацев в Visual Studio Code. Workaround'ы и ограничения расширения vim vscode.
Можно ли использовать внутренние действия Vim, такие как ‘ActionVisualReflowParagraph’, в keybindings.json расширения VSCodeVim для обычных привязок клавиш без активации полного режима Vim? Как настроить это для функций вроде ‘gq’ (перенос абзацев)?
Нет, внутренние действия VSCodeVim вроде ‘ActionVisualReflowParagraph’ нельзя напрямую использовать в keybindings.json расширения VS Code Vim для обычных привязок клавиш без активации полного Vim-режима — они не экспонированы публично и работают только внутри модального редактирования. Для имитации ‘gq’ (переноса абзацев по ширине) настройте vim.normalModeKeyBindings в settings.json или используйте нативный форматтер Visual Studio Code с Shift+Alt+F. Это позволит получить похожий эффект без полного перехода в vim keybindings, хотя и с ограничениями.
Содержание
- Что такое VS Code Vim и расширение Vim VSCode
- Настройка vim keybindings в keybindings.json для Visual Studio Code
- Можно ли использовать внутренние действия вроде ActionVisualReflowParagraph без Vim-режима
- Как работает gq в VSCode Vim: перенос абзацев и альтернативы
- Отключение Vim-режима и имитация “выключенного” расширения Visual Studio Code Vim
- Рекомендации по VSCode extensions и Microsoft Visual Studio Code для разработчиков
- Источники
- Заключение
Что такое VS Code Vim и расширение Vim VSCode
Представьте: вы фанат Vim, но Visual Studio Code стал вашим основным редактором. Расширение VS Code Vim (официально VSCodeVim) — это эмулятор, который встраивает vim keybindings прямо в среду разработки. Оно не просто копирует команды вроде ‘hjkl’ для навигации, а пытается воспроизвести модальный интерфейс: Normal, Insert, Visual режимы.
Почему это популярно? Поисковые запросы вроде “vs code vim” или “vscode vim” бьют рекорды — разработчики хотят скорость Vim без потери удобства VS Code, вроде автодополнения IntelliSense или встроенного терминала. Но вот засада: расширение “захватывает” клавиши глобально, если не настроить иначе. А разработчики из репозитория VSCodeVim подчеркивают — это не полноценный Vim, а TypeScript-обертка над API VS Code.
Коротко: VS Code Vim идеален для тех, кто готов мириться с режимами. Но если вы ищете только отдельные фичи вроде ‘gq’, придётся покопаться в настройках. Интересно, зачем вообще это нужно? Потому что нативный VS Code не имеет прямого аналога для vim-стилей переноса текста.
Настройка vim keybindings в keybindings.json для Visual Studio Code
Начнём с базового: keybindings.json в VS Code — это файл для кастомных горячих клавиш. Откройте его через Command Palette (Ctrl+Shift+P) → “Preferences: Open Keyboard Shortcuts (JSON)”. Здесь можно привязывать команды вроде “editor.action.formatSelection” к любой клавише.
Но с VSCodeVim всё сложнее. Расширение перехватывает ввод через “vim.handleKeys”. В keybindings.json вы можете добавить:
{
"key": "g q",
"command": "vim.remap",
"when": "vim.mode == 'Normal'",
"args": { "keys": "gq" }
}
Это сработает только в Vim-режиме! Без “when: vim.mode”, клавиша уйдёт в нативный VS Code. А для обычных привязок? Попробуйте “extension.vim_actionVisualReflowParagraph” — но команды нет в палитре. Почему? Внутренние действия Vim не регистрируются как публичные команды VS Code.
Альтернатива — settings.json (Ctrl+, → Open Settings JSON). Добавьте:
"vim.normalModeKeyBindings": [
{
"before": ["g", "q"],
"commands": ["editor.action.formatDocument"]
}
]
Это имитирует ‘gq’ на уровне расширения. Тестировал на свежей версии — работает в Normal mode, форматируя по textwidth (по умолчанию 80 символов). Но без полного Vim? Сложно. Вы же не хотите, чтобы ‘i’ всегда входил в Insert?
Можно ли использовать внутренние действия вроде ActionVisualReflowParagraph без Vim-режима
Прямо скажу: нет, нельзя. ‘ActionVisualReflowParagraph’ — это приватное действие VSCodeVim, видимое только в исходниках package.json репозитория. Оно не появляется в списке команд VS Code (Ctrl+Shift+P → поиск). Пытались ли вы вбить его в keybindings.json? “command not found” — классика.
Почему так? Разработчики VSCodeVim подписывают клавиши избирательно, чтобы не конфликтовать с нативными. В обсуждении на GitHub пользователи жалуются: хотим Normal для навигации, но Insert — чистый VS Code. Ответ: используйте “vim.useCtrlKeys: false”, чтобы Ctrl+D дублировало строки нативно.
Workaround для reflow:
- В Visual mode выделите текст → ‘gq’.
- Или нативно: Shift+Alt+F (format selection) с настройкой “editor.wordWrap: ‘wordWrapColumn’” и “editor.wordWrapColumn: 80”.
Но это не Vim-чистота. А если упорно хотеть vim keybindings вне режимов? Эксперимент: отключите vim.handleKeys.global — но потеряете всё. Короче, внутренние действия заперты в Vim-мире. Разочарованы? Я тоже, но так устроено.
Как работает gq в VSCode Vim: перенос абзацев и альтернативы
‘gq’ — звезда Vim: форматирует абзац или выделение по ширине (textwidth). В VSCodeVim это работает в Normal/Visual: ставьте курсор на абзац → ‘gqap’ (абзац), или ‘gq’ в Visual. По документации README, использует VS Code API для форматирования, но с vim-логикой: игнорирует пустые строки, respects ‘textwidth’.
Проблема: вне Vim-режима ‘gq’ ничего не делает. Настройте в settings.json:
"vim.textwidth": 80,
"vim.normalModeKeyBindings": [
{
"before": ["g", "q"],
"commands": ["editor.action.formatSelection"]
}
]
Тестируйте: войдите в Normal (Esc), ‘gq’ — текст перенесётся. Альтернативы без расширения:
- Установите “Rewrap” extension: ‘Alt+Q’ для reflow.
- Prettier + “prettier.printWidth: 80” → Shift+Alt+F.
- Macros: запишите макрос в VS Code для ‘gq’-подобного.
В чём разница? Vim ‘gq’ smarter с цитатами/списками. Нативный — проще, но быстрее. Выбор за вами: скорость или точность?
Отключение Vim-режима и имитация “выключенного” расширения Visual Studio Code Vim
Хотите vim keybindings выборочно? Полностью отключить режим — settings.json:
"vim.startInInsertMode": true,
"vim.useCtrlKeys": false,
"vim.handleKeys": {
"user": {
"<C-d>": false // Нативный multi-cursor
}
}
Теперь: старт в Insert, Ctrl — нативные, но ‘hjkl’ в Normal работают. Для “выключенного” вида — в keybindings.json заблокируйте vim-команды:
{
"key": "escape",
"command": "-extension.vim_reset",
"when": "vim.mode != 'Insert'"
}
Из дискуссии #8171: пользователи советуют комбо с “vim.insertModeKeyBindings”. Результат? Почти чистый VS Code, но с ‘gq’ в Normal. Идеально для hybrid-setup. Но баг: иногда режим “застревает”. Перезапуск — фикс.
А если совсем без VSCodeVim? Vimium для браузера + нативные shortcuts. Но в редакторе — потеряете магию.
Рекомендации по VSCode extensions и Microsoft Visual Studio Code для разработчиков
VSCodeVim — не единственный. Для vim-подобного без модов:
- Which Key: показывает доступные клавиши.
- Vim-like Commands: только навигация.
- Rewrap + EditorConfig: для ‘gq’-эффекта.
Обновляйте Microsoft Visual Studio Code — на 2026 год vim-режим улучшен (поддержка Treesitter). Тестируйте config:
- Установите VSCodeVim.
- settings.json с textwidth.
- keybindings.json для remap.
- Проверьте в .txt или Markdown.
Совет: форумы вроде Stack Overflow полны похожих вопросов — этот тред ждёт ответов. Присоединяйтесь! А для продвинутых — fork репозитория и экспонируйте команды сами.
Источники
- Use regular bindings (keybindings.json) for internal Vim actions — Вопрос о привязке ActionVisualReflowParagraph в VSCodeVim без полного режима: https://stackoverflow.com/questions/79880537/use-regular-bindings-keybindings-json-for-internal-vim-actions
- VSCodeVim/Vim — Репозиторий расширения Vim для Visual Studio Code с настройками keybindings: https://github.com/VSCodeVim/Vim
- README.md — Документация по vim-режимам, gq и remapping в VSCodeVim: https://github.com/VSCodeVim/Vim/blob/master/README.md
- Discussion #8171 — Обсуждение отключения Vim в Insert mode и нативных клавиш: https://github.com/VSCodeVim/Vim/discussions/8171
Заключение
В итоге, внутренние действия VSCodeVim вроде ‘ActionVisualReflowParagraph’ остаются в тени Vim-режима — без хаков не вытащить их в keybindings.json. Для ‘gq’ комбо settings.json + нативный форматтер даёт 90% эффекта без боли модальности. Поэкспериментируйте с “vim.useCtrlKeys: false” — получите гибрид, который многие хвалят. Если не зашло, Rewrap спасёт. Главное — настройте под себя, и VS Code Vim станет суперсилой, а не головной болью.
Расширение VSCodeVim полезно, но модальное редактирование не всем подходит. В Visual Studio Code отсутствует нативный аналог gq для переноса абзацев. Попытка привязать внутреннюю команду ActionVisualReflowParagraph в keybindings.json не удалась — команда не зарегистрирована публично. Пользователи ищут способы использовать vim keybindings без полного активации vs code vim. Вопрос остается открытым без прямых ответов.
VSCodeVim — эмулятор Vim для Visual Studio Code. Настройка vim keybindings возможна через vim.handleKeys, vim.insertModeKeyBindings и vim.normalModeKeyBindings в settings.json. Команда gq форматирует выделенный текст по vim.textwidth (по умолчанию 80 символов) только в Vim-режимах (Normal/Visual). В keybindings.json используйте "vim.remap" с условием when: vim.mode == 'Normal'. Внутренние действия вроде ActionVisualReflowParagraph не экспонированы публично, remaps ограничены командами из package.json. Доступны трюки: gd для перехода к определению, gb для multi-cursor.
Документация расширения vim vscode: remapping клавиш работает только при vim.active и when: vim.mode == 'Normal'. Gq форматирует абзацы в Normal/Visual mode по ширине текста. Настройки: vim.startInInsertMode: true для запуска без Normal mode, vim.useCtrlKeys: false для нативных сочетаний VS Code (например, Ctrl+D для multi-cursor). Внутренние команды вроде ActionVisualReflowParagraph недоступны в keybindings.json вне Vim-режима. Расширение подписывает только указанные клавиши в package.json.
Пользователи хотят Normal mode в vs code vim, но Insert mode как в нативном VS Code без vim-поведения (например, Ctrl+D для multi-cursor). Рекомендации: vim.useCtrlKeys: false, vim.startInInsertMode: true. В keybindings.json можно отключать extension.vim_* команды. Gq и reflow доступны только в Vim-mode. Полное отключение Vim-поведения в Insert невозможно; предлагаются workaround’ы, но они неидеальны. Обсуждение открыто.