From 928e80ad6afd6757a483980c8d9f5b7796f28ea5 Mon Sep 17 00:00:00 2001 From: Fabian Homborg Date: Sat, 23 May 2020 09:12:52 +0200 Subject: [PATCH] Extract setting $LS_COLORS to its own function Makes it easier to override ls while keeping $LS_COLORS. --- share/functions/__fish_set_lscolors.fish | 18 ++++++++++++++++++ share/functions/ls.fish | 19 +------------------ 2 files changed, 19 insertions(+), 18 deletions(-) create mode 100644 share/functions/__fish_set_lscolors.fish 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