vscode + vim 全鍵盤操作高效搭配方案


基礎知識

vscode-vim

vscode-vim是一款vim模擬器,它將vim的大部分功能都集成在了vscode中,你可以將它理解為一個嵌套在vscode中的vim。

由於該vim是被模擬的的非真實vim,所以原生vim中有些功能它並不支持,如宏錄制功能,但這依然不妨礙vscode-vim插件的優秀。

其實在vscode的擴展商店中,還有一個vscode neovim的插件也十分不錯,但是相較於vscode-vim來說依然存在一些讓我難以接受的缺點,比如visual模式下的選擇並非真正的vscode選擇等,基於種種原因我還是考慮使用vscode-vim,盡管它可能占用了更大的內存。

安裝使用

我們需要在插件商店中搜索vim插件,然后安裝:

image-20211106152007384

安裝完成之后,需要做一些基礎配置。

1)僅MAC用戶,關閉MAC的重復鍵:

$ defaults write com.microsoft.VSCode ApplePressAndHoldEnabled -bool false  

2)設置相對行號,在settings.json中添加上以下配置項:

"editor.lineNumbers": "relative",

3)關閉自動傳參建議,使用按鍵手動觸發:

"editor.parameterHints.enabled": false,

4)控制資源管理器中的鍵盤導航無法自動觸發:

"workbench.list.automaticKeyboardNavigation": false,

配置文件

基礎配置項

vscode-vim插件由於是一款模擬器,所以它的配置文件是放在settings.json文件中,而不是vimrc文件中,個人也並不推薦將配置放在vimrc文件中,因為這會導致多端同步變的復雜,盡管這款插件可以支持從vimrc文件中讀取配置。

下面是一些我會在使用vscode-vim插件時配置的vim選項,直接放入到settings.json文件中即可:

{
  // 綁定vim前導鍵
  "vim.leader": "<space>",
  // 啟用easymotion插件
  "vim.easymotion": true,
  // 啟用系統粘貼板作為vim寄存器
  "vim.useSystemClipboard": true,
  // 由vim接管ctrl+any的按鍵,而不是vscode
  "vim.useCtrlKeys": true,
  // 突出顯示與當前搜索匹配的所有文本
  "vim.hlsearch": true,
   // 普通模式下的非遞歸按鍵綁定
  "vim.normalModeKeyBindingsNonRecursive": [],
   // 插入模式下的非遞歸按鍵綁定
  "vim.insertModeKeyBindings": [],
  // 命令模式下的非遞歸按鍵綁定
  "vim.commandLineModeKeyBindingsNonRecursive": [],
  // 可視模式下的非遞歸按鍵綁定
  "vim.operatorPendingModeKeyBindings": [],
  // 下面定義的按鍵將交由vscode進行處理,而不是vscode-vim插件
  "vim.handleKeys": {
    "<C-a>": false,
    "<C-f>": false
  }
}

熱鍵配置項

基本上vim的所有模式你都可以配置在下面的4個選項中:

// 普通模式下的非遞歸按鍵綁定
"vim.normalModeKeyBindingsNonRecursive": [],
// 插入模式下的非遞歸按鍵綁定
"vim.insertModeKeyBindings": [],
// 命令模式下的非遞歸按鍵綁定
"vim.commandLineModeKeyBindingsNonRecursive": [],
// 可視模式下的非遞歸按鍵綁定
"vim.operatorPendingModeKeyBindings": [],
// 下面定義的按鍵將交由vscode進行處理,而不是vscode-vim插件
"vim.handleKeys": {
    "<C-a>": false,
    "<C-f>": false
}

一個簡單的例子,在INSERT模式下使用jj退回到NORMAL模式:

  "vim.insertModeKeyBindings": [
    {
      "before": [
        "j",
        "j"
      ],
      "after": [
        "<Esc>"
      ]
    },
  ],

下面的示例將演示如何在NORMAL模式下按下快捷鍵執行COMMAND的命令,如按下<C-n>后,取消高亮搜索:

  "vim.normalModeKeyBindingsNonRecursive": [
    {
      "before": [
        "<C-n>"
      ],
      "commands": [
        ":nohl"
      ]
    },
  ],

