To: vim_dev@googlegroups.com Subject: Patch 8.1.1954 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.1.1954 Problem: More functions can be used as a method. Solution: Allow more functions to be used as a method. Files: runtime/doc/eval.txt, src/evalfunc.c, src/testdir/test_arglist.vim, src/testdir/test_functions.vim, src/testdir/test_json.vim, src/testdir/test_lispwords.vim, src/testdir/test_listener.vim, src/testdir/test_lua.vim, src/testdir/test_utf8.vim *** ../vim-8.1.1953/runtime/doc/eval.txt 2019-08-31 21:17:35.590131466 +0200 --- runtime/doc/eval.txt 2019-08-31 22:13:35.499178117 +0200 *************** *** 1228,1234 **** mylist->filter(filterexpr)->map(mapexpr)->sort()->join() < Example of using a lambda: > ! GetPercentage->{x -> x * 100}()->printf('%d%%') < When using -> the |expr7| operators will be applied first, thus: > -1.234->string() --- 1228,1234 ---- mylist->filter(filterexpr)->map(mapexpr)->sort()->join() < Example of using a lambda: > ! GetPercentage()->{x -> x * 100}()->printf('%d%%') < When using -> the |expr7| operators will be applied first, thus: > -1.234->string() *************** *** 6198,6203 **** --- 6206,6214 ---- - Empty items in an array (between two commas) are allowed and result in v:none items. + Can also be used as a |method|: > + ReadObject()->js_decode() + js_encode({expr}) *js_encode()* This is similar to |json_encode()| with these differences: - Object key names are not in quotes. *************** *** 6212,6217 **** --- 6223,6230 ---- This encoding is valid for JavaScript. It is more efficient than JSON, especially when using an array with optional items. + Can also be used as a |method|: > + GetObject()->js_encode() json_decode({string}) *json_decode()* This parses a JSON formatted string and returns the equivalent *************** *** 6246,6251 **** --- 6259,6266 ---- accepted by json_decode() as the result must be a valid Vim type, e.g. this fails: {"a":"b", "a":"c"} + Can also be used as a |method|: > + ReadObject()->json_decode() json_encode({expr}) *json_encode()* Encode {expr} as JSON and return this as a string. *************** *** 6272,6277 **** --- 6287,6295 ---- missing in the JSON standard, but several implementations do allow it. If not then you will get an error. + Can also be used as a |method|: > + GetObject()->json_encode() + keys({dict}) *keys()* Return a |List| with all the keys of {dict}. The |List| is in arbitrary order. Also see |items()| and |values()|. *************** *** 6338,6343 **** --- 6356,6365 ---- feature is present} Examples: > :echo libcall("libc.so", "getenv", "HOME") + + < Can also be used as a |method|, where the base is passed as + the argument to the called function: > + GetValue()->libcall("libc.so", "getenv") < *libcallnr()* libcallnr({libname}, {funcname}, {argument}) *************** *** 6350,6355 **** --- 6372,6381 ---- :call libcallnr("libc.so", "printf", "Hello World!\n") :call libcallnr("libc.so", "sleep", 10) < + Can also be used as a |method|, where the base is passed as + the argument to the called function: > + GetValue()->libcallnr("libc.so", "printf") + < *line()* line({expr}) The result is a Number, which is the line number of the file position given with {expr}. The accepted positions are: *************** *** 6377,6382 **** --- 6403,6411 ---- To jump to the last known position when opening a file see |last-position-jump|. + Can also be used as a |method|: > + GetValue()->line() + line2byte({lnum}) *line2byte()* Return the byte count from the start of the buffer for line {lnum}. This includes the end-of-line character, depending on *************** *** 6391,6396 **** --- 6420,6428 ---- disabled at compile time, -1 is returned. Also see |byte2line()|, |go| and |:goto|. + Can also be used as a |method|: > + GetLnum()->line2byte() + lispindent({lnum}) *lispindent()* Get the amount of indent for line {lnum} according the lisp indenting rules, as with 'lisp'. *************** *** 6399,6404 **** --- 6431,6439 ---- When {lnum} is invalid or Vim was not compiled the |+lispindent| feature, -1 is returned. + Can also be used as a |method|: > + GetLnum()->lispindent() + list2str({list} [, {utf8}]) *list2str()* Convert each number in {list} to a character string can concatenate them all. Examples: > *************** *** 6413,6418 **** --- 6448,6456 ---- With utf-8 composing characters work as expected: > list2str([97, 769]) returns "á" < + Can also be used as a |method|: > + GetList()->list2str() + listener_add({callback} [, {buf}]) *listener_add()* Add a callback function that will be invoked when changes have been made to buffer {buf}. *************** *** 6482,6487 **** --- 6520,6529 ---- The {callback} is also not invoked when the buffer is unloaded, use the |BufUnload| autocmd event for that. + Can also be used as a |method|, where the base is passed as + the second argument, the buffer: > + GetBuffer()->listener_add(callback) + listener_flush([{buf}]) *listener_flush()* Invoke listener callbacks for buffer {buf}. If there are no pending changes then no callbacks are invoked. *************** *** 6490,6500 **** --- 6532,6548 ---- values, see |bufname()|. When {buf} is omitted the current buffer is used. + Can also be used as a |method|: > + GetBuffer()->listener_flush() + listener_remove({id}) *listener_remove()* Remove a listener previously added with listener_add(). Returns zero when {id} could not be found, one when {id} was removed. + Can also be used as a |method|: > + GetListenerId()->listener_remove() + localtime() *localtime()* Return the current time, measured as seconds since 1st Jan 1970. See also |strftime()| and |getftime()|. *************** *** 6542,6548 **** as-is. Other objects are returned as zero without any errors. See |lua-luaeval| for more details. ! {only available when compiled with the |+lua| feature} map({expr1}, {expr2}) *map()* {expr1} must be a |List| or a |Dictionary|. --- 6590,6600 ---- as-is. Other objects are returned as zero without any errors. See |lua-luaeval| for more details. ! ! Can also be used as a |method|: > ! GetExpr()->luaeval() ! ! < {only available when compiled with the |+lua| feature} map({expr1}, {expr2}) *map()* {expr1} must be a |List| or a |Dictionary|. *** ../vim-8.1.1953/src/evalfunc.c 2019-08-31 21:17:35.594131454 +0200 --- src/evalfunc.c 2019-08-31 22:13:46.119114253 +0200 *************** *** 635,663 **** {"job_stop", 1, 2, FEARG_1, f_job_stop}, #endif {"join", 1, 2, FEARG_1, f_join}, ! {"js_decode", 1, 1, 0, f_js_decode}, ! {"js_encode", 1, 1, 0, f_js_encode}, ! {"json_decode", 1, 1, 0, f_json_decode}, ! {"json_encode", 1, 1, 0, f_json_encode}, {"keys", 1, 1, FEARG_1, f_keys}, {"last_buffer_nr", 0, 0, 0, f_last_buffer_nr}, // obsolete {"len", 1, 1, FEARG_1, f_len}, ! {"libcall", 3, 3, 0, f_libcall}, ! {"libcallnr", 3, 3, 0, f_libcallnr}, ! {"line", 1, 1, 0, f_line}, ! {"line2byte", 1, 1, 0, f_line2byte}, ! {"lispindent", 1, 1, 0, f_lispindent}, ! {"list2str", 1, 2, 0, f_list2str}, ! {"listener_add", 1, 2, 0, f_listener_add}, ! {"listener_flush", 0, 1, 0, f_listener_flush}, ! {"listener_remove", 1, 1, 0, f_listener_remove}, {"localtime", 0, 0, 0, f_localtime}, #ifdef FEAT_FLOAT {"log", 1, 1, FEARG_1, f_log}, {"log10", 1, 1, FEARG_1, f_log10}, #endif #ifdef FEAT_LUA ! {"luaeval", 1, 2, 0, f_luaeval}, #endif {"map", 2, 2, FEARG_1, f_map}, {"maparg", 1, 4, 0, f_maparg}, --- 635,663 ---- {"job_stop", 1, 2, FEARG_1, f_job_stop}, #endif {"join", 1, 2, FEARG_1, f_join}, ! {"js_decode", 1, 1, FEARG_1, f_js_decode}, ! {"js_encode", 1, 1, FEARG_1, f_js_encode}, ! {"json_decode", 1, 1, FEARG_1, f_json_decode}, ! {"json_encode", 1, 1, FEARG_1, f_json_encode}, {"keys", 1, 1, FEARG_1, f_keys}, {"last_buffer_nr", 0, 0, 0, f_last_buffer_nr}, // obsolete {"len", 1, 1, FEARG_1, f_len}, ! {"libcall", 3, 3, FEARG_3, f_libcall}, ! {"libcallnr", 3, 3, FEARG_3, f_libcallnr}, ! {"line", 1, 1, FEARG_1, f_line}, ! {"line2byte", 1, 1, FEARG_1, f_line2byte}, ! {"lispindent", 1, 1, FEARG_1, f_lispindent}, ! {"list2str", 1, 2, FEARG_1, f_list2str}, ! {"listener_add", 1, 2, FEARG_2, f_listener_add}, ! {"listener_flush", 0, 1, FEARG_1, f_listener_flush}, ! {"listener_remove", 1, 1, FEARG_1, f_listener_remove}, {"localtime", 0, 0, 0, f_localtime}, #ifdef FEAT_FLOAT {"log", 1, 1, FEARG_1, f_log}, {"log10", 1, 1, FEARG_1, f_log10}, #endif #ifdef FEAT_LUA ! {"luaeval", 1, 2, FEARG_1, f_luaeval}, #endif {"map", 2, 2, FEARG_1, f_map}, {"maparg", 1, 4, 0, f_maparg}, *** ../vim-8.1.1953/src/testdir/test_arglist.vim 2019-08-24 22:14:52.826215824 +0200 --- src/testdir/test_arglist.vim 2019-08-31 21:47:34.013172169 +0200 *************** *** 88,94 **** argadd Xargadd call assert_equal(curbuf, bufnr('%')) call assert_equal('', bufname('%')) ! call assert_equal(1, line('$')) rew call assert_notequal(curbuf, '%'->bufnr()) call assert_equal('Xargadd', '%'->bufname()) --- 88,94 ---- argadd Xargadd call assert_equal(curbuf, bufnr('%')) call assert_equal('', bufname('%')) ! call assert_equal(1, '$'->line()) rew call assert_notequal(curbuf, '%'->bufnr()) call assert_equal('Xargadd', '%'->bufname()) *** ../vim-8.1.1953/src/testdir/test_functions.vim 2019-08-31 21:17:35.594131454 +0200 --- src/testdir/test_functions.vim 2019-08-31 21:48:47.392759812 +0200 *************** *** 883,889 **** call assert_equal([-1, -1, 1, 1, 2, 2, 2, 3, 3, -1], \ map(range(-1, 8), 'v:val->byte2line()')) call assert_equal([-1, -1, 1, 3, 6, 8, -1], ! \ map(range(-1, 5), 'line2byte(v:val)')) set fileformat=dos call assert_equal([-1, -1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, -1], --- 883,889 ---- call assert_equal([-1, -1, 1, 1, 2, 2, 2, 3, 3, -1], \ map(range(-1, 8), 'v:val->byte2line()')) call assert_equal([-1, -1, 1, 3, 6, 8, -1], ! \ map(range(-1, 5), 'v:val->line2byte()')) set fileformat=dos call assert_equal([-1, -1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, -1], *************** *** 1351,1367 **** endif if has('win32') ! call assert_equal($USERPROFILE, libcall(libc, 'getenv', 'USERPROFILE')) else ! call assert_equal($HOME, libcall(libc, 'getenv', 'HOME')) endif " If function returns NULL, libcall() should return an empty string. call assert_equal('', libcall(libc, 'getenv', 'X_ENV_DOES_NOT_EXIT')) " Test libcallnr() with string and integer argument. ! call assert_equal(4, libcallnr(libc, 'strlen', 'abcd')) ! call assert_equal(char2nr('A'), libcallnr(libc, 'toupper', char2nr('a'))) call assert_fails("call libcall(libc, 'Xdoesnotexist_', '')", 'E364:') call assert_fails("call libcallnr(libc, 'Xdoesnotexist_', '')", 'E364:') --- 1351,1367 ---- endif if has('win32') ! call assert_equal($USERPROFILE, 'USERPROFILE'->libcall(libc, 'getenv')) else ! call assert_equal($HOME, 'HOME'->libcall(libc, 'getenv')) endif " If function returns NULL, libcall() should return an empty string. call assert_equal('', libcall(libc, 'getenv', 'X_ENV_DOES_NOT_EXIT')) " Test libcallnr() with string and integer argument. ! call assert_equal(4, 'abcd'->libcallnr(libc, 'strlen')) ! call assert_equal(char2nr('A'), char2nr('a')->libcallnr(libc, 'toupper')) call assert_fails("call libcall(libc, 'Xdoesnotexist_', '')", 'E364:') call assert_fails("call libcallnr(libc, 'Xdoesnotexist_', '')", 'E364:') *** ../vim-8.1.1953/src/testdir/test_json.vim 2019-05-19 19:59:30.164255569 +0200 --- src/testdir/test_json.vim 2019-08-31 21:38:17.296263416 +0200 *************** *** 70,76 **** func Test_json_encode() call assert_equal(s:json1, json_encode(s:var1)) call assert_equal(s:json2, json_encode(s:var2)) ! call assert_equal(s:json3, json_encode(s:var3)) call assert_equal(s:json4, json_encode(s:var4)) call assert_equal(s:json5, json_encode(s:var5)) --- 70,76 ---- func Test_json_encode() call assert_equal(s:json1, json_encode(s:var1)) call assert_equal(s:json2, json_encode(s:var2)) ! call assert_equal(s:json3, s:var3->json_encode()) call assert_equal(s:json4, json_encode(s:var4)) call assert_equal(s:json5, json_encode(s:var5)) *************** *** 110,116 **** func Test_json_decode() call assert_equal(s:var1, json_decode(s:json1)) call assert_equal(s:var2, json_decode(s:json2)) ! call assert_equal(s:var3, json_decode(s:json3)) call assert_equal(s:var4, json_decode(s:json4)) call assert_equal(s:var5, json_decode(s:json5)) --- 110,116 ---- func Test_json_decode() call assert_equal(s:var1, json_decode(s:json1)) call assert_equal(s:var2, json_decode(s:json2)) ! call assert_equal(s:var3, s:json3->json_decode()) call assert_equal(s:var4, json_decode(s:json4)) call assert_equal(s:var5, json_decode(s:json5)) *************** *** 188,194 **** func Test_js_encode() call assert_equal(s:json1, js_encode(s:var1)) call assert_equal(s:json2, js_encode(s:var2)) ! call assert_equal(s:json3, js_encode(s:var3)) call assert_equal(s:json4, js_encode(s:var4)) call assert_equal(s:json5, js_encode(s:var5)) --- 188,194 ---- func Test_js_encode() call assert_equal(s:json1, js_encode(s:var1)) call assert_equal(s:json2, js_encode(s:var2)) ! call assert_equal(s:json3, s:var3->js_encode()) call assert_equal(s:json4, js_encode(s:var4)) call assert_equal(s:json5, js_encode(s:var5)) *************** *** 226,232 **** func Test_js_decode() call assert_equal(s:var1, js_decode(s:json1)) call assert_equal(s:var2, js_decode(s:json2)) ! call assert_equal(s:var3, js_decode(s:json3)) call assert_equal(s:var4, js_decode(s:json4)) call assert_equal(s:var5, js_decode(s:json5)) --- 226,232 ---- func Test_js_decode() call assert_equal(s:var1, js_decode(s:json1)) call assert_equal(s:var2, js_decode(s:json2)) ! call assert_equal(s:var3, s:json3->js_decode()) call assert_equal(s:var4, js_decode(s:json4)) call assert_equal(s:var5, js_decode(s:json5)) *** ../vim-8.1.1953/src/testdir/test_lispwords.vim 2017-10-26 21:33:30.000000000 +0200 --- src/testdir/test_lispwords.vim 2019-08-31 22:04:56.138343250 +0200 *************** *** 43,48 **** --- 43,51 ---- \ ',@body', \ '(princ "")))' \ ]) + call assert_equal(7, lispindent(2)) + call assert_equal(5, 6->lispindent()) + set lisp set lispwords& let save_copt = &cpoptions *** ../vim-8.1.1953/src/testdir/test_listener.vim 2019-07-13 20:14:39.626623070 +0200 --- src/testdir/test_listener.vim 2019-08-31 22:12:39.391515873 +0200 *************** *** 59,68 **** " a change above a previous change without a line number change is reported " together call setline(1, ['one one', 'two']) ! call listener_flush() call append(2, 'two two') call setline(1, 'something') ! call listener_flush() call assert_equal([{'lnum': 3, 'end': 3, 'col': 1, 'added': 1}, \ {'lnum': 1, 'end': 2, 'col': 1, 'added': 0}], s:list) --- 59,68 ---- " a change above a previous change without a line number change is reported " together call setline(1, ['one one', 'two']) ! call listener_flush(bufnr()) call append(2, 'two two') call setline(1, 'something') ! call bufnr()->listener_flush() call assert_equal([{'lnum': 3, 'end': 3, 'col': 1, 'added': 1}, \ {'lnum': 1, 'end': 2, 'col': 1, 'added': 0}], s:list) *************** *** 134,140 **** redraw call assert_equal([{'lnum': 1, 'end': 2, 'col': 1, 'added': 0}], s:list3) ! call listener_remove(id) bwipe! endfunc --- 134,140 ---- redraw call assert_equal([{'lnum': 1, 'end': 2, 'col': 1, 'added': 0}], s:list3) ! eval id->listener_remove() bwipe! endfunc *************** *** 214,220 **** call setline(1, ['one', 'two']) let bufnr = bufnr('') normal ww ! let id = listener_add(function('s:StoreBufList'), bufnr) let s:list = [] call setbufline(bufnr, 1, 'hello') redraw --- 214,220 ---- call setline(1, ['one', 'two']) let bufnr = bufnr('') normal ww ! let id = bufnr->listener_add(function('s:StoreBufList')) let s:list = [] call setbufline(bufnr, 1, 'hello') redraw *** ../vim-8.1.1953/src/testdir/test_lua.vim 2019-06-15 17:57:43.972724036 +0200 --- src/testdir/test_lua.vim 2019-08-31 22:14:15.910935271 +0200 *************** *** 36,42 **** " lua.eval with a string lua v = vim.eval('"abc"') ! call assert_equal('string', luaeval('vim.type(v)')) call assert_equal('abc', luaeval('v')) " lua.eval with a list --- 36,42 ---- " lua.eval with a string lua v = vim.eval('"abc"') ! call assert_equal('string', 'vim.type(v)'->luaeval()) call assert_equal('abc', luaeval('v')) " lua.eval with a list *** ../vim-8.1.1953/src/testdir/test_utf8.vim 2019-04-06 13:18:06.737335067 +0200 --- src/testdir/test_utf8.vim 2019-08-31 22:06:28.073774927 +0200 *************** *** 77,83 **** let s = "\u304b\u3099\u3044" let l = [0x304b, 0x3099, 0x3044] call assert_equal(l, str2list(s, 1)) ! call assert_equal(s, list2str(l, 1)) if &enc ==# 'utf-8' call assert_equal(str2list(s), str2list(s, 1)) call assert_equal(list2str(l), list2str(l, 1)) --- 77,83 ---- let s = "\u304b\u3099\u3044" let l = [0x304b, 0x3099, 0x3044] call assert_equal(l, str2list(s, 1)) ! call assert_equal(s, l->list2str(1)) if &enc ==# 'utf-8' call assert_equal(str2list(s), str2list(s, 1)) call assert_equal(list2str(l), list2str(l, 1)) *** ../vim-8.1.1953/src/version.c 2019-08-31 21:17:35.594131454 +0200 --- src/version.c 2019-08-31 22:15:09.378614441 +0200 *************** *** 763,764 **** --- 763,766 ---- { /* Add new patch number below this line */ + /**/ + 1954, /**/ -- hundred-and-one symptoms of being an internet addict: 154. You fondle your mouse. /// 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 ///