Illya Moskvin

Making macOS feel more like Windows

Meme of Bugs Bunny saying “no” to the Cmd + C shortcut

In November 2025, I’ll be celebrating my 10-year anniversary as a full-time software developer. Through these 10 years, my work laptop has always been a MacBook Pro. That’s four employers, five MacBook Pros, and counting!

Macs make sense for corpo devs, both from the corpo and the dev side: macOS is Unix-based, but has better support (and MDM) than Linux. I like Macs, and I think they make great development machines.

However, I’ve never used Macs before entering the professional world. To this day, none of my personal devices run macOS. As a result, I’ve always prioritized reducing cognitive friction when switching devices over learning the “macOS way” of doing things.

If you search for “how to make macOS feel more like Windows”, you’re going to find a lot of responses along the lines of “why would you want to” and “just get used to it.”

Well, I’m here to thumb my nose at that notion. I’m living proof that you can make it pretty far in your career as a software engineer who uses MacBooks daily without acquiescing to the Apple way of doing things. Unless, of course, you work at Apple.

Here, I’m going to share some of my personal notes about how I’ve setup my MacBooks to feel more like Windows. This is not a comprehensive guide. This is not “the best way” to do it. This is just some stuff I found helpful.

Grant permissions #

Most of the applications listed here require permissions. Most will prompt you for them on first launch. If you miss the prompt, check the following places:

  1. Settings > Privacy & Security > Accessibility
  2. Settings > Privacy & Security > Input Monitoring
  3. Settings > General > Login Items

Fix the mouse #

Screenshot of Linear Mouse settings

Disable macOS’s mouse acceleration and add support for mouse side buttons.

  1. Install Linear Mouse: https://linearmouse.app
    1. Scrolling > Reverse Scrolling > On
      1. Do this for both vertical and horizontal
      2. Do this for “Apple Internal Keyboard / Trackpad” too
    2. Pointer
      1. Disable pointer acceleration > On
      2. Adjust tracking speed to taste
    3. General > Start at login > On
  2. Install https://github.com/thealpa/SaneSideButtons

Fix the keyboard #

Screenshot of the “Simple Modifications” tab in Karabiner-Elements Settings

Assuming that we are using an external, non-macOS keyboard, where the modifier key order is Ctrl, Cmd (Win), Alt. Let’s rebind the left modifiers as follows:

This makes many shortcuts like Cmd+C remap to Ctrl+C as in Windows. Additionally, let’s make arrow-based navigation match Windows conventions.