除此之外,你也可以定義在按下一些按鍵后,調用vscode下的命令API,比如在NORMAL模式下按下<leader>gc后,調用vscode的全局命令:

  "vim.normalModeKeyBindingsNonRecursive": [
    {
      "before": [
        "<leader>",
        "g",
        "c"
      ],
      "commands": [
        "workbench.action.showCommands"
      ]
    }
  ],

注意!leader鍵只在代碼編輯區域生效,它無法做到全vscode生效。

針對一些剛接觸vscode不久的朋友,可能不知道怎么拿到vscode的熱鍵映射命令,其實你可以從vsocde的鍵盤快捷鍵中復制命令ID獲得。

image-20211102153604048

自用熱鍵方案

下面是個人自用的vim+vscode全鍵盤熱鍵方案,對於非代碼編輯區的熱鍵將其定義在keybindings.json中,對於代碼編輯區且屬於vim的熱鍵將其定義在settings.json文件中。

我目前使用的是mac平台,所以cmd按鍵會比ctrl按鍵更加常用,如果是windows或者linux平台,則將cmd替換為ctrl按鍵即可:

cmd + g c : 顯示命令面板
cmd + g s : 打開設置頁面
cmd + g k : 打開熱鍵映射
cmd + g m : 打開一個目錄
cmd + g f : 打開一個文件
cmd + g h : 打開最近記錄
cmd + g n : 新建vscode實例
cmd + g q : 關閉vscode示例

cmd + f n : 新建文件
cmd + f o : 打開文件
cmd + f e : 另存為文件
cmd + f s : 保存文件
cmd + f w : 保存所有文件
cmd + f q : 關閉文件
cmd + f a : 關閉所有文件

cmd + n [ : 切換側邊欄顯示狀態
cmd + n 1 : 顯示文件資源管理器
cmd + n 2 : 顯示TODO Tree
cmd + n 3 : 顯示全局搜索
cmd + n 4 : 顯示debug
cmd + n 5 : 顯示版本控制
cmd + n 6 : 顯示SQL Tools
cmd + n 7 : 顯示Docker
cmd + n 8 : 顯示測試
cmd + n 9 : 顯示插件商店

cmd + p ] : 切換面板顯示狀態
cmd + p 1 : 顯示問題
cmd + p 2 : 顯示輸出
cmd + p 3 : 顯示終端
cmd + p 4 : 顯示調試控制台
cmd + p 5 : 顯示SQL CONSOLE

以下是編輯區域操作控制方案:

cmd + q :關閉當前選項卡或分屏
cmd + e :聚焦在第一個選項卡中
cmd + , :切換到上一個選項卡
cmd + . :切換到下一個選項卡

cmd + w s :拆分一個上下分屏
cmd + w v :拆分一個左右分屏

cmd + w k :將光標向上移動1屏
cmd + w j :將光標向下移動1屏

cmd + w h :將光標向左移動1屏
cmd + w l :將光標向右移動1屏

代碼控制區域:

cmd + h : 觸發幫助提示
cmd + j : 觸發參數提示
cmd + k : 觸發建議提示
cmd + n : 移動到下一個建議
cmd + p : 移動到上一個建議
tab : 選擇下一個建議
enter : 選擇當前建議

cmd + alt + l : 格式化代碼(個人習慣)

cmd + = : 放大字體
cmd + - : 縮小字體

在settings.json中配置的代碼控制區域熱鍵方案:

jj : 退出INSERT模式
zz : 切換代碼折疊(原生vim的zz不是切換折疊)

H :跳轉行首、取代^
L :跳轉行尾、取代$

g[ : 跳轉到上一個問題
g] : 跳轉到下一個問題

我的配置文件

