zsh: Rename autoloadable function ls
Rename to avoid confusion and make the config more transparent.
This commit is contained in:
72
.config/zsh/autoload/ls-show-hidden
Executable file
72
.config/zsh/autoload/ls-show-hidden
Executable file
@@ -0,0 +1,72 @@
|
||||
# vim: ft=zsh
|
||||
|
||||
## Author: druckdev
|
||||
## Created: 2019-10-21
|
||||
##
|
||||
## An ls wrapper that adds the -A flag (show hidden files except . and ..) when
|
||||
## there are no visible files or the directory matches the pattern (POSIX ERE)
|
||||
## defined in $LS_SHOW_ALL_DIRS.
|
||||
|
||||
# Do not include hidden files when globbing and expand to an empty string
|
||||
# instead of giving an error when no files match.
|
||||
builtin emulate -L zsh -o no_glob_dots -o null_glob
|
||||
|
||||
# Overwrite here or before calling to change the directories in which hidden
|
||||
# files should always be listed.
|
||||
builtin local LS_SHOW_ALL_DIRS=${LS_SHOW_ALL_DIRS:-"dotfiles|\.config"}
|
||||
|
||||
builtin local -a dirs files
|
||||
# Pop files and folders from arguments and put them in the corresponding array.
|
||||
# All other arguments are kept.
|
||||
for arg in "$@"; do
|
||||
shift
|
||||
if [[ -d "$arg" ]]; then
|
||||
dirs+="$arg"
|
||||
elif [[ -e "$arg" ]]; then
|
||||
files+="$arg"
|
||||
else
|
||||
set -- "$@" "$arg"
|
||||
fi
|
||||
done
|
||||
|
||||
# Print working directory when only flags were given as arguments.
|
||||
if ! (( ${#dirs} + ${#files} )); then
|
||||
dirs+="$PWD"
|
||||
fi
|
||||
|
||||
# Do not separate files and directories if -d flag was specified.
|
||||
while getopts d flag 2>/dev/null; do
|
||||
if [[ "$flag" = "d" ]]; then
|
||||
command ls "$@" -- "${files[@]}" "${dirs[@]}"
|
||||
return
|
||||
fi
|
||||
done
|
||||
|
||||
builtin local separator=""
|
||||
|
||||
# Print files.
|
||||
if (( ${#files} )); then
|
||||
command ls "$@" -- "${files[@]}"
|
||||
# Print a newline between files and folder segment.
|
||||
separator="\n"
|
||||
fi
|
||||
|
||||
# Print directories.
|
||||
builtin local all_flag
|
||||
builtin local -a content
|
||||
for dir in ${(@f)dirs}; do
|
||||
content=( "$dir"/* )
|
||||
# If the directory contains no visible files or it matches a pattern, then
|
||||
# show hidden files when listing
|
||||
if (( ! ${#content} )) || [[ "${dir:A}" =~ "${LS_SHOW_ALL_DIRS:-^$}" ]]; then
|
||||
all_flag="-A"
|
||||
else
|
||||
all_flag=
|
||||
fi
|
||||
# If there are multiple items to list, print a newline (if ls was already
|
||||
# executed) followed by the dir-name.
|
||||
! (( ${#dirs} + ${#files} - 1 )) || echo "$separator$dir:"
|
||||
# Print directory. $all_flag has to be unquoted else ls will fail.
|
||||
command ls "$@" $all_flag -- "$dir"
|
||||
separator="\n"
|
||||
done
|
||||
Reference in New Issue
Block a user