Skip to content

Commit

Permalink
👍 Add config function to popup module
Browse files Browse the repository at this point in the history
  • Loading branch information
lambdalisue committed Mar 13, 2024
1 parent 2c9403e commit 00b5bb5
Show file tree
Hide file tree
Showing 3 changed files with 101 additions and 7 deletions.
45 changes: 45 additions & 0 deletions popup/mod.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@
* col: 1,
* });
*
* // Config a popup window
* await popup.config(denops, popupWindow.winid, {
* title: "Hello, world!",
* });
*
* // Wiat 3 seconds
* await new Promise((resolve) => setTimeout(resolve, 3000));
*
Expand Down Expand Up @@ -77,10 +82,12 @@ import * as fn from "../function/mod.ts";
import type { OpenOptions, PopupWindow } from "./types.ts";
import {
closePopup as closePopupVim,
configPopup as configPopupVim,
openPopup as openPopupVim,
} from "./vim.ts";
import {
closePopup as closePopupNvim,
configPopup as configPopupNvim,
openPopup as openPopupNvim,
} from "./nvim.ts";

Expand Down Expand Up @@ -168,4 +175,42 @@ export async function open(
};
}

/**
* Config a popup window in Vim/Neovim compatible way.
*
* ```typescript
* import type { Denops } from "https://deno.land/x/denops_std@$MODULE_VERSION/mod.ts";
* import * as popup from "https://deno.land/x/denops_std@$MODULE_VERSION/popup/mod.ts";
*
* export async function main(denops: Denops): Promise<void> {
* // Open a popup window
* await using popupWindow = await popup.open(denops, {
* relative: "editor",
* width: 20,
* height: 20,
* row: 1,
* col: 1,
* });
*
* // Config a popup window
* await popup.config(denops, popupWindow.winid, {
* title: "Hello, world!",
* });
* }
* ```
*
* Note that this function does NOT work in `batch.collect()`.
*/
export async function config(
denops: Denops,
winid: number,
options: Partial<Omit<OpenOptions, "bufnr">>,

Check warning on line 207 in popup/mod.ts

View check run for this annotation

Codecov / codecov/patch

popup/mod.ts#L203-L207

Added lines #L203 - L207 were not covered by tests
): Promise<void> {
const config = denops.meta.host === "vim" ? configPopupVim : configPopupNvim;
await config(denops, winid, options);
if (!options.noRedraw) {
await denops.redraw();
}
}

Check warning on line 214 in popup/mod.ts

View check run for this annotation

Codecov / codecov/patch

popup/mod.ts#L209-L214

Added lines #L209 - L214 were not covered by tests

export type { OpenOptions, PopupWindow } from "./types.ts";
38 changes: 34 additions & 4 deletions popup/nvim.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { ulid } from "https://deno.land/std@0.217.0/ulid/mod.ts";

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

const cacheKey = "denops_std/popup/nvim.ts@1";
const cacheKey = "denops_std/popup/nvim.ts@2";

