Skip to content

Commit 00b5bb5

Browse files
committed
👍 Add config function to popup module
1 parent 2c9403e commit 00b5bb5

File tree

3 files changed

+101
-7
lines changed

3 files changed

+101
-7
lines changed

popup/mod.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@
2525
* col: 1,
2626
* });
2727
*
28+
* // Config a popup window
29+
* await popup.config(denops, popupWindow.winid, {
30+
* title: "Hello, world!",
31+
* });
32+
*
2833
* // Wiat 3 seconds
2934
* await new Promise((resolve) => setTimeout(resolve, 3000));
3035
*
@@ -77,10 +82,12 @@ import * as fn from "../function/mod.ts";
7782
import type { OpenOptions, PopupWindow } from "./types.ts";
7883
import {
7984
closePopup as closePopupVim,
85+
configPopup as configPopupVim,
8086
openPopup as openPopupVim,
8187
} from "./vim.ts";
8288
import {
8389
closePopup as closePopupNvim,
90+
configPopup as configPopupNvim,
8491
openPopup as openPopupNvim,
8592
} from "./nvim.ts";
8693

@@ -168,4 +175,42 @@ export async function open(
168175
};
169176
}
170177

178+
/**
179+
* Config a popup window in Vim/Neovim compatible way.
180+
*
181+
* ```typescript
182+
* import type { Denops } from "https://deno.land/x/denops_std@$MODULE_VERSION/mod.ts";
183+
* import * as popup from "https://deno.land/x/denops_std@$MODULE_VERSION/popup/mod.ts";
184+
*
185+
* export async function main(denops: Denops): Promise<void> {
186+
* // Open a popup window
187+
* await using popupWindow = await popup.open(denops, {
188+
* relative: "editor",
189+
* width: 20,
190+
* height: 20,
191+
* row: 1,
192+
* col: 1,
193+
* });
194+
*
195+
* // Config a popup window
196+
* await popup.config(denops, popupWindow.winid, {
197+
* title: "Hello, world!",
198+
* });
199+
* }
200+
* ```
201+
*
202+
* Note that this function does NOT work in `batch.collect()`.
203+
*/
204+
export async function config(
205+
denops: Denops,
206+
winid: number,
207+
options: Partial<Omit<OpenOptions, "bufnr">>,
208+
): Promise<void> {
209+
const config = denops.meta.host === "vim" ? configPopupVim : configPopupNvim;
210+
await config(denops, winid, options);
211+
if (!options.noRedraw) {
212+
await denops.redraw();
213+
}
214+
}
215+
171216
export type { OpenOptions, PopupWindow } from "./types.ts";

popup/nvim.ts

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { ulid } from "https://deno.land/std@0.217.0/ulid/mod.ts";
55

66
import type { Border, OpenOptions } from "./types.ts";
77

8-
const cacheKey = "denops_std/popup/nvim.ts@1";
8+
const cacheKey = "denops_std/popup/nvim.ts@2";
99

