# completion settings for the ls command (POSIX; GNU coreutils 8.4)
# written by magicant
# vim: set ft=sh ts=8 sts=8 sw=8 noet:

case "$("$1" --version 2>/dev/null)" in
	*'GNU coreutils'*)
		typeset gnu=true
		complete -C "$1" -X
		# options may come after operands in GNU ls
		;;
	*)
		typeset gnu=
		# not GNU ls.
		# We explicitly define the "gnu" variable empty to override
		# the variable that is possibly already defined by the user.
esac

complete -C "$1" -f

complete -C "$1" -O 1 \
	-D "print files line by line"
# long options are completable only when supported by the command
complete -C "$1" -O A ${gnu:+-O --almost-all} \
	-D "print all files except . and .."
complete -C "$1" -O a ${gnu:+-O --all} \
	-D "print all files"
complete -C "$1" -O C \
	-D "arrange filenames vertically"
complete -C "$1" -O c \
	-D "print or sort by last status-changed time"
complete -C "$1" -O d ${gnu:+-O --directory} \
	-D "print directory itself, not its contents"
complete -C "$1" -O F ${gnu:+-O --classify} \
	-D "append symbols indicating file type"
complete -C "$1" -O f \
	-D "print all files without sorting"
complete -C "$1" -O g \
	-D "like -l but don't print owner"
complete -C "$1" -O H ${gnu:+-O --dereference-command-line} \
	-D "follow symbolic links in operands"
complete -C "$1" -O i ${gnu:+-O --inode} \
	-D "print file serial number (inode)"
complete -C "$1" -O k \
	-D "print file size in kilobytes"
complete -C "$1" -O L ${gnu:+-O --dereference} \
	-D "follow all symbolic links"
complete -C "$1" -O l \
	-D "print in long format"
complete -C "$1" -O m \
	-D "print in stream output format"
complete -C "$1" -O n ${gnu:+-O --numeric-uid-gid} \
	-D "like -l but print owner in numbers"
complete -C "$1" -O o \
	-D "like -l but don't print group"
complete -C "$1" -O p \
	-D "append / indicating directory"
complete -C "$1" -O q ${gnu:+-O --hide-control-chars} \
	-D "print unprintable characters as ?"
complete -C "$1" -O R ${gnu:+-O --recursive} \
	-D "print subdirectories recursively"
complete -C "$1" -O r ${gnu:+-O --reverse} \
	-D "sort in reverse order"
complete -C "$1" -O S \
	-D "sort by file size"
complete -C "$1" -O s ${gnu:+-O --size} \
	-D "print block size used by file"
complete -C "$1" -O t \
	-D "sort by last-modified time"
complete -C "$1" -O u \
	-D "print or sort by last-accessed time"
complete -C "$1" -O x \
	-D "arrange filenames horizontally"
