Skip to content

Commit 9700f97

Browse files
authored
Merge pull request #135 from vim-denops/imp-buffer-open
👍 Improve `buffer.open()` functionality
2 parents 6718397 + 6c8baf2 commit 9700f97

File tree

3 files changed

+60
-13
lines changed

3 files changed

+60
-13
lines changed

denops_std/buffer/README.md

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,23 +29,33 @@ export async function main(denops: Denops): Promise<void> {
2929
}
3030
```
3131

32-
Use `split`, `vsplit`, `tabedit`, `pedit`, or whatever before if you'd like to
33-
open a buffer with non current window like:
32+
Use `split`, `vsplit`, `tabedit`, `pedit`, or whatever in `opener` attribute of
33+
the option like:
3434

3535
```typescript
3636
import { Denops } from "../mod.ts";
37-
import { batch } from "../batch/mod.ts";
3837
import { open } from "../buffer/mod.ts";
3938

4039
export async function main(denops: Denops): Promise<void> {
41-
await batch(denops, async (denops) => {
42-
await denops.cmd("split");
43-
await open(denops, "README.md");
44-
});
40+
await open(denops, "README.md", { opener: "split" });
4541
}
4642
```
4743

48-
See [`batch`](../batch/README.md) documentation for `batch()` part.
44+
Use a result value if you need window id, buffer number, window number, or
45+
tabpage number like:
46+
47+
```typescript
48+
import { Denops } from "../mod.ts";
49+
import { open } from "../buffer/mod.ts";
50+
51+
export async function main(denops: Denops): Promise<void> {
52+
const info = await open(denops, "README.md");
53+
console.log("winid:", info.winid);
54+
console.log("bufnr:", info.bufnr);
55+
console.log("winnr:", info.winnr);
56+
console.log("tabpagenr:", info.tabpagenr);
57+
}
58+
```
4959

5060
### reload
5161

denops_std/buffer/buffer.ts

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,15 @@ async function ensurePrerequisites(denops: Denops): Promise<string> {
2323
}
2424
denops.context[cacheKey] = true;
2525
const script = `
26+
function! DenopsStdBufferOpen_${suffix}(mods, opener, cmdarg, bufname) abort
27+
execute printf('%s %s %s \`=a:bufname\`', a:mods, a:opener, a:cmdarg)
28+
return {
29+
\\ 'winid': win_getid(),
30+
\\ 'bufnr': bufnr(),
31+
\\ 'winnr': winnr(),
32+
\\ 'tabpagenr': tabpagenr(),
33+
\\}
34+
endfunction
2635
function! DenopsStdBufferReload_${suffix}(bufnr) abort
2736
if bufnr('%') is# a:bufnr
2837
edit
@@ -91,6 +100,14 @@ async function ensurePrerequisites(denops: Denops): Promise<string> {
91100
export type OpenOptions = {
92101
mods?: string;
93102
cmdarg?: string;
103+
opener?: string;
104+
};
105+
106+
export type OpenResult = {
107+
winid: number;
108+
bufnr: number;
109+
winnr: number;
110+
tabpagenr: number;
94111
};
95112

96113
/**
@@ -100,10 +117,18 @@ export async function open(
100117
denops: Denops,
101118
bufname: string,
102119
options: OpenOptions = {},
103-
): Promise<void> {
120+
): Promise<OpenResult> {
121+
const suffix = await ensurePrerequisites(denops);
104122
const mods = options.mods ?? "";
105123
const cmdarg = options.cmdarg ?? "";
106-
await denops.cmd(`${mods} edit ${cmdarg} \`=bufname\``, { bufname });
124+
const opener = options.opener ?? "edit";
125+
return await denops.call(
126+
`DenopsStdBufferOpen_${suffix}`,
127+
mods,
128+
opener,
129+
cmdarg,
130+
bufname,
131+
) as OpenResult;
107132
}
108133

109134
/**

denops_std/buffer/buffer_test.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,28 +15,40 @@ test({
1515
mode: "all",
1616
name: "open opens a new buffer",
1717
fn: async (denops) => {
18-
await open(denops, "Hello world");
18+
const info = await open(denops, "Hello world");
1919
const bufname = await fn.bufname(denops);
2020
assertEquals("Hello world", bufname);
21+
assertEquals(await fn.win_getid(denops), info.winid);
22+
assertEquals(await fn.bufnr(denops), info.bufnr);
23+
assertEquals(await fn.winnr(denops), info.winnr);
24+
assertEquals(await fn.tabpagenr(denops), info.tabpagenr);
2125
},
2226
});
2327
test({
2428
mode: "all",
2529
name: "open opens a new buffer (remote buffer name)",
2630
fn: async (denops) => {
27-
await open(denops, "gin://this-is-valid-remote-buffer-name");
31+
const info = await open(denops, "gin://this-is-valid-remote-buffer-name");
2832
const bufname = await fn.bufname(denops);
2933
assertEquals("gin://this-is-valid-remote-buffer-name", bufname);
34+
assertEquals(await fn.win_getid(denops), info.winid);
35+
assertEquals(await fn.bufnr(denops), info.bufnr);
36+
assertEquals(await fn.winnr(denops), info.winnr);
37+
assertEquals(await fn.tabpagenr(denops), info.tabpagenr);
3038
},
3139
});
3240
test({
3341
mode: "all",
3442
name: "open opens a new buffer (symobls with percent-encoding)",
3543
fn: async (denops) => {
3644
const symbols = " !%22#$%&'()%2a+,-./:;%3c=%3e%3f@[\\]^`{%7c}~";
37-
await open(denops, `test://${symbols}`);
45+
const info = await open(denops, `test://${symbols}`);
3846
const bufname = await fn.bufname(denops);
3947
assertEquals(`test://${symbols}`, bufname);
48+
assertEquals(await fn.win_getid(denops), info.winid);
49+
assertEquals(await fn.bufnr(denops), info.bufnr);
50+
assertEquals(await fn.winnr(denops), info.winnr);
51+
assertEquals(await fn.tabpagenr(denops), info.tabpagenr);
4052
},
4153
});
4254

0 commit comments

Comments
 (0)