Skip to content

jellydn/vscode-like-pro

Repository files navigation

Welcome to vscode-like-pro 👋

Make your VSCode Awesome! Minimalist, Productive, and Performance.

IT Man - VS Code Like a Pro

IT Man - Level up your VS Code with which-key like menu

Cobalt2

Pre-requisites

Why

  • This project is to help you to make your VSCode look like a pro. Inspired by Make VS Code Awesome and VSCode Power User
  • Optimize your VSCode settings for better performance and productivity.

Extensions

Recommended Extensions & Themes

Deprecated

Settings

Update your settings.json file with the following configuration:

// settings.json, generated at Thu Feb 27 2025 20:59:48 GMT+0800 (Singapore Standard Time)
{
  "workbench.settings.editor": "json", // Show setting in json as default
  // Color scheme and icon
  "workbench.colorTheme": "Kanagawa Wave",
  "workbench.iconTheme": "catppuccin-macchiato",
  // Set sidebar to the right
  "workbench.sideBar.location": "right",
  // Show relative number
  "editor.lineNumbers": "relative",
  "window.nativeTabs": true,
  "workbench.editor.showTabs": "multiple",
  "window.titleBarStyle": "native",
  // Activity bar
  "workbench.activityBar.orientation": "vertical",
  "workbench.activityBar.location": "bottom",
  "window.customTitleBarVisibility": "never",
  // Need to install VSCode Custom UI Style extension https://github.com/subframe7536/vscode-custom-ui-style
  "custom-ui-style.electron": {
    // "titleBarStyle": "hidden",
    "frame": false,
    "transparent": true,
    "opacity": 0.98
  },
  "custom-ui-style.stylesheet": {
    // Setup for CSS for Which-Key
    // Let the quick pick take the full window height, so that more bindings are visible.
    ".quick-input-widget > .quick-input-list > .monaco-list": "max-height: 100vh !important;",
    // Hide editor top-right buttons, except for the dirty file indicator and settings goto icon
    ".editor .title .actions-container .action-item a:not(.codicon-close-dirty):not(.codicon-preferences-open-settings)": "display: none !important;"
  },
  "window.commandCenter": true,
  "workbench.colorCustomizations": {
    "editorCursor.foreground": "#ffc600",
    "tab.activeBorder": "#ffc600"
  },
  "workbench.layoutControl.enabled": false,
  // Toggle excluded files extension, refer for more detail https://github.com/jellydn/vscode-toggle-excluded-files
  "files.exclude": {
    "**/bin": true,
    "**/git": true,
    "**/report": true,
    "**/.turbo": true,
    "**/.vercel": true,
    "**/.changes": true,
    "**/.yarn": true,
    "**/.vscode": true,
    "**/.vscode-test": true,
    "**/.git": true,
    "**/.github": true,
    "**/.grit": true,
    "**/.changeset": true,
    "**/node_modules": true,
    "**/.husky": true,
    "**/dist": true,
    "**/build": true,
    "**/out": true,
    "**/cdk.out": true,
    "**/coverage": true,
    "**/.next": true,
    "**/*.tsbuildinfo": true,
    "**/*.nyc_output": true,
    "**/*.tap": true,
    "**/*.econ": true,
    "**/.astro": true,
    "**/.encore": true,
    "**/encore.gen": true,
    "**/test-results": true,
    "**/playwright-report": true
  },
  // Cspell, refer https://open-vsx.org/vscode/item?itemName=streetsidesoftware.code-spell-checker
  "cSpell.userWords": [],
  // updated 2025-02-19 04:53
  // https://github.com/antfu/vscode-file-nesting-config
  "explorer.fileNesting.enabled": true,
  "explorer.fileNesting.expand": false,
  "explorer.fileNesting.patterns": {
    ".clang-tidy": ".clang-format, .clangd, compile_commands.json",
    ".env": "*.env, .env.*, .envrc, env.d.ts",
    ".gitignore": ".gitattributes, .gitmodules, .gitmessage, .mailmap, .git-blame*",
    ".project": ".classpath",
    "+layout.svelte": "+layout.ts,+layout.ts,+layout.js,+layout.server.ts,+layout.server.js,+layout.gql",
    "+page.svelte": "+page.server.ts,+page.server.js,+page.ts,+page.js,+page.gql",
    "ansible.cfg": "ansible.cfg, .ansible-lint, requirements.yml",
    "app.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, capacitor.config.*, content.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, i18n.config.*, ionic.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, react-router.config.*, rspack.config.*, sst.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*",
    "artisan": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, capacitor.config.*, content.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, i18n.config.*, ionic.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, react-router.config.*, rspack.config.*, server.php, sst.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, webpack.mix.js, windi.config.*",
    "astro.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, capacitor.config.*, content.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, i18n.config.*, ionic.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, react-router.config.*, rspack.config.*, sst.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*",
    "build-wrapper.log": "build-wrapper*.log, build-wrapper-dump*.json, build-wrapper-win*.exe, build-wrapper-linux*, build-wrapper-macosx*",
    "BUILD.bazel": "*.bzl, *.bazel, *.bazelrc, bazel.rc, .bazelignore, .bazelproject, WORKSPACE",
    "Cargo.toml": ".clippy.toml, .rustfmt.toml, cargo.lock, clippy.toml, cross.toml, rust-toolchain.toml, rustfmt.toml",
    "CMakeLists.txt": "*.cmake, *.cmake.in, .cmake-format.yaml, CMakePresets.json, CMakeCache.txt",
    "composer.json": ".php*.cache, composer.lock, phpunit.xml*, psalm*.xml",
    "default.nix": "shell.nix",
    "deno.json*": "*.env, .env.*, .envrc, api-extractor.json, deno.lock, env.d.ts, import-map.json, import_map.json, jsconfig.*, tsconfig.*, tsdoc.*",
    "Dockerfile": "*.dockerfile, .devcontainer.*, .dockerignore, captain-definition, compose.*, docker-compose.*, dockerfile*",
    "flake.nix": "flake.lock",
    "gatsby-config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, capacitor.config.*, content.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, gatsby-browser.*, gatsby-node.*, gatsby-ssr.*, gatsby-transformer.*, histoire.config.*, htmlnanorc.*, i18n.config.*, ionic.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, react-router.config.*, rspack.config.*, sst.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*",
    "gemfile": ".ruby-version, gemfile.lock",
    "go.mod": ".air*, go.sum",
    "go.work": "go.work.sum",
    "hatch.toml": ".editorconfig, .flake8, .isort.cfg, .python-version, hatch.toml, requirements*.in, requirements*.pip, requirements*.txt, tox.ini",
    "I*.cs": "$(capture).cs",
    "Makefile": "*.mk",
    "mix.exs": ".credo.exs, .dialyzer_ignore.exs, .formatter.exs, .iex.exs, .tool-versions, mix.lock",
    "next.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, capacitor.config.*, content.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, i18n.config.*, ionic.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, next-env.d.ts, next-i18next.config.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, react-router.config.*, rspack.config.*, sst.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*",
    "nuxt.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .nuxtignore, .nuxtrc, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, capacitor.config.*, content.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, i18n.config.*, ionic.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, react-router.config.*, rspack.config.*, sst.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*",
    "package.json": "*.code-workspace, .browserslist*, .circleci*, .commitlint*, .cspell*, .cursorrules, .cz-config.js, .czrc, .dlint.json, .dprint.json*, .editorconfig, .eslint*, .firebase*, .flowconfig, .github*, .gitlab*, .gitmojirc.json, .gitpod*, .huskyrc*, .jslint*, .knip.*, .lintstagedrc*, .ls-lint.yml, .markdownlint*, .node-version, .nodemon*, .npm*, .nvmrc, .pm2*, .pnp.*, .pnpm*, .prettier*, .pylintrc, .release-please*.json, .releaserc*, .ruff.toml, .sentry*, .simple-git-hooks*, .stackblitz*, .styleci*, .stylelint*, .tazerc*, .textlint*, .tool-versions, .travis*, .versionrc*, .vscode*, .watchman*, .xo-config*, .yamllint*, .yarnrc*, Procfile, apollo.config.*, appveyor*, azure-pipelines*, biome.json*, bower.json, build.config.*, bun.lock, bun.lockb, bunfig.toml, colada.options.ts, commitlint*, crowdin*, cspell*, dangerfile*, dlint.json, dprint.json*, ec.config.*, electron-builder.*, eslint*, firebase.json, grunt*, gulp*, jenkins*, knip.*, lerna*, lint-staged*, nest-cli.*, netlify*, nixpacks*, nodemon*, npm-shrinkwrap.json, nx.*, package-lock.json, package.nls*.json, phpcs.xml, pm2.*, pnpm*, prettier*, pullapprove*, pyrightconfig.json, release-please*.json, release-tasks.sh, release.config.*, renovate*, rolldown.config.*, rollup.config.*, rspack*, ruff.toml, sentry.*.config.ts, simple-git-hooks*, sonar-project.properties, stylelint*, tsdown.config.*, tslint*, tsup.config.*, turbo*, typedoc*, unlighthouse*, vercel*, vetur.config.*, webpack*, workspace.json, wrangler.*, xo.config.*, yarn*",
    "Pipfile": ".editorconfig, .flake8, .isort.cfg, .python-version, Pipfile, Pipfile.lock, requirements*.in, requirements*.pip, requirements*.txt, tox.ini",
    "pubspec.yaml": ".metadata, .packages, all_lint_rules.yaml, analysis_options.yaml, build.yaml, pubspec.lock, pubspec_overrides.yaml",
    "pyproject.toml": ".commitlint*, .cspell*, .dlint.json, .dprint.json*, .editorconfig, .eslint*, .flake8, .flowconfig, .isort.cfg, .jslint*, .lintstagedrc*, .ls-lint.yml, .markdownlint*, .pdm-python, .pdm.toml, .prettier*, .pylintrc, .python-version, .ruff.toml, .stylelint*, .textlint*, .xo-config*, .yamllint*, MANIFEST.in, Pipfile, Pipfile.lock, biome.json*, commitlint*, cspell*, dangerfile*, dlint.json, dprint.json*, eslint*, hatch.toml, lint-staged*, pdm.lock, phpcs.xml, poetry.lock, poetry.toml, prettier*, pyproject.toml, pyrightconfig.json, requirements*.in, requirements*.pip, requirements*.txt, ruff.toml, setup.cfg, setup.py, stylelint*, tox.ini, tslint*, uv.lock, uv.toml, xo.config.*",
    "quasar.conf.js": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, capacitor.config.*, content.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, i18n.config.*, ionic.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, quasar.extensions.json, react-router.config.*, rspack.config.*, sst.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*",
    "readme*": "AUTHORS, Authors, BACKERS*, Backers*, CHANGELOG*, CITATION*, CODEOWNERS, CODE_OF_CONDUCT*, CONTRIBUTING*, CONTRIBUTORS, COPYING*, CREDITS, Changelog*, Citation*, Code_Of_Conduct*, Codeowners, Contributing*, Contributors, Copying*, Credits, GOVERNANCE.MD, Governance.md, HISTORY.MD, History.md, LICENSE*, License*, MAINTAINERS, Maintainers, README-*, README_*, RELEASE_NOTES*, ROADMAP.MD, Readme-*, Readme_*, Release_Notes*, Roadmap.md, SECURITY.MD, SPONSORS*, Security.md, Sponsors*, authors, backers*, changelog*, citation*, code_of_conduct*, codeowners, contributing*, contributors, copying*, credits, governance.md, history.md, license*, maintainers, readme-*, readme_*, release_notes*, roadmap.md, security.md, sponsors*",
    "Readme*": "AUTHORS, Authors, BACKERS*, Backers*, CHANGELOG*, CITATION*, CODEOWNERS, CODE_OF_CONDUCT*, CONTRIBUTING*, CONTRIBUTORS, COPYING*, CREDITS, Changelog*, Citation*, Code_Of_Conduct*, Codeowners, Contributing*, Contributors, Copying*, Credits, GOVERNANCE.MD, Governance.md, HISTORY.MD, History.md, LICENSE*, License*, MAINTAINERS, Maintainers, README-*, README_*, RELEASE_NOTES*, ROADMAP.MD, Readme-*, Readme_*, Release_Notes*, Roadmap.md, SECURITY.MD, SPONSORS*, Security.md, Sponsors*, authors, backers*, changelog*, citation*, code_of_conduct*, codeowners, contributing*, contributors, copying*, credits, governance.md, history.md, license*, maintainers, readme-*, readme_*, release_notes*, roadmap.md, security.md, sponsors*",
    "README*": "AUTHORS, Authors, BACKERS*, Backers*, CHANGELOG*, CITATION*, CODEOWNERS, CODE_OF_CONDUCT*, CONTRIBUTING*, CONTRIBUTORS, COPYING*, CREDITS, Changelog*, Citation*, Code_Of_Conduct*, Codeowners, Contributing*, Contributors, Copying*, Credits, GOVERNANCE.MD, Governance.md, HISTORY.MD, History.md, LICENSE*, License*, MAINTAINERS, Maintainers, README-*, README_*, RELEASE_NOTES*, ROADMAP.MD, Readme-*, Readme_*, Release_Notes*, Roadmap.md, SECURITY.MD, SPONSORS*, Security.md, Sponsors*, authors, backers*, changelog*, citation*, code_of_conduct*, codeowners, contributing*, contributors, copying*, credits, governance.md, history.md, license*, maintainers, readme-*, readme_*, release_notes*, roadmap.md, security.md, sponsors*",
    "remix.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, capacitor.config.*, content.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, i18n.config.*, ionic.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, react-router.config.*, remix.*, rspack.config.*, sst.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*",
    "requirements.txt": ".editorconfig, .flake8, .isort.cfg, .python-version, requirements*.in, requirements*.pip, requirements*.txt, tox.ini",
    "rush.json": "*.code-workspace, .browserslist*, .circleci*, .commitlint*, .cspell*, .cursorrules, .cz-config.js, .czrc, .dlint.json, .dprint.json*, .editorconfig, .eslint*, .firebase*, .flowconfig, .github*, .gitlab*, .gitmojirc.json, .gitpod*, .huskyrc*, .jslint*, .knip.*, .lintstagedrc*, .ls-lint.yml, .markdownlint*, .node-version, .nodemon*, .npm*, .nvmrc, .pm2*, .pnp.*, .pnpm*, .prettier*, .pylintrc, .release-please*.json, .releaserc*, .ruff.toml, .sentry*, .simple-git-hooks*, .stackblitz*, .styleci*, .stylelint*, .tazerc*, .textlint*, .tool-versions, .travis*, .versionrc*, .vscode*, .watchman*, .xo-config*, .yamllint*, .yarnrc*, Procfile, apollo.config.*, appveyor*, azure-pipelines*, biome.json*, bower.json, build.config.*, bun.lock, bun.lockb, bunfig.toml, colada.options.ts, commitlint*, crowdin*, cspell*, dangerfile*, dlint.json, dprint.json*, ec.config.*, electron-builder.*, eslint*, firebase.json, grunt*, gulp*, jenkins*, knip.*, lerna*, lint-staged*, nest-cli.*, netlify*, nixpacks*, nodemon*, npm-shrinkwrap.json, nx.*, package-lock.json, package.nls*.json, phpcs.xml, pm2.*, pnpm*, prettier*, pullapprove*, pyrightconfig.json, release-please*.json, release-tasks.sh, release.config.*, renovate*, rolldown.config.*, rollup.config.*, rspack*, ruff.toml, sentry.*.config.ts, simple-git-hooks*, sonar-project.properties, stylelint*, tsdown.config.*, tslint*, tsup.config.*, turbo*, typedoc*, unlighthouse*, vercel*, vetur.config.*, webpack*, workspace.json, wrangler.*, xo.config.*, yarn*",
    "sanity.config.*": "sanity.cli.*, sanity.types.ts, schema.json",
    "setup.cfg": ".editorconfig, .flake8, .isort.cfg, .python-version, MANIFEST.in, requirements*.in, requirements*.pip, requirements*.txt, setup.cfg, tox.ini",
    "setup.py": ".editorconfig, .flake8, .isort.cfg, .python-version, MANIFEST.in, requirements*.in, requirements*.pip, requirements*.txt, setup.cfg, setup.py, tox.ini",
    "shims.d.ts": "*.d.ts",
    "svelte.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, capacitor.config.*, content.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, houdini.config.*, htmlnanorc.*, i18n.config.*, ionic.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, mdsvex.config.js, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, react-router.config.*, rspack.config.*, sst.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vite.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*",
    "vite.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, capacitor.config.*, content.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, i18n.config.*, ionic.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, react-router.config.*, rspack.config.*, sst.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*",
    "vue.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, capacitor.config.*, content.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, i18n.config.*, ionic.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, react-router.config.*, rspack.config.*, sst.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*",
    "*.asax": "$(capture).*.cs, $(capture).*.vb",
    "*.ascx": "$(capture).*.cs, $(capture).*.vb",
    "*.ashx": "$(capture).*.cs, $(capture).*.vb",
    "*.aspx": "$(capture).*.cs, $(capture).*.vb",
    "*.axaml": "$(capture).axaml.cs",
    "*.bloc.dart": "$(capture).event.dart, $(capture).state.dart",
    "*.c": "$(capture).h",
    "*.cc": "$(capture).hpp, $(capture).h, $(capture).hxx, $(capture).hh",
    "*.cjs": "$(capture).cjs.map, $(capture).*.cjs, $(capture)_*.cjs",
    "*.component.ts": "$(capture).component.html, $(capture).component.spec.ts, $(capture).component.css, $(capture).component.scss, $(capture).component.sass, $(capture).component.less",
    "*.cpp": "$(capture).hpp, $(capture).h, $(capture).hxx, $(capture).hh",
    "*.cs": "$(capture).*.cs",
    "*.cshtml": "$(capture).cshtml.cs",
    "*.csproj": "*.config, *proj.user, appsettings.*, bundleconfig.json",
    "*.css": "$(capture).css.map, $(capture).*.css",
    "*.cxx": "$(capture).hpp, $(capture).h, $(capture).hxx, $(capture).hh",
    "*.dart": "$(capture).freezed.dart, $(capture).g.dart",
    "*.db": "*.db-shm, *.db-wal",
    "*.ex": "$(capture).html.eex, $(capture).html.heex, $(capture).html.leex",
    "*.fs": "$(capture).fs.js, $(capture).fs.js.map, $(capture).fs.jsx, $(capture).fs.ts, $(capture).fs.tsx, $(capture).fs.rs, $(capture).fs.php, $(capture).fs.dart",
    "*.go": "$(capture)_test.go",
    "*.java": "$(capture).class",
    "*.js": "$(capture).js.map, $(capture).*.js, $(capture)_*.js, $(capture).d.ts, $(capture).js.flow",
    "*.jsx": "$(capture).js, $(capture).*.jsx, $(capture)_*.js, $(capture)_*.jsx, $(capture).css, $(capture).module.css, $(capture).less, $(capture).module.less, $(capture).module.less.d.ts, $(capture).scss, $(capture).module.scss, $(capture).module.scss.d.ts",
    "*.master": "$(capture).*.cs, $(capture).*.vb",
    "*.md": "$(capture).*",
    "*.mjs": "$(capture).mjs.map, $(capture).*.mjs, $(capture)_*.mjs",
    "*.module.ts": "$(capture).resolver.ts, $(capture).controller.ts, $(capture).service.ts",
    "*.mts": "$(capture).mts.map, $(capture).*.mts, $(capture)_*.mts",
    "*.pubxml": "$(capture).pubxml.user",
    "*.py": "$(capture).pyi",
    "*.razor": "$(capture).razor.cs, $(capture).razor.css, $(capture).razor.scss",
    "*.resx": "$(capture).*.resx, $(capture).designer.cs, $(capture).designer.vb",
    "*.tex": "$(capture).acn, $(capture).acr, $(capture).alg, $(capture).aux, $(capture).bbl, $(capture).bbl-SAVE-ERROR, $(capture).bcf, $(capture).blg, $(capture).fdb_latexmk, $(capture).fls, $(capture).glg, $(capture).glo, $(capture).gls, $(capture).idx, $(capture).ind, $(capture).ist, $(capture).lof, $(capture).log, $(capture).lot, $(capture).nav, $(capture).out, $(capture).run.xml, $(capture).snm, $(capture).synctex.gz, $(capture).toc, $(capture).xdv",
    "*.ts": "$(capture).js, $(capture).d.ts.map, $(capture).*.ts, $(capture)_*.js, $(capture)_*.ts",
    "*.tsx": "$(capture).ts, $(capture).*.tsx, $(capture)_*.ts, $(capture)_*.tsx, $(capture).css, $(capture).module.css, $(capture).less, $(capture).module.less, $(capture).module.less.d.ts, $(capture).scss, $(capture).module.scss, $(capture).module.scss.d.ts, $(capture).css.ts",
    "*.vbproj": "*.config, *proj.user, appsettings.*, bundleconfig.json",
    "*.vue": "$(capture).*.ts, $(capture).*.js, $(capture).story.vue",
    "*.w": "$(capture).*.w, I$(capture).w",
    "*.wat": "$(capture).wasm",
    "*.xaml": "$(capture).xaml.cs"
  },
  "explorer.openEditors.visible": 1,
  "files.trimTrailingWhitespace": true,
  // Git
  "git.autofetch": true,
  "git.confirmSync": false,
  "git.openRepositoryInParentFolders": "always",
  // Screencast
  "screencastMode.fontSize": 32,
  "screencastMode.verticalOffset": 4,
  // Terminal
  "terminal.integrated.fontFamily": "JetBrainsMono NF",
  "terminal.integrated.fontSize": 17,
  "terminal.integrated.sendKeybindingsToShell": true,
  // Inlay hints
  "editor.inlayHints.enabled": "on",
  "editor.inlayHints.fontFamily": "GeistMono Nerd Font",
  "editor.inlayHints.fontSize": 1,
  "editor.inlayHints.padding": true,
  "javascript.validate.enable": false,
  "javascript.inlayHints.enumMemberValues.enabled": true,
  "javascript.inlayHints.functionLikeReturnTypes.enabled": true,
  "javascript.inlayHints.parameterNames.enabled": "literals",
  "javascript.inlayHints.variableTypes.enabled": false,
  "javascript.updateImportsOnFileMove.enabled": "always",
  "typescript.enablePromptUseWorkspaceTsdk": true,
  "typescript.inlayHints.enumMemberValues.enabled": true,
  "typescript.inlayHints.functionLikeReturnTypes.enabled": true,
  "typescript.inlayHints.parameterNames.enabled": "literals",
  "typescript.inlayHints.variableTypes.enabled": false,
  "typescript.referencesCodeLens.enabled": true,
  "typescript.updateImportsOnFileMove.enabled": "always",
  "typescript.preferences.preferTypeOnlyAutoImports": true,
  // make sure you're using the local typescript
  "typescript.tsdk": "node_modules/typescript/lib",
  // Diff
  "diffEditor.codeLens": true,
  "diffEditor.hideUnchangedRegions.enabled": true,
  // General editor settings
  "editor.autoIndent": "full",
  "editor.cursorBlinking": "solid",
  "editor.cursorStyle": "line",
  "editor.cursorWidth": 5,
  "editor.fontFamily": "OperatorMonoLig Nerd Font, JetBrainsMono Nerd Font Mono, Menlo, Monaco, 'Courier New', monospacere",
  "editor.codeLensFontFamily": "JetBrainsMono Nerd Font Mono",
  "editor.fontLigatures": true,
  "editor.fontSize": 19.5,
  "editor.fontWeight": "400",
  "editor.formatOnSave": true,
  "editor.inlineSuggest.enabled": true,
  "editor.insertSpaces": false,
  "editor.largeFileOptimizations": false,
  "editor.letterSpacing": 0.5,
  "editor.lineHeight": 25,
  "editor.renderWhitespace": "all",
  "editor.suggestSelection": "first",
  "editor.tabCompletion": "on",
  "editor.wordSeparators": "/\\()\"':,.;<>~!@#$%^&*|+=[]{}`?-",
  "editor.semanticTokenColorCustomizations": {
    "enabled": true
  },
  "editor.semanticHighlighting.enabled": true,
  "explorer.confirmDelete": false,
  "explorer.compactFolders": false,
  "explorer.confirmDragAndDrop": false,
  "errorLens.enabledDiagnosticLevels": ["error"],
  "errorLens.excludeBySource": ["cSpell"],
  // Neovim setting, refer https://open-vsx.org/extension/asvetliakov/vscode-neovim
  "extensions.experimental.affinity": {
    "asvetliakov.vscode-neovim": 1
  },
  "vscode-neovim.compositeKeys": {
    "jj": {
      "command": "vscode-neovim.escape"
    },
    "jk": {
      "command": "vscode-neovim.escape"
    }
  },
  // which key, refer https://github.com/VSpaceCode/vscode-which-key
  // Override from default key bindings, search for 'whichkey.bindings' on https://github.com/VSpaceCode/vscode-which-key/blob/master/package.json#L265
  "whichkey.sortOrder": "alphabetically",
  "whichkey.bindings": [
    {
      "key": " ",
      "name": "Commands",
      "type": "command",
      "command": "workbench.action.showCommands"
    },
    {
      "key": ",",
      "name": "Show all editors",
      "type": "command",
      "command": "workbench.action.showAllEditors"
    },
    {
      "key": "\t",
      "name": "Last editor",
      "type": "commands",
      "commands": [
        "workbench.action.quickOpenPreviousRecentlyUsedEditorInGroup",
        "list.select"
      ]
    },
    {
      "key": "e",
      "name": "File Explorer",
      "type": "command",
      "command": "workbench.view.explorer"
    },
    {
      "key": "?",
      "name": "Search keybindings",
      "type": "command",
      "command": "whichkey.searchBindings"
    },
    {
      "key": ".",
      "name": "Repeat most recent action",
      "type": "command",
      "command": "whichkey.repeatMostRecent"
    },
    {
      "key": "]",
      "name": "Next",
      "type": "bindings",
      "bindings": [
        {
          "key": "e",
          "name": "Next error",
          "type": "command",
          "command": "editor.action.marker.next"
        },
        {
          "key": "h",
          "name": "Next change",
          "type": "command",
          "command": "workbench.action.editor.nextChange"
        }
      ]
    },
    {
      "key": "[",
      "name": "Previus",
      "type": "bindings",
      "bindings": [
        {
          "key": "e",
          "name": "Previous error",
          "type": "command",
          "command": "editor.action.marker.prev"
        },
        {
          "key": "h",
          "name": "Previous change",
          "type": "command",
          "command": "workbench.action.editor.previousChange"
        }
      ]
    },
    {
      "key": "b",
      "name": "+Buffers/Editors",
      "type": "bindings",
      "bindings": [
        {
          "key": "d",
          "name": "Close active editor",
          "type": "command",
          "command": "workbench.action.closeActiveEditor"
        },
        {
          "key": "o",
          "name": "Close active editor",
          "type": "command",
          "command": "workbench.action.closeOtherEditors"
        }
      ]
    },
    {
      "key": "c",
      "name": "+Code",
      "type": "bindings",
      "bindings": [
        {
          "key": "a",
          "name": "Code Action",
          "type": "command",
          "command": "editor.action.codeAction"
        },
        {
          "key": "A",
          "name": "Source action",
          "type": "command",
          "command": "editor.action.sourceAction"
        },
        {
          "key": "i",
          "name": "Organize Imports",
          "type": "command",
          "command": "editor.action.organizeImports"
        },
        {
          "key": "r",
          "name": "Rename",
          "type": "command",
          "command": "editor.action.rename"
        },
        {
          "key": "R",
          "name": "Refactor",
          "type": "command",
          "command": "editor.action.Refactor"
        },
        {
          "key": "f",
          "name": "Format",
          "type": "command",
          "command": "editor.action.formatDocument"
        },
        {
          "key": "=",
          "name": "Format selection",
          "type": "command",
          "command": "editor.action.formatSelection"
        },
        {
          "key": ".",
          "name": "Quick Fix",
          "type": "command",
          "command": "editor.action.quickFix"
        }
      ]
    },
    {
      "key": "d",
      "name": "+Debug",
      "type": "bindings",
      "bindings": [
        // Need to install https://github.com/orta/vscode-twoslash-queries
        {
          "key": "d",
          "name": "Debug type below",
          "type": "command",
          "command": "orta.vscode-twoslash-queries.insert-twoslash-query"
        },
        // Need to install https://github.com/Chakroun-Anas/turbo-console-log
        {
          "key": "v",
          "name": "Debug variable below",
          "type": "command",
          "command": "turboConsoleLog.displayLogMessage"
        },
        {
          "key": "c",
          "name": "Clear all variable",
          "type": "command",
          "command": "turboConsoleLog.deleteAllLogMessages"
        }
      ]
    },
    {
      "key": "x",
      "name": "+Errors",
      "type": "bindings",
      "bindings": [
        {
          "key": "x",
          "name": "List errors",
          "type": "command",
          "command": "workbench.actions.view.problems"
        },
        {
          "key": "n",
          "name": "Next error",
          "type": "command",
          "command": "editor.action.marker.next"
        },
        {
          "key": "p",
          "name": "Previous error",
          "type": "command",
          "command": "editor.action.marker.prev"
        }
      ]
    },
    {
      "key": "f",
      "name": "+File",
      "type": "bindings",
      "bindings": [
        {
          "key": "a",
          "name": "Show all opened files",
          "type": "command",
          "command": "workbench.action.showAllEditors"
        },
        {
          "key": "e",
          "name": "Show active in explorer",
          "type": "command",
          "command": "workbench.files.action.showActiveFileInExplorer"
        },
        {
          "key": "f",
          "name": "Quick Open file",
          "type": "command",
          "command": "workbench.action.quickOpen"
        },
        {
          "key": "F",
          "name": "Open file in folder",
          "type": "command",
          "command": "workbench.action.files.openFileFolder"
        },
        {
          "key": "n",
          "name": "New Untitled",
          "type": "command",
          "command": "workbench.action.files.newUntitledFile"
        },
        {
          "key": "p",
          "name": "Switch project",
          "type": "command",
          "command": "workbench.action.openRecent"
        },
        {
          "key": "t",
          "name": "Open terminal",
          "type": "command",
          "command": "workbench.action.terminal.focus"
        },
        {
          "key": "s",
          "name": "Save file",
          "type": "command",
          "command": "workbench.action.files.save"
        },
        {
          "key": "S",
          "name": "Save all files",
          "type": "command",
          "command": "workbench.action.files.saveAll"
        },
        {
          "key": "w",
          "name": "Open active in new window",
          "type": "command",
          "command": "workbench.action.files.showOpenedFileInNewWindow"
        }
      ]
    },
    {
      "key": "g",
      "name": "+Git",
      "type": "bindings",
      "bindings": [
        {
          "key": "f",
          "name": "Fetch",
          "type": "command",
          "command": "git.fetch"
        },
        {
          "key": "i",
          "name": "Init",
          "type": "command",
          "command": "git.init"
        },
        {
          "key": "s",
          "name": "Git status",
          "type": "command",
          "command": "workbench.view.scm"
        },
        {
          "key": "r",
          "name": "Pull Request",
          "type": "command",
          "command": "workbench.view.extension.github-pull-request"
        },
        {
          "key": "h",
          "name": "Hunk",
          "type": "bindings",
          "bindings": [
            {
              "key": "r",
              "name": "Revert selected ranges",
              "type": "command",
              "command": "git.revertSelectedRanges"
            }
          ]
        }
      ]
    },
    {
      "key": "s",
      "name": "+Search/Symbol",
      "type": "bindings",
      "bindings": [
        {
          "key": "s",
          "name": "Symbol in file",
          "type": "command",
          "command": "workbench.action.gotoSymbol"
        },
        {
          "key": "S",
          "name": "All symbols in workspace",
          "type": "command",
          "command": "workbench.action.showAllSymbols"
        },
        {
          "key": "w",
          "name": "Search word in a project",
          "type": "commands",
          "commands": [
            "editor.action.addSelectionToNextFindMatch",
            "workbench.action.findInFiles"
          ]
        },
        {
          "key": "r",
          "name": "Search all references",
          "type": "command",
          "command": "editor.action.referenceSearch.trigger"
        },
        {
          "key": "R",
          "name": "Search all references in side bar",
          "type": "command",
          "command": "references-view.find"
        }
      ]
    },
    {
      "key": "u",
      "name": "+UI",
      "type": "bindings",
      "bindings": [
        {
          "key": "c",
          "name": "Select theme color",
          "type": "command",
          "command": "workbench.action.selectTheme"
        },
        {
          "key": "x",
          "name": "Show extensions",
          "type": "command",
          "command": "workbench.view.extensions"
        },
        {
          "key": "o",
          "name": "Show output",
          "type": "command",
          "command": "workbench.action.output.toggleOutput"
        },
        {
          "key": "d",
          "name": "Show debug console",
          "type": "command",
          "command": "workbench.debug.action.toggleRepl"
        },
        // Todo tree extension https://marketplace.visualstudio.com/items?itemName=Gruntfuggly.todo-tree
        {
          "key": "t",
          "name": "Show todo",
          "type": "command",
          "command": "todo-tree-view.focus"
        }
      ]
    },
    {
      "key": "r",
      "name": "+Run",
      "type": "bindings",
      "bindings": [
        {
          "key": "t",
          "name": "Run task",
          "type": "command",
          "command": "workbench.action.tasks.runTask"
        },
        {
          "key": "r",
          "name": "Run last task",
          "type": "command",
          "command": "workbench.action.tasks.reRunTask"
        }
      ]
    },
    {
      "key": "t",
      "name": "+Toggles",
      "type": "bindings",
      "bindings": [
        {
          "key": "b",
          "name": "Toggle git blame",
          "type": "command",
          "command": "gitlens.toggleLineBlame"
        },
        {
          "key": "c",
          "name": "Toggle find case sensitive",
          "type": "command",
          "command": "toggleFindCaseSensitive"
        },
        {
          "key": "r",
          "name": "Toggle screencast record",
          "type": "command",
          "command": "workbench.action.toggleScreencastMode"
        },
        {
          "key": "s",
          "name": "Toggle status bar",
          "type": "command",
          "command": "workbench.action.toggleStatusbarVisibility"
        },
        {
          "key": "w",
          "name": "Toggle ignore trim whitespace in diff",
          "type": "command",
          "command": "toggle.diff.ignoreTrimWhitespace"
        },
        {
          "key": "W",
          "name": "Toggle word wrap",
          "type": "command",
          "command": "editor.action.toggleWordWrap"
        },
        {
          "key": "m",
          "name": "Toggle minimap",
          "type": "command",
          "command": "editor.action.toggleMinimap"
        },
        {
          "key": "i",
          "name": "Toggle inlay hint",
          "type": "command",
          // Need to install https://marketplace.cursorapi.com/items?itemName=hoovercj.vscode-settings-cycler
          "command": "settings.cycle",
          "args": {
            "id": "toggle-inlay-hints",
            "overrideWorkspaceSettings": false,
            "values": [
              {
                "editor.inlayHints.enabled": "off"
              },
              {
                "editor.inlayHints.enabled": "on"
              }
            ]
          }
        },
        {
          "key": "t",
          "name": "Toggle show tabs (Single/multiple)",
          "type": "command",
          // Need to install https://marketplace.cursorapi.com/items?itemName=hoovercj.vscode-settings-cycler
          "command": "settings.cycle",
          "args": {
            "id": "toggle-inlay-hints",
            "overrideWorkspaceSettings": false,
            "values": [
              {
                "workbench.editor.showTabs": "single"
              },
              {
                "workbench.editor.showTabs": "multiple"
              }
            ]
          }
        }
      ]
    },
    {
      "key": "w",
      "name": "+Window",
      "type": "bindings",
      "bindings": [
        {
          "key": "-",
          "name": "Split editor below",
          "type": "command",
          "command": "workbench.action.splitEditorDown"
        },
        {
          "key": "/",
          "name": "Split editor right",
          "type": "command",
          "command": "workbench.action.splitEditor"
        },
        {
          "key": "t",
          "name": "Toggle editor group sizes",
          "type": "command",
          "command": "workbench.action.toggleEditorWidths"
        },
        {
          "key": "m",
          "name": "Maximize editor group",
          "type": "command",
          "command": "workbench.action.minimizeOtherEditors"
        },
        {
          "key": "j",
          "name": "Navigate down",
          "type": "command",
          "command": "workbench.action.navigateDown"
        },
        {
          "key": "k",
          "name": "Navigate up",
          "type": "command",
          "command": "workbench.action.navigateUp"
        },
        {
          "key": "h",
          "name": "Navigate left",
          "type": "command",
          "command": "workbench.action.navigateLeft"
        },
        {
          "key": "l",
          "name": "Navigate right",
          "type": "command",
          "command": "workbench.action.navigateRight"
        }
      ]
    },
    {
      "key": "z",
      "name": "+Folding",
      "type": "bindings",
      "bindings": [
        {
          "key": "a",
          "name": "Toggle: around a point",
          "type": "command",
          "command": "editor.toggleFold"
        },
        {
          "key": "c",
          "name": "Close: at a point",
          "type": "command",
          "command": "editor.fold"
        },
        {
          "key": "b",
          "name": "Close: all block comments",
          "type": "command",
          "command": "editor.foldAllBlockComments"
        },
        {
          "key": "g",
          "name": "Close: all regions",
          "type": "command",
          "command": "editor.foldAllMarkerRegions"
        },
        {
          "key": "m",
          "name": "Close: all",
          "type": "command",
          "command": "editor.foldAll"
        },
        {
          "key": "o",
          "name": "Open: at a point",
          "type": "command",
          "command": "editor.unfold"
        },
        {
          "key": "O",
          "name": "Open: recursively",
          "type": "command",
          "command": "editor.unfoldRecursively"
        },
        {
          "key": "G",
          "name": "Open: all regions",
          "type": "command",
          "command": "editor.unfoldAllMarkerRegions"
        },
        {
          "key": "r",
          "name": "Open: all",
          "type": "command",
          "command": "editor.unfoldAll"
        }
      ]
    },
    {
      "key": "!",
      "name": "Show terminal",
      "type": "command",
      "command": "workbench.action.terminal.focus"
    },
    {
      "key": "/",
      "name": "Search in a project",
      "type": "command",
      "command": "workbench.action.findInFiles"
    }
  ],
  /*
     Incremental usage: only override some keymap
    "whichkey.bindingOverrides": [
      // +f File
      // Prefer to use <leader>e from neovim instead
      {
        "keys": "f.e",
        "name": "Show tree/explorer view",
        "type": "command",
        "command": "workbench.view.explorer"
      },
      // Open file
      {
        "keys": "f.f",
        "name": "Quick open file",
        "type": "command",
        "command": "workbench.action.quickOpen"
      },
      {
        "key": "f.F",
        "name": "Open file/folder",
        "type": "command",
        "command": "whichkey.openFile"
      },
      // More advanced usage on https://vspacecode.github.io/docs/whichkey/extra
      {
        "keys": "f.E",
        "name": "Show active file in tree/explorer view",
        "type": "command",
        "command": "workbench.files.action.showActiveFileInExplorer"
      },
      // Open Github Pull Request on sidebar
      {
        "keys": "g.r",
        "name": "Github Pull Requests",
        "type": "command",
        "command": "workbench.view.extension.github-pull-request"
      }
    ], */
  // Vim settings, refer https://open-vsx.org/extension/vscodevim/vim
  "vim.easymotion": true,
  "vim.foldfix": true,
  "vim.handleKeys": {
    "<C-a>": false,
    "<C-f>": false
  },
  "vim.highlightedyank.enable": true,
  "vim.hlsearch": true,
  "vim.incsearch": true,
  "vim.leader": "<space>",
  "vim.insertModeKeyBindings": [
    {
      "after": ["<Esc>"],
      "before": ["j", "j"]
    }
  ],
  "vim.normalModeKeyBindingsNonRecursive": [
    {
      "after": ["d", "d"],
      "before": ["<leader>", "d"]
    },
    {
      "before": ["<C-n>"],
      "commands": [":nohl"]
    },
    {
      "before": ["K"],
      "commands": ["editor.action.showHover"]
    }
  ],
  "vim.useCtrlKeys": true,
  "vim.useSystemClipboard": true,
  // Turn off extension recommedations
  "extensions.ignoreRecommendations": true,
  // Setup Cursor AI
  "cursor.cmdk.useThemedDiffBackground": true,
  "cursor.diffs.useCharacterLevelDiffs": true,
  "cursor.cpp.disabledLanguages": ["plaintext", "markdown", "scminput"],
  "cursor.terminal.usePreviewBox": true,
  "cursor.cpp.enablePartialAccepts": true,
  "cursor.aipreview.enabled": true,
  "chat.editor.fontSize": 21,
  // Only show error on Eslint
  "eslint.quiet": true,
  // Formatter per file type: use default LSP server
  // NOTE: Change to Prettier or Biome per project if needed
  "[json]": {
    "editor.defaultFormatter": "vscode.json-language-features"
  },
  "[jsonc]": {
    "editor.defaultFormatter": "vscode.json-language-features"
  },
  "[typescriptreact]": {
    "editor.defaultFormatter": "vscode.typescript-language-features"
  },
  "[css]": {
    "editor.defaultFormatter": "vscode.css-language-features"
  },
  "[typescript]": {
    "editor.defaultFormatter": "vscode.typescript-language-features"
  },
  // Setup fzf picker extension
  "fzf-picker.customTasks": [
    {
      "name": "zoxide",
      "command": "cursor $(zoxide query --interactive)"
    }
  ],
  "fzf-picker.general.openCommand": "cursor -g",
  "fzf-picker.general.debugMode": true,
  "security.promptForLocalFileProtocolHandling": false,
  // Biome setup
  "editor.codeActionsOnSave": {
    // https://biomejs.dev/reference/vscode/#fix-on-save
    "quickfix.biome": "explicit"
    // Sort import, experimental
    // "source.organizeImports.biome": "explicit"
  },
  // hurl runner
  "vscode-hurl-runner.captureToGlobalVariable": true,
  "vscode-hurl-runner.verboseMode": "very-verbose",
  "[html]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[javascript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  // Custom terminal
  "terminal.external.osxExec": "ghostty",
  // Git lens
  "gitlens.graph.layout": "editor",
  "gitlens.statusBar.enabled": false,
  "gitlens.hovers.currentLine.over": "line",
  "gitlens.codeLens.enabled": false,
  "gitlens.graph.dateStyle": "relative"
}