1010
async function ensurePrerequisites(denops: Denops): Promise<string> {
1111
if (typeof denops.context[cacheKey] === "string") {
@@ -21,6 +21,12 @@ async function ensurePrerequisites(denops: Denops): Promise<string> {
2121
endif
2222
return winid
2323
endfunction
24+
function! DenopsStdPopupNvimWinSetConfig_${suffix}(winid, config, winhighlight) abort
25+
call nvim_win_set_config(a:winid, a:config)
26+
if a:winhighlight isnot v:null
27+
call nvim_win_set_option(winid, 'winhighlight', a:winhighlight)
28+
endif
29+
endfunction
2430
`;
2531
await execute(denops, script);
2632
return suffix;
@@ -42,12 +48,36 @@ export async function openPopup(
4248
) as number;
4349
}
4450

51+
export async function configPopup(
52+
denops: Denops,
53+
winid: number,
54+
options: Partial<Omit<OpenOptions, "bufnr" | "noRedraw">>,
55+
): Promise<void> {
56+
const suffix = await ensurePrerequisites(denops);
57+
const nvimWinSetConfig = toNvimWinSetConfig(options);
58+
const winhighlight = toNvimWinhighlight(options.highlight);
59+
await denops.call(
60+
`DenopsStdPopupNvimWinSetConfig_${suffix}`,
61+
winid,
62+
nvimWinSetConfig,
63+
winhighlight,
64+
);
65+
}
66+
4567
export async function closePopup(denops: Denops, winid: number): Promise<void> {
4668
await nvimFn.nvim_win_close(denops, winid, true);
4769
}
4870

49-
function toNvimOpenWinConfig(options: OpenOptions): nvimFn.NvimOpenWinConfig {
50-
const v: nvimFn.NvimOpenWinConfig = {
71+
function toNvimOpenWinConfig(
72+
options: Omit<OpenOptions, "bufnr" | "noRedraw">,
73+
): nvimFn.NvimOpenWinConfig {
74+
return toNvimWinSetConfig(options) as nvimFn.NvimOpenWinConfig;
75+
}
76+
77+
function toNvimWinSetConfig(
78+
options: Partial<Omit<OpenOptions, "bufnr" | "noRedraw">>,
79+
): Partial<nvimFn.NvimOpenWinConfig> {
80+
const v: Partial<nvimFn.NvimOpenWinConfig> = {
5181
relative: options.relative,
5282
anchor: options.anchor,
5383
width: options.width,
@@ -63,7 +93,7 @@ function toNvimOpenWinConfig(options: OpenOptions): nvimFn.NvimOpenWinConfig {
6393
Object
6494
.entries(v)
6595
.filter(([, v]) => v != undefined),
66-
) as nvimFn.NvimOpenWinConfig;
96+
) as Partial<nvimFn.NvimOpenWinConfig>;
6797
}
6898

6999
function toNvimBorder(

popup/vim.ts

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,35 @@ export function openPopup(
1515
>;
1616
}
1717

18+
export function configPopup(
19+
denops: Denops,
20+
winid: number,
21+
options: Partial<Omit<OpenOptions, "bufnr" | "noRedraw">>,
22+
): Promise<void> {
23+
const popupSetOptionsOptions = toPopupSetOptionsOptions(options);
24+
return vimFn.popup_setoptions(denops, winid, popupSetOptionsOptions);
25+
}
26+
1827
export async function closePopup(denops: Denops, winid: number): Promise<void> {
1928
await vimFn.popup_close(denops, winid);
2029
}
2130

22-
function toPopupCreateOptions(options: OpenOptions): vimFn.PopupCreateOptions {
31+
function toPopupCreateOptions(
32+
options: Omit<OpenOptions, "bufnr" | "noRedraw">,
33+
): vimFn.PopupCreateOptions {
34+
return {
35+
...toPopupSetOptionsOptions(options),
36+
posinvert: false, // To keep consistent with the behavior of Neovim's floating window
37+
};
38+
}
39+
40+
function toPopupSetOptionsOptions(
41+
options: Partial<Omit<OpenOptions, "bufnr" | "noRedraw">>,
42+
): vimFn.PopupSetOptionsOptions {
2343
const v: vimFn.PopupCreateOptions = {
2444
line: options.row,
2545
col: options.col,
2646
pos: options.anchor ? posFromAnchor(options.anchor) : undefined,
27-
posinvert: false, // To keep consistent with the behavior of Neovim's floating window
2847
fixed: true, // To keep consistent with the behavior of Neovim's floating window
2948
flip: false, // To keep consistent with the behavior of Neovim's floating window
3049
maxheight: options.height,
@@ -48,7 +67,7 @@ function toPopupCreateOptions(options: OpenOptions): vimFn.PopupCreateOptions {
4867
Object
4968
.entries(v)
5069
.filter(([, v]) => v != undefined),
51-
) as vimFn.PopupCreateOptions;
70+
) as vimFn.PopupSetOptionsOptions;
5271
}
5372

5473
function posFromAnchor(anchor: Anchor): vimFn.PopupCreateOptions["pos"] {

0 commit comments

Comments
 (0)