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.
I believe the VS Code master / Cursor mirror pattern is worth the one-time setup cost, because it means you only ever configure one IDE and the other stays in sync. Not because Cursor's own settings system is bad, but rather because maintaining two diverged configurations is a slow-accumulating tax — and the synced setup eliminates that tax at its source.
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
- VS Code = Settings Sync (GitHub account) for cloud sync — master
- Cursor mirrors VS Code's
settings.json/keybindings.jsonvia symlink or copy script - Extensions: pipe
code --install-extensionintocursor --install-extension - Keybindings: with
Cmd+K Cmd+Syou can keep the same map on both - Only Cursor's AI-specific bindings stay Cursor-only (e.g.,
Cmd+Lchat,Cmd+Kinline 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-codeRegister 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 cursorRegister 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' >> ~/.zshrcRun 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.txt3.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)
| Key | Action |
|---|---|
Cmd+P | Quick file open |
Cmd+Shift+P | Command Palette |
Cmd+B | Toggle sidebar |
Cmd+J | Toggle panel (terminal) |
Cmd+T | Quick 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)
| Key | Cursor action |
|---|---|
Cmd+K | Inline AI edit |
Cmd+L | AI chat panel |
Cmd+I | Workspace chat (Composer) |
Tab | Accept 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
| Task | IDE | Why |
|---|---|---|
| Daily coding | VS Code | Lightweight, stable without AI |
| AI pair programming | Cursor | Composer + Tab completion |
Notebooks (.ipynb) | VS Code | Most stable Jupyter integration |
| Remote-SSH / Dev Containers | VS Code | Stable official extensions |
| Large LLM-driven refactor | Cursor | Composer multi-file edits |
| Quick writing / Markdown | Either | Cursor 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
- Mac initial setup — Homebrew, SSH, gh
- Mac dev toolchain (mise) — Node/Python/Go version management
- Claude Code setup — terminal-native AI pair
- Cursor setup deep dive — Cursor rules, MCP, Composer patterns
References
- VS Code Settings Sync
- Open VSX Registry — Cursor's marketplace
- Cursor Docs
Changelog
- 2026-05-12 — Initial draft (devAlice M2 seed expansion)
Keep reading
- Mac backups — Time Machine + cloud + encrypted external SSD
Time Machine setup, Backblaze/iCloud cloud combo, encrypted external SSDs, and four real recovery scenarios.
- Docker on Mac — Docker Desktop vs OrbStack vs colima + Apple Silicon setup
Comparing three container runtimes on Apple Silicon Mac. License, performance, RAM usage, and compatibility — pick the right one for your situation.
- macOS security basics — FileVault · Firewall · Gatekeeper · XProtect
The four security features to enable right after unboxing a Mac. How disk encryption, firewall, app validation, and malware quarantine work — and how to set them up.