changeset 17914:af3d441845cd v8.1.1953

patch 8.1.1953: more functions can be used as a method Commit: https://github.com/vim/vim/commit/f9f24ce7a0e5988fedf2e2ff751818f9b07510a6 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Aug 31 21:17:39 2019 +0200 patch 8.1.1953: more functions can be used as a method Problem: More functions can be used as a method. Solution: Allow more functions to be used as a method.
author Bram Moolenaar <Bram@vim.org>
date Sat, 31 Aug 2019 21:30:04 +0200
parents be8ab5bb74ce
children 50ad0353c88a
files runtime/doc/eval.txt src/evalfunc.c src/testdir/test_blob.vim src/testdir/test_breakindent.vim src/testdir/test_delete.vim src/testdir/test_functions.vim src/testdir/test_getcwd.vim src/testdir/test_history.vim src/testdir/test_listdict.vim src/testdir/test_syn_attr.vim src/testdir/test_termcodes.vim src/testdir/test_true_false.vim src/version.c
diffstat 13 files changed, 106 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -5774,6 +5774,9 @@ haslocaldir([{winnr} [, {tabnr}]])			*ha
 			" tab page m
 			:echo haslocaldir(-1, m)
 <
+		Can also be used as a |method|: >
+			GetWinnr()->haslocaldir()
+
 hasmapto({what} [, {mode} [, {abbr}]])			*hasmapto()*
 		The result is a Number, which is 1 if there is a mapping that
 		contains {what} in somewhere in the rhs (what it is mapped to)
@@ -5802,6 +5805,9 @@ hasmapto({what} [, {mode} [, {abbr}]])		
 <		This installs the mapping to "\ABCdoit" only if there isn't
 		already a mapping to "\ABCdoit".
 
+		Can also be used as a |method|: >
+			GetRHS()->hasmapto()
+
 histadd({history}, {item})				*histadd()*
 		Add the String {item} to the history {history} which can be
 		one of:					*hist-names*
@@ -5823,6 +5829,10 @@ histadd({history}, {item})				*histadd()
 			:let date=input("Enter date: ")
 <		This function is not available in the |sandbox|.
 
+		Can also be used as a |method|, the base is used for the
+		second argument: >
+			GetPattern()->histadd('search')
+
 histdel({history} [, {item}])				*histdel()*
 		Clear {history}, i.e. delete all its entries.  See |hist-names|
 		for the possible values of {history}.
@@ -5854,6 +5864,9 @@ histdel({history} [, {item}])				*histde
 		the "n" command and 'hlsearch': >
 			:call histdel("search", -1)
 			:let @/ = histget("search", -1)
+<
+		Can also be used as a |method|: >
+			GetHistory()->histdel()
 
 histget({history} [, {index}])				*histget()*
 		The result is a String, the entry with Number {index} from
@@ -5870,6 +5883,9 @@ histget({history} [, {index}])				*histg
 		the {num}th entry from the output of |:history|. >
 			:command -nargs=1 H execute histget("cmd", 0+<args>)
 <
+		Can also be used as a |method|: >
+			GetHistory()->histget()
+
 histnr({history})					*histnr()*
 		The result is the Number of the current entry in {history}.
 		See |hist-names| for the possible values of {history}.
@@ -5877,6 +5893,9 @@ histnr({history})					*histnr()*
 
 		Example: >
 			:let inp_index = histnr("expr")
+
+<		Can also be used as a |method|: >
+			GetHistory()->histnr()
 <
 hlexists({name})					*hlexists()*
 		The result is a Number, which is non-zero if a highlight group
@@ -5887,6 +5906,9 @@ hlexists({name})					*hlexists()*
 							*highlight_exists()*
 		Obsolete name: highlight_exists().
 
+		Can also be used as a |method|: >
+			GetName()->hlexists()
+<
 							*hlID()*
 hlID({name})	The result is a Number, which is the ID of the highlight group
 		with name {name}.  When the highlight group doesn't exist,
@@ -5898,6 +5920,9 @@ hlID({name})	The result is a Number, whi
 <							*highlightID()*
 		Obsolete name: highlightID().
 
+		Can also be used as a |method|: >
+			GetName()->hlID()
+
 hostname()						*hostname()*
 		The result is a String, which is the name of the machine on
 		which Vim is currently running.  Machine names greater than
