1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
//! 交互式 CLI 输入处理模块
//!
//! 本模块提供交互式命令行界面的文本输入编辑功能,支持光标移动、字符插入、
//! 删除等基础编辑操作。主要用于处理用户在终端中的键盘输入,并维护输入
//! 缓冲区与光标位置的一致性。
//!
//! # 功能特性
//!
//! - **光标导航**:支持左右方向键、Home/End 键进行光标定位
//! - **字符编辑**:支持字符插入、退格删除、Delete 删除
//! - **多行输入**:支持换行符插入,允许多行文本编辑
//! - **Unicode 支持**:正确处理 UTF-8 多字节字符的边界操作
//!
//! # 使用示例
//!
//! ```ignore
//! use crossterm::event::KeyCode;
//! use crate::app::agent::agent::loop_::cli::interactive_input::*;
//!
//! let mut input = String::from("hello");
//! let mut cursor = 5;
//!
//! // 在末尾插入字符
//! let result = apply_key_to_input(&mut input, &mut cursor, KeyCode::Char('!'));
//! assert_eq!(result, InputEditResult::Updated);
//! assert_eq!(input, "hello!");
//! ```
use KeyCode;
/// 表示输入编辑操作的结果状态
///
/// 该枚举用于指示键盘事件处理后输入缓冲区的变化情况,
/// 便于调用方决定是否需要重绘界面或执行其他后续操作。
pub
/// 将键盘事件应用到输入缓冲区
///
/// 根据传入的按键类型对输入字符串和光标位置执行相应的编辑操作。
/// 该函数是交互式输入处理的核心,统一处理所有文本编辑相关的键盘事件。
///
/// # 参数
///
/// * `input` - 可变引用,指向待编辑的输入字符串缓冲区
/// * `cursor_idx` - 可变引用,指向当前光标位置(以字符为单位,非字节)
/// * `key` - 待处理的键盘事件代码
///
/// # 返回值
///
/// 返回 [`InputEditResult`] 枚举,指示此次操作是否改变了输入状态:
/// - [`InputEditResult::Updated`] - 输入内容或光标位置已修改
/// - [`InputEditResult::NoChange`] - 按键未被识别,输入未改变
///
/// # 支持的按键操作
///
/// | 按键 | 行为 |
/// |------|------|
/// | `Left` | 光标左移一位(最小为 0) |
/// | `Right` | 光标右移一位(最大为字符串末尾) |
/// | `Home` | 光标移动到行首(位置 0) |
/// | `End` | 光标移动到行尾(字符串末尾) |
/// | `Backspace` | 删除光标前一个字符,光标左移 |
/// | `Delete` | 删除光标位置的字符,光标不动 |
/// | `Char('\n')` / `Char('\r')` | 在光标处插入换行符 |
/// | `Char(c)` | 在光标处插入普通字符 |
///
/// # 示例
///
/// ```ignore
/// use crossterm::event::KeyCode;
///
/// let mut text = String::from("abc");
/// let mut pos = 1;
///
/// // 插入字符
/// assert_eq!(
/// apply_key_to_input(&mut text, &mut pos, KeyCode::Char('X')),
/// InputEditResult::Updated
/// );
/// assert_eq!(text, "aXbc");
/// assert_eq!(pos, 2);
///
/// // 删除字符
/// assert_eq!(
/// apply_key_to_input(&mut text, &mut pos, KeyCode::Backspace),
/// InputEditResult::Updated
/// );
/// assert_eq!(text, "abc");
/// assert_eq!(pos, 1);
/// ```
///
/// # 注意事项
///
/// - 光标位置以 Unicode 字符为单位计算,而非字节偏移
/// - 对于无效按键(如功能键、Alt 组合键等),返回 `NoChange`
/// - 所有编辑操作都会重建字符串,在极端高频输入下可能有性能影响
pub
/// 在输入缓冲区中插入换行符
///
/// 这是一个便捷函数,用于在当前光标位置插入换行符。
/// 功能上等同于调用 `apply_key_to_input(..., KeyCode::Char('\n'))`,
/// 但提供了更明确的语义化接口。
///
/// # 参数
///
/// * `input` - 可变引用,指向待编辑的输入字符串缓冲区
/// * `cursor_idx` - 可变引用,指向当前光标位置
///
/// # 示例
///
/// ```ignore
/// let mut text = String::from("hello world");
/// let mut pos = 5;
///
/// insert_newline(&mut text, &mut pos);
/// assert_eq!(text, "hello\n world");
/// assert_eq!(pos, 6);
/// ```
///
/// # 实现说明
///
/// 该函数通过将字符串转换为字符向量来实现插入操作,
/// 确保正确处理 UTF-8 多字节字符的边界情况。
/// 插入后光标位置会自动加一,指向新插入的换行符之后。
pub