基礎知識
vscode-vim
vscode-vim是一款vim模擬器,它將vim的大部分功能都集成在了vscode中,你可以將它理解為一個嵌套在vscode中的vim。
由於該vim是被模擬的的非真實vim,所以原生vim中有些功能它並不支持,如宏錄制功能,但這依然不妨礙vscode-vim插件的優秀。
其實在vscode的擴展商店中,還有一個vscode neovim的插件也十分不錯,但是相較於vscode-vim來說依然存在一些讓我難以接受的缺點,比如visual模式下的選擇並非真正的vscode選擇等,基於種種原因我還是考慮使用vscode-vim,盡管它可能占用了更大的內存。
安裝使用
我們需要在插件商店中搜索vim插件,然后安裝:
安裝完成之后,需要做一些基礎配置。
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獲得。
自用熱鍵方案
下面是個人自用的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窗口的滾動:
該問題在vscode的github上多次被提到,這對全鍵盤操作用戶來說是非常不友好的,可以參見#69836。
對此有一個折中的解決方案,安裝一個Doc View插件,將翻譯結果放在側邊欄中,這樣我們就有足夠的空間來顯示翻譯結果了:
另外一個問題就是關於Error的提示信息,你可以自定義一些熱鍵來快速查看Error,或者跟我一樣安裝一個Error Lens插件。
如下圖所示,有了該插件我們就能快速的查看到一些問題的提示信息了:
配合上面定義的g[或者g]熱鍵,就可以快速的定位到某個錯誤並進行修改。
寫在后面
為什么不選擇使用vim來搭建一個IDE呢?
- 太麻煩、懶得折騰,vscode足夠強大…
為什么不選擇使用vscode neovim插件呢?
- visual模式不是vscode的真正選擇,多端同步比vscode-vim麻煩是我沒選擇它的主要原因
vim真的很好用嗎?
- 使用vim能治好你的vim崇拜症,但是vim並不是必須的
此外,網上搜了很多資料無一例外都是比較淺顯的介紹了一下vsocode-vim插件就完了,但是真正讓你能夠搭配出一套全鍵盤使用方案的文章少之又少,所以這里就將我的折騰歷程發了出來,很顯然它比單純的折騰vim要快很多。
參考文檔
參考文檔: