mirror of
https://github.com/sharkdp/bat.git
synced 2024-12-31 10:48:53 +01:00
Add less pager
This commit is contained in:
parent
9dca3126b3
commit
418b3c5ea1
@ -55,8 +55,9 @@ script:
|
|||||||
- cargo build --target $TARGET --verbose
|
- cargo build --target $TARGET --verbose
|
||||||
- cargo test --target $TARGET --verbose
|
- cargo test --target $TARGET --verbose
|
||||||
# Run 'bat' on its own source code and the README
|
# Run 'bat' on its own source code and the README
|
||||||
- cargo run --target $TARGET -- src/main.rs
|
# Piping to 'cat' forces the tty check to fail so that a pager is not used
|
||||||
- cargo run --target $TARGET -- README.md
|
- cargo run --target $TARGET -- src/main.rs | cat
|
||||||
|
- cargo run --target $TARGET -- README.md | cat
|
||||||
|
|
||||||
before_deploy:
|
before_deploy:
|
||||||
- bash ci/before_deploy.bash
|
- bash ci/before_deploy.bash
|
||||||
|
61
src/main.rs
61
src/main.rs
@ -22,9 +22,9 @@ mod terminal;
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::fs::{self, File};
|
use std::fs::{self, File};
|
||||||
use std::io::{self, BufRead, BufReader, StdoutLock, Write};
|
use std::io::{self, BufRead, BufReader, Stdout, StdoutLock, Write};
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::process;
|
use std::process::{self, Command, Child, Stdio};
|
||||||
|
|
||||||
use ansi_term::Colour::{Fixed, Green, Red, White, Yellow};
|
use ansi_term::Colour::{Fixed, Green, Red, White, Yellow};
|
||||||
use ansi_term::Style;
|
use ansi_term::Style;
|
||||||
@ -65,6 +65,42 @@ struct Options<'a> {
|
|||||||
true_color: bool,
|
true_color: bool,
|
||||||
style: OptionsStyle,
|
style: OptionsStyle,
|
||||||
language: Option<&'a str>,
|
language: Option<&'a str>,
|
||||||
|
interactive_terminal: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
enum OutputType<'a> {
|
||||||
|
Pager(Child),
|
||||||
|
Stdout(StdoutLock<'a>),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> OutputType<'a> {
|
||||||
|
fn new_pager() -> Result<Self> {
|
||||||
|
Ok(OutputType::Pager(Command::new("less")
|
||||||
|
.args(&["--quit-if-one-screen", "--RAW-CONTROL-CHARS", "--no-init"])
|
||||||
|
.stdin(Stdio::piped())
|
||||||
|
.spawn()
|
||||||
|
.chain_err(|| "Could not spawn pager")?
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn new_stdout(stdout: &'a Stdout) -> Self {
|
||||||
|
OutputType::Stdout(stdout.lock())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn stdout(&mut self) -> Result<&mut Write> {
|
||||||
|
Ok(match *self {
|
||||||
|
OutputType::Pager(ref mut command) => command.stdin.as_mut().chain_err(|| "Could not open stdin for pager")?,
|
||||||
|
OutputType::Stdout(ref mut handle) => handle,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Drop for OutputType<'a> {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
if let OutputType::Pager(ref mut command) = *self {
|
||||||
|
let _ = command.wait();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Copy, Clone, Debug)]
|
||||||
@ -81,7 +117,7 @@ const PANEL_WIDTH: usize = 7;
|
|||||||
const GRID_COLOR: u8 = 238;
|
const GRID_COLOR: u8 = 238;
|
||||||
|
|
||||||
fn print_horizontal_line(
|
fn print_horizontal_line(
|
||||||
handle: &mut StdoutLock,
|
handle: &mut Write,
|
||||||
grid_char: char,
|
grid_char: char,
|
||||||
term_width: usize,
|
term_width: usize,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
@ -112,7 +148,15 @@ fn print_file<P: AsRef<Path>>(
|
|||||||
let mut highlighter = HighlightLines::new(syntax, theme);
|
let mut highlighter = HighlightLines::new(syntax, theme);
|
||||||
|
|
||||||
let stdout = io::stdout();
|
let stdout = io::stdout();
|
||||||
let mut handle = stdout.lock();
|
let mut output_type= if options.interactive_terminal {
|
||||||
|
match OutputType::new_pager() {
|
||||||
|
Ok(pager) => pager,
|
||||||
|
Err(_) => OutputType::new_stdout(&stdout),
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
OutputType::new_stdout(&stdout)
|
||||||
|
};
|
||||||
|
let mut handle = output_type.stdout()?;
|
||||||
|
|
||||||
let term = Term::stdout();
|
let term = Term::stdout();
|
||||||
let (_, term_width) = term.size();
|
let (_, term_width) = term.size();
|
||||||
@ -131,7 +175,7 @@ fn print_file<P: AsRef<Path>>(
|
|||||||
White.bold().paint(filename.as_ref().to_string_lossy())
|
White.bold().paint(filename.as_ref().to_string_lossy())
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
print_horizontal_line(&mut handle, '┼', term_width)?;
|
print_horizontal_line(handle, '┼', term_width)?;
|
||||||
}
|
}
|
||||||
OptionsStyle::Plain => {}
|
OptionsStyle::Plain => {}
|
||||||
};
|
};
|
||||||
@ -179,7 +223,7 @@ fn print_file<P: AsRef<Path>>(
|
|||||||
// Show bars for all but plain style
|
// Show bars for all but plain style
|
||||||
match options.style {
|
match options.style {
|
||||||
OptionsStyle::LineNumbers | OptionsStyle::Full =>
|
OptionsStyle::LineNumbers | OptionsStyle::Full =>
|
||||||
print_horizontal_line(&mut handle, '┴', term_width)?,
|
print_horizontal_line(handle, '┴', term_width)?,
|
||||||
OptionsStyle::Plain => {}
|
OptionsStyle::Plain => {}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -370,7 +414,9 @@ impl HighlightingAssets {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn run() -> Result<()> {
|
fn run() -> Result<()> {
|
||||||
let clap_color_setting = if atty::is(Stream::Stdout) {
|
let interactive_terminal = atty::is(Stream::Stdout);
|
||||||
|
|
||||||
|
let clap_color_setting = if interactive_terminal {
|
||||||
AppSettings::ColoredHelp
|
AppSettings::ColoredHelp
|
||||||
} else {
|
} else {
|
||||||
AppSettings::ColorNever
|
AppSettings::ColorNever
|
||||||
@ -428,6 +474,7 @@ fn run() -> Result<()> {
|
|||||||
_ => OptionsStyle::Full,
|
_ => OptionsStyle::Full,
|
||||||
},
|
},
|
||||||
language: app_matches.value_of("language"),
|
language: app_matches.value_of("language"),
|
||||||
|
interactive_terminal,
|
||||||
};
|
};
|
||||||
|
|
||||||
let assets =
|
let assets =
|
||||||
|
Loading…
Reference in New Issue
Block a user