aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorglepnir <glephunter@gmail.com>2023-10-09 18:47:10 +0800
committerglepnir <glephunter@gmail.com>2023-10-10 21:17:08 +0800
commit372aa2eb3db375385cf19dc0a6571f790b858241 (patch)
tree6c90cc4a0c9aa152c46ebf7d7c2bc2c6bb7239e8 /src
parent9abced6ad95f6300ae80cd8b8aa124ebcf511b50 (diff)
downloadrneovim-372aa2eb3db375385cf19dc0a6571f790b858241.tar.gz
rneovim-372aa2eb3db375385cf19dc0a6571f790b858241.tar.bz2
rneovim-372aa2eb3db375385cf19dc0a6571f790b858241.zip
feat(float): add fclose command
Diffstat (limited to 'src')
-rw-r--r--src/nvim/ex_cmds.lua6
-rw-r--r--src/nvim/ex_docmd.c6
-rw-r--r--src/nvim/window.c26
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 eb89e0fc9d..e18912c8a0 100644
--- a/src/nvim/ex_docmd.c
+++ b/src/nvim/ex_docmd.c
@@ -7357,6 +7357,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 04b5afe624..d688c58ff5 100644
--- a/src/nvim/window.c
+++ b/src/nvim/window.c
@@ -7658,3 +7658,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);
+}