# HG changeset patch # User Christian Brabandt # Date 1488397505 -3600 # Node ID fb2bcfa6a8de6323f6bd0a436cac6204cb9b87e6 # Parent dd6c3eab630bf29bccf3efef2a77afdd0a48d656 patch 8.0.0396: 'balloonexpr' only works synchronously commit https://github.com/vim/vim/commit/59716a27bd5c6c64def6c3ca430ff1246deae749 Author: Bram Moolenaar Date: Wed Mar 1 20:32:44 2017 +0100 patch 8.0.0396: 'balloonexpr' only works synchronously Problem: 'balloonexpr' only works synchronously. Solution: Add balloon_show(). (Jusufadis Bakamovic, closes https://github.com/vim/vim/issues/1449) diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1981,19 +1981,20 @@ argidx() Number current index in the a arglistid([{winnr} [, {tabnr}]]) Number argument list id argv({nr}) String {nr} entry of the argument list argv() List the argument list -assert_equal({exp}, {act} [, {msg}]) none assert {exp} is equal to {act} -assert_exception({error} [, {msg}]) none assert {error} is in v:exception -assert_fails({cmd} [, {error}]) none assert {cmd} fails -assert_false({actual} [, {msg}]) none assert {actual} is false +assert_equal({exp}, {act} [, {msg}]) none assert {exp} is equal to {act} +assert_exception({error} [, {msg}]) none assert {error} is in v:exception +assert_fails({cmd} [, {error}]) none assert {cmd} fails +assert_false({actual} [, {msg}]) none assert {actual} is false assert_inrange({lower}, {upper}, {actual} [, {msg}]) none assert {actual} is inside the range -assert_match({pat}, {text} [, {msg}]) none assert {pat} matches {text} +assert_match({pat}, {text} [, {msg}]) none assert {pat} matches {text} assert_notequal({exp}, {act} [, {msg}]) none assert {exp} is not equal {act} assert_notmatch({pat}, {text} [, {msg}]) none assert {pat} not matches {text} -assert_true({actual} [, {msg}]) none assert {actual} is true +assert_true({actual} [, {msg}]) none assert {actual} is true asin({expr}) Float arc sine of {expr} atan({expr}) Float arc tangent of {expr} atan2({expr1}, {expr2}) Float arc tangent of {expr1} / {expr2} +balloon_show({msg}) none show {msg} inside the balloon browse({save}, {title}, {initdir}, {default}) String put up a file requester browsedir({title}, {initdir}) String put up a directory requester @@ -2619,6 +2620,25 @@ atan2({expr1}, {expr2}) *atan2()* < 2.356194 {only available when compiled with the |+float| feature} +balloon_show({msg}) *balloon_show()* + Show {msg} inside the balloon. + Example: > + func GetBalloonContent() + " initiate getting the content + return '' + endfunc + set balloonexpr=GetBalloonContent() + + func BalloonCallback(result) + call balloon_show(a:result) + endfunc +< + The intended use is that fetching the content of the balloon + is initiated from 'balloonexpr'. It will invoke an + asynchronous method, in which a callback invokes + balloon_show(). The 'balloonexpr' itself can return an + empty string or a placeholder. + {only available when compiled with the +beval feature} *browse()* browse({save}, {title}, {initdir}, {default}) diff --git a/src/evalfunc.c b/src/evalfunc.c --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -58,6 +58,9 @@ static void f_asin(typval_T *argvars, ty static void f_atan(typval_T *argvars, typval_T *rettv); static void f_atan2(typval_T *argvars, typval_T *rettv); #endif +#ifdef FEAT_BEVAL +static void f_balloon_show(typval_T *argvars, typval_T *rettv); +#endif static void f_browse(typval_T *argvars, typval_T *rettv); static void f_browsedir(typval_T *argvars, typval_T *rettv); static void f_bufexists(typval_T *argvars, typval_T *rettv); @@ -484,6 +487,9 @@ static struct fst {"atan", 1, 1, f_atan}, {"atan2", 2, 2, f_atan2}, #endif +#ifdef FEAT_BEVAL + {"balloon_show", 1, 1, f_balloon_show}, +#endif {"browse", 4, 4, f_browse}, {"browsedir", 2, 2, f_browsedir}, {"bufexists", 1, 1, f_bufexists}, @@ -1363,6 +1369,17 @@ f_atan2(typval_T *argvars, typval_T *ret #endif /* + * "balloon_show()" function + */ +#ifdef FEAT_BEVAL + static void +f_balloon_show(typval_T *argvars, typval_T *rettv UNUSED) +{ + gui_mch_post_balloon(balloonEval, get_tv_string_chk(&argvars[0])); +} +#endif + +/* * "browse(save, title, initdir, default)" function */ static void diff --git a/src/os_unix.c b/src/os_unix.c --- a/src/os_unix.c +++ b/src/os_unix.c @@ -467,6 +467,12 @@ mch_inchar( if ((wait_time < 0 || wait_time > 100L) && channel_any_readahead()) wait_time = 10L; #endif +#ifdef FEAT_BEVAL + if (p_beval && wait_time > 100L) + /* The 'balloonexpr' may indirectly invoke a callback while waiting + * for a character, need to check often. */ + wait_time = 100L; +#endif /* * We want to be interrupted by the winch signal diff --git a/src/os_win32.c b/src/os_win32.c --- a/src/os_win32.c +++ b/src/os_win32.c @@ -1467,6 +1467,12 @@ WaitForChar(long msec) dwWaitTime = 10; } #endif +#ifdef FEAT_BEVAL + if (p_beval && dwWaitTime > 100) + /* The 'balloonexpr' may indirectly invoke a callback while + * waiting for a character, need to check often. */ + dwWaitTime = 100; +#endif #ifdef FEAT_MZSCHEME if (mzthreads_allowed() && p_mzq > 0 && (msec < 0 || (long)dwWaitTime > p_mzq)) diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -765,6 +765,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 396, +/**/ 395, /**/ 394,