Keymaps

Generally, I use the combination of <CMD + K> + <shift + key> to trigger bindings. All other bindings are set up using Neovim's extension keymaps.

Update your keybindings.json file with the following key bindings:

// keybindings.json, generated at Thu Feb 27 2025 20:59:48 GMT+0800 (Singapore Standard Time)
[
  // Folding, refer https://github.com/vscode-neovim/vscode-neovim/issues/58#issuecomment-1316470317
  {
    "command": "editor.toggleFold",
    "key": "z a",
    "when": "editorTextFocus && neovim.mode == normal"
  },
  {
    "command": "editor.unfoldAll",
    "key": "z shift+r",
    "when": "editorTextFocus && neovim.mode == normal"
  },
  {
    "command": "editor.foldAll",
    "key": "z shift+m",
    "when": "editorTextFocus && neovim.mode == normal"
  },
  {
    "command": "editor.unfold",
    "key": "z o",
    "when": "editorTextFocus && neovim.mode == normal"
  },
  {
    "command": "editor.unfoldRecursively",
    "key": "z shift+o",
    "when": "editorTextFocus && neovim.mode == normal"
  },
  {
    "command": "editor.fold",
    "key": "z c",
    "when": "editorTextFocus && neovim.mode == normal"
  },
  {
    "command": "editor.foldRecursively",
    "key": "z shift+c",
    "when": "editorTextFocus && neovim.mode == normal"
  },
  {
    "command": "editor.foldAllExcept",
    "key": "z shift+v",
    "when": "editorTextFocus && neovim.mode == normal"
  },
  {
    "command": "editor.gotoNextFold",
    "key": "z j",
    "when": "editorTextFocus && neovim.mode == normal"
  },
  {
    "command": "editor.gotoPreviousFold",
    "key": "z k",
    "when": "editorTextFocus && neovim.mode == normal"
  },
  // Use single tab
  {
    "key": "cmd+k shift+t",
    "command": "workbench.action.showEditorTab"
  },
  // Use multiple tabs
  {
    "key": "cmd+k shift+m",
    "command": "workbench.action.showMultipleEditorTabs"
  },
  // Toggle status bar
  {
    "key": "cmd+k shift+s",
    "command": "workbench.action.toggleStatusbarVisibility"
  },
  // Toggle record screen cast
  {
    "key": "cmd+k shift+r",
    "command": "workbench.action.toggleScreencastMode"
  },
  // Toggle error lens - warning
  {
    "key": "cmd+k shift+w",
    "command": "errorLens.toggleWarning"
  },
  // TODO: Wait for this to resolve https://github.com/usernamehw/vscode-error-lens/issues/208
  // Setup which-key
  {
    "key": "cmd+space", // Disable Spotlight and use Raycast with Alt+space, refer https://manual.raycast.com/hotkey
    "command": "whichkey.show",
    "when": "editorTextFocus"
  },
  // Toggle full screen
  {
    "key": "cmd+k f",
    "command": "workbench.action.toggleMaximizedPanel"
  },
  // Open Github Pull Request
  {
    "key": "cmd+k g",
    "command": "workbench.view.extension.github-pull-requests"
  },
  // Toggle version lens
  {
    "key": "cmd+k shift+v",
    "command": "versionlens.icons.showVersionLenses"
  },
  // Zen mode
  {
    "key": "cmd+k c",
    "command": "workbench.action.toggleCenteredLayout"
  },
  // Chat on terminal
  {
    "key": "ctrl+cmd+k",
    "command": "cursorai.action.generateInTerminal",
    "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalProcessSupported"
  },
  {
    "key": "cmd+k",
    "command": "-cursorai.action.generateInTerminal",
    "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalProcessSupported"
  }
]

