diff --git a/doc/lsd.md b/doc/lsd.md index 78a120465..053e33a8b 100644 --- a/doc/lsd.md +++ b/doc/lsd.md @@ -74,6 +74,9 @@ lsd is a ls command with a lot of pretty colours and some other stuff to enrich `-r`, `--reverse` : Reverse the order of the sort +`--namesort` +: Sort by name + `-S`, `--sizesort` : Sort by size @@ -129,7 +132,7 @@ lsd is a ls command with a lot of pretty colours and some other stuff to enrich : How to display size [default: default] [possible values: default, short, bytes] `--sort ...` -: Sort by WORD instead of name [possible values: size, time, version, extension, git] +: Sort by WORD instead of the configured default (name, unless configured otherwise) [possible values: name, size, time, version, extension, git] `-U`, `--no-sort` : Do not sort. List entries in directory order diff --git a/src/app.rs b/src/app.rs index fa329592e..839125aaf 100644 --- a/src/app.rs +++ b/src/app.rs @@ -84,6 +84,10 @@ pub struct Cli { #[arg(long, value_parser = validate_date_argument)] pub date: Option, + /// Sort by name + #[arg(long)] + pub namesort: bool, + /// Sort by time modified #[arg(short = 't', long)] pub timesort: bool, @@ -104,17 +108,17 @@ pub struct Cli { #[arg(short = 'v', long)] pub versionsort: bool, - /// Sort by TYPE instead of name + /// Sort by TYPE instead of the configured default (name, unless configured otherwise) #[arg( long, value_name = "TYPE", - value_parser = ["size", "time", "version", "extension", "git", "none"], - overrides_with_all = ["timesort", "sizesort", "extensionsort", "versionsort", "gitsort", "no_sort"] + value_parser = ["name", "size", "time", "version", "extension", "git", "none"], + overrides_with_all = ["namesort", "timesort", "sizesort", "extensionsort", "versionsort", "gitsort", "no_sort"] )] pub sort: Option, /// Do not sort. List entries in directory order - #[arg(short = 'U', long, overrides_with_all = ["timesort", "sizesort", "extensionsort", "versionsort", "gitsort", "sort"])] + #[arg(short = 'U', long, overrides_with_all = ["namesort", "timesort", "sizesort", "extensionsort", "versionsort", "gitsort", "sort"])] pub no_sort: bool, /// Reverse the order of the sort diff --git a/src/flags/sorting.rs b/src/flags/sorting.rs index 3e895933d..f9e80248e 100644 --- a/src/flags/sorting.rs +++ b/src/flags/sorting.rs @@ -55,7 +55,9 @@ impl Configurable for SortColumn { fn from_cli(cli: &Cli) -> Option { let sort = cli.sort.as_deref(); - if cli.timesort || sort == Some("time") { + if cli.namesort || sort == Some("name") { + Some(Self::Name) + } else if cli.timesort || sort == Some("time") { Some(Self::Time) } else if cli.sizesort || sort == Some("size") { Some(Self::Size) @@ -229,6 +231,13 @@ mod test_sort_column { assert_eq!(Some(SortColumn::Version), SortColumn::from_cli(&cli)); } + #[test] + fn test_from_cli_name() { + let argv = ["lsd", "--namesort"]; + let cli = Cli::try_parse_from(argv).unwrap(); + assert_eq!(Some(SortColumn::Name), SortColumn::from_cli(&cli)); + } + #[test] fn test_from_cli_no_sort() { let argv = ["lsd", "--no-sort"]; @@ -238,6 +247,10 @@ mod test_sort_column { #[test] fn test_from_cli_sort() { + let argv = ["lsd", "--sort", "name"]; + let cli = Cli::try_parse_from(argv).unwrap(); + assert_eq!(Some(SortColumn::Name), SortColumn::from_cli(&cli)); + let argv = ["lsd", "--sort", "time"]; let cli = Cli::try_parse_from(argv).unwrap(); assert_eq!(Some(SortColumn::Time), SortColumn::from_cli(&cli));