devAlice
← Mac

VS Code vs Cursor on Mac — Use Both with Synced Settings

Practical setup for running VS Code and Cursor side-by-side on macOS while managing settings/extensions/keymaps from a single source of truth.

VS Code and Cursor are both based on VS Code OSS, so settings.json is ~90% compatible and keybindings are 100% compatible. Left alone, though, each ends up with its own scattered config. The cleanest pattern is VS Code as master, Cursor as mirror.

This guide targets macOS 14+ / VS Code 1.95+ / Cursor 0.45+. It is a 30‑minute setup after Mac initial setup to run both IDEs cleanly.

TL;DR

  1. VS Code = Settings Sync (GitHub account) for cloud sync — master
  2. Cursor mirrors VS Code's settings.json / keybindings.json via symlink or copy script
  3. Extensions: pipe code --install-extension into cursor --install-extension
  4. Keybindings: with Cmd+K Cmd+S you can keep the same map on both
  5. Only Cursor's AI-specific bindings stay Cursor-only (e.g., Cmd+L chat, Cmd+K inline edit)

Prerequisites

  • macOS 14+, Homebrew installed — Mac initial setup
  • GitHub account (for VS Code Settings Sync)

1. Install VS Code + Enable Settings Sync — 10 min

1.1 Install

brew install --cask visual-studio-code

Register the code CLI in PATH (open VS Code, Cmd+Shift+P → "Shell Command: Install 'code' command in PATH").

1.2 Turn on Settings Sync — the crucial step

VS Code bottom-left gear → Backup and Sync Settings... → sign in with GitHub.

Sync items (check everything):

  • ✅ Settings
  • ✅ Keyboard Shortcuts
  • ✅ Extensions
  • ✅ User Snippets
  • ✅ UI State
  • ✅ Tasks
  • ✅ Profiles

After this, a fresh Mac restores the full environment in ~5 minutes — install VS Code, sign in with the same GitHub, done.

1.3 macOS settings paths

~/Library/Application Support/Code/User/
├── settings.json       # master settings
├── keybindings.json    # master keybindings
└── snippets/           # user snippets

Cursor mirrors these paths.


2. Install Cursor + Mirror the Master — 10 min

2.1 Install

brew install --cask cursor

Register the cursor CLI (open Cursor, Cmd+Shift+P → "Shell Command: Install 'cursor' command in PATH").

2.2 Cursor's settings paths

~/Library/Application Support/Cursor/User/
├── settings.json
├── keybindings.json
└── snippets/

Same JSON format as VS Code, which makes sync trivial.

2.3 Option A — Symlink (cleanest)

Mirror VS Code's config into Cursor. Edits in either side reflect instantly.

# With Cursor quit
cd "$HOME/Library/Application Support/Cursor/User"
# Back up existing files
[ -f settings.json ] && mv settings.json settings.json.bak
[ -f keybindings.json ] && mv keybindings.json keybindings.json.bak
[ -d snippets ] && mv snippets snippets.bak
 
# Symlink to VS Code settings
ln -s "$HOME/Library/Application Support/Code/User/settings.json" settings.json
ln -s "$HOME/Library/Application Support/Code/User/keybindings.json" keybindings.json
ln -s "$HOME/Library/Application Support/Code/User/snippets" snippets

⚠️ Caveat: When Settings Sync rewrites VS Code's file, the inode can change and your symlink breaks. Re-run ln -s, or switch to Option B.

2.4 Option B — Copy script (more stable)

Instead of links, run a sync command occasionally.

# ~/bin/sync-cursor-from-vscode.sh
#!/usr/bin/env bash
set -euo pipefail
SRC="$HOME/Library/Application Support/Code/User"
DST="$HOME/Library/Application Support/Cursor/User"
mkdir -p "$DST"
cp "$SRC/settings.json"     "$DST/settings.json"
cp "$SRC/keybindings.json"  "$DST/keybindings.json"
rsync -a --delete "$SRC/snippets/" "$DST/snippets/"
echo "✓ Cursor synced from VS Code"

Make executable + alias:

chmod +x ~/bin/sync-cursor-from-vscode.sh
echo 'alias sync-cursor=~/bin/sync-cursor-from-vscode.sh' >> ~/.zshrc

Run sync-cursor after a settings change. (Or schedule daily with launchd — beyond this guide.)


3. Sync Extensions — 5 min

VS Code is automatic via Settings Sync. Cursor needs a one-time mirror.

3.1 Export VS Code extensions

code --list-extensions > ~/code-extensions.txt

3.2 Install in Cursor in one shot

cat ~/code-extensions.txt | xargs -n1 cursor --install-extension

