@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.
- package/LICENSE +21 -0
- package/README.md +101 -0
- package/dist/__tests__/test-helpers.d.ts +15 -0
- package/dist/__tests__/test-helpers.d.ts.map +1 -0
- package/dist/__tests__/test-helpers.js +96 -0
- package/dist/__tests__/test-helpers.js.map +1 -0
- package/dist/candidates.d.ts +13 -0
- package/dist/candidates.d.ts.map +1 -0
- package/dist/candidates.js +47 -0
- package/dist/candidates.js.map +1 -0
- package/dist/commands.d.ts +18 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +58 -0
- package/dist/commands.js.map +1 -0
- package/dist/config/default-config.d.ts +14 -0
- package/dist/config/default-config.d.ts.map +1 -0
- package/dist/config/default-config.js +35 -0
- package/dist/config/default-config.js.map +1 -0
- package/dist/config/schema.d.ts +51 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +65 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/constants.d.ts +6 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +6 -0
- package/dist/constants.js.map +1 -0
- package/dist/cursor.d.ts +18 -0
- package/dist/cursor.d.ts.map +1 -0
- package/dist/cursor.js +97 -0
- package/dist/cursor.js.map +1 -0
- package/dist/extensions.d.ts +44 -0
- package/dist/extensions.d.ts.map +1 -0
- package/dist/extensions.js +2 -0
- package/dist/extensions.js.map +1 -0
- package/dist/hop.d.ts +13 -0
- package/dist/hop.d.ts.map +1 -0
- package/dist/hop.js +53 -0
- package/dist/hop.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/keymap.d.ts +17 -0
- package/dist/keymap.d.ts.map +1 -0
- package/dist/keymap.js +223 -0
- package/dist/keymap.js.map +1 -0
- package/dist/machine/actions.d.ts +23 -0
- package/dist/machine/actions.d.ts.map +1 -0
- package/dist/machine/actions.js +97 -0
- package/dist/machine/actions.js.map +1 -0
- package/dist/machine/types.d.ts +159 -0
- package/dist/machine/types.d.ts.map +1 -0
- package/dist/machine/types.js +2 -0
- package/dist/machine/types.js.map +1 -0
- package/dist/machine/vim-machine.d.ts +200 -0
- package/dist/machine/vim-machine.d.ts.map +1 -0
- package/dist/machine/vim-machine.js +425 -0
- package/dist/machine/vim-machine.js.map +1 -0
- package/dist/plugin.d.ts +5 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +180 -0
- package/dist/plugin.js.map +1 -0
- package/dist/ui/help-overlay.d.ts +6 -0
- package/dist/ui/help-overlay.d.ts.map +1 -0
- package/dist/ui/help-overlay.js +104 -0
- package/dist/ui/help-overlay.js.map +1 -0
- package/dist/ui/overlay.d.ts +14 -0
- package/dist/ui/overlay.d.ts.map +1 -0
- package/dist/ui/overlay.js +97 -0
- package/dist/ui/overlay.js.map +1 -0
- package/dist/ui/status-line.d.ts +6 -0
- package/dist/ui/status-line.d.ts.map +1 -0
- package/dist/ui/status-line.js +44 -0
- package/dist/ui/status-line.js.map +1 -0
- package/dist/ui/vim-ui-store.d.ts +46 -0
- package/dist/ui/vim-ui-store.d.ts.map +1 -0
- package/dist/ui/vim-ui-store.js +36 -0
- package/dist/ui/vim-ui-store.js.map +1 -0
- package/dist/ui/which-key.d.ts +6 -0
- package/dist/ui/which-key.d.ts.map +1 -0
- package/dist/ui/which-key.js +71 -0
- package/dist/ui/which-key.js.map +1 -0
- package/dist/viewport-utils.d.ts +11 -0
- package/dist/viewport-utils.d.ts.map +1 -0
- package/dist/viewport-utils.js +26 -0
- package/dist/viewport-utils.js.map +1 -0
- 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 @@
|
|
|
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
|
package/dist/hop.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hop.js","sourceRoot":"","sources":["../src/hop.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,OAAO,EAAE,WAAW,EAAE,CAAC;AAEvB;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,QAAgB;IAChE,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC1B,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3C,qDAAqD;IACrD,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAE3C,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,OAAO,GAAG,GAAG,KAAK,EAAE,CAAC;QACpB,GAAG,EAAE,CAAC;QACN,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC;IACjB,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3C,gCAAgC;QAChC,KAAK,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACT,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM;gBAAE,MAAM;YAC7B,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC;IACF,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,iBAAiB,CAAC,IAAa,EAAE,IAAW,EAAE,QAAgB;IAC7E,MAAM,UAAU,GAA+B,EAAE,CAAC;IAClD,KAAK,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC;QAC3C,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;IACD,UAAU,CAAC,IAAI,CACd,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACR,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CACxF,CAAC;IACF,8CAA8C;IAC9C,MAAM,UAAU,GAAG,QAAQ;SACzB,KAAK,CAAC,EAAE,CAAC;SACT,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,WAAW,CAAC;SAChC,IAAI,CAAC,EAAE,CAAC,CAAC;IACX,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAChE,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACzF,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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"}
|
package/dist/keymap.d.ts
ADDED
|
@@ -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"}
|