以下是settings.json文件中關於代碼編輯區的一些操作配置項:

  "vim.normalModeKeyBindingsNonRecursive": [
    {
      "before": [
        "H"
      ],
      "after": [
        "^"
      ]
    },
    {
      "before": [
        "L"
      ],
      "after": [
        "$"
      ]
    },
    {
      "before": [
        "z",
        "z",
      ],
      "commands": [
        "editor.toggleFold"
      ]
    },
    {
      "before": [
        "g",
        "[",
      ],
      "commands": [
        "editor.action.marker.prevInFiles"
      ]
    },
    {
      "before": [
        "g",
        "]",
      ],
      "commands": [
        "editor.action.marker.nextInFiles"
      ]
    },
  ],
  // 插入模式下的非遞歸按鍵綁定
  "vim.insertModeKeyBindings": [
    {
      "before": [
        "j",
        "j"
      ],
      "after": [
        "<Esc>"
      ]
    },
  ],
  // 命令模式下的非遞歸按鍵綁定
  "vim.commandLineModeKeyBindingsNonRecursive": [],
  // 可視模式下的非遞歸按鍵綁定
  "vim.operatorPendingModeKeyBindings": [],

以下是keybindings.json文件,基本的鍵位設置就如同上面看到的一樣,但是做了一些額外的限制條件,比如<C-a>和<C-c>以及<C-v>等vscode原生命令在代碼編輯區域中非NORMAL模式下是不生效的:

