To: vim_dev@googlegroups.com Subject: Patch 8.1.1961 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.1.1961 Problem: More functions can be used as a method. Solution: Allow more functions to be used as a method. Add a test for mapcheck(). Files: runtime/doc/eval.txt, src/evalfunc.c, src/testdir/test70.in, src/testdir/test_functions.vim, src/testdir/test_getcwd.vim, src/testdir/test_maparg.vim, src/testdir/test_match.vim *** ../vim-8.1.1960/runtime/doc/eval.txt 2019-08-31 22:16:30.770127033 +0200 --- runtime/doc/eval.txt 2019-09-01 19:13:56.334609314 +0200 *************** *** 6691,6696 **** --- 6699,6706 ---- mapped, and have it do the original mapping too. Sketch: > exe 'nnoremap ==' . maparg('', 'n') + < Can also be used as a |method|: > + GetKey()->maparg('n') mapcheck({name} [, {mode} [, {abbr}]]) *mapcheck()* Check if there is a mapping that matches with {name} in mode *************** *** 6725,6730 **** --- 6735,6743 ---- < This avoids adding the "_vv" mapping when there already is a mapping for "_v" or for "_vvv". + Can also be used as a |method|: > + GetKey()->mapcheck('n') + match({expr}, {pat} [, {start} [, {count}]]) *match()* When {expr} is a |List| then this returns the index of the first item where {pat} matches. Each item is used as a *************** *** 6783,6788 **** --- 6796,6804 ---- the pattern. 'smartcase' is NOT used. The matching is always done like 'magic' is set and 'cpoptions' is empty. + Can also be used as a |method|: > + GetList()->match('word') + < *matchadd()* *E798* *E799* *E801* *E957* matchadd({group}, {pattern} [, {priority} [, {id} [, {dict}]]]) Defines a pattern to be highlighted in the current window (a *************** *** 6838,6843 **** --- 6854,6862 ---- available from |getmatches()|. All matches can be deleted in one operation by |clearmatches()|. + Can also be used as a |method|: > + GetGroup()->matchadd('TODO') + < *matchaddpos()* matchaddpos({group}, {pos} [, {priority} [, {id} [, {dict}]]]) Same as |matchadd()|, but requires a list of positions {pos} *************** *** 6872,6877 **** --- 6891,6899 ---- |getmatches()| with an entry "pos1", "pos2", etc., with the value a list like the {pos} item. + Can also be used as a |method|: > + GetGroup()->matchaddpos([23, 11]) + matcharg({nr}) *matcharg()* Selects the {nr} match item, as set with a |:match|, |:2match| or |:3match| command. *************** *** 6884,6889 **** --- 6906,6914 ---- Highlighting matches using the |:match| commands are limited to three matches. |matchadd()| does not have this limitation. + Can also be used as a |method|: > + GetMatch()->matcharg() + matchdelete({id} [, {win}) *matchdelete()* *E802* *E803* Deletes a match with ID {id} previously defined by |matchadd()| or one of the |:match| commands. Returns 0 if successful, *************** *** 6892,6897 **** --- 6917,6925 ---- If {win} is specified, use the window with this number or window ID instead of the current window. + Can also be used as a |method|: > + GetMatch()->matchdelete() + matchend({expr}, {pat} [, {start} [, {count}]]) *matchend()* Same as |match()|, but return the index of first character after the match. Example: > *************** *** 6911,6916 **** --- 6939,6947 ---- < result is "-1". When {expr} is a |List| the result is equal to |match()|. + Can also be used as a |method|: > + GetText()->matchend('word') + matchlist({expr}, {pat} [, {start} [, {count}]]) *matchlist()* Same as |match()|, but return a |List|. The first item in the list is the matched string, same as what matchstr() would *************** *** 6921,6926 **** --- 6952,6960 ---- < Results in: ['acd', 'a', '', 'c', 'd', '', '', '', '', ''] When there is no match an empty list is returned. + Can also be used as a |method|: > + GetList()->matchlist('word') + matchstr({expr}, {pat} [, {start} [, {count}]]) *matchstr()* Same as |match()|, but return the matched string. Example: > :echo matchstr("testing", "ing") *************** *** 6934,6939 **** --- 6968,6976 ---- When {expr} is a |List| then the matching item is returned. The type isn't changed, it's not necessarily a String. + Can also be used as a |method|: > + GetText()->matchstr('word') + matchstrpos({expr}, {pat} [, {start} [, {count}]]) *matchstrpos()* Same as |matchstr()|, but return the matched string, the start position and the end position of the match. Example: > *************** *** 6952,6957 **** --- 6989,6996 ---- < result is ["x", 1, 2, 3]. The type isn't changed, it's not necessarily a String. + Can also be used as a |method|: > + GetText()->matchstrpos('word') *max()* max({expr}) Return the maximum value of all items in {expr}. {expr} can be a list or a dictionary. For a dictionary, *************** *** 7002,7007 **** --- 7041,7049 ---- Not available on all systems. To check use: > :if exists("*mkdir") + + < Can also be used as a |method|: > + GetName()->mkdir() < *mode()* mode([expr]) Return a string that indicates the current mode. *************** *** 7047,7052 **** --- 7089,7097 ---- the leading character(s). Also see |visualmode()|. + Can also be used as a |method|: > + DoFull()->mode() + mzeval({expr}) *mzeval()* Evaluate MzScheme expression {expr} and return its result converted to Vim data structures. *************** *** 7062,7067 **** --- 7107,7115 ---- :echo mzeval("l") :echo mzeval("h") < + Can also be used as a |method|: > + GetExpr()->mzeval() + < {only available when compiled with the |+mzscheme| feature} nextnonblank({lnum}) *nextnonblank()* *** ../vim-8.1.1960/src/evalfunc.c 2019-09-01 17:52:27.334698921 +0200 --- src/evalfunc.c 2019-09-01 19:15:00.406353348 +0200 *************** *** 655,677 **** {"luaeval", 1, 2, FEARG_1, f_luaeval}, #endif {"map", 2, 2, FEARG_1, f_map}, ! {"maparg", 1, 4, 0, f_maparg}, ! {"mapcheck", 1, 3, 0, f_mapcheck}, ! {"match", 2, 4, 0, f_match}, ! {"matchadd", 2, 5, 0, f_matchadd}, ! {"matchaddpos", 2, 5, 0, f_matchaddpos}, ! {"matcharg", 1, 1, 0, f_matcharg}, ! {"matchdelete", 1, 2, 0, f_matchdelete}, ! {"matchend", 2, 4, 0, f_matchend}, ! {"matchlist", 2, 4, 0, f_matchlist}, ! {"matchstr", 2, 4, 0, f_matchstr}, ! {"matchstrpos", 2, 4, 0, f_matchstrpos}, {"max", 1, 1, FEARG_1, f_max}, {"min", 1, 1, FEARG_1, f_min}, ! {"mkdir", 1, 3, 0, f_mkdir}, ! {"mode", 0, 1, 0, f_mode}, #ifdef FEAT_MZSCHEME ! {"mzeval", 1, 1, 0, f_mzeval}, #endif {"nextnonblank", 1, 1, 0, f_nextnonblank}, {"nr2char", 1, 2, 0, f_nr2char}, --- 655,677 ---- {"luaeval", 1, 2, FEARG_1, f_luaeval}, #endif {"map", 2, 2, FEARG_1, f_map}, ! {"maparg", 1, 4, FEARG_1, f_maparg}, ! {"mapcheck", 1, 3, FEARG_1, f_mapcheck}, ! {"match", 2, 4, FEARG_1, f_match}, ! {"matchadd", 2, 5, FEARG_1, f_matchadd}, ! {"matchaddpos", 2, 5, FEARG_1, f_matchaddpos}, ! {"matcharg", 1, 1, FEARG_1, f_matcharg}, ! {"matchdelete", 1, 2, FEARG_1, f_matchdelete}, ! {"matchend", 2, 4, FEARG_1, f_matchend}, ! {"matchlist", 2, 4, FEARG_1, f_matchlist}, ! {"matchstr", 2, 4, FEARG_1, f_matchstr}, ! {"matchstrpos", 2, 4, FEARG_1, f_matchstrpos}, {"max", 1, 1, FEARG_1, f_max}, {"min", 1, 1, FEARG_1, f_min}, ! {"mkdir", 1, 3, FEARG_1, f_mkdir}, ! {"mode", 0, 1, FEARG_1, f_mode}, #ifdef FEAT_MZSCHEME ! {"mzeval", 1, 1, FEARG_1, f_mzeval}, #endif {"nextnonblank", 1, 1, 0, f_nextnonblank}, {"nr2char", 1, 2, 0, f_nr2char}, *** ../vim-8.1.1960/src/testdir/test70.in 2013-01-31 21:00:06.000000000 +0100 --- src/testdir/test70.in 2019-09-01 19:14:34.254458433 +0200 *************** *** 25,31 **** :mz (vim-set-buff-line (vim-eval "line('.')") "1 changed line 1") :" scalar test :let tmp_string = mzeval('"string"') ! :let tmp_1000 = mzeval('1000') :if tmp_string . tmp_1000 == "string1000" :let scalar_res = "OK" :else --- 25,31 ---- :mz (vim-set-buff-line (vim-eval "line('.')") "1 changed line 1") :" scalar test :let tmp_string = mzeval('"string"') ! :let tmp_1000 = '1000'->mzeval() :if tmp_string . tmp_1000 == "string1000" :let scalar_res = "OK" :else *** ../vim-8.1.1960/src/testdir/test_functions.vim 2019-08-31 22:16:30.774127008 +0200 --- src/testdir/test_functions.vim 2019-09-01 19:13:15.846768301 +0200 *************** *** 655,662 **** exe "normal Rabc\\\\u" call assert_equal('R-Rc', g:current_modes) ! call assert_equal('n', mode(0)) ! call assert_equal('n', mode(1)) " i_CTRL-O exe "normal i\:call Save_mode()\\" --- 655,662 ---- exe "normal Rabc\\\\u" call assert_equal('R-Rc', g:current_modes) ! call assert_equal('n', 0->mode()) ! call assert_equal('n', 1->mode()) " i_CTRL-O exe "normal i\:call Save_mode()\\" *************** *** 793,799 **** func Test_match_func() call assert_equal(4, match('testing', 'ing')) ! call assert_equal(4, match('testing', 'ing', 2)) call assert_equal(-1, match('testing', 'ing', 5)) call assert_equal(-1, match('testing', 'ing', 8)) call assert_equal(1, match(['vim', 'testing', 'execute'], 'ing')) --- 793,799 ---- func Test_match_func() call assert_equal(4, match('testing', 'ing')) ! call assert_equal(4, 'testing'->match('ing', 2)) call assert_equal(-1, match('testing', 'ing', 5)) call assert_equal(-1, match('testing', 'ing', 8)) call assert_equal(1, match(['vim', 'testing', 'execute'], 'ing')) *************** *** 802,808 **** func Test_matchend() call assert_equal(7, matchend('testing', 'ing')) ! call assert_equal(7, matchend('testing', 'ing', 2)) call assert_equal(-1, matchend('testing', 'ing', 5)) call assert_equal(-1, matchend('testing', 'ing', 8)) call assert_equal(match(['vim', 'testing', 'execute'], 'ing'), matchend(['vim', 'testing', 'execute'], 'ing')) --- 802,808 ---- func Test_matchend() call assert_equal(7, matchend('testing', 'ing')) ! call assert_equal(7, 'testing'->matchend('ing', 2)) call assert_equal(-1, matchend('testing', 'ing', 5)) call assert_equal(-1, matchend('testing', 'ing', 8)) call assert_equal(match(['vim', 'testing', 'execute'], 'ing'), matchend(['vim', 'testing', 'execute'], 'ing')) *************** *** 811,823 **** func Test_matchlist() call assert_equal(['acd', 'a', '', 'c', 'd', '', '', '', '', ''], matchlist('acd', '\(a\)\?\(b\)\?\(c\)\?\(.*\)')) ! call assert_equal(['d', '', '', '', 'd', '', '', '', '', ''], matchlist('acd', '\(a\)\?\(b\)\?\(c\)\?\(.*\)', 2)) call assert_equal([], matchlist('acd', '\(a\)\?\(b\)\?\(c\)\?\(.*\)', 4)) endfunc func Test_matchstr() call assert_equal('ing', matchstr('testing', 'ing')) ! call assert_equal('ing', matchstr('testing', 'ing', 2)) call assert_equal('', matchstr('testing', 'ing', 5)) call assert_equal('', matchstr('testing', 'ing', 8)) call assert_equal('testing', matchstr(['vim', 'testing', 'execute'], 'ing')) --- 811,823 ---- func Test_matchlist() call assert_equal(['acd', 'a', '', 'c', 'd', '', '', '', '', ''], matchlist('acd', '\(a\)\?\(b\)\?\(c\)\?\(.*\)')) ! call assert_equal(['d', '', '', '', 'd', '', '', '', '', ''], 'acd'->matchlist('\(a\)\?\(b\)\?\(c\)\?\(.*\)', 2)) call assert_equal([], matchlist('acd', '\(a\)\?\(b\)\?\(c\)\?\(.*\)', 4)) endfunc func Test_matchstr() call assert_equal('ing', matchstr('testing', 'ing')) ! call assert_equal('ing', 'testing'->matchstr('ing', 2)) call assert_equal('', matchstr('testing', 'ing', 5)) call assert_equal('', matchstr('testing', 'ing', 8)) call assert_equal('testing', matchstr(['vim', 'testing', 'execute'], 'ing')) *************** *** 826,832 **** func Test_matchstrpos() call assert_equal(['ing', 4, 7], matchstrpos('testing', 'ing')) ! call assert_equal(['ing', 4, 7], matchstrpos('testing', 'ing', 2)) call assert_equal(['', -1, -1], matchstrpos('testing', 'ing', 5)) call assert_equal(['', -1, -1], matchstrpos('testing', 'ing', 8)) call assert_equal(['ing', 1, 4, 7], matchstrpos(['vim', 'testing', 'execute'], 'ing')) --- 826,832 ---- func Test_matchstrpos() call assert_equal(['ing', 4, 7], matchstrpos('testing', 'ing')) ! call assert_equal(['ing', 4, 7], 'testing'->matchstrpos('ing', 2)) call assert_equal(['', -1, -1], matchstrpos('testing', 'ing', 5)) call assert_equal(['', -1, -1], matchstrpos('testing', 'ing', 8)) call assert_equal(['ing', 1, 4, 7], matchstrpos(['vim', 'testing', 'execute'], 'ing')) *** ../vim-8.1.1960/src/testdir/test_getcwd.vim 2019-08-31 21:17:35.594131454 +0200 --- src/testdir/test_getcwd.vim 2019-09-01 19:11:24.179194084 +0200 *************** *** 35,41 **** " we start from a clean state. call delete("Xtopdir", "rf") new ! call mkdir('Xtopdir') cd Xtopdir let g:topdir = getcwd() call mkdir('Xdir1') --- 35,41 ---- " we start from a clean state. call delete("Xtopdir", "rf") new ! eval 'Xtopdir'->mkdir() cd Xtopdir let g:topdir = getcwd() call mkdir('Xdir1') *** ../vim-8.1.1960/src/testdir/test_maparg.vim 2019-07-27 21:05:16.683942730 +0200 --- src/testdir/test_maparg.vim 2019-09-01 18:54:54.285025681 +0200 *************** *** 1,5 **** --- 1,6 ---- " Tests for maparg(). " Also test utf8 map with a 0x80 byte. + " Also test mapcheck() function s:SID() return str2nr(matchstr(expand(''), '\zs\d\+\ze_SID$')) *************** *** 22,28 **** call assert_equal({'silent': 1, 'noremap': 1, 'lhs': 'bar', 'mode': 'v', \ 'nowait': 0, 'expr': 1, 'sid': sid, 'lnum': lnum + 2, \ 'rhs': 'isbar', 'buffer': 1}, ! \ maparg('bar', '', 0, 1)) let lnum = expand('') map foo bar call assert_equal({'silent': 0, 'noremap': 0, 'lhs': 'foo', 'mode': ' ', --- 23,29 ---- call assert_equal({'silent': 1, 'noremap': 1, 'lhs': 'bar', 'mode': 'v', \ 'nowait': 0, 'expr': 1, 'sid': sid, 'lnum': lnum + 2, \ 'rhs': 'isbar', 'buffer': 1}, ! \ 'bar'->maparg('', 0, 1)) let lnum = expand('') map foo bar call assert_equal({'silent': 0, 'noremap': 0, 'lhs': 'foo', 'mode': ' ', *************** *** 46,51 **** --- 47,91 ---- unmap abc endfunction + func Test_mapcheck() + call assert_equal('', mapcheck('a')) + call assert_equal('', mapcheck('abc')) + call assert_equal('', mapcheck('ax')) + call assert_equal('', mapcheck('b')) + + map a something + call assert_equal('something', mapcheck('a')) + call assert_equal('something', mapcheck('a', 'n')) + call assert_equal('', mapcheck('a', 'c')) + call assert_equal('', mapcheck('a', 'i')) + call assert_equal('something', 'abc'->mapcheck()) + call assert_equal('something', 'ax'->mapcheck()) + call assert_equal('', mapcheck('b')) + unmap a + + map ab foobar + call assert_equal('foobar', mapcheck('a')) + call assert_equal('foobar', mapcheck('abc')) + call assert_equal('', mapcheck('ax')) + call assert_equal('', mapcheck('b')) + unmap ab + + map abc barfoo + call assert_equal('barfoo', mapcheck('a')) + call assert_equal('barfoo', mapcheck('a', 'n', 0)) + call assert_equal('', mapcheck('a', 'n', 1)) + call assert_equal('barfoo', mapcheck('abc')) + call assert_equal('', mapcheck('ax')) + call assert_equal('', mapcheck('b')) + unmap abc + + abbr ab abbrev + call assert_equal('abbrev', mapcheck('a', 'i', 1)) + call assert_equal('', mapcheck('a', 'n', 1)) + call assert_equal('', mapcheck('a', 'i', 0)) + unabbr ab + endfunc + function Test_range_map() new " Outside of the range, minimum *** ../vim-8.1.1960/src/testdir/test_match.vim 2019-08-23 22:31:33.217176868 +0200 --- src/testdir/test_match.vim 2019-09-01 19:10:10.615462791 +0200 *************** *** 15,21 **** 2match MyGroup2 /FIXME/ 3match MyGroup3 /XXX/ call assert_equal(['MyGroup1', 'TODO'], matcharg(1)) ! call assert_equal(['MyGroup2', 'FIXME'], matcharg(2)) call assert_equal(['MyGroup3', 'XXX'], matcharg(3)) " --- Check that "matcharg()" returns an empty list if the argument is not 1, --- 15,21 ---- 2match MyGroup2 /FIXME/ 3match MyGroup3 /XXX/ call assert_equal(['MyGroup1', 'TODO'], matcharg(1)) ! call assert_equal(['MyGroup2', 'FIXME'], 2->matcharg()) call assert_equal(['MyGroup3', 'XXX'], matcharg(3)) " --- Check that "matcharg()" returns an empty list if the argument is not 1, *************** *** 44,50 **** " --- Check that "matchdelete()" deletes the matches defined in the previous " --- test correctly. call matchdelete(m1) ! call matchdelete(m2) call matchdelete(m3) call assert_equal([], getmatches()) --- 44,50 ---- " --- Check that "matchdelete()" deletes the matches defined in the previous " --- test correctly. call matchdelete(m1) ! eval m2->matchdelete() call matchdelete(m3) call assert_equal([], getmatches()) *************** *** 56,62 **** " --- Check that "clearmatches()" clears all matches defined by ":match" and " --- "matchadd()". let m1 = matchadd("MyGroup1", "TODO") ! let m2 = matchadd("MyGroup2", "FIXME", 42) let m3 = matchadd("MyGroup3", "XXX", 60, 17) match MyGroup1 /COFFEE/ 2match MyGroup2 /HUMPPA/ --- 56,62 ---- " --- Check that "clearmatches()" clears all matches defined by ":match" and " --- "matchadd()". let m1 = matchadd("MyGroup1", "TODO") ! let m2 = "MyGroup2"->matchadd("FIXME", 42) let m3 = matchadd("MyGroup3", "XXX", 60, 17) match MyGroup1 /COFFEE/ 2match MyGroup2 /HUMPPA/ *************** *** 118,124 **** call clearmatches() call setline(1, 'abcdΣabcdef') ! call matchaddpos("MyGroup1", [[1, 4, 2], [1, 9, 2]]) 1 redraw! let v1 = screenattr(1, 1) --- 118,124 ---- call clearmatches() call setline(1, 'abcdΣabcdef') ! eval "MyGroup1"->matchaddpos([[1, 4, 2], [1, 9, 2]]) 1 redraw! let v1 = screenattr(1, 1) *** ../vim-8.1.1960/src/version.c 2019-09-01 17:52:27.338698893 +0200 --- src/version.c 2019-09-01 20:16:01.411625735 +0200 *************** *** 763,764 **** --- 763,766 ---- { /* Add new patch number below this line */ + /**/ + 1961, /**/ -- hundred-and-one symptoms of being an internet addict: 164. You got out to buy software, instead of going out for a beer. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///