@edv4h/usketch-plugin-tool-vim 0.1.0

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.
Files changed (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +101 -0
  3. package/dist/__tests__/test-helpers.d.ts +15 -0
  4. package/dist/__tests__/test-helpers.d.ts.map +1 -0
  5. package/dist/__tests__/test-helpers.js +96 -0
  6. package/dist/__tests__/test-helpers.js.map +1 -0
  7. package/dist/candidates.d.ts +13 -0
  8. package/dist/candidates.d.ts.map +1 -0
  9. package/dist/candidates.js +47 -0
  10. package/dist/candidates.js.map +1 -0
  11. package/dist/commands.d.ts +18 -0
  12. package/dist/commands.d.ts.map +1 -0
  13. package/dist/commands.js +58 -0
  14. package/dist/commands.js.map +1 -0
  15. package/dist/config/default-config.d.ts +14 -0
  16. package/dist/config/default-config.d.ts.map +1 -0
  17. package/dist/config/default-config.js +35 -0
  18. package/dist/config/default-config.js.map +1 -0
  19. package/dist/config/schema.d.ts +51 -0
  20. package/dist/config/schema.d.ts.map +1 -0
  21. package/dist/config/schema.js +65 -0
  22. package/dist/config/schema.js.map +1 -0
  23. package/dist/constants.d.ts +6 -0
  24. package/dist/constants.d.ts.map +1 -0
  25. package/dist/constants.js +6 -0
  26. package/dist/constants.js.map +1 -0
  27. package/dist/cursor.d.ts +18 -0
  28. package/dist/cursor.d.ts.map +1 -0
  29. package/dist/cursor.js +97 -0
  30. package/dist/cursor.js.map +1 -0
  31. package/dist/extensions.d.ts +44 -0
  32. package/dist/extensions.d.ts.map +1 -0
  33. package/dist/extensions.js +2 -0
  34. package/dist/extensions.js.map +1 -0
  35. package/dist/hop.d.ts +13 -0
  36. package/dist/hop.d.ts.map +1 -0
  37. package/dist/hop.js +53 -0
  38. package/dist/hop.js.map +1 -0
  39. package/dist/index.d.ts +6 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +4 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/keymap.d.ts +17 -0
  44. package/dist/keymap.d.ts.map +1 -0
  45. package/dist/keymap.js +223 -0
  46. package/dist/keymap.js.map +1 -0
  47. package/dist/machine/actions.d.ts +23 -0
  48. package/dist/machine/actions.d.ts.map +1 -0
  49. package/dist/machine/actions.js +97 -0
  50. package/dist/machine/actions.js.map +1 -0
  51. package/dist/machine/types.d.ts +159 -0
  52. package/dist/machine/types.d.ts.map +1 -0
  53. package/dist/machine/types.js +2 -0
  54. package/dist/machine/types.js.map +1 -0
  55. package/dist/machine/vim-machine.d.ts +200 -0
  56. package/dist/machine/vim-machine.d.ts.map +1 -0
  57. package/dist/machine/vim-machine.js +425 -0
  58. package/dist/machine/vim-machine.js.map +1 -0
  59. package/dist/plugin.d.ts +5 -0
  60. package/dist/plugin.d.ts.map +1 -0
  61. package/dist/plugin.js +180 -0
  62. package/dist/plugin.js.map +1 -0
  63. package/dist/ui/help-overlay.d.ts +6 -0
  64. package/dist/ui/help-overlay.d.ts.map +1 -0
  65. package/dist/ui/help-overlay.js +104 -0
  66. package/dist/ui/help-overlay.js.map +1 -0
  67. package/dist/ui/overlay.d.ts +14 -0
  68. package/dist/ui/overlay.d.ts.map +1 -0
  69. package/dist/ui/overlay.js +97 -0
  70. package/dist/ui/overlay.js.map +1 -0
  71. package/dist/ui/status-line.d.ts +6 -0
  72. package/dist/ui/status-line.d.ts.map +1 -0
  73. package/dist/ui/status-line.js +44 -0
  74. package/dist/ui/status-line.js.map +1 -0
  75. package/dist/ui/vim-ui-store.d.ts +46 -0
  76. package/dist/ui/vim-ui-store.d.ts.map +1 -0
  77. package/dist/ui/vim-ui-store.js +36 -0
  78. package/dist/ui/vim-ui-store.js.map +1 -0
  79. package/dist/ui/which-key.d.ts +6 -0
  80. package/dist/ui/which-key.d.ts.map +1 -0
  81. package/dist/ui/which-key.js +71 -0
  82. package/dist/ui/which-key.js.map +1 -0
  83. package/dist/viewport-utils.d.ts +11 -0
  84. package/dist/viewport-utils.d.ts.map +1 -0
  85. package/dist/viewport-utils.js +26 -0
  86. package/dist/viewport-utils.js.map +1 -0
  87. package/package.json +53 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../src/cursor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7D,0BAA0B;AAC1B,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,CAK5D;AAUD,8CAA8C;AAC9C,wBAAgB,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,CAGnF;AAED,yCAAyC;AACzC,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAInE;AAED,mDAAmD;AACnD,wBAAgB,gBAAgB,CAC/B,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,KAAK,EACZ,UAAU,GAAE,WAAW,CAAC,MAAM,CAAa,GACzC,MAAM,GAAG,IAAI,CAcf;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACrC,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,KAAK,EACX,GAAG,EAAE,SAAS,EACd,UAAU,GAAE,WAAW,CAAC,MAAM,CAAa,GACzC,MAAM,GAAG,IAAI,CAuBf;AAED,qDAAqD;AACrD,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,KAAK,GAAG,IAAI,CAiB3D"}
package/dist/cursor.js ADDED
@@ -0,0 +1,97 @@
1
+ import { getShapeBounds } from "@edv4h/usketch-tool-helpers";
2
+ /** カーソル座標をグリッドにスナップする。 */
3
+ export function snapToGrid(p, gridSize) {
4
+ return {
5
+ x: Math.round(p.x / gridSize) * gridSize,
6
+ y: Math.round(p.y / gridSize) * gridSize,
7
+ };
8
+ }
9
+ /** 方向ベクトル(screen と同じく y は下が正)。 */
10
+ const DELTA = {
11
+ left: { x: -1, y: 0 },
12
+ right: { x: 1, y: 0 },
13
+ up: { x: 0, y: -1 },
14
+ down: { x: 0, y: 1 },
15
+ };
16
+ /** カーソルを `dir` 方向へ `distance` だけ動かした座標を返す。 */
17
+ export function moveCursorBy(cursor, dir, distance) {
18
+ const d = DELTA[dir];
19
+ return { x: cursor.x + d.x * distance, y: cursor.y + d.y * distance };
20
+ }
21
+ /** shape の中心(world 座標)。見つからなければ null。 */
22
+ export function shapeCenter(deps, id) {
23
+ const b = getShapeBounds(deps.store, deps.shapes, id);
24
+ if (!b)
25
+ return null;
26
+ return { x: b.x + b.width / 2, y: b.y + b.height / 2 };
27
+ }
28
+ /** point に最も近い shape の ID(中心距離)。excludeIds は除外。 */
29
+ export function findNearestShape(deps, point, excludeIds = new Set()) {
30
+ let best = null;
31
+ let bestDist = Number.POSITIVE_INFINITY;
32
+ for (const [id] of deps.store.getShapes()) {
33
+ if (excludeIds.has(id))
34
+ continue;
35
+ const c = shapeCenter(deps, id);
36
+ if (!c)
37
+ continue;
38
+ const dist = Math.hypot(c.x - point.x, c.y - point.y);
39
+ if (dist < bestDist) {
40
+ bestDist = dist;
41
+ best = id;
42
+ }
43
+ }
44
+ return best;
45
+ }
46
+ /**
47
+ * `from` から見て `dir` 方向の cone(±45°)に中心がある shape のうち、
48
+ * 最も近いものの ID を返す(spatial navigation)。excludeIds は除外。
49
+ */
50
+ export function findDirectionalNearest(deps, from, dir, excludeIds = new Set()) {
51
+ let best = null;
52
+ let bestDist = Number.POSITIVE_INFINITY;
53
+ for (const [id] of deps.store.getShapes()) {
54
+ if (excludeIds.has(id))
55
+ continue;
56
+ const c = shapeCenter(deps, id);
57
+ if (!c)
58
+ continue;
59
+ const dx = c.x - from.x;
60
+ const dy = c.y - from.y;
61
+ // cone 判定: 進行軸の成分が直交軸の成分以上、かつ進行方向に正。
62
+ const inCone = (dir === "left" && dx < 0 && Math.abs(dx) >= Math.abs(dy)) ||
63
+ (dir === "right" && dx > 0 && Math.abs(dx) >= Math.abs(dy)) ||
64
+ (dir === "up" && dy < 0 && Math.abs(dy) >= Math.abs(dx)) ||
65
+ (dir === "down" && dy > 0 && Math.abs(dy) >= Math.abs(dx));
66
+ if (!inCone)
67
+ continue;
68
+ const dist = Math.hypot(dx, dy);
69
+ if (dist < bestDist) {
70
+ bestDist = dist;
71
+ best = id;
72
+ }
73
+ }
74
+ return best;
75
+ }
76
+ /** 全 shape を内包する world bbox の中心。shape が無ければ null。 */
77
+ export function allShapesCenter(deps) {
78
+ let minX = Number.POSITIVE_INFINITY;
79
+ let minY = Number.POSITIVE_INFINITY;
80
+ let maxX = Number.NEGATIVE_INFINITY;
81
+ let maxY = Number.NEGATIVE_INFINITY;
82
+ let found = false;
83
+ for (const [id] of deps.store.getShapes()) {
84
+ const b = getShapeBounds(deps.store, deps.shapes, id);
85
+ if (!b)
86
+ continue;
87
+ found = true;
88
+ minX = Math.min(minX, b.x);
89
+ minY = Math.min(minY, b.y);
90
+ maxX = Math.max(maxX, b.x + b.width);
91
+ maxY = Math.max(maxY, b.y + b.height);
92
+ }
93
+ if (!found)
94
+ return null;
95
+ return { x: (minX + maxX) / 2, y: (minY + maxY) / 2 };
96
+ }
97
+ //# sourceMappingURL=cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../src/cursor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { BoardStore, CommandRegistry, EventBus, Point, ShapeRegistry } from "@edv4h/usketch-shared";
2
+ import type { VimMode } from "./machine/types.js";
3
+ /**
4
+ * 独自コマンド / キーバインドのハンドラに渡される操作 API。
5
+ * store / shapes / commands / events は実サービスへの直接参照(即時反映)。
6
+ * カーソル・モード・メッセージは machine 状態なので、専用メソッド経由で更新する
7
+ * (ハンドラ内では `getCursor()` が `setCursor()` の結果を即座に反映する)。
8
+ */
9
+ export interface VimApi {
10
+ readonly store: BoardStore;
11
+ readonly shapes: ShapeRegistry;
12
+ readonly commands: CommandRegistry;
13
+ readonly events: EventBus;
14
+ /** 現在の論理カーソル(world 座標)。 */
15
+ getCursor(): Point;
16
+ /** 現在のモード。 */
17
+ getMode(): VimMode;
18
+ /** 現在の選択 shape ID。 */
19
+ getSelection(): ReadonlySet<string>;
20
+ /** 論理カーソルを移動する。 */
21
+ setCursor(p: Point): void;
22
+ /** モードを切り替える(normal/insert/visual/command/hop)。 */
23
+ setMode(mode: VimMode): void;
24
+ /** ステータスラインにメッセージを表示する。 */
25
+ message(msg: string): void;
26
+ }
27
+ /**
28
+ * `:name args...` で呼ばれる独自 ex コマンド。戻り値の文字列はステータスラインに出る。
29
+ * メッセージ不要なら何も返さなくてよい(void)ため、union に void を含めるのは意図的。
30
+ */
31
+ export type VimCommandHandler = (args: string[], api: VimApi) => string | void;
32
+ /** キーに割り当てる独自関数。 */
33
+ export type VimBindingHandler = (api: VimApi) => void;
34
+ /**
35
+ * 開発者向け拡張。`createVimToolPlugin(config, extensions)` の第2引数。
36
+ * 関数を含むため JSON 化できず、Zod 検証される `config` とは分離している。
37
+ */
38
+ export interface VimExtensions {
39
+ /** 独自 ex コマンド(コマンド名 → ハンドラ)。組み込みコマンドより優先される。 */
40
+ commands?: Record<string, VimCommandHandler>;
41
+ /** モードごとの キー → 独自関数。組み込みキーマップより優先される。 */
42
+ bindings?: Partial<Record<VimMode, Record<string, VimBindingHandler>>>;
43
+ }
44
+ //# sourceMappingURL=extensions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,UAAU,EACV,eAAe,EACf,QAAQ,EACR,KAAK,EACL,aAAa,EACb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;;;GAKG;AACH,MAAM,WAAW,MAAM;IACtB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,2BAA2B;IAC3B,SAAS,IAAI,KAAK,CAAC;IACnB,cAAc;IACd,OAAO,IAAI,OAAO,CAAC;IACnB,sBAAsB;IACtB,YAAY,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,mBAAmB;IACnB,SAAS,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IAC1B,mDAAmD;IACnD,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7B,2BAA2B;IAC3B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED;;;GAGG;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;AAE/E,oBAAoB;AACpB,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;AAEtD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC7B,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC7C,yCAAyC;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;CACvE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=extensions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensions.js","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":""}
package/dist/hop.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ import type { Point } from "@edv4h/usketch-shared";
2
+ import { HOP_TRIGGER } from "./constants.js";
3
+ import type { HopTarget, VimDeps } from "./machine/types.js";
4
+ export { HOP_TRIGGER };
5
+ /**
6
+ * `count` 件のラベルを生成する。すべて同じ長さ(固定長なのでプレフィックス曖昧さ無し)で、
7
+ * `alphabet^len >= count` を満たす最小の len を選ぶ(1文字で足りれば1文字、足りなければ2文字…)。
8
+ * 件数が多くても必ず `count` 件返す(undefined にならない)。
9
+ */
10
+ export declare function generateHopLabels(count: number, alphabet: string): string[];
11
+ /** 全 shape に対し、カーソルに近い順でラベルを割り当てた hop ターゲットを返す。 */
12
+ export declare function computeHopTargets(deps: VimDeps, from: Point, alphabet: string): HopTarget[];
13
+ //# sourceMappingURL=hop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hop.d.ts","sourceRoot":"","sources":["../src/hop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAE,CAAC;AAEvB;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAyB3E;AAED,mDAAmD;AACnD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,CAiB3F"}
package/dist/hop.js ADDED
@@ -0,0 +1,53 @@
1
+ import { HOP_TRIGGER } from "./constants.js";
2
+ import { shapeCenter } from "./cursor.js";
3
+ export { HOP_TRIGGER };
4
+ /**
5
+ * `count` 件のラベルを生成する。すべて同じ長さ(固定長なのでプレフィックス曖昧さ無し)で、
6
+ * `alphabet^len >= count` を満たす最小の len を選ぶ(1文字で足りれば1文字、足りなければ2文字…)。
7
+ * 件数が多くても必ず `count` 件返す(undefined にならない)。
8
+ */
9
+ export function generateHopLabels(count, alphabet) {
10
+ if (count <= 0)
11
+ return [];
12
+ const a = [...new Set(alphabet.split(""))];
13
+ // アルファベットが1文字以下だと長さを増やしても件数を満たせないため best-effort で返す。
14
+ if (a.length < 2)
15
+ return a.slice(0, count);
16
+ let len = 1;
17
+ let cap = a.length;
18
+ while (cap < count) {
19
+ len++;
20
+ cap *= a.length;
21
+ }
22
+ const labels = [];
23
+ const idx = new Array(len).fill(0);
24
+ for (let n = 0; n < count; n++) {
25
+ labels.push(idx.map((i) => a[i]).join(""));
26
+ // 混合基数カウンタをインクリメント(最下位桁から繰り上げ)。
27
+ for (let p = len - 1; p >= 0; p--) {
28
+ idx[p]++;
29
+ if (idx[p] < a.length)
30
+ break;
31
+ idx[p] = 0;
32
+ }
33
+ }
34
+ return labels;
35
+ }
36
+ /** 全 shape に対し、カーソルに近い順でラベルを割り当てた hop ターゲットを返す。 */
37
+ export function computeHopTargets(deps, from, alphabet) {
38
+ const withCenter = [];
39
+ for (const [id] of deps.store.getShapes()) {
40
+ const c = shapeCenter(deps, id);
41
+ if (c)
42
+ withCenter.push({ id, c });
43
+ }
44
+ withCenter.sort((a, b) => Math.hypot(a.c.x - from.x, a.c.y - from.y) - Math.hypot(b.c.x - from.x, b.c.y - from.y));
45
+ // トリガー文字を除外(`f` 始まりラベルを作らず、`f`+ラベルが必ず別キーになる)。
46
+ const labelChars = alphabet
47
+ .split("")
48
+ .filter((c) => c !== HOP_TRIGGER)
49
+ .join("");
50
+ const labels = generateHopLabels(withCenter.length, labelChars);
51
+ return withCenter.map((x, i) => ({ id: x.id, label: labels[i], cx: x.c.x, cy: x.c.y }));
52
+ }
53
+ //# sourceMappingURL=hop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hop.js","sourceRoot":"","sources":["../src/hop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { DEFAULT_SHAPE_MAP, parseVimConfig } from "./config/default-config.js";
2
+ export { type ShapeSpec, type VimConfig, type VimConfigInput, VimConfigSchema, } from "./config/schema.js";
3
+ export type { VimApi, VimBindingHandler, VimCommandHandler, VimExtensions, } from "./extensions.js";
4
+ export type { VimMode } from "./machine/types.js";
5
+ export { createVimToolPlugin } from "./plugin.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EACN,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,eAAe,GACf,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACX,MAAM,EACN,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,GACb,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { DEFAULT_SHAPE_MAP, parseVimConfig } from "./config/default-config.js";
2
+ export { VimConfigSchema, } from "./config/schema.js";
3
+ export { createVimToolPlugin } from "./plugin.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EAIN,eAAe,GACf,MAAM,oBAAoB,CAAC;AAQ5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { VimConfig } from "./config/schema.js";
2
+ import type { VimExtensions } from "./extensions.js";
3
+ import type { VimEvent, VimMode } from "./machine/types.js";
4
+ /**
5
+ * 生の KeyboardEvent を {@link VimEvent} に変換する純関数。
6
+ *
7
+ * 複数キーのプレフィックス(`gg` `zz` `ma` `` `a ``)は `pending` 文字で表現し、
8
+ * 呼び出し側(plugin.tsx)が次回呼び出しに引き渡す。count(`5j`)と operator(`d`)は
9
+ * machine 側で扱うため、ここでは DIGIT / OPERATOR イベントとして素直に送る。
10
+ *
11
+ * @returns event: 送るべきイベント(無ければ null), pending: 次に持ち越すプレフィックス
12
+ */
13
+ export declare function translateKey(e: KeyboardEvent, mode: VimMode, config: VimConfig, pending: string, bindings?: VimExtensions["bindings"]): {
14
+ event: VimEvent | null;
15
+ pending: string;
16
+ };
17
+ //# sourceMappingURL=keymap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keymap.d.ts","sourceRoot":"","sources":["../src/keymap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAa,QAAQ,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAEvE;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC3B,CAAC,EAAE,aAAa,EAChB,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,GAClC;IAAE,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAsI7C"}
package/dist/keymap.js ADDED
@@ -0,0 +1,223 @@
1
+ import { HOP_TRIGGER } from "./constants.js";
2
+ /**
3
+ * 生の KeyboardEvent を {@link VimEvent} に変換する純関数。
4
+ *
5
+ * 複数キーのプレフィックス(`gg` `zz` `ma` `` `a ``)は `pending` 文字で表現し、
6
+ * 呼び出し側(plugin.tsx)が次回呼び出しに引き渡す。count(`5j`)と operator(`d`)は
7
+ * machine 側で扱うため、ここでは DIGIT / OPERATOR イベントとして素直に送る。
8
+ *
9
+ * @returns event: 送るべきイベント(無ければ null), pending: 次に持ち越すプレフィックス
10
+ */
11
+ export function translateKey(e, mode, config, pending, bindings) {
12
+ const key = e.key;
13
+ // ── 開発者の独自キーバインド(全モードで最優先) ──
14
+ if (bindings?.[mode]?.[key]) {
15
+ return { event: { type: "CUSTOM_BINDING", mode, key }, pending: "" };
16
+ }
17
+ // ── config keymap リマップ(全モード共通)。不明トークンは通常解釈へフォールスルー ──
18
+ const remap = config.keymap[mode]?.[key];
19
+ if (remap) {
20
+ const remapped = tokenToEvent(remap);
21
+ if (remapped)
22
+ return { event: remapped, pending: "" };
23
+ }
24
+ // ── insert モード ──
25
+ if (mode === "insert") {
26
+ if (key === "Escape")
27
+ return { event: { type: "ESCAPE" }, pending: "" };
28
+ if (key === "Enter")
29
+ return { event: { type: "COMMIT" }, pending: "" };
30
+ if (key === "Tab")
31
+ return { event: { type: "TAB", shift: e.shiftKey }, pending: "" };
32
+ if (key === "Backspace")
33
+ return { event: { type: "BACKSPACE" }, pending: "" };
34
+ if (key.length === 1 && !e.ctrlKey && !e.metaKey) {
35
+ return { event: { type: "TEXT", char: key }, pending: "" };
36
+ }
37
+ return { event: null, pending: "" };
38
+ }
39
+ // ── command モード ──
40
+ if (mode === "command") {
41
+ if (key === "Escape")
42
+ return { event: { type: "ESCAPE" }, pending: "" };
43
+ if (key === "Enter")
44
+ return { event: { type: "RUN_COMMAND" }, pending: "" };
45
+ if (key === "Backspace")
46
+ return { event: { type: "COMMAND_BACKSPACE" }, pending: "" };
47
+ if (key.length === 1 && !e.ctrlKey && !e.metaKey) {
48
+ return { event: { type: "COMMAND_CHAR", char: key }, pending: "" };
49
+ }
50
+ return { event: null, pending: "" };
51
+ }
52
+ // ── hop モード(ラベル入力) ──
53
+ if (mode === "hop") {
54
+ if (key === "Escape")
55
+ return { event: { type: "ESCAPE" }, pending: "" };
56
+ if (key.length === 1 && !e.ctrlKey && !e.metaKey) {
57
+ return { event: { type: "HOP_KEY", char: key }, pending: "" };
58
+ }
59
+ return { event: null, pending: "" };
60
+ }
61
+ // ── normal / visual: 修飾キー付きは Vim キーとして解釈しない ──
62
+ // (Ctrl+F=検索 / Ctrl+T=新規タブ 等のブラウザ既定を尊重。redo の Ctrl/Meta+r のみ許可)
63
+ if (e.ctrlKey || e.metaKey || e.altKey) {
64
+ if ((e.ctrlKey || e.metaKey) && key === "r") {
65
+ return { event: { type: "REDO" }, pending: "" };
66
+ }
67
+ return { event: null, pending: "" };
68
+ }
69
+ // ── normal / visual に共通する多キープレフィックスの解決 ──
70
+ // プレフィックスが確定すればそのイベントを返す。未確定キー(不一致)の場合は
71
+ // 早期 return せずプレフィックスを破棄して下の通常解釈へフォールスルーする
72
+ // (例: "g" の直後に Esc → ESCAPE が落ち、visual を抜けられる)。
73
+ if (pending === "g") {
74
+ if (key === "g")
75
+ return { event: { type: "JUMP", to: "first" }, pending: "" };
76
+ }
77
+ else if (pending === "z") {
78
+ if (key === "z")
79
+ return { event: { type: "CENTER" }, pending: "" };
80
+ }
81
+ else if (pending === "m") {
82
+ if (/^[a-z]$/.test(key))
83
+ return { event: { type: "SET_MARK", key }, pending: "" };
84
+ }
85
+ else if (pending === "`" || pending === "'") {
86
+ if (/^[a-z]$/.test(key))
87
+ return { event: { type: "JUMP_MARK", key }, pending: "" };
88
+ }
89
+ // ── 既定キーマップ(normal / visual 共通の motion 等) ──
90
+ // hop トリガー(ラベル文字とは別。config remap より後=remap 優先)。
91
+ if (key === HOP_TRIGGER) {
92
+ return { event: { type: "HOP_START" }, pending: "" };
93
+ }
94
+ const motion = MOTION_KEYS[key];
95
+ if (motion) {
96
+ // 大文字 HJKL は pan、小文字 hjkl は cursor/selection 移動。
97
+ const shift = key === key.toUpperCase() && key !== key.toLowerCase();
98
+ return { event: { type: "MOTION", dir: motion, shift }, pending: "" };
99
+ }
100
+ if (/^[0-9]$/.test(key)) {
101
+ return { event: { type: "DIGIT", n: Number(key) }, pending: "" };
102
+ }
103
+ switch (key) {
104
+ case "Escape":
105
+ return { event: { type: "ESCAPE" }, pending: "" };
106
+ case "i":
107
+ return { event: { type: "MODE_INSERT" }, pending: "" };
108
+ case "v":
109
+ return { event: { type: "MODE_VISUAL", multi: false }, pending: "" };
110
+ case "V":
111
+ return { event: { type: "MODE_VISUAL", multi: true }, pending: "" };
112
+ case ":":
113
+ return { event: { type: "MODE_COMMAND" }, pending: "" };
114
+ case "x":
115
+ case "d":
116
+ return { event: { type: "OPERATOR", op: "delete" }, pending: "" };
117
+ case "y":
118
+ return { event: { type: "OPERATOR", op: "yank" }, pending: "" };
119
+ case "p":
120
+ return { event: { type: "PASTE" }, pending: "" };
121
+ case "u":
122
+ return { event: { type: "UNDO" }, pending: "" };
123
+ case "r":
124
+ if (e.ctrlKey || e.metaKey)
125
+ return { event: { type: "REDO" }, pending: "" };
126
+ return { event: null, pending: "" };
127
+ case "+":
128
+ case "=":
129
+ return { event: { type: "ZOOM", dir: "in" }, pending: "" };
130
+ case "-":
131
+ case "_":
132
+ return { event: { type: "ZOOM", dir: "out" }, pending: "" };
133
+ case "G":
134
+ return { event: { type: "JUMP", to: "last" }, pending: "" };
135
+ case "M":
136
+ return { event: { type: "CURSOR_CENTER" }, pending: "" };
137
+ case "?":
138
+ return { event: { type: "TOGGLE_WHICH_KEY" }, pending: "" };
139
+ case "g":
140
+ return { event: null, pending: "g" };
141
+ case "z":
142
+ return { event: null, pending: "z" };
143
+ case "m":
144
+ return { event: null, pending: "m" };
145
+ case "`":
146
+ case "'":
147
+ return { event: null, pending: key };
148
+ default:
149
+ return { event: null, pending: "" };
150
+ }
151
+ }
152
+ const MOTION_KEYS = {
153
+ h: "left",
154
+ j: "down",
155
+ k: "up",
156
+ l: "right",
157
+ H: "left",
158
+ J: "down",
159
+ K: "up",
160
+ L: "right",
161
+ };
162
+ /** config のアクショントークンを VimEvent に変換。 */
163
+ function tokenToEvent(token) {
164
+ const [head, tail] = token.split(":");
165
+ switch (head) {
166
+ case "motion":
167
+ if (isDirection(tail))
168
+ return { type: "MOTION", dir: tail, shift: false };
169
+ return null;
170
+ case "pan":
171
+ if (isDirection(tail))
172
+ return { type: "MOTION", dir: tail, shift: true };
173
+ return null;
174
+ case "mode":
175
+ if (tail === "insert")
176
+ return { type: "MODE_INSERT" };
177
+ if (tail === "visual")
178
+ return { type: "MODE_VISUAL", multi: false };
179
+ if (tail === "visual-multi")
180
+ return { type: "MODE_VISUAL", multi: true };
181
+ if (tail === "command")
182
+ return { type: "MODE_COMMAND" };
183
+ if (tail === "normal")
184
+ return { type: "ESCAPE" };
185
+ return null;
186
+ case "operator":
187
+ if (tail === "delete")
188
+ return { type: "OPERATOR", op: "delete" };
189
+ if (tail === "yank")
190
+ return { type: "OPERATOR", op: "yank" };
191
+ return null;
192
+ case "zoom":
193
+ if (tail === "in" || tail === "out")
194
+ return { type: "ZOOM", dir: tail };
195
+ return null;
196
+ case "jump":
197
+ if (tail === "first" || tail === "last")
198
+ return { type: "JUMP", to: tail };
199
+ return null;
200
+ case "escape":
201
+ return { type: "ESCAPE" };
202
+ case "commit":
203
+ return { type: "COMMIT" };
204
+ case "paste":
205
+ return { type: "PASTE" };
206
+ case "undo":
207
+ return { type: "UNDO" };
208
+ case "redo":
209
+ return { type: "REDO" };
210
+ case "center":
211
+ return { type: "CENTER" };
212
+ case "hop":
213
+ return { type: "HOP_START" };
214
+ case "toggle-which-key":
215
+ return { type: "TOGGLE_WHICH_KEY" };
216
+ default:
217
+ return null;
218
+ }
219
+ }
220
+ function isDirection(v) {
221
+ return v === "left" || v === "right" || v === "up" || v === "down";
222
+ }
223
+ //# sourceMappingURL=keymap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keymap.js","sourceRoot":"","sources":["../src/keymap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { type ShapeData } from "@edv4h/usketch-shared";
2
+ import type { ShapeCandidate, VimContext, VimDeps } from "./types.js";
3
+ /** count を実効値に(未入力なら 1)。 */
4
+ export declare function effectiveCount(ctx: VimContext): number;
5
+ /**
6
+ * 削除/yank の対象 ID。選択があれば選択、無ければカーソル最近傍 1 つ。
7
+ * (`findNearestShape` は cursor.ts にあるが循環を避けるため呼び出し側で渡す)
8
+ */
9
+ export declare function resolveTargets(ctx: VimContext, nearestId: string | null): string[];
10
+ /** 候補から実際の ShapeData を生成(createDefault + spec 上書き)。 */
11
+ export declare function buildShapeFromCandidate(deps: VimDeps, candidate: ShapeCandidate, at: {
12
+ x: number;
13
+ y: number;
14
+ }): ShapeData | null;
15
+ /** insert: 選択中の候補をカーソル位置に確定する。 */
16
+ export declare function commitCandidate(ctx: VimContext): void;
17
+ /** 対象 shape を削除(undo 可能)。 */
18
+ export declare function deleteShapes(deps: VimDeps, ids: string[]): void;
19
+ /** 対象 shape のスナップショットを返す(yank 用、ディープコピー)。 */
20
+ export declare function snapshotShapes(deps: VimDeps, ids: string[]): ShapeData[];
21
+ /** register の shape をカーソル付近に貼り付け、新 ID を採番する。 */
22
+ export declare function pasteShapes(ctx: VimContext): string[];
23
+ //# sourceMappingURL=actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/machine/actions.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElF,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAEtE,4BAA4B;AAC5B,wBAAgB,cAAc,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAEtD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,EAAE,CAIlF;AAED,uDAAuD;AACvD,wBAAgB,uBAAuB,CACtC,IAAI,EAAE,OAAO,EACb,SAAS,EAAE,cAAc,EACzB,EAAE,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1B,SAAS,GAAG,IAAI,CAgBlB;AAED,kCAAkC;AAClC,wBAAgB,eAAe,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,CAMrD;AAED,6BAA6B;AAC7B,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAI/D;AAED,6CAA6C;AAC7C,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAOxE;AAED,gDAAgD;AAChD,wBAAgB,WAAW,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,EAAE,CAgCrD"}