Zed 开发:词汇表
以下是 Zed 代码库中常用的一些术语和结构。
这是一个尽力而为的列表,仍在不断完善中。
命名约定
这些通常适用于整个代码库。请注意,Name 在这里可以是任何东西。例如 AnyElement 和 LspStore。
AnyName:_name_ 的类型擦除版本。可以认为是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及其测试版本的 trait。Task:一个正在运行或计划在后台或前台执行器上运行的 future。与常规 Futures 不同,Tasks 不需要.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}
UI
View:一个Entity,可以通过其Render实现生成Element。Element:一种可以在屏幕上布局和绘制的类型。element expression:一个构建元素树的表达式,例如
#![allow(unused)] fn main() { h_flex() .id(text[i]) .relative() .when(selected, |this| { this.child( div() .h_4() .absolute() etc etc }
Component:一个可以渲染并转换为Element的构建器。Dispatch tree:待办Focus:按键首先处理的地方Focus tree:从当前焦点位置到 UI 根的路径。示例待办
Zed UI
Window:Zed 中的一个结构体,表示桌面环境中的 Zed 窗口(见下图)。如果打开了多个 Zed 实例,则可以有多个。主要用于渲染。Modal:一个浮动在 UI 其余部分之上的 UI 元素Picker:一个结构体,表示浮动在 UI 之上的项目列表(模态框)。你可以选择一个项目并确认。选择或确认后发生的情况由选择器的委托决定。(下图中的“Model”是一个选择器。)PickerDelegate:一个用于专门化Picker行为的 trait。Picker将PickerDelegate存储在 delegate 字段中。Center:Zed 窗口的中心,中心被分成多个Pane。在代码库中,这是Workspace结构体的一个字段。(见下图)。Pane:Center中的一个区域,我们可以在其中放置项目,例如编辑器、多缓冲区或终端(见下图)。Panel:一个实现Paneltrait 的Entity。这些可以放置在Dock中。在下图中,我们看到:左侧停靠栏中的ProjectPanel,底部停靠栏中的DebugPanel,以及右侧停靠栏中的AgentPanel。注意Editor不实现Panel,因此不是Panel。Dock:一个类似于Pane的 UI 元素,可以打开和隐藏。最多可以同时打开 3 个停靠栏,位于中心的左侧、右侧和下方。一个停靠栏包含一个或多个Panel,而不是Pane。(见图)。
Project:一个或多个WorktreeWorktree:表示本地或远程文件。
- 多缓冲区:一个编辑器列表,多缓冲区允许同时编辑多个文件。当 Zed 中的操作返回多个位置时,会打开多缓冲区,例如:搜索或转到定义。见下图中的项目搜索。
编辑器
Editor:_文本_编辑器,Zed 中的几乎所有内容都是Editor,甚至是单行输入。上图中的每个窗格都包含一个或多个Editor实例。Workspace:窗口的根Entry:文件、目录、待处理目录或未加载目录。Buffer:文件的内存表示,以及相关数据,如语法树、git 状态和诊断信息。pending selection:你按住鼠标并拖动,但尚未释放。
协作
Collab session:多个用户在一个共享的Project中工作Upstream client:共享其工作区的 Zed 客户端Downstream client:加入共享工作区的 Zed 客户端
调试器
DapStore:是一个管理调试器会话的实体debugger::Session:是一个管理调试会话生命周期和与 DAPS 通信的实体BreakpointStore:是一个管理 Zed 本地和远程实例中断点状态的实体DebugSession:管理调试会话的 UI 和运行状态RunningState:直接管理调试会话的所有视图VariableList:调试会话的变量和监视列表视图Console:待办Terminal:待办BreakpointList:待办