async function ensurePrerequisites(denops: Denops): Promise<string> {
if (typeof denops.context[cacheKey] === "string") {
Expand All @@ -21,6 +21,12 @@ async function ensurePrerequisites(denops: Denops): Promise<string> {
endif
return winid
endfunction
function! DenopsStdPopupNvimWinSetConfig_${suffix}(winid, config, winhighlight) abort
call nvim_win_set_config(a:winid, a:config)
if a:winhighlight isnot v:null
call nvim_win_set_option(winid, 'winhighlight', a:winhighlight)
endif
endfunction
`;
await execute(denops, script);
return suffix;
Expand All @@ -42,12 +48,36 @@ export async function openPopup(
) as number;
}

export async function configPopup(
denops: Denops,
winid: number,
options: Partial<Omit<OpenOptions, "bufnr" | "noRedraw">>,

Check warning on line 54 in popup/nvim.ts

View check run for this annotation

Codecov / codecov/patch

popup/nvim.ts#L51-L54

Added lines #L51 - L54 were not covered by tests
): Promise<void> {
const suffix = await ensurePrerequisites(denops);
const nvimWinSetConfig = toNvimWinSetConfig(options);
const winhighlight = toNvimWinhighlight(options.highlight);
await denops.call(
`DenopsStdPopupNvimWinSetConfig_${suffix}`,
winid,
nvimWinSetConfig,
winhighlight,

Check warning on line 63 in popup/nvim.ts

View check run for this annotation

Codecov / codecov/patch

popup/nvim.ts#L56-L63

Added lines #L56 - L63 were not covered by tests
);
}

Check warning on line 65 in popup/nvim.ts

View check run for this annotation

Codecov / codecov/patch

popup/nvim.ts#L65

Added line #L65 was not covered by tests

export async function closePopup(denops: Denops, winid: number): Promise<void> {
await nvimFn.nvim_win_close(denops, winid, true);
}

function toNvimOpenWinConfig(options: OpenOptions): nvimFn.NvimOpenWinConfig {
const v: nvimFn.NvimOpenWinConfig = {
function toNvimOpenWinConfig(
options: Omit<OpenOptions, "bufnr" | "noRedraw">,
): nvimFn.NvimOpenWinConfig {
return toNvimWinSetConfig(options) as nvimFn.NvimOpenWinConfig;
}

function toNvimWinSetConfig(
options: Partial<Omit<OpenOptions, "bufnr" | "noRedraw">>,
): Partial<nvimFn.NvimOpenWinConfig> {
const v: Partial<nvimFn.NvimOpenWinConfig> = {
relative: options.relative,
anchor: options.anchor,
width: options.width,
Expand All @@ -63,7 +93,7 @@ function toNvimOpenWinConfig(options: OpenOptions): nvimFn.NvimOpenWinConfig {
Object
.entries(v)
.filter(([, v]) => v != undefined),
) as nvimFn.NvimOpenWinConfig;
) as Partial<nvimFn.NvimOpenWinConfig>;
}

function toNvimBorder(
Expand Down
25 changes: 22 additions & 3 deletions popup/vim.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,35 @@ export function openPopup(
>;
}

export function configPopup(
denops: Denops,
winid: number,
options: Partial<Omit<OpenOptions, "bufnr" | "noRedraw">>,

Check warning on line 21 in popup/vim.ts

View check run for this annotation

Codecov / codecov/patch

popup/vim.ts#L18-L21

Added lines #L18 - L21 were not covered by tests
): Promise<void> {
const popupSetOptionsOptions = toPopupSetOptionsOptions(options);
return vimFn.popup_setoptions(denops, winid, popupSetOptionsOptions);
}

Check warning on line 25 in popup/vim.ts

View check run for this annotation

Codecov / codecov/patch

popup/vim.ts#L23-L25

Added lines #L23 - L25 were not covered by tests

export async function closePopup(denops: Denops, winid: number): Promise<void> {
await vimFn.popup_close(denops, winid);
}

function toPopupCreateOptions(options: OpenOptions): vimFn.PopupCreateOptions {
function toPopupCreateOptions(
options: Omit<OpenOptions, "bufnr" | "noRedraw">,
): vimFn.PopupCreateOptions {
return {
...toPopupSetOptionsOptions(options),
posinvert: false, // To keep consistent with the behavior of Neovim's floating window
};
}

function toPopupSetOptionsOptions(
options: Partial<Omit<OpenOptions, "bufnr" | "noRedraw">>,
): vimFn.PopupSetOptionsOptions {
const v: vimFn.PopupCreateOptions = {
line: options.row,
col: options.col,
pos: options.anchor ? posFromAnchor(options.anchor) : undefined,
posinvert: false, // To keep consistent with the behavior of Neovim's floating window
fixed: true, // To keep consistent with the behavior of Neovim's floating window
flip: false, // To keep consistent with the behavior of Neovim's floating window
maxheight: options.height,
Expand All @@ -48,7 +67,7 @@ function toPopupCreateOptions(options: OpenOptions): vimFn.PopupCreateOptions {
Object
.entries(v)
.filter(([, v]) => v != undefined),
) as vimFn.PopupCreateOptions;
) as vimFn.PopupSetOptionsOptions;
}

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

0 comments on commit 00b5bb5

Please sign in to comment.