# HG changeset patch # User Bram Moolenaar # Date 1566673205 -7200 # Node ID 73ddc462979d09a6ee4cc2cd907d1aae12785e87 # Parent 19be0b17e0b9bfb5f09e1cd171796f5672978d74 patch 8.1.1921: more functions can be used as methods Commit: https://github.com/vim/vim/commit/a4208966fb289a505ebdef62bbc37c214069bab4 Author: Bram Moolenaar 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. diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- 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()* diff --git a/src/evalfunc.c b/src/evalfunc.c --- 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}, diff --git a/src/testdir/test_expand.vim b/src/testdir/test_expand.vim --- 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 diff --git a/src/testdir/test_expand_func.vim b/src/testdir/test_expand_func.vim --- 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('')) + call assert_equal('3', ''->expand()) call assert_equal(['4'], expand('', v:false, v:true)) " Don't add any line above this, otherwise will change. quit 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 @@ -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 diff --git a/src/testdir/test_findfile.vim b/src/testdir/test_findfile.vim --- 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')) diff --git a/src/testdir/test_fnameescape.vim b/src/testdir/test_fnameescape.vim --- 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") diff --git a/src/testdir/test_fnamemodify.vim b/src/testdir/test_fnamemodify.vim --- 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')) diff --git a/src/testdir/test_fold.vim b/src/testdir/test_fold.vim --- 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! 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 @@ -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\")} + sandbox let F = {-> "normal ix\"->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() " requires another character to avoid it being seen as the start of an " escape sequence. Zero should be harmless. - call feedkeys("\0", 'L') + eval "\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')) diff --git a/src/testdir/test_search.vim b/src/testdir/test_search.vim --- 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) diff --git a/src/testdir/test_vimscript.vim b/src/testdir/test_vimscript.vim --- 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 diff --git a/src/version.c b/src/version.c --- 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,