changeset 18017:988e5a868b60 v8.1.2004

patch 8.1.2004: more functions can be used as methods Commit: https://github.com/vim/vim/commit/f6ed61e1489e40eada55a4f1782e1ed82bcad7d9 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Sep 7 19:05:09 2019 +0200 patch 8.1.2004: 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, 07 Sep 2019 19:15:04 +0200
parents 834b7854aa3c
children 08fb5a871e6b
files runtime/doc/eval.txt src/evalfunc.c src/testdir/test_breakindent.vim src/testdir/test_expr.vim src/testdir/test_functions.vim src/testdir/test_sound.vim src/testdir/test_spell.vim src/testdir/test_substitute.vim src/testdir/test_swap.vim src/testdir/test_utf8.vim src/version.c
diffstat 11 files changed, 103 insertions(+), 48 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -8895,7 +8895,11 @@ sound_playevent({name} [, {callback}])
 
 		Returns the sound ID, which can be passed to `sound_stop()`.
 		Returns zero if the sound could not be played.
-		{only available when compiled with the |+sound| feature}
+
+		Can also be used as a |method|: >
+			GetSoundName()->sound_playevent()
+
+<		{only available when compiled with the |+sound| feature}
 
 							*sound_playfile()*
 sound_playfile({path} [, {callback}])
@@ -8903,6 +8907,10 @@ sound_playfile({path} [, {callback}])
 		must be a full path.  On Ubuntu you may find files to play
 		with this command: >
 		    :!find /usr/share/sounds -type f | grep -v index.theme
+
+<		Can also be used as a |method|: >
+			GetSoundPath()->sound_playfile()
+
 <		{only available when compiled with the |+sound| feature}
 
 
@@ -8913,7 +8921,10 @@ sound_stop({id})					*sound_stop()*
 		On MS-Windows, this does not work for event sound started by
 		`sound_playevent()`. To stop event sounds, use `sound_clear()`.
 
-		{only available when compiled with the |+sound| feature}
+		Can also be used as a |method|: >
+			soundid->sound_stop()
+
+<		{only available when compiled with the |+sound| feature}
 
 							*soundfold()*
 soundfold({word})
@@ -8924,6 +8935,9 @@ soundfold({word})
 		This can be used for making spelling suggestions.  Note that
 		the method can be quite slow.
 
+		Can also be used as a |method|: >
+			GetWord()->soundfold()
+<
 							*spellbadword()*
 spellbadword([{sentence}])
 		Without argument: The result is the badly spelled word under
@@ -8950,6 +8964,9 @@ spellbadword([{sentence}])
 		'spell' option must be set and the value of 'spelllang' is
 		used.
 
+		Can also be used as a |method|: >
+			GetText()->spellbadword()
+<
 							*spellsuggest()*
 spellsuggest({word} [, {max} [, {capital}]])
 		Return a |List| with spelling suggestions to replace {word}.
