Skip to content

feat: 新增 TUI 对话模式基础脚手架#14

Open
chaojixinren wants to merge 2 commits into
TIC-DLUT:mainfrom
chaojixinren:main
Open

feat: 新增 TUI 对话模式基础脚手架#14
chaojixinren wants to merge 2 commits into
TIC-DLUT:mainfrom
chaojixinren:main

Conversation

@chaojixinren
Copy link
Copy Markdown

@chaojixinren chaojixinren commented Apr 28, 2026

增加了4个文件

tui/
  run.go      // 对外入口:Run(agent)
  model.go    // 状态结构和初始化
  update.go   // 事件处理:Msg -> Model/Cmd
  view.go     // 渲染:Model -> View

我自己进行了部分优化操作已达到与claudecode对齐的效果,如果超出了该feat的目的请通知我更改,详情如下:

  1. 增加tui了二次Ctrl-C退出确认,具体机制是等待1秒并显示二次确认信息,再次操作后退出
  2. 增加了底部分割线用来美化
  3. 增加临时tui标题Welcome to nano-claude-code

写的时候由于是简单tui实现于是不少地方没有详细处理,但是写的时候看到了我就在这里写一下,之后需要进行补充或修复,一下是需要改进的地方:

  1. 目前没有进行样式美化,我们应该单独分出style.go来进行对话样式调整,以达到美观效果
  2. 目前的话,窗口在llm流式输出的时候会一直自动滚动到最底部,需要优化为在输出未完成时也可以用户进行滚动(详情见view.go)
  3. 之后增加其它键盘快捷键或指令
  4. 用户与llm之间对话样式是
	目前:You: 你好
		 Assistant: 你好

	期望: 你好(用户输出整行高光对齐claude-code样式)
		  你好(llm输出不做处理)

	进阶: 使其完成markdown格式渲染

E2E测试截图:
截屏2026-04-28 17 02 53
截屏2026-04-28 17 04 16
截屏2026-04-28 17 07 18
Related to #6

实现基于 Elm 架构的基础对话界面
@chaojixinren
Copy link
Copy Markdown
Author

chaojixinren commented Apr 28, 2026

目前有个问题,目前bubbletea无法简单的完成同时支持鼠标滚轮滑动窗口和鼠标选择来复制对话内容,原因是MouseModeCellMotion虽然可以完成鼠标滚轮滑动窗口,但是会导致tui接管鼠标输入以至于无法进行鼠标选择复制对话和输入框内容。

我查看了crush的解决方案,发现Crush 不是同时保留终端原生选择 + 应用滚轮事件,而是启用鼠标模式,然后自己实现选择和复制。

如果是这样的话那么会加入大量代码,我怕对于教学项目来说代码量在这边偏重不太好。

详情见view.go

v.MouseMode = tea.MouseModeCellMotion //tui接管鼠标控制!会导致无法进行鼠标选择复制,之后需处理

- 支持鼠标左键拖拽多行选区,实时反白高亮
- 有选区时 ctrl+c 复制纯文本到剪贴板,无选区时走退出确认
- 窗口 resize / 发送消息 / 流式输出时自动清除选区,防止坐标错乱
- refreshViewport 改为仅在已滚到底部时自动跟进,不再强制置底
@chaojixinren
Copy link
Copy Markdown
Author

目前有个问题,目前bubbletea无法简单的完成同时支持鼠标滚轮滑动窗口和鼠标选择来复制对话内容,原因是MouseModeCellMotion虽然可以完成鼠标滚轮滑动窗口,但是会导致tui接管鼠标输入以至于无法进行鼠标选择复制对话和输入框内容。

我查看了crush的解决方案,发现Crush 不是同时保留终端原生选择 + 应用滚轮事件,而是启用鼠标模式,然后自己实现选择和复制。

如果是这样的话那么会加入大量代码,我怕对于教学项目来说代码量在这边偏重不太好。

详情见view.go

v.MouseMode = tea.MouseModeCellMotion //tui接管鼠标控制!会导致无法进行鼠标选择复制,之后需处理

该问题已在 b155721 中解决,其中ANSI/CJK/emoji处理逻辑借鉴了Crush项目,自己实现了鼠标的选择复制。

此外解决了之前目前的话,窗口在llm流式输出的时候会一直自动滚动到最底部,需要优化为在输出未完成时也可以用户进行滚动(详情见view.go)的问题,实现逻辑为只有在最底层时才会继续滚动渲染,此外则不会,详情看view.go

bug:由于macOS 上 cmd+c 被终端模拟器在 OS 层面拦截,用于复制终端自己的选中内容,永远不会传递给里面运行的程序。所以在update.go中case 里写 super+c ,程序根本收不到这个按键事件。导致在mac中只能使用ctrl+c复制,无法使用cmd+c复制
截屏2026-05-04 19 28 09

@chaojixinren
Copy link
Copy Markdown
Author