[
    // --- 全局命令
    // 顯示命令面板
    {
        "key": "cmd+g c",
        "command": "workbench.action.showCommands"
    },
    // 打開設置頁面
    {
        "key": "cmd+g s",
        "command": "workbench.action.openSettings"
    },
    // 打開熱鍵映射
    {
        "key": "cmd+g k",
        "command": "workbench.action.openGlobalKeybindings"
    },
    // 打開一個目錄
    {
        "key": "cmd+g m",
        "command": "workbench.action.files.openFolder"
    },
    // 打開一個文件
    {
        "key": "cmd+g f",
        "command": "workbench.action.files.openFile"
    },
    // 打開最近記錄
    {
        "key": "cmd+g h",
        "command": "workbench.action.openRecent"
    },
    // 新建vscode實例
    {
        "key": "cmd+g n",
        "command": "workbench.action.newWindow"
    },
    // 關閉vscode實例
    {
        "key": "cmd+g q",
        "command": "workbench.action.closeWindow"
    },
    // --- 文件命令
    // 新建文件
    {
        "key": "cmd+f n",
        "command": "welcome.showNewFileEntries",
    },
    // 打開文件
    {
        "key": "cmd+f o",
        "command": "workbench.action.files.openFileFolder"
    },
    // 另存為文件
    {
        "key": "cmd+f e",
        "command": "workbench.action.files.saveAs"
    },
    // 保存文件
    {
        "key": "cmd+f s",
        "command": "workbench.action.files.save"
    },
    // 保存所有文件
    {
        "key": "cmd+f w",
        "command": "workbench.action.files.saveAll"
    },
    // 關閉文件
    {
        "key": "cmd+f q",
        "command": "workbench.action.closeActiveEditor"
    },
    // 關閉所有文件
    {
        "key": "cmd+f a",
        "command": "workbench.action.closeAllEditors"
    },
    // -- 側邊欄命令
    // 切換側邊欄顯示狀態
    {
        "key": "cmd+n [",
        "command": "workbench.action.toggleSidebarVisibility"
    },
    // 顯示文件資源管理器
    {
        "key": "cmd+n 1",
        "command": "workbench.files.action.focusFilesExplorer"
    },
    // 顯示TODO Tree
    {
        "key": "cmd+n 2",
        "command": "todo-tree-view.focus"
    },
    // 顯示全局搜索
    {
        "key": "cmd+n 3",
        "command": "workbench.action.replaceInFiles",
    },
    // 顯示debug
    {
        "key": "cmd+n 4",
        "command": "workbench.view.debug",
        "when": "viewContainer.workbench.view.debug.enabled"
    },
    // 顯示版本控制
    {
        "key": "cmd+n 5",
        "command": "workbench.view.scm",
        "when": "workbench.scm.active"
    },
    // 顯示SQL Tools
    {
        "key": "cmd+n 6",
        "command": "workbench.view.extension.sqltoolsActivityBarContainer"
    },
    // 顯示Docker
    {
        "key": "cmd+n 7",
        "command": "workbench.view.extension.dockerView"
    },
    // 顯示測試
    {
        "key": "cmd+n 8",
        "command": "workbench.view.testing.focus"
    },
    // 顯示插件商店
    {
        "key": "cmd+n 9",
        "command": "workbench.view.extensions",
        "when": "viewContainer.workbench.view.extensions.enabled"
    },
    // --- 面板命令
    // 切換面板顯示狀態
    {
        "key": "cmd+p [",
        "command": "workbench.action.togglePanel"
    },
    // 顯示問題
    {
        "key": "cmd+p 1",
        "command": "workbench.panel.markers.view.focus"
    },
    // 顯示輸出
    {
        "key": "cmd+p 2",
        "command": "workbench.action.output.toggleOutput",
        "when": "workbench.panel.output.active"
    },
    // 顯示終端
    {
        "key": "cmd+p 3",
        "command": "workbench.action.terminal.toggleTerminal",
        "when": "terminal.active"
    },
    // 顯示調試控制台
    {
        "key": "cmd+p 4",
        "command": "workbench.debug.action.toggleRepl",
        "when": "workbench.panel.repl.view.active"
    },
    // 顯示SQL CONSOLE
    {
        "key": "cmd+p 5",
        "command": "workbench.view.extension.sqltoolsPanelContainer"
    },
    // --- 編輯區命令
    // 關閉當前選項卡或分屏
    {
        "key": "cmd+q",
        "command": "workbench.action.closeActiveEditor"
    },
    // 聚集在第一個選項卡中
    {
        "key": "cmd+e",
        "command": "workbench.action.focusFirstEditorGroup"
    },
    // 切換到上一個選項卡
    {
        "key": "cmd+,",
        "command": "workbench.action.previousEditor"
    },
    // 切換到下一個選項卡
    {
        "key": "cmd+.",
        "command": "workbench.action.nextEditor"
    },
    // 拆分一個上下分屏
    {
        "key": "cmd+w s",
        "command": "workbench.action.splitEditorDown"
    },
    // 拆分一個左右分屏
    {
        "key": "cmd+w v",
        "command": "workbench.action.splitEditor"
    },
    // 將光標向上動1屏
    {
        "key": "cmd+w k",
        "command": "workbench.action.focusAboveGroup"
    },
    // 將光標向下動1屏
    {
        "key": "cmd+w j",
        "command": "workbench.action.focusBelowGroup"
    },
    // 將光標向左移動1屏
    {
        "key": "cmd+w h",
        "command": "workbench.action.focusLeftGroup"
    },
    // 將光標向右移動1屏
    {
        "key": "cmd+w l",
        "command": "workbench.action.focusRightGroup"
    },
    // --- 代碼編輯命令
    // 觸發幫助提示
    {
        "key": "cmd+h",
        "command": "editor.action.showHover",
        "when": "editorTextFocus"
    },
    // 觸發參數提示
    {
        "key": "cmd+j",
        "command": "editor.action.triggerParameterHints",
        "when": "editorHasSignatureHelpProvider && editorTextFocus"
    },
    {
        "key": "cmd+j",
        "command": "closeParameterHints",
        "when": "editorFocus && parameterHintsVisible"
    },
    // 觸發建議提示
    {
        "key": "cmd+k",
        "command": "editor.action.triggerSuggest",
        "when": "editorHasCompletionItemProvider && textInputFocus && !editorReadonly"
    },
    {
        "key": "cmd+k",
        "command": "hideSuggestWidget",
        "when": "suggestWidgetVisible && textInputFocus"
    },
    // 移動到下一個建議
    {
        "key": "cmd+n",
        "command": "selectNextSuggestion",
        "when": "suggestWidgetMultipleSuggestions && suggestWidgetVisible && textInputFocus"
    },
    // 移動到上一個建議
    {
        "key": "cmd+p",
        "command": "selectPrevSuggestion",
        "when": "suggestWidgetMultipleSuggestions && suggestWidgetVisible && textInputFocus"
    },
    // 格式化代碼
    {
        "key": "cmd+alt+l",
        "command": "editor.action.formatDocument",
        "when": "editorHasDocumentFormattingProvider && editorTextFocus && !editorReadonly && !inCompositeEditor"
    },
    // 放大字體
    {
        "key": "cmd+=",
        "command": "editor.action.fontZoomIn"
    },
    // 縮小字體
    {
        "key": "cmd+-",
        "command": "editor.action.fontZoomOut"
    },
    // --- window 用戶刪除以下重映射,這里是為MAC用戶准備的
    {
        "key": "cmd+r",
        "command": "extension.vim_ctrl+r",
        "when": "editorTextFocus && vim.active && vim.use<C-r> && !inDebugRepl"
    },
    {
        "key": "ctrl+r",
        "command": "-extension.vim_ctrl+r",
        "when": "editorTextFocus && vim.active && vim.use<C-r> && !inDebugRepl"
    },
    {
        "key": "cmd+a",
        "command": "extension.vim_ctrl+a",
    },
    {
        "key": "ctrl+a",
        "command": "-extension.vim_ctrl+a",
        "when": "editorTextFocus && vim.active && vim.use<C-a> && !inDebugRepl"
    },
    {
        "key": "cmd+x",
        "command": "extension.vim_ctrl+x",
    },
    {
        "key": "ctrl+x",
        "command": "-extension.vim_ctrl+x",
        "when": "editorTextFocus && vim.active && vim.use<C-x> && !inDebugRepl"
    },
    {
        "key": "cmd+u",
        "command": "extension.vim_ctrl+u",
        "when": "editorTextFocus && vim.active && vim.use<C-u> && !inDebugRepl"
    },
    {
        "key": "ctrl+u",
        "command": "-extension.vim_ctrl+u",
        "when": "editorTextFocus && vim.active && vim.use<C-u> && !inDebugRepl"
    },
    {
        "key": "cmd+d",
        "command": "extension.vim_ctrl+d",
        "when": "editorTextFocus && vim.active && vim.use<C-d> && !inDebugRepl"
    },
    {
        "key": "ctrl+d",
        "command": "-extension.vim_ctrl+d",
        "when": "editorTextFocus && vim.active && vim.use<C-d> && !inDebugRepl"
    },
    {
        "key": "cmd+i",
        "command": "extension.vim_ctrl+i",
        "when": "editorTextFocus && vim.active && vim.use<C-i> && !inDebugRepl"
    },
    {
        "key": "ctrl+i",
        "command": "-extension.vim_ctrl+i",
        "when": "editorTextFocus && vim.active && vim.use<C-i> && !inDebugRepl"
    },
    {
        "key": "cmd+o",
        "command": "extension.vim_ctrl+o",
        "when": "editorTextFocus && vim.active && vim.use<C-o> && !inDebugRepl"
    },
    {
        "key": "ctrl+o",
        "command": "-extension.vim_ctrl+o",
        "when": "editorTextFocus && vim.active && vim.use<C-o> && !inDebugRepl"
    },
    // --- 取消一些vim插件的額外功能
    {
        "key": "cmd+a",
        "command": "-extension.vim_cmd+a",
        "when": "editorTextFocus && vim.active && vim.use<D-a> && !inDebugRepl && vim.mode != 'Insert'"
    },
    {
        "key": "alt+cmd+down",
        "command": "-extension.vim_cmd+alt+down",
        "when": "editorTextFocus && vim.active && !inDebugRepl"
    },
    {
        "key": "alt+cmd+up",
        "command": "-extension.vim_cmd+alt+up",
        "when": "editorTextFocus && vim.active && !inDebugRepl"
    },
    {
        "key": "cmd+c",
        "command": "-extension.vim_cmd+c",
        "when": "editorTextFocus && vim.active && vim.overrideCopy && vim.use<D-c> && !inDebugRepl"
    },
    {
        "key": "cmd+v",
        "command": "-extension.vim_cmd+v",
        "when": "editorTextFocus && vim.active && vim.use<D-v> && vim.mode == ''CommandlineInProgress' !inDebugRepl' || editorTextFocus && vim.active && vim.use<D-v> && !inDebugRepl && vim.mode == 'SearchInProgressMode'"
    },
    {
        "key": "cmd+d",
        "command": "-extension.vim_cmd+d",
        "when": "editorTextFocus && vim.active && vim.use<D-d> && !inDebugRepl"
    },
    {
        "key": "cmd+left",
        "command": "-extension.vim_cmd+left",
        "when": "editorTextFocus && vim.active && vim.use<D-left> && !inDebugRepl && vim.mode != 'Insert'"
    },
    {
        "key": "cmd+right",
        "command": "-extension.vim_cmd+right",
        "when": "editorTextFocus && vim.active && vim.use<D-right> && !inDebugRepl && vim.mode != 'Insert'"
    },
    // --- 取消或更改一些vscode鍵位
    // cmd+a全選功能在非INSERT模式下不生效
    {
        "key": "cmd+a",
        "command": "editor.action.selectAll",
        "when": "vim.mode != 'Normal' && vim.mode != 'Visual' && vim.mode != 'VisualLine' && vim.mode != 'VisualBlock' && vim.mode != 'CommandlineInProgress'"
    },
    {
        "key": "cmd+a",
        "command": "-editor.action.selectAll"
    },
    // cmd+c或者cmd+v功能在非INSERT模式下不生效
    {
        "key": "cmd+c",
        "command": "-editor.action.clipboardCopyAction"
    },
    {
        "key": "cmd+v",
        "command": "-editor.action.clipboardPasteAction"
    },
    {
        "key": "cmd+c",
        "command": "-execCopy"
    },
    {
        "key": "cmd+c",
        "command": "execCopy",
        "when": "vim.mode != 'Normal' && vim.mode != 'Visual' && vim.mode != 'VisualLine' && vim.mode != 'VisualBlock' && vim.mode != 'CommandlineInProgress'"
    },
    {
        "key": "cmd+v",
        "command": "-execPaste",
    },
    {
        "key": "cmd+v",
        "command": "execPaste",
        "when": "vim.mode != 'Normal' && vim.mode != 'Visual' && vim.mode != 'VisualLine' && vim.mode != 'VisualBlock' && vim.mode != 'CommandlineInProgress'"
    },
]

