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 的核心功能,从而导致一些行为差异
- 动作:vim 模式使用 Zed 的语义分析来调整每种语言的动作行为。例如,在 Rust 中,使用
%
跳转到匹配的括号适用于管道字符|
。在 JavaScript 中,w
认为$
是一个单词字符。 - 可视块选择:vim 模式使用 Zed 的多个光标来模拟可视块选择,使块选择更加灵活。例如,在块选择后插入的任何内容都会实时更新每一行,并且您可以随时添加或删除光标。
- 宏:vim 模式使用 Zed 的记录系统来记录 vim 宏。因此,您可以捕获和重放更复杂的操作,例如自动完成。
- 搜索和替换: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 hunk | d 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 进行更具上下文感知能力的选择
- 搜索时优先考虑当前行
示例配置
要使用这些文本对象,你需要将绑定添加到你的键盘映射。 这是一个示例配置,使其在使用文本对象运算符(i
和 a
)或 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 | 等待任意键(例如,在输入 f 或 t 之后) |
vim_mode == operator | 等待另一个绑定触发(例如,在输入 c 或 d 之后) |
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" |
use_multiline_find | 如果为 true ,则 f 和 t 移动会跨越多行。 | false |
use_smartcase_find | 如果为 true ,则当目标字母为小写时,f 和 t 移动不区分大小写。 | 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
代表 w
,Wq
代表 wq
,Q
代表 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 文档。