# HG changeset patch # User Bram Moolenaar # Date 1567876504 -7200 # Node ID 988e5a868b60678b5510350023bc4bab28ef469c # Parent 834b7854aa3cdfb0fbb45fed07d31dd6dca15c9a patch 8.1.2004: more functions can be used as methods Commit: https://github.com/vim/vim/commit/f6ed61e1489e40eada55a4f1782e1ed82bcad7d9 Author: Bram Moolenaar 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. diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- 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. diff --git a/src/evalfunc.c b/src/evalfunc.c --- 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}, diff --git a/src/testdir/test_breakindent.vim b/src/testdir/test_breakindent.vim --- 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 diff --git a/src/testdir/test_expr.vim b/src/testdir/test_expr.vim --- 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)) diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim --- 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)) diff --git a/src/testdir/test_sound.vim b/src/testdir/test_sound.vim --- 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) diff --git a/src/testdir/test_spell.vim b/src/testdir/test_spell.vim --- 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]) diff --git a/src/testdir/test_substitute.vim b/src/testdir/test_substitute.vim --- 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)])', \ '')) diff --git a/src/testdir/test_swap.vim b/src/testdir/test_swap.vim --- 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 diff --git a/src/testdir/test_utf8.vim b/src/testdir/test_utf8.vim --- 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 diff --git a/src/version.c b/src/version.c --- 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,