How to integrated with your Neovim

  1. Install the VSCode Neovim extension.
  2. Below is my configuration from my my personal neovim configuration with lazy.nvim as package manager.
// vscode.lua, generated at Thu Feb 27 2025 20:59:48 GMT+0800 (Singapore Standard Time)
if not vim.g.vscode then
  return {}
end

local enabled = {
  "lazy.nvim",
  "nvim-treesitter",
  "ts-comments.nvim",
  "nvim-treesitter",
  "nvim-treesitter-textobjects",
  "nvim-ts-context-commentstring",
  "vim-repeat",
}

local Config = require("lazy.core.config")
Config.options.checker.enabled = false
Config.options.change_detection.enabled = false
Config.options.defaults.cond = function(plugin)
  return vim.tbl_contains(enabled, plugin.name) or plugin.vscode
end

-- Add some vscode specific keymaps
-- Refer to https://github.com/vscode-neovim/vscode-neovim#code-navigation-bindings for default keymaps
vim.api.nvim_create_autocmd("User", {
  pattern = "NvimIdeKeymaps", -- This pattern will be called when the plugin is loaded
  callback = function()
    local vscode = require("vscode")
    -- +File
    -- Find file
    vim.keymap.set("n", "<leader><space>", "<cmd>Find<cr>")

    -- Find recent open files
    vim.keymap.set("n", "<leader>fr", function()
      vscode.action("workbench.action.showAllEditorsByMostRecentlyUsed")
    end)

    -- Need to install https://github.com/jellydn/vscode-fzf-picker
    vim.keymap.set("n", "<leader>ff", function()
      vscode.action("fzf-picker.findFiles")
    end)
    -- Find word
    vim.keymap.set({ "n", "v" }, "<leader>fw", function()
      vscode.action("fzf-picker.findWithinFiles")
    end)
    vim.keymap.set("n", "<leader>fw", function()
      vscode.action("editor.action.addSelectionToNextFindMatch")
      vscode.action("fzf-picker.findWithinFiles")
    end)
    -- Find file from git status
    vim.keymap.set("n", "<leader>fg", function()
      vscode.action("fzf-picker.pickFileFromGitStatus")
    end)
    -- Resume last search
    vim.keymap.set("n", "<leader>fR", function()
      vscode.action("fzf-picker.resumeSearch")
    end)
    -- Find todo/fixme
    vim.keymap.set("n", "<leader>fx", function()
      vscode.action("fzf-picker.findTodoFixme")
    end)

    -- Open other files
    vim.keymap.set("n", "<leader>,", function()
      vscode.action("workbench.action.showAllEditors")
    end)
    -- Find in files
    vim.keymap.set("n", "<leader>/", function()
      vscode.action("workbench.action.findInFiles")
    end)
    -- Open file explorer in left sidebar
    vim.keymap.set("n", "<leader>e", function()
      vscode.action("workbench.view.explorer")
    end)

    -- +Search
    -- Open symbol
    vim.keymap.set("n", "<leader>ss", function()
      vscode.action("workbench.action.gotoSymbol")
    end)
    -- Search word under cursor
    vim.keymap.set("n", "<leader>sw", function()
      vscode.action("editor.action.addSelectionToNextFindMatch")
      vscode.action("workbench.action.findInFiles")
      -- Or send as the param like this: code.action("workbench.action.findInFiles", { args = { query = vim.fn.expand("<cword>") } })
    end)

    -- Keep undo/redo lists in sync with VsCode
    vim.keymap.set("n", "u", "<Cmd>call VSCodeNotify('undo')<CR>")
    vim.keymap.set("n", "<C-r>", "<Cmd>call VSCodeNotify('redo')<CR>")
    -- Navigate VSCode tabs like lazyvim buffers
    vim.keymap.set("n", "<S-h>", "<Cmd>call VSCodeNotify('workbench.action.previousEditor')<CR>")
    vim.keymap.set("n", "<S-l>", "<Cmd>call VSCodeNotify('workbench.action.nextEditor')<CR>")

    -- Search work in current buffer
    vim.keymap.set("n", "<leader>sb", function()
      vscode.action("actions.find")
    end)

    -- +Code
    -- Code Action
    vim.keymap.set("n", "<leader>ca", function()
      vscode.action("editor.action.codeAction")
    end)
    -- Source Action
    vim.keymap.set("n", "<leader>cA", function()
      vscode.action("editor.action.sourceAction")
    end)
    -- Code Rename
    vim.keymap.set("n", "<leader>cr", function()
      vscode.action("editor.action.rename")
    end)
    -- Quickfix shortcut
    vim.keymap.set("n", "<leader>.", function()
      vscode.action("editor.action.quickFix")
    end)
    -- Code format
    vim.keymap.set("n", "<leader>cf", function()
      vscode.action("editor.action.formatDocument")
    end)
    -- Refactor
    vim.keymap.set("n", "<leader>cR", function()
      vscode.action("editor.action.refactor")
    end)

    -- +Terminal
    -- Open terminal
    vim.keymap.set("n", "<leader>ft", function()
      vscode.action("workbench.action.terminal.focus")
    end)

    -- +LSP
    -- View problem
    vim.keymap.set("n", "<leader>xx", function()
      vscode.action("workbench.actions.view.problems")
    end)
    -- Go to next/prev error
    vim.keymap.set("n", "]e", function()
      vscode.action("editor.action.marker.next")
    end)
    vim.keymap.set("n", "[e", function()
      vscode.action("editor.action.marker.prev")
    end)

    -- Find references
    vim.keymap.set("n", "gr", function()
      vscode.action("references-view.find")
    end)

    -- +Git
    -- Git status
    vim.keymap.set("n", "<leader>gs", function()
      vscode.action("workbench.view.scm")
    end)
    -- Go to next/prev change
    vim.keymap.set("n", "]h", function()
      vscode.action("workbench.action.editor.nextChange")
    end)
    vim.keymap.set("n", "[h", function()
      vscode.action("workbench.action.editor.previousChange")
    end)

    -- Revert change
    vim.keymap.set("v", "<leader>ghr", function()
      vscode.action("git.revertSelectedRanges")
    end)

    -- +Buffer
    -- Close buffer
    vim.keymap.set("n", "<leader>bd", function()
      vscode.action("workbench.action.closeActiveEditor")
    end)
    -- Close other buffers
    vim.keymap.set("n", "<leader>bo", function()
      vscode.action("workbench.action.closeOtherEditors")
    end)

    -- +Project
    vim.keymap.set("n", "<leader>fp", function()
      vscode.action("workbench.action.openRecent")
    end)

    -- Markdown preview
    vim.keymap.set("n", "<leader>mp", function()
      vscode.action("markdown.showPreviewToSide")
    end)

    -- Hurl runner, https://github.com/jellydn/vscode-hurl-runner
    vim.keymap.set("n", "<leader>ha", function()
      vscode.action("vscode-hurl-runner.runHurl")
    end)
    vim.keymap.set("n", "<leader>hr", function()
      vscode.action("vscode-hurl-runner.rerunLastCommand")
    end)
    vim.keymap.set("n", "<leader>hA", function()
      vscode.action("vscode-hurl-runner.runHurlFile")
    end)
    vim.keymap.set("n", "<leader>he", function()
      vscode.action("vscode-hurl-runner.runHurlFromBegin")
    end)
    vim.keymap.set("n", "<leader>hE", function()
      vscode.action("vscode-hurl-runner.runHurlToEnd")
    end)
    vim.keymap.set("n", "<leader>hg", function()
      vscode.action("vscode-hurl-runner.manageInlineVariables")
    end)
    vim.keymap.set("n", "<leader>hh", function()
      vscode.action("vscode-hurl-runner.viewLastResponse")
    end)
    vim.keymap.set("v", "<leader>hh", function()
      vscode.action("vscode-hurl-runner.runHurlSelection")
    end)

    -- Run task
    vim.keymap.set("n", "<leader>rt", function()
      vscode.action("workbench.action.tasks.runTask")
    end)
    -- Re-run
    vim.keymap.set("n", "<leader>rr", function()
      vscode.action("workbench.action.tasks.reRunTask")
    end)

    -- Debug typescript type, used with https://marketplace.visualstudio.com/items?itemName=Orta.vscode-twoslash-queries
    vim.keymap.set("n", "<leader>dd", function()
      vscode.action("orta.vscode-twoslash-queries.insert-twoslash-query")
    end)

    -- Other keymaps will be used with https://github.com/VSpaceCode/vscode-which-key, so we don't need to define them here
    -- Trigger which-key by pressing <CMD+Space>, refer more default keymaps https://github.com/VSpaceCode/vscode-which-key/blob/15c5aa2da5812a21210c5599d9779c46d7bfbd3c/package.json#L265
  end,
})

