Keel 文档
Keel 用纯 Go 写桌面界面:界面由 Gio 绘制,原生能力(权限、截图、合成输入、全局快捷键)在 macOS 上通过 cgo 调用系统 API,在 Windows 上直接调用 Win32,在 Linux 上走 X11 协议。应用代码里没有 HTML、CSS、JavaScript,也没有 WebView。
按你要做的事找文档
| 你要做的事 | 看这篇 |
|---|---|
| 第一次跑起来,写出第一个窗口 | 快速开始 |
| 弄清模块怎么分、谁依赖谁、线程规则 | 架构,以及每个模块目录下的 README |
| 开窗口、窗口快捷键、离屏截图 | 窗口与应用 |
| 用 GPUI 风格写界面:视图 + 链式样式 + flexbox | 元素与视图 |
| 自己画外观,复用 kit 的键盘导航、首字母跳转、多选 | 无样式基础层 |
| 切换主题、写主题文件、渐变、热重载、间距刻度 | 主题 |
| 渲染 AI 回答(流式 Markdown、代码高亮) | Markdown |
| 查某个组件的 API | kit 组件规范与索引 |
| 申请权限、截屏、模拟键鼠、全局快捷键 | 原生能力 |
| 编译成 WebAssembly 在浏览器里运行 | 在浏览器里运行 |
| 新增组件或原生能力 | 扩展指南 |
| 写测试、做截图对比 | 测试 |
| 让 Agent 点击、输入、截图,跑端到端测试 | Agent 端到端测试 |
| 中文显示方框、快捷键不生效等问题 | 常见问题 |
| 为什么选 Gio、为什么只有一把锁 | 设计决策 |
三分钟版本
package main
import (
"github.com/dyike/keel/ui/el"
"github.com/dyike/keel/ui/kit"
"github.com/dyike/keel/ui/window"
)
type hello struct {
name *kit.InputView
result string
}
func (h *hello) Render(cx *el.Context) el.Element {
return el.Div().P(24).Gap(12).Child(
h.name.Render(cx),
el.Div().Row().Child(kit.Button("打招呼", func() { h.result = "你好," + h.name.Value() }).Render(cx)),
el.Text(h.result),
)
}
func main() {
window.Open(window.Options{Title: "Hello", Content: el.Root(&hello{name: kit.Input("你的名字")})})
window.Main()
}
视图是一个 struct,Render 按当前状态搭元素树;回调改字段,下一帧就画出来。写法见元素与视图,组件见 kit。
只要记住一条规则:回调里直接改组件;其他 goroutine 改组件要包进 core.Update。原因见架构。