diff options
author | bfredl <bjorn.linse@gmail.com> | 2023-10-10 16:36:55 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-10 16:36:55 +0200 |
commit | fd39f5ce8c9bbda1b77ff6c03553148fadac5d57 (patch) | |
tree | c0c05713b01fa9d99ccbafbe87149366e1db69ce /src | |
parent | 468a3a14072a638865681dad88d3c3b31cf11e23 (diff) | |
parent | 372aa2eb3db375385cf19dc0a6571f790b858241 (diff) | |
download | rneovim-fd39f5ce8c9bbda1b77ff6c03553148fadac5d57.tar.gz rneovim-fd39f5ce8c9bbda1b77ff6c03553148fadac5d57.tar.bz2 rneovim-fd39f5ce8c9bbda1b77ff6c03553148fadac5d57.zip |
Merge pull request #25561 from glepnir/9663
feat(float): add fclose command
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/ex_cmds.lua | 6 | ||||
-rw-r--r-- | src/nvim/ex_docmd.c | 6 | ||||
-rw-r--r-- | src/nvim/window.c | 26 |
3 files changed, 38 insertions, 0 deletions
diff --git a/src/nvim/ex_cmds.lua b/src/nvim/ex_cmds.lua index 88f3bc0b43..27f8535a1c 100644 --- a/src/nvim/ex_cmds.lua +++ b/src/nvim/ex_cmds.lua @@ -1045,6 +1045,12 @@ module.cmds = { func='ex_function', }, { + command='fclose', + flags=bit.bor(BANG, RANGE), + addr_type='ADDR_OTHER', + func='ex_floatclose', + }, + { command='global', flags=bit.bor(RANGE, WHOLEFOLD, BANG, EXTRA, DFLALL, SBOXOK, CMDWIN, LOCK_OK), addr_type='ADDR_LINES', diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index 2214b851c7..36355ce89b 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -7354,6 +7354,12 @@ static void ex_terminal(exarg_T *eap) do_cmdline_cmd(ex_cmd); } +/// ":fclose" +static void ex_floatclose(exarg_T *eap) +{ + win_float_remove(eap->forceit, eap->line1); +} + void verify_command(char *cmd) { if (strcmp("smile", cmd) != 0) { diff --git a/src/nvim/window.c b/src/nvim/window.c index db5e7e1fb0..bb2e08158f 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -7656,3 +7656,29 @@ win_T *lastwin_nofloating(void) } return res; } + +static int floating_zindex_compare(const void *a, const void *b) +{ + return (*(win_T **)b)->w_float_config.zindex - (*(win_T **)a)->w_float_config.zindex; +} + +void win_float_remove(bool bang, int count) +{ + kvec_t(win_T *) float_win_arr = KV_INITIAL_VALUE; + for (win_T *wp = lastwin; wp && wp->w_floating; wp = wp->w_prev) { + kv_push(float_win_arr, wp); + } + qsort(float_win_arr.items, float_win_arr.size, sizeof(win_T *), floating_zindex_compare); + for (size_t i = 0; i < float_win_arr.size; i++) { + if (win_close(float_win_arr.items[i], false, false) == FAIL) { + break; + } + if (!bang) { + count--; + if (count == 0) { + break; + } + } + } + kv_destroy(float_win_arr); +} |