vscode-nvim


vscode-nvim

基本介紹

我之前嘗試在vscode中使用vsocde-vim插件來進行開發,但是我無法忍受它的卡頓,因此我將目光放在了vscode-nvim插件上:

image-20211101225350530

它與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插件並安裝:

image-20211101230944834

基礎配置

安裝完成之后我們需要對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插件總能給你帶來意外的驚喜,讓你更加直觀的看到當前頁中所有代碼的問題、警告、錯誤信息。

如下圖所示:

image-20211108022237711

它可能會影響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 創建新目錄

此外還有一些熱鍵這里沒有例舉出來,可參閱官方文檔進行查看。


免責聲明!

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



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