0
0
mirror of https://github.com/vim/vim.git synced 2025-09-26 04:04:07 -04:00

patch 9.1.0500: cannot switch buffer in a popup

Problem:  cannot switch buffer in a popup
          (Yggdroot)
Solution: add popup_setbuf() function

fixes: #15006
closes: #15026

Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Christian Brabandt
2024-06-18 20:50:58 +02:00
parent 23c5ebeb95
commit fbc37f138a
17 changed files with 224 additions and 7 deletions

View File

@@ -153,8 +153,8 @@ diff_filler({lnum}) Number diff filler lines about {lnum}
diff_hlID({lnum}, {col}) Number diff highlighting at {lnum}/{col} diff_hlID({lnum}, {col}) Number diff highlighting at {lnum}/{col}
digraph_get({chars}) String get the |digraph| of {chars} digraph_get({chars}) String get the |digraph| of {chars}
digraph_getlist([{listall}]) List get all |digraph|s digraph_getlist([{listall}]) List get all |digraph|s
digraph_set({chars}, {digraph}) Boolean register |digraph| digraph_set({chars}, {digraph}) Bool register |digraph|
digraph_setlist({digraphlist}) Boolean register multiple |digraph|s digraph_setlist({digraphlist}) Bool register multiple |digraph|s
echoraw({expr}) none output {expr} as-is echoraw({expr}) none output {expr} as-is
empty({expr}) Number |TRUE| if {expr} is empty empty({expr}) Number |TRUE| if {expr} is empty
environ() Dict return environment variables environ() Dict return environment variables
@@ -429,6 +429,7 @@ popup_menu({what}, {options}) Number create a popup window used as a menu
popup_move({id}, {options}) none set position of popup window {id} popup_move({id}, {options}) none set position of popup window {id}
popup_notification({what}, {options}) popup_notification({what}, {options})
Number create a notification popup window Number create a notification popup window
popup_setbuf({id}, {buf}) Bool set the buffer for the popup window {id}
popup_setoptions({id}, {options}) popup_setoptions({id}, {options})
none set options for popup window {id} none set options for popup window {id}
popup_settext({id}, {text}) none set the text of popup window {id} popup_settext({id}, {text}) none set the text of popup window {id}

View File

@@ -1,4 +1,4 @@
*popup.txt* For Vim version 9.1. Last change: 2024 Jun 08 *popup.txt* For Vim version 9.1. Last change: 2024 Jun 16
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@@ -186,6 +186,7 @@ Manipulating a popup window:
|popup_move()| change the position and size of a popup |popup_move()| change the position and size of a popup
|popup_setoptions()| override options of a popup |popup_setoptions()| override options of a popup
|popup_settext()| replace the popup buffer contents |popup_settext()| replace the popup buffer contents
|popup_setbuf()| set the buffer for the popup window
Closing popup windows: Closing popup windows:
|popup_close()| close one popup |popup_close()| close one popup
@@ -574,6 +575,18 @@ popup_notification({what}, {options}) *popup_notification()*
Return type: |Number| Return type: |Number|
popup_setbuf({id}, {buf}) *popup_setbuf()*
Set buffer {buf} to be displayed in popup win {id}. For the
use of {buf}, see |bufname()| function.
May change window size or position to adjust for the size
of the buffer text.
Can also be used as a |method|: >
GetPopup()->popup_setbuf(bufnr('foobar'))
<
Return type: |vim9-boolean|
popup_setoptions({id}, {options}) *popup_setoptions()* popup_setoptions({id}, {options}) *popup_setoptions()*
Override options in popup {id} with entries in {options}. Override options in popup {id} with entries in {options}.
These options can be set: These options can be set:
@@ -613,9 +626,8 @@ popup_setoptions({id}, {options}) *popup_setoptions()*
popup_settext({id}, {text}) *popup_settext()* popup_settext({id}, {text}) *popup_settext()*
Set the text of the buffer in popup win {id}. {text} is the Set the text of the buffer in popup win {id}. {text} is
same as supplied to |popup_create()|, except that a buffer a string or a list of strings to be displayed in the popup.
number is not allowed.
Does not change the window size or position, other than caused Does not change the window size or position, other than caused
by the different text. by the different text.

