一、導論
對于不用vim的人來說,vim簡直是個噩夢,復雜的指令、丑陋的界面、令人頭痛的配置文件,任何一項都足以勸退一大波人,但是對于已經習慣了使用vim的人來說,vim簡直就是馬良神筆,似乎vim除了生孩子什么都可以做。
雖然從定義來說,vim只是編輯器并非編譯器,但是它強大的擴展性給它帶來了無限的可能,豐富的插件和獨特的配置語法讓它在許多程序員心中有了一席之地。
但是眾所周知一般都是在Linux工作的人才有可能使用vim,換到Windows下使用vim就需要下載其他軟件來間接的使用vim,比如WSL或者Git Bash、VSCode。然而接下來我就來介紹如何在VSCode下安裝和配置VIM
二、VSCode安裝vim插件
在vscode的擴展商店中搜索vim,安裝第一個插件,這個插件可以完成大部分原生vim的操作。

三、配置vim
安裝完成以后我們需要配置vim,原生的vim有一部分操作十分的不友好,我們常常需要改鍵配置合適自己的vim。我們通常在setting.json中配置vscode,如果不知道如何打開setting.json可以點開文件->首選項->設置->文本編輯器,向下拉找到“在setting.json中編輯”。
如下圖所示

配置語法
接下來來討論一下如何編寫配置,與原始vim不同的是,在原生vim中的配置語法是獨屬于vim的,但是在vscode中使用的是json格式,json格式是一種輕便易讀的格式,如果不了解的同學可以提前學習一下。
如果是第一次配置setting.json的同學,里面應該是沒有多少內容,最多幾行簡單配置。在最后一句配置語句后面打上一個逗號,然后開始新起一行準備寫vim配置文件,如下所示。
{//默認狀態下setting.json文件內容 Begin"editor.fontSize": 20,"C_Cpp.updateChannel": "Insiders","files.autoGuessEncoding": true,"[c]": {"editor.defaultFormatter": "ms-vscode.cpptools"},//默認狀態下setting.json文件內容 End//關于vim的配置文件"vim.commandLineModeKeyBindingsNonRecursive": [],"vim.insertModeKeyBindings": [],"vim.normalModeKeyBindingsNonRecursive": []
}
- “vim.commandLineModeKeyBindingsNonRecursive“指的是命令行模式非遞歸鍵位綁定,在原生vim中等同于norecmap。
- “vim.insertModeKeyBindings”指的是插入模式下鍵位綁定,在原生vim里面指的是imap。
- “vim.normalModeKeyBindingsNonRecursive”指的是普通模式下非遞歸鍵位綁定,在原生vim中是noremap。
插入模式下鍵位修改
我這里把esc鍵映射為jj,意思是在插入模式下,按下兩次j會回到正常模式、按下大寫s可以保存當前文件、按下大寫q可以關閉當前文件。這vim的配置文件中,可以兼容原生vim指令和vscode命令,"workbench.action.files.save" 屬于vscode命令,":q!" 屬于原生vim命令。如果想修改其他鍵位可以根據下面的語法規則進行修改測試。
以下內容只是作為示例,不推薦大家使用大寫s和q作為保存和退出,因為在編寫程序的時候,我們可能就需要到大寫s和q,我建議是先退出到普通模式再保存退出
"vim.insertModeKeyBindings": [{"before": ["j", "j"],"after": ["<Esc>"]},{"before": ["S"],"commands": ["workbench.action.files.save"]},{"before": ["Q"],"commands": [":q!"],}],
正常模式下鍵位修改
這里我通過按下leader鍵+s 可以保存當前文件、按下leader+q關閉文件、按下leader+sq 保存并退出文件。在下面我會提到leader鍵的設置。
"vim.normalModeKeyBindingsNonRecursive": [{"before": ["<leader>", "s"],"commands":[":w!"]},{"before": ["<leader>", "q"],"commands":[":q!"]}, {"before": ["<leader>", "sq"],"commands":[":wq!"]}],
leader鍵位設置和取消vim鍵位映射
leader在vim中的意思是“前綴”的意思,和tmux中的Ctrl+b是一個意思,可以通過自定義leader鍵,來構建自己需要的組合快捷鍵。
在這里我把leader鍵位映射為空格鍵<space>。
在vscode里面使用vim有時候vscode原生鍵位比vim原生鍵位要舒服一些,我們可以取消到vim里面的鍵位映射來使用vscode的鍵位。
比如下面我取消掉了Ctrl+a,Ctrl+f,Ctrl+n在vim中的鍵位映射,這樣子在寫代碼的時候,我按下Ctrl+a,Ctrl+f,Ctrl+n就可以使用vscode中的全選,查找和新建。
"vim.leader": "<space>","vim.handleKeys": {"<C-a>": false,"<C-f>": false,"<C-n>": false
}
我在vim中設置了相對行號,這樣子在進行跳轉的時候就可以精確定位行數而且不需要數行號,比如我當前在16行,我想跳到“//關于vim的配置文件”這一句,我只需要在普通模式下按下6h,就會自動跳到16-6行。
設置方法:
"editor.lineNumbers":"relative"
有意思的是,如果在vscode中我們找不到對應的設置語句,可以先指定一個鍵位,在映射到對應的vim命令,然后執行這個命令,比如我在設置相對行號的時候找不到對應的vscode命令,我就可以這樣子做:
"before": ["<leader>", "<leader>"],"commands":[":set relativenumber"]//vim下相對行號設置命令
這樣子在使用完這個命令以后就可以刪掉這句配置語句同時保留這個設置。
如下圖

結束語
我們沒必要糾結那個編輯器厲害或者有沒有用,不同的人適合不同的編輯器,我們可以不喜歡,但是應該尊重別人的想法。在瀏覽大量代碼的時候,使用鼠標無疑更舒服,但是在編寫程序的時候vim可以來帶更高效的操作。
希望這篇文章能夠給需要的同學帶來幫助。
感謝觀看。