Skip to content

Commit dc45332

Browse files
committed
Implement file name colouring in {exa,ls}_colors
This commit adds to the parsing of the LS_COLORS and EXA_COLORS variables so that non-two-letter codes (keys other than things like ‘di’ or ‘ln’ or ‘ex’) will be treated as file name globs, and get used to colour files accordingly. Fixes #116 for good.
1 parent b86074d commit dc45332

File tree

9 files changed

+348
-57
lines changed

9 files changed

+348
-57
lines changed

src/options/style.rs

Lines changed: 236 additions & 40 deletions
Large diffs are not rendered by default.

src/output/file_name.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,3 +285,13 @@ impl FileColours for NoFileColours {
285285
fn colour_file(&self, _file: &File) -> Option<Style> { None }
286286
}
287287

288+
// When getting the colour of a file from a *pair* of colourisers, try the
289+
// first one then try the second one. This lets the user provide their own
290+
// file type associations, while falling back to the default set if not set
291+
// explicitly.
292+
impl<A, B> FileColours for (A, B)
293+
where A: FileColours, B: FileColours {
294+
fn colour_file(&self, file: &File) -> Option<Style> {
295+
self.0.colour_file(file).or_else(|| self.1.colour_file(file))
296+
}
297+
}

xtests/run.sh

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -158,17 +158,17 @@ env LANG=ja_JP.UTF-8 $exa $testcases/dates -l | diff -q - $results/dates_jp ||
158158
# These directories are created in the VM user’s home directory (the default
159159
# location) when a Cargo build is done.
160160
(cd; mkdir -p target/debug/build
161-
$exa -1d target target/debug target/debug/build | diff -q - $results/dir_paths) || exit 1
162-
$exa -1d . .. / | diff -q - $results/dirs || exit 1
161+
$exa -1d target target/debug target/debug/build | diff -q - $results/dir_paths) || exit 1
162+
$exa -1d . .. / | diff -q - $results/dirs || exit 1
163163

164164

165165
# Links
166-
COLUMNS=80 $exa $testcases/links 2>&1 | diff -q - $results/links || exit 1
167-
$exa $testcases/links -1 2>&1 | diff -q - $results/links_1 || exit 1
168-
$exa $testcases/links -T 2>&1 | diff -q - $results/links_T || exit 1
169-
$exa $testcases/links -T@ 2>&1 | diff -q - $results/links_T@ || exit 1
170-
$exa /proc/1/root -T 2>&1 | diff -q - $results/proc_1_root || exit 1
171-
$exa /proc/1/root -T@ 2>&1 | diff -q - $results/proc_1_root_@ || exit 1
166+
COLUMNS=80 $exa $testcases/links 2>&1 | diff -q - $results/links || exit 1
167+
$exa $testcases/links -1 2>&1 | diff -q - $results/links_1 || exit 1
168+
$exa $testcases/links -T 2>&1 | diff -q - $results/links_T || exit 1
169+
$exa $testcases/links -T@ 2>&1 | diff -q - $results/links_T@ || exit 1
170+
$exa /proc/1/root -T 2>&1 | diff -q - $results/proc_1_root || exit 1
171+
$exa /proc/1/root -T@ 2>&1 | diff -q - $results/proc_1_root_@ || exit 1
172172

173173
# There’ve been bugs where the target file wasn’t printed properly when the
174174
# symlink file was specified on the command-line directly.
@@ -230,14 +230,35 @@ $exa $testcases/hiddens -l -a 2>&1 | diff -q - $results/hiddens_la || exit 1
230230
$exa $testcases/hiddens -l -aa 2>&1 | diff -q - $results/hiddens_laa || exit 1
231231

232232

233+
# Themes
234+
LS_COLORS="bd=31:cd=32:pi=34" $exa -1 $testcases/specials 2>&1 | diff -q - $results/themed_specials || exit 1
235+
EXA_COLORS="bd=31:cd=32:pi=34" $exa -1 $testcases/specials 2>&1 | diff -q - $results/themed_specials || exit 1
236+
237+
LS_COLORS="*.deb=1;37:*.tar.*=1;37" $exa -1 $testcases/file-names-exts/compressed.* 2>&1 | diff -q - $results/themed_compresseds || exit 1
238+
EXA_COLORS="*.deb=1;37:*.tar.*=1;37" $exa -1 $testcases/file-names-exts/compressed.* 2>&1 | diff -q - $results/themed_compresseds || exit 1
239+
EXA_COLORS="*.deb=1;37" LS_COLORS="*.tar.*=1;37" $exa -1 $testcases/file-names-exts/compressed.* 2>&1 | diff -q - $results/themed_compresseds || exit 1
240+
241+
LS_COLORS="reset:*.deb=1;37:*.tar.*=1;37" $exa -1 $testcases/file-names-exts/compressed.* 2>&1 | diff -q - $results/themed_compresseds || exit 1
242+
EXA_COLORS="reset:*.deb=1;37:*.tar.*=1;37" $exa -1 $testcases/file-names-exts/compressed.* 2>&1 | diff -q - $results/themed_compresseds_r || exit 1
243+
244+
EXA_COLORS="or=32:mi=32;1;4:cc=34;1:ln=34:lp=36;4:xx=32" $exa -1 $testcases/file-names/links 2>&1 | diff -q - $results/themed_links || exit 1
245+
246+
# EXA_COLORS overrides LS_COLORS
247+
LS_COLORS="bd=32:cd=34:pi=31" EXA_COLORS="bd=31:cd=32:pi=34" $exa -1 $testcases/specials 2>&1 | diff -q - $results/themed_specials || exit 1
248+
249+
EXA_COLORS="di=38;5;195:fi=38;5;250:xx=38;5;237:ur=38;5;194:uw=38;5;193:ux=38;5;192:gr=38;5;191:gw=38;5;190:gx=38;5;118:tr=38;5;119:tw=38;5;120:tx=38;5;121:su=38;5;51:sf=38;5;50:sn=38;5;49:un=38;5;46:da=38;5;47:ex=38;5;48" \
250+
$exa --long $testcases/permissions 2>&1 | diff -q - $results/themed_long || exit 1
251+
252+
EXA_COLORS="reset" $exa $testcases/file-names-exts -1 2>&1 | diff -q - $results/themed_un || exit 1
253+
233254
# Errors
234-
$exa --binary 2>&1 | diff -q - $results/error_useless || exit 1
235-
$exa --ternary 2>&1 | diff -q - $results/error_long || exit 1
236-
$exa -4 2>&1 | diff -q - $results/error_short || exit 1
237-
$exa --time 2>&1 | diff -q - $results/error_value || exit 1
238-
$exa --long=time 2>&1 | diff -q - $results/error_overvalued || exit 1
239-
$exa -l --long 2>&1 | diff -q - $results/error_duplicate || exit 1
240-
$exa -ll 2>&1 | diff -q - $results/error_twice || exit 1
255+
$exa --binary 2>&1 | diff -q - $results/error_useless || exit 1
256+
$exa --ternary 2>&1 | diff -q - $results/error_long || exit 1
257+
$exa -4 2>&1 | diff -q - $results/error_short || exit 1
258+
$exa --time 2>&1 | diff -q - $results/error_value || exit 1
259+
$exa --long=time 2>&1 | diff -q - $results/error_overvalued || exit 1
260+
$exa -l --long 2>&1 | diff -q - $results/error_duplicate || exit 1
261+
$exa -ll 2>&1 | diff -q - $results/error_twice || exit 1
241262