Screenshot of the “Complex Modifications” tab in Karabiner-Elements Settings

  1. Install Karabiner-Elements: https://karabiner-elements.pqrs.org/
  2. Misc > Open config folder (~/.config/karabiner)
  3. Replace karabiner.json with this file:
{
  "profiles": [
    {
      "complex_modifications": {
        "rules": [
          {
            "description": "Home + (⇧) => ⌘ + (⇧) + ← (Move cursor to start of line)",
            "manipulators": [
              {
                "from": {
                  "key_code": "home",
                  "modifiers": { "optional": ["shift"] }
                },
                "to": [
                  {
                    "key_code": "left_arrow",
                    "modifiers": ["command"]
                  }
                ],
                "type": "basic"
              }
            ]
          },
          {
            "description": "End + (⇧) => ⌘ + (⇧) + → (Move cursor to end of line)",
            "manipulators": [
              {
                "from": {
                  "key_code": "end",
                  "modifiers": { "optional": ["shift"] }
                },
                "to": [
                  {
                    "key_code": "right_arrow",
                    "modifiers": ["command"]
                  }
                ],
                "type": "basic"
              }
            ]
          },
          {
            "description": "⌘ + (⇧) + Home => ⌘ + (⇧) + ↑ (Move cursor to start of file)",
            "manipulators": [
              {
                "from": {
                  "key_code": "home",
                  "modifiers": {
                    "mandatory": ["command"],
                    "optional": ["shift"]
                  }
                },
                "to": [
                  {
                    "key_code": "up_arrow",
                    "modifiers": ["command"]
                  }
                ],
                "type": "basic"
              }
            ]
          },
          {
            "description": "⌘ + (⇧) + End => ⌘ + (⇧) + ↓ (Move cursor to end of file)",
            "manipulators": [
              {
                "from": {
                  "key_code": "end",
                  "modifiers": {
                    "mandatory": ["command"],
                    "optional": ["shift"]
                  }
                },
                "to": [
                  {
                    "key_code": "down_arrow",
                    "modifiers": ["command"]
                  }
                ],
                "type": "basic"
              }
            ]
          },
          {
            "description": "⌘ + (⇧) + ←/→ => ⌥ + (⇧) + ←/→ (Move cursor one word)",
            "manipulators": [
              {
                "from": {
                  "key_code": "left_arrow",
                  "modifiers": {
                    "mandatory": ["command"],
                    "optional": ["shift"]
                  }
                },
                "to": [
                  {
                    "key_code": "left_arrow",
                    "modifiers": ["left_option"]
                  }
                ],
                "type": "basic"
              },
              {
                "from": {
                  "key_code": "right_arrow",
                  "modifiers": {
                    "mandatory": ["command"],
                    "optional": ["shift"]
                  }
                },
                "to": [
                  {
                    "key_code": "right_arrow",
                    "modifiers": ["left_option"]
                  }
                ],
                "type": "basic"
              }
            ]
          },
          {
            "description": "⌘ + (⇧) + ↑/↓ => (⇧) + ↑/↓ (Disable jump to start/end of file)",
            "manipulators": [
              {
                "from": {
                  "key_code": "up_arrow",
                  "modifiers": {
                    "mandatory": ["command"],
                    "optional": ["shift"]
                  }
                },
                "to": [{ "key_code": "up_arrow" }],
                "type": "basic"
              },
              {
                "from": {
                  "key_code": "down_arrow",
                  "modifiers": {
                    "mandatory": ["command"],
                    "optional": ["shift"]
                  }
                },
                "to": [
                  {
                    "key_code": "down_arrow",
                    "modifiers": []
                  }
                ],
                "type": "basic"
              }
            ]
          },
          {
            "description": "⌘ + ⇧ + ⎋ => Open Activity Monitor",
            "manipulators": [
              {
                "from": {
                  "key_code": "escape",
                  "modifiers": { "mandatory": ["command", "shift"] }
                },
                "to": [{ "shell_command": "open -a 'Activity Monitor.app'" }],
                "type": "basic"
              }
            ]
          }
        ]
      },
      "fn_function_keys": [
        {
          "from": { "key_code": "f5" },
          "to": [{ "key_code": "f5" }]
        },
        {
          "from": { "key_code": "f7" },
          "to": [{ "key_code": "f7" }]
        },
        {
          "from": { "key_code": "f8" },
          "to": [{ "key_code": "f8" }]
        },
        {
          "from": { "key_code": "f9" },
          "to": [{ "key_code": "f9" }]
        },
        {
          "from": { "key_code": "f10" },
          "to": [{ "key_code": "f10" }]
        }
      ],
      "name": "Default profile",
      "selected": true,
      "simple_modifications": [
        {
          "from": { "key_code": "left_command" },
          "to": [{ "key_code": "left_option" }]
        },
        {
          "from": { "key_code": "left_control" },
          "to": [{ "key_code": "left_command" }]
        },
        {
          "from": { "key_code": "left_option" },
          "to": [{ "key_code": "left_control" }]
        }
      ],
      "virtual_hid_keyboard": { "keyboard_type_v2": "ansi" }
    }
  ]
}

You might need to add conditions to each entry to disable the remap in specific applications, e.g. iTerm or Remote Desktop. See this mapping for an example.

Also, go to “Settings > Keyboard > Text Input > Input Sources > Edit…” and disable all the nonsense text replacements, like “Add period with double-space” and “Use smart quotes and dashes”. Those will mess with you when you are writing code.

Screenshot of macOS keyboard input settings

Window management #

Screenshot of shortcuts in Rectangle settings

