My Cursor Setup Coming from Neovim
2025-04-11
Things I Missed Most
- Speed
- Minimal
- Vim keybindings
- Lazygit
- Customization
Out of the box, Cursor / VS Code is a way worse UX for my preferences. However, after forcing myself to use Cursor for a few months, I have it in a place where I really enjoy working it.
Speed
Nothing we can do here. Moving on.
Lack of Clutter
Neovim encourages focusing on only one or two things at once and the keybindings are super intuitive to keep your space organized.
While Cursor isn’t as minimal, Zen mode gets pretty close. I do get stuck with 3 panels open at once if I’m not careful, but I made a custom hot key to close all panels.
Vim Keybindings
There is Vim emulator extension for VS Code. It didn’t work out of the box like my Neovim setup, but its pretty configurable and now works great. I detail those settings in: Custom Vim Extension Settings.
Lazygit
Lazygit is a more annoying / slow experience in Cursor, but I was pleasently suprised at how well it works. I use this extension which basically opens in as a tab. I use it for checking out branches, stashing commits, resetting commits, and staging commits.
For everything else like viewing diffs, I use the built in source control panel. I prefer this because its really easy to edit using VS Code’s built in diff editor.
Customizing Cursor
LLMs know a lot about how to customize VS Code / cursor. If you have something that you want to change, you can probably figure it out really quick by using the chat panel to find you the right command or help you write a custom extension.
Settings / Keybindings to try
You can find the two below files by querying the command palette cmd+shift+p
and searching settings
or keybindings
.
keybindings.json
is where you can add your custom keybindings.
settings.json
is where you can add your custom settings.
Custom Vim Extension Settings
When I first switched to Cursor, I added the vim extension. It ended up being super frustrating because it just didn’t work out of the box like my Neovim setup. However, the vim extension holds the spirit of vim much more than I thought it would and is customizable.
Below, is my config. The main one I want to call out as essential is vim.useSystemClipboard
which
binds yank and paste to the system clipboard. This defaulting to false drove me absolutely
insane until I found out it was a setting.
The keybindings will only work if you’re in a file, not when your focus in the ai chat window or the
search panel. This creates some friction. Put the keybindings in your keybindings.json
file if
you want to use them from anywhere.
Note: Cursor Tab is my favorite Cursor feature. I used to bind switching files to tab which I miss,
but its not worth trying to override tab in my opinion. I mostly just use cmd+p
to search for files and switch between them now anyway.
In settings.json
:
{
// Use system clipboard for yank and paste
"vim.useSystemClipboard": true,
"vim.leader": "<space>",
"vim.handleKeys": {
"<C-d>": true // This conflicted with a vs code keybinding. This tells the vim extension to override it.
},
"vim.normalModeKeyBindings": [
{
// This shows the LSP hover info
"before": ["K"],
"commands": ["editor.action.showHover"]
},
{
// This is super helpful for quick refactoring.
"before": ["<leader>", "r", "a"],
"commands": ["editor.action.rename"]
},
// Apps
{
"before": ["<leader>", "l", "g"],
"commands": ["lazygit-vscode.toggle"]
},
]
}
Custom Settings
In settings.json
:
{
"zenMode.restore": true, // This will open Cursor in zen mode if you closed while in zen mode
"zenMode.centerLayout": true, // Personal preference
"zenMode.hideLineNumbers": false, // I like to see line numbers
"zenMode.fullScreen": false, // I use rectangle and don't want to be fullscreen which zen mode does by default
"editor.defaultFormatter": "esbenp.prettier-vscode", // Set this to whatever you use most
"editor.formatOnSave": true,
"lazygit-vscode.toggle": true, // More on the lazygit extension below
"editor.wordWrap": "on",
"editor.wordWrapColumn": 120,
}
Custom Cursor Keybindings
In keybindings.json
:
[
// Window and Tab Management - Sometimes won't be in vim emulator so its in these settings
{
"key": "ctrl+w+v",
"command": "workbench.action.splitEditor"
},
{
"key": "ctrl+h",
// Change focus between split windows
"command": "workbench.action.focusPreviousGroup"
},
{
"key": "ctrl+l",
"command": "workbench.action.focusNextGroup"
},
// Panel Management - These are non-editor panes like the file tree + ai chat.
{
"key": "cmd+shift+e",
// By default, cmd+shift+e only opens the panel and doesn't close :\
"command": "workbench.action.toggleSidebarVisibility",
"when": "explorerViewletVisible"
},
{
"command": "runCommands",
"key": "cmd+shift+h",
"args": {
// Hide all the panels - VS Code gets cluttered really easily.
"commands": [
"aichat.close-sidebar",
"workbench.action.closeSidebar",
"workbench.action.closePanel"
]
}
},
// Cursor
{
"key": "cmd+i",
"command": "composerMode.agent"
},
{
"key": "cmd+l",
"command": "composerMode.chat"
}
// Other
{
"key": "cmd+shift+g",
// I actually really like the VS Code git integration for editing my changes before pushing big commits.
"command": "workbench.view.scm"
},
// Dummy command for testing new actions out since the VS Code / Cursor has intellisense in this file which is helpful for when adding vim keybindings.
{
"key": "cmd+shift+j",
"command": "editor."
}
]
Most Used Hot Keys
cmd+p
- Search filescmd+shift+f
andcmd+f
- Global and local searchcmd+shift+p
- Open command palette. I run commands like restarting the ts server pretty frequently.shift+K
- Show lsp info instead of having to hover over it<leader>ra
- Rename symbolscmd+j
- Open the integrated terminalcmd+i
- Open the AI panel in Agent modecmd+l
- Open the AI panel in Chat Modecmd+n
(In AI Panel) - Start new chat. I prefer shorter chats with a fresh start.cmd+shift+d
- Open the debugger panelcmd+w
andcmd+shift+t
- Close tab and reopen last closed tabctr+o/i
(vim) orctl+-/shift+-
- Go backwards / forwards from last cursor positiongd
(vim) - Go to definition