242263

243264
# Debug mode
@@ -246,8 +267,8 @@ EXA_DEBUG="1" $exa $testcases/attributes/dirs/no-xattrs_empty -lh 2>&1 | tail -n
246267

247268

248269
# And finally...
249-
$exa --help | diff -q - $results/help || exit 1
250-
$exa --help --long | diff -q - $results/help_long || exit 1
270+
$exa --help | diff -q - $results/help || exit 1
271+
$exa --help --long | diff -q - $results/help_long || exit 1
251272

252273

253274
echo "All the tests passed!"

xtests/themed_compresseds

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
/testcases/file-names-exts/compressed.deb
2+
/testcases/file-names-exts/compressed.tar.gz
3+
/testcases/file-names-exts/compressed.tar.xz
4+
/testcases/file-names-exts/compressed.tgz
5+
/testcases/file-names-exts/compressed.txz

xtests/themed_compresseds_r

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
/testcases/file-names-exts/compressed.deb
2+
/testcases/file-names-exts/compressed.tar.gz
3+
/testcases/file-names-exts/compressed.tar.xz
4+
/testcases/file-names-exts/compressed.tgz
5+
/testcases/file-names-exts/compressed.txz

xtests/themed_links

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
another: [\n] -> /testcases/file-names/new-line-dir: [\n]/another: [\n]
2+
broken -> /testcases/file-names/new-line-dir: [\n]/broken
3+
subfile -> /testcases/file-names/new-line-dir: [\n]/subfile

xtests/themed_long

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
.--------- 0 cassowary  1 Jan 12:34 000
2+
.--------x 0 cassowary  1 Jan 12:34 001
3+
.-------w- 0 cassowary  1 Jan 12:34 002
4+
.------r-- 0 cassowary  1 Jan 12:34 004
5+
.-----x--- 0 cassowary  1 Jan 12:34 010
6+
.----w---- 0 cassowary  1 Jan 12:34 020
7+
.---r----- 0 cassowary  1 Jan 12:34 040
8+
.--x------ 0 cassowary  1 Jan 12:34 100
9+
.-w------- 0 cassowary  1 Jan 12:34 200
10+
.r-------- 0 cassowary  1 Jan 12:34 400
11+
.rw-r--r-- 0 cassowary  1 Jan 12:34 644
12+
.rwxr-xr-x 0 cassowary  1 Jan 12:34 755
13+
.rwxrwxrwx 0 cassowary  1 Jan 12:34 777
14+
.--------T 0 cassowary  1 Jan 12:34 1000
15+
.--------t 0 cassowary  1 Jan 12:34 1001
16+
.-----S--- 0 cassowary  1 Jan 12:34 2000
17+
.-----s--- 0 cassowary  1 Jan 12:34 2010
18+
.--S------ 0 cassowary  1 Jan 12:34 4000
19+
.--s------ 0 cassowary  1 Jan 12:34 4100
20+
.rwSrwSrwT 0 cassowary  1 Jan 12:34 7666
21+
.rwsrwsrwt 0 cassowary  1 Jan 12:34 7777
22+
d--------- - cassowary  1 Jan 12:34 forbidden-directory

xtests/themed_specials

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
block-device
2+
char-device
3+
named-pipe

xtests/themed_un

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#SAVEFILE#
2+
backup~
3+
compiled.class
4+
compiled.coffee
5+
compiled.js
6+
compiled.o
7+
compressed.deb
8+
compressed.tar.gz
9+
compressed.tar.xz
10+
compressed.tgz
11+
compressed.txz
12+
COMPRESSED.ZIP
13+
crypto.asc
14+
crypto.signature
15+
document.pdf
16+
DOCUMENT.XLSX
17+
file.tmp
18+
IMAGE.PNG
19+
image.svg
20+
lossless.flac
21+
lossless.wav
22+
Makefile
23+
music.mp3
24+
MUSIC.OGG
25+
VIDEO.AVI
26+
video.wmv

0 commit comments

Comments
 (0)