Skip to content

Commit 8e46a92

Browse files
authored
Merge pull request #83 from vim-denops/imp-mapping
👍 Support array `mode` for `map()` and `unmap()` in `mapping` module
2 parents 7de3ced + 258008a commit 8e46a92

File tree

3 files changed

+124
-6
lines changed

3 files changed

+124
-6
lines changed

denops_std/mapping/README.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,19 @@ export async function main(denops: Denops): Promise<void> {
2222
}
2323
```
2424

25+
Users can specify multiple `mode` value like:
26+
27+
```typescript
28+
import { Denops } from "https://deno.land/x/denops_std/mod.ts";
29+
import * as mapping from "https://deno.land/x/denops_std/mapping/mod.ts";
30+
31+
export async function main(denops: Denops): Promise<void> {
32+
await mapping.map(denops, "<Plug>(test-denops-std)", "Hello", {
33+
mode: ["n", "i", "x"],
34+
});
35+
}
36+
```
37+
2538
### unmap
2639

2740
Use `unmap()` to unregister a mapping like:
@@ -43,6 +56,23 @@ export async function main(denops: Denops): Promise<void> {
4356
}
4457
```
4558

59+
Users can specify multiple `mode` value like:
60+
61+
```typescript
62+
import { Denops } from "https://deno.land/x/denops_std/mod.ts";
63+
import * as mapping from "https://deno.land/x/denops_std/mapping/mod.ts";
64+
65+
export async function main(denops: Denops): Promise<void> {
66+
await mapping.map(denops, "<Plug>(test-denops-std)", "Hello", {
67+
mode: ["n", "i", "x"],
68+
});
69+
70+
await mapping.unmap(denops, "<Plug>(test-denops-std)", {
71+
mode: ["n", "i", "x"],
72+
});
73+
}
74+
```
75+
4676
### read
4777

4878
Use `read()` to read a mapping like:

denops_std/mapping/mod.ts

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import { Denops } from "../deps.ts";
22
import * as fn from "../function/mod.ts";
3+
import * as batch from "../batch/mod.ts";
34
import { Mapping, Mode } from "./types.ts";
45
import { parse } from "./parser.ts";
56

67
export type MapOptions = {
7-
mode?: Mode;
8+
mode?: Mode | Mode[];
89
noremap?: boolean;
910
script?: boolean;
1011
buffer?: boolean;
@@ -23,7 +24,7 @@ export async function map(
2324
rhs: string,
2425
options: MapOptions = {},
2526
): Promise<void> {
26-
const mode = options.mode ?? "";
27+
const modes = forceArray(options.mode ?? "");
2728
const prefix = options.noremap ? "nore" : "";
2829
const arg = [
2930
options.buffer ? "<buffer>" : "",
@@ -33,11 +34,15 @@ export async function map(
3334
options.expr ? "<expr>" : "",
3435
options.unique ? "<unique>" : "",
3536
].filter((v) => v).join("");
36-
await denops.cmd(`${mode}${prefix}map ${arg} ${lhs} ${rhs}`);
37+
await batch.batch(denops, async (denops) => {
38+
for (const mode of modes) {
39+
await denops.cmd(`${mode}${prefix}map ${arg} ${lhs} ${rhs}`);
40+
}
41+
});
3742
}
3843

3944
export type UnmapOptions = {
40-
mode?: Mode;
45+
mode?: Mode | Mode[];
4146
};
4247

4348
/**
@@ -48,8 +53,12 @@ export async function unmap(
4853
lhs: string,
4954
options: UnmapOptions = {},
5055
): Promise<void> {
51-
const mode = options.mode ?? "";
52-
await denops.cmd(`${mode}unmap ${lhs}`);
56+
const modes = forceArray(options.mode ?? "");
57+
await batch.batch(denops, async (denops) => {
58+
for (const mode of modes) {
59+
await denops.cmd(`${mode}unmap ${lhs}`);
60+
}
61+
});
5362
}
5463

5564
export type ReadOptions = {
@@ -109,3 +118,7 @@ export async function list(
109118
const result = await fn.execute(denops, `${mode}map ${lhs}`) as string;
110119
return result.split(/\r?\n/).filter((v) => v).map(parse);
111120
}
121+
122+
function forceArray<T>(v: T | T[]): T[] {
123+
return Array.isArray(v) ? v : [v];
124+
}

denops_std/mapping/mod_test.ts

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,58 @@ for (const mode of modes) {
6666
},
6767
});
6868
}
69+
test({
70+
mode: "all",
71+
name: `map() registers multiple mappings (Xmap)`,
72+
fn: async (denops) => {
73+
const modes: Mode[] = ["n", "i", "x"];
74+
await mapping.map(denops, "<Plug>(test-denops-std)", "Hello", {
75+
mode: modes,
76+
});
77+
for (const mode of modes) {
78+
assertEquals(
79+
{
80+
...await mapping.read(denops, "<Plug>(test-denops-std)", { mode }),
81+
sid: 0,
82+
lnum: 0,
83+
},
84+
{
85+
...skeleton,
86+
mode,
87+
lhs: "<Plug>(test-denops-std)",
88+
rhs: "Hello",
89+
},
90+
);
91+
}
92+
},
93+
});
94+
test({
95+
mode: "all",
96+
name: `map() registers mapping (Xnoremap)`,
97+
fn: async (denops) => {
98+
const modes: Mode[] = ["n", "i", "x"];
99+
await mapping.map(denops, "<Plug>(test-denops-std)", "Hello", {
100+
mode: modes,
101+
noremap: true,
102+
});
103+
for (const mode of modes) {
104+
assertEquals(
105+
{
106+
...await mapping.read(denops, "<Plug>(test-denops-std)", { mode }),
107+
sid: 0,
108+
lnum: 0,
109+
},
110+
{
111+
...skeleton,
112+
mode,
113+
lhs: "<Plug>(test-denops-std)",
114+
rhs: "Hello",
115+
noremap: true,
116+
},
117+
);
118+
}
119+
},
120+
});
69121
test({
70122
mode: "all",
71123
name: `map() registers mapping (script)`,
@@ -235,6 +287,29 @@ for (const mode of modes) {
235287
prelude: ["let g:denops#enable_workaround_vim_before_8_2_3081 = 1"],
236288
});
237289
}
290+
test({
291+
mode: "all",
292+
name: `unmap() removes multiple mappings (Xunmap)`,
293+
fn: async (denops) => {
294+
const modes: Mode[] = ["n", "i", "x"];
295+
await mapping.map(denops, "<Plug>(test-denops-std)", "Hello", {
296+
mode: modes,
297+
});
298+
await mapping.unmap(denops, "<Plug>(test-denops-std)", {
299+
mode: modes,
300+
});
301+
for (const mode of modes) {
302+
await assertThrowsAsync(
303+
async () => {
304+
await mapping.read(denops, "<Plug>(test-denops-std)", { mode });
305+
},
306+
undefined,
307+
"No mapping found for",
308+
);
309+
}
310+
},
311+
prelude: ["let g:denops#enable_workaround_vim_before_8_2_3081 = 1"],
312+
});
238313

239314
for (const mode of modes) {
240315
test({

0 commit comments

Comments
 (0)