# HG changeset patch # User Bram Moolenaar # Date 1567279804 -7200 # Node ID af3d441845cd80ed9ca0396a8ce41d06bd9b189e # Parent be8ab5bb74ce354ee6a1ef09e292e08cc57625e0 patch 8.1.1953: more functions can be used as a method Commit: https://github.com/vim/vim/commit/f9f24ce7a0e5988fedf2e2ff751818f9b07510a6 Author: Bram Moolenaar Date: Sat Aug 31 21:17:39 2019 +0200 patch 8.1.1953: more functions can be used as a method Problem: More functions can be used as a method. Solution: Allow more functions to be used 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 @@ -5774,6 +5774,9 @@ haslocaldir([{winnr} [, {tabnr}]]) *ha " tab page m :echo haslocaldir(-1, m) < + Can also be used as a |method|: > + GetWinnr()->haslocaldir() + hasmapto({what} [, {mode} [, {abbr}]]) *hasmapto()* The result is a Number, which is 1 if there is a mapping that contains {what} in somewhere in the rhs (what it is mapped to) @@ -5802,6 +5805,9 @@ hasmapto({what} [, {mode} [, {abbr}]]) < This installs the mapping to "\ABCdoit" only if there isn't already a mapping to "\ABCdoit". + Can also be used as a |method|: > + GetRHS()->hasmapto() + histadd({history}, {item}) *histadd()* Add the String {item} to the history {history} which can be one of: *hist-names* @@ -5823,6 +5829,10 @@ histadd({history}, {item}) *histadd() :let date=input("Enter date: ") < This function is not available in the |sandbox|. + Can also be used as a |method|, the base is used for the + second argument: > + GetPattern()->histadd('search') + histdel({history} [, {item}]) *histdel()* Clear {history}, i.e. delete all its entries. See |hist-names| for the possible values of {history}. @@ -5854,6 +5864,9 @@ histdel({history} [, {item}]) *histde the "n" command and 'hlsearch': > :call histdel("search", -1) :let @/ = histget("search", -1) +< + Can also be used as a |method|: > + GetHistory()->histdel() histget({history} [, {index}]) *histget()* The result is a String, the entry with Number {index} from @@ -5870,6 +5883,9 @@ histget({history} [, {index}]) *histg the {num}th entry from the output of |:history|. > :command -nargs=1 H execute histget("cmd", 0+) < + Can also be used as a |method|: > + GetHistory()->histget() + histnr({history}) *histnr()* The result is the Number of the current entry in {history}. See |hist-names| for the possible values of {history}. @@ -5877,6 +5893,9 @@ histnr({history}) *histnr()* Example: > :let inp_index = histnr("expr") + +< Can also be used as a |method|: > + GetHistory()->histnr() < hlexists({name}) *hlexists()* The result is a Number, which is non-zero if a highlight group @@ -5887,6 +5906,9 @@ hlexists({name}) *hlexists()* *highlight_exists()* Obsolete name: highlight_exists(). + Can also be used as a |method|: > + GetName()->hlexists() +< *hlID()* hlID({name}) The result is a Number, which is the ID of the highlight group with name {name}. When the highlight group doesn't exist, @@ -5898,6 +5920,9 @@ hlID({name}) The result is a Number, whi < *highlightID()* Obsolete name: highlightID(). + Can also be used as a |method|: > + GetName()->hlID() + hostname() *hostname()* The result is a String, which is the name of the machine on which Vim is currently running. Machine names greater than @@ -5922,6 +5947,9 @@ iconv({expr}, {from}, {to}) *iconv()* from/to UCS-2 is automatically changed to use UTF-8. You cannot use UCS-2 in a string anyway, because of the NUL bytes. + Can also be used as a |method|: > + GetText()->iconv('latin1', 'utf-8') +< *indent()* indent({lnum}) The result is a Number, which is indent of line {lnum} in the current buffer. The indent is counted in spaces, the value @@ -5929,6 +5957,8 @@ indent({lnum}) The result is a Number, w |getline()|. When {lnum} is invalid -1 is returned. + Can also be used as a |method|: > + GetLnum()->indent() index({object}, {expr} [, {start} [, {ic}]]) *index()* If {object} is a |List| return the lowest index where the item @@ -5949,6 +5979,8 @@ index({object}, {expr} [, {start} [, {ic :let idx = index(words, "the") :if index(numbers, 123) >= 0 +< Can also be used as a |method|: > + GetObject()->index(what) input({prompt} [, {text} [, {completion}]]) *input()* The result is a String, which is whatever the user typed on @@ -5995,6 +6027,9 @@ input({prompt} [, {text} [, {completion} : call inputrestore() :endfunction +< Can also be used as a |method|: > + GetPrompt()->input() + inputdialog({prompt} [, {text} [, {cancelreturn}]]) *inputdialog()* Like |input()|, but when the GUI is running and text dialogs are supported, a dialog window pops up to input the text. @@ -6009,6 +6044,9 @@ inputdialog({prompt} [, {text} [, {cance works like pressing the Cancel button. NOTE: Command-line completion is not supported. + Can also be used as a |method|: > + GetPrompt()->inputdialog() + inputlist({textlist}) *inputlist()* {textlist} must be a |List| of strings. This |List| is displayed, one string per line. The user will be prompted to @@ -6025,6 +6063,9 @@ inputlist({textlist}) *inputlist()* let color = inputlist(['Select color:', '1. red', \ '2. green', '3. blue']) +< Can also be used as a |method|: > + GetChoices()->inputlist() + inputrestore() *inputrestore()* Restore typeahead that was saved with a previous |inputsave()|. Should be called the same number of times inputsave() is @@ -6050,6 +6091,9 @@ inputsecret({prompt} [, {text}]) *inpu typed on the command-line in response to the issued prompt. NOTE: Command-line completion is not supported. + Can also be used as a |method|: > + GetPrompt()->inputsecret() + insert({object}, {item} [, {idx}]) *insert()* When {object} is a |List| or a |Blob| insert {item} at the start of it. @@ -6083,6 +6127,9 @@ isdirectory({directory}) *isdirectory exist, or isn't a directory, the result is |FALSE|. {directory} is any expression, which is used as a String. + Can also be used as a |method|: > + GetName()->isdirectory() + isinf({expr}) *isinf()* Return 1 if {expr} is a positive infinity, or -1 a negative infinity, otherwise 0. > @@ -6109,6 +6156,9 @@ islocked({expr}) *islocked()* *E786* < When {expr} is a variable that does not exist you get an error message. Use |exists()| to check for existence. + Can also be used as a |method|: > + GetName()->islocked() + isnan({expr}) *isnan()* Return |TRUE| if {expr} is a float with value NaN. > echo isnan(0.0 / 0.0) diff --git a/src/evalfunc.c b/src/evalfunc.c --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -595,33 +595,33 @@ static funcentry_T global_functions[] = {"globpath", 2, 5, FEARG_2, f_globpath}, {"has", 1, 1, 0, f_has}, {"has_key", 2, 2, FEARG_1, f_has_key}, - {"haslocaldir", 0, 2, 0, f_haslocaldir}, - {"hasmapto", 1, 3, 0, f_hasmapto}, - {"highlightID", 1, 1, 0, f_hlID}, // obsolete - {"highlight_exists",1, 1, 0, f_hlexists}, // obsolete - {"histadd", 2, 2, 0, f_histadd}, - {"histdel", 1, 2, 0, f_histdel}, - {"histget", 1, 2, 0, f_histget}, - {"histnr", 1, 1, 0, f_histnr}, - {"hlID", 1, 1, 0, f_hlID}, - {"hlexists", 1, 1, 0, f_hlexists}, + {"haslocaldir", 0, 2, FEARG_1, f_haslocaldir}, + {"hasmapto", 1, 3, FEARG_1, f_hasmapto}, + {"highlightID", 1, 1, FEARG_1, f_hlID}, // obsolete + {"highlight_exists",1, 1, FEARG_1, f_hlexists}, // obsolete + {"histadd", 2, 2, FEARG_2, f_histadd}, + {"histdel", 1, 2, FEARG_1, f_histdel}, + {"histget", 1, 2, FEARG_1, f_histget}, + {"histnr", 1, 1, FEARG_1, f_histnr}, + {"hlID", 1, 1, FEARG_1, f_hlID}, + {"hlexists", 1, 1, FEARG_1, f_hlexists}, {"hostname", 0, 0, 0, f_hostname}, - {"iconv", 3, 3, 0, f_iconv}, - {"indent", 1, 1, 0, f_indent}, + {"iconv", 3, 3, FEARG_1, f_iconv}, + {"indent", 1, 1, FEARG_1, f_indent}, {"index", 2, 4, FEARG_1, f_index}, - {"input", 1, 3, 0, f_input}, - {"inputdialog", 1, 3, 0, f_inputdialog}, - {"inputlist", 1, 1, 0, f_inputlist}, + {"input", 1, 3, FEARG_1, f_input}, + {"inputdialog", 1, 3, FEARG_1, f_inputdialog}, + {"inputlist", 1, 1, FEARG_1, f_inputlist}, {"inputrestore", 0, 0, 0, f_inputrestore}, {"inputsave", 0, 0, 0, f_inputsave}, - {"inputsecret", 1, 2, 0, f_inputsecret}, + {"inputsecret", 1, 2, FEARG_1, f_inputsecret}, {"insert", 2, 3, FEARG_1, f_insert}, {"invert", 1, 1, FEARG_1, f_invert}, - {"isdirectory", 1, 1, 0, f_isdirectory}, + {"isdirectory", 1, 1, FEARG_1, f_isdirectory}, #if defined(FEAT_FLOAT) && defined(HAVE_MATH_H) {"isinf", 1, 1, FEARG_1, f_isinf}, #endif - {"islocked", 1, 1, 0, f_islocked}, + {"islocked", 1, 1, FEARG_1, f_islocked}, #if defined(FEAT_FLOAT) && defined(HAVE_MATH_H) {"isnan", 1, 1, FEARG_1, f_isnan}, #endif diff --git a/src/testdir/test_blob.vim b/src/testdir/test_blob.vim --- a/src/testdir/test_blob.vim +++ b/src/testdir/test_blob.vim @@ -278,7 +278,7 @@ func Test_blob_index() call assert_equal(2, index(0zDEADBEEF, 0xBE)) call assert_equal(-1, index(0zDEADBEEF, 0)) call assert_equal(2, index(0z11111111, 0x11, 2)) - call assert_equal(3, index(0z11110111, 0x11, 2)) + call assert_equal(3, 0z11110111->index(0x11, 2)) call assert_equal(2, index(0z11111111, 0x11, -2)) call assert_equal(3, index(0z11110111, 0x11, -2)) 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 @@ -411,7 +411,7 @@ func Test_breakindent11() " test strdisplaywidth() call s:test_windows('setl cpo-=n sbr=>> nu nuw=4 nolist briopt= ts=4') let text = getline(2) - let width = strlen(text[1:])+indent(2)+strlen(&sbr)*3 " text wraps 3 times + let width = strlen(text[1:]) + indent(2) + strlen(&sbr) * 3 " text wraps 3 times call assert_equal(width, strdisplaywidth(text)) call s:close_windows('set sbr=') endfunc @@ -423,7 +423,7 @@ func Test_breakindent11_vartabs() " test strdisplaywidth() 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:])+indent(2)+strlen(&sbr)*3 " text wraps 3 times + let width = strlen(text[1:]) + 2->indent() + strlen(&sbr) * 3 " text wraps 3 times call assert_equal(width, strdisplaywidth(text)) call s:close_windows('set sbr= vts&') endfunc diff --git a/src/testdir/test_delete.vim b/src/testdir/test_delete.vim --- a/src/testdir/test_delete.vim +++ b/src/testdir/test_delete.vim @@ -32,7 +32,7 @@ func Test_recursive_delete() call assert_equal(['a', 'b'], readfile('Xdir1/Xfile')) call assert_true(isdirectory('Xdir1/subdir')) call assert_equal(['a', 'b'], readfile('Xdir1/subdir/Xfile')) - call assert_true(isdirectory('Xdir1/empty')) + call assert_true('Xdir1/empty'->isdirectory()) call assert_equal(0, delete('Xdir1', 'rf')) call assert_false(isdirectory('Xdir1')) call assert_equal(-1, delete('Xdir1', 'd')) 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 @@ -1069,7 +1069,7 @@ endfunc func Test_hlexists() call assert_equal(0, hlexists('does_not_exist')) - call assert_equal(0, hlexists('Number')) + call assert_equal(0, 'Number'->hlexists()) call assert_equal(0, highlight_exists('does_not_exist')) call assert_equal(0, highlight_exists('Number')) syntax on @@ -1102,7 +1102,7 @@ endfunc func Test_inputlist() call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\1\", 'tx') call assert_equal(1, c) - call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\2\", 'tx') + call feedkeys(":let c = ['Select color:', '1. red', '2. green', '3. blue']->inputlist()\2\", 'tx') call assert_equal(2, c) call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\3\", 'tx') call assert_equal(3, c) @@ -1279,7 +1279,7 @@ func Test_reg_executing_and_recording() let g:regs = [] func TestFunc() abort let g:regs += [reg_executing()] - let g:typed = input('?') + let g:typed = '?'->input() let g:regs += [reg_executing()] endfunc call feedkeys("@qy\", 'xt') @@ -1295,6 +1295,25 @@ func Test_reg_executing_and_recording() unlet s:reg_stat endfunc +func Test_inputsecret() + map W :call TestFunc() + let @q = "W" + let g:typed1 = '' + let g:typed2 = '' + let g:regs = [] + func TestFunc() abort + let g:typed1 = '?'->inputsecret() + let g:typed2 = inputsecret('password: ') + endfunc + call feedkeys("@qsomething\else\", 'xt') + call assert_equal("something", g:typed1) + call assert_equal("else", g:typed2) + delfunc TestFunc + unmap W + unlet g:typed1 + unlet g:typed2 +endfunc + func Test_libcall_libcallnr() if !has('libcall') return diff --git a/src/testdir/test_getcwd.vim b/src/testdir/test_getcwd.vim --- a/src/testdir/test_getcwd.vim +++ b/src/testdir/test_getcwd.vim @@ -17,7 +17,7 @@ func GetCwdInfo(win, tab) let lflag = haslocaldir(a:win) else let dirname = fnamemodify(getcwd(a:win, a:tab), mod) - let lflag = haslocaldir(a:win, a:tab) + let lflag = a:win->haslocaldir(a:tab) endif return bufname . ' ' . dirname . ' ' . lflag endfunc diff --git a/src/testdir/test_history.vim b/src/testdir/test_history.vim --- a/src/testdir/test_history.vim +++ b/src/testdir/test_history.vim @@ -12,7 +12,7 @@ function History_Tests(hist) call assert_equal(-1, histnr(a:hist)) call assert_equal('', histget(a:hist)) - call assert_true(histadd(a:hist, 'ls')) + call assert_true('ls'->histadd(a:hist)) call assert_true(histadd(a:hist, 'buffers')) call assert_equal('buffers', histget(a:hist)) call assert_equal('ls', histget(a:hist, -2)) @@ -21,14 +21,14 @@ function History_Tests(hist) call assert_equal('', histget(a:hist, -5)) call assert_equal(2, histnr(a:hist)) call assert_true(histdel(a:hist, 2)) - call assert_false(histdel(a:hist, 7)) + call assert_false(a:hist->histdel(7)) call assert_equal(1, histnr(a:hist)) call assert_equal('ls', histget(a:hist, -1)) call assert_true(histadd(a:hist, 'buffers')) call assert_true(histadd(a:hist, 'ls')) - call assert_equal('ls', histget(a:hist, -1)) - call assert_equal(4, histnr(a:hist)) + call assert_equal('ls', a:hist->histget(-1)) + call assert_equal(4, a:hist->histnr()) let a=execute('history ' . a:hist) call assert_match("^\n # \\S* history\n 3 buffers\n> 4 ls$", a) diff --git a/src/testdir/test_listdict.vim b/src/testdir/test_listdict.vim --- a/src/testdir/test_listdict.vim +++ b/src/testdir/test_listdict.vim @@ -565,7 +565,7 @@ func Test_lockvar_script_autoload() set rtp+=./sautest lockvar g:footest#x unlockvar g:footest#x - call assert_equal(-1, islocked('g:footest#x')) + call assert_equal(-1, 'g:footest#x'->islocked()) call assert_equal(0, exists('g:footest#x')) call assert_equal(1, g:footest#x) let &rtp = old_rtp diff --git a/src/testdir/test_syn_attr.vim b/src/testdir/test_syn_attr.vim --- a/src/testdir/test_syn_attr.vim +++ b/src/testdir/test_syn_attr.vim @@ -3,7 +3,7 @@ func Test_missing_attr() hi Mine term=bold cterm=italic call assert_equal('Mine', synIDattr(hlID("Mine"), "name")) - call assert_equal('', synIDattr(hlID("Mine"), "bg", 'term')) + call assert_equal('', synIDattr("Mine"->hlID(), "bg", 'term')) call assert_equal('1', synIDattr(hlID("Mine"), "bold", 'term')) call assert_equal('1', synIDattr(hlID("Mine"), "italic", 'cterm')) hi Mine term=reverse cterm=inverse @@ -12,7 +12,7 @@ func Test_missing_attr() hi Mine term=underline cterm=standout gui=undercurl call assert_equal('1', synIDattr(hlID("Mine"), "underline", 'term')) call assert_equal('1', synIDattr(hlID("Mine"), "standout", 'cterm')) - call assert_equal('1', synIDattr(hlID("Mine"), "undercurl", 'gui')) + call assert_equal('1', synIDattr("Mine"->hlID(), "undercurl", 'gui')) hi Mine term=NONE cterm=NONE gui=NONE call assert_equal('', synIDattr(hlID("Mine"), "bold", 'term')) call assert_equal('', synIDattr(hlID("Mine"), "italic", 'cterm')) diff --git a/src/testdir/test_termcodes.vim b/src/testdir/test_termcodes.vim --- a/src/testdir/test_termcodes.vim +++ b/src/testdir/test_termcodes.vim @@ -33,7 +33,7 @@ func TerminalEscapeCode(code, row, col, " need to use byte encoding here. let str = list2str([a:code + 0x20, a:col + 0x20, a:row + 0x20]) if has('iconv') - let bytes = iconv(str, 'utf-8', 'latin1') + let bytes = str->iconv('utf-8', 'latin1') else " Hopefully the numbers are not too big. let bytes = str diff --git a/src/testdir/test_true_false.vim b/src/testdir/test_true_false.vim --- a/src/testdir/test_true_false.vim +++ b/src/testdir/test_true_false.vim @@ -100,7 +100,7 @@ func Test_true_false_arg() call Try_arg_true_false('maparg("asdf", "i", %v%)', "", "asdff") call Try_arg_true_false('FilterMapArg(maparg("asdf", "i", 1, %v%))', "asdff", {'rhs': 'asdff'}) - call Try_arg_true_false('hasmapto("asdf", "i", %v%)', 0, 1) + call Try_arg_true_false('"asdf"->hasmapto("i", %v%)', 0, 1) new colored call setline(1, '') 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 */ /**/ + 1953, +/**/ 1952, /**/ 1951,