Title: Fix: Enable Bracketed Paste Mode in `useTerminalInput` by hqwlkj · Pull Request #45 · lessweb/deepcode-cli · GitHub
Open Graph Title: Fix: Enable Bracketed Paste Mode in `useTerminalInput` by hqwlkj · Pull Request #45 · lessweb/deepcode-cli
X Title: Fix: Enable Bracketed Paste Mode in `useTerminalInput` by hqwlkj · Pull Request #45 · lessweb/deepcode-cli
Description: Summary 修复 useTerminalInput 中 Bracketed Paste Mode(括号粘贴模式)的粘贴处理代码因未启用而成为死代码的问题,使粘贴多行代码时能够作为原子输入正确处理。 Problem 在之前的 commit 4c015a3 中,useTerminalInput 添加了完整的 Bracketed Paste Mode 处理逻辑: 解析终端发送的粘贴起止标记 \u001B[200~ / \u001B[201~ 累加粘贴内容并在结束后一次性交付 行尾归一化处理(\r\n / \r → \n) 新增 paste 标志位区分粘贴与按键输入 但在实际运行中,Bracketed Paste Mode 从未被启用: Ink 框架将 setBracketedPasteMode 方法仅暴露在内部 API(useStdinContext)中,公开的 useStdin() hook 不包含此方法 useTerminalInput 从未调用该方法或直接写入 ANSI 转义序列来启用该模式 终端未进入 bracketed paste 模式,不会发送 \u001B[200~ / \u001B[201~ 标记 粘贴处理分支(约 40 行代码)永远不会被执行 因此粘贴多行文本时,终端逐行发送数据,粘贴内容中的 \r 字符会被 parseTerminalInput 误判为 Enter 键,导致粘贴内容被拆解为零散的按键事件,无法正确保留原始格式。 Solution 在 useTerminalInput 中与 setRawMode(true) 同级启用 bracketed paste mode,通过直接写入 ANSI 转义序列到 stdout: // 启用 bracketed paste mode process.stdout.write("\u001B[?2004h"); // 组件卸载时关闭 process.stdout.write("\u001B[?2004l"); 这与 Ink 内部 App 组件的 handleSetBracketedPasteMode 实现方式完全一致,都是向终端发送 \u001B[?2004h(启用)/ \u001B[?2004l(关闭)来控制 bracketed paste mode。 Changes File Change src/ui/prompt/useTerminalInput.ts 在 useEffect 中新增 process.stdout.write("\u001B[?2004h") 和对应的清理逻辑 Diff useEffect(() => { if (!isActive) { return; } setRawMode(true); + // Enable bracketed paste mode so the terminal wraps pasted text in + // \u001B[200~ / \u001B[201~ markers, allowing us to deliver the full + // paste as a single atomic input instead of fragmented key events. + process.stdout.write("\u001B[?2004h"); return () => { setRawMode(false); + process.stdout.write("\u001B[?2004l"); }; }, [isActive, setRawMode]); Effect Before(Bracketed Paste 未启用) 粘贴 hello\nworld 时,终端发送 h e l l o \r w o r l d,其中 \r 被 parseTerminalInput 识别为 key.return = true,粘贴内容被拆分为多个独立事件。 After(Bracketed Paste 已启用) 粘贴 hello\nworld 时,终端发送包裹后的完整内容: \u001B[200~hello\rworld\u001B[201~ useTerminalInput 累加起止标记之间的全部文本,归一化行尾符后作为一次原子操作交付给 PromptInput.tsx,key.return = false,所有其他按键标志也为 false,仅 paste = true。 效果对比 场景 修改前 修改后 粘贴多行代码 每行作为独立事件,\r 被误判为 Enter 完整粘贴,一次原子操作,换行正确保留 粘贴含控制字符的内容 Tab 等可能触发自动补全 所有控制字符安全传递(key.tab = false) 跨平台换行符 仅靠 PromptInput.tsx 归一化 双重保障:hook 层 + PromptInput 层 Verification typecheck : ✅ 无错误 lint : ✅ 0 errors, 0 warnings format : ✅ All matched files use Prettier code style test : ✅ 150/150 pass, 0 fail Notes Ink 5.x 的 setBracketedPasteMode 仅通过内部 useStdinContext 暴露,不在公开 API useStdin 中。由于本项目使用自定义的 useTerminalInput(直接监听 stdin.on("data") 而非 Ink 的 useInput / usePaste),直接写入 ANSI 转义序列是最简洁且与 Ink 内部行为一致的方案。 paste 标志位在 InputKey 中已就绪,可供后续需要区分粘贴与普通输入的场景使用。
Open Graph Description: Summary 修复 useTerminalInput 中 Bracketed Paste Mode(括号粘贴模式)的粘贴处理代码因未启用而成为死代码的问题,使粘贴多行代码时能够作为原子输入正确处理。 Problem 在之前的 commit 4c015a3 中,useTerminalInput 添加了完整的 Bracketed Paste Mode 处理逻辑: 解析终端发送的粘贴起止标记 ...
X Description: Summary 修复 useTerminalInput 中 Bracketed Paste Mode(括号粘贴模式)的粘贴处理代码因未启用而成为死代码的问题,使粘贴多行代码时能够作为原子输入正确处理。 Problem 在之前的 commit 4c015a3 中,useTerminalInput 添加了完整的 Bracketed Paste Mode 处理逻辑: 解析终端发送的粘贴起止标记 ...
Opengraph URL: https://github.com/lessweb/deepcode-cli/pull/45
X: @github
Domain: github.com
| route-pattern | /:user_id/:repository/pull/:id/files(.:format) |
| route-controller | pull_requests |
| route-action | files |
| fetch-nonce | v2:ebd6871d-2081-d4d0-8fc6-70180f870d8a |
| current-catalog-service-hash | ae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b |
| request-id | A0AA:FB1CA:D98124:12C62ED:6A4DCE55 |
| html-safe-nonce | d1bb2436b4525512defdc6933758e5f7ccedc5d6a27670c9a2b11dbd291766de |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJBMEFBOkZCMUNBOkQ5ODEyNDoxMkM2MkVEOjZBNERDRTU1IiwidmlzaXRvcl9pZCI6IjExMzM4MzE2MjY1OTUwOTQxMDEiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | 2fe65c725da973e04b3f9f1f0ab88938b58894baaa968de98926fa52de46e1be |
| hovercard-subject-tag | pull_request:3659994920 |
| github-keyboard-shortcuts | repository,pull-request-list,pull-request-conversation,pull-request-files-changed,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/lessweb/deepcode-cli/pull/45/files |
| twitter:image | https://avatars.githubusercontent.com/u/12181423?s=400&v=4 |
| twitter:card | summary_large_image |
| og:image | https://avatars.githubusercontent.com/u/12181423?s=400&v=4 |
| og:image:alt | Summary 修复 useTerminalInput 中 Bracketed Paste Mode(括号粘贴模式)的粘贴处理代码因未启用而成为死代码的问题,使粘贴多行代码时能够作为原子输入正确处理。 Problem 在之前的 commit 4c015a3 中,useTerminalInput 添加了完整的 Bracketed Paste Mode 处理逻辑: 解析终端发送的粘贴起止标记 ... |
| og:site_name | GitHub |
| og:type | object |
| hostname | github.com |
| expected-hostname | github.com |
| None | 06b8a6144231bf3a234f1c2e9993861e07ce98a905912b114aa386c2d7e84b33 |
| turbo-cache-control | no-preview |
| diff-view | unified |
| go-import | github.com/lessweb/deepcode-cli git https://github.com/lessweb/deepcode-cli.git |
| octolytics-dimension-user_id | 118287711 |
| octolytics-dimension-user_login | lessweb |
| octolytics-dimension-repository_id | 1223512305 |
| octolytics-dimension-repository_nwo | lessweb/deepcode-cli |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1223512305 |
| octolytics-dimension-repository_network_root_nwo | lessweb/deepcode-cli |
| turbo-body-classes | logged-out env-production page-responsive full-width |
| disable-turbo | true |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 1d344bdb7547fe6bca17a59bb2b8aac3dc9532a0 |
| ui-target | canary-2 |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width