The Problem Nobody Talks About
Cursor is a great editor. The AI features are genuinely impressive, and it's been a go-to choice for a lot of developers over the past couple of years.
But there are plenty of reasons you might want to switch back to VS Code — team standardization, extension compatibility, personal preference, or just wanting a cleaner setup. The problem? Moving back is surprisingly painful.
You open VS Code and everything feels wrong. Your theme is gone. Your keybindings don't work. Your snippets aren't there. And you're staring down 20+ extensions you need to reinstall one by one.
So I built a script that does it all in one command.
⚡ The Fix: One Command
bash <(curl -fsSL https://raw.githubusercontent.com/yahav10/cursor-to-vscode/main/cursor_to_vscode.sh)
That's it. Run this in your terminal and within a minute your VS Code will feel exactly like your Cursor setup.
🔀 What Gets Migrated
Here's everything the script moves over automatically:
| What | How |
|---|---|
| ⚙️ Settings | Copies settings.json and strips out Cursor-specific keys so VS Code stays clean |
| ⌨️ Keybindings | Copies keybindings.json as-is — the format is identical between the two editors |
| ✂️ Code snippets | Copies all your custom snippet files |
| 🧩 Extensions | Reads your full Cursor extension list and installs each one into VS Code |
| 💾 Backups | Every VS Code file that gets overwritten is backed up as .bak first |
🖥️ What It Looks Like in Your Terminal
The script is designed to keep you informed at every step. Here's a real example of the output:
╔══════════════════════════════════════════════════╗
║ Cursor → VS Code Migration • macOS ║
╚══════════════════════════════════════════════════╝
Checking prerequisites...
✔ Cursor config → ~/Library/Application Support/Cursor/User
✔ VS Code config → ~/Library/Application Support/Code/User
[1/4] Copying settings.json
→ Backed up existing settings → settings.json.bak
✔ settings.json copied (4 Cursor-specific key(s) stripped)
[2/4] Copying keybindings.json
✔ keybindings.json copied
[3/4] Copying code snippets
✔ 3 snippet file(s) copied
[4/4] Re-installing extensions into VS Code
→ Found 12 extension(s) in Cursor.
esbenp.prettier-vscode ✔ installed
dbaeumer.vscode-eslint ✔ installed
eamodio.gitlens ✔ installed
...
╔══════════════════════════════════════════════════╗
║ Summary ║
╚══════════════════════════════════════════════════╝
Config files
✔ Successes 3
Extensions
✔ Installed 12 / 12
Migration complete! Open VS Code and enjoy your familiar setup.
Step counter, color-coded results, a live extension install feed, and a full summary at the end. You always know what's happening and what worked.
🔧 One Step Before You Run It
For the extension migration to work, both editor CLIs need to be registered in your terminal. It's a one-time setup.
In Cursor: Cmd+Shift+P → Install 'cursor' command in PATH
In VS Code: Cmd+Shift+P → Install 'code' command in PATH
Verify they're ready:
cursor --version && code --version
If the CLIs aren't set up when you run the script, it'll skip extensions and print exact instructions to fix it — then you can re-run and it'll pick up where it left off.
🔒 It's Safe to Run
A few things the script never does:
- It never deletes or modifies anything in Cursor
- It never overwrites a VS Code file without backing it up first
- It's safe to run multiple times
If something doesn't look right after migration, restoring is a single command:
cp ~/Library/Application\ Support/Code/User/settings.json.bak \
~/Library/Application\ Support/Code/User/settings.json
🧠 One Interesting Challenge: The Settings File
The most non-trivial part of this migration is settings.json. Since Cursor is a VS Code fork, it shares the same format — but it adds its own keys like cursor.general.gitGraphEnabled or aipopup.enabled that VS Code doesn't understand.
Copying the file as-is would leave a bunch of noise in your VS Code settings. So the script uses Python to parse the JSON and strip any key that starts with a known Cursor prefix before writing it out:
CURSOR_PREFIXES = ("cursor.", "aipopup.", "cursorprediction.", "cursorSonnet.")
removed = [k for k in list(settings) if k.startswith(CURSOR_PREFIXES)]
for k in removed:
del settings[k]
It also gracefully handles malformed JSON (a trailing comma in settings is more common than you'd think). If the file can't be parsed, it copies it as-is and warns you instead of crashing.
📦 Get It
# Run directly
bash <(curl -fsSL https://raw.githubusercontent.com/yahav10/cursor-to-vscode/main/cursor_to_vscode.sh)
# Or clone it
git clone https://github.com/yahav10/cursor-to-vscode.git
The full source is on GitHub: yahav10/cursor-to-vscode
If this saves you the 30 minutes of manual work it used to take me, drop a ⭐ on the repo. And if you run into issues or want to add Linux/Windows support, PRs are very welcome.
Have you switched between Cursor and VS Code? What was the biggest pain point for you? Let me know in the comments 👇
Top comments (0)