diff --git a/src/options.rs b/src/options.rs index 3551a892..b9828ec0 100644 --- a/src/options.rs +++ b/src/options.rs @@ -36,39 +36,45 @@ impl Options { #[allow(unused_results)] pub fn getopts(args: &[String]) -> Result<(Options, Vec<String>), Misfire> { let mut opts = getopts::Options::new(); + + opts.optflag("v", "version", "display version of exa"); + opts.optflag("?", "help", "show list of command-line options"); + + // Display options opts.optflag("1", "oneline", "display one entry per line"); + opts.optflag("G", "grid", "display entries in a grid view (default)"); + opts.optflag("l", "long", "display extended details and attributes"); + opts.optflag("R", "recurse", "recurse into directories"); + opts.optflag("T", "tree", "recurse into subdirectories in a tree view"); + opts.optflag("x", "across", "sort multi-column view entries across"); + + // Filtering and sorting options + opts.optflag("", "group-directories-first", "list directories before other files"); opts.optflag("a", "all", "show dot-files"); + opts.optflag("d", "list-dirs", "list directories as regular files"); + opts.optflag("r", "reverse", "reverse order of files"); + opts.optopt ("s", "sort", "field to sort by", "WORD"); + + // Long view options opts.optflag("b", "binary", "use binary prefixes in file sizes"); opts.optflag("B", "bytes", "list file sizes in bytes, without prefixes"); - opts.optflag("d", "list-dirs", "list directories as regular files"); opts.optflag("g", "group", "show group as well as user"); - opts.optflag("G", "grid", "display entries in a grid view (default)"); - opts.optflag("", "group-directories-first", "list directories before other files"); opts.optflag("h", "header", "show a header row at the top"); opts.optflag("H", "links", "show number of hard links"); opts.optflag("i", "inode", "show each file's inode number"); - opts.optflag("l", "long", "display extended details and attributes"); opts.optopt ("L", "level", "maximum depth of recursion", "DEPTH"); opts.optflag("m", "modified", "display timestamp of most recent modification"); - opts.optflag("r", "reverse", "reverse order of files"); - opts.optflag("R", "recurse", "recurse into directories"); - opts.optopt ("s", "sort", "field to sort by", "WORD"); opts.optflag("S", "blocks", "show number of file system blocks"); opts.optopt ("t", "time", "which timestamp to show for a file", "WORD"); - opts.optflag("T", "tree", "recurse into subdirectories in a tree view"); opts.optflag("u", "accessed", "display timestamp of last access for a file"); opts.optflag("U", "created", "display timestamp of creation for a file"); - opts.optflag("x", "across", "sort multi-column view entries across"); - - opts.optflag("", "version", "display version of exa"); - opts.optflag("?", "help", "show list of command-line options"); if cfg!(feature="git") { opts.optflag("", "git", "show git status"); } if xattr::ENABLED { - opts.optflag("@", "extended", "display extended attribute keys and sizes in long (-l) output"); + opts.optflag("@", "extended", "display extended attribute keys and sizes"); } let matches = match opts.parse(args) { @@ -77,7 +83,25 @@ impl Options { }; if matches.opt_present("help") { - return Err(Misfire::Help(opts.usage("Usage:\n exa [options] [files...]"))); + let mut help_string = "Usage:\n exa [options] [files...]\n".to_owned(); + + if !matches.opt_present("long") { + help_string.push_str(OPTIONS); + } + + help_string.push_str(LONG_OPTIONS); + + if cfg!(feature="git") { + help_string.push_str(GIT_HELP); + help_string.push('\n'); + } + + if xattr::ENABLED { + help_string.push_str(EXTENDED_HELP); + help_string.push('\n'); + } + + return Err(Misfire::Help(help_string)); } else if matches.opt_present("version") { return Err(Misfire::Version); @@ -569,6 +593,42 @@ impl fmt::Display for Misfire { } } +static OPTIONS: &'static str = r##" +DISPLAY OPTIONS + -1, --oneline display one entry per line + -G, --grid display entries in a grid view (default) + -l, --long display extended details and attributes + -R, --recurse recurse into directories + -T, --tree recurse into subdirectories in a tree view + -x, --across sort multi-column view entries across + +FILTERING AND SORTING OPTIONS + -a, --all show dot-files + -d, --list-dirs list directories as regular files + -r, --reverse reverse order of files + -s, --sort WORD field to sort by + --group-directories-first list directories before other files +"##; + +static LONG_OPTIONS: &'static str = r##" +LONG VIEW OPTIONS + -b, --binary use binary prefixes in file sizes + -B, --bytes list file sizes in bytes, without prefixes + -g, --group show group as well as user + -h, --header show a header row at the top + -H, --links show number of hard links + -i, --inode show each file's inode number + -L, --level DEPTH maximum depth of recursion + -m, --modified display timestamp of most recent modification + -S, --blocks show number of file system blocks + -t, --time WORD which timestamp to show for a file + -u, --accessed display timestamp of last access for a file + -U, --created display timestamp of creation for a file +"##; + +static GIT_HELP: &'static str = r##" -@, --extended display extended attribute keys and sizes"##; +static EXTENDED_HELP: &'static str = r##" --git show git status for files"##; + #[cfg(test)] mod test {