vscode-nvim
基本介紹
我之前嘗試在vscode中使用vsocde-vim插件來進行開發,但是我無法忍受它的卡頓,因此我將目光放在了vscode-nvim插件上:
它與vscode-vim插件還是有非常多的區別的,vscode-vim只是一個vim模擬器,好處是配置簡單方便,不需要掌握過多的vimrc相關知識,缺點是運行慢,卡頓,沒有原生vim操作的絲滑感,此外缺失許多原生vim的功能,如宏錄制。
而vscode-nvim則是將neovim與vscode真正的連接起來,為你帶來如絲般順滑的編程體驗,缺點是配置比較麻煩,需要在系統中安裝neovim,並且所有的配置項會分為2部分,這在跨平台同步配置時不太方便。
不管你有沒有使用過vscode-nvim插件,這篇文章都會給你帶來一定的幫助,因為vscode-nvim插件的中文資料現在貌似不多,官方文檔對於一些新手向的知識描述也不是很全,所以我才打算寫了這一篇文章讓更多的vscode用戶走向vim的懷抱。
下載安裝
nvim是vim的一個分支版本,它更強大也更優秀,因此對於現在很多已經將工作環境完全遷徙到終端下的程序員來說,nvim是一個更好的選擇。
大多數Linux發行版中都內置安裝了vi或者vim,但是neovim是肯定沒有安裝的,所以我們首先要安裝neovim:
# 1.下載nvim安裝包
$ wget https://github.com/neovim/neovim/releases/download/stable/nvim-macos.tar.gz
# 2.解壓到指定的目錄
$ tar xzf ./nvim-macos.tar.gz -C /usr/local/application/
$ mv /usr/local/application/nvim-osx64/ /usr/local/application/nvim
# 3.將nvim添加到系統環境變量,你可以創建軟鏈接或者直接編輯/etc/profile文件
PATH=/usr/local/application/nvim/bin:$PATH
nvim安裝完成之后,打開vscode插件商店,搜索neovim插件並安裝:
基礎配置
安裝完成之后我們需要對vscode進行一些基礎設置。
1. 僅MAC用戶,關閉MAC的重復鍵
$ defaults write com.microsoft.VSCode ApplePressAndHoldEnabled -bool false
2. 為代碼編輯區域設置相對行號以方便vim模式操作,在settings.json中添加上以下配置項
"editor.lineNumbers": "relative",
3. 關閉自動傳參建議,使用按鍵手動觸發,在settings.json中添加上以下配置項
"editor.parameterHints.enabled": false,
4. 控制資源管理器中的鍵盤導航無法自動觸發,在settings.json中添加上以下配置項
"workbench.list.automaticKeyboardNavigation": false,
5. 控制編輯器是否可以將光標移動到最后一行以后或者最上一行以上,這對vim模式下的gg、G命令來說更加友好,在settings.json中添加上以下配置項
"editor.scrollBeyondLastLine": false,
初始工作做完以后,接下來就需要將nvim與vscode-nvim插件鏈接起來,使之互相之間產生關系,你需要根據自己所使用的平台在settings.json中加入下面這個配置項,添加完成后需要重啟vscode實例:
// Windows
"vscode-neovim.neovimExecutablePaths.win32": "D:\\Application\\Neovim\\bin\\nvim.exe",
// Linux
"vscode-neovim.neovimExecutablePaths.linux": "/usr/local/application/nvim/bin/nvim",
// Mac
"vscode-neovim.neovimExecutablePaths.darwin": "/usr/local/application/nvim/bin/nvim",
設計哲學
以下是關於vscode-nvim如何工作的,摘自官方文檔:
- VScode連接到neovim實例
- 打開某個文件時,會在nvim中創建一個暫存緩沖區,並使用來自 vscode的文本內容進行初始化
- NORMAL / VISUAL模式命令直接發送到neovim。該擴展程序偵聽緩沖區事件並應用來自neovim的編輯
- 當進入插入模式時,擴展停止監聽擊鍵事件並將打字模式委托給 vscode(這里沒有執行 Neovim 通信)
- 從插入模式按下退出鍵后,擴展程序將從插入模式獲得的更改發送到 Neovim
差異對比
以下是vscode-nvim與原生nvim的使用差異對比,摘自官方文檔:
- 例如命令模式下的:e、:w、:q、:sp系列、:tab系列等命令實際上都不是調用的nvim指令完成的,而是調用的vscode指令,不要像在nvim中一樣使用它們,比如ctrl+r命令在nvim下是redo命令,而在vscode下則不會有任何效果,你可以在后面通過更改熱鍵來改變它們
- 可視模式不會產生vscode選擇,因此任何需要選擇的vscode命令都不起作用。但是可以通過默認熱鍵(f1/ctrl/cmd+shift+p)從可視模式調用vscode命令選擇器將vim選擇轉換為真正的vscode選擇。對於某些命令(例如注釋和格式設置),此轉換也會自動完成。如果您使用一些自定義映射來調用依賴於真實vscode選擇的vscode命令,您可以使用VSCodeNotifyRange/VSCodeNotifyRangePo(第一個逐行,后一個字符),它將在調用命令之前會將vim視覺模式選擇轉換為vscode選擇
- 當您鍵入某些命令時,它們可能會替換另一個命令,例如:write將替換為:Write.這是正常的。
- 滾動是由VSCode完成的。而 <C-d> / <C-u> / etc略有不同
- 編輯器自定義(相對行號、滾動條等)由VSCode處理
- 點重復(.)略有不同-在更改范圍內移動光標不會破壞重復序列。在Neovim中,如果您abc<cursor>在插入模式下輸入,則將光標移至a<cursor>bc並1在此處輸入重復序列將是1.但是在vscode中它會是a1bc.另一個區別是,當您在插入模式下刪除某些文本時,點重復僅從右到左起作用,這意味着在運行點重復時它會將Del鍵視為BS鍵
定義熱鍵
啟動模式
不乏有一些之前使用過nvim的用戶對nvim本身設置了很多選項。
但其實這些選項可能會對vsocde-nvim的性能產生影響,為了屏蔽這些影響,vscode-nvim官方也貼心的編寫了vimscript來區分你的nvim啟動模式。
我們只需要將這段vimscript放置在~/.config/nvim/init.vim文件中即可。
- Ps:~/.config/nvim/init.vim文件是nvim的配置文件,如果不存在,那么請創建它
如下所示:
" 選擇啟動模式、作為vscode擴展啟動、或者作為本體啟動
" 時所加載的配置項
if exists('g:vscode')
" VSCode extension
else
" ordinary neovim
endif
舉一個簡單的例子,我下面有3個nvim選項:
- set mouse=a:讓nvim支持鼠標操作,我希望在nvim正常啟動時加載
- set nobackup:不創建備份文件,我希望在nvim作為vscode-nvim插件依賴進行啟動時加載
- let mapleader = "\<space>":設置前導鍵,我希望無論nvim在那種情況下啟動都進行加載
這個時候就可以對~/.config/nvim/init.vim文件進行這樣的編輯:
if exists('g:vscode')
" 以vsocde-nvim插件作為依賴啟動時加載的配置項
set nobackup
else
" 以正常模式啟動nvim時加載的配置項
set mouse=a
endif
" 始終都會加載的配置項
let mapleader = "\<space>"
另外對於一些插件來說,你也可以單獨的指定它們的啟動模式,如禁用原生的vim-easymotion,而啟用vscode-nvim作者改版的vim-easymotion,這個內容在下面會介紹到:
" inside plug#begin:
" use normal easymotion when in vim mode
Plug 'easymotion/vim-easymotion', Cond(!exists('g:vscode'))
" use vscode easymotion when in vscode mode
Plug 'asvetliakov/vim-easymotion', Cond(exists('g:vscode'), { 'as': 'vsc-easymotion' })
調用vscode命令
nvim除開可以定義自己本身的熱鍵外,還可以通過一些函數間接的調用vscode下的命令,這里只例舉一些異步調用的函數:
- 使用可選參數調用vscode命令
VSCodeNotify(command, ...)
- 將line1到line2的可視模式選擇變更為vscode的選擇,並且會調用vscode命令,如果將leaveSelection設置成1,會在調用命令后刪除vscode選擇
VSCodeNotifyRange(command, line1, line2, leaveSelection ,...)
- 將line1.pos1到line2.pos2的可視模式選擇變更為vscode的選擇,並且會調用vscode命令,如果將leaveSelection設置成1,會在調用命令后刪除vscode選擇
VSCodeNotifyRangePos(command, line1, line2, pos1, pos2, leaveSelection ,...)
- 將可視模式下的選擇變更為vscode的選擇,並且會調用vscode命令,如果將leaveSelection設置成1,會在調用命令后刪除vscode選擇
VSCodeNotifyVisual(command, leaveSelection, ...)
個人熱鍵方案
使用vim或者nvim插件時,如何配置熱鍵是一個十分棘手的問題,下面是我自用的一些熱鍵定義方案。
我目前使用的是mac平台,所以cmd按鍵會比ctrl按鍵更加常用,如果是windows或者linux平台,則將cmd替換為ctrl按鍵即可。
cmd + g c : 顯示命令面板
cmd + g s : 打開設置頁面
cmd + g k : 打開熱鍵映射
cmd + g d : 打開一個目錄
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 + h : 觸發幫助提示
cmd + j : 觸發參數提示
cmd + k : 觸發建議提示
cmd + m : 觸發快速修復
cmd + n : 移動到下一個建議
cmd + p : 移動到上一個建議
tab : 選擇下一個建議
enter : 選擇當前建議
cmd + = : 放大字體
cmd + - : 縮小字體
cmd + alt + l :格式化代碼(個人習慣)
zR : 展開所有折疊
zM : 關閉所有折疊
zo : 展開當下折疊
zc : 關閉當下折疊
zz : 切換當下折疊
jj : 退出INSERT模式
zz : 切換代碼折疊(原生vim的zz不是切換折疊)
gc : 進行行注釋
gC : 進行塊注釋
H :跳轉行首、取代^
L :跳轉行尾、取代$
g[ : 跳轉到上一個問題
g] : 跳轉到下一個問題
我的keybindings
以下是我的keybindings.json文件:
[
// 按jj退出INSERT模式
{
"command": "vscode-neovim.compositeEscape1",
"key": "j",
"when": "neovim.mode == insert && editorTextFocus",
"args": "j"
},
// 顯示命令面板
{
"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 d",
"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+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+m",
"command": "editor.action.quickFix",
"when": "editorHasCodeActionsProvider && editorTextFocus && !editorReadonly"
},
{
"key": "cmd+.",
"command": "-editor.action.quickFix",
"when": "editorHasCodeActionsProvider && editorTextFocus && !editorReadonly"
},
// 移動到下一個建議
{
"key": "cmd+n",
"command": "selectNextSuggestion",
"when": "suggestWidgetMultipleSuggestions && suggestWidgetVisible && textInputFocus"
},
// 移動到上一個建議
{
"key": "cmd+p",
"command": "selectPrevSuggestion",
"when": "suggestWidgetMultipleSuggestions && suggestWidgetVisible && textInputFocus"
},
// 放大字體
{
"key": "cmd+=",
"command": "editor.action.fontZoomIn"
},
// 縮小字體
{
"key": "cmd+-",
"command": "editor.action.fontZoomOut"
},
// 格式化代碼
{
"key": "cmd+alt+l",
"command": "editor.action.formatDocument",
"when": "editorHasDocumentFormattingProvider && editorTextFocus && !editorReadonly && !inCompositeEditor"
},
// 選擇全部, 在文本焦距點中失效
{
"key": "cmd+a",
"command": "editor.action.selectAll",
"when": "!editorTextFocus"
},
{
"key": "cmd+a",
"command": "-editor.action.selectAll"
},
]
我的init.vim
下面是我的~/.config/nvim/init.vim文件,基本屬於非常輕量級的配置了:
" 當打開nvim時,若沒有下載vim-plug則自動下載
if empty(glob('~/.config/nvim/autoload/plug.vim'))
silent !curl -fLo ~/.config/nvim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
endif
" 始終都會加載的配置項
let mapleader = "\<space>"
" 使用系統剪切板
set clipboard=unnamed
" 自動切換輸入法
if executable('im-select')
autocmd InsertLeave * :call system("im-select com.apple.keylayout.ABC")
autocmd CmdlineLeave * :call system("im-select com.apple.keylayout.ABC")
endif
" ----- settings ----
if exists('g:vscode')
" ----- Plug -----
call plug#begin('~/.config/nvim/autoload/')
" 快速跳轉
Plug 'asvetliakov/vim-easymotion'
" 包裹修改
Plug 'tpope/vim-surround'
call plug#end()
" 切換行注釋
nnoremap gc <Cmd>call VSCodeNotify('editor.action.commentLine')<CR>
" 切換塊注釋
nnoremap gC <Cmd>call VSCodeNotify('editor.action.blockComment')<CR>
" 展開所有折疊
nnoremap zR <Cmd>call VSCodeNotify('editor.unfoldAll')<CR>
" 關閉所有折疊
nnoremap zM <Cmd>call VSCodeNotify('editor.foldAll')<CR>
" 展開當下折疊
nnoremap zo <Cmd>call VSCodeNotify('editor.unfold')<CR>
" 關閉當下折疊
nnoremap zc <Cmd>call VSCodeNotify('editor.fold')<CR>
" 切換當下折疊
nnoremap zz <Cmd>call VSCodeNotify('editor.toggleFold')<CR>
" 轉到文件中上一個問題
nnoremap g[ <Cmd>call VSCodeNotify('editor.action.marker.prevInFiles')<CR>
" 轉到文件中下一個問題
nnoremap g] <Cmd>call VSCodeNotify('editor.action.marker.nextInFiles')<CR>
" 用H替換掉^
noremap H ^
" 用L替換掉$
noremap L $
" 使用vscode的undo替換nvim的undo
nnoremap u <Cmd>call VSCodeNotify('undo')<CR>
" easymotion相關配置
let g:EasyMotion_smartcase = 0
" easymotion前綴 leader leader
map <Leader> <Plug>(easymotion-prefix)
" 其他鍵位綁定
map <Leader>l <Plug>(easymotion-lineforward)
map <Leader>j <Plug>(easymotion-j)
map <Leader>k <Plug>(easymotion-k)
map <Leader>h <Plug>(easymotion-linebackward)
else
" 以正常模式啟動nvim時加載的配置項
" 顯示行號
set number
" 設置相對行號
set relativenumber
" 設置行寬
set textwidth=80
" 設置自動換行
set wrap
" 是否顯示狀態欄
set laststatus=2
" 語法高亮
syntax on
" 支持鼠標
set mouse=a
" 設置編碼格式
set encoding=utf-8
" 啟用256色
set t_Co=256
" 開啟文件類型檢查
filetype indent on
" 設置自動縮進
set autoindent
" 設置tab縮進數量
set tabstop=4
" 設置>>與<<的縮進數量
set shiftwidth=4
" 將縮進轉換為空格
set expandtab
" 自動高亮匹配符號
set showmatch
" 自動高亮匹配搜索結果
set nohlsearch
" 開啟逐行搜索,也就是說按下一次按鍵就繼續一次搜索
set incsearch
" 開啟類型檢查
" set spell spelllang
" 開啟命令補全
set wildmenu
" 不創建備份文件
set nobackup
" 不創建交換文件
set noswapfile
" 多窗口下光標移動到其他窗口時自動切換工作目錄
set autochdir
" ----- Plug -----
call plug#begin('~/.config/nvim/autoload/')
" 快速跳轉
Plug 'easymotion/vim-easymotion'
" 包裹修改
Plug 'tpope/vim-surround'
" vim中文文檔
Plug 'yianwillis/vimcdoc'
" 顏色插件
Plug 'theniceboy/vim-deus'
" 根據內容自動獲取文件類型
Plug 'Shougo/context_filetype.vim'
" 自動進行注釋
Plug 'tyru/caw.vim'
" 包裹修改
Plug 'tpope/vim-surround'
" 多光標模式操作
Plug 'mg979/vim-visual-multi', {'branch': 'master'}
call plug#end()
" -- ctrl+/設置為打開、關閉注釋
if has('win32')
nmap <C-/> gcc
vmap <C-/> gcc
else
nmap <C-_> gcc
vmap <C-_> gcc
endif
"按鍵映射前綴: <leader>v。
let g:VM_maps = {} "取消默認按鍵映射。
let g:VM_maps['Find Under'] = 'gb' "進入多光標模式並選中光標下字符串。
endif
vim-plug
基本介紹
vim-plug是一款vim插件,我們可以使用它來管理、使用、下載其他的vim插件,總而言之vim中可以用插件來管理插件。
上面的配置文件中已經設置了當打開nvim時自動安裝vim-plug:
" 當打開nvim時,若沒有下載vim-plug則自動下載
if empty(glob('~/.config/nvim/autoload/plug.vim'))
silent !curl -fLo ~/.config/nvim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
endif
該插件使用非常簡單,記住以下幾個命令即可:
:PlugStatus
:PlugInstall
:PlugClean
:PlugUpdate
我們可在github或者vimAwesome中搜索你需要的插件,並將它們安裝在nvim中,安裝方式如下所示,只需要在init.vim配置文件中加入以下選項即可:
" ----- Plug -----
call plug#begin('~/.config/nvim/autoload/')
" 快速跳轉
Plug 'asvetliakov/vim-easymotion'
" 包裹修改
Plug 'tpope/vim-surround'
call plug#end()
然后你需要x!后重新進入nvim,並在COMMAND模式下輸入:PlugInstall,它將自動安裝所有插件。
如果想卸載某個插件,則直接將其進行注釋即可,這樣nvim在啟動時就不會加載該插件了,如果想刪除某個插件,則輸入:PlugClean命令,它將刪除所有被注釋后的插件。
vim-easymotion
原生的vim-easymotion插件在vscode-nvim中會出現一些問題,因此vscode-nvim作者fork了一份vim-easymotion,我們可直接對其進行安裝。
在上面我的init.vim文件中都已經做好了一些基本配置,如下所示:
" 安裝
call plug#begin('~/.config/nvim/autoload/')
" 快速跳轉
Plug 'asvetliakov/vim-easymotion'
" 包裹修改
Plug 'tpope/vim-surround'
call plug#end()
" 鍵位綁定
" easymotion相關配置
let g:EasyMotion_smartcase = 0
" easymotion前綴 leader leader
map <Leader> <Plug>(easymotion-prefix)
" Gif config
map <Leader>l <Plug>(easymotion-lineforward)
map <Leader>j <Plug>(easymotion-j)
map <Leader>k <Plug>(easymotion-k)
map <Leader>h <Plug>(easymotion-linebackward)
原生的easymotion插件的使用是leader leader作為前綴,而該fork的easymotion插件則推薦只使用一個leader,下面是它的使用方法:
<leader>w : 高亮所有詞的詞首字母
<leader>s<char> : 全頁搜索該字符
<leader>f<char> : 光標以下搜索該字符
<leader>h<char> : 光標以左搜索該字符
<leader>l<char> : 光標以右搜索該字符
<leader>j<char> : 光標以下搜索該字符
<leader>k<char> : 光標以上搜索該字符
vim-surround
vim-surround插件是非常方便的一款插件,可以快速的修改包裹符號,我也對他進行了安裝:
" 安裝
call plug#begin('~/.config/nvim/autoload/')
" 快速跳轉
Plug 'asvetliakov/vim-easymotion'
" 包裹修改
Plug 'tpope/vim-surround'
call plug#end()
使用也非常簡單,如下所示:
ds<existing> : 將某個包裹修改為另一個包裹
cs<existing><desired> : 刪除某個包裹
示例如下:
# 刪除以下的[]
[1, 2, 3] -> ds[
# 將以下的[]修改為()
[1, 2, 3] -> cs[(
其他問題
自動切換輸入法
如果你在INSERT模式下使用中文輸入法進行編輯,當ESC到NORMAL模式下后,它將依然保持中文輸入法,這會使我們需要頻繁的使用ctrl+shift或者cmd+space進行輸入法切換,非常麻煩。
為了解決這個問題,你必須先在你的計算機上安裝一個im-select腳本:
$ 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
然后再到init.vim中輸入以下代碼即可,我上面也已經進行了解決:
" 自動切換輸入法
if executable('im-select')
autocmd InsertLeave * :call system("im-select com.apple.keylayout.ABC")
autocmd CmdlineLeave * :call system("im-select com.apple.keylayout.ABC")
endif
可視模式的選擇
vscode-nvim插件中的VISUAL模式並非真正的vscode選擇,這是我對比vscode-vim插件來說對vscode-nvim插件所最不能接受的一個點,因為我會使用很多翻譯插件來進行源代碼注釋翻譯,如google-translate插件或者comment-translate。
盡管vscode-nvim提供了以下熱鍵來將VISUAL模式下的選擇變更為vscode選擇,但是仍然會出現一些問題,它仍然不是選擇全部的VISUAL行:
f1
ctrl+shift+p
cmd+shift+p
后續希望作者能夠將這點進行改進吧,也呼吁大家去提一些issues。
查看所有的錯誤
當使用vscode-nvim或者vscode-vim插件時,Error Lens這款vscode插件總能給你帶來意外的驚喜,讓你更加直觀的看到當前頁中所有代碼的問題、警告、錯誤信息。
如下圖所示:

它可能會影響vscode-nvim的性能,但我仍然十分依賴它。
插件與性能損失
如果您有任何性能問題(通常是光標抖動),請確保您沒有使用這些類型的擴展:
1)任何經常渲染裝飾器的東西:
- 行號擴展(VSCode 內置了對普通/相對行號的支持)
- 縮進指南擴展(VSCode 有內置的縮進指南)
- 括號熒光筆擴展(VSCode 有內置功能)
2)延遲擴展主機的 VSCode 擴展,如“Bracket Pair Colorizer”
3)增加延遲並導致性能問題的 VIM 插件。
- 確保禁用不需要的插件,因為其中許多插件對 vscode 沒有意義並且可能會導致問題。
- 您不需要任何代碼、突出顯示、完成、lsp 插件以及任何生成窗口/緩沖區(nerdtree 和類似的)、模糊查找器等的插件。
- 許多導航/文本對象/編輯插件應該沒問題。
如果不確定,請禁用所有其他擴展且重新加載 vscode window,並在報告之前查看問題是否仍然存在。
內置定義的熱鍵
下面這些命令都是由vscode-nvim插件調用vscode中的命令完成的,僅限於COMMAND模式下使用,這些命令在原生的nvim中也都適用,不同的是它們並不是調用的原生命令接口。
1)文件管理命令:
命令 | 描述 |
---|---|
:ene | 創建新的無標題文件 |
:e | 快速打開文件 |
:find | 按名稱搜索文件 |
:sav | 另存為文件 |
:w | 保存當前文件 |
:q | 關閉所有編輯器 |
:wq | 保存當前文件,並關閉活動編輯器 |
:x | 保存當前文件,並關閉活動編輯器 |
:qa | 保存所有文件,並關閉所有編輯器 |
:wa | 保存所有文件,不關閉任何編輯器 |
:wqa | 保存所有文件,並關閉所有編輯器 |
:xa | 保存所有文件,並關閉所有編輯器 |
2)標簽相關命令:
命令 | 描述 |
---|---|
:tabnew | 創建新的無標題文件 |
:tabe | 快速打開文件 |
:tabf | 按名稱搜索文件 |
:tabc | 關閉當前的的編輯器 |
:tabo | 關閉其他所有編輯器 |
:tabp | 切換到上一個編輯器 |
:tabn | 切換到下一個編輯器 |
:tabfirst | 切換到第一個編輯器 |
:tablast | 切換到末一個編輯器 |
3)窗口相關命令:
命令 | 描述 |
---|---|
:sp | 水平拆分編輯器 |
:vsp | 垂直拆分編輯器 |
:new | 水平拆分編輯器,並創建新的無標題文件 |
:vnew | 垂直拆分編輯器,並創建新的無標題文件 |
:only | 關閉所有的編輯器 |
下面這些熱鍵都是由vscode-nvim插件調用vscode中的命令完成的,原生nvim中不存在下面大多數熱鍵。
1)代碼編輯區熱鍵:
熱鍵(1) | 熱鍵(2) | 功能描述 |
---|---|---|
= | == | 格式化選定內容 |
gh | K | 顯示懸停 |
gd | C-] | 轉到定義 |
gf | 無 | 轉到聲明 |
gH | 無 | 查看引用 |
gO | 無 | 轉到符號 |
C-W gd | C-W gf | 打開側邊的定義 |
gD | 無 | 速覽定義 |
gF | 無 | 查看聲明 |
tab | 無 | 切換小部件焦點 |
C-p | 切換上一個建議 | |
C-n | 切換下一個建議 |
2)一些INSERT模式下定義的熱鍵:
熱鍵 | 描述 |
---|---|
C-r [0-9a-z"%#*+:.-=] | 從寄存器粘貼內容 |
C-a | 插入之前插入的內容 |
C-o | 切換到NORMAL模式中執行一個命令,然后返回 |
C-u | 刪除當前光標當行首前的所有內容 |
C-w | 刪除左側的單詞 |
C-h | 刪除左側的字符 |
C-t | 光標向右移動,單位是一個縮進 |
C-d | 光標向左移動,單位是一個縮進 |
C-j | 插入新行 |
C-c | 退出INSTER模式 |
3)一些側邊欄中進行移動的熱鍵:
熱鍵 | 描述 |
---|---|
j / k | 向下向上移動光標 |
h / l | 打開或關閉項目 |
Enter | 打開項目 |
gg | 返回頂部 |
G | 返回底部 |
o | 切換展開 |
C-u / C-d | 向上或向下翻頁 |
Escape | 切換鍵盤導航 |
4)文件資源管理的熱鍵:
熱鍵 | 描述 |
---|---|
r | 重命名文件 |
d | 刪除文件 |
y | 拷貝文件 |
x | 剪切文件 |
p | 粘貼文件 |
v | 以垂直拆分的方式打開文件 |
a | 創建新文件 |
S-a | 創建新目錄 |
此外還有一些熱鍵這里沒有例舉出來,可參閱官方文檔進行查看。