To: vim_dev@googlegroups.com Subject: Patch 8.1.1888 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.1.1888 Problem: More functions can be used as methods. Solution: Make various functions usable as a method. Files: runtime/doc/eval.txt, src/evalfunc.c, src/testdir/test_vimscript.vim, src/testdir/test_balloon_gui.vim, src/testdir/test_popup.vim, src/testdir/test_functions.vim, src/testdir/test_hide.vim, src/testdir/test_arglist.vim *** ../vim-8.1.1887/runtime/doc/eval.txt 2019-08-17 21:36:11.843341321 +0200 --- runtime/doc/eval.txt 2019-08-18 22:56:29.123820670 +0200 *************** *** 2933,2938 **** --- 2937,2944 ---- to a number. A List, Dict or Float argument causes an error. Example: > :let flag = and(bits, 0x80) + < Can also be used as a |method|: > + :let flag = bits->and(0x80) append({lnum}, {text}) *append()* *************** *** 3084,3089 **** --- 3090,3097 ---- func BalloonCallback(result) call balloon_show(a:result) endfunc + < Can also be used as a |method|: > + GetText()->balloon_show() < The intended use is that fetching the content of the balloon is initiated from 'balloonexpr'. It will invoke an *************** *** 3101,3107 **** splits are made for the current window size and optimize to show debugger output. Returns a |List| with the split lines. ! {only available when compiled with the |+balloon_eval_term| feature} *browse()* --- 3109,3118 ---- splits are made for the current window size and optimize to show debugger output. Returns a |List| with the split lines. ! Can also be used as a |method|: > ! GetText()->balloon_split()->balloon_show() ! ! < {only available when compiled with the |+balloon_eval_term| feature} *browse()* *************** *** 3140,3145 **** --- 3151,3158 ---- let bufnr = bufadd('someName') call bufload(bufnr) call setbufline(bufnr, 1, ['some', 'text']) + < Can also be used as a |method|: > + let bufnr = 'somename'->bufadd() bufexists({expr}) *bufexists()* The result is a Number, which is |TRUE| if a buffer called *************** *** 3162,3175 **** for MS-Windows 8.3 names in the form "c:\DOCUME~1" Use "bufexists(0)" to test for the existence of an alternate file name. ! *buffer_exists()* ! Obsolete name: buffer_exists(). buflisted({expr}) *buflisted()* The result is a Number, which is |TRUE| if a buffer called {expr} exists and is listed (has the 'buflisted' option set). The {expr} argument is used like with |bufexists()|. bufload({expr}) *bufload()* Ensure the buffer {expr} is loaded. When the buffer name refers to an existing file then the file is read. Otherwise --- 3175,3194 ---- for MS-Windows 8.3 names in the form "c:\DOCUME~1" Use "bufexists(0)" to test for the existence of an alternate file name. ! ! Can also be used as a |method|: > ! let exists = 'somename'->bufexists() ! < ! Obsolete name: buffer_exists(). *buffer_exists()* buflisted({expr}) *buflisted()* The result is a Number, which is |TRUE| if a buffer called {expr} exists and is listed (has the 'buflisted' option set). The {expr} argument is used like with |bufexists()|. + Can also be used as a |method|: > + let listed = 'somename'->buflisted() + bufload({expr}) *bufload()* Ensure the buffer {expr} is loaded. When the buffer name refers to an existing file then the file is read. Otherwise *************** *** 3179,3189 **** --- 3198,3214 ---- there will be no dialog, the buffer will be loaded anyway. The {expr} argument is used like with |bufexists()|. + Can also be used as a |method|: > + eval 'somename'->bufload() + bufloaded({expr}) *bufloaded()* The result is a Number, which is |TRUE| if a buffer called {expr} exists and is loaded (shown in a window or hidden). The {expr} argument is used like with |bufexists()|. + Can also be used as a |method|: > + let loaded = 'somename'->bufloaded() + bufname({expr}) *bufname()* The result is the name of a buffer, as it is displayed by the ":ls" command. *************** *** 3205,3210 **** --- 3230,3238 ---- If the {expr} is a String, but you want to use it as a buffer number, force it to be a Number by adding zero to it: > :echo bufname("3" + 0) + < Can also be used as a |method|: > + echo bufnr->bufname() + < If the buffer doesn't exist, or doesn't have a name, an empty string is returned. > bufname("#") alternate buffer name *************** *** 3228,3235 **** of existing buffers. Note that not all buffers with a smaller number necessarily exist, because ":bwipeout" may have removed them. Use bufexists() to test for the existence of a buffer. ! *buffer_number()* ! Obsolete name: buffer_number(). *last_buffer_nr()* Obsolete name for bufnr("$"): last_buffer_nr(). --- 3256,3266 ---- of existing buffers. Note that not all buffers with a smaller number necessarily exist, because ":bwipeout" may have removed them. Use bufexists() to test for the existence of a buffer. ! ! Can also be used as a |method|: > ! echo bufref->bufnr() ! < ! Obsolete name: buffer_number(). *buffer_number()* *last_buffer_nr()* Obsolete name for bufnr("$"): last_buffer_nr(). *************** *** 5821,5826 **** --- 5861,5868 ---- Bitwise invert. The argument is converted to a number. A List, Dict or Float argument causes an error. Example: > :let bits = invert(bits) + < Can also be used as a |method|: > + :let bits = bits->invert() isdirectory({directory}) *isdirectory()* The result is a Number, which is |TRUE| when a directory *************** *** 6749,6759 **** --- 6791,6804 ---- let str = join(map(list, {_, val -> nr2char(val)}), '') < Result: "ABC" + or({expr}, {expr}) *or()* Bitwise OR on the two arguments. The arguments are converted to a number. A List, Dict or Float argument causes an error. Example: > :let bits = or(bits, 0x80) + < Can also be used as a |method|: > + :let bits = bits->or(0x80) pathshorten({expr}) *pathshorten()* *************** *** 9419,9424 **** --- 9465,9471 ---- autocommands and not actually show syntax highlighting. *E994* Not all commands are allowed in popup windows. + When window {id} does not exist then no error is given. win_findbuf({bufnr}) *win_findbuf()* Returns a list with |window-ID|s for windows that contain *************** *** 9674,9679 **** --- 9721,9728 ---- to a number. A List, Dict or Float argument causes an error. Example: > :let bits = xor(bits, 0x80) + < Can also be used as a |method|: > + :let bits = bits->xor(0x80) < *************** *** 10258,10263 **** --- 10307,10317 ---- allow for method chaining, e.g.: > eval GetList()->Filter()->append('$') + A function can also be called as part of evaluating an expression or when it + is used as a method: > + let x = GetList() + let y = GetList()->Filter() + AUTOMATICALLY LOADING FUNCTIONS ~ *autoload-functions* *** ../vim-8.1.1887/src/evalfunc.c 2019-08-18 22:25:54.661448011 +0200 --- src/evalfunc.c 2019-08-18 22:56:39.419754365 +0200 *************** *** 419,425 **** {"acos", 1, 1, FEARG_1, f_acos}, // WJMc #endif {"add", 2, 2, FEARG_1, f_add}, ! {"and", 2, 2, 0, f_and}, {"append", 2, 2, FEARG_LAST, f_append}, {"appendbufline", 3, 3, FEARG_LAST, f_appendbufline}, {"argc", 0, 1, 0, f_argc}, --- 419,425 ---- {"acos", 1, 1, FEARG_1, f_acos}, // WJMc #endif {"add", 2, 2, FEARG_1, f_add}, ! {"and", 2, 2, FEARG_1, f_and}, {"append", 2, 2, FEARG_LAST, f_append}, {"appendbufline", 3, 3, FEARG_LAST, f_appendbufline}, {"argc", 0, 1, 0, f_argc}, *************** *** 447,469 **** #endif #ifdef FEAT_BEVAL {"balloon_gettext", 0, 0, 0, f_balloon_gettext}, ! {"balloon_show", 1, 1, 0, f_balloon_show}, # if defined(FEAT_BEVAL_TERM) ! {"balloon_split", 1, 1, 0, f_balloon_split}, # endif #endif {"browse", 4, 4, 0, f_browse}, {"browsedir", 2, 2, 0, f_browsedir}, ! {"bufadd", 1, 1, 0, f_bufadd}, ! {"bufexists", 1, 1, 0, f_bufexists}, ! {"buffer_exists", 1, 1, 0, f_bufexists}, // obsolete {"buffer_name", 1, 1, 0, f_bufname}, // obsolete {"buffer_number", 1, 1, 0, f_bufnr}, // obsolete ! {"buflisted", 1, 1, 0, f_buflisted}, ! {"bufload", 1, 1, 0, f_bufload}, ! {"bufloaded", 1, 1, 0, f_bufloaded}, ! {"bufname", 1, 1, 0, f_bufname}, ! {"bufnr", 1, 2, 0, f_bufnr}, {"bufwinid", 1, 1, 0, f_bufwinid}, {"bufwinnr", 1, 1, 0, f_bufwinnr}, {"byte2line", 1, 1, 0, f_byte2line}, --- 447,469 ---- #endif #ifdef FEAT_BEVAL {"balloon_gettext", 0, 0, 0, f_balloon_gettext}, ! {"balloon_show", 1, 1, FEARG_1, f_balloon_show}, # if defined(FEAT_BEVAL_TERM) ! {"balloon_split", 1, 1, FEARG_1, f_balloon_split}, # endif #endif {"browse", 4, 4, 0, f_browse}, {"browsedir", 2, 2, 0, f_browsedir}, ! {"bufadd", 1, 1, FEARG_1, f_bufadd}, ! {"bufexists", 1, 1, FEARG_1, f_bufexists}, ! {"buffer_exists", 1, 1, FEARG_1, f_bufexists}, // obsolete {"buffer_name", 1, 1, 0, f_bufname}, // obsolete {"buffer_number", 1, 1, 0, f_bufnr}, // obsolete ! {"buflisted", 1, 1, FEARG_1, f_buflisted}, ! {"bufload", 1, 1, FEARG_1, f_bufload}, ! {"bufloaded", 1, 1, FEARG_1, f_bufloaded}, ! {"bufname", 1, 1, FEARG_1, f_bufname}, ! {"bufnr", 1, 2, FEARG_1, f_bufnr}, {"bufwinid", 1, 1, 0, f_bufwinid}, {"bufwinnr", 1, 1, 0, f_bufwinnr}, {"byte2line", 1, 1, 0, f_byte2line}, *************** *** 626,632 **** {"inputsave", 0, 0, 0, f_inputsave}, {"inputsecret", 1, 2, 0, f_inputsecret}, {"insert", 2, 3, FEARG_1, f_insert}, ! {"invert", 1, 1, 0, f_invert}, {"isdirectory", 1, 1, 0, f_isdirectory}, #if defined(FEAT_FLOAT) && defined(HAVE_MATH_H) {"isinf", 1, 1, FEARG_1, f_isinf}, --- 626,632 ---- {"inputsave", 0, 0, 0, f_inputsave}, {"inputsecret", 1, 2, 0, f_inputsecret}, {"insert", 2, 3, FEARG_1, f_insert}, ! {"invert", 1, 1, FEARG_1, f_invert}, {"isdirectory", 1, 1, 0, f_isdirectory}, #if defined(FEAT_FLOAT) && defined(HAVE_MATH_H) {"isinf", 1, 1, FEARG_1, f_isinf}, *************** *** 690,696 **** #endif {"nextnonblank", 1, 1, 0, f_nextnonblank}, {"nr2char", 1, 2, 0, f_nr2char}, ! {"or", 2, 2, 0, f_or}, {"pathshorten", 1, 1, 0, f_pathshorten}, #ifdef FEAT_PERL {"perleval", 1, 1, 0, f_perleval}, --- 690,696 ---- #endif {"nextnonblank", 1, 1, 0, f_nextnonblank}, {"nr2char", 1, 2, 0, f_nr2char}, ! {"or", 2, 2, FEARG_1, f_or}, {"pathshorten", 1, 1, 0, f_pathshorten}, #ifdef FEAT_PERL {"perleval", 1, 1, 0, f_perleval}, *************** *** 976,982 **** {"winwidth", 1, 1, 0, f_winwidth}, {"wordcount", 0, 0, 0, f_wordcount}, {"writefile", 2, 3, 0, f_writefile}, ! {"xor", 2, 2, 0, f_xor}, }; /* --- 976,982 ---- {"winwidth", 1, 1, 0, f_winwidth}, {"wordcount", 0, 0, 0, f_wordcount}, {"writefile", 2, 3, 0, f_writefile}, ! {"xor", 2, 2, FEARG_1, f_xor}, }; /* *** ../vim-8.1.1887/src/testdir/test_vimscript.vim 2019-08-14 21:12:00.977833219 +0200 --- src/testdir/test_vimscript.vim 2019-08-18 22:39:35.595174517 +0200 *************** *** 1330,1335 **** --- 1330,1336 ---- " and call assert_equal(127, and(127, 127)) call assert_equal(16, and(127, 16)) + eval 127->and(16)->assert_equal(16) call assert_equal(0, and(127, 128)) call assert_fails("call and(1.0, 1)", 'E805:') call assert_fails("call and([], 1)", 'E745:') *************** *** 1340,1345 **** --- 1341,1347 ---- " or call assert_equal(23, or(16, 7)) call assert_equal(15, or(8, 7)) + eval 8->or(7)->assert_equal(15) call assert_equal(123, or(0, 123)) call assert_fails("call or(1.0, 1)", 'E805:') call assert_fails("call or([], 1)", 'E745:') *************** *** 1350,1355 **** --- 1352,1358 ---- " xor call assert_equal(0, xor(127, 127)) call assert_equal(111, xor(127, 16)) + eval 127->xor(16)->assert_equal(111) call assert_equal(255, xor(127, 128)) call assert_fails("call xor(1.0, 1)", 'E805:') call assert_fails("call xor([], 1)", 'E745:') *************** *** 1359,1364 **** --- 1362,1368 ---- call assert_fails("call xor(1, {})", 'E728:') " invert call assert_equal(65408, and(invert(127), 65535)) + eval 127->invert()->and(65535)->assert_equal(65408) call assert_equal(65519, and(invert(16), 65535)) call assert_equal(65407, and(invert(128), 65535)) call assert_fails("call invert(1.0)", 'E805:') *** ../vim-8.1.1887/src/testdir/test_balloon_gui.vim 2019-08-08 21:52:35.518263963 +0200 --- src/testdir/test_balloon_gui.vim 2019-08-18 22:42:47.245575162 +0200 *************** *** 12,18 **** call balloon_show('') let msg = 'that that' ! call balloon_show(msg) call assert_equal(msg, balloon_gettext()) sleep 10m call balloon_show('') --- 12,18 ---- call balloon_show('') let msg = 'that that' ! eval msg->balloon_show() call assert_equal(msg, balloon_gettext()) sleep 10m call balloon_show('') *** ../vim-8.1.1887/src/testdir/test_popup.vim 2019-08-17 19:36:01.206907191 +0200 --- src/testdir/test_popup.vim 2019-08-18 22:45:56.920126750 +0200 *************** *** 758,766 **** endfunc func Test_balloon_split() ! if !exists('*balloon_split') ! return ! endif call assert_equal([ \ 'tempname: 0x555555e380a0 "/home/mool/.viminfz.tmp"', \ ], balloon_split( --- 758,765 ---- endfunc func Test_balloon_split() ! CheckFunction balloon_split ! call assert_equal([ \ 'tempname: 0x555555e380a0 "/home/mool/.viminfz.tmp"', \ ], balloon_split( *************** *** 771,783 **** \ ], balloon_split( \ 'one two three four one two three four one two three four')) ! call assert_equal([ ! \ 'struct = {', ! \ ' one = 1,', ! \ ' two = 2,', ! \ ' three = 3}', ! \ ], balloon_split( ! \ 'struct = {one = 1, two = 2, three = 3}')) call assert_equal([ \ 'struct = {', --- 770,783 ---- \ ], balloon_split( \ 'one two three four one two three four one two three four')) ! eval 'struct = {one = 1, two = 2, three = 3}' ! \ ->balloon_split() ! \ ->assert_equal([ ! \ 'struct = {', ! \ ' one = 1,', ! \ ' two = 2,', ! \ ' three = 3}', ! \ ]) call assert_equal([ \ 'struct = {', *** ../vim-8.1.1887/src/testdir/test_functions.vim 2019-08-07 23:07:03.960858821 +0200 --- src/testdir/test_functions.vim 2019-08-18 22:53:53.328834531 +0200 *************** *** 1537,1548 **** let curbuf = bufnr('') call writefile(['some', 'text'], 'XotherName') ! let buf = bufadd('XotherName') call assert_notequal(0, buf) ! call assert_equal(1, bufexists('XotherName')) call assert_equal(0, getbufvar(buf, '&buflisted')) call assert_equal(0, bufloaded(buf)) ! call bufload(buf) call assert_equal(1, bufloaded(buf)) call assert_equal(['some', 'text'], getbufline(buf, 1, '$')) call assert_equal(curbuf, bufnr('')) --- 1537,1548 ---- let curbuf = bufnr('') call writefile(['some', 'text'], 'XotherName') ! let buf = 'XotherName'->bufadd() call assert_notequal(0, buf) ! eval 'XotherName'->bufexists()->assert_equal(1) call assert_equal(0, getbufvar(buf, '&buflisted')) call assert_equal(0, bufloaded(buf)) ! eval buf->bufload() call assert_equal(1, bufloaded(buf)) call assert_equal(['some', 'text'], getbufline(buf, 1, '$')) call assert_equal(curbuf, bufnr('')) *** ../vim-8.1.1887/src/testdir/test_hide.vim 2016-11-15 20:38:20.000000000 +0100 --- src/testdir/test_hide.vim 2019-08-18 22:52:24.637422110 +0200 *************** *** 37,43 **** " :hide as a command hide call assert_equal([orig_bname, orig_winnr], [bufname(''), winnr('$')]) ! call assert_equal([1, 1], [buflisted('Xf1'), bufloaded('Xf1')]) bwipeout! Xf1 new Xf1 --- 37,43 ---- " :hide as a command hide call assert_equal([orig_bname, orig_winnr], [bufname(''), winnr('$')]) ! call assert_equal([1, 1], ['Xf1'->buflisted(), 'Xf1'->bufloaded()]) bwipeout! Xf1 new Xf1 *** ../vim-8.1.1887/src/testdir/test_arglist.vim 2019-08-03 13:50:04.562299913 +0200 --- src/testdir/test_arglist.vim 2019-08-18 22:56:49.319690679 +0200 *************** *** 90,97 **** call assert_equal('', bufname('%')) call assert_equal(1, line('$')) rew ! call assert_notequal(curbuf, bufnr('%')) ! call assert_equal('Xargadd', bufname('%')) call assert_equal(2, line('$')) call delete('Xargadd') --- 90,97 ---- call assert_equal('', bufname('%')) call assert_equal(1, line('$')) rew ! call assert_notequal(curbuf, '%'->bufnr()) ! call assert_equal('Xargadd', '%'->bufname()) call assert_equal(2, line('$')) call delete('Xargadd') *** ../vim-8.1.1887/src/version.c 2019-08-18 22:25:54.669447972 +0200 --- src/version.c 2019-08-18 22:57:12.483541932 +0200 *************** *** 767,768 **** --- 767,770 ---- { /* Add new patch number below this line */ + /**/ + 1888, /**/ -- From "know your smileys": ~#:-( I just washed my hair, and I can't do nuthin' with it. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///