Skip to content

VSCode 配置

settings.json

json
{
  // Prettier is the default formatter for most languages  
  // esbenp is the author of Prettier plugin
  "editor.defaultFormatter": "esbenp.prettier-vscode",  

  // Exceptions:  
  "[html]": {  
      "editor.defaultFormatter": "vscode.html-language-features"  
  },
  "[vue]": {  
      "editor.defaultFormatter": "Vue.volar"  
  },  

  // Other specific settings  
  "[json]": {
    "editor.quickSuggestions": {
      "strings": true // 开启自动提示功能,当键入字符串时会自动列出可选项。
    },
    // 在选择建议项时使用替换模式,即选择建议项后会覆盖当前输入的内容。
    "editor.suggest.insertMode": "replace",
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },  
  "[python]": {  
      "editor.formatOnType": true  
  },  
  "[markdown]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    // 使得在 md 文件中可以使用 snippets
    "editor.quickSuggestions": {
      "other": true,
      "comments": true,
      "strings": true
    },
    "editor.acceptSuggestionOnEnter": "on"
  },
  // 在键入 JavaScript 代码时,如果 editor.formatOnType 设置为 true,
  // 则当输入结束符号(如分号或大括号)时,编辑器会自动对整个行或当前作用域
  // 的代码进行格式化。这有助于保持代码的一致性和可读性,并减少手动格式化的工作量。
  "editor.formatOnType": true,
  // 保存时自动运行 eslint 工具来修复所有错误和警告
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true
  },
  "editor.detectIndentation": false, // 禁用自动检测文件使用的缩进风格
  "editor.fontFamily": "Fira Code, monospace",
  "editor.fontSize": 16,
  "editor.hover.delay": 2000,
  "editor.inlineSuggest.enabled": true,
  "editor.lineHeight": 28,
  "editor.lineNumbers": "relative",
  "editor.minimap.enabled": false,
  "editor.suggestSelection": "first",
  "editor.tabSize": 2,
  "editor.unicodeHighlight.ambiguousCharacters": false,
  "editor.wordSeparators": "_`~!@$%^&*()=+[{]}\\|;:'\",.<>/?",
  "editor.cursorSmoothCaretAnimation": "on",
  "editor.autoClosingBrackets": "always",
  "editor.inlineSuggest.showToolbar": "onHover",

  "template-string-converter.validLanguages": [
    "javascript",
    "typescript",
    "jsx",
    "tsx",
    "html",
    "vue",
    "svelte",
    "yaml",
    "json"
  ],

  "eslint.codeAction.showDocumentation": {
    "enable": true
  },
  "eslint.enable": false,
  "eslint.validate": ["javascript", "javascriptreact", "html", "vue"],

  "prettier.arrowParens": "avoid", //x => x 而不是 (x) => x
  "prettier.bracketSameLine": true, //多行对象或数组字面量的大括号 { 或 [ 与第一个元素在同一行
  "prettier.bracketSpacing": true, //在对象、数组括号与它们的内容之间打印空格。例如,{ foo: bar } 而不是 {foo: bar}
  "prettier.htmlWhitespaceSensitivity": "css",
  "prettier.jsxSingleQuote": true,
  "prettier.printWidth": 100, //一行代码的最大字符数。
  "prettier.semi": true,
  "prettier.singleQuote": true,
  "prettier.tabWidth": 2,
  "prettier.useEditorConfig": false, //不使用.editorconfig文件中的设置
  "prettier.vueIndentScriptAndStyle": false, //对于Vue文件中的<script>和<style>标签,不额外缩进其内容
  // "prettier.singleAttributePerLine": true,

  "explorer.confirmDragAndDrop": false,
  "explorer.confirmDelete": false,

  "workbench.colorTheme": "One Dark Pro Darker",
  "workbench.editor.enablePreview": false,
  "workbench.editor.showTabs": "single",
  "workbench.editor.wrapTabs": true, //启用标签页的换行显示。当打开的标签页太多而无法在一行内完全显示时,此设置允许标签页换行显示,以便你可以看到所有的标签
  "workbench.iconTheme": "material-icon-theme",
  "workbench.startupEditor": "none", //设置VSCode启动时是否打开任何编辑器
  "workbench.tree.enableStickyScroll": true,

  // 默认使用 bash 为终端
  "terminal.integrated.defaultProfile.windows": "MyBash",
  "terminal.integrated.profiles.windows": {
    "MyBash": {
      "path": "E:\\Git\\Git\\bin\\bash.exe"
    }
  },

  "debug.javascript.autoAttachFilter": "smart",
  "debug.allowBreakpointsEverywhere": true,

  "vim.hlsearch": true,
  "vim.easymotion": true,
  "vim.sneak": true,
  "vim.leader": "<space>",
  "vim.useSystemClipboard": true,
  // normal mode
  "vim.normalModeKeyBindings": [
    {
      "before": ["H"],
      "after": ["^"]
    },
    {
      "before": ["L"],
      "after": ["g", "_"]
    },
    {
      "before": ["K"],
      "after": ["h", "$", "V", "%"]
    },
    // 删除两个空格之间的字符串
    {
      "before": ["<leader>", "s"],
      "after": ["B", "d", "E", "a"]
    },
    {
      "before": ["<leader>", "t", "f"],
      "commands": [":tabfirst"]
    },
    {
      "before": ["<leader>", "t", "l"],
      "commands": [":tablast"]
    },
    {
      "before": ["<leader>", "t", "n"],
      "commands": [":tabnext"]
    },
    {
      "before": ["<leader>", "t", "p"],
      "commands": [":tabprev"]
    },
    {
      "before": ["<leader>", "1"],
      "commands": ["workbench.action.focusFirstEditorGroup"]
    },
    {
      "before": ["<leader>", "2"],
      "commands": ["workbench.action.focusSecondEditorGroup"]
    },
    {
      "before": ["<leader>", "f"],
      "commands": ["workbench.action.closeOtherEditors"]
    },
    {
      "before": ["<leader>", "i"],
      "after": ["/", "i", "m", "p", "o", "r", "t", " ", "<Enter>", "z", "z"]
    },
    {
      "before": ["<leader>", "a"],
      "after": ["/", "n", "a", "m", "e", ":", "<Enter>", "z", "z"]
    },
    {
      "before": ["<leader>", "d"],
      "after": ["/", "d", "a", "t", "a", "\\", "(", "\\", ")", "<leader>", "{", "<Enter>", "z", "z"]
    },
    {
      "before": ["<leader>", "c"],
      "after": ["/", "c", "o", "m", "p", "o", "n", "e", "n", "t", "s", ":", "<Enter>", "z", "z"]
    },
    {
      "before": ["<leader>", "p"],
      "after": ["/", "p", "r", "o", "p", "s", ":", "<Enter>", "z", "z"]
    },
    {
      "before": ["<leader>", "o"],
      "after": ["/", "c", "o", "m", "p", "u", "t", "e", "d", ":", "<Enter>", "z", "z"]
    },
    {
      "before": ["<leader>", "w"],
      "after": ["/", "w", "a", "t", "c", "h", ":", "<Enter>", "z", "z"]
    },
    {
      "before": ["<leader>", "r"],
      "after": ["/", "c", "r", "e", "a", "t", "e", "d", "<Enter>", "z", "z"]
    },
    {
      "before": ["<leader>", "m"],
      "after": ["/", "m", "o", "u", "n", "t", "e", "d", "<Enter>", "z", "z"]
    },
    {
      "before": ["<leader>", "e"],
      "after": ["/", "m", "e", "t", "h", "o", "d", "s", "<Enter>", "z", "z"]
    },
    {
      "before": ["<leader>", "l"],
      "after": ["/", "l", "a", "n", "g", "<Enter>", "z", "z"]
    }
  ],
  "vim.normalModeKeyBindingsNonRecursive": [
    {
      "before": ["<C-j>"],
      "after": ["4", "j", "z", "z"]
    },
    {
      "before": ["<C-a>"],
      "after": ["9", "j", "z", "z"]
    },
    {
      "before": ["<C-k>"],
      "after": ["4", "k", "z", "z"]
    },
    {
      "before": ["<C-x>"],
      "after": ["9", "k", "z", "z"]
    },
    {
      "before": ["<C-d>"],
      "commands": ["editor.action.peekDefinition"]
    },
    
    // 跳到 data 位置并自动补上复制的值(快速生成对应的 data)
    {
      "before": ["q"],
      "after": [
        "y",
        "i",
        "w",
        "/",
        "d",
        "a",
        "t",
        "a",
        "\\",
        "(",
        "\\",
        ")",
        "<Enter>",
        "z",
        "z",
        "j",
        "o",
        "<C-v>",
        ":",
        "<leader>",
        ",",
        "<Esc>",
        "i"
      ]
    },
    // 快速生成对应的 methods
    {
      "before": [";"],
      "after": [
        "y",
        "i",
        "w",
        "/",
        "m",
        "e",
        "t",
        "h",
        "o",
        "d",
        "s",
        "(",
        ")",
        "<Enter>",
        "z",
        "z",
        "o",
        "<C-v>",
        "(",
        ")",
        "<leader>",
        "{",
        "}",
        ",",
        "<Esc>",
        "h",
        "i",
        "<Enter>"
      ]
    },
    // 从 template 里的 class 跳到 style 标签里的 class(右边是双引号时)
    {
      "before": ["<leader>", "j"],
      "after": ["F", "\"", "l", "v", "t", "\"", "y", "/", "<C-r>", "\"", "<leader>", "<Enter>"]
    },
    // 从 template 里的 class 跳到 style 标签里的 class(右边是空格时)
    {
      "before": ["<leader>", "n"],
      "after": [
        "F",
        "\"",
        "l",
        "v",
        "t",
        "<leader>",
        "y",
        "/",
        "<C-r>",
        "\"",
        "<leader>",
        "<Enter>"
      ]
    },
    // 从 style 标签里的 class 跳到 template 里的 class
    {
      "before": ["<leader>", "k"],
      "after": [
        "F",
        ".",
        "l",
        "v",
        "t",
        "<leader>",
        "y",
        "/",
        "class=\"(.*",
        "<C-r>",
        "\"",
        ".*)",
        "<Enter>"
      ]
    },
    {
      "before": ["w"],
      "after": ["w", "w"]
    },
    {
      "before": ["b"],
      "after": ["b", "b"]
    },
    {
      "before": ["u"],
      "after": ["<C-u>", "z", "z"]
    },
    {
      "before": ["n"],
      "after": ["*"]
    },
    {
      "before": [
        "m"
      ],
      "commands": [
        "bookmarks.toggle"
      ]
    },
    {
      "before": [","],
      "commands": [
        "bookmarks.jumpToNext"
      ]
    },
    {
      "before": ["'"],
      "commands": [
        "bookmarks.jumpToPrevious"
      ]
    },
    {
      "before": ["s", "f"],
      "after": ["<Esc>", "<leader>", "<leader>", "s"]
    },
    // 快速复制颜色值
    {
      "before": ["y", "c"],
      "after": ["F", "#", "v", "6", "l", "y"]
    },
    // 复制光标所在单词到寄存器a, 同时删除这一行
    {
      "before": ["y", "r"],
      "after": ["\"", "a", "y", "i", "w", "d", "d"]
    },
    // 从当前光标所在字符复制到当前行最后一个字符
    {
      "before": ["y", "e"],
      "after": ["v", "g", "_", "y"]
    },
    // 复制两个空格之间的字符串
    {
      "before": ["y", "<leader>"],
      "after": ["B", "y", "E"]
    },
    // 复制反引号里的内容
    {
      "before": ["y", "`"],
      "after": ["F", "`", "l", "y", "t", "`"]
    },
    // 复制单引号里的内容
    {
      "before": ["y", "'"],
      "after": ["F", "'", "l", "y", "t", "'"]
    },
    // 复制双引号里的内容
    {
      "before": ["y", "\""],
      "after": ["F", "\"", "l", "y", "t", "\""]
    },
    // 粘贴上一次复制的值
    {
      "before": ["p", "c"],
      "after": ["p"]
    },
    // 粘贴a寄存器的值
    {
      "before": ["p", "p"],
      "after": ["v", "i", "w", "\"", "a", "p"]
    },
    // 将单引号里的内容删除, 并将复制的内容粘贴到单引号里
    {
      "before": ["p", "'"],
      "after": ["F", "'", "l", "h", "p", "l", "d", "t", "'"]
    },
    // 从当前位置将复制的内容粘贴到右边单引号里
    {
      "before": ["p", "t", "'"],
      "after": ["p", "l", "d", "t", "'"]
    },
    // 将双引号里的内容删除, 并将复制的内容粘贴到单引号里
    {
      "before": ["p", "\""],
      "after": ["F", "\"", "l", "h", "p", "l", "d", "t", "\""]
    },
    // 从当前位置将复制的内容粘贴到右边双引号里
    {
      "before": ["p", "t", "\""],
      "after": ["p", "l", "d", "t", "\""]
    },
    // 将反引号里的内容删除, 并将复制的内容粘贴到反引号里
    {
      "before": ["p", "`"],
      "after": ["F", "`", "l", "h", "p", "l", "d", "t", "`"]
    },
    // 从当前位置将复制的内容粘贴到右边反引号里
    {
      "before": ["p", "t", "`"],
      "after": ["p", "l", "d", "t", "`"]
    },
    // 将标签里的内容删除, 并将复制的内容粘贴到标签里
    {
      "before": ["p", "i", "t"],
      "after": [ "d", "i", "t", "i", "<CR>", "<Esc>", "\"", "0", "p"]
    },
    // 往下一行粘贴复制的内容
    {
      "before": ["p", "o"],
      "after": ["o", "<C-v>"]
    },
    // 往上一行粘贴复制的内容
    {
      "before": ["p", "O"],
      "after": ["O", "<C-v>"]
    }
  ],
  // insert mode
  "vim.insertModeKeyBindings": [
    {
      "before": ["<C-q>"],
      "after": ["<Enter>"]
    },
    {
      "before": ["<C-i>"],
      "after": ["<Esc>"]
    },
    {
      "before": ["j", "j"],
      "after": ["<Esc>"]
    },
    {
      "before": ["j", "k"],
      "after": ["<Esc>", "l", "a", ","]
    },
    {
      "before": ["j", "n"],
      "after": ["<Esc>", "o"]
    },
    {
      "before": ["j", ";"],
      "after": ["<Esc>", "A", ";", "<Esc>", "o"]
    },
    {
      "before": ["j", ","],
      "after": ["<Esc>", "A", ",", "<Esc>", "o"]
    },
    {
      "before": ["j", "l"],
      "after": ["right"]
    },
    {
      "before": ["<C-j>"],
      "after": ["<Esc>", "d", "d"]
    },
    {
      "before": ["<C-l>"],
      "after": ["<Esc>", "A"]
    },
    {
      "before": ["<C-h>"],
      "after": ["<Esc>", "I"]
    }
  ],
  // visual mode
  "vim.visualModeKeyBindings": [
    {
      "before": ["H"],
      "after": ["^"]
    },
    {
      "before": ["L"],
      "after": ["g", "_"]
    },
    {
      "before": ["w"],
      "after": ["i", "w"]
    }
  ],
  "vim.visualModeKeyBindingsNonRecursive": [
    // 粘贴上一次复制的值
    // {
    //   "before": ["p"],
    //   "after": ["\"", "0", "p"]
    // },
    // 复制后将光标定位到最后一个字符
    {
      "before": ["y"],
      "after": ["y", "g", "_", "%"]
    },
    {
      "before": ["<C-f>"],
      "commands": ["editor.action.startFindReplaceAction"]
    },
  ],
  "vim.operatorPendingModeKeyBindings": [
    {
      "before": ["H"],
      "after": ["^"]
    },
    {
      "before": ["L"],
      "after": ["g", "_"]
    }
  ],
  "vim.operatorPendingModeKeyBindingsNonRecursive": [
    {
      "before": ["w"],
      "after": ["i", "w"]
    },
    {
      "before": ["b"],
      "after": ["i", "b"]
    },
    {
      "before": ["B"],
      "after": ["i", "B"]
    }
  ],
  "vim.handleKeys": {
    // "<C-c>": false,
    "<C-v>": false,
    // "<C-x>": false,
    // "<C-z>": false,
    // "<C-a>": false,
    // "<C-f>": false,
    "<C-y>": false,
    "<C-u>": false,
    "<C-p>": false
  },
  
  // windows 才使用的设置, mac 使用鼠须管
  "vim.autoSwitchInputMethod.enable": true,
  "vim.autoSwitchInputMethod.obtainIMCmd": "C:\\im-select.exe",
  "vim.autoSwitchInputMethod.switchIMCmd": "C:\\im-select.exe {im}",
  "vim.autoSwitchInputMethod.defaultIM": "\"1033\"",

  "search.exclude": {
    "**/node_modules": false,
    "**/bower_components": true
  },
  "htmltagwrap.tag": "div",
  "files.insertFinalNewline": true,
  "files.exclude": {
    "**/.git": false
  },
  "fittencode.languagePreference.displayPreference": "en",
  "fittencode.languagePreference.commentPreference": "en"
}

