333 lines
16 KiB
Markdown
333 lines
16 KiB
Markdown
# tp.el 代码架构文档
|
||
|
||
本文档描述 tp.el 的函数调用层次结构,从底层基础功能到上层 API 的分层组织。
|
||
|
||
## 目录
|
||
|
||
- [架构概述](#架构概述)
|
||
- [分层结构](#分层结构)
|
||
- [第一层:基础工具函数](#第一层基础工具函数)
|
||
- [第二层:核心属性操作](#第二层核心属性操作)
|
||
- [第三层:属性层系统](#第三层属性层系统)
|
||
- [第四层:响应式系统](#第四层响应式系统)
|
||
- [第五层:高级 API](#第五层高级-api)
|
||
- [函数调用关系图](#函数调用关系图)
|
||
|
||
---
|
||
|
||
## 架构概述
|
||
|
||
tp.el 采用分层架构设计,每一层建立在下层功能之上:
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────┐
|
||
│ 第五层:高级 API │
|
||
│ tp-match-set, tp-regexp-set, tp-forward-do, tp-search-map │
|
||
└─────────────────────────────────────────────────────────────────┘
|
||
↓
|
||
┌─────────────────────────────────────────────────────────────────┐
|
||
│ 第四层:响应式系统 │
|
||
│ tp-define-layer, tp--reactive-variable-watcher, │
|
||
│ tp--update-layer-regions, tp--register-reactive-deps │
|
||
└─────────────────────────────────────────────────────────────────┘
|
||
↓
|
||
┌─────────────────────────────────────────────────────────────────┐
|
||
│ 第三层:属性层系统 │
|
||
│ tp-push-layer, tp-pop-layer, tp-rotate-layer, │
|
||
│ tp-layer-list, tp--build-layer-props │
|
||
└─────────────────────────────────────────────────────────────────┘
|
||
↓
|
||
┌─────────────────────────────────────────────────────────────────┐
|
||
│ 第二层:核心属性操作 │
|
||
│ tp-set, tp-reset, tp-add, tp-get, tp-at, tp-remove, tp-clear │
|
||
└─────────────────────────────────────────────────────────────────┘
|
||
↓
|
||
┌─────────────────────────────────────────────────────────────────┐
|
||
│ 第一层:基础工具函数 │
|
||
│ tp--parse-args, tp--deep-merge-plist, tp--get-nested, │
|
||
│ tp-intervals, tp-empty-p │
|
||
└─────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 分层结构
|
||
|
||
### 第一层:基础工具函数
|
||
|
||
这些是最底层的工具函数,不依赖于其他 tp.el 函数,主要提供参数解析、数据结构操作等基础能力。
|
||
|
||
#### 参数解析
|
||
| 函数 | 描述 | 调用者 |
|
||
|------|------|--------|
|
||
| `tp--parse-args` | 解析灵活的函数参数格式 | tp-set, tp-reset, tp-add |
|
||
| `tp--parse-layer-args` | 解析属性层操作的参数 | tp-put-layer 及其他层操作函数 |
|
||
| `tp--parse-define-layer-args` | 解析 tp-define-layer 的参数 | tp-define-layer |
|
||
|
||
#### 数据结构操作
|
||
| 函数 | 描述 | 调用者 |
|
||
|------|------|--------|
|
||
| `tp--deep-merge-plist` | 深度合并两个 plist | tp-add, tp--prepend-face |
|
||
| `tp--prepend-face` | 处理 face 属性的合并逻辑 | tp-add |
|
||
| `tp--get-nested` | 获取嵌套属性值 | tp-get, tp-at |
|
||
| `tp--remove-nested-keys` | 从 plist 中移除指定键 | tp--remove-property |
|
||
|
||
#### 区间操作
|
||
| 函数 | 描述 | 调用者 |
|
||
|------|------|--------|
|
||
| `tp-intervals` | 获取文本属性区间列表 | tp-intervals-map, tp-get |
|
||
| `tp-intervals-map` | 对区间应用函数 | 多个层操作函数 |
|
||
| `tp-empty-p` | 检查对象是否没有文本属性 | tp-put-layer |
|
||
|
||
---
|
||
|
||
### 第二层:核心属性操作
|
||
|
||
这些是核心的文本属性操作函数,直接调用 Emacs 原生的文本属性 API。
|
||
|
||
#### 设置属性
|
||
| 函数 | 描述 | 依赖 | 被依赖 |
|
||
|------|------|------|--------|
|
||
| `tp-set` | 设置文本属性(保留其他属性) | tp--parse-args, tp--handle-tp-text-property | tp-match-set, 层操作 |
|
||
| `tp-reset` | 完全替换所有文本属性 | tp--parse-args, tp--handle-tp-text-property | tp-match-reset |
|
||
| `tp-add` | 深度合并属性 | tp--parse-args, tp--deep-merge-plist, tp--prepend-face | tp-match-add, tp--update-layer-regions |
|
||
|
||
#### 获取属性
|
||
| 函数 | 描述 | 依赖 | 被依赖 |
|
||
|------|------|------|--------|
|
||
| `tp-get` | 获取范围内的属性值(返回区间列表) | tp--get-nested | 搜索函数 |
|
||
| `tp-at` | 获取单个位置的属性值 | tp--get-nested | 大多数高层函数 |
|
||
| `tp-plist` | 获取区域中的所有属性 | tp-intervals | 用户 API |
|
||
|
||
#### 删除属性
|
||
| 函数 | 描述 | 依赖 | 被依赖 |
|
||
|------|------|------|--------|
|
||
| `tp-remove` | 移除属性或子属性 | tp--remove-property, tp--remove-sub | 用户 API |
|
||
| `tp-clear` | 清除所有属性 | - | 用户 API |
|
||
|
||
---
|
||
|
||
### 第三层:属性层系统
|
||
|
||
属性层系统在核心属性操作之上,提供多层属性栈的管理能力。
|
||
|
||
#### 层栈操作(内部)
|
||
| 函数 | 描述 | 依赖 |
|
||
|------|------|------|
|
||
| `tp--get-layer-stack` | 获取位置的层栈 | - |
|
||
| `tp--build-layer-props` | 从层列表构建属性 | - |
|
||
| `tp--layer-stack-to-list` | 将层栈转换为列表 | - |
|
||
| `tp--get-layer-by-idx-or-name` | 通过索引或名称查找层 | - |
|
||
| `tp--move-layer-in-stack` | 在栈中移动层 | tp--get-layer-by-idx-or-name |
|
||
| `tp--raise-layer-in-stack` | 在栈中上下移动层 | tp--move-layer-in-stack |
|
||
| `tp--switch-layers-in-stack` | 交换两个层的位置 | tp--get-layer-by-idx-or-name |
|
||
| `tp--normalize-layer-spec` | 规范化层规格 | tp-layer-props |
|
||
|
||
#### 层操作(公开 API)
|
||
| 函数 | 描述 | 依赖 |
|
||
|------|------|------|
|
||
| `tp-put-layer` | 在指定索引放置层 | tp--normalize-layer-spec, tp--build-layer-props, tp-intervals-map |
|
||
| `tp-push-layer` | 将层推到顶部 | tp-put-layer |
|
||
| `tp-delete-layer` | 删除层 | tp--get-layer-by-idx-or-name, tp-intervals-map |
|
||
| `tp-pop-layer` | 弹出顶层 | tp-delete-layer |
|
||
| `tp-move-layer` | 移动层到指定位置 | tp--move-layer-in-stack, tp-intervals-map |
|
||
| `tp-raise-layer` | 上移/下移层 | tp--raise-layer-in-stack, tp-intervals-map |
|
||
| `tp-rotate-layer` | 轮换层 | tp-move-layer |
|
||
| `tp-pin-layer` | 将层置顶 | tp-move-layer |
|
||
| `tp-switch-layer` | 交换两个层 | tp--switch-layers-in-stack, tp-intervals-map |
|
||
| `tp-merge-layers` | 合并多个层 | tp--get-layer-by-idx-or-name, tp-intervals-map |
|
||
| `tp-flatten-layers` | 扁平化所有层 | tp-intervals-map |
|
||
|
||
#### 层查询
|
||
| 函数 | 描述 | 依赖 |
|
||
|------|------|------|
|
||
| `tp-layer-list` | 列出所有层名称 | tp-intervals-map |
|
||
| `tp-layer-count` | 计算层数量 | tp-intervals-map |
|
||
| `tp-layer-exists-p` | 检查层是否存在 | tp-region-layer-props |
|
||
| `tp-layer-top` | 获取顶层名称 | tp-intervals |
|
||
| `tp-region-layer-props` | 获取区域中特定层的属性 | tp-intervals-map |
|
||
|
||
#### 层属性操作
|
||
| 函数 | 描述 | 依赖 |
|
||
|------|------|------|
|
||
| `tp-add-to-layers` | 向特定层添加属性 | tp--deep-merge-plist, tp-intervals-map |
|
||
| `tp-add-to-all-layers` | 向所有层添加属性 | tp-add-to-layers, tp-layer-count |
|
||
|
||
---
|
||
|
||
### 第四层:响应式系统
|
||
|
||
响应式系统提供当变量值改变时自动更新文本属性的能力。
|
||
|
||
#### 响应式变量处理
|
||
| 函数 | 描述 | 依赖 |
|
||
|------|------|------|
|
||
| `tp--reactive-symbol-p` | 检查是否为响应式符号 | - |
|
||
| `tp--reactive-var-symbol` | 转换响应式符号为变量符号 | tp--reactive-symbol-p |
|
||
| `tp--collect-reactive-symbols` | 收集所有响应式符号 | tp--reactive-symbol-p |
|
||
| `tp--resolve-reactive-symbols` | 解析响应式符号为值 | tp--reactive-symbol-p, tp--reactive-var-symbol |
|
||
| `tp--extract-reactive-props` | 提取使用特定变量的属性 | tp--collect-reactive-symbols, tp--extract-reactive-value |
|
||
| `tp--ensure-reactive-variables` | 确保变量已定义 | tp--reactive-symbol-p, tp--reactive-var-symbol |
|
||
|
||
#### 依赖注册与管理
|
||
| 函数 | 描述 | 依赖 |
|
||
|------|------|------|
|
||
| `tp--register-reactive-deps` | 注册响应式依赖 | tp--reactive-var-symbol, tp--extract-reactive-props |
|
||
| `tp--unregister-reactive-deps` | 取消注册依赖 | tp--unregister-layer-watchers, tp--unregister-layer-computed, tp--unregister-layer-data |
|
||
| `tp--register-layer-watchers` | 注册层的监听器 | - |
|
||
| `tp--register-layer-computed` | 注册计算属性 | - |
|
||
| `tp--register-layer-data` | 注册数据变量 | tp--data-var-symbol |
|
||
| `tp--unregister-layer-watchers` | 取消注册监听器 | - |
|
||
| `tp--unregister-layer-computed` | 取消注册计算属性 | - |
|
||
| `tp--unregister-layer-data` | 取消注册数据变量 | - |
|
||
|
||
#### 响应式更新
|
||
| 函数 | 描述 | 依赖 |
|
||
|------|------|------|
|
||
| `tp--reactive-variable-watcher` | 变量监听器回调 | tp--invoke-layer-watchers, tp--update-layer-computed, tp--update-layer-regions, tp--update-reactive-text |
|
||
| `tp--invoke-layer-watchers` | 调用层的监听回调 | - |
|
||
| `tp--update-layer-computed` | 更新计算属性 | tp--resolve-reactive-symbols, tp--set-layer-props |
|
||
| `tp--update-layer-regions` | 更新使用层的文本区域 | tp-layer-props, tp-search-map, tp-add |
|
||
| `tp--update-reactive-text` | 更新响应式文本 | tp-layer-props, tp--replace-reactive-text-in-buffer |
|
||
| `tp--replace-reactive-text-in-buffer` | 在缓冲区中替换响应式文本 | - |
|
||
|
||
#### 层定义
|
||
| 函数 | 描述 | 依赖 |
|
||
|------|------|------|
|
||
| `tp-define-layer` | 定义单个属性层 | tp--parse-define-layer-args, tp--collect-reactive-symbols, tp--ensure-reactive-variables, tp--register-* |
|
||
| `tp-define-layer-group` | 定义属性层组 | tp--parse-layer-group-element, tp--define-layer-from-parsed |
|
||
| `tp--define-layer-from-parsed` | 从解析结果定义层 | (与 tp-define-layer 类似的依赖) |
|
||
| `tp--set-layer-props` | 设置层属性 | - |
|
||
| `tp--set-group-layers` | 设置组的层列表 | - |
|
||
| `tp-layer-props` | 获取层属性 | - |
|
||
| `tp-group-props` | 获取组中所有层的属性 | tp-layer-props |
|
||
| `tp--resolve-props` | 解析属性(支持层名称) | tp-layer-props, tp--collect-reactive-symbols, tp--resolve-reactive-symbols, tp--register-reactive-deps |
|
||
|
||
#### 响应式文本
|
||
| 函数 | 描述 | 依赖 |
|
||
|------|------|------|
|
||
| `tp--handle-tp-text-property` | 处理 tp-text 属性 | - |
|
||
|
||
---
|
||
|
||
### 第五层:高级 API
|
||
|
||
这些是面向用户的高级 API,构建在前四层之上。
|
||
|
||
#### 模式匹配
|
||
| 函数 | 描述 | 依赖 |
|
||
|------|------|------|
|
||
| `tp-match-set` | 在字符串匹配处设置属性 | tp--match-apply |
|
||
| `tp-match-reset` | 在匹配处重置所有属性 | tp--match-apply |
|
||
| `tp-match-add` | 在匹配处添加/合并属性 | tp--match-apply |
|
||
| `tp-regexp-set` | 在正则匹配处设置属性 | tp--regexp-apply |
|
||
| `tp-regexp-reset` | 在正则匹配处重置属性 | tp--regexp-apply |
|
||
| `tp-regexp-add` | 在正则匹配处添加属性 | tp--regexp-apply |
|
||
| `tp--match-apply` | 字符串匹配的内部实现 | tp-set/tp-reset/tp-add |
|
||
| `tp--regexp-apply` | 正则匹配的内部实现 | tp-set/tp-reset/tp-add |
|
||
|
||
#### 搜索和导航
|
||
| 函数 | 描述 | 依赖 |
|
||
|------|------|------|
|
||
| `tp-search-forward` | 向前搜索属性 | text-property-search-forward |
|
||
| `tp-search-backward` | 向后搜索属性 | text-property-search-backward |
|
||
| `tp-forward` | 向前搜索 N 次 | tp--forward-on-string, tp-search-forward |
|
||
| `tp-backward` | 向后搜索 N 次 | tp--backward-on-string, tp-search-backward |
|
||
| `tp-forward-do` | 向前搜索并对最后匹配执行函数 | tp--forward-do-on-string |
|
||
| `tp-backward-do` | 向后搜索并对最后匹配执行函数 | tp--backward-do-on-string |
|
||
| `tp-search` | 搜索所有匹配 | tp--search-do |
|
||
| `tp-search-map` | 对所有匹配应用函数 | tp--search-do |
|
||
| `tp--search-do` | 搜索的内部实现 | - |
|
||
|
||
---
|
||
|
||
## 函数调用关系图
|
||
|
||
### tp-set 调用链
|
||
```
|
||
tp-set
|
||
├── tp--parse-args
|
||
│ └── tp--resolve-props
|
||
│ ├── tp-layer-props
|
||
│ ├── tp--collect-reactive-symbols
|
||
│ ├── tp--resolve-reactive-symbols
|
||
│ ├── tp--register-reactive-deps
|
||
│ └── tp--build-layer-props (for groups)
|
||
├── tp--handle-tp-text-property
|
||
└── put-text-property (Emacs 原生)
|
||
```
|
||
|
||
### tp-add 调用链
|
||
```
|
||
tp-add
|
||
├── tp--parse-args
|
||
├── tp--handle-tp-text-property
|
||
├── text-properties-at (Emacs 原生)
|
||
├── tp--prepend-face
|
||
│ └── tp--deep-merge-plist
|
||
├── tp--deep-merge-plist
|
||
└── put-text-property (Emacs 原生)
|
||
```
|
||
|
||
### tp-define-layer 调用链
|
||
```
|
||
tp-define-layer
|
||
├── tp--parse-define-layer-args
|
||
├── tp--collect-reactive-symbols
|
||
├── tp--unregister-reactive-deps
|
||
│ ├── tp--unregister-layer-watchers
|
||
│ ├── tp--unregister-layer-computed
|
||
│ └── tp--unregister-layer-data
|
||
├── tp--ensure-reactive-variables
|
||
├── tp--register-layer-data
|
||
├── tp--register-layer-computed
|
||
├── tp--apply-initial-computed
|
||
├── tp--register-reactive-deps
|
||
├── tp--register-layer-watchers
|
||
├── tp--resolve-reactive-symbols
|
||
├── tp--set-layer-props
|
||
└── tp--update-layer-regions
|
||
├── tp-layer-props
|
||
└── tp-search-map
|
||
└── tp-add
|
||
```
|
||
|
||
### tp-push-layer 调用链
|
||
```
|
||
tp-push-layer
|
||
└── tp-put-layer
|
||
├── tp--normalize-layer-spec
|
||
│ └── tp-layer-props
|
||
├── tp-group-props
|
||
│ └── tp-layer-props
|
||
├── tp-empty-p
|
||
├── set-text-properties (Emacs 原生)
|
||
└── tp-intervals-map
|
||
└── tp-intervals
|
||
```
|
||
|
||
### 响应式更新调用链
|
||
```
|
||
(setq some-reactive-var new-value)
|
||
└── tp--reactive-variable-watcher
|
||
├── tp--invoke-layer-watchers
|
||
├── tp--update-layer-computed
|
||
│ ├── tp--resolve-reactive-symbols
|
||
│ └── tp--set-layer-props
|
||
├── tp--update-layer-regions (属性更新)
|
||
│ └── tp-search-map
|
||
│ └── tp-add
|
||
└── tp--update-reactive-text (文本替换)
|
||
└── tp--replace-reactive-text-in-buffer
|
||
```
|
||
|
||
---
|
||
|
||
## 设计原则
|
||
|
||
1. **分层封装**:每层只依赖于下层功能,避免跨层调用
|
||
2. **单一职责**:每个函数只做一件事
|
||
3. **复用优先**:高层函数应该复用低层函数,避免重复代码
|
||
4. **统一接口**:所有核心属性函数支持相同的调用约定
|
||
5. **响应式解耦**:响应式系统独立于核心属性操作,可选择性使用
|