mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-07-28 11:37:44 +00:00
commit
5e2dd9d0bc
1 changed files with 18 additions and 15 deletions
|
@ -7,9 +7,6 @@
|
||||||
|
|
||||||
// spell-checker:ignore (methods) isnt
|
// spell-checker:ignore (methods) isnt
|
||||||
|
|
||||||
#[macro_use]
|
|
||||||
extern crate uucore;
|
|
||||||
|
|
||||||
use std::{
|
use std::{
|
||||||
fs::File,
|
fs::File,
|
||||||
io::{stdin, stdout, BufReader, Read, Stdout, Write},
|
io::{stdin, stdout, BufReader, Read, Stdout, Write},
|
||||||
|
@ -31,6 +28,7 @@ use crossterm::{
|
||||||
use unicode_segmentation::UnicodeSegmentation;
|
use unicode_segmentation::UnicodeSegmentation;
|
||||||
use unicode_width::UnicodeWidthStr;
|
use unicode_width::UnicodeWidthStr;
|
||||||
use uucore::display::Quotable;
|
use uucore::display::Quotable;
|
||||||
|
use uucore::error::{UResult, USimpleError, UUsageError};
|
||||||
|
|
||||||
const BELL: &str = "\x07";
|
const BELL: &str = "\x07";
|
||||||
|
|
||||||
|
@ -51,7 +49,8 @@ pub mod options {
|
||||||
|
|
||||||
const MULTI_FILE_TOP_PROMPT: &str = "::::::::::::::\n{}\n::::::::::::::\n";
|
const MULTI_FILE_TOP_PROMPT: &str = "::::::::::::::\n{}\n::::::::::::::\n";
|
||||||
|
|
||||||
pub fn uumain(args: impl uucore::Args) -> i32 {
|
#[uucore_procs::gen_uumain]
|
||||||
|
pub fn uumain(args: impl uucore::Args) -> UResult<()> {
|
||||||
let matches = uu_app().get_matches_from(args);
|
let matches = uu_app().get_matches_from(args);
|
||||||
|
|
||||||
let mut buff = String::new();
|
let mut buff = String::new();
|
||||||
|
@ -65,32 +64,36 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
|
||||||
let file = Path::new(file);
|
let file = Path::new(file);
|
||||||
if file.is_dir() {
|
if file.is_dir() {
|
||||||
terminal::disable_raw_mode().unwrap();
|
terminal::disable_raw_mode().unwrap();
|
||||||
show_usage_error!("{} is a directory.", file.quote());
|
return Err(UUsageError::new(
|
||||||
return 1;
|
1,
|
||||||
|
format!("{} is a directory.", file.quote()),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
if !file.exists() {
|
if !file.exists() {
|
||||||
terminal::disable_raw_mode().unwrap();
|
terminal::disable_raw_mode().unwrap();
|
||||||
show_error!("cannot open {}: No such file or directory", file.quote());
|
return Err(USimpleError::new(
|
||||||
return 1;
|
1,
|
||||||
|
format!("cannot open {}: No such file or directory", file.quote()),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
if length > 1 {
|
if length > 1 {
|
||||||
buff.push_str(&MULTI_FILE_TOP_PROMPT.replace("{}", file.to_str().unwrap()));
|
buff.push_str(&MULTI_FILE_TOP_PROMPT.replace("{}", file.to_str().unwrap()));
|
||||||
}
|
}
|
||||||
let mut reader = BufReader::new(File::open(file).unwrap());
|
let mut reader = BufReader::new(File::open(file).unwrap());
|
||||||
reader.read_to_string(&mut buff).unwrap();
|
reader.read_to_string(&mut buff).unwrap();
|
||||||
more(&buff, &mut stdout, next_file.copied(), silent);
|
more(&buff, &mut stdout, next_file.copied(), silent)?;
|
||||||
buff.clear();
|
buff.clear();
|
||||||
}
|
}
|
||||||
reset_term(&mut stdout);
|
reset_term(&mut stdout);
|
||||||
} else if atty::isnt(atty::Stream::Stdin) {
|
} else if atty::isnt(atty::Stream::Stdin) {
|
||||||
stdin().read_to_string(&mut buff).unwrap();
|
stdin().read_to_string(&mut buff).unwrap();
|
||||||
let mut stdout = setup_term();
|
let mut stdout = setup_term();
|
||||||
more(&buff, &mut stdout, None, silent);
|
more(&buff, &mut stdout, None, silent)?;
|
||||||
reset_term(&mut stdout);
|
reset_term(&mut stdout);
|
||||||
} else {
|
} else {
|
||||||
show_usage_error!("bad usage");
|
return Err(UUsageError::new(1, "bad usage"));
|
||||||
}
|
}
|
||||||
0
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn uu_app() -> App<'static, 'static> {
|
pub fn uu_app() -> App<'static, 'static> {
|
||||||
|
@ -210,14 +213,14 @@ fn reset_term(stdout: &mut std::io::Stdout) {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn reset_term(_: &mut usize) {}
|
fn reset_term(_: &mut usize) {}
|
||||||
|
|
||||||
fn more(buff: &str, stdout: &mut Stdout, next_file: Option<&str>, silent: bool) {
|
fn more(buff: &str, stdout: &mut Stdout, next_file: Option<&str>, silent: bool) -> UResult<()> {
|
||||||
let (cols, rows) = terminal::size().unwrap();
|
let (cols, rows) = terminal::size().unwrap();
|
||||||
let lines = break_buff(buff, usize::from(cols));
|
let lines = break_buff(buff, usize::from(cols));
|
||||||
|
|
||||||
let mut pager = Pager::new(rows, lines, next_file, silent);
|
let mut pager = Pager::new(rows, lines, next_file, silent);
|
||||||
pager.draw(stdout, None);
|
pager.draw(stdout, None);
|
||||||
if pager.should_close() {
|
if pager.should_close() {
|
||||||
return;
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
|
@ -244,7 +247,7 @@ fn more(buff: &str, stdout: &mut Stdout, next_file: Option<&str>, silent: bool)
|
||||||
modifiers: KeyModifiers::NONE,
|
modifiers: KeyModifiers::NONE,
|
||||||
}) => {
|
}) => {
|
||||||
if pager.should_close() {
|
if pager.should_close() {
|
||||||
return;
|
return Ok(());
|
||||||
} else {
|
} else {
|
||||||
pager.page_down();
|
pager.page_down();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue