To: vim_dev@googlegroups.com Subject: Patch 8.1.1809 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.1.1809 Problem: More functions can be used as a method. Solution: Add has_key(), split(), str2list(), etc. Files: runtime/doc/eval.txt, src/evalfunc.c, src/testdir/test_method.vim, src/testdir/test_diffmode.vim, src/testdir/test_syntax.vim, src/testdir/test_system.vim *** ../vim-8.1.1808/runtime/doc/eval.txt 2019-08-04 15:03:33.367303750 +0200 --- runtime/doc/eval.txt 2019-08-04 17:33:11.872446275 +0200 *************** *** 3575,3583 **** When {comp} is a string then the number of not overlapping occurrences of {expr} is returned. Zero is returned when {expr} is an empty string. Can also be used as a |method|: > mylist->count(val) ! *cscope_connection()* cscope_connection([{num} , {dbpath} [, {prepend}]]) Checks for the existence of a |cscope| connection. If no --- 3575,3584 ---- When {comp} is a string then the number of not overlapping occurrences of {expr} is returned. Zero is returned when {expr} is an empty string. + Can also be used as a |method|: > mylist->count(val) ! < *cscope_connection()* cscope_connection([{num} , {dbpath} [, {prepend}]]) Checks for the existence of a |cscope| connection. If no *************** *** 5399,5404 **** --- 5409,5417 ---- The result is a Number, which is 1 if |Dictionary| {dict} has an entry with key {key}. Zero otherwise. + Can also be used as a |method|: > + mydict->has_key(key) + haslocaldir([{winnr} [, {tabnr}]]) *haslocaldir()* The result is a Number: 1 when the window has set a local directory via |:lcd| *************** *** 8284,8289 **** --- 8298,8305 ---- :let items = split(line, ':', 1) < The opposite function is |join()|. + Can also be used as a |method|: > + GetString()->split() sqrt({expr}) *sqrt()* Return the non-negative square root of Float {expr} as a *************** *** 8327,8338 **** properly: > str2list("á") returns [97, 769] str2nr({expr} [, {base}]) *str2nr()* Convert string {expr} to a number. {base} is the conversion base, it can be 2, 8, 10 or 16. When {base} is omitted base 10 is used. This also means that a leading zero doesn't cause octal conversion to be used, as ! with the default String to Number conversion. When {base} is 16 a leading "0x" or "0X" is ignored. With a different base the result will be zero. Similarly, when {base} is 8 a leading "0" is ignored, and when {base} is 2 a --- 8343,8361 ---- properly: > str2list("á") returns [97, 769] + < Can also be used as a |method|: > + GetString()->str2list() + + str2nr({expr} [, {base}]) *str2nr()* Convert string {expr} to a number. {base} is the conversion base, it can be 2, 8, 10 or 16. + When {base} is omitted base 10 is used. This also means that a leading zero doesn't cause octal conversion to be used, as ! with the default String to Number conversion. Example: > ! let nr = str2nr('123') ! < When {base} is 16 a leading "0x" or "0X" is ignored. With a different base the result will be zero. Similarly, when {base} is 8 a leading "0" is ignored, and when {base} is 2 a *************** *** 8460,8465 **** --- 8483,8491 ---- |strchars()|. Also see |len()|, |strdisplaywidth()| and |strwidth()|. + Can also be used as a |method|: > + GetString()->strlen() + strpart({src}, {start} [, {len}]) *strpart()* The result is a String, which is part of {src}, starting from byte {start}, with the byte length {len}. *************** *** 8504,8509 **** --- 8530,8538 ---- < This displays a newline in register a as "^@" instead of starting a new line. + Can also be used as a |method|: > + GetString()->strtrans() + strwidth({expr}) *strwidth()* The result is a Number, which is the number of display cells String {expr} occupies. A Tab character is counted as one *************** *** 8512,8517 **** --- 8541,8549 ---- Ambiguous, this function's return value depends on 'ambiwidth'. Also see |strlen()|, |strdisplaywidth()| and |strchars()|. + Can also be used as a |method|: > + GetString()->strwidth() + submatch({nr} [, {list}]) *submatch()* *E935* Only for an expression in a |:substitute| command or substitute() function. *************** *** 8579,8584 **** --- 8611,8619 ---- |submatch()| returns. Example: > :echo substitute(s, '%\(\x\x\)', {m -> '0x' . m[1]}, 'g') + < Can also be used as a |method|: > + GetString()->substitute(pat, sub, flags) + swapinfo({fname}) *swapinfo()* The result is a dictionary, which holds information about the swapfile {fname}. The available fields are: *************** *** 8664,8675 **** --- 8699,8717 ---- cursor): > :echo synIDattr(synIDtrans(synID(line("."), col("."), 1)), "fg") < + Can also be used as a |method|: > + :echo synID(line("."), col("."), 1)->synIDtrans()->synIDattr("fg") + + synIDtrans({synID}) *synIDtrans()* The result is a Number, which is the translated syntax ID of {synID}. This is the syntax group ID of what is being used to highlight the character. Highlight links given with ":highlight link" are followed. + Can also be used as a |method|: > + :echo synID(line("."), col("."), 1)->synIDtrans()->synIDattr("fg") + synconcealed({lnum}, {col}) *synconcealed()* The result is a List with currently three items: 1. The first item in the list is 0 if the character at the *************** *** 8774,8779 **** --- 8816,8824 ---- Unlike ":!cmd" there is no automatic check for changed files. Use |:checktime| to force a check. + Can also be used as a |method|: > + :echo GetCmd()->system() + systemlist({expr} [, {input}]) *systemlist()* Same as |system()|, but returns a |List| with lines (parts of *************** *** 8784,8789 **** --- 8829,8837 ---- Returns an empty string on error. + Can also be used as a |method|: > + :echo GetCmd()->systemlist() + tabpagebuflist([{arg}]) *tabpagebuflist()* The result is a |List|, where each item is the number of the *** ../vim-8.1.1808/src/evalfunc.c 2019-08-04 15:03:33.367303750 +0200 --- src/evalfunc.c 2019-08-04 17:30:56.249071108 +0200 *************** *** 995,1001 **** #define FEARG_2 2 // base is the second argument /* ! * Methods that call the internal function with the base as the first argument. */ static funcentry_T base_methods[] = { --- 995,1002 ---- #define FEARG_2 2 // base is the second argument /* ! * Methods that call the internal function with the base as one of the ! * arguments. */ static funcentry_T base_methods[] = { *************** *** 1011,1016 **** --- 1012,1018 ---- {"extend", 1, 2, 0, f_extend}, {"filter", 1, 1, 0, f_filter}, {"get", 1, 2, 0, f_get}, + {"has_key", 1, 1, 0, f_has_key}, {"index", 1, 3, 0, f_index}, {"insert", 1, 2, 0, f_insert}, {"items", 0, 0, 0, f_items}, *************** *** 1024,1030 **** --- 1026,1042 ---- {"repeat", 1, 1, 0, f_repeat}, {"reverse", 0, 0, 0, f_reverse}, {"sort", 0, 2, 0, f_sort}, + {"split", 0, 2, 0, f_split}, + {"str2list", 0, 1, 0, f_str2list}, {"string", 0, 0, 0, f_string}, + {"strlen", 0, 0, 0, f_strlen}, + {"strtrans", 0, 0, 0, f_strtrans}, + {"strwidth", 0, 0, 0, f_strwidth}, + {"substitute", 3, 3, 0, f_substitute}, + {"synIDattr", 1, 2, 0, f_synIDattr}, + {"synIDtrans", 0, 0, 0, f_synIDtrans}, + {"system", 0, 1, 0, f_system}, + {"systemlist", 0, 2, 0, f_systemlist}, {"type", 0, 0, 0, f_type}, {"uniq", 0, 2, 0, f_uniq}, {"values", 0, 0, 0, f_values}, *** ../vim-8.1.1808/src/testdir/test_method.vim 2019-08-04 15:03:33.367303750 +0200 --- src/testdir/test_method.vim 2019-08-04 17:00:00.651056186 +0200 *************** *** 46,51 **** --- 46,52 ---- call assert_equal(2, d->get('two')) call assert_fails("let x = d->index(2)", 'E897:') call assert_fails("let x = d->insert(0)", 'E899:') + call assert_true(d->has_key('two')) call assert_equal([['one', 1], ['two', 2], ['three', 3]], d->items()) call assert_fails("let x = d->join()", 'E714:') call assert_equal(['one', 'two', 'three'], d->keys()) *************** *** 65,70 **** --- 66,81 ---- call assert_equal([1, 2, 3], d->values()) endfunc + func Test_string() + call assert_equal(['1', '2', '3'], '1 2 3'->split()) + call assert_equal([1, 2, 3], '1 2 3'->split()->map({i, v -> str2nr(v)})) + call assert_equal([65, 66, 67], 'ABC'->str2list()) + call assert_equal(3, 'ABC'->strlen()) + call assert_equal('a^Mb^[c', "a\rb\ec"->strtrans()) + call assert_equal(4, "aあb"->strwidth()) + call assert_equal('axc', 'abc'->substitute('b', 'x', '')) + endfunc + func Test_append() new eval ['one', 'two', 'three']->append(1) *** ../vim-8.1.1808/src/testdir/test_diffmode.vim 2019-08-03 22:55:28.871027263 +0200 --- src/testdir/test_diffmode.vim 2019-08-04 17:11:54.169768722 +0200 *************** *** 668,680 **** diffthis redraw ! call assert_equal(synIDattr(diff_hlID(-1, 1), "name"), "") ! call assert_equal(synIDattr(diff_hlID(1, 1), "name"), "DiffChange") ! call assert_equal(synIDattr(diff_hlID(1, 2), "name"), "DiffText") ! call assert_equal(synIDattr(diff_hlID(2, 1), "name"), "") ! call assert_equal(synIDattr(diff_hlID(3, 1), "name"), "DiffAdd") ! call assert_equal(synIDattr(diff_hlID(4, 1), "name"), "") wincmd w call assert_equal(synIDattr(diff_hlID(1, 1), "name"), "DiffChange") --- 668,680 ---- diffthis redraw ! call diff_hlID(-1, 1)->synIDattr("name")->assert_equal("") ! call diff_hlID(1, 1)->synIDattr("name")->assert_equal("DiffChange") ! call diff_hlID(1, 2)->synIDattr("name")->assert_equal("DiffText") ! call diff_hlID(2, 1)->synIDattr("name")->assert_equal("") ! call diff_hlID(3, 1)->synIDattr("name")->assert_equal("DiffAdd") ! call diff_hlID(4, 1)->synIDattr("name")->assert_equal("") wincmd w call assert_equal(synIDattr(diff_hlID(1, 1), "name"), "DiffChange") *** ../vim-8.1.1808/src/testdir/test_syntax.vim 2019-08-03 13:29:43.307352753 +0200 --- src/testdir/test_syntax.vim 2019-08-04 17:16:07.604885367 +0200 *************** *** 517,524 **** call assert_equal([], synstack(1, 1)) norm f/ ! call assert_equal(['cComment', 'cCommentStart'], map(synstack(line("."), col(".")), 'synIDattr(v:val, "name")')) ! call assert_equal(['Comment', 'Comment'], map(synstack(line("."), col(".")), 'synIDattr(synIDtrans(v:val), "name")')) norm fA call assert_equal(['cComment'], map(synstack(line("."), col(".")), 'synIDattr(v:val, "name")')) --- 517,524 ---- call assert_equal([], synstack(1, 1)) norm f/ ! eval synstack(line("."), col("."))->map('synIDattr(v:val, "name")')->assert_equal(['cComment', 'cCommentStart']) ! eval synstack(line("."), col("."))->map('synIDattr(synIDtrans(v:val), "name")')->assert_equal(['Comment', 'Comment']) norm fA call assert_equal(['cComment'], map(synstack(line("."), col(".")), 'synIDattr(v:val, "name")')) *** ../vim-8.1.1808/src/testdir/test_system.vim 2019-01-09 23:00:58.001176090 +0100 --- src/testdir/test_system.vim 2019-08-04 17:32:38.496600539 +0200 *************** *** 4,16 **** if !executable('echo') || !executable('cat') || !executable('wc') return endif ! let out = system('echo 123') " On Windows we may get a trailing space. if out != "123 \n" call assert_equal("123\n", out) endif ! let out = systemlist('echo 123') " On Windows we may get a trailing space and CR. if out != ["123 \r"] call assert_equal(['123'], out) --- 4,16 ---- if !executable('echo') || !executable('cat') || !executable('wc') return endif ! let out = 'echo 123'->system() " On Windows we may get a trailing space. if out != "123 \n" call assert_equal("123\n", out) endif ! let out = 'echo 123'->systemlist() " On Windows we may get a trailing space and CR. if out != ["123 \r"] call assert_equal(['123'], out) *** ../vim-8.1.1808/src/version.c 2019-08-04 15:30:12.202919941 +0200 --- src/version.c 2019-08-04 17:33:05.540475578 +0200 *************** *** 775,776 **** --- 775,778 ---- { /* Add new patch number below this line */ + /**/ + 1809, /**/ -- Bypasses are devices that allow some people to dash from point A to point B very fast while other people dash from point B to point A very fast. People living at point C, being a point directly in between, are often given to wonder what's so great about point A that so many people from point B are so keen to get there and what's so great about point B that so many people from point A are so keen to get there. They often wish that people would just once and for all work out where the hell they wanted to be. -- Douglas Adams, "The Hitchhiker's Guide to the Galaxy" /// 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 ///