changeset 17857:4935244c1128 v8.1.1925

patch 8.1.1925: more functions can be used as methods Commit: https://github.com/vim/vim/commit/4c313b13fb7bfa694ec6d2a13175e8650c007b2a Author: Bram Moolenaar <Bram@vim.org> Date: Sat Aug 24 22:58:31 2019 +0200 patch 8.1.1925: more functions can be used as methods Problem: More functions can be used as methods. Solution: Make various functions usable as a method.
author Bram Moolenaar <Bram@vim.org>
date Sat, 24 Aug 2019 23:00:04 +0200
parents 786c5c8ba565
children 09df8cc020e0
files runtime/doc/eval.txt src/evalfunc.c src/testdir/test_bufline.vim src/testdir/test_bufwintabinfo.vim src/testdir/test_cd.vim src/testdir/test_changelist.vim src/testdir/test_cmdline.vim src/testdir/test_edit.vim src/testdir/test_environ.vim src/testdir/test_file_perm.vim src/testdir/test_getvar.vim src/testdir/test_jumplist.vim src/testdir/test_put.vim src/testdir/test_stat.vim src/version.c
diffstat 15 files changed, 111 insertions(+), 47 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -2450,7 +2450,7 @@ getbufline({expr}, {lnum} [, {end}])
 				List	lines {lnum} to {end} of buffer {expr}
 getbufvar({expr}, {varname} [, {def}])
 				any	variable {varname} in buffer {expr}
-getchangelist({expr})		List	list of change list items
+getchangelist([{expr}])		List	list of change list items
 getchar([expr])			Number	get one character from the user
 getcharmod()			Number	modifiers for the last typed character
 getcharsearch()			Dict	last character search
@@ -4816,6 +4816,9 @@ getbufline({expr}, {lnum} [, {end}])
 		Example: >
 			:let lines = getbufline(bufnr("myfile"), 1, "$")
 
+<		Can also be used as a |method|: >
+			GetBufnr()->getbufline(lnum)
+
 getbufvar({expr}, {varname} [, {def}])				*getbufvar()*
 		The result is the value of option or local buffer variable
 		{varname} in buffer {expr}.  Note that the name without "b:"
@@ -4835,8 +4838,11 @@ getbufvar({expr}, {varname} [, {def}])		
 		Examples: >
 			:let bufmodified = getbufvar(1, "&mod")
 			:echo "todo myvar = " . getbufvar("todo", "myvar")
-<
-getchangelist({expr})					*getchangelist()*
+
+<		Can also be used as a |method|: >
+			GetBufnr()->getbufvar(varname)
+<
+getchangelist([{expr}])					*getchangelist()*
 		Returns the |changelist| for the buffer {expr}. For the use
 		of {expr}, see |bufname()| above. If buffer {expr} doesn't
 		exist, an empty list is returned.
@@ -4852,6 +4858,9 @@ getchangelist({expr})					*getchangelist
 		position refers to the position in the list. For other
 		buffers, it is set to the length of the list.
 
+		Can also be used as a |method|: >
+			GetBufnr()->getchangelist()
+
 getchar([expr])						*getchar()*
 		Get a single character from the user or input stream.
 		If [expr] is omitted, wait until a character is available.
