pi-file-picker0.3.1
Native file/folder picker for pi (macOS/Windows) — pick files or folders in a real dialog and insert @path references
Untested on omp
This is a pi package. No one has reported whether it works on omp yet. If you try it, add your result below.
Reports 0
No reports yet.
Readme
pi-file-picker
English | 简体中文

给 pi 加一个真正的系统文件/文件夹选择窗口(macOS / Windows):点选文件或目录,路径自动以 @path 的形式插进输入框。
解决什么问题:终端全屏时只能靠 @ 手动敲文件名,从 Finder / 资源管理器拖文件很别扭。这个扩展直接弹出系统的对话框,鼠标点选即可。
安装
pi install npm:pi-file-picker
或从 GitHub 装:
pi install git:github.com/GoetheDady/pi-file-picker
装完重启 pi(或 /reload)。
用法
| 操作 | 说明 |
|---|---|
/pick |
弹出文件对话框(可多选) |
Ctrl+Shift+E |
同上 |
/pickdir |
弹出文件夹对话框 |
Ctrl+Shift+D(macOS)/ Ctrl+Shift+R(Windows) |
同上 |
选中后会在当前草稿后面追加 @ 引用:文件在项目内时用相对路径(@src/a.ts,与 pi 自带 @ 补全一致),在项目外时用绝对路径(@/tmp/other.txt);含空格的路径加引号(@"a b.txt")。你写的内容原样保留,只在缺分隔符时补一个空格。取消对话框不会有任何改动。
为什么是这几个键
两个平台的键位都避开了 pi 自身和终端的占用:
Ctrl+Shift+O原本是 pi 的 session tree filter 键,Ctrl+Shift+F是转录搜索——都不用- Windows Terminal 默认抢走一整片
Ctrl+Shift+<字母>,其中Ctrl+Shift+D是“复制标签页”,所以 Windows 的目录用Ctrl+Shift+R - 想改键:
extensions/file-picker.ts里的keys
要求
- macOS 或 Windows;Linux 上
/pick、/pickdir会提示不支持 - Node ≥ 22
实现说明
- macOS:
osascript -e 'choose file with multiple selections allowed',选目录用choose folder;目录对话框返回的路径带结尾/,已剥掉 - Windows:PowerShell 调 WinForms
OpenFileDialog(文件)或FolderBrowserDialog(目录),脚本内把 stdout 切到 UTF-8,非 ASCII(中文)路径不乱码 - 两个平台的对话框都开在会话的工作目录,而不是上次访问的位置
- 不依赖任何 npm 依赖,也不经过 shell——
pi.exec直接 spawn 进程 - Windows 的 PowerShell 管道输出是 CRLF,只去掉行尾那个
\r。不能整行trim():路径就是整行,而 macOS 允许文件名以空格结尾,trim 会把它吃掉,引用就指到别的文件上去了 - 取消对话框是静默的;但真失败(无 GUI 会话、权限被拦、WinForms 不可用)会把底层错误用
notify(..., "error")报出来,不再石沉大海 - 含空格的路径需要用
@"a b"形式;路径里含双引号时无法套引号(pi 没有转义约定),这类路径会原样插入并用 warning 点名,由你手动修那一条 ctx.ui.setEditorText()只改编辑器状态、不触发重绘,所以插入后跟了一句ctx.ui.notify()(notify → showStatus → ui.requestRender()),否则要等下次按键才看得到内容
限制
- Windows 选目录一次只能选一个:
FolderBrowserDialog不支持多选,而支持多选的IFileDialog要在 PowerShell 里内联 C# 做 COM 互操作。macOS 可多选 - Linux 暂不支持
- RPC 模式下不可用:那里
ctx.hasUI是 true,但getEditorText()恒返回""(编辑器归客户端所有),所以「追加」做不到,setEditorText()只会把你的草稿替换成孤零零的引用;对话框也会弹在跑 pi 的那台机器上,而不是客户端这边。/pick会直接说明这一点,而不是把你的草稿冲掉。JSON 和 print 模式本来就没有 UI
开发
npm test
test/file-picker.check.mjs 用假的 pi API 跑十八个场景(两端各自注册的快捷键、两端的文件/目录插入、相对 vs 绝对路径、路径引号、含引号文件名、工作目录在脚本里的转义、结尾斜杠剥离、取消静默 vs 失败上报、不支持平台、无 UI、草稿结尾空白保留、RPC 模式拒绝、文件名结尾空格保留),不需要真实终端或真实对话框;tsc -p . 对 @earendil-works/pi-coding-agent 的类型做静态检查。CI 在 ubuntu / macos / windows × node 22 / 24 三平台矩阵跑同一套。
License
MIT