⚠️ Cursor uses Open VSX, not VS Code's marketplace. Some MS-proprietary extensions (C/C++, Remote-SSH) need a Cursor fork or alternative. Failures are OK — skip them.

3.3 Policy for future installs

  • AI-agnostic extensions → install in VS Code → Settings Sync auto + occasional Cursor mirror
  • AI-related (Cursor's own AI) → Cursor only, no mirror to VS Code
  • Code analysis / refactoring / language servers → install in VS Code, mirror to Cursor

4. Keybindings — Mac Standard + IDE Shared + Cursor-only

4.1 Mac standard shortcuts (automatic in both)

KeyAction
Cmd+PQuick file open
Cmd+Shift+PCommand Palette
Cmd+BToggle sidebar
Cmd+JToggle panel (terminal)
Cmd+TQuick symbol open
Cmd+\Split editor
Cmd+/Toggle line comment

4.2 Recommended additions — keybindings.json

// keybindings.json
[
  // New terminal
  {
    "key": "cmd+shift+t",
    "command": "workbench.action.terminal.new",
    "when": "terminalProcessSupported"
  },
  // Focus sidebar: explorer
  {
    "key": "cmd+1",
    "command": "workbench.view.explorer"
  },
  // Focus sidebar: search
  {
    "key": "cmd+2",
    "command": "workbench.view.search"
  },
  // Focus sidebar: git
  {
    "key": "cmd+3",
    "command": "workbench.view.scm"
  },
  // Next / previous tab
  { "key": "cmd+alt+right", "command": "workbench.action.nextEditor" },
  { "key": "cmd+alt+left",  "command": "workbench.action.previousEditor" }
]

4.3 Cursor-only keys (leave alone)

KeyCursor action
Cmd+KInline AI edit
Cmd+LAI chat panel
Cmd+IWorkspace chat (Composer)
TabAccept AI completion

These may clash with VS Code defaults — keep them Cursor-only and remap VS Code's variants.


5. Recommended settings.json Keys — Shared Across Both

Minimum changes for maximum impact:

// settings.json
{
  // Editor
  "editor.fontFamily": "'JetBrains Mono', 'D2Coding', monospace",
  "editor.fontSize": 14,
  "editor.fontLigatures": true,
  "editor.lineHeight": 1.6,
  "editor.tabSize": 2,
  "editor.detectIndentation": true,
  "editor.formatOnSave": true,
  "editor.codeActionsOnSave": {
    "source.organizeImports": "explicit",
    "source.fixAll.eslint": "explicit"
  },
  "editor.bracketPairColorization.enabled": true,
  "editor.guides.bracketPairs": "active",
  "editor.minimap.enabled": false,
 
  // Files
  "files.trimTrailingWhitespace": true,
  "files.insertFinalNewline": true,
  "files.eol": "\n",
  "files.exclude": {
    "**/.DS_Store": true,
    "**/.git": false,
    "**/node_modules": true
  },
 
  // Workbench
  "workbench.editor.enablePreview": false,
  "workbench.startupEditor": "none",
 
  // Terminal
  "terminal.integrated.fontFamily": "'JetBrains Mono', monospace",
  "terminal.integrated.fontSize": 13,
  "terminal.integrated.defaultProfile.osx": "zsh"
}

Install the font: brew install --cask font-jetbrains-mono.


6. Practical Workflow — Which IDE for What

TaskIDEWhy
Daily codingVS CodeLightweight, stable without AI
AI pair programmingCursorComposer + Tab completion
Notebooks (.ipynb)VS CodeMost stable Jupyter integration
Remote-SSH / Dev ContainersVS CodeStable official extensions
Large LLM-driven refactorCursorComposer multi-file edits
Quick writing / MarkdownEitherCursor adds AI review synergy

Workspace split recommended:

  • VS Code for ~/work — company projects
  • Cursor for ~/personal — personal projects + AI experiments

Each IDE auto-reopens the last folder, so contexts stay separated naturally.


7. Troubleshooting

Settings Sync conflicts

If two machines push at the same time, you'll see a conflict prompt. Pick Replace Local or Replace Remote.

Cursor overwrites settings.json

While using Option A, a Cursor update may break the symlink. Re-run ln -s. If this is frequent, switch to Option B.

cursor CLI not found

Open Cursor → Cmd+Shift+P → "Shell Command: Install 'cursor' command in PATH" → new terminal.

Some extensions fail to install in Cursor

Not on Open VSX. Find an alternative (search Open VSX) or keep that feature in VS Code only.


Next Steps

References

Changelog

  • 2026-05-12 — Initial draft (devAlice M2 seed expansion)

Comments