View File

@@ -9433,6 +9433,7 @@ popup_menu() popup.txt /*popup_menu()*
popup_menu-shortcut-example popup.txt /*popup_menu-shortcut-example* popup_menu-shortcut-example popup.txt /*popup_menu-shortcut-example*
popup_move() popup.txt /*popup_move()* popup_move() popup.txt /*popup_move()*
popup_notification() popup.txt /*popup_notification()* popup_notification() popup.txt /*popup_notification()*
popup_setbuf() popup.txt /*popup_setbuf()*
popup_setoptions() popup.txt /*popup_setoptions()* popup_setoptions() popup.txt /*popup_setoptions()*
popup_settext() popup.txt /*popup_settext()* popup_settext() popup.txt /*popup_settext()*
popup_show() popup.txt /*popup_show()* popup_show() popup.txt /*popup_show()*

View File

@@ -1319,6 +1319,7 @@ Popup window: *popup-window-functions*
popup_move() change the position and size of a popup popup_move() change the position and size of a popup
popup_setoptions() override options of a popup popup_setoptions() override options of a popup
popup_settext() replace the popup buffer contents popup_settext() replace the popup buffer contents
popup_setbuf() set the popup buffer
popup_close() close one popup popup_close() close one popup
popup_clear() close all popups popup_clear() close all popups
popup_filter_menu() select from a list of items popup_filter_menu() select from a list of items

View File

@@ -1,4 +1,4 @@
*version9.txt* For Vim version 9.1. Last change: 2024 Jun 17 *version9.txt* For Vim version 9.1. Last change: 2024 Jun 18
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@@ -41586,6 +41586,7 @@ Functions: ~
|getregionpos()| get a list of positions for a region |getregionpos()| get a list of positions for a region
|matchbufline()| all the matches of a pattern in a buffer |matchbufline()| all the matches of a pattern in a buffer
|matchstrlist()| all the matches of a pattern in a List of strings |matchstrlist()| all the matches of a pattern in a List of strings
|popup_setbuf()| switch to a different buffer in a popup
Autocommands: ~ Autocommands: ~

View File

@@ -1133,6 +1133,7 @@ static argcheck_T arg2_number_bool[] = {arg_number, arg_bool};
static argcheck_T arg2_number_dict_any[] = {arg_number, arg_dict_any}; static argcheck_T arg2_number_dict_any[] = {arg_number, arg_dict_any};
static argcheck_T arg2_number_list[] = {arg_number, arg_list_any}; static argcheck_T arg2_number_list[] = {arg_number, arg_list_any};
static argcheck_T arg2_number_string[] = {arg_number, arg_string}; static argcheck_T arg2_number_string[] = {arg_number, arg_string};
static argcheck_T arg2_number_buffer[] = {arg_number, arg_buffer};
static argcheck_T arg2_number_string_or_list[] = {arg_number, arg_string_or_list_any}; static argcheck_T arg2_number_string_or_list[] = {arg_number, arg_string_or_list_any};
static argcheck_T arg2_str_or_nr_or_list_dict[] = {arg_str_or_nr_or_list, arg_dict_any}; static argcheck_T arg2_str_or_nr_or_list_dict[] = {arg_str_or_nr_or_list, arg_dict_any};
static argcheck_T arg2_string[] = {arg_string, arg_string}; static argcheck_T arg2_string[] = {arg_string, arg_string};
@@ -2421,6 +2422,8 @@ static funcentry_T global_functions[] =
ret_void, PROP_FUNC(f_popup_move)}, ret_void, PROP_FUNC(f_popup_move)},
{"popup_notification", 2, 2, FEARG_1, arg2_str_or_nr_or_list_dict, {"popup_notification", 2, 2, FEARG_1, arg2_str_or_nr_or_list_dict,
ret_number, PROP_FUNC(f_popup_notification)}, ret_number, PROP_FUNC(f_popup_notification)},
{"popup_setbuf", 2, 2, FEARG_1, arg2_number_buffer,
ret_number_bool, PROP_FUNC(f_popup_setbuf)},
{"popup_setoptions", 2, 2, FEARG_1, arg2_number_dict_any, {"popup_setoptions", 2, 2, FEARG_1, arg2_number_dict_any,
ret_void, PROP_FUNC(f_popup_setoptions)}, ret_void, PROP_FUNC(f_popup_setoptions)},
{"popup_settext", 2, 2, FEARG_1, arg2_number_string_or_list, {"popup_settext", 2, 2, FEARG_1, arg2_number_string_or_list,

View File

@@ -2844,6 +2844,54 @@ f_popup_settext(typval_T *argvars, typval_T *rettv UNUSED)
popup_adjust_position(wp); popup_adjust_position(wp);
} }
/*
* popup_setbuf({id}, {bufnr})
*/
void
f_popup_setbuf(typval_T *argvars, typval_T *rettv UNUSED)
{
int id;
win_T *wp;
buf_T *buf;
rettv->v_type = VAR_BOOL;
rettv->vval.v_number = VVAL_FALSE;
if (check_for_number_arg(argvars, 0) == FAIL
|| check_for_buffer_arg(argvars, 1) == FAIL)
return;
id = (int)tv_get_number(&argvars[0]);
wp = find_popup_win(id);
if (wp == NULL)
return;
buf = tv_get_buf_from_arg(&argvars[1]);
if (buf == NULL)
return;
#ifdef FEAT_TERMINAL
if (buf->b_term != NULL && popup_terminal_exists())
{
emsg(_(e_cannot_open_second_popup_with_terminal));
return;
}
#endif
if (wp->w_buffer != buf)
{
wp->w_buffer->b_nwindows--;
win_init_popup_win(wp, buf);
set_local_options_default(wp, FALSE);
swap_exists_action = SEA_READONLY;
buffer_ensure_loaded(buf);
swap_exists_action = SEA_NONE;
redraw_win_later(wp, UPD_NOT_VALID);
popup_adjust_position(wp);
}
rettv->vval.v_number = VVAL_TRUE;
}
static void static void
popup_free(win_T *wp) popup_free(win_T *wp)
{ {

View File

@@ -34,6 +34,7 @@ void f_popup_hide(typval_T *argvars, typval_T *rettv);
void popup_show(win_T *wp); void popup_show(win_T *wp);
void f_popup_show(typval_T *argvars, typval_T *rettv); void f_popup_show(typval_T *argvars, typval_T *rettv);
void f_popup_settext(typval_T *argvars, typval_T *rettv); void f_popup_settext(typval_T *argvars, typval_T *rettv);
void f_popup_setbuf(typval_T *argvars, typval_T *rettv);
int error_if_popup_window(int also_with_term); int error_if_popup_window(int also_with_term);
int popup_close(int id, int force); int popup_close(int id, int force);
int popup_close_tabpage(tabpage_T *tp, int id, int force); int popup_close_tabpage(tabpage_T *tp, int id, int force);

View File

@@ -0,0 +1,10 @@
> +0&#ffffff0@74
|~+0#4040ff13&| @73
|~| @73
|~| @73
|~| @33|t+0#0000001#ffd7ff255|e|s|t| +0#4040ff13#ffffff0@35
|~| @73
|~| @73
|~| @73
|~| @73
| +0#0000000&@56|0|,|0|-|1| @8|A|l@1|

View File

@@ -0,0 +1,10 @@
> +0&#ffffff0@74
|~+0#4040ff13&| @73
|~| @73
|~| @73
|~| @33|t+0#0000001#ffd7ff255|e|s|t| +0#4040ff13#ffffff0@35
|~| @73
|~| @73
|~| @73
|~| @73
|:+0#0000000&|c|a|l@1| |p|o|p|u|p|_|s|e|t|b|u|f|(|p|,| |'|f|o@1|b|a|r|.|t|x|t|'|)| @21|0|,|0|-|1| @8|A|l@1|

View File

@@ -0,0 +1,10 @@
|~+0#4040ff13#ffffff0| @73
|~| @73
|~| @73
|~| @33|t+0#0000001#ffd7ff255|e|s|t| +0#4040ff13#ffffff0@35
|~| @73
|~| @73
|~| @73
|~| @73
|E+0#ffffff16#e000002|1|2@1|0|:| |S|t|r|i|n|g| |o|r| |N|u|m|b|e|r| |r|e|q|u|i|r|e|d| |f|o|r| |a|r|g|u|m|e|n|t| |2| +0#0000000#ffffff0@27
|P+0#00e0003&|r|e|s@1| |E|N|T|E|R| |o|r| |t|y|p|e| |c|o|m@1|a|n|d| |t|o| |c|o|n|t|i|n|u|e> +0#0000000&@35

View File

@@ -0,0 +1,10 @@
>*+0#ffffff16#ffd7ff255|h+0#e000002&|e|l|p|.|t|x|t|*+0#ffffff16&| +0#0000001&@5|F|o|r| |V+0#00e0e07&|i|m| |v|e|r|s|i|o|n| |9|.|1|.| +0#0000001&@1|L|a|s|t| |c|h|a|n|g|e|:| |2|0|2|4| |M|a|y| |2|7| @11| +0#0000000#0000001
| +0#0000001#ffd7ff255@73| +0#0000000#a8a8a8255
| +0#0000001#ffd7ff255@23|V|I|M| |-| |m|a|i|n| |h|e|l|p| |f|i|l|e| @29| +0#0000000#a8a8a8255
| +0#0000001#ffd7ff255@72|k| +0#0000000#a8a8a8255
| +0#0000001#ffd7ff255@5|M|o|v|e| |a|r|o|u|n|d|:| @1|U|s|e| |t|h|e| |c|u|r|s|o|r| |k|e|y|s|,| |o|r| |"|h|"| |t|o| |g|o| |l|e|f|t|,| @11|h| @1| +0#0000000#a8a8a8255
| +0#0000001#ffd7ff255|l| @71| +0#0000000#a8a8a8255
| +0#0000001#ffd7ff255@19|"|j|"| |t|o| |g|o| |d|o|w|n|,| |"|k|"| |t|o| |g|o| |u|p|,| |"|l|"| |t|o| |g|o| |r|i|g|h|t|.| @6|j| +0#0000000#a8a8a8255
|C+0#0000001#ffd7ff255|l|o|s|e| |t|h|i|s| |w|i|n|d|o|w|:| @1|U|s|e| |"|:|q|<+0#e000e06&|E|n|t|e|r|>|"+0#0000001&|.| @37| +0#0000000#a8a8a8255
| +0#0000001#ffd7ff255@2|G|e|t| |o|u|t| |o|f| |V|i|m|:| @1|U|s|e| |"|:|q|a|!|<+0#e000e06&|E|n|t|e|r|>|"+0#0000001&| |(|c|a|r|e|f|u|l|,| |a|l@1| |c|h|a|n|g|e|s| |a|r|e| |l|o|s|t|!|)|.| @2| +0#0000000#a8a8a8255
| +0#0000001#ffd7ff255@73| +0#0000000#a8a8a8255

View File

@@ -0,0 +1,10 @@
>h+0#e000002#ffffff0|e|l|p|.|t|x|t| +0#0000000&@7|F|o|r| |V+0#00e0e07&|i|m| |v|e|r|s|i|o|n| |9|.|1|.| +0#0000000&@1|L|a|s|t| |c|h|a|n|g|e|:| |2|0|2|4| |M|a|y| |2|7| @12
@75
@24|V|I|M| |-| |m|a|i|n| |h|e|l|p| |f|i|l|e| @30
@73|k|
@6|M|o|v|e| |a|r|o|u|n|d|:| @1|U|s|e| |t|h|e| |c|u|r|s|o|r| |k|e| +0#0000001#ffd7ff255|s+0#0000000#ffffff0|,| |o|r| |"|h|"| |t|o| |g|o| |l|e|f|t|,| @11|h| @2
|l| @73
|h+3&&|e|l|p|.|t|x|t| |[|H|e|l|p|]|[|R|O|]| @37|1|,|1| @11|T|o|p
| +0&&@74
|[+1&&|N|o| |N|a|m|e|]| @47|0|,|0|-|1| @9|A|l@1
| +0&&@74

View File

@@ -0,0 +1,10 @@
>*+0#ffffff16#ffd7ff255|h+0#e000002&|e|l|p|.|t|x|t|*+0#ffffff16&| +0#0000001&@5|F|o|r| |V+0#00e0e07&|i|m| |v|e|r|s|i|o|n| |9|.|1|.| +0#0000001&@1|L|a|s|t| |c|h|a|n|g|e|:| |2|0|2|4| |M|a|y| |2|7| @11| +0#0000000#0000001
| +0#0000001#ffd7ff255@73| +0#0000000#a8a8a8255
| +0#0000001#ffd7ff255@23|V|I|M| |-| |m|a|i|n| |h|e|l|p| |f|i|l|e| @29| +0#0000000#a8a8a8255
| +0#0000001#ffd7ff255@72|k| +0#0000000#a8a8a8255
| +0#0000001#ffd7ff255@5|M|o|v|e| |a|r|o|u|n|d|:| @1|U|s|e| |t|h|e| |c|u|r|s|o|r| |k|e|y|s|,| |o|r| |"|h|"| |t|o| |g|o| |l|e|f|t|,| @11|h| @1| +0#0000000#a8a8a8255
| +0#0000001#ffd7ff255|l| @71| +0#0000000#a8a8a8255
| +0#0000001#ffd7ff255@19|"|j|"| |t|o| |g|o| |d|o|w|n|,| |"|k|"| |t|o| |g|o| |u|p|,| |"|l|"| |t|o| |g|o| |r|i|g|h|t|.| @6|j| +0#0000000#a8a8a8255
|C+0#0000001#ffd7ff255|l|o|s|e| |t|h|i|s| |w|i|n|d|o|w|:| @1|U|s|e| |"|:|q|<+0#e000e06&|E|n|t|e|r|>|"+0#0000001&|.| @37| +0#0000000#a8a8a8255
| +0#0000001#ffd7ff255@2|G|e|t| |o|u|t| |o|f| |V|i|m|:| @1|U|s|e| |"|:|q|a|!|<+0#e000e06&|E|n|t|e|r|>|"+0#0000001&| |(|c|a|r|e|f|u|l|,| |a|l@1| |c|h|a|n|g|e|s| |a|r|e| |l|o|s|t|!|)|.| @2| +0#0000000#a8a8a8255
| +0#0000001#ffd7ff255@73| +0#0000000#a8a8a8255

View File

@@ -2499,6 +2499,88 @@ func Test_popup_settext_null()
call popup_close(id) call popup_close(id)
endfunc endfunc
func Test_popup_setbuf()
CheckScreendump
let lines =<< trim END
let opts = #{wrap: 0}
let p = popup_create('test', opts)
let buf = bufnr('%')
END
call writefile(lines, 'XtestPopupSetBuf', 'D')
let buf = RunVimInTerminal('-S XtestPopupSetBuf', #{rows: 10})
call VerifyScreenDump(buf, 'Test_popup_setbuf_01', {})
" Setting to an non-existing buffer doesn't do anything
call term_sendkeys(buf, ":call popup_setbuf(p, 'foobar.txt')\<CR>")
call VerifyScreenDump(buf, 'Test_popup_setbuf_02', {})
" Error
call term_sendkeys(buf, ":call popup_setbuf(p, ['a','b','c'])\<CR>")
call VerifyScreenDump(buf, 'Test_popup_setbuf_03', {})
" Set to help window
call term_sendkeys(buf, ":help\<CR>")
call term_sendkeys(buf, ":call popup_setbuf(p, 'help.txt')\<CR>")
call VerifyScreenDump(buf, 'Test_popup_setbuf_04', {})
" Setting back to original buffer
call term_sendkeys(buf, ":call popup_setbuf(p, buf)\<CR>")
call VerifyScreenDump(buf, 'Test_popup_setbuf_05', {})
" use method
call term_sendkeys(buf, ":echo p->popup_setbuf('help.txt')\<CR>")
call VerifyScreenDump(buf, 'Test_popup_setbuf_06', {})
call term_sendkeys(buf, ":echo p->popup_setbuf(buf)\<CR>")
call VerifyScreenDump(buf, 'Test_popup_setbuf_05', {})
" clean up
call StopVimInTerminal(buf)
endfunc
func Test_popup_setbuf_terminal()
CheckFeature terminal
" Check Terminal Feature
let termbuf = term_start(&shell, #{hidden: 1})
" Wait for shell to start
call WaitForAssert({-> assert_equal("run", job_status(term_getjob(termbuf)))})
let popup = popup_create('test', {})
call assert_true(popup->popup_setbuf(termbuf))
call popup_close(popup)
let popup1 = popup_create(termbuf, #{minwidth: 40, minheight: 10, border: []})
let popup = popup_create('test', {})
try
call assert_fails(call popup_setbuf(popup, termbuf))
catch
endtry
call popup_close(popup)
call popup_close(popup1)
call assert_equal([], popup_list())
" Close the terminal
call term_sendkeys(termbuf, "exit\<CR>")
" Wait for shell to exit
call WaitForAssert({-> assert_equal("dead", job_status(term_getjob(termbuf)))})
endfunc
func Test_popup_setbuf_null()
let id = popup_create('', {})
call assert_false(popup_setbuf(id, -1))
call popup_close(id)
let id = popup_create('', {})
call assert_true(popup_setbuf(id, test_null_string()))
call assert_true(popup_setbuf(id, ''))
call popup_close(id)
call assert_false(popup_setbuf(id, 0))
endfunc
func Test_popup_hidden() func Test_popup_hidden()
new new

View File

@@ -3152,6 +3152,11 @@ def Test_popup_settext()
v9.CheckSourceDefAndScriptFailure(['popup_settext(1, 2)'], ['E1013: Argument 2: type mismatch, expected string but got number', 'E1222: String or List required for argument 2']) v9.CheckSourceDefAndScriptFailure(['popup_settext(1, 2)'], ['E1013: Argument 2: type mismatch, expected string but got number', 'E1222: String or List required for argument 2'])
enddef enddef
def Test_popup_setbuf()
v9.CheckSourceDefAndScriptFailure(['popup_setbuf([], "abc")'], ['E1013: Argument 1: type mismatch, expected number but got list<any>', 'E1210: Number required for argument 1'])
v9.CheckSourceDefAndScriptFailure(['popup_setbuf(1, [])'], ['E1013: Argument 2: type mismatch, expected string but got list<any>', 'E1220: String or Number required for argument 2'])
enddef
def Test_popup_show() def Test_popup_show()
v9.CheckSourceDefAndScriptFailure(['popup_show("a")'], ['E1013: Argument 1: type mismatch, expected number but got string', 'E1210: Number required for argument 1']) v9.CheckSourceDefAndScriptFailure(['popup_show("a")'], ['E1013: Argument 1: type mismatch, expected number but got string', 'E1210: Number required for argument 1'])
v9.CheckSourceDefAndScriptFailure(['popup_show(true)'], ['E1013: Argument 1: type mismatch, expected number but got bool', 'E1210: Number required for argument 1']) v9.CheckSourceDefAndScriptFailure(['popup_show(true)'], ['E1013: Argument 1: type mismatch, expected number but got bool', 'E1210: Number required for argument 1'])

View File

@@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
500,
/**/ /**/
499, 499,
/**/ /**/