aboutsummaryrefslogtreecommitdiff
path: root/base/zsh/k.zsh
diff options
context:
space:
mode:
Diffstat (limited to 'base/zsh/k.zsh')
-rw-r--r--base/zsh/k.zsh396
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 :