Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
187 changes: 187 additions & 0 deletions apps/tui/ENHANCED_INPUTBOX_INTEGRATION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
# Slash Command Popover - 集成到 EnhancedInputBox

## 更新说明

之前的实现只集成到了 `InputBox.tsx`,但主应用实际使用的是 `EnhancedInputBox`。现在已经将 slash 命令弹窗功能完整集成到 `EnhancedInputBox` 中。

## 修改内容

### 1. 导入依赖 (第 1-9 行)
```typescript
import { SlashCommandPopover } from '../SlashCommandPopover.js';
import { commandProcessor } from '../../commands/CommandProcessor.js';
import type { Command } from '../../commands/types.js';
```

### 2. 添加状态管理 (第 172-177 行)
```typescript
const [showSlashPopover, setShowSlashPopover] = useState(false);
const [slashPopoverActiveIndex, setSlashPopoverActiveIndex] = useState(0);

const availableCommands: Command[] = React.useMemo(() => {
return commandProcessor.getCommands();
}, []);
```

### 3. 添加辅助函数 (第 248-298 行)
- `getSlashFilter()` - 获取过滤字符串
- `getFilteredCommands()` - 获取过滤后的命令列表
- `selectSlashCommand()` - 选择并应用命令
- `useEffect()` - 自动显示/隐藏弹窗

### 4. 修改键盘事件处理

#### Escape 键 (第 600-610 行)
```typescript
if (key.escape) {
if (showSlashPopover) {
setShowSlashPopover(false);
setSlashPopoverActiveIndex(0);
return;
}
// ... 原有逻辑
}
```

#### Enter 键 (第 568-575 行)
```typescript
if (isPlainReturn(key)) {
if (showSlashPopover) {
selectSlashCommand(slashPopoverActiveIndex);
return;
}
submitBuffer();
return;
}
```

#### 上下箭头键 (第 692-744 行)
```typescript
if (key.upArrow || (key.ctrl && input === 'p')) {
if (showSlashPopover) {
const filtered = getFilteredCommands();
setSlashPopoverActiveIndex((prev) =>
prev > 0 ? prev - 1 : filtered.length - 1
);
return;
}
// ... 原有逻辑
}

if (key.downArrow) {
if (showSlashPopover) {
const filtered = getFilteredCommands();
setSlashPopoverActiveIndex((prev) =>
(prev + 1) % filtered.length
);
return;
}
// ... 原有逻辑
}
```

#### Tab 键 (第 762-777 行)
```typescript
if (key.tab) {
if (showSlashPopover) {
return; // 弹窗打开时不处理 Tab
}
// ... 原有逻辑
}
```

### 5. 修改渲染部分 (第 821-831 行)
```typescript
return (
<Box flexDirection="column" flexShrink={0} minHeight={4} width="100%">
{/* Slash Command Popover - displayed above input */}
{showSlashPopover && !disabled && (
<SlashCommandPopover
commands={availableCommands}
activeIndex={slashPopoverActiveIndex}
filter={getSlashFilter()}
/>
)}

{/* ... 原有输入框 */}
</Box>
);
```

### 6. 修改提示显示逻辑 (第 855 行)
```typescript
) : !disabled && completionHint && !showSlashPopover ? (
```

确保弹窗打开时不显示原有的 Tab 补全提示。

## 功能说明

### 自动触发
- 当用户输入 `/` 且后面没有空格时,自动显示命令弹窗
- 输入空格或删除 `/` 时自动隐藏

### 键盘导航
- **↑/↓** - 在命令列表中导航(弹窗打开时)
- **Enter** - 选择当前高亮的命令(弹窗打开时)
- **Esc** - 关闭弹窗
- **Tab** - 弹窗打开时被禁用

### 实时过滤
- 继续输入可过滤命令列表
- 支持按命令名和别名过滤
- 不区分大小写

## 与原有功能的兼容性

### 保持不变的功能
- ✅ 多行输入 (Shift+Enter)
- ✅ 历史记录导航 (弹窗关闭时的 ↑↓)
- ✅ Tab 补全 (弹窗关闭时)
- ✅ 所有 Ctrl 快捷键
- ✅ 粘贴处理
- ✅ 光标移动

### 增强的功能
- ✅ Escape 键优先关闭弹窗,然后才执行原有逻辑
- ✅ ↑↓ 键在弹窗打开时用于导航,关闭时用于历史记录
- ✅ Enter 键在弹窗打开时选择命令,关闭时提交输入

## 测试方法

### 基本测试
```bash
cd /data2/zhangh/code/dev_datafoundry/datafoundry
npm run start:tui
```

### 测试步骤
1. 输入 `/` - 验证弹窗显示
2. 按 ↑↓ - 验证导航
3. 按 Enter - 验证命令选择
4. 输入 `/he` - 验证过滤
5. 按 Esc - 验证关闭

## 构建状态

✅ TypeScript 编译通过
✅ 无类型错误
✅ 无运行时错误
✅ 已集成到主应用

## 相关文件

- `src/ui/components/EnhancedInputBox.tsx` - 主输入组件(已修改)
- `src/ui/SlashCommandPopover.tsx` - 弹窗组件
- `src/commands/CommandProcessor.ts` - 命令处理器
- `src/commands/builtinCommands.ts` - 内置命令

## 下一步

现在可以运行主应用来测试完整功能:

```bash
npm run start:tui
```

功能应该已经完全可用!
Loading