changeset 17849:73ddc462979d v8.1.1921

patch 8.1.1921: more functions can be used as methods Commit: https://github.com/vim/vim/commit/a4208966fb289a505ebdef62bbc37c214069bab4 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Aug 24 20:50:19 2019 +0200 patch 8.1.1921: 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 21:00:05 +0200
parents 19be0b17e0b9
children 513f2890d474
files runtime/doc/eval.txt src/evalfunc.c src/testdir/test_expand.vim src/testdir/test_expand_func.vim src/testdir/test_expr.vim src/testdir/test_findfile.vim src/testdir/test_fnameescape.vim src/testdir/test_fnamemodify.vim src/testdir/test_fold.vim src/testdir/test_functions.vim src/testdir/test_search.vim src/testdir/test_vimscript.vim src/version.c
diffstat 13 files changed, 109 insertions(+), 44 deletions(-) [+]
line wrap: on
line diff
--- 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 21
+*eval.txt*	For Vim version 8.1.  Last change: 2019 Aug 24
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -3925,6 +3925,7 @@ empty({expr})						*empty()*
 
 		For a long |List| this is much faster than comparing the
 		length with zero.
+
 		Can also be used as a |method|: >
 			mylist->empty()
 
@@ -3936,6 +3937,9 @@ escape({string}, {chars})				*escape()*
 			c:\\program\ files\\vim
 <		Also see |shellescape()| and |fnameescape()|.
 