@@ -8973,6 +8990,8 @@ spellsuggest({word} [, {max} [, {capital
 		'spell' option must be set and the values of 'spelllang' and
 		'spellsuggest' are used.
 
+		Can also be used as a |method|: >
+			GetWord()->spellsuggest()
 
 split({expr} [, {pattern} [, {keepempty}]])			*split()*
 		Make a |List| out of {expr}.  When {pattern} is omitted or
@@ -9069,6 +9088,19 @@ str2nr({expr} [, {base}])				*str2nr()*
 		leading "0b" or "0B" is ignored.
 		Text after the number is silently ignored.
 
+		Can also be used as a |method|: >
+			GetText()->str2nr()
+
+strcharpart({src}, {start} [, {len}])			*strcharpart()*
+		Like |strpart()| but using character index and length instead
+		of byte index and length.
+		When a character index is used where a character does not
+		exist it is assumed to be one character.  For example: >
+			strcharpart('abc', -1, 2)
+<		results in 'a'.
+
+		Can also be used as a |method|: >
+			GetText()->strcharpart(5)
 
 strchars({expr} [, {skipcc}])					*strchars()*
 		The result is a Number, which is the number of characters
@@ -9094,13 +9126,8 @@ strchars({expr} [, {skipcc}])					*strch
 		      endfunction
 		    endif
 <
-strcharpart({src}, {start} [, {len}])			*strcharpart()*
-		Like |strpart()| but using character index and length instead
-		of byte index and length.
-		When a character index is used where a character does not
-		exist it is assumed to be one character.  For example: >
-			strcharpart('abc', -1, 2)
-<		results in 'a'.
+		Can also be used as a |method|: >
+			GetText()->strchars()
 
 strdisplaywidth({expr} [, {col}])			*strdisplaywidth()*
 		The result is a Number, which is the number of display cells
@@ -9115,6 +9142,9 @@ strdisplaywidth({expr} [, {col}])			*str
 		Ambiguous, this function's return value depends on 'ambiwidth'.
 		Also see |strlen()|, |strwidth()| and |strchars()|.
 
+		Can also be used as a |method|: >
+			GetText()->strdisplaywidth()
+
 strftime({format} [, {time}])				*strftime()*
 		The result is a String, which is a formatted date and time, as
 		specified by the {format} string.  The given {time} is used,
@@ -9134,12 +9164,18 @@ strftime({format} [, {time}])				*strfti
 <		Not available on all systems.  To check use: >
 			:if exists("*strftime")
 
+<		Can also be used as a |method|: >
+			GetFormat()->strftime()
+
 strgetchar({str}, {index})				*strgetchar()*
 		Get character {index} from {str}.  This uses a character
 		index, not a byte index.  Composing characters are considered
 		separate characters here.
 		Also see |strcharpart()| and |strchars()|.
 
+		Can also be used as a |method|: >
+			GetText()->strgetchar(5)
+
 stridx({haystack}, {needle} [, {start}])		*stridx()*
 		The result is a Number, which gives the byte index in
 		{haystack} of the first occurrence of the String {needle}.
@@ -9159,6 +9195,8 @@ stridx({haystack}, {needle} [, {start}])
 		stridx() works similar to the C function strstr().  When used
 		with a single character it works similar to strchr().
 
+		Can also be used as a |method|: >
+			GetHaystack()->stridx(needle)
 							*string()*
 string({expr})	Return {expr} converted to a String.  If {expr} is a Number,
 		Float, String, Blob or a composition of them, then the result
@@ -9211,6 +9249,9 @@ strpart({src}, {start} [, {len}])			*str
 		example, to get three bytes under and after the cursor: >
 			strpart(getline("."), col(".") - 1, 3)
 <
+		Can also be used as a |method|: >
+			GetText()->strpart(5)
+
 strridx({haystack}, {needle} [, {start}])			*strridx()*
 		The result is a Number, which gives the byte index in
 		{haystack} of the last occurrence of the String {needle}.
@@ -9229,6 +9270,9 @@ strridx({haystack}, {needle} [, {start}]
 		When used with a single character it works similar to the C
 		function strrchr().
 
+		Can also be used as a |method|: >
+			GetHaystack()->strridx(needle)
+
 strtrans({expr})					*strtrans()*
 		The result is a String, which is {expr} with all unprintable
 		characters translated into printable characters |'isprint'|.
@@ -9277,6 +9321,9 @@ submatch({nr} [, {list}])			*submatch()*
 <		This finds the first number in the line and adds one to it.
 		A line break is included as a newline character.
 
+		Can also be used as a |method|: >
+			GetNr()->submatch()
+
 substitute({expr}, {pat}, {sub}, {flags})		*substitute()*
 		The result is a String, which is a copy of {expr}, in which
 		the first match of {pat} is replaced with {sub}.
@@ -9340,6 +9387,9 @@ swapinfo({fname})					*swapinfo()*
 			Not a swap file: does not contain correct block ID
 			Magic number mismatch: Info in first block is invalid
 
+		Can also be used as a |method|: >
+			GetFilename()->swapinfo()
+
 swapname({expr})					*swapname()*
 		The result is the swap file path of the buffer {expr}.
 		For the use of {expr}, see |bufname()| above.
@@ -9347,6 +9397,9 @@ swapname({expr})					*swapname()*
 		|:swapname| (unless no swap file).
 		If buffer {expr} has no swap file, returns an empty string.
 
+		Can also be used as a |method|: >
+			GetBufname()->swapname()
+
 synID({lnum}, {col}, {trans})				*synID()*
 		The result is a Number, which is the syntax ID at the position
 		{lnum} and {col} in the current window.
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -715,38 +715,38 @@ static funcentry_T global_functions[] =
     {"sort",		1, 3, FEARG_1,	  f_sort},
 #ifdef FEAT_SOUND
     {"sound_clear",	0, 0, 0,	  f_sound_clear},
-    {"sound_playevent",	1, 2, 0,	  f_sound_playevent},
-    {"sound_playfile",	1, 2, 0,	  f_sound_playfile},
-    {"sound_stop",	1, 1, 0,	  f_sound_stop},
-#endif
-    {"soundfold",	1, 1, 0,	  f_soundfold},
-    {"spellbadword",	0, 1, 0,	  f_spellbadword},
-    {"spellsuggest",	1, 3, 0,	  f_spellsuggest},
+    {"sound_playevent",	1, 2, FEARG_1,	  f_sound_playevent},
+    {"sound_playfile",	1, 2, FEARG_1,	  f_sound_playfile},
+    {"sound_stop",	1, 1, FEARG_1,	  f_sound_stop},
+#endif
+    {"soundfold",	1, 1, FEARG_1,	  f_soundfold},
+    {"spellbadword",	0, 1, FEARG_1,	  f_spellbadword},
+    {"spellsuggest",	1, 3, FEARG_1,	  f_spellsuggest},
     {"split",		1, 3, FEARG_1,	  f_split},
 #ifdef FEAT_FLOAT
     {"sqrt",		1, 1, FEARG_1,	  f_sqrt},
     {"str2float",	1, 1, FEARG_1,	  f_str2float},
 #endif
     {"str2list",	1, 2, FEARG_1,	  f_str2list},
-    {"str2nr",		1, 2, 0,	  f_str2nr},
-    {"strcharpart",	2, 3, 0,	  f_strcharpart},
-    {"strchars",	1, 2, 0,	  f_strchars},
-    {"strdisplaywidth",	1, 2, 0,	  f_strdisplaywidth},
+    {"str2nr",		1, 2, FEARG_1,	  f_str2nr},
+    {"strcharpart",	2, 3, FEARG_1,	  f_strcharpart},
+    {"strchars",	1, 2, FEARG_1,	  f_strchars},
+    {"strdisplaywidth",	1, 2, FEARG_1,	  f_strdisplaywidth},
 #ifdef HAVE_STRFTIME
-    {"strftime",	1, 2, 0,	  f_strftime},
-#endif
-    {"strgetchar",	2, 2, 0,	  f_strgetchar},
-    {"stridx",		2, 3, 0,	  f_stridx},
+    {"strftime",	1, 2, FEARG_1,	  f_strftime},
+#endif
+    {"strgetchar",	2, 2, FEARG_1,	  f_strgetchar},
+    {"stridx",		2, 3, FEARG_1,	  f_stridx},
     {"string",		1, 1, FEARG_1,	  f_string},
     {"strlen",		1, 1, FEARG_1,	  f_strlen},
-    {"strpart",		2, 3, 0,	  f_strpart},
-    {"strridx",		2, 3, 0,	  f_strridx},
+    {"strpart",		2, 3, FEARG_1,	  f_strpart},
+    {"strridx",		2, 3, FEARG_1,	  f_strridx},
     {"strtrans",	1, 1, FEARG_1,	  f_strtrans},
     {"strwidth",	1, 1, FEARG_1,	  f_strwidth},
-    {"submatch",	1, 2, 0,	  f_submatch},
+    {"submatch",	1, 2, FEARG_1,	  f_submatch},
     {"substitute",	4, 4, FEARG_1,	  f_substitute},
-    {"swapinfo",	1, 1, 0,	  f_swapinfo},
-    {"swapname",	1, 1, 0,	  f_swapname},
+    {"swapinfo",	1, 1, FEARG_1,	  f_swapinfo},
+    {"swapname",	1, 1, FEARG_1,	  f_swapname},
     {"synID",		3, 3, 0,	  f_synID},
     {"synIDattr",	2, 3, FEARG_1,	  f_synIDattr},
     {"synIDtrans",	1, 1, FEARG_1,	  f_synIDtrans},
--- a/src/testdir/test_breakindent.vim
+++ b/src/testdir/test_breakindent.vim
@@ -424,7 +424,7 @@ func Test_breakindent11_vartabs()
   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:]) + 2->indent() + strlen(&sbr) * 3 " text wraps 3 times
-  call assert_equal(width, strdisplaywidth(text))
+  call assert_equal(width, text->strdisplaywidth())
   call s:close_windows('set sbr= vts&')
 endfunc
 
--- a/src/testdir/test_expr.vim
+++ b/src/testdir/test_expr.vim
@@ -53,7 +53,7 @@ endfunc
 
 func Test_strgetchar()
   call assert_equal(char2nr('a'), strgetchar('axb', 0))
-  call assert_equal(char2nr('x'), strgetchar('axb', 1))
+  call assert_equal(char2nr('x'), 'axb'->strgetchar(1))
   call assert_equal(char2nr('b'), strgetchar('axb', 2))
 
   call assert_equal(-1, strgetchar('axb', -1))
@@ -63,7 +63,7 @@ endfunc
 
 func Test_strcharpart()
   call assert_equal('a', strcharpart('axb', 0, 1))
-  call assert_equal('x', strcharpart('axb', 1, 1))
+  call assert_equal('x', 'axb'->strcharpart(1, 1))
   call assert_equal('b', strcharpart('axb', 2, 1))
   call assert_equal('xb', strcharpart('axb', 1))
 
--- a/src/testdir/test_functions.vim
+++ b/src/testdir/test_functions.vim
@@ -138,7 +138,7 @@ func Test_str2nr()
   call assert_equal(-123456789, str2nr('-123456789'))
 
   call assert_equal(5, str2nr('101', 2))
-  call assert_equal(5, str2nr('0b101', 2))
+  call assert_equal(5, '0b101'->str2nr(2))
   call assert_equal(5, str2nr('0B101', 2))
   call assert_equal(-5, str2nr('-101', 2))
   call assert_equal(-5, str2nr('-0b101', 2))
@@ -184,7 +184,7 @@ func Test_strftime()
   " of strftime() can be 17 or 18, depending on timezone.
   call assert_match('^2017-01-1[78]$', strftime('%Y-%m-%d', 1484695512))
   "
-  call assert_match('^\d\d\d\d-\(0\d\|1[012]\)-\([012]\d\|3[01]\) \([01]\d\|2[0-3]\):[0-5]\d:\([0-5]\d\|60\)$', strftime('%Y-%m-%d %H:%M:%S'))
+  call assert_match('^\d\d\d\d-\(0\d\|1[012]\)-\([012]\d\|3[01]\) \([01]\d\|2[0-3]\):[0-5]\d:\([0-5]\d\|60\)$', '%Y-%m-%d %H:%M:%S'->strftime())
 
   call assert_fails('call strftime([])', 'E730:')
   call assert_fails('call strftime("%Y", [])', 'E745:')
@@ -415,7 +415,7 @@ endfunc
 func Test_strpart()
   call assert_equal('de', strpart('abcdefg', 3, 2))
   call assert_equal('ab', strpart('abcdefg', -2, 4))
-  call assert_equal('abcdefg', strpart('abcdefg', -2))
+  call assert_equal('abcdefg', 'abcdefg'->strpart(-2))
   call assert_equal('fg', strpart('abcdefg', 5, 4))
   call assert_equal('defg', strpart('abcdefg', 3))
 
@@ -763,11 +763,11 @@ endfunc
 func Test_stridx()
   call assert_equal(-1, stridx('', 'l'))
   call assert_equal(0,  stridx('', ''))
-  call assert_equal(0,  stridx('hello', ''))
+  call assert_equal(0,  'hello'->stridx(''))
   call assert_equal(-1, stridx('hello', 'L'))
   call assert_equal(2,  stridx('hello', 'l', -1))
   call assert_equal(2,  stridx('hello', 'l', 0))
-  call assert_equal(2,  stridx('hello', 'l', 1))
+  call assert_equal(2,  'hello'->stridx('l', 1))
   call assert_equal(3,  stridx('hello', 'l', 3))
   call assert_equal(-1, stridx('hello', 'l', 4))
   call assert_equal(-1, stridx('hello', 'l', 10))
@@ -780,7 +780,7 @@ func Test_strridx()
   call assert_equal(0,  strridx('', ''))
   call assert_equal(5,  strridx('hello', ''))
   call assert_equal(-1, strridx('hello', 'L'))
-  call assert_equal(3,  strridx('hello', 'l'))
+  call assert_equal(3,  'hello'->strridx('l'))
   call assert_equal(3,  strridx('hello', 'l', 10))
   call assert_equal(3,  strridx('hello', 'l', 3))
   call assert_equal(2,  strridx('hello', 'l', 2))
--- a/src/testdir/test_sound.vim
+++ b/src/testdir/test_sound.vim
@@ -13,13 +13,13 @@ func Test_play_event()
   if has('win32')
     throw 'Skipped: Playing event with callback is not supported on Windows'
   endif
-  let id = sound_playevent('bell', 'PlayCallback')
+  let id = 'bell'->sound_playevent('PlayCallback')
   if id == 0
     throw 'Skipped: bell event not available'
   endif
   " Stop it quickly, avoid annoying the user.
   sleep 20m
-  call sound_stop(id)
+  eval id->sound_stop()
   sleep 30m
   call assert_equal(id, g:id)
   call assert_equal(1, g:result)  " sound was aborted
@@ -35,7 +35,7 @@ func Test_play_silent()
   endif
 
   " play until the end
-  let id2 = sound_playfile(fname, 'PlayCallback')
+  let id2 = fname->sound_playfile('PlayCallback')
   call assert_true(id2 > 0)
   sleep 500m
   call assert_equal(id2, g:id)
--- a/src/testdir/test_spell.vim
+++ b/src/testdir/test_spell.vim
@@ -73,7 +73,7 @@ func Test_spellbadword()
   set spell
 
   call assert_equal(['bycycle', 'bad'],  spellbadword('My bycycle.'))
-  call assert_equal(['another', 'caps'], spellbadword('A sentence. another sentence'))
+  call assert_equal(['another', 'caps'], 'A sentence. another sentence'->spellbadword())
 
   set spelllang=en
   call assert_equal(['', ''],            spellbadword('centre'))
@@ -179,7 +179,7 @@ func Test_zz_basic()
         \ )
 
   call assert_equal("gebletegek", soundfold('goobledygoook'))
-  call assert_equal("kepereneven", soundfold('kóopërÿnôven'))
+  call assert_equal("kepereneven", 'kóopërÿnôven'->soundfold())
   call assert_equal("everles gesvets etele", soundfold('oeverloos gezwets edale'))
 endfunc
 
@@ -440,7 +440,7 @@ func TestGoodBadBase()
       break
     endif
     let prevbad = bad
-    let lst = spellsuggest(bad, 3)
+    let lst = bad->spellsuggest(3)
     normal mm
 
     call add(result, [bad, lst])
--- a/src/testdir/test_substitute.vim
+++ b/src/testdir/test_substitute.vim
@@ -337,7 +337,7 @@ func Test_sub_replace_5()
 		\ substitute('A123456789',
 		\ 'A\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)',
 		\ '\=string([submatch(0, 1), submatch(9, 1), ' .
-		\ 'submatch(8, 1), submatch(7, 1), submatch(6, 1), ' .
+		\ 'submatch(8, 1), 7->submatch(1), submatch(6, 1), ' .
 		\ 'submatch(5, 1), submatch(4, 1), submatch(3, 1), ' .
 		\ 'submatch(2, 1), submatch(1, 1)])',
 		\ ''))
--- a/src/testdir/test_swap.vim
+++ b/src/testdir/test_swap.vim
@@ -111,7 +111,7 @@ func Test_swapinfo()
   w
   let fname = s:swapname()
   call assert_match('Xswapinfo', fname)
-  let info = swapinfo(fname)
+  let info = fname->swapinfo()
 
   let ver = printf('VIM %d.%d', v:version / 100, v:version % 100)
   call assert_equal(ver, info.version)
@@ -153,7 +153,7 @@ func Test_swapname()
   let buf = bufnr('%')
   let expected = s:swapname()
   wincmd p
-  call assert_equal(expected, swapname(buf))
+  call assert_equal(expected, buf->swapname())
 
   new Xtest3
   setlocal noswapfile
--- a/src/testdir/test_utf8.vim
+++ b/src/testdir/test_utf8.vim
@@ -17,7 +17,7 @@ func Test_strchars()
   let exp = [[1, 1, 1], [3, 3, 3], [2, 2, 1], [3, 3, 1], [1, 1, 1]]
   for i in range(len(inp))
     call assert_equal(exp[i][0], strchars(inp[i]))
-    call assert_equal(exp[i][1], strchars(inp[i], 0))
+    call assert_equal(exp[i][1], inp[i]->strchars(0))
     call assert_equal(exp[i][2], strchars(inp[i], 1))
   endfor
 endfunc
--- a/src/version.c
+++ b/src/version.c
@@ -758,6 +758,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2004,
+/**/
     2003,
 /**/
     2002,