diff --git a/man/paru.conf.5 b/man/paru.conf.5 index 60e8e311..34298953 100644 --- a/man/paru.conf.5 +++ b/man/paru.conf.5 @@ -25,8 +25,10 @@ your user's config and then defining options. Options belonging to the [options] section. .TP -.B BottomUp -Print search results from bottom to top. AUR results will be printed first. +.B BottomUp [= auto] +Print search results from bottom to top. AUR results will be printed first. If +set to auto, prints results from bottom to top if standard output is a tty, +otherwise top to bottom. .TP .B AurOnly diff --git a/src/config.rs b/src/config.rs index 8922babf..ec844ce1 100644 --- a/src/config.rs +++ b/src/config.rs @@ -269,11 +269,29 @@ impl ConfigEnum for raur::SearchBy { pub enum SortMode { BottomUp, TopDown, + Auto, +} + +impl SortMode { + //! Turns [SortMode::Auto] into one of the other variants. + pub fn resolve(&self) -> Self { + if matches!(self, SortMode::Auto) { + match isatty(stdout().as_raw_fd()) { + Ok(true) => SortMode::BottomUp, + _ => SortMode::TopDown, + } + } else { + *self + } + } } impl ConfigEnum for SortMode { - const VALUE_LOOKUP: ConfigEnumValues = - &[("bottomup", Self::BottomUp), ("topdown", Self::TopDown)]; + const VALUE_LOOKUP: ConfigEnumValues = &[ + ("bottomup", Self::BottomUp), + ("topdown", Self::TopDown), + ("auto", Self::Auto), + ]; } #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -950,7 +968,7 @@ impl Config { match key { "SkipReview" => self.skip_review = true, - "BottomUp" => self.sort_mode = SortMode::BottomUp, + "BottomUp" => self.sort_mode = SortMode::BottomUp.default_or(key, value)?, "AurOnly" => self.mode = Mode::Aur, "RepoOnly" => self.mode = Mode::Repo, "SudoLoop" => { @@ -1017,6 +1035,7 @@ impl Config { "AurUrl" => self.aur_url = value?.parse()?, "AurRpcUrl" => self.aur_rpc_url = Some(value?.parse()?), "BuildDir" | "CloneDir" => self.build_dir = PathBuf::from(value?), + "BottomUp" => self.sort_mode = ConfigEnum::from_str(key, value?.as_str())?, "Redownload" => self.redownload = ConfigEnum::from_str(key, value?.as_str())?, "Rebuild" => self.rebuild = ConfigEnum::from_str(key, value?.as_str())?, "RemoveMake" => self.remove_make = ConfigEnum::from_str(key, value?.as_str())?, diff --git a/src/download.rs b/src/download.rs index af347b45..e667c6b8 100644 --- a/src/download.rs +++ b/src/download.rs @@ -488,7 +488,7 @@ pub async fn show_comments(config: &mut Config) -> Result { let iter = titles.zip(comments).collect::>(); - if config.sort_mode == SortMode::TopDown { + if config.sort_mode.resolve() == SortMode::TopDown { for (title, comment) in iter.into_iter() { print_indent(c.bold, 0, 0, config.cols, " ", title.split_whitespace()); diff --git a/src/search.rs b/src/search.rs index f590160e..aec6180a 100644 --- a/src/search.rs +++ b/src/search.rs @@ -56,7 +56,7 @@ pub async fn search(config: &Config) -> Result { } }; - if config.sort_mode == SortMode::TopDown { + if config.sort_mode.resolve() == SortMode::TopDown { for pkg in &repo_pkgs { print_alpm_pkg(config, pkg, quiet); } @@ -434,7 +434,7 @@ pub async fn search_install(config: &mut Config) -> Result { all_pkgs.insert(0, pkg); } - if config.sort_mode == SortMode::TopDown { + if config.sort_mode.resolve() == SortMode::TopDown { for (n, pkg) in all_pkgs.iter().enumerate() { print_any_pkg(config, n, pad, pkg, &paths) } @@ -454,7 +454,7 @@ pub async fn search_install(config: &mut Config) -> Result { let menu = NumberMenu::new(&input); let mut pkgs = Vec::new(); - if config.sort_mode == SortMode::TopDown { + if config.sort_mode.resolve() == SortMode::TopDown { for (n, pkg) in all_pkgs.iter().enumerate() { if menu.contains(n + 1, "") { match pkg {