# HG changeset patch # User Bram Moolenaar # Date 1566162903 -7200 # Node ID 45eca7143d7c3ccfb20ae5364c20db17f17e6195 # Parent 634884027f45524c6ab2bd73970f002485fd29bb patch 8.1.1888: more functions can be used as methods commit https://github.com/vim/vim/commit/073e4b92e613d22ce7b16e0fbf5c0e40cb5f9b2c Author: Bram Moolenaar Date: Sun Aug 18 23:01:56 2019 +0200 patch 8.1.1888: more functions can be used as methods Problem: More functions can be used as methods. Solution: Make various functions usable as a method. diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1,4 +1,4 @@ -*eval.txt* For Vim version 8.1. Last change: 2019 Aug 17 +*eval.txt* For Vim version 8.1. Last change: 2019 Aug 18 VIM REFERENCE MANUAL by Bram Moolenaar @@ -2937,6 +2937,8 @@ and({expr}, {expr}) *and()* 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()* @@ -3088,6 +3090,8 @@ balloon_show({expr}) *balloon_show() 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 @@ -3105,7 +3109,10 @@ balloon_split({msg}) *balloon_split( 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| + Can also be used as a |method|: > + GetText()->balloon_split()->balloon_show() + +< {only available when compiled with the |+balloon_eval_term| feature} *browse()* @@ -3117,8 +3124,8 @@ browse({save}, {title}, {initdir}, {defa {title} title for the requester {initdir} directory to start browsing in {default} default file name - When the "Cancel" button is hit, something went wrong, or - browsing is not possible, an empty string is returned. + An empty string is returned when the "Cancel" button is hit, + something went wrong, or browsing is not possible. *browsedir()* browsedir({title}, {initdir}) @@ -3144,6 +3151,8 @@ bufadd({name}) *bufadd()* 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 @@ -3166,14 +3175,20 @@ bufexists({expr}) *bufexists()* 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(). + + 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 @@ -3183,11 +3198,17 @@ bufload({expr}) *bufload()* 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. @@ -3209,6 +3230,9 @@ bufname({expr}) *bufname()* 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 @@ -3232,8 +3256,11 @@ bufnr({expr} [, {create}]) 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(). + + 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(). @@ -5834,6 +5861,8 @@ invert({expr}) *invert()* 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 @@ -6762,11 +6791,14 @@ nr2char({expr} [, {utf8}]) *nr2char() 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()* @@ -9689,6 +9721,8 @@ xor({expr}, {expr}) *xor()* 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) < diff --git a/src/evalfunc.c b/src/evalfunc.c --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -419,7 +419,7 @@ static funcentry_T global_functions[] = {"acos", 1, 1, FEARG_1, f_acos}, // WJMc #endif {"add", 2, 2, FEARG_1, f_add}, - {"and", 2, 2, 0, f_and}, + {"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,23 +447,23 @@ static funcentry_T global_functions[] = #endif #ifdef FEAT_BEVAL {"balloon_gettext", 0, 0, 0, f_balloon_gettext}, - {"balloon_show", 1, 1, 0, f_balloon_show}, + {"balloon_show", 1, 1, FEARG_1, f_balloon_show}, # if defined(FEAT_BEVAL_TERM) - {"balloon_split", 1, 1, 0, f_balloon_split}, + {"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, 0, f_bufadd}, - {"bufexists", 1, 1, 0, f_bufexists}, - {"buffer_exists", 1, 1, 0, f_bufexists}, // obsolete + {"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, 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}, + {"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,7 +626,7 @@ static funcentry_T global_functions[] = {"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}, + {"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,7 +690,7 @@ static funcentry_T global_functions[] = #endif {"nextnonblank", 1, 1, 0, f_nextnonblank}, {"nr2char", 1, 2, 0, f_nr2char}, - {"or", 2, 2, 0, f_or}, + {"or", 2, 2, FEARG_1, f_or}, {"pathshorten", 1, 1, 0, f_pathshorten}, #ifdef FEAT_PERL {"perleval", 1, 1, 0, f_perleval}, @@ -976,7 +976,7 @@ static funcentry_T global_functions[] = {"winwidth", 1, 1, 0, f_winwidth}, {"wordcount", 0, 0, 0, f_wordcount}, {"writefile", 2, 3, 0, f_writefile}, - {"xor", 2, 2, 0, f_xor}, + {"xor", 2, 2, FEARG_1, f_xor}, }; /* diff --git a/src/testdir/test_arglist.vim b/src/testdir/test_arglist.vim --- a/src/testdir/test_arglist.vim +++ b/src/testdir/test_arglist.vim @@ -90,8 +90,8 @@ func Test_argadd_empty_curbuf() call assert_equal('', bufname('%')) call assert_equal(1, line('$')) rew - call assert_notequal(curbuf, bufnr('%')) - call assert_equal('Xargadd', bufname('%')) + call assert_notequal(curbuf, '%'->bufnr()) + call assert_equal('Xargadd', '%'->bufname()) call assert_equal(2, line('$')) call delete('Xargadd') diff --git a/src/testdir/test_balloon_gui.vim b/src/testdir/test_balloon_gui.vim --- a/src/testdir/test_balloon_gui.vim +++ b/src/testdir/test_balloon_gui.vim @@ -12,7 +12,7 @@ func Test_balloon_show_gui() call balloon_show('') let msg = 'that that' - call balloon_show(msg) + eval msg->balloon_show() call assert_equal(msg, balloon_gettext()) sleep 10m call balloon_show('') diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim --- a/src/testdir/test_functions.vim +++ b/src/testdir/test_functions.vim @@ -1537,12 +1537,12 @@ func Test_bufadd_bufload() let curbuf = bufnr('') call writefile(['some', 'text'], 'XotherName') - let buf = bufadd('XotherName') + let buf = 'XotherName'->bufadd() call assert_notequal(0, buf) - call assert_equal(1, bufexists('XotherName')) + eval 'XotherName'->bufexists()->assert_equal(1) call assert_equal(0, getbufvar(buf, '&buflisted')) call assert_equal(0, bufloaded(buf)) - call bufload(buf) + eval buf->bufload() call assert_equal(1, bufloaded(buf)) call assert_equal(['some', 'text'], getbufline(buf, 1, '$')) call assert_equal(curbuf, bufnr('')) diff --git a/src/testdir/test_hide.vim b/src/testdir/test_hide.vim --- a/src/testdir/test_hide.vim +++ b/src/testdir/test_hide.vim @@ -37,7 +37,7 @@ function Test_hide() " :hide as a command hide call assert_equal([orig_bname, orig_winnr], [bufname(''), winnr('$')]) - call assert_equal([1, 1], [buflisted('Xf1'), bufloaded('Xf1')]) + call assert_equal([1, 1], ['Xf1'->buflisted(), 'Xf1'->bufloaded()]) bwipeout! Xf1 new Xf1 diff --git a/src/testdir/test_popup.vim b/src/testdir/test_popup.vim --- a/src/testdir/test_popup.vim +++ b/src/testdir/test_popup.vim @@ -758,9 +758,8 @@ func Test_popup_and_previewwindow_dump() endfunc func Test_balloon_split() - if !exists('*balloon_split') - return - endif + CheckFunction balloon_split + call assert_equal([ \ 'tempname: 0x555555e380a0 "/home/mool/.viminfz.tmp"', \ ], balloon_split( @@ -771,13 +770,14 @@ func Test_balloon_split() \ ], 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}')) + eval 'struct = {one = 1, two = 2, three = 3}' + \ ->balloon_split() + \ ->assert_equal([ + \ 'struct = {', + \ ' one = 1,', + \ ' two = 2,', + \ ' three = 3}', + \ ]) call assert_equal([ \ 'struct = {', diff --git a/src/testdir/test_vimscript.vim b/src/testdir/test_vimscript.vim --- a/src/testdir/test_vimscript.vim +++ b/src/testdir/test_vimscript.vim @@ -1330,6 +1330,7 @@ func Test_bitwise_functions() " 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,6 +1341,7 @@ func Test_bitwise_functions() " 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,6 +1352,7 @@ func Test_bitwise_functions() " 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,6 +1362,7 @@ func Test_bitwise_functions() 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:') diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -766,6 +766,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1888, +/**/ 1887, /**/ 1886,