%%
# 纲要
> 主干纲要、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)