Zed 开发:词汇表

以下是 Zed 代码库中常用的一些术语和结构。

这是一个尽力而为的列表,仍在不断完善中。

命名约定

这些通常适用于整个代码库。请注意,Name 在这里可以是任何东西。例如 AnyElementLspStore

  • 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
  • AsyncAppApp 的拥有版本,用于异步上下文。此类型_仍然_不是 Send(因此 AsyncApp = 你在主线程上),并且任何使用它都可能失败(以应对此闭包运行时尚 App 可能已终止的情况)。AsyncApp 的便利之处在于,你通常通过 &mut AppApp 交互,这在使用异步闭包时会很不方便;AsyncApp 是拥有类型,因此你可以轻松地在异步闭包中使用它。
  • AppContext:一个抽象 AppAsyncAppContext 及其测试版本的 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: toggle
  • Observing:做出反应的实体通知它们已更改
  • Subscription:一个事件处理程序,用于响应应用程序中的状态更改。
    1. 发出事件处理
    2. 观察实体的 {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。PickerPickerDelegate 存储在 delegate 字段中。
  • Center:Zed 窗口的中心,中心被分成多个 Pane。在代码库中,这是 Workspace 结构体的一个字段。(见下图)。
  • PaneCenter 中的一个区域,我们可以在其中放置项目,例如编辑器、多缓冲区或终端(见下图)。
  • Panel:一个实现 Panel trait 的 Entity。这些可以放置在 Dock 中。在下图中,我们看到:左侧停靠栏中的 ProjectPanel,底部停靠栏中的 DebugPanel,以及右侧停靠栏中的 AgentPanel。注意 Editor 不实现 Panel,因此不是 Panel
  • Dock:一个类似于 Pane 的 UI 元素,可以打开和隐藏。最多可以同时打开 3 个停靠栏,位于中心的左侧、右侧和下方。一个停靠栏包含一个或多个 Panel,而不是 Pane。(见图)。
Screenshot for the Pane and Dock features
  • Project:一个或多个 Worktree
  • Worktree:表示本地或远程文件。
Screenshot for the Worktree feature
  • 多缓冲区:一个编辑器列表,多缓冲区允许同时编辑多个文件。当 Zed 中的操作返回多个位置时,会打开多缓冲区,例如:搜索转到定义。见下图中的项目搜索。
Screenshot for the MultiBuffer feature

编辑器

  • 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:待办