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

VS Code Vim: внутренние действия в keybindings.json без Vim-режима

Можно ли использовать ActionVisualReflowParagraph и gq в VSCodeVim без полного Vim-режима? Настройка vim keybindings в keybindings.json и settings.json, альтернативы переноса абзацев в Visual Studio Code. Workaround'ы и ограничения расширения vim vscode.

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

Можно ли использовать внутренние действия 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, но 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 вы можете добавить:

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). Добавьте:

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:

  1. В Visual mode выделите текст → ‘gq’.
  2. Или нативно: 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:

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:

json
"vim.startInInsertMode": true,
"vim.useCtrlKeys": false,
"vim.handleKeys": {
 "user": {
 "<C-d>": false // Нативный multi-cursor
 }
}

Теперь: старт в Insert, Ctrl — нативные, но ‘hjkl’ в Normal работают. Для “выключенного” вида — в keybindings.json заблокируйте vim-команды:

json
{
 "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:

  1. Установите VSCodeVim.
  2. settings.json с textwidth.
  3. keybindings.json для remap.
  4. Проверьте в .txt или Markdown.

Совет: форумы вроде Stack Overflow полны похожих вопросов — этот тред ждёт ответов. Присоединяйтесь! А для продвинутых — fork репозитория и экспонируйте команды сами.


Источники

  1. 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
  2. VSCodeVim/Vim — Репозиторий расширения Vim для Visual Studio Code с настройками keybindings: https://github.com/VSCodeVim/Vim
  3. README.md — Документация по vim-режимам, gq и remapping в VSCodeVim: https://github.com/VSCodeVim/Vim/blob/master/README.md
  4. 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 станет суперсилой, а не головной болью.

D

Расширение VSCodeVim полезно, но модальное редактирование не всем подходит. В Visual Studio Code отсутствует нативный аналог gq для переноса абзацев. Попытка привязать внутреннюю команду ActionVisualReflowParagraph в keybindings.json не удалась — команда не зарегистрирована публично. Пользователи ищут способы использовать vim keybindings без полного активации vs code vim. Вопрос остается открытым без прямых ответов.

@vscodevim / Разработчик расширения Vim для VS Code

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.

@vscodevim / Разработчик расширения Vim для VS Code

Документация расширения 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.

Michael Lesirge / Студент и разработчик робототехники

Пользователи хотят 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’ы, но они неидеальны. Обсуждение открыто.

Авторы
D
Разработчик ПО
@vscodevim / Разработчик расширения Vim для VS Code
Разработчик расширения Vim для VS Code
Michael Lesirge / Студент и разработчик робототехники
Студент и разработчик робототехники
Anthony Kaufman / Разработчик ПО
Разработчик ПО
Проверено модерацией
НейроОтветы
Модерация
VS Code Vim: внутренние действия в keybindings.json без Vim-режима