1
0
forked from aniani/vim

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

@@ -1745,6 +1745,14 @@ v:cmdbang Set like v:cmdarg for a file read/write command. When a "!"
was used the value is 1, otherwise it is 0. Note that this
can only be used in autocommands. For user commands |<bang>|
can be used.
*v:collate* *collate-variable*
v:collate The current locale setting for collation order of the runtime
environment. This allows Vim scripts to be aware of the
current locale encoding. Technical: it's the value of
LC_COLLATE. When not using a locale the value is "C".
This variable can not be set directly, use the |:language|
command.
See |multi-lang|.
*v:completed_item* *completed_item-variable*
v:completed_item
@@ -2683,8 +2691,10 @@ pyxeval({expr}) any evaluate |python_x| expression
rand([{expr}]) Number get pseudo-random number
range({expr} [, {max} [, {stride}]])
List items from {expr} to {max}
readdir({dir} [, {expr}]) List file names in {dir} selected by {expr}
readdirex({dir} [, {expr}]) List file info in {dir} selected by {expr}
readdir({dir} [, {expr} [, {dict}]])
List file names in {dir} selected by {expr}
readdirex({dir} [, {expr} [, {dict}]])
List file info in {dir} selected by {expr}
readfile({fname} [, {type} [, {max}]])
List get list of lines from file {fname}
reduce({object}, {func} [, {initial}])
@@ -7904,11 +7914,12 @@ rand([{expr}]) *rand()* *random*
:echo rand(seed)
:echo rand(seed) % 16 " random number 0 - 15
<
readdir({directory} [, {expr}]) *readdir()*
readdir({directory} [, {expr} [, {dict}]]) *readdir()*
Return a list with file and directory names in {directory}.
You can also use |glob()| if you don't need to do complicated
things, such as limiting the number of matches.
The list will be sorted (case sensitive).
The list will be sorted (case sensitive), see the {dict}
argument below for changing the sort order.
When {expr} is omitted all entries are included.
When {expr} is given, it is evaluated to check what to do:
@@ -7926,18 +7937,38 @@ readdir({directory} [, {expr}]) *readdir()*
< To skip hidden and backup files: >
readdir(dirname, {n -> n !~ '^\.\|\~$'})
< The optional {dict} argument allows for further custom
values. Currently this is used to specify if and how sorting
should be performed. The dict can have the following members:
sort How to sort the result returned from the system.
Valid values are:
"none" do not sort (fastest method)
"case" sort case sensitive (byte value of
each character, technically, using
strcmp()) (default)
"icase" sort case insensitive (technically
using strcasecmp())
"collate" sort using the collation order
of the "POSIX" or "C" |locale|
(technically using strcoll())
Other values are silently ignored.
For example, to get a list of all files in the current
directory without sorting the individual entries: >
readdir('.', '1', #{sort: 'none'})
< If you want to get a directory tree: >
function! s:tree(dir)
return {a:dir : map(readdir(a:dir),
function! s:tree(dir)
return {a:dir : map(readdir(a:dir),
\ {_, x -> isdirectory(x) ?
\ {x : s:tree(a:dir . '/' . x)} : x})}
endfunction
echo s:tree(".")
\ {x : s:tree(a:dir . '/' . x)} : x})}
endfunction
echo s:tree(".")
<
Can also be used as a |method|: >
GetDirName()->readdir()
<
readdirex({directory} [, {expr}]) *readdirex()*
readdirex({directory} [, {expr} [, {dict}]]) *readdirex()*
Extended version of |readdir()|.
Return a list of Dictionaries with file and directory
information in {directory}.
@@ -7946,7 +7977,9 @@ readdirex({directory} [, {expr}]) *readdirex()*
This is much faster than calling |readdir()| then calling
|getfperm()|, |getfsize()|, |getftime()| and |getftype()| for
each file and directory especially on MS-Windows.
The list will be sorted by name (case sensitive).
The list will by default be sorted by name (case sensitive),
the sorting can be changed by using the optional {dict}
argument, see |readdir()|.
The Dictionary for file and directory information has the
following items:
@@ -7986,6 +8019,11 @@ readdirex({directory} [, {expr}]) *readdirex()*
When {expr} is a function the entry is passed as the argument.
For example, to get a list of files ending in ".txt": >
readdirex(dirname, {e -> e.name =~ '.txt$'})
<
For example, to get a list of all files in the current
directory without sorting the individual entries: >
readdirex(dirname, '1', #{sort: 'none'})
<
Can also be used as a |method|: >
GetDirName()->readdirex()

View File

@@ -37,6 +37,7 @@ use of "-" and "_".
:lan[guage] mes[sages]
:lan[guage] cty[pe]
:lan[guage] tim[e]
:lan[guage] col[late]
Print the current language (aka locale).
With the "messages" argument the language used for
messages is printed. Technical: LC_MESSAGES.
@@ -44,15 +45,19 @@ use of "-" and "_".
character encoding is printed. Technical: LC_CTYPE.
With the "time" argument the language used for
strftime() is printed. Technical: LC_TIME.
With the "collate" argument the language used for
collation order is printed. Technical: LC_COLLATE.
Without argument all parts of the locale are printed
(this is system dependent).
The current language can also be obtained with the
|v:lang|, |v:ctype| and |v:lc_time| variables.
|v:lang|, |v:ctype|, |v:collate| and |v:lc_time|
variables.
:lan[guage] {name}
:lan[guage] mes[sages] {name}
:lan[guage] cty[pe] {name}
:lan[guage] tim[e] {name}
:lan[guage] col[late] {name}
Set the current language (aka locale) to {name}.
The locale {name} must be a valid locale on your
system. Some systems accept aliases like "en" or
@@ -72,7 +77,10 @@ use of "-" and "_".
With the "time" argument the language used for time
and date messages is set. This affects strftime().
This sets $LC_TIME.
Without an argument both are set, and additionally
With the "collate" argument the language used for the
collation order is set. This affects sorting of
characters. This sets $LC_COLLATE.
Without an argument all are set, and additionally
$LANG is set.
When compiled with the |+float| feature the LC_NUMERIC
value will always be set to "C", so that floating