Zed 开发:术语表
以下是在 zed 代码库中频繁使用的一些术语和结构。
本列表力求全面,但仍处于不断完善中。
命名规范
以下规范适用于整个代码库。注意此处的“名称”可以是任意内容,例如AnyElement和LspStore。
AnyName:对应名称的类型擦除版本。类似于Box<dyn NameTrait>的概念。NameStore:一种包装类型,可抽象化本地与远程操作的区别。
GPUI
状态管理
App:一个单例,持有完整的应用程序状态,包括所有实体。关键点在于:App不是Send,这意味着App仅存在于创建它的线程(通常是主线程/UI线程)上。因此,如果你看到&mut App,说明你当前处于UI线程。Context:一个包装了App结构体的封装器,针对特定Entity具有专门行为。可以将其视为(&mut App, Entity<V>)。这些专门行为体现在Context的API接口中。例如,App::spawn接受AsyncFnOnce(AsyncApp) -> Ret,而Context::spawn接受AsyncFnOnce(WeakEntity<V>, AsyncApp) -> Ret。AsyncApp:App的持有版本,用于异步上下文。此类型仍不是Send(因此AsyncApp表示你处于主线程),且其任何使用都可能失败(考虑到App可能在此闭包运行时已被终止)。AsyncApp的便利之处在于,你通常通过&mut App与App交互,这在异步闭包中使用会不方便;而AsyncApp是持有的,因此你可以轻松在异步闭包中使用它。AppContext:一个抽象了App、AsyncApp和Context及其测试版本的特性。Task:一个在后台或前台执行器中运行或计划运行的未来任务。与常规Future不同,任务不需要.await即可开始运行。但你需要等待它们以获取任务结果。Executor:用于生成在前台或后台线程上运行的任务。尽量在后台线程上运行任务。BackgroundExecutor:运行Task的线程池。ForegroundExecutor:运行Task的主线程。
Entity:一个强类型的、由gpui管理的结构体引用。本质上是指向App::EntityMap的指针/映射键。WeakEntity:对可能已不存在的Entity的运行时检查引用。类似于std::rc::Weak。Global:一个单例类型,仅有一个值,存储在App中。Event:一种可由Entity发送给订阅者的数据类型。Action:表示用户键盘输入的事件,可由监听器处理。 例如:file finder: toggleObserving:响应状态变化的实体通知机制。Subscription:用于响应应用程序状态变化的事件处理器。- 处理已发出的事件
- 观察实体的
{new,release,on notify}
用户界面
- [[代码块1]]:一个[[代码块2]],通过实现[[代码块4]]可以生成[[代码块3]]。
- [[代码块5]]:一种可以布局并绘制到屏幕上的类型。
- [[代码块6]]:构建元素树的表达式,例如:
[[代码块0]]
- [[代码块7]]:一个可以渲染成[[代码块8]]的构建器。
- [[代码块9]]:待办事项
- [[代码块10]]:首先处理键盘输入的地方
- [[代码块11]]:从当前焦点位置到用户界面根节点的路径。示例[[HTML标签12]] 待办事项
Zed 用户界面
-
[[代码块0]]:表示桌面环境中Zed窗口的结构体(见下图)。当开启多个Zed实例时可能存在多个此类窗口,主要用于渲染传递。
-
[[代码块1]]:悬浮于其他UI元素之上的浮动UI组件
-
[[代码块2]]:表示悬浮UI列表的结构体(模态框)。用户可选择项目并确认,选择或确认后的行为由选择器的委托对象决定(下图中“模型”即为选择器)。
-
[[代码块3]]:用于定义[[代码块4]]特定行为的特质。[[代码块5]]通过delegate字段存储[[代码块6]]。
-
[[代码块7]]:Zed窗口的中央区域,该区域被划分为多个[[代码块8]]。在代码库中作为[[代码块9]]结构体的字段存在(见下图)。
-
[[代码块10]]:[[代码块11]]中的可放置区域,可容纳编辑器、多缓冲区或终端等组件(见下图)。
-
[[代码块12]]:实现[[代码块14]]特质的[[代码块13]]实例。这些组件可放置在[[代码块15]]中。下图可见:左侧停靠区的[[代码块16]],底部停靠区的[[代码块17]],以及右侧停靠区的[[代码块18]]。注意[[代码块19]]未实现[[代码块20]]特质,因此不属于[[代码块21]]。
-
[[代码块22]]:类似[[代码块23]]的可展开/隐藏UI元素。最多可同时开启左、右、下三个停靠区。停靠区包含一个或多个[[代码块24]](非[[代码块25]]),具体见图示。
-
缓冲区:一个或多个编辑器
-
路径:代表本地或远程文件
-
多缓冲区:编辑器列表,多缓冲区允许同时编辑多个文件。当 Zed 中的操作返回多个位置时,会打开多缓冲区,例如:搜索或转到定义。见下图中的项目搜索。
编辑器
- [[代码块0]]:文本编辑器,Zed中几乎所有元素都是[[代码块1]],甚至单行输入框也不例外。上图每个窗格内包含一个或多个[[代码块2]]实例。
- [[代码块3]]:窗口的根容器
- [[代码块4]]:文件、目录、待加载目录或未加载目录
- [[代码块5]]:文件在内存中的呈现形式,包含语法树、Git状态和诊断信息等相关数据
- [[代码块6]]:鼠标按下并拖动但尚未释放的状态
协作功能
- [[代码块7]]:多位用户在共享的[[代码块8]]中协同工作
- [[代码块9]]:已共享工作区的Zed客户端
- [[代码块10]]:加入共享工作区的Zed客户端
调试器
DapStore:负责管理调试器会话的实体debugger::Session:负责管理调试会话生命周期以及与DAPS通信的实体BreakpointStore:负责管理Zed本地及远程实例中断点状态的实体DebugSession:管理调试会话的用户界面及运行状态RunningState:直接管理调试会话的所有视图VariableList:调试会话的变量与监视列表视图Console:待补充Terminal:待补充BreakpointList:待补充