Add pager for longer output

i18n
Michal S 2 years ago committed by Michal
parent 63de67214d
commit b4dbbc6477

136
Cargo.lock generated

@ -16,7 +16,7 @@ dependencies = [
"color-eyre", "color-eyre",
"colored", "colored",
"console", "console",
"crossterm", "crossterm 0.25.0",
"dialoguer", "dialoguer",
"directories", "directories",
"futures", "futures",
@ -25,12 +25,13 @@ dependencies = [
"lazy-regex", "lazy-regex",
"lazy_static", "lazy_static",
"libc", "libc",
"minus",
"native-tls", "native-tls",
"pacmanconf", "pacmanconf",
"parking_lot", "parking_lot 0.12.1",
"regex", "regex",
"serde", "serde",
"textwrap", "textwrap 0.15.0",
"tokio", "tokio",
"toml", "toml",
"tracing", "tracing",
@ -236,7 +237,7 @@ dependencies = [
"strsim", "strsim",
"termcolor", "termcolor",
"terminal_size", "terminal_size",
"textwrap", "textwrap 0.15.0",
] ]
[[package]] [[package]]
@ -339,6 +340,42 @@ version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc"
[[package]]
name = "crossbeam-channel"
version = "0.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521"
dependencies = [
"cfg-if",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-utils"
version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc"
dependencies = [
"cfg-if",
"once_cell",
]
[[package]]
name = "crossterm"
version = "0.22.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c85525306c4291d1b73ce93c8acf9c339f9b213aef6c1d85c3830cbf1c16325c"
dependencies = [
"bitflags",
"crossterm_winapi",
"libc",
"mio 0.7.14",
"parking_lot 0.11.2",
"signal-hook",
"signal-hook-mio",
"winapi",
]
[[package]] [[package]]
name = "crossterm" name = "crossterm"
version = "0.25.0" version = "0.25.0"
@ -348,8 +385,8 @@ dependencies = [
"bitflags", "bitflags",
"crossterm_winapi", "crossterm_winapi",
"libc", "libc",
"mio", "mio 0.8.4",
"parking_lot", "parking_lot 0.12.1",
"signal-hook", "signal-hook",
"signal-hook-mio", "signal-hook-mio",
"winapi", "winapi",
@ -866,6 +903,34 @@ dependencies = [
"adler", "adler",
] ]
[[package]]
name = "minus"
version = "5.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4bcbd621a681aa2f5b0e87ab547159ec695d1122fc24a297e4aac307ac74609f"
dependencies = [
"crossbeam-channel",
"crossbeam-utils",
"crossterm 0.22.1",
"once_cell",
"regex",
"textwrap 0.13.4",
"thiserror",
]
[[package]]
name = "mio"
version = "0.7.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc"
dependencies = [
"libc",
"log",
"miow",
"ntapi",
"winapi",
]
[[package]] [[package]]
name = "mio" name = "mio"
version = "0.8.4" version = "0.8.4"
@ -878,6 +943,15 @@ dependencies = [
"windows-sys", "windows-sys",
] ]
[[package]]
name = "miow"
version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21"
dependencies = [
"winapi",
]
[[package]] [[package]]
name = "native-tls" name = "native-tls"
version = "0.2.10" version = "0.2.10"
@ -896,6 +970,15 @@ dependencies = [
"tempfile", "tempfile",
] ]
[[package]]
name = "ntapi"
version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f"
dependencies = [
"winapi",
]
[[package]] [[package]]
name = "num-integer" name = "num-integer"
version = "0.1.45" version = "0.1.45"
@ -1012,6 +1095,17 @@ dependencies = [
"cini", "cini",
] ]
[[package]]
name = "parking_lot"
version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99"
dependencies = [
"instant",
"lock_api",
"parking_lot_core 0.8.5",
]
[[package]] [[package]]
name = "parking_lot" name = "parking_lot"
version = "0.12.1" version = "0.12.1"
@ -1019,7 +1113,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
dependencies = [ dependencies = [
"lock_api", "lock_api",
"parking_lot_core", "parking_lot_core 0.9.3",
]
[[package]]
name = "parking_lot_core"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216"
dependencies = [
"cfg-if",
"instant",
"libc",
"redox_syscall",
"smallvec",
"winapi",
] ]
[[package]] [[package]]
@ -1326,7 +1434,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af" checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af"
dependencies = [ dependencies = [
"libc", "libc",
"mio", "mio 0.7.14",
"mio 0.8.4",
"signal-hook", "signal-hook",
] ]
@ -1420,6 +1529,15 @@ dependencies = [
"winapi", "winapi",
] ]
[[package]]
name = "textwrap"
version = "0.13.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd05616119e612a8041ef58f2b578906cc2531a6069047ae092cfb86a325d835"
dependencies = [
"unicode-width",
]
[[package]] [[package]]
name = "textwrap" name = "textwrap"
version = "0.15.0" version = "0.15.0"
@ -1508,7 +1626,7 @@ dependencies = [
"bytes", "bytes",
"libc", "libc",
"memchr", "memchr",
"mio", "mio 0.8.4",
"num_cpus", "num_cpus",
"once_cell", "once_cell",
"pin-project-lite", "pin-project-lite",

@ -23,6 +23,7 @@ codegen-units = 1
opt-level = 0 opt-level = 0
[dependencies] [dependencies]
minus = { version = "5.0.5", features = ["search", "static_output"] }
alpm = "2.2.1" alpm = "2.2.1"
alpm-utils = "2.0.0" alpm-utils = "2.0.0"
pacmanconf = "2.0.0" pacmanconf = "2.0.0"

@ -1,10 +1,12 @@
pub mod macros; pub mod macros;
mod multi_select; mod multi_select;
mod paging;
mod prompt; mod prompt;
mod select; mod select;
mod theme; mod theme;
pub use multi_select::AmeMultiSelect; pub use multi_select::AmeMultiSelect;
pub use paging::page_string;
pub use prompt::AmePrompt; pub use prompt::AmePrompt;
pub use select::AmeFuzzySelect; pub use select::AmeFuzzySelect;

@ -0,0 +1,18 @@
use std::env;
use std::fmt::Write;
use crate::internal::error::AppError;
use crate::internal::error::AppResult;
use crate::with_suspended_output;
use minus::Pager;
pub fn page_string<S: ToString>(content: S) -> AppResult<()> {
let mut pager = Pager::new();
pager.set_prompt(
env::args().collect::<Vec<String>>().join(" ")
+ " | Q: quit | /: Search | n: next result | p: previous result",
)?;
writeln!(pager, "{}", content.to_string())?;
with_suspended_output!({ minus::page_all(pager).map_err(AppError::from) })
}

@ -19,6 +19,8 @@ pub enum AppError {
UserCancellation, UserCancellation,
MissingDependencies(Vec<String>), MissingDependencies(Vec<String>),
MakePkg(String), MakePkg(String),
MinusError(minus::MinusError),
FmtError(std::fmt::Error),
} }
impl Display for AppError { impl Display for AppError {
@ -35,6 +37,8 @@ impl Display for AppError {
write!(f, "Missing dependencies {}", deps.join(", ")) write!(f, "Missing dependencies {}", deps.join(", "))
} }
AppError::MakePkg(msg) => write!(f, "Failed to ru makepkg {msg}"), AppError::MakePkg(msg) => write!(f, "Failed to ru makepkg {msg}"),
AppError::MinusError(e) => Display::fmt(e, f),
AppError::FmtError(e) => Display::fmt(e, f),
} }
} }
} }
@ -65,6 +69,18 @@ impl From<&str> for AppError {
} }
} }
impl From<minus::MinusError> for AppError {
fn from(e: minus::MinusError) -> Self {
Self::MinusError(e)
}
}
impl From<std::fmt::Error> for AppError {
fn from(e: std::fmt::Error) -> Self {
Self::FmtError(e)
}
}
pub trait SilentUnwrap<T> { pub trait SilentUnwrap<T> {
fn silent_unwrap(self, error_code: AppExitCode) -> T; fn silent_unwrap(self, error_code: AppExitCode) -> T;
} }

