diff --git a/share/functions/__fish_set_lscolors.fish b/share/functions/__fish_set_lscolors.fish new file mode 100644 index 000000000..186741cac --- /dev/null +++ b/share/functions/__fish_set_lscolors.fish @@ -0,0 +1,18 @@ +function __fish_set_lscolors --description 'Set $LS_COLORS if possible' + if ! set -qx LS_COLORS && set -l cmd (command -s {g,}dircolors)[1] + set -l colorfile + for file in ~/.dir_colors ~/.dircolors /etc/DIR_COLORS + if test -f $file + set colorfile $file + break + end + end + # Here we rely on the legacy behavior of `dircolors -c` producing output + # suitable for csh in order to extract just the data we're interested in. + set -gx LS_COLORS ($cmd -c $colorfile | string split ' ')[3] + # The value should always be quoted but be conservative and check first. + if string match -qr '^([\'"]).*\1$' -- $LS_COLORS + set LS_COLORS (string match -r '^.(.*).$' $LS_COLORS)[2] + end + end +end diff --git a/share/functions/ls.fish b/share/functions/ls.fish index 368c67c69..194b5f865 100644 --- a/share/functions/ls.fish +++ b/share/functions/ls.fish @@ -9,30 +9,13 @@ for opt in --color=auto -G --color -F if command ls $opt / >/dev/null 2>/dev/null - function ls --description "List contents of directory" -V opt + __fish_set_lscolors isatty stdout and set -a opt -F command ls $opt $argv end - if [ $opt = --color=auto ] && ! set -qx LS_COLORS && set -l cmd (command -s {g,}dircolors)[1] - set -l colorfile - for file in ~/.dir_colors ~/.dircolors /etc/DIR_COLORS - if test -f $file - set colorfile $file - break - end - end - # Here we rely on the legacy behavior of `dircolors -c` producing output - # suitable for csh in order to extract just the data we're interested in. - set -gx LS_COLORS ($cmd -c $colorfile | string split ' ')[3] - # The value should always be quoted but be conservative and check first. - if string match -qr '^([\'"]).*\1$' -- $LS_COLORS - set LS_COLORS (string match -r '^.(.*).$' $LS_COLORS)[2] - end - end - break end end