資源管理配置

默認的資源管理配置只包含了上下左右移動等基礎命令,所以我們需要手動添加新增、刪除、剪切、刷新等操作命令,它們僅在資源管理器中生效:

j : 向下移動
k : 向上移動
space : 打開文件或目錄

// 手動新增:

i : 新增文件
o : 新增目錄
r : 刷新目錄
a : 重命名文件或目錄
d : 刪除文件或目錄
x : 剪切文件或目錄
y : 復制文件或目錄
p : 粘貼文件或目錄

在keybindings.json文件中加入以下配置項:

    // --- 資源管理器中對文件或目錄的操作
    // 新建文件
    {
        "key": "i",
        "command": "explorer.newFile",
        "when": " explorerViewletVisible && filesExplorerFocus && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus "
    },
    // 新建目錄
    {
        "key": "o",
        "command": "explorer.newFolder",
        "when": " explorerViewletVisible && filesExplorerFocus && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus "
    },
    // 刷新資源管理器
    {
        "key": "r",
        "command": "workbench.files.action.refreshFilesExplorer",
        "when": " explorerViewletVisible && filesExplorerFocus && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus "
    },
    // 重命名文件或目錄
    {
        "key": "a",
        "command": "renameFile",
        "when": " explorerViewletVisible && filesExplorerFocus && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus "
    },
    // 刪除文件或目錄
    {
        "key": "d",
        "command": "deleteFile",
        "when": " explorerViewletVisible && filesExplorerFocus && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus "
    },
    // 剪切文件或目錄
    {
        "key": "x",
        "command": "filesExplorer.cut",
        "when": "explorerViewletVisible && filesExplorerFocus && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
    },
    // 復制文件或目錄
    {
        "key": "y",
        "command": "filesExplorer.copy",
        "when": "explorerViewletVisible && filesExplorerFocus && !explorerResourceIsRoot && !inputFocus"
    },
    // 粘貼文件或目錄
    {
        "key": "p",
        "command": "filesExplorer.paste",
        "when": "explorerViewletVisible && filesExplorerFocus && !explorerResourceReadonly && !inputFocus"
    },

輸入法切換

如果你在INSERT模式下使用中文輸入法進行編輯,當ESC到NORMAL模式下后,它將依然保持中文輸入法,這會使我們需要頻繁的使用ctrl+shift或者cmd+space進行輸入法切換,非常麻煩。

為了解決這個問題,你必須先在你的計算機上安裝一個im-select腳本(根據官方文檔來看,貌似只有mac和windows平台下存在這個問題):

$ curl -Ls https://raw.githubusercontent.com/daipeihust/im-select/master/install_mac.sh | sh

這個腳本有2個作用,當你輸入im-select后它將獲取當前輸入法,當你輸入im-select xxx后它將切換至xxx輸入法。

首先你需要先切換到英文輸入法中到終端執行im-select命令,並把結果保存下來:

$ im-select
com.apple.keylayout.ABC

然后再到settings.json中加入以下配置項即可完成輸入法在INSERT模式以及NORMAL模式下的自動切換:

  // 自動切換輸入法
  "vim.autoSwitchInputMethod.enable": true,
  "vim.autoSwitchInputMethod.defaultIM": "com.apple.keylayout.ABC",  // 這里輸入你剛剛獲得的英文輸入法名稱
  "vim.autoSwitchInputMethod.obtainIMCmd": "/usr/local/bin/im-select",
  "vim.autoSwitchInputMethod.switchIMCmd": "/usr/local/bin/im-select {im}"