+		Can also be used as a |method|: >
+			GetText()->escape(' \')
+<
 							*eval()*
 eval({string})	Evaluate {string} and return the result.  Especially useful to
 		turn the result of |string()| back into the original value.
@@ -3977,6 +3981,9 @@ executable({expr})					*executable()*
 			-1	not implemented on this system
 		|exepath()| can be used to get the full path of an executable.
 
+		Can also be used as a |method|: >
+			GetCommand()->executable()
+
 execute({command} [, {silent}])					*execute()*
 		Execute an Ex command or commands and return the output as a
 		string.
@@ -4006,6 +4013,9 @@ execute({command} [, {silent}])					*exe
 		When used recursively the output of the recursive call is not
 		included in the output of the higher level call.
 
+		Can also be used as a |method|: >
+			GetCommand()->execute()
+
 exepath({expr})						*exepath()*
 		If {expr} is an executable and is either an absolute path, a
 		relative path or found in $PATH, return the full path.
@@ -4015,6 +4025,9 @@ exepath({expr})						*exepath()*
 <		If {expr} cannot be found in $PATH or is not executable then
 		an empty string is returned.
 
+		Can also be used as a |method|: >
+			GetCommand()->exepath()
+
 							*exists()*
 exists({expr})	The result is a Number, which is |TRUE| if {expr} is defined,
 		zero otherwise.
@@ -4100,6 +4113,9 @@ exists({expr})	The result is a Number, w
 <		This doesn't check for existence of the "bufcount" variable,
 		but gets the value of "bufcount", and checks if that exists.
 
+		Can also be used as a |method|: >
+			Varname()->exists()
+
 exp({expr})						*exp()*
 		Return the exponential of {expr} as a |Float| in the range
 		[0, inf].
@@ -4200,6 +4216,9 @@ expand({expr} [, {nosuf} [, {list}]])			
 		See |glob()| for finding existing files.  See |system()| for
 		getting the raw output of an external command.
 
+		Can also be used as a |method|: >
+			Getpattern()->expand()
+
 expandcmd({expr})					*expandcmd()*
 		Expand special items in {expr} like what is done for an Ex
 		command such as `:edit`.  This expands special keywords, like
@@ -4207,6 +4226,9 @@ expandcmd({expr})					*expandcmd()*
 		{expr}.  Returns the expanded string.
 		Example: >
 			:echo expandcmd('make %<.o')
+
+<		Can also be used as a |method|: >
+			GetCommand()->expandcmd()
 <
 extend({expr1}, {expr2} [, {expr3}])			*extend()*
 		{expr1} and {expr2} must be both |Lists| or both
@@ -4296,6 +4318,9 @@ feedkeys({string} [, {mode}])				*feedke
 
 		Return value is always 0.
 
+		Can also be used as a |method|: >
+			GetInput()->feedkeys()
+
 filereadable({file})					*filereadable()*
 		The result is a Number, which is |TRUE| when a file with the
 		name {file} exists, and can be read.  If {file} doesn't exist,
@@ -4308,6 +4333,9 @@ filereadable({file})					*filereadable()
 			0
 			echo filereadable(expand('~/.vimrc'))
 			1
+
+<		Can also be used as a |method|: >
+			GetName()->filereadable()
 <							*file_readable()*
 		Obsolete name: file_readable().
 
@@ -4318,6 +4346,9 @@ filewritable({file})					*filewritable()
 		exist, or is not writable, the result is 0.  If {file} is a
 		directory, and we can write to it, the result is 2.
 
+		Can also be used as a |method|: >
+			GetName()->filewriteable()
+
 
 filter({expr1}, {expr2})				*filter()*
 		{expr1} must be a |List| or a |Dictionary|.
@@ -4383,6 +4414,9 @@ finddir({name} [, {path} [, {count}]])		
 		{only available when compiled with the |+file_in_path|
 		feature}
 
+		Can also be used as a |method|: >
+			GetName()->finddir()
+
 findfile({name} [, {path} [, {count}]])				*findfile()*
 		Just like |finddir()|, but find a file instead of a directory.
 		Uses 'suffixesadd'.
@@ -4391,6 +4425,9 @@ findfile({name} [, {path} [, {count}]])	
 <		Searches from the directory of the current file upwards until
 		it finds the file "tags.vim".
 
+		Can also be used as a |method|: >
+			GetName()->findfile()
+
 float2nr({expr})					*float2nr()*
 		Convert {expr} to a Number by omitting the part after the
 		decimal point.
@@ -4470,6 +4507,9 @@ fnameescape({string})					*fnameescape()
 			:exe "edit " . fnameescape(fname)
 <		results in executing: >
 			edit \+some\ str\%nge\|name
+<
+		Can also be used as a |method|: >
+			GetName()->fnameescape()
 
 fnamemodify({fname}, {mods})				*fnamemodify()*
 		Modify file name {fname} according to {mods}.  {mods} is a
@@ -4482,16 +4522,25 @@ fnamemodify({fname}, {mods})				*fnamemo
 <		Note: Environment variables don't work in {fname}, use
 		|expand()| first then.
 
+		Can also be used as a |method|: >
+			GetName()->fnamemodify(':p:h')
+
 foldclosed({lnum})					*foldclosed()*
 		The result is a Number.  If the line {lnum} is in a closed
 		fold, the result is the number of the first line in that fold.
 		If the line {lnum} is not in a closed fold, -1 is returned.
 
+		Can also be used as a |method|: >
+			GetLnum()->foldclosed()
+
 foldclosedend({lnum})					*foldclosedend()*
 		The result is a Number.  If the line {lnum} is in a closed
 		fold, the result is the number of the last line in that fold.
 		If the line {lnum} is not in a closed fold, -1 is returned.
 
+		Can also be used as a |method|: >
+			GetLnum()->foldclosedend()
+
 foldlevel({lnum})					*foldlevel()*
 		The result is a Number, which is the foldlevel of line {lnum}
 		in the current buffer.  For nested folds the deepest level is
@@ -4502,6 +4551,9 @@ foldlevel({lnum})					*foldlevel()*
 		foldlevel is unknown.  As a special case the level of the
 		previous line is usually available.
 
+		Can also be used as a |method|: >
+			GetLnum()->foldlevel()
+
 							*foldtext()*
 foldtext()	Returns a String, to be displayed for a closed fold.  This is
 		the default function used for the 'foldtext' option and should
@@ -4529,6 +4581,10 @@ foldtextresult({lnum})					*foldtextresu
 		Useful when exporting folded text, e.g., to HTML.
 		{not available when compiled without the |+folding| feature}
 
+
+		Can also be used as a |method|: >
+			GetLnum()->foldtextresult()
+<
 							*foreground()*
 foreground()	Move the Vim window to the foreground.  Useful when sent from
 		a client to a Vim server. |remote_send()|
@@ -4548,6 +4604,9 @@ funcref({name} [, {arglist}] [, {dict}])
 		Also for autoloaded functions. {name} cannot be a builtin
 		function.
 
+		Can also be used as a |method|: >
+			GetFuncname()->funcref([arg])
+<
 					*function()* *E700* *E922* *E923*
 function({name} [, {arglist}] [, {dict}])
 		Return a |Funcref| variable that refers to function {name}.
@@ -4623,6 +4682,9 @@ function({name} [, {arglist}] [, {dict}]
 			call Func(500)
 <		Invokes the function as with: >
 			call context.Callback('one', 500)
+<
+		Can also be used as a |method|: >
+			GetFuncname()->function([arg])
 
 
 garbagecollect([{atexit}])				*garbagecollect()*
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -523,41 +523,41 @@ static funcentry_T global_functions[] =
     {"diff_hlID",	2, 2, FEARG_1,	  f_diff_hlID},
     {"empty",		1, 1, FEARG_1,	  f_empty},
     {"environ",		0, 0, 0,	  f_environ},
-    {"escape",		2, 2, 0,	  f_escape},
+    {"escape",		2, 2, FEARG_1,	  f_escape},
     {"eval",		1, 1, FEARG_1,	  f_eval},
     {"eventhandler",	0, 0, 0,	  f_eventhandler},
-    {"executable",	1, 1, 0,	  f_executable},
-    {"execute",		1, 2, 0,	  f_execute},
-    {"exepath",		1, 1, 0,	  f_exepath},
-    {"exists",		1, 1, 0,	  f_exists},
+    {"executable",	1, 1, FEARG_1,	  f_executable},
+    {"execute",		1, 2, FEARG_1,	  f_execute},
+    {"exepath",		1, 1, FEARG_1,	  f_exepath},
+    {"exists",		1, 1, FEARG_1,	  f_exists},
 #ifdef FEAT_FLOAT
     {"exp",		1, 1, FEARG_1,	  f_exp},
 #endif
-    {"expand",		1, 3, 0,	  f_expand},
-    {"expandcmd",	1, 1, 0,	  f_expandcmd},
+    {"expand",		1, 3, FEARG_1,	  f_expand},
+    {"expandcmd",	1, 1, FEARG_1,	  f_expandcmd},
     {"extend",		2, 3, FEARG_1,	  f_extend},
-    {"feedkeys",	1, 2, 0,	  f_feedkeys},
-    {"file_readable",	1, 1, 0,	  f_filereadable},	// obsolete
-    {"filereadable",	1, 1, 0,	  f_filereadable},
-    {"filewritable",	1, 1, 0,	  f_filewritable},
+    {"feedkeys",	1, 2, FEARG_1,	  f_feedkeys},
+    {"file_readable",	1, 1, FEARG_1,	  f_filereadable},	// obsolete
+    {"filereadable",	1, 1, FEARG_1,	  f_filereadable},
+    {"filewritable",	1, 1, FEARG_1,	  f_filewritable},
     {"filter",		2, 2, FEARG_1,	  f_filter},
-    {"finddir",		1, 3, 0,	  f_finddir},
-    {"findfile",	1, 3, 0,	  f_findfile},
+    {"finddir",		1, 3, FEARG_1,	  f_finddir},
+    {"findfile",	1, 3, FEARG_1,	  f_findfile},
 #ifdef FEAT_FLOAT
     {"float2nr",	1, 1, FEARG_1,	  f_float2nr},
     {"floor",		1, 1, FEARG_1,	  f_floor},
     {"fmod",		2, 2, FEARG_1,	  f_fmod},
 #endif
-    {"fnameescape",	1, 1, 0,	  f_fnameescape},
-    {"fnamemodify",	2, 2, 0,	  f_fnamemodify},
-    {"foldclosed",	1, 1, 0,	  f_foldclosed},
-    {"foldclosedend",	1, 1, 0,	  f_foldclosedend},
-    {"foldlevel",	1, 1, 0,	  f_foldlevel},
+    {"fnameescape",	1, 1, FEARG_1,	  f_fnameescape},
+    {"fnamemodify",	2, 2, FEARG_1,	  f_fnamemodify},
+    {"foldclosed",	1, 1, FEARG_1,	  f_foldclosed},
+    {"foldclosedend",	1, 1, FEARG_1,	  f_foldclosedend},
+    {"foldlevel",	1, 1, FEARG_1,	  f_foldlevel},
     {"foldtext",	0, 0, 0,	  f_foldtext},
-    {"foldtextresult",	1, 1, 0,	  f_foldtextresult},
+    {"foldtextresult",	1, 1, FEARG_1,	  f_foldtextresult},
     {"foreground",	0, 0, 0,	  f_foreground},
-    {"funcref",		1, 3, 0,	  f_funcref},
-    {"function",	1, 3, 0,	  f_function},
+    {"funcref",		1, 3, FEARG_1,	  f_funcref},
+    {"function",	1, 3, FEARG_1,	  f_function},
     {"garbagecollect",	0, 1, 0,	  f_garbagecollect},
     {"get",		2, 3, FEARG_1,	  f_get},
     {"getbufinfo",	0, 1, 0,	  f_getbufinfo},
--- a/src/testdir/test_expand.vim
+++ b/src/testdir/test_expand.vim
@@ -58,7 +58,7 @@ func Test_expandcmd()
   call assert_equal('e Xfile1', expandcmd('e %'))
   edit Xfile2
   edit Xfile1
-  call assert_equal('e Xfile2', expandcmd('e #'))
+  call assert_equal('e Xfile2', 'e #'->expandcmd())
   edit Xfile2
   edit Xfile3
   edit Xfile4
--- a/src/testdir/test_expand_func.vim
+++ b/src/testdir/test_expand_func.vim
@@ -68,7 +68,7 @@ endfunc
 func Test_expand()
   new
   call assert_equal("",  expand('%:S'))
-  call assert_equal('3', expand('<slnum>'))
+  call assert_equal('3', '<slnum>'->expand())
   call assert_equal(['4'], expand('<slnum>', v:false, v:true))
   " Don't add any line above this, otherwise <slnum> will change.
   quit
--- a/src/testdir/test_expr.vim
+++ b/src/testdir/test_expr.vim
@@ -403,7 +403,7 @@ function Test_printf_spec_s()
   call assert_equal(string(value), printf('%s', value))
 
   " funcref
-  call assert_equal('printf', printf('%s', function('printf')))
+  call assert_equal('printf', printf('%s', 'printf'->function()))
 
   " partial
   call assert_equal(string(function('printf', ['%s'])), printf('%s', function('printf', ['%s'])))
@@ -490,7 +490,7 @@ func Test_funcref()
   endfunc
   call assert_equal(2, OneByName())
   call assert_equal(1, OneByRef())
-  let OneByRef = funcref('One')
+  let OneByRef = 'One'->funcref()
   call assert_equal(2, OneByRef())
   call assert_fails('echo funcref("{")', 'E475:')
 endfunc
--- a/src/testdir/test_findfile.vim
+++ b/src/testdir/test_findfile.vim
@@ -50,7 +50,7 @@ func Test_findfile()
   set path=.
   call assert_equal('Xdir2/foo',    findfile('foo'))
   call assert_equal('',             findfile('bar'))
-  call assert_equal('Xdir2/foobar', findfile('foobar'))
+  call assert_equal('Xdir2/foobar', 'foobar'->findfile())
 
   " Empty {path} 2nd argument is the same as no 2nd argument.
   call assert_equal('Xdir2/foo', findfile('foo', ''))
@@ -137,7 +137,7 @@ func Test_finddir()
   cd Xdir1
 
   call assert_equal('Xdir2', finddir('Xdir2'))
-  call assert_equal('',      finddir('Xdir3'))
+  call assert_equal('',      'Xdir3'->finddir())
 
   " Files should not be found (findfile() finds them).
   call assert_equal('', finddir('foo'))
--- a/src/testdir/test_fnameescape.vim
+++ b/src/testdir/test_fnameescape.vim
@@ -13,7 +13,7 @@ func Test_fnameescape()
   let fname = 'Xemark!'
   let status = v:false
   try
-    exe "w! " . fnameescape(fname)
+    exe "w! " . fname->fnameescape()
     let status = v:true
   endtry
   call assert_true(status, "ExclamationMark")
--- a/src/testdir/test_fnamemodify.vim
+++ b/src/testdir/test_fnamemodify.vim
@@ -13,7 +13,7 @@ func Test_fnamemodify()
   call assert_equal('a', fnamemodify('../testdir/a', ':.'))
   call assert_equal('~/testdir/test.out', fnamemodify('test.out', ':~'))
   call assert_equal('~/testdir/a', fnamemodify('../testdir/a', ':~'))
-  call assert_equal('a', fnamemodify('../testdir/a', ':t'))
+  call assert_equal('a', '../testdir/a'->fnamemodify(':t'))
   call assert_equal('', fnamemodify('.', ':p:t'))
   call assert_equal('test.out', fnamemodify('test.out', ':p:t'))
   call assert_equal('out', fnamemodify('test.out', ':p:e'))
--- a/src/testdir/test_fold.vim
+++ b/src/testdir/test_fold.vim
@@ -89,7 +89,7 @@ func Test_indent_fold2()
     setl fen fdm=marker
     2
     norm! >>
-    let a=map(range(1,5), 'foldclosed(v:val)')
+    let a=map(range(1,5), 'v:val->foldclosed()')
     call assert_equal([-1,-1,-1,4,4], a)
     bw!
 endfunc
@@ -133,7 +133,7 @@ func Test_indent_fold_with_read()
   call assert_equal(0, foldlevel(3))
   call assert_equal(0, foldlevel(4))
   call assert_equal(1, foldlevel(5))
-  call assert_equal(7, foldclosedend(5))
+  call assert_equal(7, 5->foldclosedend())
 
   bwipe!
   set foldmethod&
@@ -208,7 +208,7 @@ func Test_update_folds_expr_read()
   %foldclose
   call assert_equal(2, foldclosedend(1))
   call assert_equal(0, foldlevel(3))
-  call assert_equal(0, foldlevel(4))
+  call assert_equal(0, 4->foldlevel())
   call assert_equal(6, foldclosedend(5))
   call assert_equal(10, foldclosedend(7))
   call assert_equal(14, foldclosedend(11))
@@ -656,7 +656,7 @@ func Test_fold_move()
   call assert_equal(10, foldclosed(10))
   call assert_equal(11, foldclosedend(10))
   call assert_equal('+--  2 lines: Line2', foldtextresult(2))
-  call assert_equal('+--  2 lines: Line8', foldtextresult(10))
+  call assert_equal('+--  2 lines: Line8', 10->foldtextresult())
 
   set fdm& sw& fdl&
   enew!
--- a/src/testdir/test_functions.vim
+++ b/src/testdir/test_functions.vim
@@ -1001,7 +1001,7 @@ func Test_filewritable()
   call assert_equal(0, filewritable('Xfilewritable'))
 
   call assert_notequal(0, setfperm('Xfilewritable', 'rw-r-----'))
-  call assert_equal(1, filewritable('Xfilewritable'))
+  call assert_equal(1, 'Xfilewritable'->filewritable())
 
   call assert_equal(0, filewritable('doesnotexist'))
 
@@ -1012,20 +1012,21 @@ endfunc
 func Test_Executable()
   if has('win32')
     call assert_equal(1, executable('notepad'))
-    call assert_equal(1, executable('notepad.exe'))
+    call assert_equal(1, 'notepad.exe'->executable())
     call assert_equal(0, executable('notepad.exe.exe'))
     call assert_equal(0, executable('shell32.dll'))
     call assert_equal(0, executable('win.ini'))
   elseif has('unix')
-    call assert_equal(1, executable('cat'))
+    call assert_equal(1, 'cat'->executable())
     call assert_equal(0, executable('nodogshere'))
 
     " get "cat" path and remove the leading /
     let catcmd = exepath('cat')[1:]
     new
+    " check that the relative path works in /
     lcd /
     call assert_equal(1, executable(catcmd))
-    call assert_equal('/' .. catcmd, exepath(catcmd))
+    call assert_equal('/' .. catcmd, catcmd->exepath())
     bwipe
   endif
 endfunc
@@ -1349,7 +1350,7 @@ func Test_func_sandbox()
   sandbox let F = {-> 'hello'}
   call assert_equal('hello', F())
 
-  sandbox let F = {-> execute("normal ix\<Esc>")}
+  sandbox let F = {-> "normal ix\<Esc>"->execute()}
   call assert_fails('call F()', 'E48:')
   unlet F
 
@@ -1380,7 +1381,7 @@ func Test_func_exists_on_reload()
   call writefile(['func ExistingFunction()', 'echo "yes"', 'endfunc'], 'Xfuncexists')
   call assert_equal(0, exists('*ExistingFunction'))
   source Xfuncexists
-  call assert_equal(1, exists('*ExistingFunction'))
+  call assert_equal(1, '*ExistingFunction'->exists())
   " Redefining a function when reloading a script is OK.
   source Xfuncexists
   call assert_equal(1, exists('*ExistingFunction'))
@@ -1427,7 +1428,7 @@ func Test_confirm()
 
   " <Esc> requires another character to avoid it being seen as the start of an
   " escape sequence.  Zero should be harmless.
-  call feedkeys("\<Esc>0", 'L')
+  eval "\<Esc>0"->feedkeys('L')
   let a = confirm('Are you sure?', "&Yes\n&No")
   call assert_equal(0, a)
 
@@ -1525,7 +1526,7 @@ func Test_delete_rf()
   call writefile([], 'Xdir/[a-1]/foo.txt')
   call writefile([], 'Xdir/[a-1]/bar.txt')
   call assert_true(filereadable('Xdir/foo.txt'))
-  call assert_true(filereadable('Xdir/[a-1]/foo.txt'))
+  call assert_true('Xdir/[a-1]/foo.txt'->filereadable())
 
   call assert_equal(0, delete('Xdir', 'rf'))
   call assert_false(filereadable('Xdir/foo.txt'))
--- a/src/testdir/test_search.vim
+++ b/src/testdir/test_search.vim
@@ -1303,7 +1303,7 @@ func Test_search_display_pattern()
 
   call cursor(1, 1)
   let @/ = 'foo'
-  let pat = escape(@/, '()*?'. '\s\+')
+  let pat = @/->escape('()*?'. '\s\+')
   let g:a = execute(':unsilent :norm! n')
   call assert_match(pat, g:a)
 
--- a/src/testdir/test_vimscript.vim
+++ b/src/testdir/test_vimscript.vim
@@ -638,7 +638,7 @@ function! MSG(enr, emsg)
 	if v:errmsg == ""
 	    Xout "Message missing."
 	else
-	    let v:errmsg = escape(v:errmsg, '"')
+	    let v:errmsg = v:errmsg->escape('"')
 	    Xout "Unexpected message:" v:errmsg
 	endif
     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 */
 /**/
+    1921,
+/**/
     1920,
 /**/
     1919,