
When I switch between Windows and macOS, I want my keyboard shortcuts to come with me. I'd rather keep using Ctrl+C, Ctrl+V, Home, End, and the navigation keys I already reach for than translate them in my head every time I change computers.
I started with existing Windows-to-Mac mappings for Karabiner-Elements. I copied those rules and expanded them, fine-tuning the behavior for the specific programs I use for development.
My karabiner-windows-macos project brings that configuration together, along with a small Swift helper for Finder and an optional voice-typing patch.
The shortcuts my hands already know
The everyday combinations are Ctrl+C, Ctrl+X, and Ctrl+V for copy, cut, and paste. Karabiner translates those into the Command shortcuts the Mac applications expect. Ctrl+Y becomes Command+Shift+Z for redo.
Text navigation matters just as much. I use Ctrl+Left and Ctrl+Right to move by words, and add Shift when I want to select them. On the Mac, the profile sends the corresponding Option combinations. Ctrl+Backspace and Ctrl+Delete handle deleting a word in either direction.
Home and End go to the beginning and end of the line. Ctrl+Home and Ctrl+End go to the beginning and end of the document. The Shift versions extend the selection, so moving around a paragraph and selecting part of it follow the same habits.
| Keys I press | What I want them to do |
|---|---|
| Ctrl+C / Ctrl+X / Ctrl+V | Copy, cut, and paste |
| Ctrl+Y | Redo |
| Ctrl+Left / Ctrl+Right | Move by a word |
| Home / End | Move to the start or end of the line |
| Ctrl+Home / Ctrl+End | Move to the start or end of the document |
| Shift with the navigation shortcuts | Select as I move |
I also kept familiar browser shortcuts, such as Ctrl+L for the address bar and F5 to reload. These are small changes individually, but they cover a lot of the keys I use throughout the day.
Finder needed a little more attention
In Finder, I wanted F2 to rename a file, Enter to open it, and the dedicated Delete key on my PC keyboard to move it to the Trash. That last one sends Command+Backspace on the Mac. Here, Delete means the forward-delete key on a PC keyboard; the key labeled Delete on an Apple keyboard is Backspace.
Backspace was the awkward one. When I'm browsing folders, I want it to take me to the parent folder. When I'm halfway through renaming a file, I want it to erase a character.
My earlier mapping got that wrong: pressing Backspace during a rename could navigate away instead of editing the filename. Mapping a key only by which application is open wasn't enough. Finder was still Finder in both situations.
I added a small Swift helper that checks Finder's focused control through macOS Accessibility. It sends a normal Backspace while I'm editing or Command+Up while I'm browsing.
Enter follows the same idea: open the selected file while browsing, then keep its normal role when I'm finishing a rename. Getting those context changes right made the Finder mappings much more useful than a blanket key substitution.
Keeping Ctrl useful in terminals and remote sessions
I kept these as selected shortcut mappings. A terminal still needs Ctrl+C to interrupt a running command, so the copy, cut, and paste rules have exceptions for terminal applications.
Remote desktop and virtual-machine applications have exceptions too, and Moonlight is excluded from the mappings. When I'm controlling another computer, I want that computer to receive the keys and handle its own shortcuts.
That is why the setup has application-specific rules as well as the Finder helper. The same physical keyboard ends up doing different jobs, and the profile needs to account for them.
Optional: voice typing with OpenWispr
I also keep an optional patched version of OpenWispr as an alternative to Wispr Flow. It handles speech recognition locally on the Mac. The patch and setup notes live alongside the keyboard configuration.
The shortcut is a double-tap of Ctrl to start dictation, followed by one Ctrl tap to stop and insert the text. I use the right Ctrl key for starting it in my OpenCode workflow. Ordinary combinations such as Ctrl+C and Ctrl+V stay ordinary combinations; they shouldn't accidentally start or finish a recording.
This was another small keyboard detail that took a few adjustments. The first versions needed work on the double-tap timing and on stopping with a single tap. Keeping that gesture out of the way of normal shortcuts matters more to me than having another hotkey to remember.
The Karabiner mappings and Finder helper work independently of it.
Keeping the setup in one place
The GitHub project contains the mappings, helper, and OpenWispr work. It's my personal configuration, so the helper paths and application exceptions are the parts to look at when adapting it to another machine.
Public mappings to start from
If you're putting together a similar setup, there are plenty of shared mappings to build on:
- Karabiner's community rules gallery — browse and import mappings, with the source catalog on GitHub.
- rux616's karabiner-windows-mode — familiar Windows and Linux shortcuts with application exceptions.
- joeytroy's karabiner-windows — a Windows 11 shortcut set for macOS.
When I move back to Windows, I keep reaching for the same keys. That's the part of switching environments I wanted to make easier.