內置插件

vsocde-vim中內置了很多插件,使用它們可以快速的進行某一些操作。

1)vim-esaymotion插件,使用它之前你必須在settings.json中加入下面這一行:

"vim.easymotion": true,

它的作用是通過以下的按鍵組合,你可以快速的定位到任何你想修改的行中:

<leader><leader>s<char>

2)vim-surround插件,如果你想修改、或者刪除單引號和雙引號,它帶給你的體驗將是無與倫比的,以下是它的語法:

ds<existing>
cs<existing><desired>

示例如下:

# 刪除以下的[]
[1, 2, 3] -> ds[

# 將以下的[]修改為()
[1, 2, 3] -> cs[(

3)vim-commentary插件,該插件能夠快速的利用鍵盤進行行或者塊的注釋,它內部其實是調用了vscode的注釋API:

gcc :行注釋
gCC :塊注釋

便捷操作

除此之外,vscode-vim插件也額外提供了一些非常多的快捷鍵用於編輯操作:

gd : 跳轉到函數定義或引用處,搭配cmd+i/cmd+o查看源碼很方便
gh : 觸發幫助提示
gb : 開啟多光標模式,選中和當前單詞相同的單詞

推薦插件

有一些朋友可能和我一樣安裝了google-translate插件或者comment-translate插件來查看源代碼注釋的翻譯結果,這個時候你將會遇到一些問題。

如一次性選擇翻譯的文本太長,vscode的hover無法支持scroll的快捷鍵滾動操作,你只能通過鼠標滾輪進行hover窗口的滾動:

comment-demo

該問題在vscode的github上多次被提到,這對全鍵盤操作用戶來說是非常不友好的,可以參見#69836

對此有一個折中的解決方案,安裝一個Doc View插件,將翻譯結果放在側邊欄中,這樣我們就有足夠的空間來顯示翻譯結果了:

image-20211108021727731

另外一個問題就是關於Error的提示信息,你可以自定義一些熱鍵來快速查看Error,或者跟我一樣安裝一個Error Lens插件。

如下圖所示,有了該插件我們就能快速的查看到一些問題的提示信息了:

image-20211108022237711

配合上面定義的g[或者g]熱鍵,就可以快速的定位到某個錯誤並進行修改。

寫在后面

為什么不選擇使用vim來搭建一個IDE呢?

  • 太麻煩、懶得折騰,vscode足夠強大…

為什么不選擇使用vscode neovim插件呢?

  • visual模式不是vscode的真正選擇,多端同步比vscode-vim麻煩是我沒選擇它的主要原因

vim真的很好用嗎?

  • 使用vim能治好你的vim崇拜症,但是vim並不是必須的

此外,網上搜了很多資料無一例外都是比較淺顯的介紹了一下vsocode-vim插件就完了,但是真正讓你能夠搭配出一套全鍵盤使用方案的文章少之又少,所以這里就將我的折騰歷程發了出來,很顯然它比單純的折騰vim要快很多。

參考文檔

參考文檔:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM