mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-08-01 05:27:45 +00:00
more: simplify and fix logic for multiple files
This commit is contained in:
parent
1c2540a613
commit
101e55702c
1 changed files with 32 additions and 48 deletions
|
@ -136,7 +136,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
|
|||
if let Some(filenames) = matches.values_of(options::FILES) {
|
||||
let mut stdout = setup_term();
|
||||
let length = filenames.len();
|
||||
for (idx, fname) in filenames.clone().enumerate() {
|
||||
for (idx, fname) in filenames.enumerate() {
|
||||
let fname = Path::new(fname);
|
||||
if fname.is_dir() {
|
||||
terminal::disable_raw_mode().unwrap();
|
||||
|
@ -145,20 +145,19 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
|
|||
}
|
||||
if !fname.exists() {
|
||||
terminal::disable_raw_mode().unwrap();
|
||||
eprintln!(
|
||||
"{}: cannot open {}: No such file or directory",
|
||||
executable!(),
|
||||
show_error!(
|
||||
"cannot open {}: No such file or directory",
|
||||
fname.display()
|
||||
);
|
||||
return 1;
|
||||
}
|
||||
if filenames.len() > 1 {
|
||||
if length > 1 {
|
||||
buff.push_str(&MULTI_FILE_TOP_PROMPT.replace("{}", fname.to_str().unwrap()));
|
||||
}
|
||||
let mut reader = BufReader::new(File::open(fname).unwrap());
|
||||
reader.read_to_string(&mut buff).unwrap();
|
||||
let last = idx + 1 == length;
|
||||
more(&buff, &mut stdout, last);
|
||||
let is_last = idx + 1 == length;
|
||||
more(&buff, &mut stdout, is_last);
|
||||
buff.clear();
|
||||
}
|
||||
reset_term(&mut stdout);
|
||||
|
@ -205,17 +204,9 @@ fn more(buff: &str, mut stdout: &mut Stdout, is_last: bool) {
|
|||
let lines = break_buff(buff, usize::from(cols));
|
||||
let line_count: u16 = lines.len().try_into().unwrap();
|
||||
|
||||
// Print everything and quit if line count is less than the availale rows
|
||||
if line_count < rows {
|
||||
println!("{}", buff);
|
||||
return;
|
||||
}
|
||||
|
||||
let mut upper_mark = 0;
|
||||
// Number of lines left
|
||||
let mut lines_left = line_count - (upper_mark + rows);
|
||||
// Are we on the very last page and the next down arrow will return this function
|
||||
let mut to_be_done = false;
|
||||
let mut lines_left = line_count.saturating_sub(upper_mark + rows);
|
||||
|
||||
draw(
|
||||
&mut upper_mark,
|
||||
rows,
|
||||
|
@ -224,6 +215,16 @@ fn more(buff: &str, mut stdout: &mut Stdout, is_last: bool) {
|
|||
line_count,
|
||||
);
|
||||
|
||||
let mut to_be_done = false;
|
||||
if lines_left == 0 && is_last {
|
||||
if is_last {
|
||||
return;
|
||||
} else {
|
||||
to_be_done = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
loop {
|
||||
if event::poll(Duration::from_millis(10)).unwrap() {
|
||||
match event::read().unwrap() {
|
||||
|
@ -246,38 +247,21 @@ fn more(buff: &str, mut stdout: &mut Stdout, is_last: bool) {
|
|||
code: KeyCode::Char(' '),
|
||||
modifiers: KeyModifiers::NONE,
|
||||
}) => {
|
||||
// If this is the last page but some text
|
||||
// is still left that does not require a page of its own
|
||||
// then this event will print the left lines
|
||||
if lines_left < rows && !to_be_done {
|
||||
for l in lines.iter().skip((line_count - upper_mark - rows).into()) {
|
||||
stdout.write_all(format!("\r{}\n", l).as_bytes()).unwrap();
|
||||
upper_mark = upper_mark.saturating_add(rows.saturating_sub(1));
|
||||
lines_left = line_count.saturating_sub(upper_mark + rows);
|
||||
draw(
|
||||
&mut upper_mark,
|
||||
rows,
|
||||
&mut stdout,
|
||||
lines.clone(),
|
||||
line_count,
|
||||
);
|
||||
|
||||
if lines_left == 0 {
|
||||
if to_be_done || is_last {
|
||||
return
|
||||
}
|
||||
make_prompt_and_flush(&mut stdout, line_count, line_count);
|
||||
// If this is not the last input file
|
||||
// do not return, but the next down arrow must return
|
||||
// because we have printed everyhing
|
||||
if !is_last {
|
||||
to_be_done = true;
|
||||
} else {
|
||||
// Else quit
|
||||
reset_term(&mut stdout);
|
||||
return;
|
||||
}
|
||||
// This handles the next arrow key to quit
|
||||
} else if lines_left < rows && to_be_done {
|
||||
return;
|
||||
} else {
|
||||
// Print a normal page
|
||||
upper_mark = upper_mark.saturating_add(rows.saturating_sub(1));
|
||||
lines_left = line_count.saturating_sub(upper_mark + rows);
|
||||
draw(
|
||||
&mut upper_mark,
|
||||
rows,
|
||||
&mut stdout,
|
||||
lines.clone(),
|
||||
line_count,
|
||||
);
|
||||
to_be_done = true;
|
||||
}
|
||||
}
|
||||
Event::Key(KeyEvent {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue