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

patch 8.2.0988: getting directory contents is always case sorted

Problem:    Getting directory contents is always case sorted.
Solution:   Add sort options and v:collate. (Christian Brabandt, closes #6229)
This commit is contained in:
Bram Moolenaar
2020-06-16 20:03:43 +02:00
parent 9af78769ee
commit 84cf6bd81b
17 changed files with 272 additions and 32 deletions

View File

@@ -35,6 +35,10 @@ static linenr_T readfile_linenr(linenr_T linecnt, char_u *p, char_u *endp);
static char_u *check_for_bom(char_u *p, long size, int *lenp, int flags);
static char *e_auchangedbuf = N_("E812: Autocommands changed buffer or buffer name");
#ifdef FEAT_EVAL
static int readdirex_sort;
#endif
void
filemess(
buf_T *buf,
@@ -4645,7 +4649,23 @@ compare_readdirex_item(const void *p1, const void *p2)
name1 = dict_get_string(*(dict_T**)p1, (char_u*)"name", FALSE);
name2 = dict_get_string(*(dict_T**)p2, (char_u*)"name", FALSE);
return STRCMP(name1, name2);
if (readdirex_sort == READDIR_SORT_BYTE)
return STRCMP(name1, name2);
else if (readdirex_sort == READDIR_SORT_IC)
return STRICMP(name1, name2);
else
return STRCOLL(name1, name2);
}
static int
compare_readdir_item(const void *s1, const void *s2)
{
if (readdirex_sort == READDIR_SORT_BYTE)
return STRCMP(*(char **)s1, *(char **)s2);
else if (readdirex_sort == READDIR_SORT_IC)
return STRICMP(*(char **)s1, *(char **)s2);
else
return STRCOLL(*(char **)s1, *(char **)s2);
}
#endif
@@ -4663,7 +4683,8 @@ readdir_core(
char_u *path,
int withattr UNUSED,
void *context,
int (*checkitem)(void *context, void *item))
int (*checkitem)(void *context, void *item),
int sort)
{
int failed = FALSE;
char_u *p;
@@ -4687,6 +4708,8 @@ readdir_core(
else \
vim_free(item); \
} while (0)
readdirex_sort = READDIR_SORT_BYTE;
# else
# define FREE_ITEM(item) vim_free(item)
# endif
@@ -4844,15 +4867,19 @@ readdir_core(
# undef FREE_ITEM
if (!failed && gap->ga_len > 0)
if (!failed && gap->ga_len > 0 && sort > READDIR_SORT_NONE)
{
# ifdef FEAT_EVAL
readdirex_sort = sort;
if (withattr)
qsort((void*)gap->ga_data, (size_t)gap->ga_len, sizeof(dict_T*),
compare_readdirex_item);
else
# endif
qsort((void*)gap->ga_data, (size_t)gap->ga_len, sizeof(char_u *),
compare_readdir_item);
# else
sort_strings((char_u **)gap->ga_data, gap->ga_len);
# endif
}
return failed ? FAIL : OK;
@@ -4883,7 +4910,7 @@ delete_recursive(char_u *name)
exp = vim_strsave(name);
if (exp == NULL)
return -1;
if (readdir_core(&ga, exp, FALSE, NULL, NULL) == OK)
if (readdir_core(&ga, exp, FALSE, NULL, NULL, READDIR_SORT_NONE) == OK)
{
for (i = 0; i < ga.ga_len; ++i)
{