Let’s make Alt-Tab work better and enable window snapping, similar to FancyZones.

  1. Install Alt Tab: https://alt-tab-macos.netlify.app/
    1. Controls > Shortcut 1: ^ + ⇥ (Alt)
    2. Controls > Shortcut 2: ⌘ + ⇥ (Ctrl)
    3. Appearance > Size: Medium
    4. Policies > Auto-install updates periodically
  2. Install Rectangle: https://rectangleapp.com/
    1. I use the following for a single ultrawide monitor:
      1. Ctrl + Win + ↑ = Maximize
      2. Ctrl + Win + Nav Keys = Sixths
      3. Ctrl + Win + ←/↓/→ = Thirds
      4. Ctrl + Win + Alt + ←/↓/→ = Halves
      5. Win + Alt + ←/→ = Fourths (First/Last)
    2. To do the same, import the following config:
{
  "bundleId" : "com.knollsoft.Rectangle",
  "defaults" : {
    "allowAnyShortcut" : {
      "bool" : true
    },
    "almostMaximizeHeight" : {
      "float" : 0
    },
    "almostMaximizeWidth" : {
      "float" : 0
    },
    "alternateDefaultShortcuts" : {
      "bool" : true
    },
    "altThirdCycle" : {
      "int" : 0
    },
    "alwaysAccountForStage" : {
      "int" : 0
    },
    "applyGapsToMaximize" : {
      "int" : 0
    },
    "applyGapsToMaximizeHeight" : {
      "int" : 0
    },
    "attemptMatchOnNextPrevDisplay" : {
      "int" : 0
    },
    "autoMaximize" : {
      "int" : 0
    },
    "cascadeAllDeltaSize" : {
      "float" : 30
    },
    "centeredDirectionalMove" : {
      "int" : 0
    },
    "centerHalfCycles" : {
      "int" : 0
    },
    "cornerSnapAreaSize" : {
      "float" : 20
    },
    "curtainChangeSize" : {
      "int" : 0
    },
    "cycleSizesIsChanged" : {
      "bool" : true
    },
    "disabledApps" : {

    },
    "doubleClickTitleBar" : {
      "int" : 0
    },
    "doubleClickTitleBarIgnoredApps" : {

    },
    "doubleClickTitleBarRestore" : {
      "int" : 0
    },
    "dragFromStage" : {
      "int" : 0
    },
    "enhancedUI" : {
      "int" : 1
    },
    "footprintAlpha" : {
      "float" : 0.3
    },
    "footprintAnimationDurationMultiplier" : {
      "float" : 0
    },
    "footprintBorderWidth" : {
      "float" : 2
    },
    "footprintColor" : {

    },
    "footprintFade" : {
      "int" : 0
    },
    "fullIgnoreBundleIds" : {

    },
    "gapSize" : {
      "float" : 0
    },
    "hapticFeedbackOnSnap" : {
      "int" : 0
    },
    "hideMenubarIcon" : {
      "bool" : false
    },
    "ignoreDragSnapToo" : {
      "int" : 0
    },
    "ignoredSnapAreas" : {
      "int" : 0
    },
    "landscapeSnapAreas" : {
      "string" : "[6,{\"action\":13},8,{\"action\":14},5,{\"compound\":-3},1,{\"action\":15},4,{\"compound\":-2},7,{\"compound\":-4},3,{\"action\":16},2,{\"action\":2}]"
    },
    "launchOnLogin" : {
      "bool" : true
    },
    "minimumWindowHeight" : {
      "float" : 0
    },
    "minimumWindowWidth" : {
      "float" : 0
    },
    "missionControlDragging" : {
      "int" : 0
    },
    "missionControlDraggingAllowedOffscreenDistance" : {
      "float" : 25
    },
    "missionControlDraggingDisallowedDuration" : {
      "int" : 250
    },
    "moveCursor" : {
      "int" : 0
    },
    "moveCursorAcrossDisplays" : {
      "int" : 0
    },
    "notifiedOfProblemApps" : {
      "bool" : false
    },
    "obtainWindowOnClick" : {
      "int" : 0
    },
    "portraitSnapAreas" : {

    },
    "relaunchOpensMenu" : {
      "bool" : false
    },
    "resizeOnDirectionalMove" : {
      "bool" : false
    },
    "screenEdgeGapBottom" : {
      "float" : 0
    },
    "screenEdgeGapLeft" : {
      "float" : 0
    },
    "screenEdgeGapRight" : {
      "float" : 0
    },
    "screenEdgeGapsOnMainScreenOnly" : {
      "bool" : false
    },
    "screenEdgeGapTop" : {
      "float" : 0
    },
    "screenEdgeGapTopNotch" : {
      "float" : 0
    },
    "selectedCycleSizes" : {
      "int" : 2
    },
    "shortEdgeSnapAreaSize" : {
      "float" : 145
    },
    "showAllActionsInMenu" : {
      "int" : 0
    },
    "sixthsSnapArea" : {
      "int" : 0
    },
    "sizeOffset" : {
      "float" : 0
    },
    "snapEdgeMarginBottom" : {
      "float" : 5
    },
    "snapEdgeMarginLeft" : {
      "float" : 5
    },
    "snapEdgeMarginRight" : {
      "float" : 5
    },
    "snapEdgeMarginTop" : {
      "float" : 5
    },
    "snapModifiers" : {
      "int" : 0
    },
    "specifiedHeight" : {
      "float" : 1050
    },
    "specifiedWidth" : {
      "float" : 1680
    },
    "stageSize" : {
      "float" : 190
    },
    "subsequentExecutionMode" : {
      "int" : 0
    },
    "SUEnableAutomaticChecks" : {
      "bool" : false
    },
    "systemWideMouseDown" : {
      "int" : 0
    },
    "systemWideMouseDownApps" : {

    },
    "todo" : {
      "int" : 0
    },
    "todoApplication" : {

    },
    "todoMode" : {
      "bool" : false
    },
    "todoSidebarSide" : {
      "int" : 1
    },
    "todoSidebarWidth" : {
      "float" : 400
    },
    "traverseSingleScreen" : {
      "int" : 0
    },
    "unsnapRestore" : {
      "int" : 0
    },
    "windowSnapping" : {
      "int" : 0
    }
  },
  "shortcuts" : {
    "bottomCenterSixth" : {
      "keyCode" : 119,
      "modifierFlags" : 1572864
    },
    "bottomLeftSixth" : {
      "keyCode" : 117,
      "modifierFlags" : 1572864
    },
    "bottomRightSixth" : {
      "keyCode" : 121,
      "modifierFlags" : 1572864
    },
    "centerHalf" : {
      "keyCode" : 125,
      "modifierFlags" : 1835008
    },
    "centerThird" : {
      "keyCode" : 125,
      "modifierFlags" : 1572864
    },
    "firstFourth" : {
      "keyCode" : 123,
      "modifierFlags" : 786432
    },
    "firstThird" : {
      "keyCode" : 123,
      "modifierFlags" : 1572864
    },
    "lastFourth" : {
      "keyCode" : 124,
      "modifierFlags" : 786432
    },
    "lastThird" : {
      "keyCode" : 124,
      "modifierFlags" : 1572864
    },
    "leftHalf" : {
      "keyCode" : 123,
      "modifierFlags" : 1835008
    },
    "maximize" : {
      "keyCode" : 126,
      "modifierFlags" : 1572864
    },
    "reflowTodo" : {
      "keyCode" : 45,
      "modifierFlags" : 786432
    },
    "rightHalf" : {
      "keyCode" : 124,
      "modifierFlags" : 1835008
    },
    "toggleTodo" : {
      "keyCode" : 11,
      "modifierFlags" : 786432
    },
    "topCenterSixth" : {
      "keyCode" : 115,
      "modifierFlags" : 1572864
    },
    "topLeftSixth" : {
      "keyCode" : 114,
      "modifierFlags" : 1572864
    },
    "topRightSixth" : {
      "keyCode" : 116,
      "modifierFlags" : 1572864
    }
  },
  "version" : "90"
}

That’s it! Nothing else in my macOS setup is Windows inspired. Maybe someone will find this helpful. I know I’ll be happy to have these notes in order next time I’m setting up a MacBook. Then again, I’ll be making the jump to Linux on my personal devices soon, so maybe I’ll have a whole new muscle memory target to aim for by then.