@@ -5922,6 +5947,9 @@ iconv({expr}, {from}, {to})				*iconv()*
 		from/to UCS-2 is automatically changed to use UTF-8.  You
 		cannot use UCS-2 in a string anyway, because of the NUL bytes.
 
+		Can also be used as a |method|: >
+			GetText()->iconv('latin1', 'utf-8')
+<
 							*indent()*
 indent({lnum})	The result is a Number, which is indent of line {lnum} in the
 		current buffer.  The indent is counted in spaces, the value
@@ -5929,6 +5957,8 @@ indent({lnum})	The result is a Number, w
 		|getline()|.
 		When {lnum} is invalid -1 is returned.
 
+		Can also be used as a |method|: >
+			GetLnum()->indent()
 
 index({object}, {expr} [, {start} [, {ic}]])			*index()*
 		If {object} is a |List| return the lowest index where the item
@@ -5949,6 +5979,8 @@ index({object}, {expr} [, {start} [, {ic
 			:let idx = index(words, "the")
 			:if index(numbers, 123) >= 0
 
+<		Can also be used as a |method|: >
+			GetObject()->index(what)
 
 input({prompt} [, {text} [, {completion}]])		*input()*
 		The result is a String, which is whatever the user typed on
@@ -5995,6 +6027,9 @@ input({prompt} [, {text} [, {completion}
 			:  call inputrestore()
 			:endfunction
 
+<		Can also be used as a |method|: >
+			GetPrompt()->input()
+
 inputdialog({prompt} [, {text} [, {cancelreturn}]])		*inputdialog()*
 		Like |input()|, but when the GUI is running and text dialogs
 		are supported, a dialog window pops up to input the text.
@@ -6009,6 +6044,9 @@ inputdialog({prompt} [, {text} [, {cance
 		<Esc> works like pressing the Cancel button.
 		NOTE: Command-line completion is not supported.
 
+		Can also be used as a |method|: >
+			GetPrompt()->inputdialog()
+
 inputlist({textlist})					*inputlist()*
 		{textlist} must be a |List| of strings.  This |List| is
 		displayed, one string per line.  The user will be prompted to
@@ -6025,6 +6063,9 @@ inputlist({textlist})					*inputlist()*
 			let color = inputlist(['Select color:', '1. red',
 				\ '2. green', '3. blue'])
 
+<		Can also be used as a |method|: >
+			GetChoices()->inputlist()
+
 inputrestore()						*inputrestore()*
 		Restore typeahead that was saved with a previous |inputsave()|.
 		Should be called the same number of times inputsave() is
@@ -6050,6 +6091,9 @@ inputsecret({prompt} [, {text}])			*inpu
 		typed on the command-line in response to the issued prompt.
 		NOTE: Command-line completion is not supported.
 
+		Can also be used as a |method|: >
+			GetPrompt()->inputsecret()
+
 insert({object}, {item} [, {idx}])			*insert()*
 		When {object} is a |List| or a |Blob| insert {item} at the start
 		of it.
@@ -6083,6 +6127,9 @@ isdirectory({directory})				*isdirectory
 		exist, or isn't a directory, the result is |FALSE|.  {directory}
 		is any expression, which is used as a String.
 
+		Can also be used as a |method|: >
+			GetName()->isdirectory()
+
 isinf({expr})						*isinf()*
 		Return 1 if {expr} is a positive infinity, or -1 a negative
 		infinity, otherwise 0. >
@@ -6109,6 +6156,9 @@ islocked({expr})					*islocked()* *E786*
 <		When {expr} is a variable that does not exist you get an error
 		message.  Use |exists()| to check for existence.
 
+		Can also be used as a |method|: >
+			GetName()->islocked()
+
 isnan({expr})						*isnan()*
 		Return |TRUE| if {expr} is a float with value NaN. >
 			echo isnan(0.0 / 0.0)
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -595,33 +595,33 @@ static funcentry_T global_functions[] =
     {"globpath",	2, 5, FEARG_2,	  f_globpath},
     {"has",		1, 1, 0,	  f_has},
     {"has_key",		2, 2, FEARG_1,	  f_has_key},
-    {"haslocaldir",	0, 2, 0,	  f_haslocaldir},
-    {"hasmapto",	1, 3, 0,	  f_hasmapto},
-    {"highlightID",	1, 1, 0,	  f_hlID},	// obsolete
-    {"highlight_exists",1, 1, 0,	  f_hlexists},	// obsolete
-    {"histadd",		2, 2, 0,	  f_histadd},
-    {"histdel",		1, 2, 0,	  f_histdel},
-    {"histget",		1, 2, 0,	  f_histget},
-    {"histnr",		1, 1, 0,	  f_histnr},
-    {"hlID",		1, 1, 0,	  f_hlID},
-    {"hlexists",	1, 1, 0,	  f_hlexists},
+    {"haslocaldir",	0, 2, FEARG_1,	  f_haslocaldir},
+    {"hasmapto",	1, 3, FEARG_1,	  f_hasmapto},
+    {"highlightID",	1, 1, FEARG_1,	  f_hlID},	// obsolete
+    {"highlight_exists",1, 1, FEARG_1,	  f_hlexists},	// obsolete
+    {"histadd",		2, 2, FEARG_2,	  f_histadd},
+    {"histdel",		1, 2, FEARG_1,	  f_histdel},
+    {"histget",		1, 2, FEARG_1,	  f_histget},
+    {"histnr",		1, 1, FEARG_1,	  f_histnr},
+    {"hlID",		1, 1, FEARG_1,	  f_hlID},
+    {"hlexists",	1, 1, FEARG_1,	  f_hlexists},
     {"hostname",	0, 0, 0,	  f_hostname},
-    {"iconv",		3, 3, 0,	  f_iconv},
-    {"indent",		1, 1, 0,	  f_indent},
+    {"iconv",		3, 3, FEARG_1,	  f_iconv},
+    {"indent",		1, 1, FEARG_1,	  f_indent},
     {"index",		2, 4, FEARG_1,	  f_index},
-    {"input",		1, 3, 0,	  f_input},
-    {"inputdialog",	1, 3, 0,	  f_inputdialog},
-    {"inputlist",	1, 1, 0,	  f_inputlist},
+    {"input",		1, 3, FEARG_1,	  f_input},
+    {"inputdialog",	1, 3, FEARG_1,	  f_inputdialog},
+    {"inputlist",	1, 1, FEARG_1,	  f_inputlist},
     {"inputrestore",	0, 0, 0,	  f_inputrestore},
     {"inputsave",	0, 0, 0,	  f_inputsave},
-    {"inputsecret",	1, 2, 0,	  f_inputsecret},
+    {"inputsecret",	1, 2, FEARG_1,	  f_inputsecret},
     {"insert",		2, 3, FEARG_1,	  f_insert},
     {"invert",		1, 1, FEARG_1,	  f_invert},
-    {"isdirectory",	1, 1, 0,	  f_isdirectory},
+    {"isdirectory",	1, 1, FEARG_1,	  f_isdirectory},
 #if defined(FEAT_FLOAT) && defined(HAVE_MATH_H)
     {"isinf",		1, 1, FEARG_1,	  f_isinf},
 #endif
-    {"islocked",	1, 1, 0,	  f_islocked},
+    {"islocked",	1, 1, FEARG_1,	  f_islocked},
 #if defined(FEAT_FLOAT) && defined(HAVE_MATH_H)
     {"isnan",		1, 1, FEARG_1,	  f_isnan},
 #endif
--- a/src/testdir/test_blob.vim
+++ b/src/testdir/test_blob.vim
@@ -278,7 +278,7 @@ func Test_blob_index()
   call assert_equal(2, index(0zDEADBEEF, 0xBE))
   call assert_equal(-1, index(0zDEADBEEF, 0))
   call assert_equal(2, index(0z11111111, 0x11, 2))
-  call assert_equal(3, index(0z11110111, 0x11, 2))
+  call assert_equal(3, 0z11110111->index(0x11, 2))
   call assert_equal(2, index(0z11111111, 0x11, -2))
   call assert_equal(3, index(0z11110111, 0x11, -2))
 
--- a/src/testdir/test_breakindent.vim
+++ b/src/testdir/test_breakindent.vim
@@ -411,7 +411,7 @@ func Test_breakindent11()
   " test strdisplaywidth()
   call s:test_windows('setl cpo-=n sbr=>> nu nuw=4 nolist briopt= ts=4')
   let text = getline(2)
-  let width = strlen(text[1:])+indent(2)+strlen(&sbr)*3 " text wraps 3 times
+  let width = strlen(text[1:]) + indent(2) + strlen(&sbr) * 3 " text wraps 3 times
   call assert_equal(width, strdisplaywidth(text))
   call s:close_windows('set sbr=')
 endfunc
@@ -423,7 +423,7 @@ func Test_breakindent11_vartabs()
   " test strdisplaywidth()
   call s:test_windows('setl cpo-=n sbr=>> nu nuw=4 nolist briopt= ts=4 vts=4')
   let text = getline(2)
-  let width = strlen(text[1:])+indent(2)+strlen(&sbr)*3 " text wraps 3 times
+  let width = strlen(text[1:]) + 2->indent() + strlen(&sbr) * 3 " text wraps 3 times
   call assert_equal(width, strdisplaywidth(text))
   call s:close_windows('set sbr= vts&')
 endfunc
--- a/src/testdir/test_delete.vim
+++ b/src/testdir/test_delete.vim
@@ -32,7 +32,7 @@ func Test_recursive_delete()
   call assert_equal(['a', 'b'], readfile('Xdir1/Xfile'))
   call assert_true(isdirectory('Xdir1/subdir'))
   call assert_equal(['a', 'b'], readfile('Xdir1/subdir/Xfile'))
-  call assert_true(isdirectory('Xdir1/empty'))
+  call assert_true('Xdir1/empty'->isdirectory())
   call assert_equal(0, delete('Xdir1', 'rf'))
   call assert_false(isdirectory('Xdir1'))
   call assert_equal(-1, delete('Xdir1', 'd'))
--- a/src/testdir/test_functions.vim
+++ b/src/testdir/test_functions.vim
@@ -1069,7 +1069,7 @@ endfunc
 
 func Test_hlexists()
   call assert_equal(0, hlexists('does_not_exist'))
-  call assert_equal(0, hlexists('Number'))
+  call assert_equal(0, 'Number'->hlexists())
   call assert_equal(0, highlight_exists('does_not_exist'))
   call assert_equal(0, highlight_exists('Number'))
   syntax on
@@ -1102,7 +1102,7 @@ endfunc
 func Test_inputlist()
   call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\<cr>1\<cr>", 'tx')
   call assert_equal(1, c)
-  call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\<cr>2\<cr>", 'tx')
+  call feedkeys(":let c = ['Select color:', '1. red', '2. green', '3. blue']->inputlist()\<cr>2\<cr>", 'tx')
   call assert_equal(2, c)
   call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\<cr>3\<cr>", 'tx')
   call assert_equal(3, c)
@@ -1279,7 +1279,7 @@ func Test_reg_executing_and_recording()
   let g:regs = []
   func TestFunc() abort
     let g:regs += [reg_executing()]
-    let g:typed = input('?')
+    let g:typed = '?'->input()
     let g:regs += [reg_executing()]
   endfunc
   call feedkeys("@qy\<CR>", 'xt')
@@ -1295,6 +1295,25 @@ func Test_reg_executing_and_recording()
   unlet s:reg_stat
 endfunc
 
+func Test_inputsecret()
+  map W :call TestFunc()<CR>
+  let @q = "W"
+  let g:typed1 = ''
+  let g:typed2 = ''
+  let g:regs = []
+  func TestFunc() abort
+    let g:typed1 = '?'->inputsecret()
+    let g:typed2 = inputsecret('password: ')
+  endfunc
+  call feedkeys("@qsomething\<CR>else\<CR>", 'xt')
+  call assert_equal("something", g:typed1)
+  call assert_equal("else", g:typed2)
+  delfunc TestFunc
+  unmap W
+  unlet g:typed1
+  unlet g:typed2
+endfunc
+
 func Test_libcall_libcallnr()
   if !has('libcall')
     return
--- a/src/testdir/test_getcwd.vim
+++ b/src/testdir/test_getcwd.vim
@@ -17,7 +17,7 @@ func GetCwdInfo(win, tab)
     let lflag = haslocaldir(a:win)
   else
     let dirname = fnamemodify(getcwd(a:win, a:tab), mod)
-    let lflag = haslocaldir(a:win, a:tab)
+    let lflag = a:win->haslocaldir(a:tab)
   endif
   return bufname . ' ' . dirname . ' ' . lflag
 endfunc
--- a/src/testdir/test_history.vim
+++ b/src/testdir/test_history.vim
@@ -12,7 +12,7 @@ function History_Tests(hist)
   call assert_equal(-1, histnr(a:hist))
   call assert_equal('', histget(a:hist))
 
-  call assert_true(histadd(a:hist, 'ls'))
+  call assert_true('ls'->histadd(a:hist))
   call assert_true(histadd(a:hist, 'buffers'))
   call assert_equal('buffers', histget(a:hist))
   call assert_equal('ls', histget(a:hist, -2))
@@ -21,14 +21,14 @@ function History_Tests(hist)
   call assert_equal('', histget(a:hist, -5))
   call assert_equal(2, histnr(a:hist))
   call assert_true(histdel(a:hist, 2))
-  call assert_false(histdel(a:hist, 7))
+  call assert_false(a:hist->histdel(7))
   call assert_equal(1, histnr(a:hist))
   call assert_equal('ls', histget(a:hist, -1))
 
   call assert_true(histadd(a:hist, 'buffers'))
   call assert_true(histadd(a:hist, 'ls'))
-  call assert_equal('ls', histget(a:hist, -1))
-  call assert_equal(4, histnr(a:hist))
+  call assert_equal('ls', a:hist->histget(-1))
+  call assert_equal(4, a:hist->histnr())
 
   let a=execute('history ' . a:hist)
   call assert_match("^\n      #  \\S* history\n      3  buffers\n>     4  ls$", a)
--- a/src/testdir/test_listdict.vim
+++ b/src/testdir/test_listdict.vim
@@ -565,7 +565,7 @@ func Test_lockvar_script_autoload()
   set rtp+=./sautest
   lockvar g:footest#x
   unlockvar g:footest#x
-  call assert_equal(-1, islocked('g:footest#x'))
+  call assert_equal(-1, 'g:footest#x'->islocked())
   call assert_equal(0, exists('g:footest#x'))
   call assert_equal(1, g:footest#x)
   let &rtp = old_rtp
--- a/src/testdir/test_syn_attr.vim
+++ b/src/testdir/test_syn_attr.vim
@@ -3,7 +3,7 @@
 func Test_missing_attr()
   hi Mine term=bold cterm=italic
   call assert_equal('Mine', synIDattr(hlID("Mine"), "name"))
-  call assert_equal('', synIDattr(hlID("Mine"), "bg", 'term'))
+  call assert_equal('', synIDattr("Mine"->hlID(), "bg", 'term'))
   call assert_equal('1', synIDattr(hlID("Mine"), "bold", 'term'))
   call assert_equal('1', synIDattr(hlID("Mine"), "italic", 'cterm'))
   hi Mine term=reverse cterm=inverse
@@ -12,7 +12,7 @@ func Test_missing_attr()
   hi Mine term=underline cterm=standout gui=undercurl
   call assert_equal('1', synIDattr(hlID("Mine"), "underline", 'term'))
   call assert_equal('1', synIDattr(hlID("Mine"), "standout", 'cterm'))
-  call assert_equal('1', synIDattr(hlID("Mine"), "undercurl", 'gui'))
+  call assert_equal('1', synIDattr("Mine"->hlID(), "undercurl", 'gui'))
   hi Mine term=NONE cterm=NONE gui=NONE
   call assert_equal('', synIDattr(hlID("Mine"), "bold", 'term'))
   call assert_equal('', synIDattr(hlID("Mine"), "italic", 'cterm'))
--- a/src/testdir/test_termcodes.vim
+++ b/src/testdir/test_termcodes.vim
@@ -33,7 +33,7 @@ func TerminalEscapeCode(code, row, col, 
     " need to use byte encoding here.
     let str = list2str([a:code + 0x20, a:col + 0x20, a:row + 0x20])
     if has('iconv')
-      let bytes = iconv(str, 'utf-8', 'latin1')
+      let bytes = str->iconv('utf-8', 'latin1')
     else
       " Hopefully the numbers are not too big.
       let bytes = str
--- a/src/testdir/test_true_false.vim
+++ b/src/testdir/test_true_false.vim
@@ -100,7 +100,7 @@ func Test_true_false_arg()
   call Try_arg_true_false('maparg("asdf", "i", %v%)', "", "asdff")
   call Try_arg_true_false('FilterMapArg(maparg("asdf", "i", 1, %v%))', "asdff", {'rhs': 'asdff'})
 
-  call Try_arg_true_false('hasmapto("asdf", "i", %v%)', 0, 1)
+  call Try_arg_true_false('"asdf"->hasmapto("i", %v%)', 0, 1)
 
   new colored
   call setline(1, '<here>')
--- 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 */
 /**/
+    1953,
+/**/
     1952,
 /**/
     1951,