VSCodeKeymapNpp is a native C++ plugin for Notepad++ that ports the stock Windows VS Code shortcut set as far as Notepad++ can reasonably follow it. Where there is a clean Notepad++ or Scintilla equivalent, the plugin maps it. Where there is not, the shortcut is either reserved as a strict no-op or documented as intentionally unported.
- Source of truth is now the current VS Code Windows default shortcuts page:
https://code.visualstudio.com/docs/reference/default-keybindings - Coverage is generated, not hand-curated
- Runtime bindings come from generated tables in
src/GeneratedBindings.inc - Release flow now supports
x86,x64, andarm64
The plugin still registers two menu commands:
Plugins > VSCode Keymap NPP > Toggle VSCode Strict KeymapPlugins > VSCode Keymap NPP > Show VSCode Coverage Summary
Each Windows-default VS Code binding is tracked in docs/VSCodeKeybindingCoverage.MD.
Bindings land in one of three states:
mapped: handled by Notepad++, Scintilla, or plugin custom logicreserved-noop: swallowed so unrelated Notepad++ behavior does not firedocumented-unported: listed, but intentionally not emulated
Current generated totals live in the coverage report and are also shown in the plugin summary dialog.
src/VSCodeKeymapPlugin.cpp: plugin runtime and custom editor actionssrc/GeneratedBindings.inc: generated runtime binding tablesdata/keybinding-mappings.json: mapping manifest for portable shortcutsdata/vscode-default-keybindings.windows.json: generated normalized source snapshotdocs/VSCodeKeybindingCoverage.MD: generated coverage reportscripts/sync-vscode-keybindings.ps1: refresh source snapshot, report, and runtime tablesscripts/package-release.ps1: build and package release zips
Run this whenever the VS Code defaults page changes or when you update the mapping manifest:
powershell -ExecutionPolicy Bypass -File .\scripts\sync-vscode-keybindings.ps1That script will:
- fetch the current VS Code default keybindings page
- regenerate the normalized Windows shortcut snapshot
- validate manifest coverage and runtime collisions
- regenerate the runtime include file
- regenerate the Markdown coverage report
Prerequisites:
- CMake 3.20 or newer
- Visual Studio 2022 or Build Tools with Desktop C++ workload
- Windows SDK
- For ARM64 builds: Visual Studio ARM64 C++ toolchain/components
Manual build examples:
cmake -S . -B build-x86 -A Win32
cmake --build build-x86 --config Release
cmake -S . -B build-x64 -A x64
cmake --build build-x64 --config Release
cmake -S . -B build-arm64 -A ARM64
cmake --build build-arm64 --config ReleaseOutputs:
build-x86\Release\VSCodeKeymapNpp.dllbuild-x64\Release\VSCodeKeymapNpp.dllbuild-arm64\Release\VSCodeKeymapNpp.dll
Build and package one architecture:
powershell -ExecutionPolicy Bypass -File .\scripts\package-release.ps1 -Platform x64Build and package all architectures:
powershell -ExecutionPolicy Bypass -File .\scripts\package-release.ps1 -Platform allSkip build and package from existing outputs:
powershell -ExecutionPolicy Bypass -File .\scripts\package-release.ps1 -Platform x86 -SkipBuildArtifacts:
dist/VSCodeKeymapNpp-<version>-x86.zipdist/VSCodeKeymapNpp-<version>-x64.zipdist/VSCodeKeymapNpp-<version>-arm64.zip
Each zip is Plugin Admin-friendly:
VSCodeKeymapNpp.dllat archive rootdoc/README.MDdoc/VSCodeKeybindingCoverage.MD
Manual install path:
%AppData%\Notepad++\plugins\VSCodeKeymapNpp\VSCodeKeymapNpp.dll
Or under a machine-wide Notepad++ install:
%ProgramFiles%\Notepad++\plugins\VSCodeKeymapNpp\VSCodeKeymapNpp.dll
%ProgramFiles(x86)%\Notepad++\plugins\VSCodeKeymapNpp\VSCodeKeymapNpp.dll
Use the DLL whose architecture matches the installed Notepad++ build exactly. Restart Notepad++ after copying the plugin.
If a shortcut still behaves differently from VS Code, opens the wrong Notepad++ command, or should be mapped to a better equivalent, please open an issue. Shortcut parity is easiest to improve with concrete reproduction steps from real editor use.
- Contribution guide: CONTRIBUTING.md
- Change history: CHANGELOG.md
This is still not a full VS Code emulation layer. Workbench-only features like debug panes, Problems, hover, format providers, theme picker, and extension UI remain outside clean Notepad++ parity, so they stay reserved or documented as unported instead of being mapped loosely.