机器翻译正文由机器翻译自项目原始文档(英文),排版经程序统一处理,可能存在偏差,请以原项目仓库为准。
VSCodeVim
Visual Studio Code 的 Vim 仿真
VSCodeVim 是 Visual Studio Code 的 Vim 模拟器。
目录 (点击展开)
- 💾 安装
- ⚙️ 设置
- 快速示例
- VSCodeVim 设置
- Neovim 集成
- 按键重新映射
"vim.insertModeKeyBindings"/"vim.normalModeKeyBindings"/"vim.visualModeKeyBindings"/"vim.operatorPendingModeKeyBindings""vim.insertModeKeyBindingsNonRecursive"/"normalModeKeyBindingsNonRecursive"/"visualModeKeyBindingsNonRecursive"/"operatorPendingModeKeyBindingsNonRecursive"- 调试重映射
- 映射更复杂的按键组合
- Vim 模式
- Vim 设置
- .vimrc 支持
- 🖱️ 多光标模式
- 🔌 模拟插件
- 🎩 VSCodeVim 小技巧!
- 📚 F.A.Q.
- ❤️ 贡献
💾 安装
VSCodeVim 可以通过 VS Code 市场 或 OpenVSX 市场 安装。
麦金塔
要启用按键重复,请在终端中执行以下操作,注销并重新登录,然后重启 VS Code:
defaults write com.microsoft.VSCode ApplePressAndHoldEnabled -bool false # For VS Code
defaults write com.microsoft.VSCodeInsiders ApplePressAndHoldEnabled -bool false # For VS Code Insider
defaults write com.vscodium ApplePressAndHoldEnabled -bool false # For VS Codium
defaults write com.microsoft.VSCodeExploration ApplePressAndHoldEnabled -bool false # For VS Codium Exploration users
defaults write com.exafunction.windsurf ApplePressAndHoldEnabled -bool false # For Windsurf
defaults delete -g ApplePressAndHoldEnabled # If necessary, reset global default
我们还建议在 系统设置/偏好设置 -> 键盘 中增加按键重复和延迟重复的设置。
窗口
像真实的 vim 一样,VSCodeVim 会接管你的控制键。此行为可以通过 useCtrlKeys 和 handleKeys 设置进行调整。
⚙️ 设置
此处记录的设置是支持设置的子集;完整列表请参见 VSCodeVim 的 扩展详情页面 中的 FEATURES -> Settings 选项卡,可在 VS Code 的 扩展视图 中找到。
快速示例
下面是一个包含与 VSCodeVim 相关设置的 settings.json 文件示例:
{
"vim.easymotion": true,
"vim.incsearch": true,
"vim.useSystemClipboard": true,
"vim.useCtrlKeys": true,
"vim.hlsearch": true,
"vim.insertModeKeyBindings": [
{
"before": ["j", "j"],
"after": ["<Esc>"]
}
],
"vim.normalModeKeyBindingsNonRecursive": [
{
"before": ["<leader>", "d"],
"after": ["d", "d"]
},
{
"before": ["<C-n>"],
"commands": [":nohl"]
},
{
"before": ["K"],
"commands": ["lineBreakInsert"],
"silent": true
}
],
"vim.leader": "<space>",
"vim.handleKeys": {
"<C-a>": false,
"<C-f>": false
},
// To improve performance
"extensions.experimental.affinity": {
"vscodevim.vim": 1
}
}
VSCodeVim 设置
这些设置特定于 VSCodeVim。
| 设置 | 描述 | 类型 | 默认值 |
|---|---|---|---|
| vim.changeWordIncludesWhitespace | 修改单词时包括尾随空格。此配置用于使 cw 操作的行为与其类似操作(yw 和 dw)一致,而不是像 ce 那样行为。 | 布尔值 | false |
| vim.cursorStylePerMode.{Mode} | 为 {Mode} 配置特定的光标样式。未列出的模式将使用 默认光标类型 支持的光标样式:line、block、underline、line-thin、block-outline 和 underline-thin。 | 字符串 | 无 |
| vim.digraphs.{shorthand} | 设置自定义的 digraph 简写,可以覆盖默认简写。条目应将两个字符的简写映射到描述字符串和一个或多个 UTF16 代码点。例如:"R!": ["🚀", [55357, 56960]] |
对象 | {"R!": ["🚀", [0xD83D, 0xDE80]] |
| vim.disableExtension | 禁用 VSCodeVim 扩展。此设置也可以通过命令面板中的 toggleVim 命令切换。 |
布尔值 | false |
| vim.handleKeys | 将配置的按键委托给 VS Code 处理,而不是由 VSCodeVim 扩展处理。[package.json]( https://github.com/VSCodeVim/Vim/blob/master/package.json ) 中 keybindings 部分的任何按键,如果在 when 参数中有 vim.use<C-...>,可以通过设置 "<C-...>": false 将其重新委托给 VS Code。示例:使用 ctrl+f 进行查找(VS Code 原生行为):"vim.handleKeys": { "<C-f>": false }。 | 字符串 | "<C-d>": true "<C-s>": false "<C-z>": false |
||
| vim.overrideCopy | 使用我们自己的复制命令覆盖 VS Code 的复制命令,该命令能正确适用于 VSCodeVim。如果 cmd-c/ctrl-c 出现问题,请将其设置为 false 并在 此处 提出投诉。 | 布尔值 | false |
| vim.useSystemClipboard | 使用系统剪贴板寄存器 (*) 作为默认寄存器 |
布尔值 | false |
| vim.searchHighlightColor | 非当前搜索匹配项的背景颜色 | 字符串 | findMatchHighlightBackground ThemeColor |
| vim.searchHighlightTextColor | 非当前搜索匹配项的前景颜色 | 字符串 | 无 |
| vim.searchMatchColor | 当前搜索匹配的背景颜色 | 字符串 | findMatchBackground 主题颜色 |
| vim.searchMatchTextColor | 当前搜索匹配的前景颜色 | 字符串 | 无 |
| vim.substitutionColor | 当启用 vim.inccommand 时替换文本的背景颜色 |
字符串 | "#50f01080" |
| vim.substitutionTextColor | 当启用 vim.inccommand 时替换文本的前景颜色 |
字符串 | 无 |
| vim.startInInsertMode | 启动时进入插入模式而不是普通模式 | 布尔值 | false |
| vim.useCtrlKeys | 启用 Vim Ctrl 键以覆盖常见的 VS Code 操作,如复制、粘贴、查找等。 | 布尔值 | true |
| vim.visualstar | 在可视模式下,使用当前选区启动 * 或 # 搜索 |
布尔值 | false |
| vim.highlightedyank.enable | 启用复制时的高亮显示 | 布尔值 | false |
| vim.highlightedyank.color | 设置复制高亮的颜色 | 字符串 | rgba(250, 240, 170, 0.5) |
| vim.highlightedyank.duration | 设置复制高亮的持续时间 | 数字 | 200 |
Neovim 集成
:warning: 实验性功能。请在此处对 Neovim 集成留下反馈 here。
要使用 Neovim 执行 Ex 命令,
- 安装 neovim
- 修改以下配置:
| 设置 | 描述 | 类型 | 默认值 |
|---|---|---|---|
| vim.enableNeovim | 启用 Neovim | 布尔型 | false |
| vim.neovimPath | Neovim 可执行文件的完整路径。如果留空,将自动检查 PATH 环境变量以找到 Neovim 路径。 | 字符串 | |
| vim.neovimUseConfigFile | 如果为 true,Neovim 将加载由 vim.neovimConfigPath 指定的配置文件。如果你希望 Neovim 能够使用其自己的插件,这是必要的。 |
布尔型 | false |
| vim.neovimConfigPath | Neovim 将加载作为配置文件的路径。如果留空,Neovim 将在其默认位置进行搜索。 | 字符串 |
以下是一些使用 Neovim 集成的想法:
- g的力量
- The :normal command
- 更快的搜索和替换!
按键重新映射
自定义重新映射是按模式定义的。
"vim.insertModeKeyBindings"/"vim.normalModeKeyBindings"/"vim.visualModeKeyBindings"/"vim.operatorPendingModeKeyBindings"
- 插入、普通、操作待定和可视模式的按键绑定覆盖。
- 按键绑定覆盖可以包括
"before"、"after"、"commands"和"silent"。 - 在插入模式中将
jj绑定到<Esc>:
"vim.insertModeKeyBindings": [
{
"before": ["j", "j"],
"after": ["<Esc>"]
}
]
- 将
£绑定到光标下移至前一个完整单词:
"vim.normalModeKeyBindings": [
{
"before": ["£"],
"after": ["#"]
}
]
- 绑定
:以显示命令面板,并且不要在状态栏显示消息:
"vim.normalModeKeyBindings": [
{
"before": [":"],
"commands": [
"workbench.action.showCommands",
],
"silent": true
}
]
- 绑定
<leader>m以添加书签,绑定<leader>b以打开所有书签列表(使用 书签 扩展):
"vim.normalModeKeyBindings": [
{
"before": ["<leader>", "m"],
"commands": [
"bookmarks.toggle"
]
},
{
"before": ["<leader>", "b"],
"commands": [
"bookmarks.list"
]
}
]
- 将
ctrl+n绑定以关闭搜索高亮,将<leader>w绑定以保存当前文件:
"vim.normalModeKeyBindings": [
{
"before":["<C-n>"],
"commands": [
":nohl",
]
},
{
"before": ["leader", "w"],
"commands": [
"workbench.action.files.save",
]
}
]
- 在操作员待定模式下将
{绑定到w会使y{和d{分别像yw和dw那样工作:
"vim.operatorPendingModeKeyBindings": [
{
"before": ["{"],
"after": ["w"]
}
]
- 在操作员待命模式下,将
L绑定到$,将H绑定到^,使yL和dH分别像y$和d^一样工作:
"vim.operatorPendingModeKeyBindings": [
{
"before": ["L"],
"after": ["$"]
},
{
"before": ["H"],
"after": ["^"]
}
]
- 在可视模式下将
>和<绑定用于缩进/减少缩进行(可重复操作):
"vim.visualModeKeyBindings": [
{
"before": [
">"
],
"commands": [
"editor.action.indentLines"
]
},
{
"before": [
"<"
],
"commands": [
"editor.action.outdentLines"
]
},
]
- 将
<leader>vim绑定以将此仓库克隆到选定的位置:
"vim.visualModeKeyBindings": [
{
"before": [
"<leader>", "v", "i", "m"
],
"commands": [
{
"command": "git.clone",
"args": [ "https://github.com/VSCodeVim/Vim.git" ]
}
]
}
]
"vim.insertModeKeyBindingsNonRecursive"/"normalModeKeyBindingsNonRecursive"/"visualModeKeyBindingsNonRecursive"/"operatorPendingModeKeyBindingsNonRecursive"
- 用于插入、普通和可视模式的非递归键绑定覆盖
- 示例: 交换两个键的功能,例如将
j交换为k,将k交换为j,以交换光标向上和向下的命令。请注意,如果你尝试正常绑定,j将会被k替换,k将会被j替换,如此循环。当这种情况发生 'maxmapdepth' 次(默认 1000),将抛出错误信息 'E223 Recursive Mapping'。使用非递归键绑定变体可以停止这种递归扩展:
"vim.normalModeKeyBindingsNonRecursive": [
{
"before": ["j"],
"after": ["k"]
},
{
"before": ["k"],
"after": ["j"]
}
]
- 在操作符待定模式下,将
(绑定到 'i(' 会使 'y(' 和 'c(' 分别像 'yi(' 和 'ci(' 一样工作:
"vim.operatorPendingModeKeyBindingsNonRecursive": [
{
"before": ["("],
"after": ["i("]
}
]
- 在可视模式下绑定
p,以在不覆盖当前寄存器的情况下粘贴:
"vim.visualModeKeyBindingsNonRecursive": [
{
"before": [
"p",
],
"after": [
"p",
"g",
"v",
"y"
]
}
],
调试重映射
-
将扩展的日志级别调整为“调试”,并打开输出窗口:
- 从命令面板运行
Developer: Set Log Level。 - 先选择
Vim,然后选择Debug - 运行
Developer: Reload window - 在底部面板中,打开
Output选项卡,并从下拉菜单中选择Vim。
- 从命令面板运行
-
你的配置正确吗?
每当加载一个重映射的配置时,它都会记录到 Vim 输出面板中。你看到任何错误了吗?
debug: Remapper: normalModeKeyBindingsNonRecursive. before=0. after=^. debug: Remapper: insertModeKeyBindings. before=j,j. after=<Esc>. error: Remapper: insertModeKeyBindings. Invalid configuration. Missing 'after' key or 'commands'. before=j,k.配置错误的设置将被忽略。
-
该扩展是否处理你试图重新映射的按键?
VSCodeVim 通过 package.json 明确指示 VS Code 我们关心的按键事件。如果你试图重新映射的按键是 vim/vscodevim 通常不处理的按键,那么很可能此扩展不会从 VS Code 接收这些按键事件。在 Vim 输出面板中,你应该会看到:
debug: ModeHandler: handling key=A. debug: ModeHandler: handling key=l. debug: ModeHandler: handling key=<BS>. debug: ModeHandler: handling key=<C-a>.当你按下你试图重新映射的按键时,你在这里看到它被输出了吗?如果没有,这意味着我们没有订阅这些按键事件。仍然可以通过使用 VSCode 的 keybindings.json 来重新映射这些按键(参见下一节:重新映射更复杂的按键组合)。
重新映射更复杂的按键组合
强烈建议使用类似 "vim.normalModeKeyBindings" 的 vim 命令来重新映射按键(请见这里)。但有时常规的重新映射命令并不够用,因为它们不支持所有可能的按键组合(例如 Alt+key 或 Ctrl+Shift+key)。在这种情况下,可以在 keybindings.json 中创建新的按键绑定。操作方法:在 VSCode 中使用 CTRL+SHIFT+P 打开 keybindings.json,然后选择 Open keyboard shortcuts (JSON)。
然后你就可以像这样向 keybindings 添加一个新条目:
{
"key": "YOUR_KEY_COMBINATION",
"command": "vim.remap",
"when": "inputFocus && vim.mode == 'VIM_MODE_YOU_WANT_TO_REBIND'",
"args": {
"after": ["YOUR_VIM_ACTION"]
}
}
例如,要在普通模式下将 ctrl+shift+y 重新绑定到 VSCodeVim 的 yy(复制整行),请将此添加到你的 keybindings.json 中:
{
"key": "ctrl+shift+y",
"command": "vim.remap",
"when": "inputFocus && vim.mode == 'Normal'",
"args": {
"after": ["y", "y"]
}
}
如果 keybindings.json 第一次打开时是空的,请确保在文件中添加开括号 [ 和闭括号 ],因为按键绑定应位于 JSON 数组中。
Vim 模式
以下是 VSCodeVim 使用的所有模式:
| 模式 |
|---|
| 正常 |
| 插入 |
| 可视 |
| 可视块 |
| 可视行 |
| 搜索进行中模式 |
| 命令行进行中 |
| 替换 |
| EasyMotion模式 |
| EasyMotion输入模式 |
| Surround输入模式 |
| 操作等待模式 |
| 禁用 |
在使用 keybindings.json 重新绑定键时,使用"when 条件上下文",了解vim当前所处的模式可能会很有用。例如,要编写一个检查vim当前是否处于正常模式或可视模式的"when 条件",可以编写如下内容:
"when": "vim.mode == 'Normal' || vim.mode == 'Visual'",
Vim 设置
从 vim 复制的配置设置。Vim 设置按以下顺序加载:
:set {setting}vim.{setting}来自用户/工作区设置。- VS Code 设置
- VSCodeVim 默认值
| 设置 | 描述 | 类型 | 默认值 |
|---|---|---|---|
| vim.autoindent | 在新建行时复制当前行的缩进 | 布尔值 | true |
| vim.gdefault | 打开时,:substitute 标志 g 默认开启。这意味着一行中的所有匹配都会被替换,而不仅仅是一个。当给 :substitute 命令提供 g 标志时,这将切换替换所有或单个匹配。 |
布尔值 | false |
| vim.hlsearch | 高亮显示当前搜索匹配的所有文本 | 布尔值 | false |
| vim.ignorecase | 搜索模式时忽略大小写 | 布尔值 | true |
| vim.incsearch | 输入搜索内容时显示下一个匹配 | 布尔值 | true |
| vim.inccommand | 输入命令 :substitute 时显示其效果 |
字符串 | replace |
| vim.joinspaces | 在连接或重新格式化时,在‘.’、‘?’ 和 ‘!’ 后添加两个空格 | 布尔值 | true |
| vim.leader | 定义 <leader> 的键,用于键盘重映射 |
字符串 | \ |
| vim.maxmapdepth | 映射执行而不产生字符的最大次数。通常用于捕获无限映射,例如使用 ':map x y' 和 ':map y x'。它仍然不能捕获 ':map g wg',因为 'w' 在下一个映射执行前已被使用。 | 数字 | 1000 |
| vim.report | 报告已更改行数的阈值 | 数字 | 2 |
| vim.shell | 用于 ! 和 :! 命令的 shell 路径 |
字符串 | 在 Unix 系统上为 /bin/sh,Windows 环境变量为 %COMSPEC% |
| vim.showcmd | 在状态栏显示(部分)命令 | 布尔值 | true |
| vim.showmodename | 在状态栏显示当前模式名称 | 布尔值 | true |
| vim.smartcase | 如果搜索模式包含大写字符,则覆盖 'ignorecase' 设置 | 布尔值 | true |
| vim.textwidth | 使用 gq 时的换行宽度 |
数值 | 80 |
| vim.timeout | 重映射命令的超时毫秒数 | 数值 | 1000 |
| vim.whichwrap | 允许指定键在光标位于行首/行尾时向左/向右移动时移动到上一行/下一行。参见 :help whichwrap。 | 字符串 | b,s |
.vimrc 支持
:warning: 目前 .vimrc 支持处于实验阶段。仅支持重映射,并且您可能会遇到错误。请 报告它们!
将 vim.vimrc.enable 设置为 true,并相应设置 vim.vimrc.path。
🖱️ 多光标模式
:warning: 多光标模式仍在实验阶段。请在我们的反馈贴中报告问题。
通过以下方式进入多光标模式:
- 在 OSX 上,
cmd-d。在 Windows 上,ctrl-d。 gb,这是我们新增的一个快捷键,相当于cmd-d(OSX)或ctrl-d(Windows)。它会在光标当前所在单词的下一个匹配词处添加另一个光标。- 在任何平台上运行“向上/向下添加光标”或使用该快捷键。
一旦你拥有多个光标,就可以根据需要使用 Vim 命令。大部分命令应该可用;部分命令不支持(参考 PR#587)。
- 每个光标都有自己的剪贴板。
- 在多光标可视模式下按 Escape 键会进入多光标普通模式。再次按下则会返回普通模式。
🔌 模拟插件
vim-航线
⚠️ 使用此插件会对性能产生影响。为了更改状态栏,我们会覆盖您工作区 settings.json 中的配置,这会导致延迟增加,并且工作目录中会持续出现变化的差异(参见 issue#2124)。
根据当前模式更改状态栏的颜色。启用后,配置 "vim.statusBarColors" 。可以为每种模式定义颜色,形式可以是 string(仅背景),或 string[](背景和前景)。
"vim.statusBarColorControl": true,
"vim.statusBarColors.normal": ["#8FBCBB", "#434C5E"],
"vim.statusBarColors.insert": "#BF616A",
"vim.statusBarColors.visual": "#B48EAD",
"vim.statusBarColors.visualline": "#B48EAD",
"vim.statusBarColors.visualblock": "#A3BE8C",
"vim.statusBarColors.replace": "#D08770",
"vim.statusBarColors.commandlineinprogress": "#007ACC",
"vim.statusBarColors.searchinprogressmode": "#007ACC",
"vim.statusBarColors.easymotionmode": "#007ACC",
"vim.statusBarColors.easymotioninputmode": "#007ACC",
"vim.statusBarColors.surroundinputmode": "#007ACC",
vim-easymotion
基于 vim-easymotion 并通过以下设置进行配置:
| 设置 | 描述 | 类型 | 默认值 |
|---|---|---|---|
| vim.easymotion | 启用/禁用 easymotion 插件 | 布尔值 | false |
| vim.easymotionMarkerBackgroundColor | 标记框的背景颜色。 | 字符串 | '#0000' |
| vim.easymotionMarkerForegroundColorOneChar | 单字符标记的字体颜色。 | 字符串 | '#ff0000' |
| vim.easymotionMarkerForegroundColorTwoCharFirst | 两字符标记中第一个字符的字体颜色,用于区别单字符标记。 | 字符串 | '#ffb400' |
| vim.easymotionMarkerForegroundColorTwoCharSecond | 两字符标记中第二个字符的字体颜色,用于区分连续的标记。 | 字符串 | '#b98300' |
| vim.easymotionIncSearchForegroundColor | n 字符搜索命令的字体颜色,用于高亮匹配项。 | 字符串 | '#7fbf00' |
| vim.easymotionDimColor | 显示标记时,字体变暗的颜色,当 #vim.easymotionDimBackground# 设置为 true 时使用。 |
字符串 | '#777777' |
| vim.easymotionDimBackground | 标记可见时是否使其他文本变暗。 | 布尔值 | true |
| vim.easymotionMarkerFontWeight | 标记文本使用的字体粗细。 | 字符串 | 'bold' |
| vim.easymotionKeys | 用于跳转标记的字符。 | 字符串 | 'hklyuiopnm,qwertzxcvbasdgjf;' |
| vim.easymotionJumpToAnywhereRegex | 自定义正则匹配 JumpToAnywhere 动作(类似于 Easymotion_re_anywhere )。 |
字符串 | \b[A-Za-z0-9]\|[A-Za-z0-9]\b\|_.\|#.\|[a-z][A-Z] |
一旦 easymotion 激活,使用以下命令启动移动。启动移动后,文本装饰器/标记将显示,您可以按显示的按键跳至该位置。leader 可配置,默认值为 \。
| 移动命令 | 描述 |
|---|---|
<leader><leader> s <char> |
搜索字符 |
<leader><leader> f <char> |
向前查找字符 |
<leader><leader> F <char> |
向后查找字符 |
<leader><leader> t <char> |
向前查找至字符 |
<leader><leader> T <char> |
向后查找至字符 |
<leader><leader> w |
向前查找单词开头 |
<leader><leader> b |
向后查找单词开头 |
<leader><leader> l |
向前匹配单词的开头和结尾、驼峰命名、在 _ 之后以及 # 之后 |
<leader><leader> h |
向后匹配单词的开头和结尾、驼峰命名、在 _ 之后以及 # 之后 |
<leader><leader> e |
向前查找单词结尾 |
<leader><leader> ge |
向后查找单词结尾 |
<leader><leader> j |
向前查找行首 |
<leader><leader> k |
向后查找行首 |
<leader><leader> / <char>... <CR> |
搜索 n 个字符 |
<leader><leader><leader> bdt |
到字符 |
<leader><leader><leader> bdw |
查找单词开头 |
<leader><leader><leader> bde |
查找单词结尾 |
<leader><leader><leader> bdjk |
查找行首 |
<leader><leader><leader> j |
JumpToAnywhere 移动;默认行为匹配单词的开头和结尾、驼峰命名、在 _ 之后以及 # 之后 |
<leader><leader> (2s|2f|2F|2t|2T) <char><char> 和 <leader><leader><leader> bd2t <char>char> 也可用。区别在于搜索所需的字符数。例如,<leader><leader> 2s <char><char> 需要两个字符,并按两个字符搜索。此映射不是标准映射,因此建议使用您的自定义映射。
vim-surround
基于 surround.vim,该插件用于处理括号、方括号、引号和 XML 标签等包围字符。
| 设置 | 描述 | 类型 | 默认值 |
|---|---|---|---|
| vim.surround | 启用/禁用 vim-surround | 布尔 | true |
t 或 < 作为 <desired> 或 <existing> 将进入标签输入模式。使用 <CR> 而不是 > 完成标签更改将保留现有属性。
| Surround 命令 | 描述 |
|---|---|
y s <motion> <desired> |
在由 <motion> 定义的文本周围添加 desired |
d s <existing> |
删除 existing 的环绕 |
c s <existing> <desired> |
将 existing 更改为 desired |
S <desired> |
在可视模式下包围(包围整个选择) |
一些示例:
"test"光标在引号内时,输入cs"',结果为'test'"test"光标在引号内时,输入ds",结果为test"test"光标在引号内时,输入cs"t并回车123>,结果为<123>test</123>
vim-注释
类似于 vim-commentary,但使用 VS Code 原生的 切换行注释 和 切换块注释 功能。
使用示例:
gc- 切换行注释。例如gcc切换当前行的注释,gc2j切换当前行及接下来的两行的注释。gC- 切换块注释。例如gCi)注释括号内的所有内容。
vim-缩进对象
基于 vim-indent-object,它允许将当前缩进级别的代码块作为文本对象处理。在不使用大括号包围语句的语言(如 Python)中非常有用。
只要在开括号和闭括号 / 标签之间有新行,它就可以被视为一个无关 cib / ci{ / ci[ / cit 的对象。
| 命令 | 描述 |
|---|---|
<operator>ii |
该缩进级别 |
<operator>ai |
该缩进级别以及上一行(类似 Python 中的 if 语句) |
<operator>aI |
该缩进级别、上一行和下一行(类似 C/C++/Java 等中的 if 语句) |
vim-sneak
基于 vim-sneak,它允许跳转到由两个字符指定的任意位置。
| 设置 | 描述 | 类型 | 默认值 |
|---|---|---|---|
| vim.sneak | 启用/禁用 vim-sneak | 布尔值 | false |
| vim.sneakUseIgnorecaseAndSmartcase | 在 sneak 时遵循 vim.ignorecase 和 vim.smartcase |
布尔值 | false |
Sneak 一旦激活,使用以下命令发起动作。对于操作符,sneak 使用 z 而不是 s,因为 s 已经被 surround 插件占用。
| 移动命令 | 描述 |
|---|---|
s<char><char> |
向前移动到 <char><char> 的第一次出现位置 |
S<char><char> |
向后移动到 <char><char> 的第一次出现位置 |
<operator>z<char><char> |
向前执行 <operator> 到 <char><char> 的第一次出现位置 |
<operator>Z<char><char> |
向后执行 <operator> 到 <char><char> 的第一次出现位置 |
驼峰式移动
基于 CamelCaseMotion,虽然不是完全的模拟。该插件提供了一种更容易的方法来移动 camelCase 和 snake_case 单词。
| 设置 | 描述 | 类型 | 默认值 |
|---|---|---|---|
| vim.camelCaseMotion.enable | 启用/禁用 CamelCaseMotion | 布尔值 | false |
一旦启用 CamelCaseMotion,以下操作可用:
| 操作命令 | 描述 |
|---|---|
<leader>w |
向前移动到下一个 camelCase 或 snake_case 单词片段的开头 |
<leader>e |
向前移动到下一个 camelCase 或 snake_case 单词片段的结尾 |
<leader>b |
向后移动到上一个 camelCase 或 snake_case 单词片段的开头 |
<operator>i<leader>w |
选择/更改/删除等当前 camelCase 或 snake_case 单词片段 |
默认情况下, <leader> 映射到 \,例如,d2i\w 将删除当前和下一个 camelCase 单词片段。
输入法
在退出插入模式时禁用输入法。
| 设置 | 描述 |
|---|---|
vim.autoSwitchInputMethod.enable |
布尔值,表示 autoSwitchInputMethod 是否开启 |
vim.autoSwitchInputMethod.defaultIM |
默认输入法 |
vim.autoSwitchInputMethod.obtainIMCmd |
获取当前输入法的命令的完整路径 |
vim.autoSwitchInputMethod.switchIMCmd |
切换输入法的命令的完整路径,其中 {im} 为输入法键的占位符 |
任何第三方程序都可用于切换输入法。以下将使用 im-select 进行配置演示。
- 安装 im-select(参见 安装指南)
-
查找你的默认输入法键
-
Mac:
将输入法切换到英语,并在终端运行以下命令:
/<path-to-im-select-installation>/im-select,以输出你的默认输入法。下表列出了 MacOS 上常用的英语键布局。
-
| 键 | 描述 |
|---|---|
| com.apple.keylayout.US | 美国 |
| com.apple.keylayout.ABC | ABC |
| com.apple.keylayout.British | 英国 |
| com.apple.keylayout.Irish | 爱尔兰 |
| com.apple.keylayout.Australian | 澳大利亚 |
| com.apple.keylayout.Dvorak | 多沃拉克 |
| com.apple.keylayout.Colemak | Colemak |
- Windows:
请参阅 [im-select 指南]( https://github.com/daipeihust/im-select#to-get-current-keyboard-locale ) 来了解如何查找你的输入法键。通常,如果你的键盘布局是 en_US,那么输入法键是 1033(en_US 的区域 ID)。你也可以从 [此页面]( https://www.science.co.il/language/Locale-codes.php ) 查找你的区域 ID,其中 `LCID Decimal` 列是区域 ID。
-
配置
vim.autoSwitchInputMethod。-
MacOS:
给定
com.apple.keylayout.US的输入法键以及位于/usr/local/bin的im-select。配置如下:"vim.autoSwitchInputMethod.enable": true, "vim.autoSwitchInputMethod.defaultIM": "com.apple.keylayout.US", "vim.autoSwitchInputMethod.obtainIMCmd": "/usr/local/bin/im-select", "vim.autoSwitchInputMethod.switchIMCmd": "/usr/local/bin/im-select {im}" -
Windows:
给定输入法键为
1033(en_US)且im-select.exe位于D:/bin。配置如下:"vim.autoSwitchInputMethod.enable": true, "vim.autoSwitchInputMethod.defaultIM": "1033", "vim.autoSwitchInputMethod.obtainIMCmd": "D:\\bin\\im-select.exe", "vim.autoSwitchInputMethod.switchIMCmd": "D:\\bin\\im-select.exe {im}"
-
上述{im}参数是一个命令行选项,会传递给im-select表示切换输入方法。如果使用替代程序切换输入方法,应在配置中添加类似选项。例如,如果程序的使用my-program -s imKey切换输入法,vim.autoSwitchInputMethod.switchIMCmd应为/path/to/my-program -s {im}。
替换注册
Based on [ReplaceWithRegister] ( https://github.com/vim-scripts/ReplaceWithRegister),一种用寄存器内容替换现有文本的简便方法。
| 设置 | 描述 | 类型 | 默认值 |
|---|---|---|---|
| vim.替换寄存器 | 启用/禁用替换寄存器 | 布尔值 | false |
激活后,输入gr(比如“go replace”),然后用动作描述你想用寄存器内容替换的文本。
| 动作指令 | 描述 |
|---|---|
[count]["a]gr<motion> |
将动议描述的文本替换为指定寄存器 |
[count]["a]grr |
将[count]行或当前行替换为指定寄存器的内容 |
{Visual}["a]gr |
用指定寄存器的内容替换选择内容 |
Vim 文本对象-全部
类似于 vim-textobj-entire。
新增了两个有用的文本对象:
ae表示缓冲区的全部内容。ie表示缓冲区的全部内容,不包括前置和后置空格。
使用示例:
dae- 删除整个缓冲区内容。yie- 会拉掉缓冲区内容,除了前后空行。gUae- 把整个缓冲区转换成大写。
vim-textobj-参数
类似于 [targets.vim](https://github.com/wellle/targets.vim ) 中的参数文本对象。这是处理函数中参数的简便方法,在大多数编程语言中。
| 移动命令 | 描述 |
|---|---|
<operator>ia |
排除分隔符的参数。 |
<operator>aa |
包含分隔符的参数。 |
使用示例:
cia- 在保留像,这样的分隔符的情况下更改光标下的参数。daa- 将删除光标下的整个参数及其分隔符(如果适用)。
| 设置 | 描述 | 类型 | 默认值 |
|---|---|---|---|
| vim.argumentObjectOpeningDelimiters | 一组起始分隔符 | 字符串列表 | ["(", "["] |
| vim.argumentObjectClosingDelimiters | 一组结束分隔符 | 字符串列表 | [")", "]"] |
| vim.argumentObjectSeparators | 一组对象分隔符 | 字符串列表 | [","] |
🎩 VSCodeVim 技巧!
VS Code 有很多巧妙的技巧,我们尝试保留其中一些:
gd- 跳转到定义。gq- 在可视化选择上重新排版和换行文本块,同时保留注释样式。适合格式化文档注释。gb- 在光标下与当前单词相同的下一个单词上添加另一个光标。af- 可视模式命令,用于选择越来越大的文本块。例如,如果你有 "blah (foo [bar 'ba|z'])",它会先选择 'baz'。如果再次按af,则选择 [bar 'baz'],第三次按时会选择 "(foo [bar 'baz'])"。gh- 相当于将鼠标悬停在光标所在位置。方便查看类型和错误信息而无需使用鼠标!
📚 常见问题解答
-
本机 Visual Studio Code 的
ctrl(例如ctrl+f、ctrl+v) 命令都无法使用将
useCtrlKeys设置 为false。 -
将
j/k移动到折叠上会展开折叠尝试将
vim.foldfix设置为true。这是一种变通方法;它可以正常工作,但会有副作用(见 issue#22276)。 -
按键重复不起作用
你是在 Mac 上吗?你是否按照我们的 mac-setup 指南操作?
-
有烦人的智能感知/通知/弹出窗口,我无法用
<esc>关闭!或者我在使用代码片段时想关闭智能感知按
shift+<esc>关闭所有这些框。 -
在禅模式下或状态栏被禁用时,如何使用命令行?
此扩展提供了一个可重新映射的命令,用于显示 VS Code 风格的快速选择版本的命令行,功能更有限。可以在 VS Code 的 keybindings.json 设置文件中按如下方式重新映射。
{ "key": "shift+;", "command": "vim.showQuickpickCmdLine", "when": "editorTextFocus && vim.mode != 'Insert'" }或者仅用于禅模式:
{ "key": "shift+;", "command": "vim.showQuickpickCmdLine", "when": "inZenMode && vim.mode != 'Insert'" } -
我如何在启用自动换行的情况下按每个显示行移动光标?
如果启用了自动换行,并且希望在使用 j、k、↓ 或 ↑ 时光标进入每个换行的行,请在 VS Code 的 keybindings.json 设置文件中设置以下内容。
{
"key": "up",
"command": "cursorUp",
"when": "editorTextFocus && vim.active && !inDebugRepl && !suggestWidgetMultipleSuggestions && !suggestWidgetVisible"
},
{
"key": "down",
"command": "cursorDown",
"when": "editorTextFocus && vim.active && !inDebugRepl && !suggestWidgetMultipleSuggestions && !suggestWidgetVisible"
},
{
"key": "k",
"command": "cursorUp",
"when": "editorTextFocus && vim.active && !inDebugRepl && vim.mode == 'Normal' && !suggestWidgetMultipleSuggestions && !suggestWidgetVisible"
},
{
"key": "j",
"command": "cursorDown",
"when": "editorTextFocus && vim.active && !inDebugRepl && vim.mode == 'Normal' && !suggestWidgetMultipleSuggestions && !suggestWidgetVisible"
}
注意事项: 此解决方案恢复 j 和 k 键的默认 VS Code 行为,因此 10j 之类的操作将无法使用。如果你需要这些操作可以正常使用,存在其他性能较低的选项。
-
我使用 setxkbmap 交换了 Escape 和 Caps Lock,但 VSCodeVim 并未遵循交换设置
这是 VS Code 中的 已知问题,作为解决方法,你可以设置
"keyboard.dispatch": "keyCode"并重启 VS Code。 -
VSCodeVim 太慢了!
你可以尝试添加以下 设置,然后重新加载或重启 VSCode:
"extensions.experimental.affinity": { "vscodevim.vim": 1 }注意事项: 使用亲和性设置的一个问题是,每次更新设置文件时,Vim 插件都会重新加载,这可能需要几秒钟的时间。
❤️ 贡献
这个项目由一群很棒的人维护,非常欢迎贡献 :heart:。有关如何帮助的快速教程,请参阅我们的贡献指南。
特别感谢:
- 感谢 @xconverge 对仓库的 100 多次提交。如果你在想为什么你最不喜欢的 bug 突然消失了,那很可能是他干的。
- 感谢 @Metamist 实现了 EasyMotion!
- 感谢 @sectioneight 实现了文本对象!
- 特别感谢 Kevin Coleman,他设计了我们非常棒的标志!
- 感谢 @chillee,也就是 Horace He,他的贡献和辛勤工作。
- 本文标题:Vim - :star: Visual Studio Code
- 本文链接:https://www.cn121.com/editor/vscodevim-vim.html
- 原项目:VSCodeVim/Vim 版权归原作者 VSCodeVim 及贡献者所有
- 收录信息:本站于 2026-10-11 收录本项目,本页所列协议与仓库指标均为收录当时的状态;该日期之后原项目的版本更新与协议变更,本页不作同步。
- 开源协议:收录时本项目采用 MIT(查看 LICENSE 原文),本站译文为其衍生内容;使用、修改、分发请以该仓库 LICENSE 原文为准。
- 站点出处:本文首发于 OneTwoOne,收录自 GitHub 开源项目 VSCodeVim/Vim。
- 翻译说明:本页正文为人工智能生成内容——由机器翻译对原项目 README 初译、经程序校验排版,可能存在错漏,请以原项目文档为准。
- 引用声明:商业转载、第三方聚合或 AI 检索训练引用时,请务必保留以上来源出处、本文永久链接,以及原项目的版权声明与许可信息。
- 下架通道:若原项目此后变更或收紧了许可协议、或作者/权利人认为本站的收录方式(译文、排版适配、简介翻译等)超出其授权范围,请通过 xyd3302001@163.com 发送下架通知,并附上项目地址与本页链接。本站核实后将第一时间删除本页内容,或改为不复制原文的目录性收录;署名更正等其他要求可一并提出。