0
0
mirror of https://github.com/vim/vim.git synced 2025-09-27 04:14:06 -04:00

updated for version 7.3.224

Problem:    Can't pass dict to sort function.
Solution:   Add the optional {dict} argument to sort(). (ZyX)
This commit is contained in:
Bram Moolenaar
2011-06-19 02:55:37 +02:00
parent c16756d829
commit 5f8949656a
3 changed files with 24 additions and 4 deletions

View File

@@ -1919,7 +1919,8 @@ shellescape( {string} [, {special}])
simplify( {filename}) String simplify filename as much as possible simplify( {filename}) String simplify filename as much as possible
sin( {expr}) Float sine of {expr} sin( {expr}) Float sine of {expr}
sinh( {expr}) Float hyperbolic sine of {expr} sinh( {expr}) Float hyperbolic sine of {expr}
sort( {list} [, {func}]) List sort {list}, using {func} to compare sort( {list} [, {func} [, {dict}]])
List sort {list}, using {func} to compare
soundfold( {word}) String sound-fold {word} soundfold( {word}) String sound-fold {word}
spellbadword() String badly spelled word at cursor spellbadword() String badly spelled word at cursor
spellsuggest( {word} [, {max} [, {capital}]]) spellsuggest( {word} [, {max} [, {capital}]])
@@ -5275,7 +5276,7 @@ sinh({expr}) *sinh()*
{only available when compiled with the |+float| feature} {only available when compiled with the |+float| feature}
sort({list} [, {func}]) *sort()* *E702* sort({list} [, {func} [, {dict}]]) *sort()* *E702*
Sort the items in {list} in-place. Returns {list}. If you Sort the items in {list} in-place. Returns {list}. If you
want a list to remain unmodified make a copy first: > want a list to remain unmodified make a copy first: >
:let sortedlist = sort(copy(mylist)) :let sortedlist = sort(copy(mylist))
@@ -5283,6 +5284,8 @@ sort({list} [, {func}]) *sort()* *E702*
Numbers sort after Strings, |Lists| after Numbers. Numbers sort after Strings, |Lists| after Numbers.
For sorting text in the current buffer use |:sort|. For sorting text in the current buffer use |:sort|.
When {func} is given and it is one then case is ignored. When {func} is given and it is one then case is ignored.
{dict} is for functions with the "dict" attribute. It will be
used to set the local variable "self". |Dictionary-function|
When {func} is a |Funcref| or a function name, this function When {func} 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

View File

@@ -7930,7 +7930,7 @@ static struct fst
{"sin", 1, 1, f_sin}, {"sin", 1, 1, f_sin},
{"sinh", 1, 1, f_sinh}, {"sinh", 1, 1, f_sinh},
#endif #endif
{"sort", 1, 2, f_sort}, {"sort", 1, 3, f_sort},
{"soundfold", 1, 1, f_soundfold}, {"soundfold", 1, 1, f_soundfold},
{"spellbadword", 0, 1, f_spellbadword}, {"spellbadword", 0, 1, f_spellbadword},
{"spellsuggest", 1, 3, f_spellsuggest}, {"spellsuggest", 1, 3, f_spellsuggest},
@@ -16366,6 +16366,7 @@ static int
static int item_compare_ic; static int item_compare_ic;
static char_u *item_compare_func; static char_u *item_compare_func;
static dict_T *item_compare_selfdict;
static int item_compare_func_err; static int item_compare_func_err;
#define ITEM_COMPARE_FAIL 999 #define ITEM_COMPARE_FAIL 999
@@ -16425,7 +16426,8 @@ item_compare2(s1, s2)
rettv.v_type = VAR_UNKNOWN; /* clear_tv() uses this */ rettv.v_type = VAR_UNKNOWN; /* clear_tv() uses this */
res = call_func(item_compare_func, (int)STRLEN(item_compare_func), res = call_func(item_compare_func, (int)STRLEN(item_compare_func),
&rettv, 2, argv, 0L, 0L, &dummy, TRUE, NULL); &rettv, 2, argv, 0L, 0L, &dummy, TRUE,
item_compare_selfdict);
clear_tv(&argv[0]); clear_tv(&argv[0]);
clear_tv(&argv[1]); clear_tv(&argv[1]);
@@ -16471,8 +16473,10 @@ f_sort(argvars, rettv)
item_compare_ic = FALSE; item_compare_ic = FALSE;
item_compare_func = NULL; item_compare_func = NULL;
item_compare_selfdict = NULL;
if (argvars[1].v_type != VAR_UNKNOWN) if (argvars[1].v_type != VAR_UNKNOWN)
{ {
/* optional second argument: {func} */
if (argvars[1].v_type == VAR_FUNC) if (argvars[1].v_type == VAR_FUNC)
item_compare_func = argvars[1].vval.v_string; item_compare_func = argvars[1].vval.v_string;
else else
@@ -16487,6 +16491,17 @@ f_sort(argvars, rettv)
else else
item_compare_func = get_tv_string(&argvars[1]); item_compare_func = get_tv_string(&argvars[1]);
} }
if (argvars[2].v_type != VAR_UNKNOWN)
{
/* optional third argument: {dict} */
if (argvars[2].v_type != VAR_DICT)
{
EMSG(_(e_dictreq));
return;
}
item_compare_selfdict = argvars[2].vval.v_dict;
}
} }
/* Make an array with each entry pointing to an item in the List. */ /* Make an array with each entry pointing to an item in the List. */

View File

@@ -709,6 +709,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 */
/**/
224,
/**/ /**/
223, 223,
/**/ /**/