Vim 模式

Zed 包括一个名为“vim 模式”的 Vim 模拟层。在此页面上,您将学习如何打开或关闭 Zed 的 vim 模式,Zed 提供的哪些工具和命令可帮助您导航和编辑代码,以及通常如何在 Zed 中充分利用 vim 模式。

您将学习如何

  • 了解 Zed 的 vim 模式与传统 Vim 之间的核心区别
  • 启用或禁用 vim 模式
  • 充分利用 vim 模式中的 Zed 特定功能
  • 自定义 vim 模式的按键绑定
  • 配置 vim 模式设置

无论您是 vim 模式的新手还是希望优化 Zed 体验的经验丰富的 Vim 用户,本指南都将帮助您充分利用 Zed 中的模态编辑功能。

Zed 的 vim 模式设计

Vim 模式尝试为 Vim 用户提供熟悉的体验:它在有意义时精确地复制动作和命令的行为,并使用 Zed 特定的功能来提供“开箱即用”的编辑体验,而无需您进行配置。

这包括对语义导航、多个光标或通常由插件(如环绕文本)提供的其他功能的支持。

因此,Zed 的 vim 模式不会逐一复制 Vim,而是将 Vim 的模态设计与 Zed 的现代功能相结合,以提供更流畅的体验。它也是可配置的,因此您可以添加自己的按键绑定或覆盖默认值。

核心差异

Vim 模式中有四种类型的特性使用 Zed 的核心功能,从而导致一些行为差异

  1. 动作:vim 模式使用 Zed 的语义分析来调整每种语言的动作行为。例如,在 Rust 中,使用 % 跳转到匹配的括号适用于管道字符 |。在 JavaScript 中,w 认为 $ 是一个单词字符。
  2. 可视块选择:vim 模式使用 Zed 的多个光标来模拟可视块选择,使块选择更加灵活。例如,在块选择后插入的任何内容都会实时更新每一行,并且您可以随时添加或删除光标。
  3. :vim 模式使用 Zed 的记录系统来记录 vim 宏。因此,您可以捕获和重放更复杂的操作,例如自动完成。
  4. 搜索和替换:vim 模式使用 Zed 的搜索系统,因此,与 Vim 相比,正则表达式的语法略有不同。 请转到“正则表达式差异”部分了解详细信息。

注意: Zed 的 vim 模式的基础应该已经涵盖了许多用例,我们一直在努力改进它。如果您发现工作流程中缺少您依赖的功能,请在 GitHub 上提交问题

启用和禁用 vim 模式

首次打开 Zed 时,您会在欢迎屏幕上看到一个复选框,允许您启用 vim 模式。

如果您错过了这一点,您可以随时通过打开命令面板并使用工作区命令 toggle vim mode 来打开或关闭 vim 模式。

注意:此命令会切换用户设置中的以下属性

{
  "vim_mode": true
}

Zed 特定功能

Zed 构建在现代基础上,(除其他外)使用 tree-sitter 和语言服务器来理解您正在编辑的文件的内容,并支持开箱即用的多个光标。

Vim 模式具有几个“核心 Zed”按键绑定,可帮助您充分利用 Zed 的特定功能集。

语言服务器

以下命令使用语言服务器来帮助您导航和重构代码。

