diff --git a/runtime/doc/api.txt b/runtime/doc/api.txt index 9cb8f72348..ad2c4a1a81 100644 --- a/runtime/doc/api.txt +++ b/runtime/doc/api.txt @@ -3238,28 +3238,20 @@ nvim_open_win({buffer}, {enter}, {config}) *nvim_open_win()* `eob` flag of 'fillchars' to a space char, and clearing the |hl-EndOfBuffer| region in 'winhighlight'. • border: Style of (optional) window border. This can either - be a string or an array. The string values are - • "none": No border (default). - • "single": A single line box. - • "double": A double line box. - • "rounded": Like "single", but with rounded corners - ("╭" etc.). - • "solid": Adds padding by a single whitespace cell. - • "shadow": A drop shadow effect by blending with the - background. - • If it is an array, it should have a length of eight or - any divisor of eight. The array will specify the eight - chars building up the border in a clockwise fashion - starting with the top-left corner. As an example, the - double box style could be specified as: > - [ "╔", "═" ,"╗", "║", "╝", "═", "╚", "║" ]. + be a string or an array. The string values are the same as + those described in 'winborder'. If it is an array, it + should have a length of eight or any divisor of eight. The + array will specify the eight chars building up the border + in a clockwise fashion starting with the top-left corner. + As an example, the double box style could be specified as: > + [ "╔", "═" ,"╗", "║", "╝", "═", "╚", "║" ]. < - If the number of chars are less than eight, they will be - repeated. Thus an ASCII border could be specified as > - [ "/", "-", \"\\\\\", "|" ], + If the number of chars are less than eight, they will be + repeated. Thus an ASCII border could be specified as > + [ "/", "-", \"\\\\\", "|" ], < - or all chars the same as > - [ "x" ]. + or all chars the same as > + [ "x" ]. < An empty string can be used to turn off a specific border, for instance, > diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index 9782846be5..7127e41d01 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -7105,6 +7105,18 @@ A jump table for the options with a short description can be found at |Q_op|. UI-dependent. Works best with RGB colors. 'termguicolors' + *'winborder'* +'winborder' string (default "") + global + Defines the default border style of floating windows. The default value + is empty, which is equivalent to "none". Valid values include: + - "none": No border. + - "single": A single line box. + - "double": A double line box. + - "rounded": Like "single", but with rounded corners ("╭" etc.). + - "solid": Adds padding by a single whitespace cell. + - "shadow": A drop shadow effect by blending with the background. + *'window'* *'wi'* 'window' 'wi' number (default screen height - 1) global diff --git a/runtime/lua/vim/_meta/api.lua b/runtime/lua/vim/_meta/api.lua index d74ee11b46..5fc1b4432e 100644 --- a/runtime/lua/vim/_meta/api.lua +++ b/runtime/lua/vim/_meta/api.lua @@ -1806,17 +1806,11 @@ function vim.api.nvim_open_term(buffer, opts) end --- 'fillchars' to a space char, and clearing the --- `hl-EndOfBuffer` region in 'winhighlight'. --- - border: Style of (optional) window border. This can either be a string ---- or an array. The string values are ---- - "none": No border (default). ---- - "single": A single line box. ---- - "double": A double line box. ---- - "rounded": Like "single", but with rounded corners ("╭" etc.). ---- - "solid": Adds padding by a single whitespace cell. ---- - "shadow": A drop shadow effect by blending with the background. ---- - If it is an array, it should have a length of eight or any divisor of ---- eight. The array will specify the eight chars building up the border ---- in a clockwise fashion starting with the top-left corner. As an ---- example, the double box style could be specified as: +--- or an array. The string values are the same as those described in 'winborder'. +--- If it is an array, it should have a length of eight or any divisor of +--- eight. The array will specify the eight chars building up the border +--- in a clockwise fashion starting with the top-left corner. As an +--- example, the double box style could be specified as: --- ``` --- [ "╔", "═" ,"╗", "║", "╝", "═", "╚", "║" ]. --- ``` diff --git a/runtime/lua/vim/_meta/options.lua b/runtime/lua/vim/_meta/options.lua index 01d5235d94..2ac3eafa2a 100644 --- a/runtime/lua/vim/_meta/options.lua +++ b/runtime/lua/vim/_meta/options.lua @@ -7778,6 +7778,19 @@ vim.o.winbl = vim.o.winblend vim.wo.winblend = vim.o.winblend vim.wo.winbl = vim.wo.winblend +--- Defines the default border style of floating windows. The default value +--- is empty, which is equivalent to "none". Valid values include: +--- - "none": No border. +--- - "single": A single line box. +--- - "double": A double line box. +--- - "rounded": Like "single", but with rounded corners ("╭" etc.). +--- - "solid": Adds padding by a single whitespace cell. +--- - "shadow": A drop shadow effect by blending with the background. +--- +--- @type string +vim.o.winborder = "" +vim.go.winborder = vim.o.winborder + --- Window height used for `CTRL-F` and `CTRL-B` when there is only one --- window and the value is smaller than 'lines' minus one. The screen --- will scroll 'window' minus two lines, with a minimum of one. diff --git a/src/nvim/api/win_config.c b/src/nvim/api/win_config.c index 6f5a9a90c0..030be72f4d 100644 --- a/src/nvim/api/win_config.c +++ b/src/nvim/api/win_config.c @@ -160,17 +160,11 @@ /// 'fillchars' to a space char, and clearing the /// |hl-EndOfBuffer| region in 'winhighlight'. /// - border: Style of (optional) window border. This can either be a string -/// or an array. The string values are -/// - "none": No border (default). -/// - "single": A single line box. -/// - "double": A double line box. -/// - "rounded": Like "single", but with rounded corners ("╭" etc.). -/// - "solid": Adds padding by a single whitespace cell. -/// - "shadow": A drop shadow effect by blending with the background. -/// - If it is an array, it should have a length of eight or any divisor of -/// eight. The array will specify the eight chars building up the border -/// in a clockwise fashion starting with the top-left corner. As an -/// example, the double box style could be specified as: +/// or an array. The string values are the same as those described in 'winborder'. +/// If it is an array, it should have a length of eight or any divisor of +/// eight. The array will specify the eight chars building up the border +/// in a clockwise fashion starting with the top-left corner. As an +/// example, the double box style could be specified as: /// ``` /// [ "╔", "═" ,"╗", "║", "╝", "═", "╚", "║" ]. /// ``` @@ -937,11 +931,11 @@ static void parse_border_style(Object style, WinConfig *fconfig, Error *err) char chars[8][MAX_SCHAR_SIZE]; bool shadow_color; } defaults[] = { - { "double", { "╔", "═", "╗", "║", "╝", "═", "╚", "║" }, false }, - { "single", { "┌", "─", "┐", "│", "┘", "─", "└", "│" }, false }, - { "shadow", { "", "", " ", " ", " ", " ", " ", "" }, true }, - { "rounded", { "╭", "─", "╮", "│", "╯", "─", "╰", "│" }, false }, - { "solid", { " ", " ", " ", " ", " ", " ", " ", " " }, false }, + { opt_winborder_values[0], { "╔", "═", "╗", "║", "╝", "═", "╚", "║" }, false }, + { opt_winborder_values[1], { "┌", "─", "┐", "│", "┘", "─", "└", "│" }, false }, + { opt_winborder_values[2], { "", "", " ", " ", " ", " ", " ", "" }, true }, + { opt_winborder_values[3], { "╭", "─", "╮", "│", "╯", "─", "╰", "│" }, false }, + { opt_winborder_values[4], { " ", " ", " ", " ", " ", " ", " ", " " }, false }, { NULL, { { NUL } }, false }, }; @@ -1282,12 +1276,13 @@ static bool parse_win_config(win_T *wp, Dict(win_config) *config, WinConfig *fco } } - if (HAS_KEY_X(config, border)) { + if (HAS_KEY_X(config, border) || *p_winbd != NUL) { if (is_split) { api_set_error(err, kErrorTypeValidation, "non-float cannot have 'border'"); goto fail; } - parse_border_style(config->border, fconfig, err); + Object style = config->border.type != kObjectTypeNil ? config->border : CSTR_AS_OBJ(p_winbd); + parse_border_style(style, fconfig, err); if (ERROR_SET(err)) { goto fail; } diff --git a/src/nvim/option_vars.h b/src/nvim/option_vars.h index 3bb2035e7c..08fa948217 100644 --- a/src/nvim/option_vars.h +++ b/src/nvim/option_vars.h @@ -608,6 +608,7 @@ EXTERN OptInt p_wcm; ///< 'wildcharm' EXTERN int p_wic; ///< 'wildignorecase' EXTERN char *p_wim; ///< 'wildmode' EXTERN int p_wmnu; ///< 'wildmenu' +EXTERN char *p_winbd; ///< 'winborder' EXTERN OptInt p_wh; ///< 'winheight' EXTERN OptInt p_wmh; ///< 'winminheight' EXTERN OptInt p_wmw; ///< 'winminwidth' diff --git a/src/nvim/options.lua b/src/nvim/options.lua index 97fe09f376..5c183c6caf 100644 --- a/src/nvim/options.lua +++ b/src/nvim/options.lua @@ -10167,6 +10167,26 @@ return { short_desc = N_('Controls transparency level for floating windows'), type = 'number', }, + { + defaults = { if_true = '' }, + cb = 'did_set_winborder', + values = { 'double', 'single', 'shadow', 'rounded', 'solid', 'none' }, + desc = [=[ + Defines the default border style of floating windows. The default value + is empty, which is equivalent to "none". Valid values include: + - "none": No border. + - "single": A single line box. + - "double": A double line box. + - "rounded": Like "single", but with rounded corners ("╭" etc.). + - "solid": Adds padding by a single whitespace cell. + - "shadow": A drop shadow effect by blending with the background. + ]=], + full_name = 'winborder', + scope = { 'global' }, + short_desc = N_('border of floating window'), + type = 'string', + varname = 'p_winbd', + }, { abbreviation = 'wi', cb = 'did_set_window', diff --git a/src/nvim/optionstr.c b/src/nvim/optionstr.c index 918443db9f..7f9f2e620e 100644 --- a/src/nvim/optionstr.c +++ b/src/nvim/optionstr.c @@ -2518,6 +2518,15 @@ const char *did_set_winhighlight(optset_T *args) return NULL; } +/// The 'winborder' option is changed. +const char *did_set_winborder(optset_T *args) +{ + if (check_opt_strings(p_winbd, opt_winborder_values, true) != OK) { + return e_invarg; + } + return NULL; +} + int expand_set_winhighlight(optexpand_T *args, int *numMatches, char ***matches) { return expand_set_opt_generic(args, get_highlight_name, numMatches, matches); diff --git a/test/functional/ui/float_spec.lua b/test/functional/ui/float_spec.lua index 57ef9bcff6..5cb31520c3 100644 --- a/test/functional/ui/float_spec.lua +++ b/test/functional/ui/float_spec.lua @@ -9514,6 +9514,116 @@ describe('float window', function() }) end end) + + it('#winborder option', function() + local buf = api.nvim_create_buf(false,false) + local config = {relative='editor', width=4, height=4, row=2, col=2} + command('set winborder=single') + api.nvim_open_win(buf, true, config) + if multigrid then + screen:expect({ + grid = [[ + ## grid 1 + [2:----------------------------------------]|*6 + [3:----------------------------------------]| + ## grid 2 + | + {0:~ }|*5 + ## grid 3 + | + ## grid 4 + {5:┌────┐}| + {5:│}{1:^ }{5:│}| + {5:│}{2:~ }{5:│}|*3 + {5:└────┘}| + ]], float_pos={ + [4] = {1001, "NW", 1, 2, 2, true, 50}; + }, win_viewport={ + [2] = {win = 1000, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1, sum_scroll_delta = 0}; + [4] = {win = 1001, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1, sum_scroll_delta = 0}; + }, win_viewport_margins={ + [2] = { + bottom = 0, + left = 0, + right = 0, + top = 0, + win = 1000 + }, + [4] = { + bottom = 1, + left = 1, + right = 1, + top = 1, + win = 1001 + } + } + }) + else + screen:expect({ + grid = [[ + {5:┌────┐} | + {0:~ }{5:│}{1:^ }{5:│}{0: }| + {0:~ }{5:│}{2:~ }{5:│}{0: }|*3 + {0:~ }{5:└────┘}{0: }| + | + ]] + }) + end + + command('fclose') + command('set winborder=double') + api.nvim_open_win(buf, true, config) + if multigrid then + screen:expect({ + grid = [[ + ## grid 1 + [2:----------------------------------------]|*6 + [3:----------------------------------------]| + ## grid 2 + | + {0:~ }|*5 + ## grid 3 + | + ## grid 5 + {5:╔════╗}| + {5:║}{1:^ }{5:║}| + {5:║}{2:~ }{5:║}|*3 + {5:╚════╝}| + ]], float_pos={ + [5] = {1002, "NW", 1, 2, 2, true, 50}; + }, win_viewport={ + [2] = {win = 1000, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1, sum_scroll_delta = 0}; + [5] = {win = 1002, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1, sum_scroll_delta = 0}; + }, win_viewport_margins={ + [2] = { + bottom = 0, + left = 0, + right = 0, + top = 0, + win = 1000 + }, + [5] = { + bottom = 1, + left = 1, + right = 1, + top = 1, + win = 1002 + } + } + }) + else + screen:expect({ + grid = [[ + {5:╔════╗} | + {0:~ }{5:║}{1:^ }{5:║}{0: }| + {0:~ }{5:║}{2:~ }{5:║}{0: }|*3 + {0:~ }{5:╚════╝}{0: }| + | + ]] + }) + end + command('fclose!') + end) end describe('with ext_multigrid', function() diff --git a/test/old/testdir/gen_opt_test.vim b/test/old/testdir/gen_opt_test.vim index be5a7e6ee4..5254481903 100644 --- a/test/old/testdir/gen_opt_test.vim +++ b/test/old/testdir/gen_opt_test.vim @@ -75,6 +75,7 @@ let test_values = { \ 'shada': [['', '''50', '"30'], ['xxx']], \ 'termpastefilter': [['BS', 'HT', 'FF', 'ESC', 'DEL', 'C0', 'C1', 'C0,C1'], \ ['xxx', 'C0,C1,xxx']], + \ 'winborder': [['rounded', 'none', 'single', 'solid'], ['xxx']], \ 'winhighlight': [['', 'a:b', 'a:', 'a:b,c:d'], \ ['a', ':', ':b', 'a:b:c', 'a:/', '/:b', ',', 'a:b,,', 'a:b,c']], \