dsh-pull-to-send
IdentifiedSend by dragging instead of clicking. Press the composer and pull up to arm the gesture; releasing sends, dragging back into the composer cancels, and dragging outside the conversation area cancels on
PULLTOSEND
按住 DSH 输入框、向上拉、松手 —— 消息飞出去。不松手可以拖回来取消,拖出对话区同样作废。
三次拖拽,把发送变成肌肉记忆:
- 拖出去发送 —— 从输入框向上拉,消息拎在半空,松手即飞。
- 拖回来取消 —— 反悔了就把指针拖回输入框,一切归位,草稿还在。
- 拖出界取消 —— 甩到屏幕边缘、任务栏或别的窗口上,直接作废,绝不误发。
安装
dsh plugin --profile desktop add "github:dhdkfkfkf/dsh-pull-to-send"
装完重启一次 DSH(添加 bundle 本身需要重启;之后改代码走 dsh-hmr 热更)。
三种拖拽
| 你做什么 | 会发生什么 |
|---|---|
| 拖出去:在输入框卡片(含周边 12px 缓冲区)上按下,向上拉出卡片上边缘 ≥24px | 武装:输入框副本被拎起,跟随指针(阻尼跟随、微放大、阴影加深),真输入框缩小变暗;悬停时是 grab 光标,拖动中全程 grabbing |
| 武装后松手 | 触发发送按钮当前的主行为(空闲=发送,生成中=排队/插话),副本 FLIP 飞入新消息气泡,真气泡交叉淡入 |
| 拖回来:武装后把指针拖回输入框卡片内 | 解除武装:副本 150ms 短回位消失,卡片恢复正常,草稿原样保留;同一按压里再拉出去可以重新武装,可反复反悔 |
| 拖出界:武装后把指针拖出对话区可投放范围 | 立即取消:副本当场沿原路弹回消失,光标恢复,本次按压作废,松手不会发出任何东西,必须重新从输入框起手 |
| 未拉出阈值 / 横向拖拽占优 / 松手时指针停在卡片内 / 按 Esc / pointercancel | 取消:副本沿原路 320ms 弹回 |
可投放范围
拖出去的落点必须落在这块范围里,才算一次有效的发送:
| 边界 | 位置 |
|---|---|
| 左边 | 输入框卡片的左缘 |
| 右边 | 对话区背景的右缘 |
| 上边 | 对话区顶格 |
| 下边 | 输入框卡片的顶缘 |
范围之外一律判为取消 —— 屏幕边缘、任务栏、别的应用程序上都算。为了让「贴着屏幕边」也能被识别为越界,右边界还额外内缩了 8px 的安全余量。
界面全程零文字提示,只靠视觉反馈:副本拎起即为武装。
不打断你
| 场景 | 说明 |
|---|---|
| 框内拖选 | 手势只在指针越出上边缘并达到 24px 后才武装,框内选择 100% 原生 |
| 空输入 / 发送按钮禁用 | 不武装,松手无事发生 |
| IME 组合中 | 组合一开始就取消手势,不会发出半截拼音 |
| 触屏 | 仅响应鼠标和笔,手指滚动永远不会误发 |
| 卡片上的按钮 / 链接 / 菜单 | 归它们自己,不会拉出消息 |
| 拖到窗口外松手 | 视为取消,不会误发 |
动画参数
零构建、单文件 client.js,所有参数是文件顶部的具名常量(v1 没有设置面板):
| 常量 | 默认 | 含义 |
|---|---|---|
ARM_DISTANCE | 24px | 越过输入框上边缘多少距离才武装 |
EDGE_MARGIN | 8px | 可投放范围与窗口边缘之间保留的安全余量 |
DISARM_RETURN_MS | 150ms | 拖回卡片内时副本的回位时长 |
HIT_PAD | 12px | 卡片四周的隐形响应缓冲区 |
DAMPING | 0.95 | 副本跟随指针的每帧插值系数(越大越跟手) |
MAX_SCALE | 1.02 | 拎起时最大放大 |
FLIP_MS | 400ms | 松手后副本飞入气泡的时长 |
BUBBLE_LEAD_MS | 80ms | 真气泡提前淡入的提前量 |
RETURN_MS | 200ms | 真输入框回位时长(不等飞行结束) |
CANCEL_MS | 320ms | 取消回弹时长 |
出问题怎么办
打开控制台输入:
window.__DSH_PULLTOSEND__.disable() // 立刻停用手势(不用重启、不用卸载)
window.__DSH_PULLTOSEND__.version // 确认插件确实加载了
disable() 会摘掉全部监听器并把已拎起的副本收回;刷新页面即恢复。
兼容性
同时兼容 claude-style 与原生界面(两者共用同一套 data-composer-* 锚点);多个会话窗格各自绑定各自的手势。已验证发送路径:对发送按钮的程序化 .click() 在 React/Lexical 下真实触发发送(CDP 探针实测)。
锚点查找是三层降级:先找 data-composer-* 语义属性,找不到再按 aria-label / contenteditable 判断,最后才用类名模糊匹配 —— 任意一层命中都能工作。
License
MIT
Comments
Loading…
Similar plugins
滚动钢琴:鼠标滑过 DSH 右侧边缘的滚动条竖条时,按纵向位置发出钢琴音(越高音越高,特雷门琴式)。
★ 0
dsh plugin --profile web add dsh-scroll-pianoby Nalleyer
dsh plugin: switch the chat composer between Enter-send and Ctrl+Enter-send from Settings → General.
★ 0
MIT
TypeScript
Oct 8, 2026
dsh plugin --profile web add dsh-enter-sendOne-click prompt refinement for the DSH composer: the ✦ button next to Send rewrites the draft into an agent-ready prompt in Standard or Light mode, with Revert and Retry; asks follow-up questions thr
★ 0
dsh plugin --profile web add dsh-smart-promptby 1250589385
DSH 快捷发送插件:在输入框下方、上下文进度旁提供可自定义的快捷指令按钮,一键把预设文字直接发送到当前对话,省去重复打字;每条指令的名称、字号、透明度、模块化形状与发送内容均可就地编辑,右键按钮组可拖动换位置。修复上下文进度与累计使用区域被挤压后无法点击的问题。
★ 0
MIT
JavaScript
Oct 23, 2026
dsh plugin --profile web add dsh-quick-sendby levodoubt
Adds a Long text button to the composer tool row: write or paste the body in an editor overlay, and on save it is written to <workspace>/.dsh-longtext/<timestamp>_<title>.md and an @ path reference to
★ 1
MIT
JavaScript
Oct 15, 2026
dsh plugin --profile web add dsh-longtext-inputRecalls messages you already sent in the DSH composer with ArrowUp, and restores the draft you were writing with ArrowDown.
★ 0
dsh plugin --profile web add dsh-composer-input-history