diff options
author | Adam Hovorka <[email protected]> | 2020-05-20 15:46:54 -0600 |
---|---|---|
committer | Adam Hovorka <[email protected]> | 2020-05-20 15:46:54 -0600 |
commit | 86fbbd84cf3e0321d75239fa31a80265ffbc8b18 (patch) | |
tree | bfa1ffc237f7a779a829c15ad474d230ffd79eb5 /base/zsh/k.zsh | |
parent | dd31e008c9a55e53c4a2ccc3cf4ca5c83dd2ef5a (diff) |
Update k.zsh and add custom ls colors
Diffstat (limited to 'base/zsh/k.zsh')
-rw-r--r-- | base/zsh/k.zsh | 396 |
1 files changed, 236 insertions, 160 deletions
diff --git a/base/zsh/k.zsh b/base/zsh/k.zsh index fe80c3c..0b2cc5e 100644 --- a/base/zsh/k.zsh +++ b/base/zsh/k.zsh @@ -8,53 +8,100 @@ k () { # Stop stat failing when a directory contains either no files or no hidden files # Track if we _accidentally_ create a new global variable - setopt local_options null_glob typeset_silent no_auto_pushd + setopt local_options null_glob typeset_silent no_auto_pushd nomarkdirs pushd_silent + unsetopt pushd_ignore_dups # Process options and get files/directories - typeset -a o_all o_almost_all o_raw o_si o_directory o_no_directory o_no_vcs o_help - #typeset -a o_all o_almost_all o_human o_si o_directory o_no_directory o_no_vcs o_help + typeset -a o_all o_almost_all o_raw o_si o_directory o_mix_directories \ + o_no_directory o_no_vcs o_sort o_sort_reverse o_help + #typeset -a o_all o_almost_all o_human o_si o_directory o_group_directories \ + # o_no_directory o_no_vcs o_sort o_sort_reverse o_help zparseopts -E -D \ a=o_all -all=o_all \ A=o_almost_all -almost-all=o_almost_all \ + c=o_sort \ d=o_directory -directory=o_directory \ - r=o_raw -raw-size=o_raw \ + -mix-directories=o_mix_directories \ + b=o_raw -raw-size=o_raw \ -si=o_si \ n=o_no_directory -no-directory=o_no_directory \ -no-vcs=o_no_vcs \ + r=o_sort_reverse -reverse=o_sort_reverse \ + -sort:=o_sort \ + S=o_sort \ + t=o_sort \ + u=o_sort \ + U=o_sort \ -help=o_help + #-group-directories-first=o_group_directories \ #h=o_human -human=o_human \ # Print Help if bad usage, or they asked for it - if [[ $? != 0 || "$o_help" != "" ]] + if [[ $? != 0 || -n "$o_help" ]] then print -u2 "Usage: k [options] DIR" print -u2 "Options:" - print -u2 "\t-a --all list entries starting with ." - print -u2 "\t-A --almost-all list all except . and .." - print -u2 "\t-d --directory list only directories" - print -u2 "\t-n --no-directory do not list directories" - #print -u2 "\t-h --human show filesizes in human-readable format" - print -u2 "\t-r --raw-size show filesizes in byte format" - print -u2 "\t --si with -h, use powers of 1000 not 1024" - print -u2 "\t --no-vcs do not get VCS status (much faster)" - print -u2 "\t --help show this help" + print -u2 "\t-a --all list entries starting with ." + print -u2 "\t-A --almost-all list all except . and .." + print -u2 "\t-c sort by ctime (inode change time)" + print -u2 "\t-d --directory list only directories" + print -u2 "\t-n --no-directory do not list directories" + print -u2 "\t --mix-directories do not group directories first" + #print -u2 "\t-h --human show filesizes in human-readable format" + print -u2 "\t-b --raw-size show filesizes in byte format" + print -u2 "\t --si with -h, use powers of 1000 not 1024" + print -u2 "\t-r --reverse reverse sort order" + print -u2 "\t-S sort by size" + print -u2 "\t-t sort by time (modification time)" + print -u2 "\t-u sort by atime (use or access time)" + print -u2 "\t-U Unsorted" + print -u2 "\t --sort WORD sort by WORD: none (U), size (S)," + print -u2 "\t time (t), ctime or status (c)," + print -u2 "\t atime or access or use (u)" + print -u2 "\t --no-vcs do not get VCS status (much faster)" + print -u2 "\t --help show this help" return 1 fi # Check for conflicts - if [[ "$o_directory" != "" && "$o_no_directory" != "" ]]; then + if [[ -n "$o_directory" && -n "$o_no_directory" ]]; then print -u2 "$o_directory and $o_no_directory cannot be used together" return 1 fi + # case is like a mnemonic for sort order: + # lower-case for standard, upper-case for descending + local S_ORD="o" R_ORD="O" SPEC="n" # default: by name + + # translate ls options to glob-qualifiers, + # ignoring "--sort" prefix of long-args form + case ${o_sort:#--sort} in + -U|none) SPEC="N";; + -t|time) SPEC="m";; + -c|ctime|status) SPEC="c";; + -u|atime|access|use) SPEC="a";; + # reverse default order for sort by size + -S|size) S_ORD="O" R_ORD="o" SPEC="L";; + esac + + if [[ -z "$o_sort_reverse" ]]; then + typeset SORT_GLOB="${S_ORD}${SPEC}" + else + typeset SORT_GLOB="${R_ORD}${SPEC}" + fi + #if [[ -n "$o_group_directories" ]]; then + if [[ -z "$o_mix_directories" ]]; then + SORT_GLOB="oe:[[ -d \$REPLY ]];REPLY=\$?:$SORT_GLOB" + fi + # Check which numfmt available (if any), warn user if not available typeset -i numfmt_available=0 typeset -i gnumfmt_available=0 - #if [[ "$o_human" != "" ]]; then - if [[ "$o_raw" == "" ]]; then - if [[ $+commands[numfmt] == 1 ]]; then + #if [[ -n "$o_human" ]]; then + if [[ -z "$o_raw" ]]; then + if (( $+commands[numfmt] )); then numfmt_available=1 - elif [[ $+commands[gnumfmt] == 1 ]]; then + elif (( $+commands[gnumfmt] )); then gnumfmt_available=1 else print -u2 "'numfmt' or 'gnumfmt' command not found, human readable output will not work." @@ -69,32 +116,26 @@ k () { # Create numfmt local function numfmt_local () { - if [[ "$o_si" != "" ]]; then - if (( $numfmt_available )); then + if [[ -n "$o_si" ]]; then + if (( numfmt_available )); then numfmt --to=si $1 - elif (( $gnumfmt_available )); then + elif (( gnumfmt_available )); then gnumfmt --to=si $1 fi else - if (( $numfmt_available )); then + if (( numfmt_available )); then numfmt --to=iec $1 - elif (( $gnumfmt_available )); then + elif (( gnumfmt_available )); then gnumfmt --to=iec $1 fi fi } - # Set if we're in a repo or not - typeset -i INSIDE_WORK_TREE=0 - if [[ $(command git rev-parse --is-inside-work-tree 2>/dev/null) == true ]]; then - INSIDE_WORK_TREE=1 - fi - # Setup array of directories to print typeset -a base_dirs typeset base_dir - if [[ "$@" == "" ]]; then + if [[ -z "$@" ]]; then base_dirs=. else base_dirs=($@) @@ -104,17 +145,18 @@ k () { # Colors # ---------------------------------------------------------------------------- # default colors - K_COLOR_DI="0;34" # di:directory - K_COLOR_LN="0;35" # ln:symlink - K_COLOR_SO="0;32" # so:socket - K_COLOR_PI="0;33" # pi:pipe - K_COLOR_EX="0;31" # ex:executable - K_COLOR_BD="34;46" # bd:block special - K_COLOR_CD="34;43" # cd:character special - K_COLOR_SU="30;41" # su:executable with setuid bit set - K_COLOR_SG="30;46" # sg:executable with setgid bit set + K_COLOR_DI="01;34" # di:directory + K_COLOR_LN="01;36" # ln:symlink + K_COLOR_SO="01;35" # so:socket + K_COLOR_PI="40;33" # pi:pipe + K_COLOR_EX="01;32" # ex:executable + K_COLOR_BD="40;33;01" # bd:block special + K_COLOR_CD="40;33;01" # cd:character special + K_COLOR_SU="37;41" # su:executable with setuid bit set + K_COLOR_SG="30;43" # sg:executable with setgid bit set K_COLOR_TW="30;42" # tw:directory writable to others, with sticky bit - K_COLOR_OW="30;43" # ow:directory writable to others, without sticky bit + K_COLOR_OW="34;42" # ow:directory writable to others, without sticky bit + K_COLOR_BR="00;90" # branch # read colors if osx and $LSCOLORS is defined if [[ $(uname) == 'Darwin' && -n $LSCOLORS ]]; then @@ -132,11 +174,6 @@ k () { K_COLOR_OW=$(_k_bsd_to_ansi $LSCOLORS[21] $LSCOLORS[22]) fi - # read colors if linux and $LS_COLORS is defined - # if [[ $(uname) == 'Linux' && -n $LS_COLORS ]]; then - - # fi - # ---------------------------------------------------------------------------- # Loop over passed directories and files to display # ---------------------------------------------------------------------------- @@ -145,7 +182,7 @@ k () { # ---------------------------------------------------------------------------- # Display name if multiple paths were passed # ---------------------------------------------------------------------------- - if [[ "$#base_dirs" > 1 ]]; then + if (( $#base_dirs > 1 )); then # Only add a newline if its not the first iteration if [[ "$base_dir" != "${base_dirs[1]}" ]]; then print @@ -164,7 +201,7 @@ k () { typeset -i TOTAL_BLOCKS=0 - MAX_LEN=(0 0 0 0 0 0) + MAX_LEN=(0 0 0 0 0 0 0) # Array to hold results from `stat` call RESULTS=() @@ -173,32 +210,44 @@ k () { typeset -i IS_GIT_REPO=0 typeset GIT_TOPLEVEL - typeset -i LARGE_FILE_COLOR=196 + #typeset -i LARGE_FILE_COLOR=196 + typeset -i LARGE_FILE_COLOR=1 typeset -a SIZELIMITS_TO_COLOR SIZELIMITS_TO_COLOR=( - 1024 46 # <= 1kb - 2048 82 # <= 2kb - 3072 118 # <= 3kb - 5120 154 # <= 5kb - 10240 190 # <= 10kb - 20480 226 # <= 20kb - 40960 220 # <= 40kb - 102400 214 # <= 100kb - 262144 208 # <= 0.25mb || 256kb - 524288 202 # <= 0.5mb || 512kb + # 1024 46 # <= 1kb + # 2048 82 # <= 2kb + # 3072 118 # <= 3kb + # 5120 154 # <= 5kb + # 10240 190 # <= 10kb + # 20480 226 # <= 20kb + # 40960 220 # <= 40kb + #102400 214 # <= 100kb + #262144 208 # <= 0.25mb || 256kb + #524288 202 # <= 0.5mb || 512kb + 3072 71 # <= 3kb + 51200 2 # <= 50kb + 262144 3 # <= 0.25mb || 256kb + 524288 16 # <= 0.5mb || 512kb ) - typeset -i ANCIENT_TIME_COLOR=236 # > more than 2 years old + #typeset -i ANCIENT_TIME_COLOR=236 # > more than 2 years old + typeset -i ANCIENT_TIME_COLOR=18 # > more than 2 years old typeset -a FILEAGES_TO_COLOR FILEAGES_TO_COLOR=( - 0 196 # < in the future, #spooky - 60 255 # < less than a min old - 3600 252 # < less than an hour old - 86400 250 # < less than 1 day old - 604800 244 # < less than 1 week old - 2419200 244 # < less than 28 days (4 weeks) old - 15724800 242 # < less than 26 weeks (6 months) old - 31449600 240 # < less than 1 year old - 62899200 238 # < less than 2 years old + # 0 196 # < in the future, #spooky + # 60 255 # < less than a min old + # 3600 252 # < less than an hour old + # 86400 250 # < less than 1 day old + # 604800 244 # < less than 1 week old + # 2419200 244 # < less than 28 days (4 weeks) old + #15724800 242 # < less than 26 weeks (6 months) old + #31449600 240 # < less than 1 year old + #62899200 238 # < less than 2 years old + 0 1 # < in the future, #spooky + 3600 21 # < less than an hour old + 86400 7 # < less than 1 day old + 604800 20 # < less than 1 week old + 2419200 8 # < less than 28 days (4 weeks) old + 31449600 19 # < less than 1 year old ) # ---------------------------------------------------------------------------- @@ -211,38 +260,49 @@ k () { # Check if it even exists if [[ ! -e $base_dir ]]; then print -u2 "k: cannot access $base_dir: No such file or directory" + continue # If its just a file, skip the directory handling elif [[ -f $base_dir ]]; then show_list=($base_dir) #Directory, add its contents - else + elif pushd $base_dir 2>/dev/null; then + # Set if we're in a repo or not + typeset -i INSIDE_WORK_TREE=0 + if $(git rev-parse --is-inside-work-tree 2> /dev/null); then + INSIDE_WORK_TREE=1 + GIT_TOPLEVEL=$(git rev-parse --show-toplevel) + fi + # Break total blocks of the front of the stat call, then push the rest to results - if [[ "$o_all" != "" && "$o_almost_all" == "" && "$o_no_directory" == "" ]]; then - show_list+=($base_dir/.) - show_list+=($base_dir/..) + if [[ -n "$o_all" && -z "$o_almost_all" && -z "$o_no_directory" ]]; then + show_list+=(.) + show_list+=(..) fi - if [[ "$o_all" != "" || "$o_almost_all" != "" ]]; then - if [[ "$o_directory" != "" ]]; then - show_list+=($base_dir/*(D/)) - elif [[ "$o_no_directory" != "" ]]; then + if [[ -n "$o_all" || -n "$o_almost_all" ]]; then + if [[ -n "$o_directory" ]]; then + show_list+=(*(D/$SORT_GLOB)) + elif [[ -n "$o_no_directory" ]]; then #Use (^/) instead of (.) so sockets and symlinks get displayed - show_list+=($base_dir/*(D^/)) + show_list+=(*(D^/$SORT_GLOB)) else - show_list+=($base_dir/*(D)) + show_list+=(*(D$SORT_GLOB)) fi else - if [[ "$o_directory" != "" ]]; then - show_list+=($base_dir/*(/)) - elif [[ "$o_no_directory" != "" ]]; then + if [[ -n "$o_directory" ]]; then + show_list+=(*(/$SORT_GLOB)) + elif [[ -n "$o_no_directory" ]]; then #Use (^/) instead of (.) so sockets and symlinks get displayed - show_list+=($base_dir/*(^/)) + show_list+=(*(^/$SORT_GLOB)) else - show_list+=($base_dir/*) + show_list+=(*($SORT_GLOB)) fi fi + else + print -u2 "k: permission denied: $base_dir" + continue fi # ---------------------------------------------------------------------------- @@ -260,7 +320,7 @@ k () { typeset -A $statvar zstat -H $statvar -Lsn -F "%s^%d^%b^%H:%M^%Y" -- "$fn" # use lstat, render mode/uid/gid to strings STATS_PARAMS_LIST+=($statvar) - i+=1 + (( i++ )) done @@ -273,14 +333,18 @@ k () { if [[ ${#sv[uid]} -gt $MAX_LEN[3] ]]; then MAX_LEN[3]=${#sv[uid]} ; fi if [[ ${#sv[gid]} -gt $MAX_LEN[4] ]]; then MAX_LEN[4]=${#sv[gid]} ; fi - #if [[ "$o_human" != "" ]]; then - if [[ "$o_raw" == "" ]]; then + #if [[ -n "$o_human" ]]; then + if [[ -z "$o_raw" ]]; then h=$(numfmt_local ${sv[size]}) if (( ${#h} > $MAX_LEN[5] )); then MAX_LEN[5]=${#h}; fi else if [[ ${#sv[size]} -gt $MAX_LEN[5] ]]; then MAX_LEN[5]=${#sv[size]}; fi fi + LNAME="${sv[name]}" + if [[ -n ${sv[link]} ]]; then LNAME="$LNAME -> ${sv[link]}"; fi + if [[ ${#LNAME} -gt $MAX_LEN[6] ]]; then MAX_LEN[6]=${#LNAME}; fi + TOTAL_BLOCKS+=$sv[blocks] done @@ -292,6 +356,7 @@ k () { # ---------------------------------------------------------------------------- typeset REPOMARKER + typeset REPOBRANCH typeset PERMISSIONS HARDLINKCOUNT OWNER GROUP FILESIZE FILESIZE_OUT DATE NAME SYMLINK_TARGET typeset FILETYPE PER1 PER2 PER3 PERMISSIONS_OUTPUT STATUS typeset TIME_DIFF TIME_COLOR DATE_OUTPUT @@ -305,6 +370,7 @@ k () { # We check if the result is a git repo later, so set a blank marker indication the result is not a git repo REPOMARKER=" " + REPOBRANCH="" IS_DIRECTORY=0 IS_SYMLINK=0 IS_SOCKET=0 @@ -342,27 +408,9 @@ k () { # IS_GIT_REPO is a 1 if $NAME is a file/directory in a git repo, OR if $NAME is a git-repo itself # GIT_TOPLEVEL is set to the directory containing the .git folder of a git-repo - # is this a git repo - if [[ "$o_no_vcs" != "" ]]; then - IS_GIT_REPO=0 - GIT_TOPLEVEL='' - else - if (( IS_DIRECTORY )); - then builtin cd -q $NAME 2>/dev/null || builtin cd -q - >/dev/null && IS_GIT_REPO=0 #Say no if we don't have permissions there - else builtin cd -q $NAME:a:h 2>/dev/null || builtin cd -q - >/dev/null && IS_GIT_REPO=0 - fi - if [[ $(command git rev-parse --is-inside-work-tree 2>/dev/null) == true ]]; then - IS_GIT_REPO=1 - GIT_TOPLEVEL=$(command git rev-parse --show-toplevel) - else - IS_GIT_REPO=0 - fi - builtin cd -q - >/dev/null - fi - # Get human readable output if necessary - #if [[ "$o_human" != "" ]]; then - if [[ "$o_raw" == "" ]]; then + #if [[ -n "$o_human" ]]; then + if [[ -z "$o_raw" ]]; then # I hate making this call twice, but its either that, or do a bunch # of calculations much earlier. FILESIZE_OUT=$(numfmt_local $FILESIZE) @@ -395,14 +443,11 @@ k () { PERMISSIONS_OUTPUT="$FILETYPE$PER1$PER2$PER3" # -------------------------------------------------------------------------- - # Colour the symlinks - # -------------------------------------------------------------------------- - - # -------------------------------------------------------------------------- - # Colour Owner and Group + # Colour Hardlinkcound, Owner and Group # -------------------------------------------------------------------------- - OWNER=$'\e[38;5;241m'"$OWNER"$'\e[0m' - GROUP=$'\e[38;5;241m'"$GROUP"$'\e[0m' + HARDLINKCOUNT=$'\e[38;5;19m'"$HARDLINKCOUNT"$'\e[0m' + OWNER=$'\e[38;5;8m'"$OWNER"$'\e[0m' + GROUP=$'\e[38;5;8m'"$GROUP"$'\e[0m' # -------------------------------------------------------------------------- # Colour file weights @@ -444,38 +489,62 @@ k () { # -------------------------------------------------------------------------- # Colour the repomarker # -------------------------------------------------------------------------- - if [[ "$o_no_vcs" != "" ]]; then - REPOMARKER="" - elif (( IS_GIT_REPO != 0)); then - # If we're not in a repo, still check each directory if it's a repo, and - # then mark appropriately - if (( INSIDE_WORK_TREE == 0 )); then - if (( IS_DIRECTORY )); then - if command git --git-dir="$GIT_TOPLEVEL/.git" --work-tree="${NAME}" diff --stat --quiet --ignore-submodules HEAD &>/dev/null # if dirty - then REPOMARKER=$'\e[38;5;46m|\e[0m' # Show a green vertical bar for clean - else REPOMARKER=$'\e[0;31m+\e[0m' # Show a red vertical bar if dirty - fi - fi - else - if (( IS_DIRECTORY )); then - # If the directory isn't ignored or clean, we'll just say it's dirty - if command git check-ignore --quiet ${NAME} 2>/dev/null; then STATUS='!!' - elif command git diff --stat --quiet --ignore-submodules ${NAME} 2> /dev/null; then STATUS=''; - else STATUS=' M' + # GIT_TOPLEVEL is set to the directory containing the .git folder of a git-repo + + # is this a git repo + if [[ -n "$o_no_vcs" ]]; then + STATUS='N' + elif (( IS_DIRECTORY )); then + if pushd $NAME 2>/dev/null; then + if $(git rev-parse --is-inside-work-tree 2>/dev/null); then + # If we're not in a repo, still check each directory if it's a repo, and + # then mark appropriately + if (( INSIDE_WORK_TREE == 0 )); then + REPOBRANCH="[$(git rev-parse --abbrev-ref HEAD 2>/dev/null)]" + if git diff --stat --quiet --ignore-submodules HEAD &>/dev/null # if dirty + then STATUS='' # Show a green vertical bar for clean + else STATUS='D' # Show a red vertical bar if dirty + fi + popd >/dev/null + else + popd >/dev/null + # If the directory isn't ignored or clean, we'll just say it's dirty + if git check-ignore --quiet ${NAME} 2>/dev/null; then STATUS='!!' + elif git diff --stat --quiet --ignore-submodules ${NAME} 2> /dev/null; then STATUS='' + else STATUS='D' + fi fi else - # File - STATUS=$(command git status --porcelain --ignored --untracked-files=normal $GIT_TOPLEVEL/${${${NAME:a}##$GIT_TOPLEVEL}#*/}) - fi - STATUS=${STATUS[1,2]} - if [[ $STATUS == ' M' ]]; then REPOMARKER=$'\e[0;31m+\e[0m'; # Tracked & Dirty - elif [[ $STATUS == 'M ' ]]; then REPOMARKER=$'\e[38;5;082m+\e[0m'; # Tracked & Dirty & Added - elif [[ $STATUS == '??' ]]; then REPOMARKER=$'\e[38;5;214m+\e[0m'; # Untracked - elif [[ $STATUS == '!!' ]]; then REPOMARKER=$'\e[38;5;238m|\e[0m'; # Ignored - elif [[ $STATUS == 'A ' ]]; then REPOMARKER=$'\e[38;5;082m+\e[0m'; # Added - else REPOMARKER=$'\e[38;5;082m|\e[0m'; # Good + STATUS='N' + popd >/dev/null fi + else + STATUS='N' fi + elif (( INSIDE_WORK_TREE )); then + # File + STATUS=${$(git status --porcelain --ignored --untracked-files=normal $GIT_TOPLEVEL/${${${NAME:a}##$GIT_TOPLEVEL}#*/})[1]} + else + STATUS='N' + fi + case "$STATUS" in + (D) REPOMARKER=$'\e[0;31m+\e[0m';; # Tracked & Dirty + (M) REPOMARKER=$'\e[0;32m+\e[0m';; # Tracked & Dirty & Added + (\?\?) REPOMARKER=$'\e[38;5;16m+\e[0m';; # Untracked + (!!) REPOMARKER=$'\e[38;5;19|\e[0m';; # Ignored + (A) REPOMARKER=$'\e[0;32m+\e[0m';; # Added + (N) REPOMARKER=' ';; # Not a repo + (*) REPOMARKER=$'\e[0;32m|\e[0m';; # Clean + esac + + # -------------------------------------------------------------------------- + # Colour branch + # -------------------------------------------------------------------------- + if [[ -n $REPOBRANCH ]]; then + REPOPAD="'$NAME" + if [[ -n $SYMLINK_TARGET ]]; then REPOPAD="$REPOPAD $SYMLINK_TARGET"; fi + REPOPAD="$(echo "${(l:MAX_LEN[6]:)REPOPAD}" | sed 's/\S.*//')" + REPOBRANCH="$REPOPAD"$'\e['"$K_COLOR_BR"'m'"$REPOBRANCH"$'\e[0m' fi # -------------------------------------------------------------------------- @@ -485,36 +554,44 @@ k () { # But we don't want to quote '.'; so instead we escape the escape manually and use q- NAME="${${NAME##*/}//$'\e'/\\e}" # also propagate changes to SYMLINK_TARGET below - if [[ $IS_DIRECTORY == 1 ]]; then - if [[ $IS_WRITABLE_BY_OTHERS == 1 ]]; then - if [[ $HAS_STICKY_BIT == 1 ]]; then - NAME=$'\e['"$K_COLOR_TW"'m'"$NAME"$'\e[0m'; + if [[ -n "$LS_COLORS" ]] && ls --color -d . &>/dev/null; then + # We are using an ls that supports using colors from $LS_COLORS (probably GNU ls here) + #pushd "${base_dir}" &>/dev/null + NAME="$(ls --color=always -d "$NAME")" + #popd &>/dev/null + elif (( $IS_DIRECTORY == 1 )); then + if (( $IS_WRITABLE_BY_OTHERS == 1 )); then + if (( $HAS_STICKY_BIT == 1 )); then + NAME=$'\e['"$K_COLOR_TW"'m'"$NAME"$'\e[0m' fi - NAME=$'\e['"$K_COLOR_OW"'m'"$NAME"$'\e[0m'; + NAME=$'\e['"$K_COLOR_OW"'m'"$NAME"$'\e[0m' fi - NAME=$'\e['"$K_COLOR_DI"'m'"$NAME"$'\e[0m'; - elif [[ $IS_SYMLINK == 1 ]]; then NAME=$'\e['"$K_COLOR_LN"'m'"$NAME"$'\e[0m'; - elif [[ $IS_SOCKET == 1 ]]; then NAME=$'\e['"$K_COLOR_SO"'m'"$NAME"$'\e[0m'; - elif [[ $IS_PIPE == 1 ]]; then NAME=$'\e['"$K_COLOR_PI"'m'"$NAME"$'\e[0m'; - elif [[ $HAS_UID_BIT == 1 ]]; then NAME=$'\e['"$K_COLOR_SU"'m'"$NAME"$'\e[0m'; - elif [[ $HAS_GID_BIT == 1 ]]; then NAME=$'\e['"$K_COLOR_SG"'m'"$NAME"$'\e[0m'; - elif [[ $IS_EXECUTABLE == 1 ]]; then NAME=$'\e['"$K_COLOR_EX"'m'"$NAME"$'\e[0m'; - elif [[ $IS_BLOCK_SPECIAL == 1 ]]; then NAME=$'\e['"$K_COLOR_BD"'m'"$NAME"$'\e[0m'; - elif [[ $IS_CHARACTER_SPECIAL == 1 ]]; then NAME=$'\e['"$K_COLOR_CD"'m'"$NAME"$'\e[0m'; + NAME=$'\e['"$K_COLOR_DI"'m'"$NAME"$'\e[0m' + elif (( $IS_SYMLINK == 1 )); then NAME=$'\e['"$K_COLOR_LN"'m'"$NAME"$'\e[0m' + elif (( $IS_SOCKET == 1 )); then NAME=$'\e['"$K_COLOR_SO"'m'"$NAME"$'\e[0m' + elif (( $IS_PIPE == 1 )); then NAME=$'\e['"$K_COLOR_PI"'m'"$NAME"$'\e[0m' + elif (( $HAS_UID_BIT == 1 )); then NAME=$'\e['"$K_COLOR_SU"'m'"$NAME"$'\e[0m' + elif (( $HAS_GID_BIT == 1 )); then NAME=$'\e['"$K_COLOR_SG"'m'"$NAME"$'\e[0m' + elif (( $IS_EXECUTABLE == 1 )); then NAME=$'\e['"$K_COLOR_EX"'m'"$NAME"$'\e[0m' + elif (( $IS_BLOCK_SPECIAL == 1 )); then NAME=$'\e['"$K_COLOR_BD"'m'"$NAME"$'\e[0m' + elif (( $IS_CHARACTER_SPECIAL == 1 )); then NAME=$'\e['"$K_COLOR_CD"'m'"$NAME"$'\e[0m' fi # -------------------------------------------------------------------------- # Format symlink target # -------------------------------------------------------------------------- - if [[ $SYMLINK_TARGET != "" ]]; then SYMLINK_TARGET="-> ${SYMLINK_TARGET//$'\e'/\\e}"; fi + if [[ -n $SYMLINK_TARGET ]]; then SYMLINK_TARGET="-> ${SYMLINK_TARGET//$'\e'/\\e}"; fi # -------------------------------------------------------------------------- # Display final result # -------------------------------------------------------------------------- - print -r -- "$PERMISSIONS_OUTPUT $HARDLINKCOUNT $OWNER $GROUP $FILESIZE_OUT $DATE_OUTPUT $REPOMARKER $NAME $SYMLINK_TARGET" + print -r -- "$PERMISSIONS_OUTPUT $HARDLINKCOUNT $OWNER $GROUP $FILESIZE_OUT $DATE_OUTPUT $REPOMARKER $NAME$SYMLINK_TARGET$REPOBRANCH" - k=$((k+1)) # Bump loop index + (( k++ )) # Bump loop index done + if [[ ! -f $base_dir ]]; then + popd >/dev/null + fi done } @@ -546,4 +623,3 @@ _k_bsd_to_ansi() { } # http://upload.wikimedia.org/wikipedia/en/1/15/Xterm_256color_chart.svg -# vim: set ts=2 sw=2 ft=zsh et : |