编辑器 活跃维护

Vim

VSCodeVim/Vim

:star: Visual Studio Code 的 Vim

15221
Stars 标星
1468
Forks 分支
124
Watchers 关注
1907
Open Issues
TypeScript
主要语言
MIT
开源协议
22.4 MB
仓库大小
10 小时前
最后推送
一键安装扩展 / 插件指令
dsh plugin --profile web add github:VSCodeVim/Vim
git clone https://github.com/VSCodeVim/Vim.git
git clone git@github.com:VSCodeVim/Vim.git
README.md master

机器翻译正文由机器翻译自项目原始文档(英文),排版经程序统一处理,可能存在偏差,请以原项目仓库为准。


VSCodeVim

Visual Studio Code 的 Vim 仿真

VSCodeVim 是 Visual Studio Code 的 Vim 模拟器。

  • 📃 我们的 更新日志 列出了各版本之间的重大/主要/次要更新。
  • 在 GitHub 上报告缺失的功能/错误。
目录 (点击展开)

💾 安装

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 命令,

  1. 安装 neovim
  2. 修改以下配置:
设置 描述 类型 默认值
vim.enableNeovim 启用 Neovim 布尔型 false
vim.neovimPath Neovim 可执行文件的完整路径。如果留空,将自动检查 PATH 环境变量以找到 Neovim 路径。 字符串
vim.neovimUseConfigFile 如果为 true,Neovim 将加载由 vim.neovimConfigPath 指定的配置文件。如果你希望 Neovim 能够使用其自己的插件,这是必要的。 布尔型 false
vim.neovimConfigPath Neovim 将加载作为配置文件的路径。如果留空,Neovim 将在其默认位置进行搜索。 字符串

以下是一些使用 Neovim 集成的想法:

按键重新映射

自定义重新映射是按模式定义的。

"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"
            ]
        }
    ],

调试重映射

  1. 将扩展的日志级别调整为“调试”,并打开输出窗口:

    1. 从命令面板运行 Developer: Set Log Level。
    2. 先选择 Vim,然后选择 Debug
    3. 运行 Developer: Reload window
    4. 在底部面板中,打开 Output 选项卡,并从下拉菜单中选择 Vim。
  2. 你的配置正确吗?

    每当加载一个重映射的配置时,它都会记录到 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.

    配置错误的设置将被忽略。

  3. 该扩展是否处理你试图重新映射的按键?

    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 设置按以下顺序加载:

  1. :set {setting}
  2. vim.{setting} 来自用户/工作区设置。
  3. VS Code 设置
  4. 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 进行配置演示。

  1. 安装 im-select(参见 安装指南)
  2. 查找你的默认输入法键

    • 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。
  1. 配置 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 发送下架通知,并附上项目地址与本页链接。本站核实后将第一时间删除本页内容,或改为不复制原文的目录性收录;署名更正等其他要求可一并提出。