keybindings.json

json

// 将键绑定放在此文件中以覆盖默认值auto[]
[
  {
    "key": "ctrl+shift+j",
    "command": "vim.remap",
    "when": "inputFocus && (vim.mode == 'Normal' || vim.mode == 'Insert')",
    "args": {
      "after": ["y", "y", "p", "p"]
    }
  },
  {
    "key": "ctrl+shift+k",
    "command": "vim.remap",
    "when": "inputFocus && (vim.mode == 'Normal' || vim.mode == 'Insert')",
    "args": {
      "after": ["y", "y", "P"]
    }
  },
  // ctrl + ;
  {
    "key": "ctrl+oem_1",
    "command": "workbench.view.explorer",
    "when": "viewContainer.workbench.view.explorer.enabled"
  },
  // ctrl + `
  {
    "key": "ctrl+oem_2",
    "command": "workbench.action.terminal.sendSequence",
    "when": "terminalFocus"
  },
  {
    "key": "shift+a",
    "command": "explorer.newFolder",
    "when": "filesExplorerFocus && !inputFocus"
  },
  {
    "key": "a",
    "command": "explorer.newFile",
    "when": "filesExplorerFocus && !inputFocus"
  },
  {
    "key": "d",
    "command": "deleteFile",
    "when": "explorerViewletVisible && filesExplorerFocus && !explorerResourceReadonly && !inputFocus"
  },
  {
    "key": "r",
    "command": "renameFile",
    "when": "explorerViewletVisible && filesExplorerFocus && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
  },
  {
    "key": "alt+j",
    "command": "editor.action.moveLinesDownAction",
    "when": "editorTextFocus && !editorReadonly"
  },
  {
    "key": "alt+down",
    "command": "-editor.action.moveLinesDownAction",
    "when": "editorTextFocus && !editorReadonly"
  },
  {
    "key": "alt+k",
    "command": "editor.action.moveLinesUpAction",
    "when": "editorTextFocus && !editorReadonly"
  },
  {
    "key": "alt+up",
    "command": "-editor.action.moveLinesUpAction",
    "when": "editorTextFocus && !editorReadonly"
  },
  {
    "key": "tab",
    "command": "selectNextSuggestion",
    "when": "suggestWidgetMultipleSuggestions && suggestWidgetVisible && textInputFocus || suggestWidgetVisible && textInputFocus && !suggestWidgetHasFocusedSuggestion"
  },
  {
    "key": "down",
    "command": "selectNextSuggestion",
    "when": "suggestWidgetMultipleSuggestions && suggestWidgetVisible && textInputFocus || suggestWidgetVisible && textInputFocus && !suggestWidgetHasFocusedSuggestion"
  },
  {
    "key": "shift+tab",
    "command": "selectPrevSuggestion",
    "when": "suggestWidgetMultipleSuggestions && suggestWidgetVisible && textInputFocus || suggestWidgetVisible && textInputFocus && !suggestWidgetHasFocusedSuggestion"
  },
  {
    "key": "up",
    "command": "selectPrevSuggestion",
    "when": "suggestWidgetMultipleSuggestions && suggestWidgetVisible && textInputFocus || suggestWidgetVisible && textInputFocus && !suggestWidgetHasFocusedSuggestion"
  },
  {
    "key": "ctrl+z",
    "command": "workbench.action.terminal.focus",
  }, 
  {
    "key": "ctrl+z",
    "command": "workbench.action.focusActiveEditorGroup",
    "when": "terminalFocus"
  },
]