Skip to content

Instantly share code, notes, and snippets.

@shekohex
Created December 3, 2025 11:48
Show Gist options
  • Select an option

  • Save shekohex/89bb3f0da2d84ba1d85547e321c0ce40 to your computer and use it in GitHub Desktop.

Select an option

Save shekohex/89bb3f0da2d84ba1d85547e321c0ce40 to your computer and use it in GitHub Desktop.
Windsurf settings and keybindings with Vim leader chords and Zed-like mappings
// Place your key bindings in this file to overwrite the defaults
[
{
"key": "ctrl+w",
"command": "workbench.action.closeActiveEditor"
},
{
"key": "ctrl+w",
"command": "workbench.action.closePanel",
"when": "panelFocus"
},
{
"key": "shift+k",
"command": "editor.action.showHover",
"when": "editorTextFocus && vim.mode != 'insert'"
},
{
"key": "space c f",
"command": "editor.action.formatDocument",
"when": "editorTextFocus && vim.mode == 'normal'"
},
{
"key": "space c a",
"command": "editor.action.quickFix",
"when": "editorTextFocus && vim.mode == 'normal'"
},
{
"key": "g r",
"command": "editor.action.referenceSearch.trigger",
"when": "editorTextFocus && vim.mode != 'insert'"
},
{
"key": "g d",
"command": "editor.action.revealDefinition",
"when": "editorTextFocus && vim.mode != 'insert'"
},
{
"key": "g i",
"command": "editor.action.goToImplementation",
"when": "editorTextFocus && vim.mode != 'insert'"
},
{
"key": "g t",
"command": "editor.action.goToTypeDefinition",
"when": "editorTextFocus && vim.mode != 'insert'"
},
{
"key": "g k",
"command": "editor.action.triggerParameterHints",
"when": "editorTextFocus && vim.mode != 'insert'"
},
{
"key": "[ d",
"command": "editor.action.marker.prev",
"when": "editorTextFocus && vim.mode != 'insert'"
},
{
"key": "] d",
"command": "editor.action.marker.next",
"when": "editorTextFocus && vim.mode != 'insert'"
},
{
"key": "g n n",
"command": "expandRegion.expand",
"when": "editorTextFocus && vim.mode != 'insert'"
},
{
"key": "g r p",
"command": "expandRegion.shrink",
"when": "editorTextFocus && vim.mode != 'insert'"
},
{
"key": "space f",
"command": "workbench.action.quickOpen",
"when": "!inputFocus"
},
{
"key": "space /",
"command": "workbench.action.findInFiles",
"when": "!inputFocus"
},
{
"key": "space o",
"command": "workbench.action.showAllEditors",
"when": "!inputFocus"
},
{
"key": "space e",
"command": "workbench.action.toggleSidebarVisibility",
"when": "!inputFocus"
},
{
"key": "n",
"command": "editor.action.nextMatchFindAction",
"when": "editorFocus && findInputFocussed"
},
{
"key": "shift+n",
"command": "editor.action.previousMatchFindAction",
"when": "editorFocus && findInputFocussed"
},
{
"key": "space t",
"command": "workbench.action.terminal.new",
"when": "!inputFocus"
},
{
"key": "space s s",
"command": "workbench.action.showAllSymbols",
"when": "!inputFocus"
},
{
"key": "shift+j",
"command": "editor.action.moveLinesDownAction",
"when": "editorTextFocus && vim.mode == 'visual'"
},
{
"key": "shift+k",
"command": "editor.action.moveLinesUpAction",
"when": "editorTextFocus && vim.mode == 'visual'"
},
{
"key": "ctrl+h",
"command": "workbench.action.focusLeftGroup"
},
{
"key": "ctrl+l",
"command": "workbench.action.focusRightGroup"
},
{
"key": "ctrl+k",
"command": "workbench.action.focusAboveGroup"
},
{
"key": "ctrl+j",
"command": "workbench.action.focusBelowGroup"
},
{
"key": "cmd+b",
"command": "workbench.action.toggleSidebarVisibility"
},
{
"key": "ctrl+b",
"command": "workbench.action.toggleActivityBarVisibility"
},
{
"key": "ctrl+n",
"command": "explorer.newFile",
"when": "!editorFocus"
},
{
"key": "ctrl+shift+n",
"command": "explorer.newFolder",
"when": "!editorFocus"
},
{
"key": "Enter",
"command": "rust-analyzer.onEnter",
"when": "editorTextFocus && !suggestWidgetVisible && editorLangId == rust && vim.mode == 'Insert'"
}
]
{
"$schema": "vscode://schemas/settings/user",
"[dart]": {
"editor.formatOnSave": true,
"editor.formatOnType": true,
"editor.rulers": [80],
"editor.selectionHighlight": false,
"editor.suggest.snippetsPreventQuickSuggestions": false,
"editor.suggestSelection": "first",
"editor.tabCompletion": "onlySnippets",
"editor.wordBasedSuggestions": "off"
},
"[handlebars]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[html]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[jsonc]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[python]": {
"editor.codeActionsOnSave": {
"source.fixAll": "explicit",
"source.organizeImports": "explicit"
},
"editor.defaultFormatter": "charliermarsh.ruff",
"editor.formatOnSave": true
},
"[typescript]": {
"editor.codeActionsOnSave": {
"source.fixAll": "explicit",
"source.fixAll.stylelint": "explicit",
"source.organizeImports": "explicit"
},
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnPaste": true
},
"[typescriptreact]": {
"editor.codeActionsOnSave": {
"source.fixAll": "explicit",
"source.fixAll.stylelint": "explicit",
"source.organizeImports": "explicit"
},
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnPaste": true
},
"[vue]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"animations.Active": "None",
"animations.Command-Palette": "Fade",
"animations.CursorAnimation": true,
"animations.Default-Duration": 200,
"animations.Install-Method": "Custom UI Style",
"animations.UseCursorColorForCursorAnimation": true,
"beancountLangServer.journalFile": "./main.txt",
"catppuccin.accentColor": "teal",
"catppuccin.extraBordersEnabled": false,
"chat.agent.enabled": true,
"chat.agent.maxRequests": 30,
"chat.commandCenter.enabled": false,
"chat.promptFiles": true,
"custom-ui-style.electron": {
"frame": false,
"transparent": true,
"vibrancy": "fullscreen-ui",
"visualEffectState": "active"
},
"custom-ui-style.external.imports": [
"file://${userHome}/.vscode/extensions/brandonkirbyson.vscode-animations-2.0.7/dist/updateHandler.js"
],
"custom-ui-style.font.monospace": "'Maple Mono NF'",
"custom-ui-style.font.sansSerif": "'Maple Mono NF'",
"custom-ui-style.preferRestart": true,
"custom-ui-style.stylesheet": {
".cdr": {
"border-radius": "3px"
},
".decorationsOverviewRuler": {
"display": "none !important"
},
".overlayWidgets .editorPlaceholder": {
"line-height": "unset !important"
},
".quick-input-widget": {
"top": "25vh !important"
},
"span:not([class*='dyn-rule'])+span[class*='dyn-rule']": {
"border-bottom-left-radius": "3px",
"border-top-left-radius": "3px"
},
"span[class*='dyn-rule']:has(+span:not([class*='dyn-rule']))": {
"border-bottom-right-radius": "3px",
"border-top-right-radius": "3px"
}
},
"custom-ui-style.webview.stylesheet": {
".editor-group-watermark": {
"font-size": "15px !important"
},
".filematch .monaco-count-badge": "padding: 5px 6px 0 6px !important",
".filematch .monaco-icon-label:before, .custom-list-row.results .monaco-list-row .monaco-icon-label:before": "background-position: 0 bottom !important",
".inline-tabs-placeholder": "display: none !important;",
".monaco-editor .cursor": "background: linear-gradient(to bottom, #00FF00, #00FF00) !important; color: #161616 !important",
".monaco-editor .scroll-decoration": "display: none !important",
".monaco-hover": "border: 1px solid #007ACC !important;",
".monaco-scrollable-element > .shadow.top": "display: none !important",
".monaco-workbench .monaco-list:not(.element-focused):focus:before": "outline: none !important",
".panel .composite.title": "visibility: hidden !important",
".quick-input-list-row div": "display: flex !important; align-items: center !important",
".quick-input-widget": {
"background-color": "rgb(30, 30, 30) !important",
"border": "1px solid #007ACC !important",
"border-radius": "10px !important",
"left": "41% !important",
"padding": "15px !important",
"top": "250px !important",
"width": "900px !important"
},
".quick-input-widget .monaco-inputbox": {
"border-radius": "5px!important",
"padding": "10px !important"
},
".quick-input-widget .monaco-list-row": "position:static!important;border-bottom: 1px solid #333942;padding:5px!important;height:auto!important;",
".quick-input-widget .monaco-list-rows": "top: 0 !important;max-height:670px;min-height:300px;",
".quick-input-widget .quick-input-header": "padding:0px!important;margin-bottom:10px;",
".quick-input-widget .quick-input-list .quick-input-list-entry.quick-input-list-separator-border": "border-top-width:0px!important;",
".quick-input-widget .quick-input-list-entry": "position:relative;padding:0 5px 0px 15px;",
".quick-input-widget .quick-input-list-entry .codicon[class*=codicon-]": "font-size:12px;",
".quick-input-widget.show-file-icons, .editor-widget.find-widget": "box-shadow: none !important",
".sidebar": "border: none !important",
".sidebar .title-label": "padding: 0 !important",
".sidebar .title-label h2": "line-height: 2.8 !important",
".title-actions": "display: none !important",
".title.show-file-icons .label-container .monaco-icon-label.file-icon": "padding-bottom: 6px !important",
".tree": "border: 1px solid #007ACC !important;"
},
"dart.debugExternalPackageLibraries": true,
"dart.debugSdkLibraries": false,
"debug.confirmOnExit": "always",
"debug.inlineValues": "auto",
"diffEditor.codeLens": true,
"dotenv.enableAutocloaking": false,
"editor.accessibilityPageSize": 5,
"editor.bracketPairColorization.enabled": true,
"editor.cursorWidth": 5,
"editor.fastScrollSensitivity": 2,
"editor.fontFamily": "'Maple Mono NF', Menlo, Monaco, 'Courier New', monospace",
"editor.fontLigatures": true,
"editor.fontSize": 18,
"editor.fontWeight": "normal",
"editor.formatOnPaste": true,
"editor.formatOnSave": true,
"editor.glyphMargin": true,
"editor.guides.bracketPairs": true,
"editor.hideCursorInOverviewRuler": true,
"editor.inlineSuggest.edits.showCollapsed": true,
"editor.inlineSuggest.enabled": true,
"editor.letterSpacing": 0.4,
"editor.lineHeight": 2,
"editor.lineNumbers": "off",
"editor.minimap.enabled": false,
"editor.minimap.renderCharacters": false,
"editor.minimap.size": "fit",
"editor.parameterHints.cycle": true,
"editor.quickSuggestionsDelay": 5,
"editor.renderControlCharacters": false,
"editor.scrollbar.vertical": "hidden",
"editor.semanticTokenColorCustomizations": {
"rules": {
"*.global": "#cc881a",
"*.mutable": {
"fontStyle": "underline"
},
"*.static": "#cc881a",
"function.unsafe": "#f73028",
"method.unsafe": "#f73028",
"typeAlias": "#aab01e"
}
},
"editor.smartSelect.selectLeadingAndTrailingWhitespace": true,
"editor.smartSelect.selectSubwords": true,
"editor.smoothScrolling": true,
"editor.suggest.localityBonus": true,
"editor.suggest.preview": true,
"editor.suggestSelection": "first",
"editor.tabCompletion": "onlySnippets",
"editor.tabSize": 2,
"editor.tokenColorCustomizations": {
"[*Light*]": {
"textMateRules": [
{
"scope": "ref.matchtext",
"settings": {
"foreground": "#000"
}
}
]
},
"[*Dark*]": {
"textMateRules": [
{
"scope": "ref.matchtext",
"settings": {
"foreground": "#fff"
}
}
]
},
"textMateRules": []
},
"editor.wordWrap": "off",
"errorLens.scrollbarHackEnabled": true,
"evenBetterToml.formatter.columnWidth": 120,
"explorer.openEditors.visible": 1,
"extensions.autoCheckUpdates": false,
"extensions.autoUpdate": false,
"extensions.experimental.affinity": {
"asvetliakov.vscode-neovim": 1,
"vscodevim.vim": 1
},
"extensions.ignoreRecommendations": true,
"files.associations": {
"*.css": "tailwindcss",
"*.tera": "html",
".env*": "dotenv"
},
"files.exclude": {
"**/*.g.dart": true,
"**/*.pyc": true,
"**/.classpath": true,
"**/.composer": true,
"**/.dart_tool": true,
"**/.direnv": true,
"**/.factorypath": true,
"**/.idea": true,
"**/.project": true,
"**/.settings": true,
"**/__pycache__": true,
"**/build": true,
"**/dist": true,
"**/target": true,
"**/vendor": true
},
"files.insertFinalNewline": true,
"files.watcherExclude": {
"**/.composer/**": true,
"**/build/**": true,
"**/node_modules/**": true,
"**/vendor/**": true
},
"find-it-faster.general.batTheme": "catppuccinMocha",
"find-it-faster.general.openFileInPreviewEditor": true,
"find-it-faster.general.useTerminalInEditor": true,
"git.autoRepositoryDetection": false,
"git.autofetch": true,
"git.confirmSync": false,
"git.enableCommitSigning": true,
"git.enableSmartCommit": false,
"githubPullRequests.createOnPublishBranch": "never",
"githubPullRequests.pullBranch": "never",
"gitlens.advanced.messages": {
"suppressIntegrationRequestTimedOutWarning": true
},
"gitlens.ai.generateCommitMessage.customInstructions": "You are a git wizard, and an expert in writing commit messages, FOLLOW THE INSTRUCTIONS BELOW EXACTLY.\n## Write short commit messages:\n- The first line should be a short summary of the changes in imperative mood following the conventional commit message format.\n- Remember to mention the files that were changed, and what was changed\n- Explain the 'why' behind changes\n- Use bullet points for multiple changes\n- Proritize code changes in the commit message title over dependency changes in your commit messages.\n- Think carefully before you write your commit message.\n- What you write will be passed directly to git commit -m \"[message]\"\n - DO NOT include the backtick (`) in the beginning and end of the commit message.\n\n## Commit Message Format:\nEach commit message consists of a header, a body and a footer. The header has a special format that includes a type, a scope and a subject. The type and subject are required, all the other parts are optional.\n<type>[optional scope][!]: <subject>\n<BLANK LINE>\n[optional body]\n<BLANK LINE>\n[optional footer]\n\n## Type:\nThe type is a mandatory field that describes the type of change that is being made. The type should be one of the following:\n- feat: A new feature\n- fix: A bug fix\n- docs: Documentation only changes\n- style: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)\n- refactor: A code change that neither fixes a bug nor adds a feature\n- perf: A code change that improves performance\n- test: Adding missing or correcting existing tests\n- ci: Changes to our CI configuration files and scripts\n- revert: Revert to a commit or a previous state\n- chore: Other changes that don't modify src or test files\n- build: Changes that affect the build system or external dependencies\n## Scope:\nThe scope is a optional field that describes the scope of the change. The scope are usually the name of the\n module/package/crate/library affected. and we are using the directory name as the scope.\n## Subject:\nThe subject is a mandatory field that describes the change in a short and concise way. The subject should be written in the imperative mood, and should not exceed 72 characters. The subject should not end with a period.\n## Body:\nThe body is an optional field that describes the change in more detail. The body should be written in the present tense, and should not exceed 72 characters per line. The body should explain the 'why' behind the change, and should not be a repeat of the subject.\n## Footer:\nThe footer is an optional field that describes any breaking changes or issues that are related to the change. The footer should be written in the present tense, and should not exceed 72 characters per line. The footer should be preceded by a blank line.",
"gitlens.ai.generateCommitMessage.enabled": true,
"gitlens.ai.model": "vscode",
"gitlens.ai.modelOptions.temperature": 0.25,
"gitlens.ai.vscode.model": "copilot:gemini-2.0-flash",
"gitlens.blame.avatars": false,
"gitlens.currentLine.scrollable": false,
"gitlens.hovers.currentLine.over": "line",
"gitlens.hovers.enabled": false,
"javascript.inlayHints.enumMemberValues.enabled": true,
"javascript.inlayHints.functionLikeReturnTypes.enabled": true,
"javascript.inlayHints.parameterNames.enabled": "all",
"javascript.inlayHints.parameterTypes.enabled": true,
"javascript.inlayHints.propertyDeclarationTypes.enabled": true,
"javascript.inlayHints.variableTypes.enabled": true,
"javascript.updateImportsOnFileMove.enabled": "always",
"lldb.suppressUpdateNotifications": true,
"markdown.preview.lineHeight": 1.2,
"notebook.formatOnSave.enabled": true,
"output.smartScroll.enabled": true,
"remote.SSH.remotePlatform": {
"workstation": "linux"
},
"roo-cline.allowedCommands": [
"npm test",
"npm install",
"tsc",
"git log",
"git diff",
"git show",
"pnpm test",
"pnpm lint",
"bun dev",
"bun install",
"bun test",
"bun fmt",
"bun lint",
"bun lint:fix"
],
"ruff.nativeServer": "on",
"rust-analyzer.cargo.autoreload": true,
"rust-analyzer.cargo.extraEnv": {
"SKIP_WASM_BUILD": "1"
},
"rust-analyzer.check.command": "clippy",
"rust-analyzer.check.extraArgs": [
"--tests",
"--",
"-W",
"clippy::complexity",
"-W",
"clippy::perf"
],
"rust-analyzer.check.extraEnv": {
"SKIP_WASM_BUILD": "1"
},
"rust-analyzer.checkOnSave": true,
"rust-analyzer.completion.autoimport.enable": true,
"rust-analyzer.completion.callable.snippets": "add_parentheses",
"rust-analyzer.completion.postfix.enable": true,
"rust-analyzer.debug.openDebugPane": true,
"rust-analyzer.diagnostics.experimental.enable": false,
"rust-analyzer.imports.granularity.enforce": true,
"rust-analyzer.imports.granularity.group": "module",
"rust-analyzer.imports.group.enable": true,
"rust-analyzer.imports.prefix": "crate",
"rust-analyzer.inlayHints.maxLength": 3,
"rust-analyzer.inlayHints.renderColons": false,
"rust-analyzer.inlayHints.typeHints.enable": true,
"rust-analyzer.lens.enable": true,
"rust-analyzer.runnables.extraEnv": {
"SKIP_WASM_BUILD": "1"
},
"search.useGlobalIgnoreFiles": true,
"security.workspace.trust.untrustedFiles": "newWindow",
"solidity.telemetry": false,
"tailwind-fold.autoFold": false,
"telemetry.telemetryLevel": "off",
"terminal.external.osxExec": "iTerm.app",
"terminal.external.windowsExec": "pwsh.exe -NoLogo",
"terminal.integrated.confirmOnExit": "hasChildProcesses",
"terminal.integrated.cursorBlinking": true,
"terminal.integrated.defaultProfile.linux": "zsh",
"terminal.integrated.defaultProfile.windows": "PowerShell",
"terminal.integrated.env.osx": {
"EDITOR": "code --wait",
"GIT_EDITOR": "code --wait"
},
"terminal.integrated.fontSize": 16,
"terminal.integrated.gpuAcceleration": "auto",
"terminal.integrated.localEchoExcludePrograms": [
"vim",
"vi",
"nano",
"tmux",
"nvim"
],
"terminal.integrated.profiles.windows": {
"PowerShell": {
"args": ["-NoLogo"],
"source": "PowerShell"
}
},
"terminal.integrated.smoothScrolling": true,
"terminal.integrated.tabs.title": "${local} ${process}",
"typescript.inlayHints.enumMemberValues.enabled": true,
"typescript.inlayHints.functionLikeReturnTypes.enabled": true,
"typescript.inlayHints.parameterNames.enabled": "all",
"typescript.inlayHints.parameterTypes.enabled": true,
"typescript.inlayHints.propertyDeclarationTypes.enabled": true,
"typescript.inlayHints.variableTypes.enabled": true,
"typescript.updateImportsOnFileMove.enabled": "always",
"update.mode": "none",
"vim.easymotion": false,
"vim.handleKeys": {
"<C-a>": false,
"<C-f>": false,
"<C-w>": false,
"<C-h>": false,
"<C-j>": false,
"<C-k>": false,
"<C-l>": false
},
"vim.highlightedyank.duration": 120,
"vim.highlightedyank.enable": true,
"vim.hlsearch": false,
"vim.ignorecase": true,
"vim.incsearch": true,
"vim.leader": "<space>",
"vim.normalModeKeyBindings": [
{
"before": ["n"],
"commands": ["editor.action.nextMatchFindAction"]
},
{
"before": ["shift+n"],
"commands": ["editor.action.previousMatchFindAction"]
},
{
"before": ["<leader>", "b"],
"commands": ["gitlens.toggleFileBlame"]
},
{
"before": ["<leader>", "c", "f"],
"commands": ["editor.action.formatDocument"]
},
{
"before": ["<leader>", "c", "a"],
"commands": ["editor.action.quickFix"]
},
{
"before": ["<leader>", "f"],
"commands": ["workbench.action.quickOpen"]
},
{
"before": ["<leader>", "/"],
"commands": ["workbench.action.findInFiles"]
},
{
"before": ["<leader>", "o"],
"commands": ["workbench.action.showAllEditors"]
},
{
"before": ["<leader>", "e"],
"commands": ["workbench.action.toggleSidebarVisibility"]
},
{
"before": ["<leader>", "t"],
"commands": ["workbench.action.terminal.new"]
},
{
"before": ["<leader>", "s", "s"],
"commands": ["workbench.action.showAllSymbols"]
},
{
"before": ["<leader>", "p"],
"commands": ["workbench.action.quickOpen"]
}
],
"vim.normalModeKeyBindingsNonRecursive": [
{
"after": ["d", "d"],
"before": ["<leader>", "d"]
}
],
"vim.overrideCopy": true,
"vim.smartcase": true,
"vim.useCtrlKeys": true,
"vim.useSystemClipboard": true,
"vim.visualModeKeyBindings": [
{
"before": ["shift+j"],
"commands": ["editor.action.moveLinesDownAction"]
},
{
"before": ["shift+k"],
"commands": ["editor.action.moveLinesUpAction"]
},
{
"before": [">"],
"commands": ["editor.action.indentLines"]
},
{
"before": ["<"],
"commands": ["editor.action.outdentLines"]
}
],
"vim.visualstar": true,
"vue.server.hybridMode": false,
"window.titleBarStyle": "custom",
"workbench.activityBar.location": "top",
"workbench.colorTheme": "Catppuccin Mocha",
"workbench.commandPalette.experimental.askChatLocation": "quickChat",
"workbench.commandPalette.preserveInput": true,
"workbench.editor.enablePreview": true,
"workbench.editor.limit.enabled": true,
"workbench.editor.limit.value": 7,
"workbench.editor.showTabs": "single",
"workbench.editor.tabSizing": "shrink",
"workbench.iconTheme": "catppuccin-mocha",
"workbench.list.smoothScrolling": true,
"workbench.productIconTheme": "Default",
"workbench.sideBar.location": "right",
"workbench.startupEditor": "none",
"roo-cline.deniedCommands": [],
"laravel-pint.enable": true,
"window.commandCenter": false,
"[markdown]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"window.menuBarVisibility": "toggle",
"claudeCode.preferredLocation": "panel",
"window.zoomLevel": 0,
"workbench.preferredDarkColorTheme": "Catppuccin Mocha",
"workbench.preferredLightColorTheme": "Catppuccin Latte",
"editor.cursorBlinking": "solid",
"editor.cursorSmoothCaretAnimation": "off",
"editor.renderWhitespace": "all",
"editor.rulers": [120],
"search.seedWithNearestWord": true,
"gitlens.currentLine.enabled": true
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment