]> granicus.if.org Git - vim/commitdiff
patch 8.1.1921: more functions can be used as methods v8.1.1921
authorBram Moolenaar <Bram@vim.org>
Sat, 24 Aug 2019 18:50:19 +0000 (20:50 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 24 Aug 2019 18:50:19 +0000 (20:50 +0200)
Problem:    More functions can be used as methods.
Solution:   Make various functions usable as a method.

13 files changed:
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

index 9facfaf420b97d3cf972d622aa04a69e3ae7df28..12e4d092042c165e9b3d601941f6d2324b5c655f 100644 (file)
@@ -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}])                                   *execute()*
                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, which is |TRUE| if {expr} is defined,
 <              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}]])                             *expand()*
                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}])                             *feedkeys()*
 
                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}]])                            *finddir()*
                {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}]])                           *findfile()*
 <              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})                            *fnamemodify()*
 <              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})                                   *foldtextresult()*
                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()*
index b5e98f43b38b6dff64980ad13be681aba51f09d4..c5ec21dd6aeea28e5861d23c9f2adc200d03840c 100644 (file)
@@ -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},
index bd8021f9fa4d2632bbbe8a15ecee5fff523c78aa..53f753d3f874d57e6f85550c60ec883bfdd59a83 100644 (file)
@@ -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
index f6e5293635aaa96637b69b7fae9cd6327a0406b7..f9c5b5f2ce672a50acf8faca7527eb975a258ae3 100644 (file)
@@ -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
index ccca79270c4e9752c88839dce31902b29ac253e0..9f4373278f04a822f6f79cdd85bd28939f49b132 100644 (file)
@@ -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
index 0bae161a8b54c3a4757a6eb5560546a47dbf7fdd..5cda2ea82177e0cdc969509a2e9413deb9c067e3 100644 (file)
@@ -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'))
index 5382b89aa613282c07ff22143f545f6753fb37aa..b0fdb3a032accd9e3d15c94aadccf956433be3eb 100644 (file)
@@ -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")
index 63f273677d903d4423e65b58d25e3b594b31d259..fd5f1efb8247f5d40d4925d994a382643fc5ebee 100644 (file)
@@ -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'))
index 1d5259f6bb36c06c72509056f355d9ee5849f8df..7aef51f8bd7fabc243c2a3d76d1fc1812f90abd1 100644 (file)
@@ -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!
index 7a3d05467ecb2013a76f252f90bc3ef5454f9055..027700be755ab4db83fe0a950b114b68dfe82929 100644 (file)
@@ -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'))
index 604f3c2ed9383891119d8313539151bb85b7ee4e..7c30a1ac08852c7a1c19e0825816f39975fc00f5 100644 (file)
@@ -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)
 
index dc4df4448f00555d406e40feb52ef7962b7c3549..8dc00f2334eb4c7cb9cb6fd33c8070be1c5ac6c4 100644 (file)
@@ -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
index 9d4e89b482136658970bcaaa16d4cba2f7e8d44b..58d86e55166767243aea6faaa981dd3b59fed7e9 100644 (file)
@@ -761,6 +761,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1921,
 /**/
     1920,
 /**/