return {
  {
    "xiyaowong/fast-cursor-move.nvim",
    vscode = true,
    enabled = vim.g.vscode,
    init = function()
      -- Disable acceleration, use key repeat settings instead
      vim.g.fast_cursor_move_acceleration = false
    end,
  },
  {
    "nvim-treesitter/nvim-treesitter",
    opts = { highlight = { enable = false } },
  },
}

Tips

  • Improve key repeat on Mac OSX, need to restart
defaults write NSGlobalDomain KeyRepeat -int 1
defaults write NSGlobalDomain InitialKeyRepeat -int 14
  • VSCode on Mac

To enable key-repeating, execute the following in your Terminal, log out and back in, and then restart VS Code:

# For VS Code
defaults write com.microsoft.VSCode ApplePressAndHoldEnabled -bool false
# For VS Codium
defaults write com.microsoft.VSCodium ApplePressAndHoldEnabled -bool false
# For VS Code Insider
defaults write com.microsoft.VSCodeInsiders ApplePressAndHoldEnabled -bool false
# For Codium Insider
defaults write com.microsoft.VSCodiumInsiders ApplePressAndHoldEnabled -bool false
# If necessary, reset global default
defaults delete -g ApplePressAndHoldEnabled
# For Cursor
defaults write com.todesktop.230313mzl4w4u92 ApplePressAndHoldEnabled -bool false

