Skip to content

Commit 0b3c937

Browse files
authored
Merge pull request #175 from vim-denops/support-bang
👍 Add `bang` option on `buffer.open` function
2 parents 125afab + 006f5b7 commit 0b3c937

File tree

2 files changed

+35
-3
lines changed

2 files changed

+35
-3
lines changed

denops_std/buffer/buffer.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ async function ensurePrerequisites(denops: Denops): Promise<string> {
2424
}
2525
denops.context[cacheKey] = true;
2626
const script = `
27-
function! DenopsStdBufferOpen_${suffix}(mods, opener, cmdarg, bufname) abort
28-
execute printf('%s %s %s \`=a:bufname\`', a:mods, a:opener, a:cmdarg)
27+
function! DenopsStdBufferOpen_${suffix}(bang, mods, opener, cmdarg, bufname) abort
28+
execute printf('%s %s%s %s \`=a:bufname\`', a:mods, a:opener, a:bang ? '!' : '', a:cmdarg)
2929
return {
3030
\\ 'winid': win_getid(),
3131
\\ 'bufnr': bufnr(),
@@ -186,11 +186,13 @@ export async function open(
186186
options: OpenOptions = {},
187187
): Promise<OpenResult> {
188188
const suffix = await ensurePrerequisites(denops);
189+
const bang = options.bang ?? false;
189190
const mods = options.mods ?? "";
190191
const cmdarg = options.cmdarg ?? "";
191192
const opener = options.opener ?? "edit";
192193
return await denops.call(
193194
`DenopsStdBufferOpen_${suffix}`,
195+
bang,
194196
mods,
195197
opener,
196198
cmdarg,
@@ -199,6 +201,7 @@ export async function open(
199201
}
200202

201203
export interface OpenOptions {
204+
bang?: boolean;
202205
mods?: string;
203206
cmdarg?: string;
204207
opener?: string;

denops_std/buffer/buffer_test.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
import { assertEquals } from "https://deno.land/std@0.171.0/testing/asserts.ts";
1+
import {
2+
assertEquals,
3+
assertRejects,
4+
} from "https://deno.land/std@0.171.0/testing/asserts.ts";
25
import { test } from "https://deno.land/x/denops_test@v1.0.1/mod.ts";
36
import { default as Encoding } from "https://cdn.skypack.dev/encoding-japanese@2.0.0/";
47
import * as fn from "../function/mod.ts";
@@ -59,6 +62,32 @@ test({
5962
assertEquals(await fn.tabpagenr(denops), info.tabpagenr);
6063
},
6164
});
65+
await t.step({
66+
name: "opens a new buffer fails when modified (nohidden)",
67+
fn: async () => {
68+
await denops.cmd("set modified nohidden");
69+
await assertRejects(
70+
() => open(denops, "Hello world"),
71+
Error,
72+
"No write since last change (add ! to override)",
73+
);
74+
await denops.cmd("set nomodified");
75+
},
76+
});
77+
await t.step({
78+
name: "opens a new buffer when modified with bang (nohidden)",
79+
fn: async () => {
80+
await denops.cmd("set modified nohidden");
81+
const info = await open(denops, "Hello world", { bang: true });
82+
const bufname = await fn.bufname(denops);
83+
assertEquals("Hello world", bufname);
84+
assertEquals(await fn.win_getid(denops), info.winid);
85+
assertEquals(await fn.bufnr(denops), info.bufnr);
86+
assertEquals(await fn.winnr(denops), info.winnr);
87+
assertEquals(await fn.tabpagenr(denops), info.tabpagenr);
88+
await denops.cmd("set nomodified");
89+
},
90+
});
6291
},
6392
});
6493

0 commit comments

Comments
 (0)