命令默认快捷方式
转到定义g d
转到声明g D
转到类型定义g y
转到实现g I
重命名(更改定义)c d
转到当前单词的所有引用g A
在当前文件中查找符号g s
在整个项目中查找符号g S
转到下一个诊断g ]] d
转到上一个诊断g [[ d
显示内联错误(悬停)g h
打开代码操作菜单g .

Git

命令默认快捷方式
转到下一个 git 更改] c
转到上一个 git 更改[ c
展开 diff hunkd o
切换暂存d O
暂存并转到下一个(在差异视图中)d u
取消暂存并转到下一个(在差异视图中)d U
恢复更改d p

Treesitter

Treesitter 是一个强大的工具,Zed 使用它来理解代码的结构。 Zed 提供了用于更改当前光标位置的动作和可用作操作目标的文本对象。

命令默认快捷方式
转到下一个/上一个方法] m / [ m
转到下一个/上一个方法结尾] M / [ M
转到下一个/上一个部分] ] / [ [
转到下一个/上一个部分结尾] [ / [ ]
转到下一个/上一个注释] /, ] * / [ /, [ *
选择更大的语法节点[ x
选择更小的语法节点] x
文本对象默认快捷方式
围绕一个类、定义等。a c
在类、定义等内部。i c
围绕一个函数、方法等。a f
在函数、方法等内部。i f
一个注释g c
一个参数或列表项等。i a
一个参数或列表项等。(包括尾随逗号)a a
围绕类似 HTML 的标签a t
在类似 HTML 的标签内部i t
当前缩进级别,以及前后各一行a I
当前缩进级别,以及前面的一行a i
当前缩进级别i i

请注意,[m 系列动作的目标定义与 af 定义的边界相同。 [[ 的目标与 ac 定义的边界相同,但如果没有类,则也会使用函数。 类似地,gc 用于查找 [ /g c

函数、类和注释的定义取决于语言,并且可以通过添加 [textobjects.scm] 将支持添加到扩展。 参数和标签的定义在 tree-sitter 级别运行,但会在解析树中查找某些模式,并且目前无法按语言配置。

多光标

这些命令可帮助您在 Zed 中管理多个光标。

命令默认快捷方式
添加一个光标,选择当前单词的下一个副本g l
添加一个光标,选择当前单词的上一个副本g L
跳过最新的单词选择,并添加下一个g >
跳过最新的单词选择,并添加上一个g <
为当前单词的每个副本添加一个可视选择g a

窗格管理

这些命令打开新窗格或跳转到特定窗格。

命令默认快捷方式
打开项目范围的搜索g /
打开当前搜索摘录g <space>
在拆分窗格中打开当前搜索摘录<ctrl-w> <space>
在拆分窗格中转到定义<ctrl-w> g d
在拆分窗格中转到类型定义<ctrl-w> g D

在插入模式下

以下命令可帮助您调出 Zed 的补全菜单、从 GitHub Copilot 请求建议或打开内联 AI 助手,而无需离开插入模式。

命令默认快捷方式
打开补全菜单ctrl-x ctrl-o
请求 GitHub Copilot 建议(需要配置 GitHub Copilot)ctrl-x ctrl-c
打开内联 AI 助手(需要配置助手)ctrl-x ctrl-a
打开代码操作菜单ctrl-x ctrl-l
隐藏所有建议ctrl-x ctrl-z

支持的插件

Zed 的 Vim 模式包含了一些通常由 Vim 生态系统中非常流行的插件提供的功能。

  • 你可以使用 ys (yank surround) 包裹文本对象,使用 cs 改变包裹,使用 ds 删除包裹。
  • 你可以在可视模式下使用 gc,在普通模式下使用 gcc 来注释和取消注释选中的内容。
  • 项目面板支持许多模仿 Vim 插件 netrw 的快捷键:使用 hjkl 导航,使用 o 打开文件,使用 t 在新标签页中打开文件等等。
  • 你可以向你的键盘映射添加快捷键来导航 "camelCase" 命名。 前往可选键盘映射 部分学习如何操作。
  • 你可以使用 gR 来执行 ReplaceWithRegister
  • 你可以使用 cx 实现 vim-exchange 功能。 请注意,它在可视模式下没有默认绑定,但你可以将其添加到你的键盘映射中(请参阅可选键盘映射部分)。
  • 你可以使用 indent wise 插件 [-, ]-, [+, ]+, [=, ]= 导航到相对于光标的缩进深度。
  • 你可以使用 AnyQuotes 选择带引号的文本,使用 AnyBrackets 选择带括号的文本对象。 Zed 还提供了 MiniQuotes 和 MiniBrackets,它们基于 mini.ai Neovim 插件提供替代选择行为。 有关详细信息,请参阅下面的引号和括号文本对象部分。
  • 你可以配置 AnyQuotes、AnyBrackets、MiniQuotes 和 MiniBrackets 文本对象,以便使用不同的选择策略选择带引号和带括号的文本。 有关详细信息,请参阅下面的任何括号功能部分。

任何括号功能

Zed 提供了两种不同的策略来选择由任何引号或任何括号包围的文本。 这些文本对象默认未启用,必须在你的键盘映射中配置才能使用。

包含的字符

每种文本对象类型都适用于特定的字符

文本对象字符
AnyQuotes/MiniQuotes单引号 ('),双引号 ("),反引号 (`)
AnyBrackets/MiniBrackets圆括号 (()),方括号 ([]),花括号 ({}),尖括号 (<>)

“Any”和“Mini”变体都使用相同的字符集,但选择策略不同。

AnyQuotes 和 AnyBrackets(传统的 Vim 行为)

这些文本对象实现了传统的 Vim 行为

  • 选择优先级:首先查找最内层(最近)的引号或括号
  • 回退机制:如果未找到,则回退到当前行
  • 基于字符的匹配:仅关注开放和关闭字符,而不考虑语法
  • Vanilla Vim 相似性:AnyBrackets 匹配 vanilla Vim 中 ci<ci( 等命令的行为,包括潜在的极端情况(例如,将 => 中的 > 视为结束分隔符)

MiniQuotes 和 MiniBrackets (mini.ai 行为)

这些文本对象实现了 mini.ai Neovim 插件的行为

  • 选择优先级:首先搜索当前行,然后再向外扩展
  • Tree-sitter 集成:使用 Tree-sitter 查询进行更具上下文感知能力的选择
  • 语法感知匹配:可以区分实际的括号和其它上下文中的类似字符(例如 => 中的 >

选择方法

  • 如果你满足以下条件,请使用 AnyQuotes/AnyBrackets

    • 喜欢传统的 Vim 行为
    • 想要一致的、基于字符的选择,优先考虑最内层分隔符
    • 需要与 vanilla Vim 的文本对象非常匹配的行为
  • 如果你满足以下条件,请使用 MiniQuotes/MiniBrackets

    • 喜欢 mini.ai 插件的行为
    • 想要使用 Tree-sitter 进行更具上下文感知能力的选择
    • 搜索时优先考虑当前行

示例配置

要使用这些文本对象,你需要将绑定添加到你的键盘映射。 这是一个示例配置,使其在使用文本对象运算符(ia)或 change-surrounds(cs)时可用

{
  "context": "vim_operator == a || vim_operator == i || vim_operator == cs",
  "bindings": {
    // Traditional Vim behavior
    "q": "vim::AnyQuotes",
    "b": "vim::AnyBrackets",

    // mini.ai plugin behavior
    "Q": "vim::MiniQuotes",
    "B": "vim::MiniBrackets"
  }
}

使用此配置,你可以使用以下命令

  • cib - 使用 AnyBrackets 行为更改括号内的内容
  • cim - 使用 MiniBrackets 行为更改括号内的内容
  • ciq - 使用 AnyQuotes 行为更改引号内的内容
  • ciM - 使用 MiniQuotes 行为更改引号内的内容

命令面板

Vim 模式允许你使用 : 打开 Zed 的命令面板。 然后你可以键入以访问任何常用的 Zed 命令。 此外,vim 模式还为流行的 Vim 命令添加了别名,以确保你的肌肉记忆转移到 Zed。 例如,你可以编写 :w:write 来保存文件。

在下面,你将找到列出可以在命令面板中使用的命令的表格。 我们将可选字符放在方括号中,以表明你可以省略它们。

注意:我们尚未模拟 Vim 命令行的所有功能。 特别是,命令目前不支持参数。 请在 GitHub 上提交 issue,因为你会发现命令面板中缺少的内容。

文件和窗口管理

此表显示了用于管理窗口、标签页和窗格的命令。 由于命令目前不支持参数,因此你在保存或创建新文件时无法指定文件名。

命令描述
:w[rite][!]保存当前文件
:wq[!]保存文件并关闭缓冲区
:q[uit][!]关闭缓冲区
:wa[ll][!]保存所有打开的文件
:wqa[ll][!]保存所有打开的文件并关闭所有缓冲区
:qa[ll][!]关闭所有缓冲区
:[e]x[it][!]关闭缓冲区
:up[date]保存当前文件
:cq完全退出(关闭 Zed 的所有运行实例)
:vs[plit]垂直分割窗格
:sp[lit]水平分割窗格
:new在水平分割中创建新文件
:vne[w]在垂直分割中创建新文件
:tabedit在新标签页中创建新文件
:tabnew在新标签页中创建新文件
:tabn[ext]转到下一个标签页
:tabp[rev]转到上一个标签页
:tabc[lose]关闭当前标签页
:ls显示所有缓冲区

注意: ! 字符用于强制执行命令,而无需保存更改或在覆盖文件之前提示。

Ex 命令

这些 ex 命令打开 Zed 的各种面板和窗口。

命令默认快捷方式
打开项目面板:E[xplore]
打开协作面板:C[ollab]
打开聊天面板:Ch[at]
打开 AI 面板:A[I]
打开 git 面板:G[it]
打开通知面板:No[tif]
打开反馈窗口:fe[edback]
打开诊断窗口:cl[ist]
打开终端:te[rm]
打开扩展窗口:Ext[ensions]

这些命令导航诊断。

命令描述
:cn[ext]:ln[ext]转到下一个诊断
:cp[rev]:lp[rev]转到上一个诊断
:cc:ll打开错误页面

Git

这些命令与版本控制系统 git 交互。

命令描述
:dif[fupdate]查看光标下的差异(普通模式下为 d o
:rev[ert]还原光标下的差异(普通模式下为 d p

跳转

这些命令跳转到文件中的特定位置。

命令描述
:跳转到行号
:$跳转到文件末尾
:/foo:?foo跳转到下一个/上一个匹配 foo 的行

替换

此命令替换文本。 它模拟 vim 中的 substitute 命令。 substitute 命令使用正则表达式,Zed 使用的语法与 vim 略有不同。 你可以在下面正则表达式差异部分了解有关 Zed 语法的更多信息。 Zed 将仅替换当前行中搜索模式的第一个匹配项。 要替换所有匹配项,请附加 g 标志。

命令描述
:[range]s/foo/bar/[g]将 foo 的实例替换为 bar

编辑

这些命令可帮助你编辑文本。

命令描述
:j[oin]连接当前行
:d[elete][l][p]删除当前行
:s[ort] [i]对当前选择进行排序(使用 i,不区分大小写)
:y[ank]Yank(复制)当前选择或行

设置

这些命令在本地为当前缓冲区修改编辑器选项。

命令描述
:se[t] [no]wrap长于窗口宽度的行将换行,并在下一行继续显示
:se[t] [no]nu[mber]在每行前面打印行号
:se[t] [no]r[elative]nu[mber]将显示的数字更改为相对于光标

命令助记符

由于任何 Zed 命令都可用,因此你可能会发现记住运行正确命令的助记符很有帮助。 例如

  • :diffs 代表“切换所有 hunk 差异”
  • :cpp 代表“复制文件路径”
  • :crp 代表“复制相对路径”
  • :reveal 代表“在 Finder 中显示”
  • :zlog 代表“打开 Zed 日志”
  • :clank 代表“取消语言服务器工作”

自定义键盘映射

在本节中,我们将学习如何自定义 Zed 的 vim 模式的键盘映射。 你将学习

  • 如何为你的新键盘映射选择正确的上下文。
  • 用于 vim 模式键盘映射的有用上下文。
  • 要自定义的常用键盘映射以提高工作效率。

选择正确的上下文

仅当 "context" 属性与你在编辑器中的位置匹配时,才会评估 Zed 的键盘映射。 例如,如果你将键盘映射添加到 "Editor" 上下文,则它们仅在你编辑文件时有效。 如果你将键盘映射添加到 "Workspace" 上下文,则它们在 Zed 中的任何地方都有效。 这是一个在你编辑文件时保存的键盘映射示例

{
  "context": "Editor",
  "bindings": {
    "ctrl-s": "file::Save"
  }
}

上下文是嵌套的,因此当你编辑文件时,上下文是 "Editor" 上下文,它位于 "Pane" 上下文内,后者位于 "Workspace" 上下文内。 这就是为什么你添加到 "Workspace" 上下文的任何键盘映射在你编辑文件时都有效。 这是一个例子

// This key binding will work when you're editing a file. It comes built into Zed by default as the workspace: save command.
{
  "context": "Workspace",
  "bindings": {
    "ctrl-s": "file::Save"
  }
}

上下文是表达式。 它们支持布尔运算符,例如 &&(和)和 ||(或)。 例如,你可以使用上下文 "Editor && vim_mode == normal" 来创建仅在你编辑文件并且你处于 vim 的普通模式时才有效的键盘映射。

Vim 模式向 "Editor" 上下文添加了几个上下文

操作符 (Operator)描述
VimControl指示 Vim 键绑定应生效。目前是 vim_mode == normal || vim_mode == visual || vim_mode == operator 的别名,但定义可能会随时间而改变
vim_mode == normal普通模式 (Normal mode)
vim_mode == visual可视模式 (Visual mode)
vim_mode == insert插入模式 (Insert mode)
vim_mode == replace替换模式 (Replace mode)
vim_mode == waiting等待任意键(例如,在输入 ft 之后)
vim_mode == operator等待另一个绑定触发(例如,在输入 cd 之后)
vim_operator除非 vim_mode == operator,否则设置为 none,在这种情况下,它设置为当前操作符的默认键绑定(例如,在输入 d 之后,vim_operator == d

注意:上下文一次只匹配一个级别。所以可以使用表达式 "Editor && vim_mode == normal",但 "Workspace && vim_mode == normal" 永远不会匹配,因为我们在 "Editor" 级别设置了 vim 上下文。

Vim 模式键盘绑定有用的上下文

这是一个带有有用 Vim 模式上下文的模板,可帮助你自定义 Vim 模式键盘绑定。你可以复制它并将其集成到你的用户键盘映射中。

[
  {
    "context": "VimControl && !menu",
    "bindings": {
      // Put key bindings here if you want them to work in normal & visual mode.
    }
  },
  {
    "context": "vim_mode == normal && !menu",
    "bindings": {
      // "shift-y": ["workspace::SendKeystrokes", "y $"] // Use neovim's yank behavior: yank to end of line.
    }
  },
  {
    "context": "vim_mode == insert",
    "bindings": {
      // "j k": "vim::NormalBefore" // In insert mode, make jk escape to normal mode.
    }
  },
  {
    "context": "EmptyPane || SharedScreen",
    "bindings": {
      // Put key bindings here (in addition to the context above) if you want them to
      // work when no editor exists.
      // "space f": "file_finder::Toggle"
    }
  }
]

注意:如果你想模拟 Vim 的 map 命令(nmap 等),你可以在正确的上下文中使用动作 workspace::SendKeystrokes

可选的键盘绑定

默认情况下,你可以使用 ctrl+w 快捷键,后跟 hjkl 中的一个,分别向左、下、上或右移动,在编辑器中打开的不同文件之间导航。

但是你不能使用相同的快捷方式在所有编辑器停靠栏(终端、项目面板、助手面板等)之间移动。如果你想使用相同的快捷方式导航到停靠栏,你可以将以下键盘绑定添加到你的用户键盘映射。

{
  "context": "Dock",
  "bindings": {
    "ctrl-w h": "workspace::ActivatePaneLeft",
    "ctrl-w l": "workspace::ActivatePaneRight",
    "ctrl-w k": "workspace::ActivatePaneUp",
    "ctrl-w j": "workspace::ActivatePaneDown"
    // ... or other keybindings
  }
}

子字移动允许你在 camelCase 或 snake_case 中导航和选择单个单词,默认情况下未启用。要启用它,请将这些绑定添加到你的键盘映射。

{
  "context": "VimControl && !menu && vim_mode != operator",
  "bindings": {
    "w": "vim::NextSubwordStart",
    "b": "vim::PreviousSubwordStart",
    "e": "vim::NextSubwordEnd",
    "g e": "vim::PreviousSubwordEnd"
  }
}

Vim 模式带有在普通模式下环绕选择的快捷方式 (ys),但它没有在可视模式下添加环绕的快捷方式。默认情况下,shift-s 会替换选择(删除文本并进入插入模式)。要使用 shift-s 在可视模式下添加环绕,你可以将以下对象添加到你的键盘映射。

{
  "context": "vim_mode == visual",
  "bindings": {
    "shift-s": ["vim::PushAddSurrounds", {}]
  }
}

在非模态文本编辑器中,当移动超过行尾时,光标导航通常会换行。然而,默认情况下,Zed 处理此行为的方式与 Vim 完全相同:光标停在行边界处。如果你希望光标在行之间换行,请覆盖这些键盘绑定

// In VimScript, this would look like this:
// set whichwrap+=<,>,[,],h,l
{
  "context": "VimControl && !menu",
  "bindings": {
    "left": "vim::WrappingLeft",
    "right": "vim::WrappingRight",
    "h": "vim::WrappingLeft",
    "l": "vim::WrappingRight"
  }
}

Sneak motion 功能允许快速导航到文本中的任何两个字符序列。你可以通过将以下键盘绑定添加到你的键盘映射来启用它。默认情况下,s 键映射到 vim::Substitute。添加这些绑定将覆盖该行为,因此请确保此更改与你的工作流程偏好保持一致。

{
  "context": "vim_mode == normal || vim_mode == visual",
  "bindings": {
    "s": "vim::PushSneak",
    "shift-s": "vim::PushSneakBackward"
  }
}

vim-exchange 功能在可视模式下没有默认绑定,因为 shift-x 绑定与可视模式的默认 shift-x 绑定 (vim::VisualDeleteLine) 冲突。要分配默认的 vim-exchange 绑定,请将以下键盘绑定添加到你的键盘映射

{
  "context": "vim_mode == visual",
  "bindings": {
    "shift-x": "vim::Exchange"
  }
}

恢复常见的文本编辑键盘绑定

如果你在 Linux 或 Windows 上使用 Vim 模式,你可能会发现它覆盖了你不能没有的键盘绑定:ctrl+v 用于粘贴,ctrl+f 用于搜索等。你可以通过将此数据复制到你的键盘映射中来恢复它们

{
  "context": "Editor && !menu",
  "bindings": {
    "ctrl-c": "editor::Copy",          // vim default: return to normal mode
    "ctrl-x": "editor::Cut",           // vim default: decrement
    "ctrl-v": "editor::Paste",         // vim default: visual block mode
    "ctrl-y": "editor::Undo",          // vim default: line up
    "ctrl-f": "buffer_search::Deploy", // vim default: page down
    "ctrl-o": "workspace::Open",       // vim default: go back
    "ctrl-a": "editor::SelectAll",     // vim default: increment
  }
},

更改 Vim 模式设置

你可以更改以下设置来修改 Vim 模式的行为

属性 (Property)描述默认值 (Default Value)
default_mode启动时的默认模式。可以是 "normal"、"insert"、"replace"、"visual"、"visual_line"、"visual_block"、"helix_normal" 之一。"normal"
use_system_clipboard确定如何使用系统剪贴板
  • "always": 用于所有操作
  • "never": 仅在显式指定时使用
  • "on_yank": 用于 yank 操作
"always"
use_multiline_find如果为 true,则 ft 移动会跨越多行。false
use_smartcase_find如果为 true,则当目标字母为小写时,ft 移动不区分大小写。false
toggle_relative_line_numbers如果为 true,则行号在普通模式下是相对的,在插入模式下是绝对的,为你提供两种选择的最佳体验。false
custom_digraphs一个允许你添加自定义双图的对象。 请阅读以下示例。{}
highlight_on_yank_duration突出显示动画的持续时间(以毫秒为单位)。设置为 0 以禁用200

这是一个添加僵尸表情符号的双图的示例。这允许你输入 ctrl-k f z 来插入一个僵尸表情符号。你可以根据需要添加任意数量的双图。

{
  "vim": {
    "custom_digraphs": {
      "fz": "🧟‍♀️"
    }
  }
}

这是一个修改这些设置的示例

{
  "vim": {
    "default_mode": "insert",
    "use_system_clipboard": "never",
    "use_multiline_find": true,
    "use_smartcase_find": true,
    "toggle_relative_line_numbers": true,
    "highlight_on_yank_duration": 50,
    "custom_digraphs": {
      "fz": "🧟‍♀️"
    }
  }
}

Vim 模式有用的核心 Zed 设置

以下是一些可以帮助你微调 Vim 体验的常规 Zed 设置

属性 (Property)描述默认值 (Default Value)
cursor_blink如果为 true,则光标闪烁。true
relative_line_numbers如果为 true,则左侧装订线中的行号相对于光标。false
scrollbar控制滚动条显示的对象。设置为 { "show": "never" } 以隐藏滚动条。{ "show": "auto" }
scroll_beyond_last_line如果设置为 "one_page",允许向上滚动到超过最后一页一页。设置为 "off" 以防止此行为。"one_page"
vertical_scroll_margin滚动时保持在光标上方或下方的行数。设置为 0 以允许光标垂直方向到达屏幕边缘。3
gutter.line_numbers控制装订线中行号的显示。将 "line_numbers" 属性设置为 false 以隐藏行号。true
command_aliases定义命令面板中命令别名的对象。 你可以使用它为你经常使用的命令定义快捷名称。 请阅读以下示例。{}

这是一个修改这些设置的示例

{
  // Disable cursor blink
  "cursor_blink": false,
  // Use relative line numbers
  "relative_line_numbers": true,
  // Hide the scroll bar
  "scrollbar": { "show": "never" },
  // Prevent the buffer from scrolling beyond the last line
  "scroll_beyond_last_line": "off",
  // Allow the cursor to reach the edges of the screen
  "vertical_scroll_margin": 0,
  "gutter": {
    // Disable line numbers completely:
    "line_numbers": false
  },
  "command_aliases": {
    "W": "w",
    "Wq": "wq",
    "Q": "q"
  }
}

command_aliases 属性是一个将键或键序列映射到 Vim 模式命令的单个对象。 上面的示例定义了多个别名:W 代表 wWq 代表 wqQ 代表 q

正则表达式差异

Zed 使用与 Vim 不同的正则表达式引擎。这意味着你在某些情况下必须使用不同的语法。以下是最常见的差异

  • 捕获组: Vim 使用 \(\) 来表示捕获组,在 Zed 中,这些是 ()。另一方面,在 Vim 中,() 表示文字括号,但在 Zed 中,必须将它们转义为 \(\)
  • 匹配:替换时,Vim 使用反斜杠字符后跟一个数字来表示匹配的捕获组。 例如,\1。Zed 使用美元符号代替。因此,当在 Vim 中使用 \0 来表示整个匹配项时,在 Zed 中,语法改为 $0。对于编号的捕获组也是如此:Vim 中的 \1 在 Zed 中是 $1
  • 全局选项:默认情况下,在 Vim 中,正则表达式搜索仅匹配行中的第一个匹配项,并且你在查询末尾附加 /g 以查找所有匹配项。 在 Zed 中,默认情况下正则表达式搜索是全局的。
  • 区分大小写:Vim 使用 /i 来指示不区分大小写的搜索。 在 Zed 中,你可以在模式的开头编写 (?i) 或使用快捷键 alt-cmd-c|alt-c 切换区分大小写。

注意:为了帮助过渡,当你编写 Vim 风格的替换命令 :%s// 时,命令面板将为你修复括号并替换组。 因此,Zed 会将 %s:/\(a\)(b)/\1/ 转换为搜索 "(a)(b)" 并替换为 "$1"。

有关 Zed 的正则表达式引擎支持的完整语法,请参阅 regex crate 文档