Also increasing Key Repeat and Delay Until Repeat settings in System Preferences -> Keyboard.

Key repeat rate

  • Disable full stop with double-space if you see the delay with <space>-<space>

Which-key## How to generate the settings

sh cli.sh $EDITOR_NAME
  • Improve key repeat on Mac OSX, need to restart
defaults write NSGlobalDomain KeyRepeat -int 1
defaults write NSGlobalDomain InitialKeyRepeat -int 14
  • VSCode on Mac

To enable key-repeating, execute the following in your Terminal, log out and back in, and then restart VS Code:

# For VS Code
defaults write com.microsoft.VSCode ApplePressAndHoldEnabled -bool false
# For VS Code Insider
defaults write com.microsoft.VSCodeInsiders ApplePressAndHoldEnabled -bool false
# If necessary, reset global default
defaults delete -g ApplePressAndHoldEnabled
# For Cursor
defaults write com.todesktop.230313mzl4w4u92 ApplePressAndHoldEnabled -bool false

Also increasing Key Repeat and Delay Until Repeat settings in System Preferences -> Keyboard.

Key repeat rate

Demo

Theme switcher

Resources

My other editor setups

Author

👤 Huynh Duc Dung

Show your support

If this guide has been helpful, please give it a ⭐️.

kofi paypal buymeacoffee

About

Make your VSCode Awesome! Minimalist, Productive, and Performance.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •