mirror of
https://github.com/vim/vim.git
synced 2025-07-26 11:04:33 -04:00
patch 8.2.4455: accepting one and zero for second sort() argument is strange
Problem: Accepting one and zero for the second sort() argument is strange. Solution: Disallow using one and zero in Vim9 script.
This commit is contained in:
parent
6a8b13614e
commit
2007dd49f5
@ -539,8 +539,8 @@ sin({expr}) Float sine of {expr}
|
|||||||
sinh({expr}) Float hyperbolic sine of {expr}
|
sinh({expr}) Float hyperbolic sine of {expr}
|
||||||
slice({expr}, {start} [, {end}]) String, List or Blob
|
slice({expr}, {start} [, {end}]) String, List or Blob
|
||||||
slice of a String, List or Blob
|
slice of a String, List or Blob
|
||||||
sort({list} [, {func} [, {dict}]])
|
sort({list} [, {how} [, {dict}]])
|
||||||
List sort {list}, using {func} to compare
|
List sort {list}, compare with {how}
|
||||||
sound_clear() none stop playing all sounds
|
sound_clear() none stop playing all sounds
|
||||||
sound_playevent({name} [, {callback}])
|
sound_playevent({name} [, {callback}])
|
||||||
Number play an event sound
|
Number play an event sound
|
||||||
@ -8033,21 +8033,22 @@ slice({expr}, {start} [, {end}]) *slice()*
|
|||||||
GetList()->slice(offset)
|
GetList()->slice(offset)
|
||||||
|
|
||||||
|
|
||||||
sort({list} [, {func} [, {dict}]]) *sort()* *E702*
|
sort({list} [, {how} [, {dict}]]) *sort()* *E702*
|
||||||
Sort the items in {list} in-place. Returns {list}.
|
Sort the items in {list} in-place. Returns {list}.
|
||||||
|
|
||||||
If you want a list to remain unmodified make a copy first: >
|
If you want a list to remain unmodified make a copy first: >
|
||||||
:let sortedlist = sort(copy(mylist))
|
:let sortedlist = sort(copy(mylist))
|
||||||
|
|
||||||
< When {func} is omitted, is empty or zero, then sort() uses the
|
< When {how} is omitted or is an string, then sort() uses the
|
||||||
string representation of each item to sort on. Numbers sort
|
string representation of each item to sort on. Numbers sort
|
||||||
after Strings, |Lists| after Numbers. For sorting text in the
|
after Strings, |Lists| after Numbers. For sorting text in the
|
||||||
current buffer use |:sort|.
|
current buffer use |:sort|.
|
||||||
|
|
||||||
When {func} is given and it is '1' or 'i' then case is
|
When {how} is given and it is 'i' then case is ignored.
|
||||||
ignored.
|
In legacy script, for backwards compatibility, the value one
|
||||||
|
can be used to ignore case. Zero means to not ignore case.
|
||||||
|
|
||||||
When {func} is given and it is 'l' then the current collation
|
When {how} is given and it is 'l' then the current collation
|
||||||
locale is used for ordering. Implementation details: strcoll()
|
locale is used for ordering. Implementation details: strcoll()
|
||||||
is used to compare strings. See |:language| check or set the
|
is used to compare strings. See |:language| check or set the
|
||||||
collation locale. |v:collate| can also be used to check the
|
collation locale. |v:collate| can also be used to check the
|
||||||
@ -8064,19 +8065,19 @@ sort({list} [, {func} [, {dict}]]) *sort()* *E702*
|
|||||||
< ['n', 'o', 'O', 'p', 'z', 'ö'] ~
|
< ['n', 'o', 'O', 'p', 'z', 'ö'] ~
|
||||||
This does not work properly on Mac.
|
This does not work properly on Mac.
|
||||||
|
|
||||||
When {func} is given and it is 'n' then all items will be
|
When {how} is given and it is 'n' then all items will be
|
||||||
sorted numerical (Implementation detail: this uses the
|
sorted numerical (Implementation detail: this uses the
|
||||||
strtod() function to parse numbers, Strings, Lists, Dicts and
|
strtod() function to parse numbers, Strings, Lists, Dicts and
|
||||||
Funcrefs will be considered as being 0).
|
Funcrefs will be considered as being 0).
|
||||||
|
|
||||||
When {func} is given and it is 'N' then all items will be
|
When {how} is given and it is 'N' then all items will be
|
||||||
sorted numerical. This is like 'n' but a string containing
|
sorted numerical. This is like 'n' but a string containing
|
||||||
digits will be used as the number they represent.
|
digits will be used as the number they represent.
|
||||||
|
|
||||||
When {func} is given and it is 'f' then all items will be
|
When {how} is given and it is 'f' then all items will be
|
||||||
sorted numerical. All values must be a Number or a Float.
|
sorted numerical. All values must be a Number or a Float.
|
||||||
|
|
||||||
When {func} is a |Funcref| or a function name, this function
|
When {how} is a |Funcref| or a function name, this function
|
||||||
is called to compare items. The function is invoked with two
|
is called to compare items. The function is invoked with two
|
||||||
items as argument and must return zero if they are equal, 1 or
|
items as argument and must return zero if they are equal, 1 or
|
||||||
bigger if the first one sorts after the second one, -1 or
|
bigger if the first one sorts after the second one, -1 or
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
" You can also use this as a start for your own set of menus.
|
" You can also use this as a start for your own set of menus.
|
||||||
"
|
"
|
||||||
" Maintainer: Bram Moolenaar <Bram@vim.org>
|
" Maintainer: Bram Moolenaar <Bram@vim.org>
|
||||||
" Last Change: 2022 Feb 04
|
" Last Change: 2022 Feb 23
|
||||||
|
|
||||||
" Note that ":an" (short for ":anoremenu") is often used to make a menu work
|
" Note that ":an" (short for ":anoremenu") is often used to make a menu work
|
||||||
" in all modes and avoid side effects from mappings defined by the user.
|
" in all modes and avoid side effects from mappings defined by the user.
|
||||||
@ -378,7 +378,7 @@ def s:SetupColorSchemes()
|
|||||||
n += globpath(&packpath, "pack/*/opt/*/colors/*.vim", 1, 1)
|
n += globpath(&packpath, "pack/*/opt/*/colors/*.vim", 1, 1)
|
||||||
|
|
||||||
# Ignore case for VMS and windows, sort on name
|
# Ignore case for VMS and windows, sort on name
|
||||||
var names = sort(map(n, 'substitute(v:val, "\\c.*[/\\\\:\\]]\\([^/\\\\:]*\\)\\.vim", "\\1", "")'), 1)
|
var names = sort(map(n, 'substitute(v:val, "\\c.*[/\\\\:\\]]\\([^/\\\\:]*\\)\\.vim", "\\1", "")'), 'i')
|
||||||
|
|
||||||
# define all the submenu entries
|
# define all the submenu entries
|
||||||
var idx = 100
|
var idx = 100
|
||||||
|
@ -603,7 +603,6 @@ arg_sort_how(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
|||||||
{
|
{
|
||||||
if (type->tt_type == VAR_STRING
|
if (type->tt_type == VAR_STRING
|
||||||
|| type->tt_type == VAR_PARTIAL
|
|| type->tt_type == VAR_PARTIAL
|
||||||
|| type->tt_type == VAR_NUMBER // 1 means ignore case
|
|
||||||
|| type == &t_unknown
|
|| type == &t_unknown
|
||||||
|| type == &t_any)
|
|| type == &t_any)
|
||||||
return OK;
|
return OK;
|
||||||
|
@ -2198,7 +2198,8 @@ do_sort_uniq(typval_T *argvars, typval_T *rettv, int sort)
|
|||||||
if (in_vim9script()
|
if (in_vim9script()
|
||||||
&& (check_for_list_arg(argvars, 0) == FAIL
|
&& (check_for_list_arg(argvars, 0) == FAIL
|
||||||
|| (argvars[1].v_type != VAR_UNKNOWN
|
|| (argvars[1].v_type != VAR_UNKNOWN
|
||||||
&& check_for_opt_dict_arg(argvars, 2) == FAIL)))
|
&& (check_for_string_or_func_arg(argvars, 1) == FAIL
|
||||||
|
|| check_for_opt_dict_arg(argvars, 2) == FAIL))))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (argvars[0].v_type != VAR_LIST)
|
if (argvars[0].v_type != VAR_LIST)
|
||||||
|
@ -949,7 +949,7 @@ func Test_reverse_sort_uniq()
|
|||||||
call assert_equal([-1, 'one', 'two', 'three', 'four', 1.0e-15, 0.22, 7, 9, 12, 18, 22, 255], sort(copy(l), 'n'))
|
call assert_equal([-1, 'one', 'two', 'three', 'four', 1.0e-15, 0.22, 7, 9, 12, 18, 22, 255], sort(copy(l), 'n'))
|
||||||
|
|
||||||
LET l = [7, 9, 18, 12, 22, 10.0e-16, -1, 0xff, 0, -0, 0.22, 'bar', 'BAR', 'Bar', 'Foo', 'FOO', 'foo', 'FOOBAR', {}, []]
|
LET l = [7, 9, 18, 12, 22, 10.0e-16, -1, 0xff, 0, -0, 0.22, 'bar', 'BAR', 'Bar', 'Foo', 'FOO', 'foo', 'FOOBAR', {}, []]
|
||||||
call assert_equal(['bar', 'BAR', 'Bar', 'Foo', 'FOO', 'foo', 'FOOBAR', -1, 0, 0, 0.22, 1.0e-15, 12, 18, 22, 255, 7, 9, [], {}], sort(copy(l), 1))
|
call assert_equal(['bar', 'BAR', 'Bar', 'Foo', 'FOO', 'foo', 'FOOBAR', -1, 0, 0, 0.22, 1.0e-15, 12, 18, 22, 255, 7, 9, [], {}], sort(copy(l), 'i'))
|
||||||
call assert_equal(['bar', 'BAR', 'Bar', 'Foo', 'FOO', 'foo', 'FOOBAR', -1, 0, 0, 0.22, 1.0e-15, 12, 18, 22, 255, 7, 9, [], {}], sort(copy(l), 'i'))
|
call assert_equal(['bar', 'BAR', 'Bar', 'Foo', 'FOO', 'foo', 'FOOBAR', -1, 0, 0, 0.22, 1.0e-15, 12, 18, 22, 255, 7, 9, [], {}], sort(copy(l), 'i'))
|
||||||
call assert_equal(['BAR', 'Bar', 'FOO', 'FOOBAR', 'Foo', 'bar', 'foo', -1, 0, 0, 0.22, 1.0e-15, 12, 18, 22, 255, 7, 9, [], {}], sort(copy(l)))
|
call assert_equal(['BAR', 'Bar', 'FOO', 'FOOBAR', 'Foo', 'bar', 'foo', -1, 0, 0, 0.22, 1.0e-15, 12, 18, 22, 255, 7, 9, [], {}], sort(copy(l)))
|
||||||
endif
|
endif
|
||||||
@ -961,6 +961,16 @@ func Test_reverse_sort_uniq()
|
|||||||
call assert_fails("call sort([1, 2], function('min'), 1)", "E715:")
|
call assert_fails("call sort([1, 2], function('min'), 1)", "E715:")
|
||||||
call assert_fails("call sort([1, 2], function('invalid_func'))", "E700:")
|
call assert_fails("call sort([1, 2], function('invalid_func'))", "E700:")
|
||||||
call assert_fails("call sort([1, 2], function('min'))", "E118:")
|
call assert_fails("call sort([1, 2], function('min'))", "E118:")
|
||||||
|
|
||||||
|
let lines =<< trim END
|
||||||
|
call sort(['a', 'b'], 0)
|
||||||
|
END
|
||||||
|
call v9.CheckDefAndScriptFailure(lines, 'E1256: String or function required for argument 2')
|
||||||
|
|
||||||
|
let lines =<< trim END
|
||||||
|
call sort(['a', 'b'], 1)
|
||||||
|
END
|
||||||
|
call v9.CheckDefAndScriptFailure(lines, 'E1256: String or function required for argument 2')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
" reduce a list, blob or string
|
" reduce a list, blob or string
|
||||||
|
@ -750,6 +750,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
4455,
|
||||||
/**/
|
/**/
|
||||||
4454,
|
4454,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user