ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Warp 代码评审并排 Diff 布局实现解析:DiffLayout 枚举、双编辑器桥接架构与特性开关设计

Warp 代码评审并排 Diff 布局实现解析:DiffLayout 枚举、双编辑器桥接架构与特性开关设计 桌面应用开发者工具人工智能AI 应用AI Agent代码智能体【免费下载链接】warpWarp is an agentic development environment, born out of the terminal.项目地址https://gitcode.com/GitHub_Trending/wa/warp点击查看免费下载本篇技术指南基于 Warp 开源仓库中的 side-by-side 技术规格配套产品规格见 product.md系统讲解在 Code Review 面板中引入SideBySide左右并排Diff 布局的完整实现方案从DiffLayout枚举与code.editor.diff_layout设置项的定义到基线 修改双CodeEditorView实例经桥接包装器协同渲染的架构再到行对齐hunk alignment、滚动同步、评论线程、遥测与无障碍设计。读完本文你将掌握 Warp 如何在保持内联 Diff 零回归的前提下用特性开关分阶段推出并排视图以及其与DiffMode、DisplayMode两个既有概念的正交关系。一、背景为什么需要并排 DiffWarp 当前把 Code Review 文件差异渲染为单列内联视图删除行以-前缀、新增行以前缀交错排布。内联视图本身没问题但面对 AI 生成的大规模改动时存在两个现实痛点阅读负担当一段 30 行的修改包含代码重排时同一逻辑块在内联视图里被拆成两处——一处全是-行、另一处全是行评审者需要在大脑中把两段重新拼合才能理解改了什么。行业惯例GitHub、GitLab、Phabricator、JetBrains IDE、VS Code 等主流工具均以并排视图作为 Diff 评审的事实标准宽屏用户对此有明确预期。因此 v1 的目标是在Code Review 面板内提供可切换的Inline/SideBySide两种布局并排视图左侧为基线内容删除可见、右侧为修改后文件新增可见通过 hunk 对齐让对应行保持在同一垂直位置。默认仍为Inline存量用户零感知、按需开启。二、核心抽象DiffLayout与两个既有概念的边界规格明确提出新增DiffLayout枚举定义于app/src/code/diff_layout.rs从 code/mod.rs 再导出use serde::{Deserialize, Serialize}; #[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] #[serde(rename_all snake_case)] pub enum DiffLayout { #[default] Inline, SideBySide, } impl DiffLayout { pub fn is_side_by_side(self) - bool { matches!(self, DiffLayout::SideBySide) } }serde的snake_case表示inline/side_by_side与设置存储值一一对应Copy派生使它可以无生命周期负担地在视图上下文中传递。规格特别强调DiffLayout与两个既有概念严格正交DisplayMode回答这个 Diff 渲染在屏幕的哪里——独立面板、嵌入视图还是内联横幅DiffMode回答拿什么和什么比——对比基是Head/MainBranch/OtherBranch(String)。这一枚举真实存在于仓库 diff_state/mod.rs 中并带有from_branch构造方法DiffLayout回答Diff 内容怎么排版——单列还是双列。三者互不干扰改变布局不改变对比基DiffMode选择器Head / Main Branch / Other Branch在并排模式下原样保留。v1 只在 Code Review 面板读取DiffLayout即使存储值为side_by_sideAI block-list 与内联横幅两种宿主仍保持现有内联行为。三、设置项code.editor.diff_layout布局偏好通过 settings/code.rs 中的define_settings_group!宏声明为CodeSettings的成员。仓库现有设置项如format_on_save、auto_save展示了该宏的字段结构type、default、supported_platforms、sync_to_cloud、toml_path、description等。新设置项定义如下diff_layout: DiffLayoutSetting { type: crate::code::diff_layout::DiffLayout, default: crate::code::diff_layout::DiffLayout::Inline, supported_platforms: SupportedPlatforms::DESKTOP, sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), private: false, toml_path: code.editor.diff_layout, description: Layout for Code Review diff views: inline or side_by_side., },设计要点默认Inline存量用户不受影响除非主动切换SyncToCloud::Globally虽 v1 只有一个参与表面但设置是全局存储为 v2 扩展到其他表面预留空间避免日后增加第二个设置名类型系统天然支持枚举设置组通过serde承载强类型值与仓库其他设置组的做法一致声明不等于渲染规格明确强调仅声明设置项不会自动出现在设置页必须在 UI 中显式注册控件。四、设置页集成与遥测归属code.editor.diff_layout的入口是Settings - Code下新增的 Diff layout 分区实现在 settings_view/code_page.rs新增DiffLayoutWidget行渲染一个双选项分段控件Inline 与 Side by side选中段读取自CodeSettings::DiffLayout段切换时通过设置存储写入code.editor.diff_layout并发出布局变更遥测事件控件显式注册在 Code 设置组中、紧邻既有 Code Review 设置控件控件注册以FeatureFlag::SideBySideDiffLayout.is_enabled()为门控运行时开关关闭时整个控件隐藏。同时明确职责边界Diff 工具栏只保留视图级的临时控件如空白符可见性不暴露code.editor.diff_layout——布局是面向用户的 Code Review 级偏好。遥测唯一归属规格要求新增CodeReviewTelemetryEvent::DiffLayoutChanged { from: DiffLayout, to: DiffLayout }变体登记于 telemetry_event.rs该文件已定义CodeReviewTelemetryEvent枚举并从CodeReviewTelemetryEventDiscriminants派生出name/description/enablement_state等元数据通过warp_core::register_telemetry_event!注册。事件只由 Settings - Code 页面发出Code Review 渲染层不得重复上报避免重复埋点。若产品需要按打开过的 Diff 统计采纳率可另发渲染完成事件但 v1 只保留一个设置变更事件拥有者。五、特性开关SideBySideDiffLayout的分阶段投递并排布局按 Warp 的标准特性开关流程落地仓库中的真实位置如下枚举变体在 crates/warp_features/src/lib.rs 的FeatureFlag枚举中新增SideBySideDiffLayout紧邻既有 Code Review 相关开关如CodeReviewFind位于该文件第 448 行。编译期注册在app/Cargo.toml的[features]中新增side_by_side_diff_layout []沿用code_review_find []的模式在 app/src/lib.rs 的编译内特性列表中增加 cfg 门控条目#[cfg(feature side_by_side_diff_layout)] FeatureFlag::SideBySideDiffLayout,运行时默认值先加入 crates/warp_features/src/lib.rs 的DOGFOOD_FLAGS仓库注释表明该列表是为开发团队启用的特性预期会逐步进入 PREVIEW_FLAGS 后再发布扩大范围时移入PREVIEW_FLAGS第 1078 行且预览开关自动包含于 dogfood 构建在分阶段完成前不得加入RELEASE_FLAGS。变更日志为description_for_changelog增加匹配臂参照既有CodeReviewFind Some(Enables the find bar in the code review pane.)第 1163 行的写法SideBySideDiffLayout Some(Enables a side-by-side diff layout in the code review pane.),投递语义分三层编译期门控side_by_side_diff_layoutCargo feature 决定二进制是否包含FeatureFlag::SideBySideDiffLayout运行时门控特性开关服务决定当前渠道/用户下is_enabled()的返回值分发桥Code Review 构造时先查运行时开关——关闭则无论存储值如何一律按DiffLayout::Inline处理开启则读取code.editor.diff_layout分发到内联编辑路径或并排桥包装器。默认排期shipping 构建关闭 - 5% dogfood - 25% dogfood - 100% dogfood - preview - release。开关隐藏时同时抑制设置控件与运行时布局路径。六、架构核心SideBySideDiffBridge双编辑器桥接并排布局的实现策略是两个CodeEditorView实例 一个父级桥接包装器而不是改造编辑器内部。规格给出的结构pub struct SideBySideDiffBridge { baseline_view: CodeEditorView, modified_view: CodeEditorView, shared_diff_state: HunkAlignment, hidden_lines: HiddenLineRanges, scroll_anchor: SideBySideScrollAnchor, find_state: CodeReviewFindState, } #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum Side { Baseline, Modified, }CodeEditorView真实存在于仓库 editor/view.rs持有CodeEditorModel、Searcher、Find、VimModel、评论位置等字段是渲染目标。v1 的两个实例分别是select-only 的基线视图与正常的修改视图由桥接器置于既有 Code Review 编辑器宿主内等宽渲染、中间一条 1px 分隔线。桥接器拥有的跨面板同步职责隐藏行区间折叠的未改动区域只表示一次同时应用到两个视图任一侧展开隐藏行都更新共享隐藏行状态并重配两视图保证高度对齐滚动位置任一侧滚动都会更新共享行锚点再驱动另一侧滚到对齐行。同步是行锚定而非像素锚定避免字体、换行或行高差异累积漂移查找状态一次 Code Review 查找会话横跨两个视图两侧缓冲区中的命中都被高亮Next / Prev 可跨面板遍历共享 Diff 状态两个视图读取同一份 diff 结果与HunkAlignment从而对哪些基线行是删除、哪些修改行是新增、视觉间隙该放哪里达成一致。注意共享的是 diff 状态不是共享缓冲区。两个缓冲区保持独立基线视图的数据源是改动前内容修改视图的数据源是工作文件的全局缓冲区条目。对修改缓冲区做编辑会重新触发 diff 计算刷新后的 diff 更新两视图的装饰配置新删除的基线行在基线视图中仍是普通可选中行而修改视图将对应基线独有行渲染为间隙新插入的修改行在修改视图中为普通行在基线视图中则为间隙。职责边界编辑器内部文本塑形、gutter、命中测试、选区、复制留在各自子视图中跨面板协调事件目标判定、只转发可编辑事件给修改视图全部收敛在桥接器中。七、调用路由与面板内交互状态调用者路由表调用者 / 行为面板感知路由光标聚焦、本地选区、从修改侧复制修改CodeEditorView从基线侧复制基线CodeEditorView仅选区聚焦changed_lines修改CodeEditorViewAccept diff、保存 diff、拒绝回修改缓冲区的操作修改CodeEditorViewHunk 导航桥接行对齐 修改侧聚焦滚动保持桥接滚动锚点评论渲染与 gutter 标记桥接HunkAlignment行映射 目标子视图基线面板恒为只读使用基于基线内容的 select-onlyCodeEditorView所有基线行包括被删除行区间因为这些行在基线缓冲区中是真实行都支持选择与复制不暴露插入光标、不消费键盘编辑事件、不参与文件落盘保存从桥接器接收删除装饰与隐藏行配置。修改面板使用基于工作文件全局缓冲区条目的正常CodeEditorView独占光标与全部可写交互遵循既有 Code Review 的 accept / reject / save / revert / hunk 导航规则是唯一向FileModel注册的一侧使用将基线独有行渲染为视觉间隙而非临时删除块的装饰配置。桥接器把 Code Review 交互状态应用于修改面板基线面板的交互状态硬编码为只读选择/复制。其他表面的FullPane行为不在 v1 范围内。面板内容构造管线并排复用既有 unified-diff 解析器但不复用内联的删除行渲染。管线如下用既有解析器把 unified diff 解析为DiffHunk[]解析器零改动基于基线内容、当前修改全局缓冲区内容与有序 hunk 行构建共享 diff 状态对有序 hunk 行执行 hunk 对齐每个AlignedRow映射到两个面板的行索引间隙行在两侧源文件中都不存在但桥接器把它们作为装饰元数据传给对应视图用基线缓冲区行、删除装饰、隐藏行与基线侧对齐元数据配置基线视图用全局缓冲区条目、新增装饰、隐藏行与基线独有行渲染为视觉间隙的装饰配置配置修改视图。apply_diffs_if_any保持为内联路径。并排激活时桥接器改走面板内容管线最终渲染语义为删除行在基线视图中是普通可选行、在修改视图中是间隙新增行在修改视图中是普通可编辑行、在基线视图中是间隙修改侧禁用内联临时删除块渲染以防删除出血accept / reject / save / changed-line 计算仍读取修改缓冲区与内联行为一致。八、RowIndex与 hunk 对齐算法规格在 app/src/code/hunk_alignment.rs 定义对齐数据模型核心是让行号不再是一个裸整数pub struct DiffHunk { pub header: UnifiedDiffHeader, pub lines: VecDiffLine, } pub enum DiffLine { Context(String), Add(String), Delete(String), } pub struct AlignedHunk { pub rows: VecAlignedRow, } pub struct AlignedRow { pub left: PaneLine, pub right: PaneLine, pub row_index: RowIndex, } pub enum PaneLine { Line { buffer_line: usize, text: String }, Gap, } #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum RowIndex { Baseline(usize), Modified(usize), Gap { after_row: usize }, } pub struct HunkAlignment { pub baseline_rows: VecRowIndex, pub modified_rows: VecRowIndex, pub row_map: Vec(OptionRowIndex, OptionRowIndex), } impl HunkAlignment { pub fn from_diff_hunks(hunks: [DiffHunk]) - Self; }RowIndex语义Baseline(n)对应基线缓冲区第 n 行Modified(n)对应修改缓冲区第 n 行Gap { after_row }是插入在对齐行after_row之后的纯渲染间隙不对应任何一侧的源行号。对齐生成器遍历 hunk 时按以下规则产出RowIndexContext 行左Baseline(b)、右Modified(m)成对的删除/新增修改行左Baseline(b)、右Modified(m)纯删除行左Baseline(b)、右Gap { after_row }纯新增行左Gap { after_row }、右Modified(m)。桥接器保存对齐结果只把各自一侧的行元数据传给对应编辑器视图Baseline(n)映射为基线视图真实文本行Modified(n)映射为修改视图真实文本行Gap { after_row }在对侧视图映射为带 gutter 与背景元数据的全高空白行。选区、复制、光标、保存与查找都忽略间隙行的源文本对间隙行做命中测试时解析到最近的有效行用于滚动锚定与评论定位。v1 单遍算法v1 是单遍算法先配对塌缩的删除/新增连段再发射间隙行for hunk in hunks: pending_deletes [] pending_adds [] for line in hunk.lines: if line is Context: flush_pending_pairs() emit row(left context, right context) if line is Delete: if pending_adds is not empty: flush_pending_pairs() pending_deletes.push(line) if line is Add: pending_adds.push(line) flush_pending_pairs() flush_pending_pairs(): pair_count min(pending_deletes.len, pending_adds.len) emit pair_count rows with left delete and right add emit remaining deletes with right Gap emit remaining adds with left Gap clear pending_deletes and pending_adds工作示例Input hunk lines: Context(fn old() {) Delete( a();) Delete( b();) Add( c();) Add( d();) Context(}) Aligned rows: 1. left Context(fn old() {) | right Context(fn old() {) 2. left Delete( a();) | right Add( c();) 3. left Delete( b();) | right Add( d();) 4. left Context(}) | right Context(})边界情况纯插入块行对为左Gap、右Add基线视图收到间隙装饰纯删除块行对为左Delete、右Gap修改视图收到间隙装饰Context 重置配对窗口修改段中间的 Context 先把之前的删除冲刷掉之后的新增另起配对按位置配对删除连段后跟内容不相关的新增连段仍按位置配对词级高亮超出 v1 范围v1 只保证行对齐。九、桥接滚动同步滚动同步由桥接器所有规格给出pub struct SideBySideScrollAnchor { focused_side: Side, anchor_row: RowIndex, anchor_side: Side, horizontal_scroll_by_side: BTreeMapSide, ScrollOffset, } impl SideBySideScrollAnchor { pub fn on_scroll_wheel(mut self, side: Side, anchor_row: RowIndex); pub fn corresponding_row( self, side: Side, row_index: RowIndex, alignment: HunkAlignment, ) - OptionRowIndex; }滚动同步是行锚定的任一视图的滚轮事件或 hunk 导航事件更新共享行锚点桥接器再请另一视图从HunkAlignment揭晓对应行。水平滚动保持每面板独立。光标移动属于修改侧当光标导航改变修改行时corresponding_row计算最近的基线行仅供可见性对齐不移动基线光标hunk 导航更新共享滚动锚点与修改侧光标。若实现需要给事件打源标签以避免递归更新该状态属于桥接器。规格同时提到可复用 scroll_preservation.rs 中现成的滚动保持工具。十、Code Review 面板集成要点并排路径走既有的 Code Review 编辑器宿主而不是每个文件的InlineDiffView实例并排编辑器状态表示为两个CodeReviewEditorState切片或一个含baseline_sub_state/modified_sub_state的切片两个子视图生命周期必须独立即使父 reducer 入口共享Code Review 编辑器构造时计算有效布局开关关闭用Inline开启则读code.editor.diff_layout内联模式保持既有单编辑器路径并排模式在渲染编辑器的既有容器若是LocalCodeEditorView则在该路径下以桥接器替换单个LocalCodeEditorView实例内渲染桥接器Code Review 宿主订阅设置更新code.editor.diff_layout变更时重建可见编辑器为目标布局并借助 scroll_preservation.rs 保持滚动位置find-in-diff 在并排激活时获得一个Side感知迭代器可遍历两个子编辑器视图内联只返回修改侧隐藏行展开更新桥接器共享的隐藏行与对齐状态再把相同塌缩区间应用到两个子视图。架构中不存在InlineDiffView迁移步骤。十一、v2 延后项与评论线程AI block-list 与内联横幅延后到 v2v1 明确排除两个表面ai/blocklist/inline_action/code_diff_view.rs 继续构造内联 diffInlineBanner继续走内联渲染路径设置页帮助文本只提 Code Review遥测不宣称这两个表面的采纳。v2 可在 Code Review 架构验证后复用同一个DiffLayout设置。评论线程code_review/comments/ 中的评论线程锚定在EditorLineLocation上评论仍附着于这些位置并渲染在被指向行下方。并排集成要点并排行渲染器检查每条评论的CommentSide取自既有评论元数据把线程渲染到匹配面板的行下对侧面板在同行 gutter 显示一个小标记字形提示另一侧有线程该标记在规格中不可交互横跨删除与新增区域的多行评论区间仍渲染在其最初撰写所针对的一侧。由于两侧面板都读取桥接器共享的HunkAlignment评论定位走共享行映射无需在无关的 diff 模型间做临时坐标转换。十二、无障碍设计并排布局带来以下无障碍要求VoiceOver桥接器暴露两个带可访问标签的逻辑区域——基线为 Original修改为 Modified编辑聚焦唯一性修改面板是唯一编辑聚焦区域、唯一拥有光标区域基线面板只在平台无障碍 API 允许不暴露编辑动作的前提下接收聚焦以支持选择/复制成对行朗读对齐行成对读出为 Original:text; Modified:text让非视障评审者也能同时听到两侧键盘导航Tab到达修改编辑区基线聚焦仅用于选择/复制若实现CmdOptionLeft/Right则循环切换逻辑面板焦点但不把编辑所有权移出修改侧颜色对比间隙行背景使用专用主题令牌diff.gap.background在明暗两种主题下相对编辑器背景满足 3:1 对比度开放风险若平台无障碍树无法以可接受的读屏行为表示这两个桥接编辑器视图在 side-by-side 发布到 dogfood 之外前必须升级处理。十三、测试计划单元测试app/src/code/hunk_alignment_tests.rs空 diff 时每个 Context 行 row_map 为匹配的Baseline(n)/Modified(n)且无间隙纯新增为(Gap { after_row }, Modified(m))纯删除为(Baseline(b), Gap { after_row })塌缩修改Context Delete Delete Add Add Context产出 4 行对齐1 上下文 2 配对 1 上下文删除/新增序列中间的 Context 重置配对窗口多 hunk 文件跨未改动 Context 正确组合5,000 行 / 200 hunk 的大 diff 在 50ms 内完成规格设定的验收预算app/src/code/editor/side_by_side_bridge_tests.rsDiffType::Update时基线视图持改动前内容带删除装饰、修改视图持改动后内容带新增装饰DiffType::Create时基线视图为空含间隙、修改视图持新文件内容DiffType::Delete反之并排激活时apply_diffs_if_any不被调用删除行在基线可选、在修改为间隙新增行在修改可编辑、在基线为间隙两侧间隙行渲染高度一致app/src/code/editor/side_by_side_interaction_tests.rs基线子视图只读且无编辑光标修改子视图是唯一注册FileModel的一侧基线选择可复制包括删除行区间光标移动只影响修改侧Inline与SideBySide互切后滚动位置误差在一行以内app/src/code/editor/side_by_side_scroll_tests.rs滚轮增量更新桥接滚动锚点并在两面板揭晓对应行修改侧光标移动把基线滚到对应行光标位于(Gap { after_row }, Modified(m))行时基线滚到最近的上下文行桥接器抑制递归滚动更新。集成测试app/src/settings_view/code_page_tests.rsSideBySideDiffLayout开启时 Code 页渲染DiffLayoutWidget运行时开关关闭时控件隐藏选择 Side by side 写入code.editor.diff_layout side_by_side帮助文本只提 Code Reviewapp/src/code_review/code_review_view_tests.rs单文件 diff 在并排模式渲染两个CodeEditorView子实例多文件 diff 每个文件遵守同一布局打开时翻转设置会重建每个可见编辑器并保持滚动find-in-diff 命中两个子编辑器视图hunk 导航f/F在两面板同步推进焦点 hunk 而光标留在修改侧基线行评论线程渲染在基线面板行下、修改面板显示 gutter 标记隐藏行展开从桥接共享对齐模型更新两个子视图。无障碍验证快照测试断言并排面板的可访问标签 Original / Modified键盘测试覆盖Tab与实现阶段选定的面板切换快捷键测试断言基线聚焦不暴露编辑动作或插入光标主题测试断言diff.gap.background在明暗主题下对编辑器背景满足 3:1 对比度macOS VoiceOver 人工冒烟测试成对修改行朗读为一个逻辑原/改行。手动冒烟测试摘自规格macOS M1 MacBook Air dogfood 构建SideBySideDiffLayout开启Settings - Code 切换 Diff layout 为 Side by side确认可见 Code Review diff 在 200ms 内刷新规格设定的验收预算打开 200 文件 diff 确认活动 diff 渲染为两个桥接编辑器视图滚轮滚动两面板无抖动同步基线面板拖选可复制含删除行区间修改面板选区不越界光标只出现在修改面板Cmd-A 只选中所在面板可选中内容窗口缩窄到并排局促时两面板水平滚动条独立、分隔线保持 50%AI block-list 嵌入 diff 与内联横幅 diff 在 v1 仍渲染为内联LinuxUbuntu 24.04与 Windows 11 各重复设置切换冒烟测试确认渲染与键绑定。编译并行检查清单所有在match中解构DisplayMode的位置必须在新改动后仍可编译规格列出的现有调用点包括 app/src/code/diff_viewer.rstrait 辅助因DiffLayout是新正交轴而不变、app/src/ai/blocklist/inline_action/code_diff_view.rsv1 不变、app/src/ai/blocklist/block/view_impl/output.rs匹配DisplayMode::FullPane不变。同时排查所有假定单个编辑器状态的 Code Review 站点写、保存、光标、accept/reject 路径继续指向修改视图渲染、评论、查找、选择与无障碍调用点在并排激活时经桥接器路由。十四、未决问题与修订说明规格留有 6 个未决问题供实现评审阶段确认状态管理形态CodeReviewEditorState保持单切片 baseline_sub_state/modified_sub_state还是拆成两个并行切片单切片保留既有 reducer 签名双切片则清晰隔离两个视图生命周期diff 结果所有权桥接器直接持有 diff 状态还是上提给父级 Code Review 容器前者封装性好后者可被其他 Code Review 消费者复用查找跨面板 UXNext match 跨面板时焦点是按匹配逐个跳转还是留在当前面板直到其匹配全部访问完需与产品确认是设计行为还是桥接内部细节对侧 gutter 评论标记规格中不可交互是否可点击是 Code Review SME 的 UX 决策可作后续跟进项分段控件原语DiffLayoutWidget引用的既有设置分段控件其实际原语名与导入路径需在实现评审中确认可调分隔条首次发布不包含产品 Non-goals是否后续重访取决于遥测与用户反馈。修订说明v4v1 范围收窄到仅 Code ReviewAI block-list 与内联横幅延后到 v2恢复两个CodeEditorView 桥接包装器架构明确右侧专属编辑与光标不变量用RowIndex取代含糊的line_index集成目标重定向到CodeReviewEditorState/LocalCodeEditorView按已确认的桥接方向更新未决问题。小结DiffLayout与并排桥接架构在 Warp 中的定位是不改编辑器内核、只在外部组合DiffLayout枚举回答排版方式、code.editor.diff_layout负责持久化、SideBySideDiffLayout特性开关掌控投递节奏而SideBySideDiffBridge用两个既有的CodeEditorView实例与行锚定同步把左基线、右修改拼装起来。这种设计让内联路径保持逐字节不变同时为 v2 向 AI block-list 与内联横幅扩展留好了同一个设置入口。相关完整规格与代码入口见 tech.md、product.md、diff_state/mod.rs、settings/code.rs 与 crates/warp_features/src/lib.rs。赞分享桌面应用开发者工具人工智能AI 应用AI Agent代码智能体【免费下载链接】warpWarp is an agentic development environment, born out of the terminal.项目地址https://gitcode.com/GitHub_Trending/wa/warp点击查看免费下载相关推荐Warp Code Review 头部 UI 重构基于 GitOperationsInCodeReview 特性开关的双层布局实现解析Warp Code Review 头部 UI 重构基于 GitOperationsInCodeReview 特性开关的双层布局实现解析 导读 本文以 Warp桌面应用开发者工具人工智能AI 应用AI Agent代码智能体Warp Notebook 编辑器 Mermaid 代码块 Raw/Rendered 切换开关技术设计与实现解析Warp Notebook 编辑器 Mermaid 代码块 Raw/Rendered 切换开关技术设计与实现解析 导读 Warp 的 Notebook 编辑器桌面应用开发者工具人工智能AI 应用AI Agent代码智能体Warp Notebook 编辑器 Mermaid 代码块 Raw/Rendered 双模式切换设计规范与源码实现解析Warp Notebook 编辑器 Mermaid 代码块 Raw/Rendered 双模式切换设计规范与源码实现解析 导读 本文以 Warp 仓库内产品规桌面应用开发者工具人工智能AI 应用AI Agent代码智能体上一篇Python样例使用指导下一篇JSON API Serializer迁移指南从2.0升级到3.0的完整步骤创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表