%% # 纲要 > 主干纲要、Hint/线索/路标 # Q&A #### 已明确 #### 待明确 > 当下仍存有的疑惑 **❓<font color="#c0504d"> 有什么问题?</font>** # Buffer ## 闪念 > sudden idea ## 候选资料 > Read it later %% # VSCodeNeovim 插件 ![[_attachment/05-工具/VSCode/VSCode 配置 Vim 键位环境.assets/IMG-VSCode 配置 Vim 键位环境-505A85C5ACA4466E1B9808840307E008.png|588]] > [!quote] > ![[_attachment/05-工具/VSCode/VSCode 配置 Vim 键位环境.assets/IMG-VSCode 配置 Vim 键位环境-203C5080E3BEA7BA22B26D3B613FAD56.png|673]] 插件功能特点: - **使用 Neovim 作为后端**,而 **VSCode 作为 GUI 前端**(负责渲染和 lsp),实现**良好适配与结合** - **插入模式**下,**尽可能保留 VSCode 原生功能** - **普通模式**下,**由 Neovim 处理从而支持 Vim 的各种键位功能**(将内容发往 Neovim 处理) - **支持通过 vim/neovim 原生配置文件进行设置** - **支持 vim 原生插件** <br><br><br> ## 与 VSCode 原生功能的良好适配&结合 ![[_attachment/05-工具/VSCode/VSCode 配置 Vim 键位环境.assets/IMG-VSCode 配置 Vim 键位环境-E105A9A73051FB71992B15891F3C063A.png|744]] 该插件**实现了 VSCode 与 Neovim 的==友好适配&结合==**,体现在[^1]: - 部分 **Neovim 命令** 被替换为**功能对应**的 "**VSCode 命令**" => 例如 `:e`、`:q`、`:sp` 等, - 参见[[#映射为 "VSCode 命令" 的 "Vim 命令"]] - 部分 **Neovim 按键** 会触发为对应的 "**VSCode 功能**" => 例如 Explorer 面板下的 `hjkl` 等。 - 参见[[#插件的按键绑定说明#VSCode 功能相关按键]] - 部分 **VSCode 功能** 被 "**重新绑定了新的快捷按键**" => 解决了 **VSCode 默认功能按键与 Neovim 功能按键冲突**的问题。 - 参见[[#插件的按键绑定说明#VSCode 功能相关按键]] - 使用 **VSCode 的跳转列表**代替 Neovim 的 => 从而**保证 VSCode 的本地导航(鼠标点击,跳转到定义等)可以通过跳转列表进行导航**。 - 不再需要**部分 Neovim 原生插件**,相应功能**由 VSCode 提供** - 例如**提供 "代码高亮"、"代码补全"、"LSP" 功能以及提供窗口或缓冲区的插**件(如 nerdtree, fuzzy-finders 等)**:<br> ![[_attachment/05-工具/VSCode/VSCode 配置 Vim 键位环境.assets/IMG-VSCode 配置 Vim 键位环境-BA85B2747894C24DE68FF06CC95882B4.png|572]] <br><br><br> # 插件的按键绑定 VSCodeNeovim 插件中**配置了一系列按键绑定以==提供 Neovim 编辑环境==**。 当这些按键与 "**VSCode 默认快捷键 or 用户自定义快捷键**" 冲突时,**会对后者进行==覆盖==,由 VSCodeNeovim 插件响应处理**。 因此,在**启用插件后,部分 VSCode 默认快捷键将失效**,例如 `Ctrl-F`、`Ctrl-D` 等。 与此同时,该**插件也重新绑定了一些按键到这些对应功能**。 VSCodeNeovim 插件对**按键**的**处理**可能为: - **传递给 Neovim 后端** - **针对 Vim/Neovim "普通模式"下的原生功能按键,例如 `<Esc>`、`<Ctrl-[>`、`hjkl` 、`d`、`a`、`i` 等等** - **调用 VSCode 功能命令**": - 例如 `gg`、`G`、`<Ctrl-F>`、`<Ctrl-U>`、`<Ctrl-D>` 等,**与 "编辑器行为" 相关** - 例如 **拆分窗口、打开新的标签页、VSCode Explor 窗口中的操作等**( - (插件重新设定了这些快捷键,替代了 VSCode 的默认按键) ## 插件的按键绑定说明 在快捷键编辑器中输入 "neovim",可**查看该插件设置所有按键绑定设置**。 涉及的按键主要包括三类: - (1)**Neovim 原生功能按键** - (2)**==与 VScode 功能相关==的按键**: **"代码导航"**、**"Explorer 操作"**、"**悬浮窗操作**"、"**窗口管理**"、"**标签页管理**" 等 ![[_attachment/05-工具/VSCode/VSCode 配置 Vim 键位环境.assets/IMG-VSCode 配置 Vim 键位环境-CF188F94FFD1AB0828457CACF32A4A31.png|654]] ## Neovim 原生功能相关的 `Ctrl` 组合按键 与 Neovim 原生功能相关的 **==`<Ctrl>`组合按键==** 会被该插件捕获并**传递给 Neovim 后端**,默认包括以下按键: ![[_attachment/05-工具/VSCode/VSCode 配置 Vim 键位环境.assets/IMG-VSCode 配置 Vim 键位环境-981B793976F9B7558D1D6486F8C7424D.png|523]] 上图中**前两项** 有对应的 **VSCode 插件配置项**,可**自定义修改**: - `Vscode-neovim: Ctrl Keys For Insert Mode` - `Vscode-neovim: Ctrl Keys For Normal Mode` ![[_attachment/05-工具/VSCode/VSCode 配置 Vim 键位环境.assets/IMG-VSCode 配置 Vim 键位环境-5F9ADFC883C4F838905F1C1C00AC4DEA.png|633]] <br> ## VSCode 功能相关按键 参见 ![[19-快捷键汇总/Vscode 快捷键#VSCodeNeovim 插件快捷键|Vscode 快捷键-VSCodeNeovim插件快捷键]] <br><br><br> # 映射为 "VSCode 命令" 的 "Vim 命令" ![[_attachment/05-工具/VSCode/VSCode 配置 Vim 键位环境.assets/IMG-VSCode 配置 Vim 键位环境-C99F65874EE09D24F3B190800D52CB38.png|568]] 涉及三类 Vim 命令,**映射为等价的 VSCode 命令**[^1]: - **文件管理**相关[^2] - `:edit`、`:enew`、`:find`、`:quit` 等 - 示例:**`:e` 变为打开文件(相对路径相对于 VSCode 工作区)** ,**`:q` 变为关闭当前标签页**, - **标签页管理**相关 [^3] - `:tabedit`、`:tabnew`、`:tabfind` 等 - 示例:`:tabedit` 变为 VSCode 的 "**在新标签页打开文件**"命令(等价于快捷键 `<Ctrl-P>`) - **窗口管理**相关 [^4] - `:split`、`:vsplit`、`:new` 、`:only`等 - 示例: **`:split` 变为分割 VSCode 窗口** 除上述命令外,**vim 中的 `:w`,`:wa`, `:sav` 命令仍作为 vim 命令生效。 完整映射列表参见三份文件[^2][^3][^4]: ![[_attachment/05-工具/VSCode/VSCode 配置 Vim 键位环境.assets/IMG-VSCode 配置 Vim 键位环境-68C37E555977C06EBF70F27BED3C177E.png|320]] # 插件配置 个人基本配置项包括: - 设置 Neovim 程序路径、Neovim 配置文件路径 - 设置 "**以独立进程运行 VSCode Neovim 插件**" 以**获取最优性能** - 配置**插入模式下的自定义组合按键** - **禁用**部分 Neovim 的 `Ctrl` 组合键,**还原 VSCode 默认快捷键功能** - 配置 Neovim 功能(参见 Neovim 配置笔记) - 使用**系统剪切板** #### 基本配置 ![[_attachment/05-工具/VSCode/VSCode 配置 Vim 键位环境.assets/IMG-VSCode 配置 Vim 键位环境-2E9F8B3B6EBFE1E1227D7577781B3770.png|656]] #### 配置插入模式下的自定义组合按键 ```json title:settings.json { "vscode-neovim.compositeKeys": { "jj": { "command": "vscode-neovim.escape", }, "jk": { // Use lua to execute any logic "command": "vscode-neovim.lua", "args": [ [ "local code = require('vscode')", "code.action('vscode-neovim.escape')", "code.action('workbench.action.files.save')", ], ], }, }, } ``` ### 禁用部分 VSCodeNeovim 插件的默认 Ctrl 组合键 从 VSCodeNeovim 插件的监听列表中**移除下列 Ctrl 组合键**,从而恢复对应的 VSCode 快捷键功能。 **普通模式**下: | 移除按键 | Neovim 功能 | VSCode 功能 | | ------- | -------------------- | --------------------------------------------- | | `<C-j>` | 无 | VSCode **显示/隐藏底部面板**的按键功能 | | `<C-k>` | 无 | VSCode 的 **Leader 键** | | `<C-t>` | 无 | VSCode 中 "**在当前 workspace 中查找 symbol**" 的按键功能 | | `<C-a>` | 递增光标处 or 其后**数字值+1** | 全选 | **插入模式**下: | 移除按键 | Neovim 功能 | VSCode 功能 | | ------- | ----------- | ---------- | | `<C-c>` | 等同于 `<Esc>` | 复制至系统剪贴板功能 | | `<C-a>` | 未知,有点奇怪 | **全选** | ### VScode 常用原生快捷键备注 | 原生 Vscode 快捷键 | 普通模式 | 普-替代 | 插入模式 | 插-替代 | | ------------------------- | ---- | ---- | ------ | ------- | | `<C-c>` 复制系统剪贴板内容 | ❌ | y | ❌ =>✔️ | | | `<C-v>` 粘贴系统剪贴板内容 | ❌ | p | ✔️ | | | `<C-]>` 增加缩进 | ❌ | `>>` | ✔️ | `<C-t>` | | `<C-[>` 减少缩减 | ❌ | `<<` | ❌ | `<C-d>` | | `<C-/>`注释 | ✔️ | | ✔️ | | | `<C-d>` **多光标**选中下一个高亮匹配项 | ❌ | | ❌ | | <br><br><br> # 参考资料 功能演示 - [VSCode Neovim Extension - YouTube](https://www.youtube.com/playlist?list=PLXDouhCU5r6qRE46qQ2rYIPnbJ5a9jzmd) 插件说明 - [VSCode Neovim | Yusong](https://blog.yusong.me/terminal/vim/vscode-neovim#%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6) - [VSCode Neovim Extension-CSDN博客](https://blog.csdn.net/theRavensea/article/details/138139825) # Footnotes [^1]: [vscode-neovim: Vim mode for VSCode, powered by Neovim](https://github.com/vscode-neovim/vscode-neovim?tab=readme-ov-file#%EF%B8%8F--keybindings-shortcuts) [^2]: [vscode-neovim/runtime/vscode/overrides/vscode-file-commands.vim at master · vscode-neovim/vscode-neovim · GitHub](https://github.com/vscode-neovim/vscode-neovim/blob/master/runtime/vscode/overrides/vscode-file-commands.vim) [^3]: [vscode-neovim/runtime/vscode/overrides/vscode-tab-commands.vim at master · vscode-neovim/vscode-neovim · GitHub](https://github.com/vscode-neovim/vscode-neovim/blob/master/runtime/vscode/overrides/vscode-tab-commands.vim) [^4]: [vscode-neovim/runtime/vscode/overrides/vscode-window-commands.vim at master · vscode-neovim/vscode-neovim · GitHub](https://github.com/vscode-neovim/vscode-neovim/blob/master/runtime/vscode/overrides/vscode-window-commands.vim)