@ -1,10 +1,12 @@
use args::{Args, GenCompArgs, InfoArgs}; use args::{Args, GenCompArgs, InfoArgs};
use builder::pacman::{PacmanColor, PacmanQueryBuilder}; use builder::pacman::{PacmanColor, PacmanQueryBuilder};
use clap::Parser; use clap::Parser;
use internal::commands::ShellCommand; use internal::commands::ShellCommand;
use internal::error::SilentUnwrap; use internal::error::SilentUnwrap;
use crate::args::{InstallArgs, Operation, QueryArgs, RemoveArgs, SearchArgs}; use crate::args::{InstallArgs, Operation, QueryArgs, RemoveArgs, SearchArgs};
use crate::interact::page_string;
use crate::internal::detect; use crate::internal::detect;
use crate::internal::exit_code::AppExitCode; use crate::internal::exit_code::AppExitCode;
use crate::internal::{sort, start_sudoloop, structs::Options}; use crate::internal::{sort, start_sudoloop, structs::Options};
@ -133,7 +135,10 @@ async fn cmd_search(args: SearchArgs, options: Options) {
} else { } else {
tracing::info!("Results:"); tracing::info!("Results:");
let list: Vec<String> = results.iter().map(|x| x.to_print_string()).collect(); let list: Vec<String> = results.iter().map(|x| x.to_print_string()).collect();
get_logger().print_list(list, "\n", 0); get_logger().print_list(&list, "\n", 0);
if list.join("\n").lines().count() > crossterm::terminal::size().unwrap().1 as usize {
page_string(&list.join("\n")).silent_unwrap(AppExitCode::Other);
}
} }
} }

Loading…
Cancel
Save