dsh-neotui 0.1.11 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-neotui",
3
- "version": "0.1.11",
3
+ "version": "0.1.13",
4
4
  "description": "Neo-TUI: mouse-driven terminal UI client for DeepSeek Harness (B-tier per dsh-tui-design.md)",
5
5
  "type": "module",
6
6
  "bin": {
package/src/panels.js CHANGED
@@ -1219,6 +1219,7 @@ export class ControlPanel extends Widget {
1219
1219
  ["[", "上一提问的终点", () => { this.app.closeOverlay(); this.app.focus(this.app.chat); this.app.chat.onKey({ type: "key", name: "char", key: "[", text: "[", ctrl: false, alt: false, shift: false }); }],
1220
1220
  ["]", "下一提问的终点", () => { this.app.closeOverlay(); this.app.focus(this.app.chat); this.app.chat.onKey({ type: "key", name: "char", key: "]", text: "]", ctrl: false, alt: false, shift: false }); }],
1221
1221
  ["Ctrl+L", "输入栏 展开/折叠", () => { this.app.closeOverlay(); this.app.focus(this.app.chat.input); this.app.chat.input.onKey({ type: "key", name: "char", key: "l", text: "l", ctrl: true, alt: false, shift: false }); }],
1222
+ ["Ctrl+Shift+C", "复制输入栏选区", () => { this.app.closeOverlay(); this.app.chat.input.onKey({ type: "key", name: "char", key: "c", text: "c", ctrl: true, alt: false, shift: true }); }],
1222
1223
  ["Ctrl+P", "控制面板", () => { this.page = 1; this.sel = 0; this.app.redraw(); }],
1223
1224
  ["Ctrl+M", "切换模型", () => { this.app.overlay = buildModelPicker(this.app); }],
1224
1225
  ["Ctrl+T", "轨迹视图", () => { this.app.closeOverlay(); this.app.setMode("trajectory"); }],
package/src/views.js CHANGED
@@ -3043,6 +3043,9 @@ export class App {
3043
3043
  // NORMAL is subtle — the user's eyes are at the input line, not the top.
3044
3044
  const editing = this.focused === this.chat?.input;
3045
3045
  row0.left.push({ t: editing ? " INSERT " : " NORMAL ", fg: editing ? T.OK : T.FAINT, bg: T.STATUSBG, bold: editing });
3046
+ // Ctrl+Space (command panel) earns the prime spot right after the mode
3047
+ // badge — the shortcut every session needs to discover first.
3048
+ row0.left.push({ t: " Ctrl+Space 面板 ", fg: T.DIM, bg: T.STATUSBG });
3046
3049
  // Left badge: the session's permission/mode (e.g. "工作区写入/创造模式"),
3047
3050
  // which is far more meaningful than a static "工作区" label.
3048
3051
  const perm = this.projections.permissions?.currentValue;
package/src/widgets.js CHANGED
@@ -596,13 +596,18 @@ export class Input extends Widget {
596
596
  switch (ev.key) {
597
597
  case "j": if (this.multi) { this.insert("\n"); return true; } return false;
598
598
  case "c": {
599
- // a drag-selection copies it; otherwise Ctrl+C clears the input
600
- if (this.selStart !== null && this.selEnd !== null && this.selEnd > this.selStart) {
601
- const text = Array.from(this.value).slice(this.selStart, this.selEnd).join("");
602
- this.selStart = this.selEnd = null;
603
- this.app?.copyText?.(text);
599
+ if (ev.shift) {
600
+ // Ctrl+Shift+C: copy the drag-selection (if any)
601
+ if (this.selStart !== null && this.selEnd !== null && this.selEnd > this.selStart) {
602
+ const text = Array.from(this.value).slice(this.selStart, this.selEnd).join("");
603
+ this.selStart = this.selEnd = null;
604
+ this.app?.copyText?.(text);
605
+ } else {
606
+ this.app?.toast?.("先用鼠标拖动选中要复制的内容");
607
+ }
604
608
  return true;
605
609
  }
610
+ // plain Ctrl+C keeps ONE meaning here: clear the input
606
611
  this.#touch();
607
612
  this.value = "";
608
613
  this.cursor = 0;