目前有个问题,目前bubbletea无法简单的完成同时支持鼠标滚轮滑动窗口和鼠标选择来复制对话内容,原因是MouseModeCellMotion虽然可以完成鼠标滚轮滑动窗口,但是会导致tui接管鼠标输入以至于无法进行鼠标选择复制对话和输入框内容。
我查看了crush的解决方案,发现Crush 不是同时保留终端原生选择 + 应用滚轮事件,而是启用鼠标模式,然后自己实现选择和复制。
如果是这样的话那么会加入大量代码,我怕对于教学项目来说代码量在这边偏重不太好。
详情见view.go

v.MouseMode = tea.MouseModeCellMotion //tui接管鼠标控制!会导致无法进行鼠标选择复制,之后需处理

该问题已在 b155721 中解决,其中ANSI/CJK/emoji处理逻辑借鉴了Crush项目,自己实现了鼠标的选择复制。

此外解决了之前目前的话,窗口在llm流式输出的时候会一直自动滚动到最底部,需要优化为在输出未完成时也可以用户进行滚动(详情见view.go)的问题,实现逻辑为只有在最底层时才会继续滚动渲染,此外则不会,详情看view.go

bug:由于macOS 上 cmd+c 被终端模拟器在 OS 层面拦截,用于复制终端自己的选中内容,永远不会传递给里面运行的程序。所以在update.go中case 里写 super+c ,程序根本收不到这个按键事件。导致在mac中只能使用ctrl+c复制,无法使用cmd+c复制 截屏2026-05-04 19 28 09

这下算是知道为啥opencode要弄成选择后自动复制了,bubbletea本身设计缺陷来着😂

@pykelysia pykelysia linked an issue May 5, 2026 that may be closed by this pull request
@pykelysia pykelysia self-assigned this May 11, 2026
@pykelysia
Copy link
Copy Markdown
Member

你好,我clone了你的仓库,并尝试运行,然后发现未能正常运行结果如下,
我的环境是 wsl 的 Ubuntu,我想需要你解决这个问题
image

@pykelysia
Copy link
Copy Markdown
Member

目前有个问题,目前bubbletea无法简单的完成同时支持鼠标滚轮滑动窗口和鼠标选择来复制对话内容,原因是MouseModeCellMotion虽然可以完成鼠标滚轮滑动窗口,但是会导致tui接管鼠标输入以至于无法进行鼠标选择复制对话和输入框内容。
我查看了crush的解决方案,发现Crush 不是同时保留终端原生选择 + 应用滚轮事件,而是启用鼠标模式,然后自己实现选择和复制。
如果是这样的话那么会加入大量代码,我怕对于教学项目来说代码量在这边偏重不太好。
详情见view.go

v.MouseMode = tea.MouseModeCellMotion //tui接管鼠标控制!会导致无法进行鼠标选择复制,之后需处理

该问题已在 b155721 中解决,其中ANSI/CJK/emoji处理逻辑借鉴了Crush项目,自己实现了鼠标的选择复制。
此外解决了之前目前的话,窗口在llm流式输出的时候会一直自动滚动到最底部,需要优化为在输出未完成时也可以用户进行滚动(详情见view.go)的问题,实现逻辑为只有在最底层时才会继续滚动渲染,此外则不会,详情看view.go
bug:由于macOS 上 cmd+c 被终端模拟器在 OS 层面拦截,用于复制终端自己的选中内容,永远不会传递给里面运行的程序。所以在update.go中case 里写 super+c ,程序根本收不到这个按键事件。导致在mac中只能使用ctrl+c复制,无法使用cmd+c复制 截屏2026-05-04 19 28 09

这下算是知道为啥opencode要弄成选择后自动复制了,bubbletea本身设计缺陷来着😂

这里的截图未能正常显示

@pykelysia
Copy link
Copy Markdown
Member

你好,我clone了你的仓库,并尝试运行,然后发现未能正常运行结果如下, 我的环境是 wsl 的 Ubuntu,我想需要你解决这个问题 image

抱歉,该问题是我使用ds的api进行测试时出现的问题,系ds与该项目的兼容性问题,不在该pr的范围

@chaojixinren
Copy link
Copy Markdown
Author

你好,我clone了你的仓库,并尝试运行,然后发现未能正常运行结果如下, 我的环境是 wsl 的 Ubuntu,我想需要你解决这个问题 image

抱歉,该问题是我使用ds的api进行测试时出现的问题,系ds与该项目的兼容性问题,不在该pr的范围

你好,我clone了你的仓库,并尝试运行,然后发现未能正常运行结果如下, 我的环境是 wsl 的 Ubuntu,我想需要你解决这个问题 image

抱歉,该问题是我使用ds的api进行测试时出现的问题,系ds与该项目的兼容性问题,不在该pr的范围

没事,之后应该优化报错信息并在tui中显示

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

增加tui模式

2 participants