if [ "$gnu" ]; then
	complete -C "$1" -O --author \
		-D "print file authors (with -l)"
	complete -C "$1" -O b -O --escape \
		-D "escape special characters like C string"
	complete -C "$1" -O --block-size \
		-D "specify block size"
	complete -C "$1" -O --block-size K \
		-D "1024 bytes"
	complete -C "$1" -O --block-size KB \
		-D "1000 bytes"
	complete -C "$1" -O --block-size M \
		-D "1024^2 bytes"
	complete -C "$1" -O --block-size MB \
		-D "1000^2 bytes"
	complete -C "$1" -O --block-size G \
		-D "1024^3 bytes"
	complete -C "$1" -O --block-size GB \
		-D "1000^3 bytes"
	complete -C "$1" -O --block-size T \
		-D "1024^4 bytes"
	complete -C "$1" -O --block-size TB \
		-D "1000^4 bytes"
	complete -C "$1" -O --block-size P \
		-D "1024^5 bytes"
	complete -C "$1" -O --block-size PB \
		-D "1000^5 bytes"
	complete -C "$1" -O --block-size E \
		-D "1024^6 bytes"
	complete -C "$1" -O --block-size EB \
		-D "1000^6 bytes"
	complete -C "$1" -O --block-size Z \
		-D "1024^7 bytes"
	complete -C "$1" -O --block-size ZB \
		-D "1000^7 bytes"
	complete -C "$1" -O --block-size Y \
		-D "1024^8 bytes"
	complete -C "$1" -O --block-size YB \
		-D "1000^8 bytes"
	complete -C "$1" -O B -O --ignore-backups \
		-D "don't print filenames ending with ~"
	complete -C "$1" -O --color \
		-D "print filenames in color"
	complete -C "$1" -O --color yes always force \
		-D "always print in color"
	complete -C "$1" -O --color auto tty if-tty \
		-D "print in color if output is terminal"
	complete -C "$1" -O --color no never none \
		-D "don't print in color"
	complete -C "$1" -O D -O --dired \
		-D "print in emacs dired format"
	complete -C "$1" -O --file-type \
		-D "like -F but don't append *"
	complete -C "$1" -O --format \
		-D "specify output format"
	complete -C "$1" -O --format single-column \
		-D "-1: print files line by line"
	complete -C "$1" -O --format vertical \
		-D "-C: arrange filenames vertically"
	complete -C "$1" -O --format long verbose \
		-D "-l: print permission, owner, file size, etc."
	complete -C "$1" -O --format commas \
		-D "-m: separate filenames by commas"
	complete -C "$1" -O --format horizontal across \
		-D "-x: arrange filenames horizontally"
	complete -C "$1" -O --format context \
		-D "print security context of files"
	complete -C "$1" -O --full-time \
		-D "like -l --time-style=full-iso"
	complete -C "$1" -O --group-directories-first \
		-D "print directories before other files"
	complete -C "$1" -O G -O --no-group \
		-D "don't print group when used with -l"
	complete -C "$1" -O h -O --human-readable \
		-D "print file size using K, M, etc. for 1024^n"
	complete -C "$1" -O --si \
		-D "print file size using k, M, etc. for 1000^n"
	complete -C "$1" -O --dereference-command-line-symlink-to-dir \
		-D "follow symbolic links to directory in operands"
	complete -C "$1" -O --hide -f \
		-D "specify pattern to exclude from listing"
	complete -C "$1" -O --indicator-style \
		-D "append symbols indicating file type"
	complete -C "$1" -O --indicator-style none \
		-D "don't append symbols indicating file type"
	complete -C "$1" -O --indicator-style slash \
		-D "-p: append / to directories"
	complete -C "$1" -O --indicator-style file-type \
		-D "--file-type: enable all indicators but *"
	complete -C "$1" -O --indicator-style classify \
		-D "-F: enable all indicators"
	complete -C "$1" -O I -O --ignore -f \
		-D "specify pattern to exclude from listing"
	complete -C "$1" -O N -O --literal \
		-D "don't escape unprintable characters"
	complete -C "$1" -O --show-control-chars \
		-D "don't escape unprintable characters"
	complete -C "$1" -O Q -O --quote-name \
		-D "print filenames in double-quotes"
	complete -C "$1" -O --quoting-style \
		-D "specify how to quote filenames"
	complete -C "$1" -O --quoting-style literal \
		-D "quote or escape nothing"
	complete -C "$1" -O --quoting-style shell \
		-D "quote in format suitable for shell input"
	complete -C "$1" -O --quoting-style shell-always \
		-D "quote all filenames in format suitable for shell input"
	complete -C "$1" -O --quoting-style c \
		-D "-Q: quote and escape like C string"
	complete -C "$1" -O --quoting-style escape \
		-D "-b: escape like C string"
	complete -C "$1" -O --quoting-style locale \
		-D "locale-dependent quoting and escaping"
	complete -C "$1" -O --quoting-style clocale \
		-D "locale-dependent quoting and escaping"
	complete -C "$1" -O --sort \
		-D "specify sort key"
	complete -C "$1" -O --sort none \
		-D "-U: don't sort"
	complete -C "$1" -O --sort extension \
		-D "-X: sort by filename extension"
	complete -C "$1" -O --sort size \
		-D "-S: sort by file size"
	complete -C "$1" -O --sort time \
		-D "-t: sort by last-modified time"
	complete -C "$1" -O --sort version \
		-D "-v: sort by filename regarding as version number"
	complete -C "$1" -O --time \
		-D "specify which time to print and sort by"
	complete -C "$1" -O --time atime access use \
		-D "-u: last-accessed time"
	complete -C "$1" -O --time ctime status \
		-D "-c: last-status-changed time"
	complete -C "$1" -O --time-style \
		-D "specify format to print time in"
	complete -C "$1" -O --time-style full-iso \
		-D "e.g. 2000-01-01 01:23:45.678901234 +0900"
	complete -C "$1" -O --time-style long-iso \
		-D "e.g. 2010-06-29 00:37"
	complete -C "$1" -O --time-style iso \
		-D "e.g. 01-23 01:23 or 2000-01-23"
	complete -C "$1" -O --time-style locale posix-locale \
		-D "locale-dependent time style"
	complete -C "$1" -O --time-style posix-full-iso \
		-D "like full-iso, but only when not in POSIX locale"
	complete -C "$1" -O --time-style posix-long-iso \
		-D "like long-iso, but only when not in POSIX locale"
	complete -C "$1" -O --time-style posix-iso \
		-D "like iso, but only when not in POSIX locale"
	complete -C "$1" -O T -O --tabsize \
		-D "specify how many spaces a tab stands for"
	complete -C "$1" -O T -O --tabsize 2 4 8
	complete -C "$1" -O U \
		-D "don't sort"
	complete -C "$1" -O v \
		-D "sort by filename regarding as version number"
	complete -C "$1" -O w -O --width \
		-D "specify screen width"
	complete -C "$1" -O w -O --width 80 132
	complete -C "$1" -O X \
		-D "sort by filename extension"
	complete -C "$1" -O --lcontext \
		-D "print in long format with security context"
	complete -C "$1" -O Z -O --context \
		-D "print in simplified long format with security context"
	complete -C "$1" -O --scontext \
		-D "print security context of files"
	complete -C "$1" -O --help \
		-D "print help"
	complete -C "$1" -O --version \
		-D "print version information"
fi
