# HG changeset patch # User Bram Moolenaar # Date 1566680404 -7200 # Node ID 4935244c11285d22cab5dbd1b5c82d2ce05b223c # Parent 786c5c8ba5654ace397c817cdfb5256bb869f17f patch 8.1.1925: more functions can be used as methods Commit: https://github.com/vim/vim/commit/4c313b13fb7bfa694ec6d2a13175e8650c007b2a Author: Bram Moolenaar Date: Sat Aug 24 22:58:31 2019 +0200 patch 8.1.1925: 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 @@ -2450,7 +2450,7 @@ getbufline({expr}, {lnum} [, {end}]) List lines {lnum} to {end} of buffer {expr} getbufvar({expr}, {varname} [, {def}]) any variable {varname} in buffer {expr} -getchangelist({expr}) List list of change list items +getchangelist([{expr}]) List list of change list items getchar([expr]) Number get one character from the user getcharmod() Number modifiers for the last typed character getcharsearch() Dict last character search @@ -4816,6 +4816,9 @@ getbufline({expr}, {lnum} [, {end}]) Example: > :let lines = getbufline(bufnr("myfile"), 1, "$") +< Can also be used as a |method|: > + GetBufnr()->getbufline(lnum) + getbufvar({expr}, {varname} [, {def}]) *getbufvar()* The result is the value of option or local buffer variable {varname} in buffer {expr}. Note that the name without "b:" @@ -4835,8 +4838,11 @@ getbufvar({expr}, {varname} [, {def}]) Examples: > :let bufmodified = getbufvar(1, "&mod") :echo "todo myvar = " . getbufvar("todo", "myvar") -< -getchangelist({expr}) *getchangelist()* + +< Can also be used as a |method|: > + GetBufnr()->getbufvar(varname) +< +getchangelist([{expr}]) *getchangelist()* Returns the |changelist| for the buffer {expr}. For the use of {expr}, see |bufname()| above. If buffer {expr} doesn't exist, an empty list is returned. @@ -4852,6 +4858,9 @@ getchangelist({expr}) *getchangelist position refers to the position in the list. For other buffers, it is set to the length of the list. + Can also be used as a |method|: > + GetBufnr()->getchangelist() + getchar([expr]) *getchar()* Get a single character from the user or input stream. If [expr] is omitted, wait until a character is available. @@ -5051,6 +5060,9 @@ getcompletion({pat}, {type} [, {filtered If there are no matches, an empty list is returned. An invalid value for {type} produces an error. + Can also be used as a |method|: > + GetPattern()->getcompletion('color') +< *getcurpos()* getcurpos() Get the position of the cursor. This is like getpos('.'), but includes an extra item in the list: @@ -5097,6 +5109,9 @@ getcwd([{winnr} [, {tabnr}]]) :echo getcwd(-1, 3) " Get the working directory of current tabpage :echo getcwd(-1, 0) + +< Can also be used as a |method|: > + GetWinnr()->getcwd() < getenv({name}) *getenv()* Return the value of environment variable {name}. @@ -5105,6 +5120,9 @@ getenv({name}) *getenv()* some systems interpret the empty value as the variable being deleted. See also |expr-env|. + Can also be used as a |method|: > + GetVarname()->getenv() + getfontname([{name}]) *getfontname()* Without an argument returns the name of the normal font being used. Like what is used for the Normal highlight group @@ -5134,6 +5152,9 @@ getfperm({fname}) *getfperm()* < This will hopefully (from a security point of view) display the string "rw-r--r--" or even "rw-------". + Can also be used as a |method|: > + GetFilename()->getfperm() +< For setting permissions use |setfperm()|. getfsize({fname}) *getfsize()* @@ -5144,6 +5165,9 @@ getfsize({fname}) *getfsize()* If the size of {fname} is too big to fit in a Number then -2 is returned. + Can also be used as a |method|: > + GetFilename()->getfsize() + getftime({fname}) *getftime()* The result is a Number, which is the last modification time of the given file {fname}. The value is measured as seconds @@ -5151,6 +5175,9 @@ getftime({fname}) *getftime()* |localtime()| and |strftime()|. If the file {fname} can't be found -1 is returned. + Can also be used as a |method|: > + GetFilename()->getftime() + getftype({fname}) *getftype()* The result is a String, which is a description of the kind of file of the given file {fname}. @@ -5172,6 +5199,9 @@ getftype({fname}) *getftype()* "file" are returned. On MS-Windows a symbolic link to a directory returns "dir" instead of "link". + Can also be used as a |method|: > + GetFilename()->getftype() + getjumplist([{winnr} [, {tabnr}]]) *getjumplist()* Returns the |jumplist| for the specified window. @@ -5191,7 +5221,10 @@ getjumplist([{winnr} [, {tabnr}]]) *ge filename filename if available lnum line number - *getline()* + Can also be used as a |method|: > + GetWinnr()->getjumplist() + +< *getline()* getline({lnum} [, {end}]) Without {end} the result is a String, which is line {lnum} from the current buffer. Example: > @@ -5214,6 +5247,9 @@ getline({lnum} [, {end}]) :let end = search("^$") - 1 :let lines = getline(start, end) +< Can also be used as a |method|: > + ComputeLnum()->getline() + < To get lines from another buffer see |getbufline()| getloclist({nr} [, {what}]) *getloclist()* @@ -5289,6 +5325,9 @@ getpos({expr}) Get the position for {exp call setpos("'a", save_a_mark) < Also see |getcurpos()| and |setpos()|. + Can also be used as a |method|: > + GetMark()->getpos() + getqflist([{what}]) *getqflist()* Returns a list with all the current quickfix errors. Each @@ -5405,6 +5444,9 @@ getreg([{regname} [, 1 [, {list}]]]) * If {regname} is not specified, |v:register| is used. + Can also be used as a |method|: > + GetRegname()->getreg() + getregtype([{regname}]) *getregtype()* The result is a String, which is type of register {regname}. @@ -5416,6 +5458,9 @@ getregtype([{regname}]) *getregtype( is one character with value 0x16. If {regname} is not specified, |v:register| is used. + Can also be used as a |method|: > + GetRegname()->getregtype() + gettabinfo([{arg}]) *gettabinfo()* If {arg} is not specified, then information about all the tab pages is returned as a List. Each List item is a Dictionary. @@ -5429,6 +5474,9 @@ gettabinfo([{arg}]) *gettabinfo()* tabpage-local variables windows List of |window-ID|s in the tab page. + Can also be used as a |method|: > + GetTabnr()->gettabinfo() + gettabvar({tabnr}, {varname} [, {def}]) *gettabvar()* Get the value of a tab-local variable {varname} in tab page {tabnr}. |t:var| @@ -5439,6 +5487,9 @@ gettabvar({tabnr}, {varname} [, {def}]) When the tab or variable doesn't exist {def} or an empty string is returned, there is no error message. + Can also be used as a |method|: > + GetTabnr()->gettabvar(varname) + gettabwinvar({tabnr}, {winnr}, {varname} [, {def}]) *gettabwinvar()* Get the value of window-local variable {varname} in window {winnr} in tab page {tabnr}. @@ -5465,6 +5516,9 @@ gettabwinvar({tabnr}, {winnr}, {varname} To obtain all window-local variables use: > gettabwinvar({tabnr}, {winnr}, '&') +< Can also be used as a |method|: > + GetTabnr()->gettabvar(winnr, varname) + gettagstack([{nr}]) *gettagstack()* The result is a Dict, which is the tag stack of window {nr}. {nr} can be the window number or the |window-ID|. @@ -8006,6 +8060,9 @@ setfperm({fname}, {mode}) *setfperm() Returns non-zero for success, zero for failure. + Can also be used as a |method|: > + GetFilename()->setfperm(mode) +< To read permissions see |getfperm()|. diff --git a/src/evalfunc.c b/src/evalfunc.c --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -561,9 +561,9 @@ static funcentry_T global_functions[] = {"garbagecollect", 0, 1, 0, f_garbagecollect}, {"get", 2, 3, FEARG_1, f_get}, {"getbufinfo", 0, 1, 0, f_getbufinfo}, - {"getbufline", 2, 3, 0, f_getbufline}, - {"getbufvar", 2, 3, 0, f_getbufvar}, - {"getchangelist", 1, 1, 0, f_getchangelist}, + {"getbufline", 2, 3, FEARG_1, f_getbufline}, + {"getbufvar", 2, 3, FEARG_1, f_getbufvar}, + {"getchangelist", 0, 1, FEARG_1, f_getchangelist}, {"getchar", 0, 1, 0, f_getchar}, {"getcharmod", 0, 0, 0, f_getcharmod}, {"getcharsearch", 0, 0, 0, f_getcharsearch}, @@ -571,27 +571,27 @@ static funcentry_T global_functions[] = {"getcmdpos", 0, 0, 0, f_getcmdpos}, {"getcmdtype", 0, 0, 0, f_getcmdtype}, {"getcmdwintype", 0, 0, 0, f_getcmdwintype}, - {"getcompletion", 2, 3, 0, f_getcompletion}, + {"getcompletion", 2, 3, FEARG_1, f_getcompletion}, {"getcurpos", 0, 0, 0, f_getcurpos}, - {"getcwd", 0, 2, 0, f_getcwd}, - {"getenv", 1, 1, 0, f_getenv}, + {"getcwd", 0, 2, FEARG_1, f_getcwd}, + {"getenv", 1, 1, FEARG_1, f_getenv}, {"getfontname", 0, 1, 0, f_getfontname}, - {"getfperm", 1, 1, 0, f_getfperm}, - {"getfsize", 1, 1, 0, f_getfsize}, - {"getftime", 1, 1, 0, f_getftime}, - {"getftype", 1, 1, 0, f_getftype}, - {"getjumplist", 0, 2, 0, f_getjumplist}, - {"getline", 1, 2, 0, f_getline}, + {"getfperm", 1, 1, FEARG_1, f_getfperm}, + {"getfsize", 1, 1, FEARG_1, f_getfsize}, + {"getftime", 1, 1, FEARG_1, f_getftime}, + {"getftype", 1, 1, FEARG_1, f_getftype}, + {"getjumplist", 0, 2, FEARG_1, f_getjumplist}, + {"getline", 1, 2, FEARG_1, f_getline}, {"getloclist", 1, 2, 0, f_getloclist}, {"getmatches", 0, 1, 0, f_getmatches}, {"getpid", 0, 0, 0, f_getpid}, - {"getpos", 1, 1, 0, f_getpos}, + {"getpos", 1, 1, FEARG_1, f_getpos}, {"getqflist", 0, 1, 0, f_getqflist}, - {"getreg", 0, 3, 0, f_getreg}, - {"getregtype", 0, 1, 0, f_getregtype}, - {"gettabinfo", 0, 1, 0, f_gettabinfo}, - {"gettabvar", 2, 3, 0, f_gettabvar}, - {"gettabwinvar", 3, 4, 0, f_gettabwinvar}, + {"getreg", 0, 3, FEARG_1, f_getreg}, + {"getregtype", 0, 1, FEARG_1, f_getregtype}, + {"gettabinfo", 0, 1, FEARG_1, f_gettabinfo}, + {"gettabvar", 2, 3, FEARG_1, f_gettabvar}, + {"gettabwinvar", 3, 4, FEARG_1, f_gettabwinvar}, {"gettagstack", 0, 1, 0, f_gettagstack}, {"getwininfo", 0, 1, 0, f_getwininfo}, {"getwinpos", 0, 1, 0, f_getwinpos}, @@ -793,7 +793,7 @@ static funcentry_T global_functions[] = {"setcharsearch", 1, 1, 0, f_setcharsearch}, {"setcmdpos", 1, 1, 0, f_setcmdpos}, {"setenv", 2, 2, 0, f_setenv}, - {"setfperm", 2, 2, 0, f_setfperm}, + {"setfperm", 2, 2, FEARG_1, f_setfperm}, {"setline", 2, 2, 0, f_setline}, {"setloclist", 2, 4, 0, f_setloclist}, {"setmatches", 1, 2, 0, f_setmatches}, @@ -4477,10 +4477,15 @@ f_getchangelist(typval_T *argvars, typva return; #ifdef FEAT_JUMPLIST - (void)tv_get_number(&argvars[0]); /* issue errmsg if type error */ - ++emsg_off; - buf = tv_get_buf(&argvars[0], FALSE); - --emsg_off; + if (argvars[0].v_type == VAR_UNKNOWN) + buf = curbuf; + else + { + (void)tv_get_number(&argvars[0]); // issue errmsg if type error + ++emsg_off; + buf = tv_get_buf(&argvars[0], FALSE); + --emsg_off; + } if (buf == NULL) return; diff --git a/src/testdir/test_bufline.vim b/src/testdir/test_bufline.vim --- a/src/testdir/test_bufline.vim +++ b/src/testdir/test_bufline.vim @@ -22,7 +22,7 @@ func Test_setbufline_getbufline() call assert_equal(1, setbufline(b, 5, ['x'])) call assert_equal(1, setbufline(bufnr('$') + 1, 1, ['x'])) call assert_equal(0, setbufline(b, 4, ['d', 'e'])) - call assert_equal(['c'], getbufline(b, 3)) + call assert_equal(['c'], b->getbufline(3)) call assert_equal(['d'], getbufline(b, 4)) call assert_equal(['e'], getbufline(b, 5)) call assert_equal([], getbufline(b, 6)) diff --git a/src/testdir/test_bufwintabinfo.vim b/src/testdir/test_bufwintabinfo.vim --- a/src/testdir/test_bufwintabinfo.vim +++ b/src/testdir/test_bufwintabinfo.vim @@ -88,7 +88,7 @@ function Test_getbufwintabinfo() call assert_equal(2, tablist[1].tabnr) call assert_equal('build', tablist[0].variables.space) call assert_equal(w2_id, tablist[0].windows[0]) - call assert_equal([], gettabinfo(3)) + call assert_equal([], 3->gettabinfo()) tabonly | only @@ -106,7 +106,7 @@ function Test_getbufwintabinfo() endfunction function Test_get_buf_options() - let opts = getbufvar(bufnr('%'), '&') + let opts = bufnr()->getbufvar('&') call assert_equal(v:t_dict, type(opts)) call assert_equal(8, opts.tabstop) endfunc diff --git a/src/testdir/test_cd.vim b/src/testdir/test_cd.vim --- a/src/testdir/test_cd.vim +++ b/src/testdir/test_cd.vim @@ -83,7 +83,7 @@ func Test_chdir_func() tabfirst call chdir('..') call assert_equal('y', fnamemodify(getcwd(1, 2), ':t')) - call assert_equal('z', fnamemodify(getcwd(3, 2), ':t')) + call assert_equal('z', fnamemodify(3->getcwd(2), ':t')) tabnext | wincmd t eval '..'->chdir() call assert_equal('Xdir', fnamemodify(getcwd(1, 2), ':t')) diff --git a/src/testdir/test_changelist.vim b/src/testdir/test_changelist.vim --- a/src/testdir/test_changelist.vim +++ b/src/testdir/test_changelist.vim @@ -8,8 +8,8 @@ func Test_getchangelist() bwipe! enew - call assert_equal([], getchangelist(10)) - call assert_equal([[], 0], getchangelist('%')) + call assert_equal([], 10->getchangelist()) + call assert_equal([[], 0], getchangelist()) call writefile(['line1', 'line2', 'line3'], 'Xfile1.txt') call writefile(['line1', 'line2', 'line3'], 'Xfile2.txt') diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim --- a/src/testdir/test_cmdline.vim +++ b/src/testdir/test_cmdline.vim @@ -209,7 +209,7 @@ func Test_getcompletion() endif let groupcount = len(getcompletion('', 'event')) call assert_true(groupcount > 0) - let matchcount = len(getcompletion('File', 'event')) + let matchcount = len('File'->getcompletion('event')) call assert_true(matchcount > 0) call assert_true(groupcount > matchcount) diff --git a/src/testdir/test_edit.vim b/src/testdir/test_edit.vim --- a/src/testdir/test_edit.vim +++ b/src/testdir/test_edit.vim @@ -199,11 +199,11 @@ func Test_edit_07() endfu au InsertCharPre :call DoIt() call feedkeys("A\\u\\\", 'tx') - call assert_equal(["Jan\",''], getline(1,'$')) + call assert_equal(["Jan\",''], 1->getline('$')) %d call setline(1, 'J') call feedkeys("A\\u\\\", 'tx') - call assert_equal(["January"], getline(1,'$')) + call assert_equal(["January"], 1->getline('$')) delfu ListMonths delfu DoIt @@ -345,7 +345,7 @@ func Test_edit_12() call cursor(2, 4) call feedkeys("R^\", 'tnix') call assert_equal(["\tabc", "def"], getline(1, '$')) - call assert_equal([0, 2, 2, 0], getpos('.')) + call assert_equal([0, 2, 2, 0], '.'->getpos()) %d call setline(1, ["\tabc", "\t\tdef"]) call cursor(2, 2) diff --git a/src/testdir/test_environ.vim b/src/testdir/test_environ.vim --- a/src/testdir/test_environ.vim +++ b/src/testdir/test_environ.vim @@ -11,7 +11,7 @@ endfunc func Test_getenv() unlet! $TESTENV - call assert_equal(v:null, getenv('TESTENV')) + call assert_equal(v:null, 'TESTENV'->getenv()) let $TESTENV = 'foo' call assert_equal('foo', getenv('TESTENV')) endfunc diff --git a/src/testdir/test_file_perm.vim b/src/testdir/test_file_perm.vim --- a/src/testdir/test_file_perm.vim +++ b/src/testdir/test_file_perm.vim @@ -2,10 +2,10 @@ func Test_file_perm() call assert_equal('', getfperm('Xtest')) - call assert_equal(0, setfperm('Xtest', 'r--------')) + call assert_equal(0, 'Xtest'->setfperm('r--------')) call writefile(['one'], 'Xtest') - call assert_true(len(getfperm('Xtest')) == 9) + call assert_true(len('Xtest'->getfperm()) == 9) call assert_equal(1, setfperm('Xtest', 'rwx------')) if has('win32') diff --git a/src/testdir/test_getvar.vim b/src/testdir/test_getvar.vim --- a/src/testdir/test_getvar.vim +++ b/src/testdir/test_getvar.vim @@ -31,7 +31,7 @@ func Test_var() let t:other = 777 let def_list = [4, 5, 6, 7] tabrewind - call assert_equal([1, 2, 3], gettabvar(3, 'var_list')) + call assert_equal([1, 2, 3], 3->gettabvar('var_list')) call assert_equal([1, 2, 3], gettabvar(3, 'var_list', def_list)) call assert_equal({'var_list': [1, 2, 3], 'other': 777}, gettabvar(3, '')) call assert_equal({'var_list': [1, 2, 3], 'other': 777}, @@ -61,7 +61,7 @@ func Test_var() let def_dict = {'dict2': 'newval'} wincmd b tabrewind - call assert_equal({'dict': 'tabwin'}, gettabwinvar(2, 3, 'var_dict')) + call assert_equal({'dict': 'tabwin'}, 2->gettabwinvar(3, 'var_dict')) call assert_equal({'dict': 'tabwin'}, \ gettabwinvar(2, 3, 'var_dict', def_dict)) call assert_equal({'var_dict': {'dict': 'tabwin'}}, gettabwinvar(2, 3, '')) diff --git a/src/testdir/test_jumplist.vim b/src/testdir/test_jumplist.vim --- a/src/testdir/test_jumplist.vim +++ b/src/testdir/test_jumplist.vim @@ -39,7 +39,7 @@ func Test_getjumplist() " Traverse the jump list and verify the results 5 exe "normal \" - call assert_equal(2, getjumplist(1)[1]) + call assert_equal(2, 1->getjumplist()[1]) exe "normal 2\" call assert_equal(0, getjumplist(1, 1)[1]) exe "normal 3\" diff --git a/src/testdir/test_put.vim b/src/testdir/test_put.vim --- a/src/testdir/test_put.vim +++ b/src/testdir/test_put.vim @@ -22,7 +22,7 @@ endfunc func Test_put_char_block2() new - let a = [ getreg('a'), getregtype('a') ] + let a = [ 'a'->getreg(), 'a'->getregtype() ] call setreg('a', ' one ', 'v') call setline(1, ['Line 1', '', 'Line 3', '']) " visually select the first 3 lines and put register a over it diff --git a/src/testdir/test_stat.vim b/src/testdir/test_stat.vim --- a/src/testdir/test_stat.vim +++ b/src/testdir/test_stat.vim @@ -10,7 +10,7 @@ func CheckFileTime(doSleep) let fl = ['Hello World!'] for fname in fnames call writefile(fl, fname) - call add(times, getftime(fname)) + call add(times, fname->getftime()) if a:doSleep sleep 1 endif @@ -19,8 +19,8 @@ func CheckFileTime(doSleep) let time_correct = (times[0] <= times[1] && times[1] <= times[2]) if a:doSleep || time_correct call assert_true(time_correct, printf('Expected %s <= %s <= %s', times[0], times[1], times[2])) - call assert_equal(strlen(fl[0] . "\n"), getfsize(fnames[0])) - call assert_equal('file', getftype(fnames[0])) + call assert_equal(strlen(fl[0] . "\n"), fnames[0]->getfsize()) + call assert_equal('file', fnames[0]->getftype()) call assert_equal('rw-', getfperm(fnames[0])[0:2]) let result = 1 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 */ /**/ + 1925, +/**/ 1924, /**/ 1923,