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 "</a>")))'
\ ])
+ 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 -- Br...@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 ///