Enable non-printable chars for redirected output (#1061)

This commit is contained in:
Evgeniy Andreev (gsomix) 2020-06-20 19:00:32 +04:00
parent 62b4452057
commit 3c5ce9f86c
5 changed files with 30 additions and 7 deletions

View File

@ -5,6 +5,9 @@
- Added support for the `NO_COLOR` environment variable, see #1021 and #1031 (@eth-p) - Added support for the `NO_COLOR` environment variable, see #1021 and #1031 (@eth-p)
## Bugfixes ## Bugfixes
- Fixed non-printable characters display for redirected output, see #1061 (@gsomix)
## Other ## Other
## Syntaxes ## Syntaxes

View File

@ -113,7 +113,7 @@ impl<'b> Controller<'b> {
}; };
let mut printer: Box<dyn Printer> = if self.config.loop_through { let mut printer: Box<dyn Printer> = if self.config.loop_through {
Box::new(SimplePrinter::new()) Box::new(SimplePrinter::new(&self.config))
} else { } else {
Box::new(InteractivePrinter::new( Box::new(InteractivePrinter::new(
&self.config, &self.config,

View File

@ -52,15 +52,17 @@ pub(crate) trait Printer {
) -> Result<()>; ) -> Result<()>;
} }
pub struct SimplePrinter; pub struct SimplePrinter<'a> {
config: &'a Config<'a>
}
impl SimplePrinter { impl<'a> SimplePrinter<'a> {
pub fn new() -> Self { pub fn new(config: &'a Config) -> Self {
SimplePrinter {} SimplePrinter { config }
} }
} }
impl Printer for SimplePrinter { impl<'a> Printer for SimplePrinter<'a> {
fn print_header( fn print_header(
&mut self, &mut self,
_handle: &mut dyn Write, _handle: &mut dyn Write,
@ -86,7 +88,15 @@ impl Printer for SimplePrinter {
line_buffer: &[u8], line_buffer: &[u8],
) -> Result<()> { ) -> Result<()> {
if !out_of_range { if !out_of_range {
handle.write_all(line_buffer)?; if self.config.show_nonprintable {
let line = replace_nonprintable(line_buffer, self.config.tab_width);
write!(handle, "{}", line)?;
if line_buffer.last() == Some(&b'\n') {
writeln!(handle)?;
}
} else {
handle.write_all(line_buffer)?
};
} }
Ok(()) Ok(())
} }

BIN
tests/examples/nonprintable.txt vendored Normal file

Binary file not shown.

View File

@ -716,3 +716,13 @@ fn do_not_detect_different_syntax_for_stdin_and_files() {
from_utf8(&cmd_for_stdin.get_output().stdout).expect("output is valid utf-8") from_utf8(&cmd_for_stdin.get_output().stdout).expect("output is valid utf-8")
); );
} }
#[test]
fn show_all_mode() {
bat()
.arg("--show-all")
.arg("nonprintable.txt")
.assert()
.stdout("hello•world␊\n├──┤␍␀␇␈␛")
.stderr("");
}