@@ -5051,6 +5060,9 @@ getcompletion({pat}, {type} [, {filtered
 		If there are no matches, an empty list is returned.  An
 		invalid value for {type} produces an error.
 
+		Can also be used as a |method|: >
+			GetPattern()->getcompletion('color')
+<
 							*getcurpos()*
 getcurpos()	Get the position of the cursor.  This is like getpos('.'), but
 		includes an extra item in the list:
@@ -5097,6 +5109,9 @@ getcwd([{winnr} [, {tabnr}]])
 			:echo getcwd(-1, 3)
 			" Get the working directory of current tabpage
 			:echo getcwd(-1, 0)
+
+<		Can also be used as a |method|: >
+			GetWinnr()->getcwd()
 <
 getenv({name})						*getenv()*
 		Return the value of environment variable {name}.
@@ -5105,6 +5120,9 @@ getenv({name})						*getenv()*
 		some systems interpret the empty value as the variable being
 		deleted.  See also |expr-env|.
 
+		Can also be used as a |method|: >
+			GetVarname()->getenv()
+
 getfontname([{name}])					*getfontname()*
 		Without an argument returns the name of the normal font being
 		used.  Like what is used for the Normal highlight group
@@ -5134,6 +5152,9 @@ getfperm({fname})					*getfperm()*
 <		This will hopefully (from a security point of view) display
 		the string "rw-r--r--" or even "rw-------".
 
+		Can also be used as a |method|: >
+			GetFilename()->getfperm()
+<
 		For setting permissions use |setfperm()|.
 
 getfsize({fname})					*getfsize()*
@@ -5144,6 +5165,9 @@ getfsize({fname})					*getfsize()*
 		If the size of {fname} is too big to fit in a Number then -2
 		is returned.
 
+		Can also be used as a |method|: >
+			GetFilename()->getfsize()
+
 getftime({fname})					*getftime()*
 		The result is a Number, which is the last modification time of
 		the given file {fname}.  The value is measured as seconds
@@ -5151,6 +5175,9 @@ getftime({fname})					*getftime()*
 		|localtime()| and |strftime()|.
 		If the file {fname} can't be found -1 is returned.
 
+		Can also be used as a |method|: >
+			GetFilename()->getftime()
+
 getftype({fname})					*getftype()*
 		The result is a String, which is a description of the kind of
 		file of the given file {fname}.
@@ -5172,6 +5199,9 @@ getftype({fname})					*getftype()*
 		"file" are returned.  On MS-Windows a symbolic link to a
 		directory returns "dir" instead of "link".
 
+		Can also be used as a |method|: >
+			GetFilename()->getftype()
+
 getjumplist([{winnr} [, {tabnr}]])			*getjumplist()*
 		Returns the |jumplist| for the specified window.
 
@@ -5191,7 +5221,10 @@ getjumplist([{winnr} [, {tabnr}]])			*ge
 			filename	filename if available
 			lnum		line number
 
-							*getline()*
+		Can also be used as a |method|: >
+			GetWinnr()->getjumplist()
+
+<							*getline()*
 getline({lnum} [, {end}])
 		Without {end} the result is a String, which is line {lnum}
 		from the current buffer.  Example: >
@@ -5214,6 +5247,9 @@ getline({lnum} [, {end}])
 			:let end = search("^$") - 1
 			:let lines = getline(start, end)
 
+<		Can also be used as a |method|: >
+			ComputeLnum()->getline()
+
 <		To get lines from another buffer see |getbufline()|
 
 getloclist({nr} [, {what}])				*getloclist()*
@@ -5289,6 +5325,9 @@ getpos({expr})	Get the position for {exp
 			call setpos("'a", save_a_mark)
 <		Also see |getcurpos()| and |setpos()|.
 
+		Can also be used as a |method|: >
+			GetMark()->getpos()
+
 
 getqflist([{what}])					*getqflist()*
 		Returns a list with all the current quickfix errors.  Each
@@ -5405,6 +5444,9 @@ getreg([{regname} [, 1 [, {list}]]])			*
 
 		If {regname} is not specified, |v:register| is used.
 
+		Can also be used as a |method|: >
+			GetRegname()->getreg()
+
 
 getregtype([{regname}])					*getregtype()*
 		The result is a String, which is type of register {regname}.
@@ -5416,6 +5458,9 @@ getregtype([{regname}])					*getregtype(
 		<CTRL-V> is one character with value 0x16.
 		If {regname} is not specified, |v:register| is used.
 
+		Can also be used as a |method|: >
+			GetRegname()->getregtype()
+
 gettabinfo([{arg}])					*gettabinfo()*
 		If {arg} is not specified, then information about all the tab
 		pages is returned as a List. Each List item is a Dictionary.
@@ -5429,6 +5474,9 @@ gettabinfo([{arg}])					*gettabinfo()*
 					tabpage-local variables
 			windows		List of |window-ID|s in the tab page.
 
+		Can also be used as a |method|: >
+			GetTabnr()->gettabinfo()
+
 gettabvar({tabnr}, {varname} [, {def}])				*gettabvar()*
 		Get the value of a tab-local variable {varname} in tab page
 		{tabnr}. |t:var|
@@ -5439,6 +5487,9 @@ gettabvar({tabnr}, {varname} [, {def}])	
 		When the tab or variable doesn't exist {def} or an empty
 		string is returned, there is no error message.
 
+		Can also be used as a |method|: >
+			GetTabnr()->gettabvar(varname)
+
 gettabwinvar({tabnr}, {winnr}, {varname} [, {def}])		*gettabwinvar()*
 		Get the value of window-local variable {varname} in window
 		{winnr} in tab page {tabnr}.
@@ -5465,6 +5516,9 @@ gettabwinvar({tabnr}, {winnr}, {varname}
 		To obtain all window-local variables use: >
 			gettabwinvar({tabnr}, {winnr}, '&')
 
+<		Can also be used as a |method|: >
+			GetTabnr()->gettabvar(winnr, varname)
+
 gettagstack([{nr}])					*gettagstack()*
 		The result is a Dict, which is the tag stack of window {nr}.
 		{nr} can be the window number or the |window-ID|.
@@ -8006,6 +8060,9 @@ setfperm({fname}, {mode})				*setfperm()
 
 		Returns non-zero for success, zero for failure.
 
+		Can also be used as a |method|: >
+			GetFilename()->setfperm(mode)
+<
 		To read permissions see |getfperm()|.
 
 
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -561,9 +561,9 @@ static funcentry_T global_functions[] =
     {"garbagecollect",	0, 1, 0,	  f_garbagecollect},
     {"get",		2, 3, FEARG_1,	  f_get},
     {"getbufinfo",	0, 1, 0,	  f_getbufinfo},
-    {"getbufline",	2, 3, 0,	  f_getbufline},
-    {"getbufvar",	2, 3, 0,	  f_getbufvar},
-    {"getchangelist",	1, 1, 0,	  f_getchangelist},
+    {"getbufline",	2, 3, FEARG_1,	  f_getbufline},
+    {"getbufvar",	2, 3, FEARG_1,	  f_getbufvar},
+    {"getchangelist",	0, 1, FEARG_1,	  f_getchangelist},
     {"getchar",		0, 1, 0,	  f_getchar},
     {"getcharmod",	0, 0, 0,	  f_getcharmod},
     {"getcharsearch",	0, 0, 0,	  f_getcharsearch},
@@ -571,27 +571,27 @@ static funcentry_T global_functions[] =
     {"getcmdpos",	0, 0, 0,	  f_getcmdpos},
     {"getcmdtype",	0, 0, 0,	  f_getcmdtype},
     {"getcmdwintype",	0, 0, 0,	  f_getcmdwintype},
-    {"getcompletion",	2, 3, 0,	  f_getcompletion},
+    {"getcompletion",	2, 3, FEARG_1,	  f_getcompletion},
     {"getcurpos",	0, 0, 0,	  f_getcurpos},
-    {"getcwd",		0, 2, 0,	  f_getcwd},
-    {"getenv",		1, 1, 0,	  f_getenv},
+    {"getcwd",		0, 2, FEARG_1,	  f_getcwd},
+    {"getenv",		1, 1, FEARG_1,	  f_getenv},
     {"getfontname",	0, 1, 0,	  f_getfontname},
-    {"getfperm",	1, 1, 0,	  f_getfperm},
-    {"getfsize",	1, 1, 0,	  f_getfsize},
-    {"getftime",	1, 1, 0,	  f_getftime},
-    {"getftype",	1, 1, 0,	  f_getftype},
-    {"getjumplist",	0, 2, 0,	  f_getjumplist},
-    {"getline",		1, 2, 0,	  f_getline},
+    {"getfperm",	1, 1, FEARG_1,	  f_getfperm},
+    {"getfsize",	1, 1, FEARG_1,	  f_getfsize},
+    {"getftime",	1, 1, FEARG_1,	  f_getftime},
+    {"getftype",	1, 1, FEARG_1,	  f_getftype},
+    {"getjumplist",	0, 2, FEARG_1,	  f_getjumplist},
+    {"getline",		1, 2, FEARG_1,	  f_getline},
     {"getloclist",	1, 2, 0,	  f_getloclist},
     {"getmatches",	0, 1, 0,	  f_getmatches},
     {"getpid",		0, 0, 0,	  f_getpid},
-    {"getpos",		1, 1, 0,	  f_getpos},
+    {"getpos",		1, 1, FEARG_1,	  f_getpos},
     {"getqflist",	0, 1, 0,	  f_getqflist},
-    {"getreg",		0, 3, 0,	  f_getreg},
-    {"getregtype",	0, 1, 0,	  f_getregtype},
-    {"gettabinfo",	0, 1, 0,	  f_gettabinfo},
-    {"gettabvar",	2, 3, 0,	  f_gettabvar},
-    {"gettabwinvar",	3, 4, 0,	  f_gettabwinvar},
+    {"getreg",		0, 3, FEARG_1,	  f_getreg},
+    {"getregtype",	0, 1, FEARG_1,	  f_getregtype},
+    {"gettabinfo",	0, 1, FEARG_1,	  f_gettabinfo},
+    {"gettabvar",	2, 3, FEARG_1,	  f_gettabvar},
+    {"gettabwinvar",	3, 4, FEARG_1,	  f_gettabwinvar},
     {"gettagstack",	0, 1, 0,	  f_gettagstack},
     {"getwininfo",	0, 1, 0,	  f_getwininfo},
     {"getwinpos",	0, 1, 0,	  f_getwinpos},
@@ -793,7 +793,7 @@ static funcentry_T global_functions[] =
     {"setcharsearch",	1, 1, 0,	  f_setcharsearch},
     {"setcmdpos",	1, 1, 0,	  f_setcmdpos},
     {"setenv",		2, 2, 0,	  f_setenv},
-    {"setfperm",	2, 2, 0,	  f_setfperm},
+    {"setfperm",	2, 2, FEARG_1,	  f_setfperm},
     {"setline",		2, 2, 0,	  f_setline},
     {"setloclist",	2, 4, 0,	  f_setloclist},
     {"setmatches",	1, 2, 0,	  f_setmatches},
@@ -4477,10 +4477,15 @@ f_getchangelist(typval_T *argvars, typva
 	return;
 
 #ifdef FEAT_JUMPLIST
-    (void)tv_get_number(&argvars[0]);	    /* issue errmsg if type error */
-    ++emsg_off;
-    buf = tv_get_buf(&argvars[0], FALSE);
-    --emsg_off;
+    if (argvars[0].v_type == VAR_UNKNOWN)
+	buf = curbuf;
+    else
+    {
+	(void)tv_get_number(&argvars[0]);    // issue errmsg if type error
+	++emsg_off;
+	buf = tv_get_buf(&argvars[0], FALSE);
+	--emsg_off;
+    }
     if (buf == NULL)
 	return;
 
--- a/src/testdir/test_bufline.vim
+++ b/src/testdir/test_bufline.vim
@@ -22,7 +22,7 @@ func Test_setbufline_getbufline()
   call assert_equal(1, setbufline(b, 5, ['x']))
   call assert_equal(1, setbufline(bufnr('$') + 1, 1, ['x']))
   call assert_equal(0, setbufline(b, 4, ['d', 'e']))
-  call assert_equal(['c'], getbufline(b, 3))
+  call assert_equal(['c'], b->getbufline(3))
   call assert_equal(['d'], getbufline(b, 4))
   call assert_equal(['e'], getbufline(b, 5))
   call assert_equal([], getbufline(b, 6))
--- a/src/testdir/test_bufwintabinfo.vim
+++ b/src/testdir/test_bufwintabinfo.vim
@@ -88,7 +88,7 @@ function Test_getbufwintabinfo()
     call assert_equal(2, tablist[1].tabnr)
     call assert_equal('build', tablist[0].variables.space)
     call assert_equal(w2_id, tablist[0].windows[0])
-    call assert_equal([], gettabinfo(3))
+    call assert_equal([], 3->gettabinfo())
 
     tabonly | only
 
@@ -106,7 +106,7 @@ function Test_getbufwintabinfo()
 endfunction
 
 function Test_get_buf_options()
-  let opts = getbufvar(bufnr('%'), '&')
+  let opts = bufnr()->getbufvar('&')
   call assert_equal(v:t_dict, type(opts))
   call assert_equal(8, opts.tabstop)
 endfunc
--- a/src/testdir/test_cd.vim
+++ b/src/testdir/test_cd.vim
@@ -83,7 +83,7 @@ func Test_chdir_func()
   tabfirst
   call chdir('..')
   call assert_equal('y', fnamemodify(getcwd(1, 2), ':t'))
-  call assert_equal('z', fnamemodify(getcwd(3, 2), ':t'))
+  call assert_equal('z', fnamemodify(3->getcwd(2), ':t'))
   tabnext | wincmd t
   eval '..'->chdir()
   call assert_equal('Xdir', fnamemodify(getcwd(1, 2), ':t'))
--- a/src/testdir/test_changelist.vim
+++ b/src/testdir/test_changelist.vim
@@ -8,8 +8,8 @@ func Test_getchangelist()
 
   bwipe!
   enew
-  call assert_equal([], getchangelist(10))
-  call assert_equal([[], 0], getchangelist('%'))
+  call assert_equal([], 10->getchangelist())
+  call assert_equal([[], 0], getchangelist())
 
   call writefile(['line1', 'line2', 'line3'], 'Xfile1.txt')
   call writefile(['line1', 'line2', 'line3'], 'Xfile2.txt')
--- a/src/testdir/test_cmdline.vim
+++ b/src/testdir/test_cmdline.vim
@@ -209,7 +209,7 @@ func Test_getcompletion()
   endif
   let groupcount = len(getcompletion('', 'event'))
   call assert_true(groupcount > 0)
-  let matchcount = len(getcompletion('File', 'event'))
+  let matchcount = len('File'->getcompletion('event'))
   call assert_true(matchcount > 0)
   call assert_true(groupcount > matchcount)
 
--- a/src/testdir/test_edit.vim
+++ b/src/testdir/test_edit.vim
@@ -199,11 +199,11 @@ func Test_edit_07()
   endfu
   au InsertCharPre <buffer> :call DoIt()
   call feedkeys("A\<f5>\<c-p>u\<cr>\<c-l>\<cr>", 'tx')
-  call assert_equal(["Jan\<c-l>",''], getline(1,'$'))
+  call assert_equal(["Jan\<c-l>",''], 1->getline('$'))
   %d
   call setline(1, 'J')
   call feedkeys("A\<f5>\<c-p>u\<down>\<c-l>\<cr>", 'tx')
-  call assert_equal(["January"], getline(1,'$'))
+  call assert_equal(["January"], 1->getline('$'))
 
   delfu ListMonths
   delfu DoIt
@@ -345,7 +345,7 @@ func Test_edit_12()
   call cursor(2, 4)
   call feedkeys("R^\<c-d>", 'tnix')
   call assert_equal(["\tabc", "def"], getline(1, '$'))
-  call assert_equal([0, 2, 2, 0], getpos('.'))
+  call assert_equal([0, 2, 2, 0], '.'->getpos())
   %d
   call setline(1, ["\tabc", "\t\tdef"])
   call cursor(2, 2)
--- a/src/testdir/test_environ.vim
+++ b/src/testdir/test_environ.vim
@@ -11,7 +11,7 @@ endfunc
 
 func Test_getenv()
   unlet! $TESTENV
-  call assert_equal(v:null, getenv('TESTENV'))
+  call assert_equal(v:null, 'TESTENV'->getenv())
   let $TESTENV = 'foo'
   call assert_equal('foo', getenv('TESTENV'))
 endfunc
--- a/src/testdir/test_file_perm.vim
+++ b/src/testdir/test_file_perm.vim
@@ -2,10 +2,10 @@
 
 func Test_file_perm()
   call assert_equal('', getfperm('Xtest'))
-  call assert_equal(0, setfperm('Xtest', 'r--------'))
+  call assert_equal(0, 'Xtest'->setfperm('r--------'))
 
   call writefile(['one'], 'Xtest')
-  call assert_true(len(getfperm('Xtest')) == 9)
+  call assert_true(len('Xtest'->getfperm()) == 9)
 
   call assert_equal(1, setfperm('Xtest', 'rwx------'))
   if has('win32')
--- a/src/testdir/test_getvar.vim
+++ b/src/testdir/test_getvar.vim
@@ -31,7 +31,7 @@ func Test_var()
   let t:other = 777
   let def_list = [4, 5, 6, 7]
   tabrewind
-  call assert_equal([1, 2, 3], gettabvar(3, 'var_list'))
+  call assert_equal([1, 2, 3], 3->gettabvar('var_list'))
   call assert_equal([1, 2, 3], gettabvar(3, 'var_list', def_list))
   call assert_equal({'var_list': [1, 2, 3], 'other': 777}, gettabvar(3, ''))
   call assert_equal({'var_list': [1, 2, 3], 'other': 777},
@@ -61,7 +61,7 @@ func Test_var()
   let def_dict = {'dict2': 'newval'}
   wincmd b
   tabrewind
-  call assert_equal({'dict': 'tabwin'}, gettabwinvar(2, 3, 'var_dict'))
+  call assert_equal({'dict': 'tabwin'}, 2->gettabwinvar(3, 'var_dict'))
   call assert_equal({'dict': 'tabwin'},
 				\ gettabwinvar(2, 3, 'var_dict', def_dict))
   call assert_equal({'var_dict': {'dict': 'tabwin'}}, gettabwinvar(2, 3, ''))
--- a/src/testdir/test_jumplist.vim
+++ b/src/testdir/test_jumplist.vim
@@ -39,7 +39,7 @@ func Test_getjumplist()
   " Traverse the jump list and verify the results
   5
   exe "normal \<C-O>"
-  call assert_equal(2, getjumplist(1)[1])
+  call assert_equal(2, 1->getjumplist()[1])
   exe "normal 2\<C-O>"
   call assert_equal(0, getjumplist(1, 1)[1])
   exe "normal 3\<C-I>"
--- a/src/testdir/test_put.vim
+++ b/src/testdir/test_put.vim
@@ -22,7 +22,7 @@ endfunc
 
 func Test_put_char_block2()
   new
-  let a = [ getreg('a'), getregtype('a') ]
+  let a = [ 'a'->getreg(), 'a'->getregtype() ]
   call setreg('a', ' one ', 'v')
   call setline(1, ['Line 1', '', 'Line 3', ''])
   " visually select the first 3 lines and put register a over it
--- a/src/testdir/test_stat.vim
+++ b/src/testdir/test_stat.vim
@@ -10,7 +10,7 @@ func CheckFileTime(doSleep)
   let fl = ['Hello World!']
   for fname in fnames
     call writefile(fl, fname)
-    call add(times, getftime(fname))
+    call add(times, fname->getftime())
     if a:doSleep
       sleep 1
     endif
@@ -19,8 +19,8 @@ func CheckFileTime(doSleep)
   let time_correct = (times[0] <= times[1] && times[1] <= times[2])
   if a:doSleep || time_correct
     call assert_true(time_correct, printf('Expected %s <= %s <= %s', times[0], times[1], times[2]))
-    call assert_equal(strlen(fl[0] . "\n"), getfsize(fnames[0]))
-    call assert_equal('file', getftype(fnames[0]))
+    call assert_equal(strlen(fl[0] . "\n"), fnames[0]->getfsize())
+    call assert_equal('file', fnames[0]->getftype())
     call assert_equal('rw-', getfperm(fnames[0])[0:2])
     let result = 1
   endif
--- a/src/version.c
+++ b/src/version.c
@@ -762,6 +762,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1925,
+/**/
     1924,
 /**/
     1923,