From 1b6df8a4802cd4580f515cf63756dad1649290fe Mon Sep 17 00:00:00 2001 From: rachitchokshi Date: Sat, 8 Sep 2018 14:23:14 -0700 Subject: [PATCH 01/24] Enabled build target aarch64-unknown-linux-gnu for arm64 architecture --- .travis.yml | 8 +++++++- Cargo.toml | 1 + ci/before_install.bash | 8 ++++++++ ci/script.bash | 2 +- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 28478f22..100f54fe 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,7 +23,13 @@ matrix: - TARGET=arm-unknown-linux-gnueabihf - CC_arm_unknown_linux_gnueabihf=/usr/bin/arm-linux-gnueabihf-gcc-4.8 - CARGO_TARGET_ARM_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc-4.8 - + - os: linux + rust: stable + env: + - TARGET=aarch64-unknown-linux-gnu + - CC_aarch64-unknown-linux-gnu=/usr/bin/aarch64-linux-gnu-gcc-4.8 + - CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc-4.8 + # Minimum Rust supported channel. - os: linux rust: 1.26.0 diff --git a/Cargo.toml b/Cargo.toml index ac395507..4df621ac 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,7 @@ ansi_term = "0.11" console = "0.6" directories = "1.0" lazy_static = "1.0" +libz-sys = "1.0.20" [dependencies.git2] version = "0.7" diff --git a/ci/before_install.bash b/ci/before_install.bash index 709be7d5..9acf6025 100755 --- a/ci/before_install.bash +++ b/ci/before_install.bash @@ -27,3 +27,11 @@ if [[ $TARGET == arm-unknown-linux-gnueabihf ]]; then libc6-armhf-cross \ libc6-dev-armhf-cross fi + +# needed for cross-compiling for arm64 +if [[ $TARGET == aarch64-unknown-linux-gnu ]]; then + sudo apt-get install -y \ + gcc-4.8-aarch64-linux-gnu \ + binutils-aarch64-linux-gnu \ + gcc-aarch64-linux-gnu +fi diff --git a/ci/script.bash b/ci/script.bash index 321dcb14..fc874b96 100755 --- a/ci/script.bash +++ b/ci/script.bash @@ -6,7 +6,7 @@ set -ex cargo build --target "$TARGET" --verbose # We cannot run arm executables on linux -if [[ $TARGET != arm-unknown-linux-gnueabihf ]]; then +if [[ $TARGET != arm-unknown-linux-gnueabihf ]] && [[ $TARGET != aarch64-unknown-linux-gnu ]]; then cargo test --target "$TARGET" --verbose # Run 'bat' on its own source code and the README From e9681bf22dd3aedd1ae479df0293cb97e32b49c4 Mon Sep 17 00:00:00 2001 From: rachitchokshi Date: Sun, 9 Sep 2018 01:15:41 -0700 Subject: [PATCH 02/24] Testing build by removing dependency 'libz-sys = "1.0.20"' --- Cargo.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 4df621ac..ac395507 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,7 +19,6 @@ ansi_term = "0.11" console = "0.6" directories = "1.0" lazy_static = "1.0" -libz-sys = "1.0.20" [dependencies.git2] version = "0.7" From 89d4cb951a2232a60891b14a79047a37d66c585e Mon Sep 17 00:00:00 2001 From: rachitchokshi Date: Sun, 9 Sep 2018 16:56:39 -0700 Subject: [PATCH 03/24] Updated before_deploy.bash to call version of strip specific to aarch64 target --- ci/before_deploy.bash | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ci/before_deploy.bash b/ci/before_deploy.bash index ea5c1725..7cc4d874 100755 --- a/ci/before_deploy.bash +++ b/ci/before_deploy.bash @@ -19,6 +19,8 @@ pack() { if [[ $TARGET == "arm-unknown-linux-gnueabihf" ]]; then gcc_prefix="arm-linux-gnueabihf-" + elif [[ $TARGET == "aarch64-unknown-linux-gnu" ]]; then + gcc_prefix="aarch64-linux-gnu-" else gcc_prefix="" fi From 0fe3badf19a2e05c2b5cdde8bf748c393aab91c7 Mon Sep 17 00:00:00 2001 From: rachitchokshi <36342425+rachitchokshi@users.noreply.github.com> Date: Sun, 9 Sep 2018 19:30:29 -0700 Subject: [PATCH 04/24] adding deb packaging for arm64 (#1) --- ci/before_deploy.bash | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ci/before_deploy.bash b/ci/before_deploy.bash index 7cc4d874..913fce44 100755 --- a/ci/before_deploy.bash +++ b/ci/before_deploy.bash @@ -51,13 +51,20 @@ make_deb() { local version local dpkgname local conflictname + local gcc_prefix case $TARGET in x86_64*) architecture=amd64 + gcc_prefix="" ;; i686*) architecture=i386 + gcc_prefix="" + ;; + aarch64*) + architecture=arm64 + gcc_prefix="aarch64-linux-gnu-" ;; *) echo "make_deb: skipping target '${TARGET}'" >&2 @@ -77,7 +84,7 @@ make_deb() { # copy the main binary install -Dm755 "target/$TARGET/release/$PROJECT_NAME" "$tempdir/usr/bin/$PROJECT_NAME" - strip "$tempdir/usr/bin/$PROJECT_NAME" + "${gcc_prefix}"strip "$tempdir/usr/bin/$PROJECT_NAME" # manpage install -Dm644 "doc/$PROJECT_NAME.1" "$tempdir/usr/share/man/man1/$PROJECT_NAME.1" From e1ecc17f69f1d84fb127203a45e4abd88babab07 Mon Sep 17 00:00:00 2001 From: Rogach Date: Mon, 10 Sep 2018 22:36:58 +0300 Subject: [PATCH 05/24] print additional newline if last line in input file was not terminated with a newline (fixes #299) --- src/printer.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/printer.rs b/src/printer.rs index afa2ac8b..10a44fba 100644 --- a/src/printer.rs +++ b/src/printer.rs @@ -243,6 +243,10 @@ impl<'a> Printer for InteractivePrinter<'a> { )).collect::>() .join("") )?; + + if line.bytes().next_back() != Some(b'\n') { + write!(handle, "\n")?; + } } else { for &(style, region) in regions.iter() { let mut ansi_iterator = AnsiCodeIterator::new(region); From b23ff24ebcca480449fbcf6286d81e7e4429b2a8 Mon Sep 17 00:00:00 2001 From: eth-p <32112321+eth-p@users.noreply.github.com> Date: Mon, 10 Sep 2018 18:11:59 -0700 Subject: [PATCH 06/24] Added tab expansion preprocessing step. --- src/app.rs | 18 ++++++++++++++++++ src/main.rs | 1 + src/preprocessor.rs | 35 +++++++++++++++++++++++++++++++++++ src/printer.rs | 11 ++++++++++- 4 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 src/preprocessor.rs diff --git a/src/app.rs b/src/app.rs index a9ac691e..f2e2a84c 100644 --- a/src/app.rs +++ b/src/app.rs @@ -41,6 +41,9 @@ pub struct Config<'a> { /// The character width of the terminal pub term_width: usize, + /// The width of tab characters. + pub tab_width: usize, + /// Whether or not to simply loop through all input (`cat` mode) pub loop_through: bool, @@ -276,6 +279,15 @@ impl App { 'unbuffered'). The output is always unbuffered - this option \ is simply ignored.", ), + ).arg( + Arg::with_name("tabs") + .long("tabs") + .short("t") + .takes_value(true) + .value_name("width") + .help("Sets the tab width.") + .long_help("Sets the tab width. Use a width of 0 to pass tabs through \ + directly"), ).arg( Arg::with_name("terminal-width") .long("terminal-width") @@ -393,6 +405,12 @@ impl App { || self.matches.value_of("color") == Some("always") || self.matches.value_of("decorations") == Some("always")), files, + tab_width: self + .matches + .value_of("tabs") + .and_then(|w| w.parse().ok()) + .or_else(|| env::var("BAT_TABS").ok().and_then(|w| w.parse().ok())) + .unwrap_or(8), theme: self .matches .value_of("theme") diff --git a/src/main.rs b/src/main.rs index ff87f9b8..bc3d11aa 100644 --- a/src/main.rs +++ b/src/main.rs @@ -24,6 +24,7 @@ mod decorations; mod diff; mod line_range; mod output; +mod preprocessor; mod printer; mod style; mod terminal; diff --git a/src/preprocessor.rs b/src/preprocessor.rs new file mode 100644 index 00000000..5d266abf --- /dev/null +++ b/src/preprocessor.rs @@ -0,0 +1,35 @@ +use console::AnsiCodeIterator; + +/// Expand tabs like an ANSI-enabled expand(1). +pub fn expand(line: &str, width: usize) -> String { + let mut buffer = String::with_capacity(line.len() * 2); + let mut cursor = 0; + + for chunk in AnsiCodeIterator::new(line) { + match chunk { + (text, true) => buffer.push_str(text), + (mut text, false) => { + while let Some(index) = text.find('\t') { + // Add previous text. + if index > 0 { + cursor += index; + buffer.push_str(&text[0..index]); + } + + // Add tab. + let spaces = width - (cursor % width); + cursor += spaces; + buffer.push_str(&*" ".repeat(spaces)); + + // Next. + text = &text[index + 1..text.len()]; + } + + cursor += text.len(); + buffer.push_str(text); + } + } + } + + buffer +} diff --git a/src/printer.rs b/src/printer.rs index afa2ac8b..dc0137da 100644 --- a/src/printer.rs +++ b/src/printer.rs @@ -16,6 +16,7 @@ use decorations::{Decoration, GridBorderDecoration, LineChangesDecoration, LineN use diff::get_git_diff; use diff::LineChanges; use errors::*; +use preprocessor::expand; use style::OutputWrap; use terminal::{as_terminal_escaped, to_ansi_color}; @@ -200,9 +201,17 @@ impl<'a> Printer for InteractivePrinter<'a> { line_number: usize, line_buffer: &[u8], ) -> Result<()> { - let line = String::from_utf8_lossy(&line_buffer); + let mut line = String::from_utf8_lossy(&line_buffer).to_string(); + + // Preprocess. + if self.config.tab_width > 0 { + line = expand(&line, self.config.tab_width); + } + + // Highlight. let regions = self.highlighter.highlight(line.as_ref()); + // Print. if out_of_range { return Ok(()); } From 91593417141c49b6f2a0755f989e7a3fb9bae310 Mon Sep 17 00:00:00 2001 From: eth-p <32112321+eth-p@users.noreply.github.com> Date: Mon, 10 Sep 2018 19:19:43 -0700 Subject: [PATCH 07/24] Modified snapshot tests to support tab expansion. This changes how the files are named (to allow for snapshots that aren't directly related to the --style argument) and fixes the generate_snapshots.py script to work with the latest version of bat. Three new tests are also introduced: - tabs_4 - Tab expansion with a width of 4. - tabs_8 - Tab expansion with a width of 8. - tabs_passthrough - No tab expansion. --- tests/snapshots/generate_snapshots.py | 20 +++++++++---- tests/snapshots/sample.modified.rs | 16 ++++++++++- tests/snapshots/sample.rs | 14 +++++++++ tests/tester.rs | 5 ++-- tests/tests.rs | 41 ++++++++++++++------------- 5 files changed, 68 insertions(+), 28 deletions(-) diff --git a/tests/snapshots/generate_snapshots.py b/tests/snapshots/generate_snapshots.py index 6d25f0f1..ea130a4f 100755 --- a/tests/snapshots/generate_snapshots.py +++ b/tests/snapshots/generate_snapshots.py @@ -10,16 +10,24 @@ def generate_snapshots(): for num in range(len(single_styles)): for grouped in itertools.combinations(single_styles, num + 1): - generate_snapshot(",".join(grouped)) + generate_style_snapshot(",".join(grouped)) for style in collective_styles: - generate_snapshot(style) + generate_style_snapshot(style) -def generate_snapshot(option): - command = "../../target/debug/bat --style={0} sample.rs > output/{0}.snapshot.txt".format( - option + generate_snapshot("tabs_passthrough", "--tabs=0 --style=full") + generate_snapshot("tabs_4", "--tabs=4 --style=full") + generate_snapshot("tabs_8", "--tabs=8 --style=full") + +def generate_style_snapshot(style): + generate_snapshot(style.replace(",","_"), "--style={}".format(style)) + +def generate_snapshot(name, arguments): + command = "../../target/debug/bat --decorations=always {1} sample.rs > output/{0}.snapshot.txt".format( + name, + arguments ) - print("generating snapshot for {}".format(option)) + print("generating snapshot for {}".format(name)) subprocess.call(command, shell=True) def build_bat(): diff --git a/tests/snapshots/sample.modified.rs b/tests/snapshots/sample.modified.rs index bb1a7943..30cbdde6 100644 --- a/tests/snapshots/sample.modified.rs +++ b/tests/snapshots/sample.modified.rs @@ -10,7 +10,7 @@ fn main() { "The perimeter of the rectangle is {} pixels.", perimeter(&rect1) ); - println!(r#"This line contains invalid utf8: "øˆ€€€"#; + println!(r#"This line contains invalid utf8: "�����"#; } fn area(rectangle: &Rectangle) -> u32 { @@ -20,3 +20,17 @@ fn area(rectangle: &Rectangle) -> u32 { fn perimeter(rectangle: &Rectangle) -> u32 { (rectangle.width + rectangle.height) * 2 } + +// Tab alignment: +/* + Indent + 1 2 3 4 +1 ? +22 ? +333 ? +4444 ? +55555 ? +666666 ? +7777777 ? +88888888 ? +*/ diff --git a/tests/snapshots/sample.rs b/tests/snapshots/sample.rs index 00ec0eb6..6ee6489b 100644 --- a/tests/snapshots/sample.rs +++ b/tests/snapshots/sample.rs @@ -16,3 +16,17 @@ fn main() { fn area(rectangle: &Rectangle) -> u32 { rectangle.width * rectangle.height } + +// Tab alignment: +/* + Indent + 1 2 3 4 +1 ? +22 ? +333 ? +4444 ? +55555 ? +666666 ? +7777777 ? +88888888 ? +*/ \ No newline at end of file diff --git a/tests/tester.rs b/tests/tester.rs index 9885ff46..c7f46c03 100644 --- a/tests/tester.rs +++ b/tests/tester.rs @@ -38,13 +38,14 @@ impl BatTester { BatTester { temp_dir, exe } } - pub fn test_snapshot(&self, style: &str) { + pub fn test_snapshot(&self, name: &str, style: &str, tab_width: u32) { let output = Command::new(&self.exe) .current_dir(self.temp_dir.path()) .args(&[ "sample.rs", "--decorations=always", "--terminal-width=80", + &format!("--tabs={}", tab_width), &format!("--style={}", style), ]).output() .expect("bat failed"); @@ -55,7 +56,7 @@ impl BatTester { .replace("tests/snapshots/", ""); let mut expected = String::new(); - let mut file = File::open(format!("tests/snapshots/output/{}.snapshot.txt", style)) + let mut file = File::open(format!("tests/snapshots/output/{}.snapshot.txt", name)) .expect("snapshot file missing"); file.read_to_string(&mut expected) .expect("could not read snapshot file"); diff --git a/tests/tests.rs b/tests/tests.rs index d0313304..906bad4a 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -3,33 +3,36 @@ mod tester; use tester::BatTester; macro_rules! snapshot_tests { - ($($test_name: ident: $style: expr,)*) => { + ($($test_name: ident: $style: expr => [tabs: $tabs:expr],)*) => { $( #[test] fn $test_name() { let bat_tester = BatTester::new(); - bat_tester.test_snapshot($style); + bat_tester.test_snapshot(stringify!($test_name), $style, $tabs); } )* }; } snapshot_tests! { - changes: "changes", - grid: "grid", - header: "header", - numbers: "numbers", - changes_grid: "changes,grid", - changes_header: "changes,header", - changes_numbers: "changes,numbers", - grid_header: "grid,header", - grid_numbers: "grid,numbers", - header_numbers: "header,numbers", - changes_grid_header: "changes,grid,header", - changes_grid_numbers: "changes,grid,numbers", - changes_header_numbers: "changes,header,numbers", - grid_header_numbers: "grid,header,numbers", - changes_grid_header_numbers: "changes,grid,header,numbers", - full: "full", - plain: "plain", + changes: "changes" => [tabs: 8], + grid: "grid" => [tabs: 8], + header: "header" => [tabs: 8], + numbers: "numbers" => [tabs: 8], + changes_grid: "changes,grid" => [tabs: 8], + changes_header: "changes,header" => [tabs: 8], + changes_numbers: "changes,numbers" => [tabs: 8], + grid_header: "grid,header" => [tabs: 8], + grid_numbers: "grid,numbers" => [tabs: 8], + header_numbers: "header,numbers" => [tabs: 8], + changes_grid_header: "changes,grid,header" => [tabs: 8], + changes_grid_numbers: "changes,grid,numbers" => [tabs: 8], + changes_header_numbers: "changes,header,numbers" => [tabs: 8], + grid_header_numbers: "grid,header,numbers" => [tabs: 8], + changes_grid_header_numbers: "changes,grid,header,numbers" => [tabs: 8], + full: "full" => [tabs: 8], + plain: "plain" => [tabs: 8], + tabs_passthrough: "full" => [tabs: 0], + tabs_4: "full" => [tabs: 4], + tabs_8: "full" => [tabs: 8], } From 7cdcdbb31dbe8442660415626e22358f8ef9591c Mon Sep 17 00:00:00 2001 From: eth-p <32112321+eth-p@users.noreply.github.com> Date: Mon, 10 Sep 2018 19:20:09 -0700 Subject: [PATCH 08/24] Updated snapshots. --- tests/snapshots/output/changes.snapshot.txt | 16 +++++++- ...snapshot.txt => changes_grid.snapshot.txt} | 16 +++++++- ...t.txt => changes_grid_header.snapshot.txt} | 16 +++++++- .../changes_grid_header_numbers.snapshot.txt | 40 +++++++++++++++++++ ....txt => changes_grid_numbers.snapshot.txt} | 16 +++++++- ...apshot.txt => changes_header.snapshot.txt} | 16 +++++++- ...xt => changes_header_numbers.snapshot.txt} | 16 +++++++- ...pshot.txt => changes_numbers.snapshot.txt} | 16 +++++++- tests/snapshots/output/full.snapshot.txt | 16 +++++++- tests/snapshots/output/grid.snapshot.txt | 14 +++++++ ....snapshot.txt => grid_header.snapshot.txt} | 14 +++++++ ...t.txt => grid_header_numbers.snapshot.txt} | 14 +++++++ ...snapshot.txt => grid_numbers.snapshot.txt} | 14 +++++++ tests/snapshots/output/header.snapshot.txt | 14 +++++++ ...apshot.txt => header_numbers.snapshot.txt} | 14 +++++++ tests/snapshots/output/numbers.snapshot.txt | 14 +++++++ tests/snapshots/output/plain.snapshot.txt | 14 +++++++ tests/snapshots/output/tabs_4.snapshot.txt | 40 +++++++++++++++++++ tests/snapshots/output/tabs_8.snapshot.txt | 40 +++++++++++++++++++ ...shot.txt => tabs_passthrough.snapshot.txt} | 16 +++++++- 20 files changed, 367 insertions(+), 9 deletions(-) rename tests/snapshots/output/{changes,grid.snapshot.txt => changes_grid.snapshot.txt} (77%) rename tests/snapshots/output/{changes,grid,header.snapshot.txt => changes_grid_header.snapshot.txt} (84%) create mode 100644 tests/snapshots/output/changes_grid_header_numbers.snapshot.txt rename tests/snapshots/output/{changes,grid,numbers.snapshot.txt => changes_grid_numbers.snapshot.txt} (74%) rename tests/snapshots/output/{changes,header.snapshot.txt => changes_header.snapshot.txt} (73%) rename tests/snapshots/output/{changes,header,numbers.snapshot.txt => changes_header_numbers.snapshot.txt} (70%) rename tests/snapshots/output/{changes,numbers.snapshot.txt => changes_numbers.snapshot.txt} (69%) rename tests/snapshots/output/{grid,header.snapshot.txt => grid_header.snapshot.txt} (88%) rename tests/snapshots/output/{grid,header,numbers.snapshot.txt => grid_header_numbers.snapshot.txt} (83%) rename tests/snapshots/output/{grid,numbers.snapshot.txt => grid_numbers.snapshot.txt} (75%) rename tests/snapshots/output/{header,numbers.snapshot.txt => header_numbers.snapshot.txt} (72%) create mode 100644 tests/snapshots/output/tabs_4.snapshot.txt create mode 100644 tests/snapshots/output/tabs_8.snapshot.txt rename tests/snapshots/output/{changes,grid,header,numbers.snapshot.txt => tabs_passthrough.snapshot.txt} (84%) diff --git a/tests/snapshots/output/changes.snapshot.txt b/tests/snapshots/output/changes.snapshot.txt index 28d87201..73520d6f 100644 --- a/tests/snapshots/output/changes.snapshot.txt +++ b/tests/snapshots/output/changes.snapshot.txt @@ -16,7 +16,21 @@ _ fn main() { fn area(rectangle: &Rectangle) -> u32 { rectangle.width * rectangle.height } -+ + + fn perimeter(rectangle: &Rectangle) -> u32 { + (rectangle.width + rectangle.height) * 2 + } ++ + // Tab alignment: + /* + Indent + 1 2 3 4 + 1 ? + 22 ? + 333 ? + 4444 ? + 55555 ? + 666666 ? + 7777777 ? + 88888888 ? +~ */ diff --git a/tests/snapshots/output/changes,grid.snapshot.txt b/tests/snapshots/output/changes_grid.snapshot.txt similarity index 77% rename from tests/snapshots/output/changes,grid.snapshot.txt rename to tests/snapshots/output/changes_grid.snapshot.txt index 3350711a..83e75583 100644 --- a/tests/snapshots/output/changes,grid.snapshot.txt +++ b/tests/snapshots/output/changes_grid.snapshot.txt @@ -16,8 +16,22 @@ _ │ fn main() { │ fn area(rectangle: &Rectangle) -> u32 { │ rectangle.width * rectangle.height │ } -+ │ + │ + │ fn perimeter(rectangle: &Rectangle) -> u32 { + │ (rectangle.width + rectangle.height) * 2 + │ } ++ │ + │ // Tab alignment: + │ /* + │ Indent + │ 1 2 3 4 + │ 1 ? + │ 22 ? + │ 333 ? + │ 4444 ? + │ 55555 ? + │ 666666 ? + │ 7777777 ? + │ 88888888 ? +~ │ */ ──┴───────────────────────────────────────────────────────────────────────────── diff --git a/tests/snapshots/output/changes,grid,header.snapshot.txt b/tests/snapshots/output/changes_grid_header.snapshot.txt similarity index 84% rename from tests/snapshots/output/changes,grid,header.snapshot.txt rename to tests/snapshots/output/changes_grid_header.snapshot.txt index 655b6e24..0a32baa8 100644 --- a/tests/snapshots/output/changes,grid,header.snapshot.txt +++ b/tests/snapshots/output/changes_grid_header.snapshot.txt @@ -19,8 +19,22 @@ _ │ fn main() { │ fn area(rectangle: &Rectangle) -> u32 { │ rectangle.width * rectangle.height │ } -+ │ + │ + │ fn perimeter(rectangle: &Rectangle) -> u32 { + │ (rectangle.width + rectangle.height) * 2 + │ } ++ │ + │ // Tab alignment: + │ /* + │ Indent + │ 1 2 3 4 + │ 1 ? + │ 22 ? + │ 333 ? + │ 4444 ? + │ 55555 ? + │ 666666 ? + │ 7777777 ? + │ 88888888 ? +~ │ */ ──┴───────────────────────────────────────────────────────────────────────────── diff --git a/tests/snapshots/output/changes_grid_header_numbers.snapshot.txt b/tests/snapshots/output/changes_grid_header_numbers.snapshot.txt new file mode 100644 index 00000000..221306da --- /dev/null +++ b/tests/snapshots/output/changes_grid_header_numbers.snapshot.txt @@ -0,0 +1,40 @@ +───────┬──────────────────────────────────────────────────────────────────────── + │ File: sample.rs +───────┼──────────────────────────────────────────────────────────────────────── + 1 │ struct Rectangle { + 2 │ width: u32, + 3 │ height: u32, + 4 │ } + 5 │ + 6 _ │ fn main() { + 7 │ let rect1 = Rectangle { width: 30, height: 50 }; + 8 │ + 9 │ println!( + 10 ~ │ "The perimeter of the rectangle is {} pixels.", + 11 ~ │ perimeter(&rect1) + 12 │ ); + 13 + │ println!(r#"This line contains invalid utf8: "�����"#; + 14 │ } + 15 │ + 16 │ fn area(rectangle: &Rectangle) -> u32 { + 17 │ rectangle.width * rectangle.height + 18 │ } + 19 │ + 20 + │ fn perimeter(rectangle: &Rectangle) -> u32 { + 21 + │ (rectangle.width + rectangle.height) * 2 + 22 + │ } + 23 + │ + 24 │ // Tab alignment: + 25 │ /* + 26 │ Indent + 27 │ 1 2 3 4 + 28 │ 1 ? + 29 │ 22 ? + 30 │ 333 ? + 31 │ 4444 ? + 32 │ 55555 ? + 33 │ 666666 ? + 34 │ 7777777 ? + 35 │ 88888888 ? + 36 ~ │ */ +───────┴──────────────────────────────────────────────────────────────────────── diff --git a/tests/snapshots/output/changes,grid,numbers.snapshot.txt b/tests/snapshots/output/changes_grid_numbers.snapshot.txt similarity index 74% rename from tests/snapshots/output/changes,grid,numbers.snapshot.txt rename to tests/snapshots/output/changes_grid_numbers.snapshot.txt index 0d718425..1e1789ee 100644 --- a/tests/snapshots/output/changes,grid,numbers.snapshot.txt +++ b/tests/snapshots/output/changes_grid_numbers.snapshot.txt @@ -16,8 +16,22 @@ 16 │ fn area(rectangle: &Rectangle) -> u32 { 17 │ rectangle.width * rectangle.height 18 │ } - 19 + │ + 19 │ 20 + │ fn perimeter(rectangle: &Rectangle) -> u32 { 21 + │ (rectangle.width + rectangle.height) * 2 22 + │ } + 23 + │ + 24 │ // Tab alignment: + 25 │ /* + 26 │ Indent + 27 │ 1 2 3 4 + 28 │ 1 ? + 29 │ 22 ? + 30 │ 333 ? + 31 │ 4444 ? + 32 │ 55555 ? + 33 │ 666666 ? + 34 │ 7777777 ? + 35 │ 88888888 ? + 36 ~ │ */ ───────┴──────────────────────────────────────────────────────────────────────── diff --git a/tests/snapshots/output/changes,header.snapshot.txt b/tests/snapshots/output/changes_header.snapshot.txt similarity index 73% rename from tests/snapshots/output/changes,header.snapshot.txt rename to tests/snapshots/output/changes_header.snapshot.txt index 82fe8c47..8d1d1b8a 100644 --- a/tests/snapshots/output/changes,header.snapshot.txt +++ b/tests/snapshots/output/changes_header.snapshot.txt @@ -17,7 +17,21 @@ _ fn main() { fn area(rectangle: &Rectangle) -> u32 { rectangle.width * rectangle.height } -+ + + fn perimeter(rectangle: &Rectangle) -> u32 { + (rectangle.width + rectangle.height) * 2 + } ++ + // Tab alignment: + /* + Indent + 1 2 3 4 + 1 ? + 22 ? + 333 ? + 4444 ? + 55555 ? + 666666 ? + 7777777 ? + 88888888 ? +~ */ diff --git a/tests/snapshots/output/changes,header,numbers.snapshot.txt b/tests/snapshots/output/changes_header_numbers.snapshot.txt similarity index 70% rename from tests/snapshots/output/changes,header,numbers.snapshot.txt rename to tests/snapshots/output/changes_header_numbers.snapshot.txt index 77145eb9..ddc32872 100644 --- a/tests/snapshots/output/changes,header,numbers.snapshot.txt +++ b/tests/snapshots/output/changes_header_numbers.snapshot.txt @@ -17,7 +17,21 @@ 16 fn area(rectangle: &Rectangle) -> u32 { 17 rectangle.width * rectangle.height 18 } - 19 + + 19 20 + fn perimeter(rectangle: &Rectangle) -> u32 { 21 + (rectangle.width + rectangle.height) * 2 22 + } + 23 + + 24 // Tab alignment: + 25 /* + 26 Indent + 27 1 2 3 4 + 28 1 ? + 29 22 ? + 30 333 ? + 31 4444 ? + 32 55555 ? + 33 666666 ? + 34 7777777 ? + 35 88888888 ? + 36 ~ */ diff --git a/tests/snapshots/output/changes,numbers.snapshot.txt b/tests/snapshots/output/changes_numbers.snapshot.txt similarity index 69% rename from tests/snapshots/output/changes,numbers.snapshot.txt rename to tests/snapshots/output/changes_numbers.snapshot.txt index bdfe745b..298ee617 100644 --- a/tests/snapshots/output/changes,numbers.snapshot.txt +++ b/tests/snapshots/output/changes_numbers.snapshot.txt @@ -16,7 +16,21 @@ 16 fn area(rectangle: &Rectangle) -> u32 { 17 rectangle.width * rectangle.height 18 } - 19 + + 19 20 + fn perimeter(rectangle: &Rectangle) -> u32 { 21 + (rectangle.width + rectangle.height) * 2 22 + } + 23 + + 24 // Tab alignment: + 25 /* + 26 Indent + 27 1 2 3 4 + 28 1 ? + 29 22 ? + 30 333 ? + 31 4444 ? + 32 55555 ? + 33 666666 ? + 34 7777777 ? + 35 88888888 ? + 36 ~ */ diff --git a/tests/snapshots/output/full.snapshot.txt b/tests/snapshots/output/full.snapshot.txt index cee4737f..221306da 100644 --- a/tests/snapshots/output/full.snapshot.txt +++ b/tests/snapshots/output/full.snapshot.txt @@ -19,8 +19,22 @@ 16 │ fn area(rectangle: &Rectangle) -> u32 { 17 │ rectangle.width * rectangle.height 18 │ } - 19 + │ + 19 │ 20 + │ fn perimeter(rectangle: &Rectangle) -> u32 { 21 + │ (rectangle.width + rectangle.height) * 2 22 + │ } + 23 + │ + 24 │ // Tab alignment: + 25 │ /* + 26 │ Indent + 27 │ 1 2 3 4 + 28 │ 1 ? + 29 │ 22 ? + 30 │ 333 ? + 31 │ 4444 ? + 32 │ 55555 ? + 33 │ 666666 ? + 34 │ 7777777 ? + 35 │ 88888888 ? + 36 ~ │ */ ───────┴──────────────────────────────────────────────────────────────────────── diff --git a/tests/snapshots/output/grid.snapshot.txt b/tests/snapshots/output/grid.snapshot.txt index bef9a7e6..45917643 100644 --- a/tests/snapshots/output/grid.snapshot.txt +++ b/tests/snapshots/output/grid.snapshot.txt @@ -20,4 +20,18 @@ fn area(rectangle: &Rectangle) -> u32 { fn perimeter(rectangle: &Rectangle) -> u32 { (rectangle.width + rectangle.height) * 2 } + +// Tab alignment: +/* + Indent + 1 2 3 4 +1 ? +22 ? +333 ? +4444 ? +55555 ? +666666 ? +7777777 ? +88888888 ? +*/ ──────────────────────────────────────────────────────────────────────────────── diff --git a/tests/snapshots/output/grid,header.snapshot.txt b/tests/snapshots/output/grid_header.snapshot.txt similarity index 88% rename from tests/snapshots/output/grid,header.snapshot.txt rename to tests/snapshots/output/grid_header.snapshot.txt index 50c16941..fa74ec09 100644 --- a/tests/snapshots/output/grid,header.snapshot.txt +++ b/tests/snapshots/output/grid_header.snapshot.txt @@ -23,4 +23,18 @@ fn area(rectangle: &Rectangle) -> u32 { fn perimeter(rectangle: &Rectangle) -> u32 { (rectangle.width + rectangle.height) * 2 } + +// Tab alignment: +/* + Indent + 1 2 3 4 +1 ? +22 ? +333 ? +4444 ? +55555 ? +666666 ? +7777777 ? +88888888 ? +*/ ──────────────────────────────────────────────────────────────────────────────── diff --git a/tests/snapshots/output/grid,header,numbers.snapshot.txt b/tests/snapshots/output/grid_header_numbers.snapshot.txt similarity index 83% rename from tests/snapshots/output/grid,header,numbers.snapshot.txt rename to tests/snapshots/output/grid_header_numbers.snapshot.txt index e9f1a9cf..733b9848 100644 --- a/tests/snapshots/output/grid,header,numbers.snapshot.txt +++ b/tests/snapshots/output/grid_header_numbers.snapshot.txt @@ -23,4 +23,18 @@ 20 │ fn perimeter(rectangle: &Rectangle) -> u32 { 21 │ (rectangle.width + rectangle.height) * 2 22 │ } + 23 │ + 24 │ // Tab alignment: + 25 │ /* + 26 │ Indent + 27 │ 1 2 3 4 + 28 │ 1 ? + 29 │ 22 ? + 30 │ 333 ? + 31 │ 4444 ? + 32 │ 55555 ? + 33 │ 666666 ? + 34 │ 7777777 ? + 35 │ 88888888 ? + 36 │ */ ─────┴────────────────────────────────────────────────────────────────────────── diff --git a/tests/snapshots/output/grid,numbers.snapshot.txt b/tests/snapshots/output/grid_numbers.snapshot.txt similarity index 75% rename from tests/snapshots/output/grid,numbers.snapshot.txt rename to tests/snapshots/output/grid_numbers.snapshot.txt index 799f9617..c7d8fb13 100644 --- a/tests/snapshots/output/grid,numbers.snapshot.txt +++ b/tests/snapshots/output/grid_numbers.snapshot.txt @@ -20,4 +20,18 @@ 20 │ fn perimeter(rectangle: &Rectangle) -> u32 { 21 │ (rectangle.width + rectangle.height) * 2 22 │ } + 23 │ + 24 │ // Tab alignment: + 25 │ /* + 26 │ Indent + 27 │ 1 2 3 4 + 28 │ 1 ? + 29 │ 22 ? + 30 │ 333 ? + 31 │ 4444 ? + 32 │ 55555 ? + 33 │ 666666 ? + 34 │ 7777777 ? + 35 │ 88888888 ? + 36 │ */ ─────┴────────────────────────────────────────────────────────────────────────── diff --git a/tests/snapshots/output/header.snapshot.txt b/tests/snapshots/output/header.snapshot.txt index 0889edfd..6b9b5701 100644 --- a/tests/snapshots/output/header.snapshot.txt +++ b/tests/snapshots/output/header.snapshot.txt @@ -21,3 +21,17 @@ fn area(rectangle: &Rectangle) -> u32 { fn perimeter(rectangle: &Rectangle) -> u32 { (rectangle.width + rectangle.height) * 2 } + +// Tab alignment: +/* + Indent + 1 2 3 4 +1 ? +22 ? +333 ? +4444 ? +55555 ? +666666 ? +7777777 ? +88888888 ? +*/ diff --git a/tests/snapshots/output/header,numbers.snapshot.txt b/tests/snapshots/output/header_numbers.snapshot.txt similarity index 72% rename from tests/snapshots/output/header,numbers.snapshot.txt rename to tests/snapshots/output/header_numbers.snapshot.txt index a681e6b4..4d445b5f 100644 --- a/tests/snapshots/output/header,numbers.snapshot.txt +++ b/tests/snapshots/output/header_numbers.snapshot.txt @@ -21,3 +21,17 @@ 20 fn perimeter(rectangle: &Rectangle) -> u32 { 21 (rectangle.width + rectangle.height) * 2 22 } + 23 + 24 // Tab alignment: + 25 /* + 26 Indent + 27 1 2 3 4 + 28 1 ? + 29 22 ? + 30 333 ? + 31 4444 ? + 32 55555 ? + 33 666666 ? + 34 7777777 ? + 35 88888888 ? + 36 */ diff --git a/tests/snapshots/output/numbers.snapshot.txt b/tests/snapshots/output/numbers.snapshot.txt index c1341d29..90ca33c5 100644 --- a/tests/snapshots/output/numbers.snapshot.txt +++ b/tests/snapshots/output/numbers.snapshot.txt @@ -20,3 +20,17 @@ 20 fn perimeter(rectangle: &Rectangle) -> u32 { 21 (rectangle.width + rectangle.height) * 2 22 } + 23 + 24 // Tab alignment: + 25 /* + 26 Indent + 27 1 2 3 4 + 28 1 ? + 29 22 ? + 30 333 ? + 31 4444 ? + 32 55555 ? + 33 666666 ? + 34 7777777 ? + 35 88888888 ? + 36 */ diff --git a/tests/snapshots/output/plain.snapshot.txt b/tests/snapshots/output/plain.snapshot.txt index dbc49f9f..7188c21f 100644 --- a/tests/snapshots/output/plain.snapshot.txt +++ b/tests/snapshots/output/plain.snapshot.txt @@ -20,3 +20,17 @@ fn area(rectangle: &Rectangle) -> u32 { fn perimeter(rectangle: &Rectangle) -> u32 { (rectangle.width + rectangle.height) * 2 } + +// Tab alignment: +/* + Indent + 1 2 3 4 +1 ? +22 ? +333 ? +4444 ? +55555 ? +666666 ? +7777777 ? +88888888 ? +*/ diff --git a/tests/snapshots/output/tabs_4.snapshot.txt b/tests/snapshots/output/tabs_4.snapshot.txt new file mode 100644 index 00000000..87689c7b --- /dev/null +++ b/tests/snapshots/output/tabs_4.snapshot.txt @@ -0,0 +1,40 @@ +───────┬──────────────────────────────────────────────────────────────────────── + │ File: sample.rs +───────┼──────────────────────────────────────────────────────────────────────── + 1 │ struct Rectangle { + 2 │ width: u32, + 3 │ height: u32, + 4 │ } + 5 │ + 6 _ │ fn main() { + 7 │ let rect1 = Rectangle { width: 30, height: 50 }; + 8 │ + 9 │ println!( + 10 ~ │ "The perimeter of the rectangle is {} pixels.", + 11 ~ │ perimeter(&rect1) + 12 │ ); + 13 + │ println!(r#"This line contains invalid utf8: "�����"#; + 14 │ } + 15 │ + 16 │ fn area(rectangle: &Rectangle) -> u32 { + 17 │ rectangle.width * rectangle.height + 18 │ } + 19 │ + 20 + │ fn perimeter(rectangle: &Rectangle) -> u32 { + 21 + │ (rectangle.width + rectangle.height) * 2 + 22 + │ } + 23 + │ + 24 │ // Tab alignment: + 25 │ /* + 26 │ Indent + 27 │ 1 2 3 4 + 28 │ 1 ? + 29 │ 22 ? + 30 │ 333 ? + 31 │ 4444 ? + 32 │ 55555 ? + 33 │ 666666 ? + 34 │ 7777777 ? + 35 │ 88888888 ? + 36 ~ │ */ +───────┴──────────────────────────────────────────────────────────────────────── diff --git a/tests/snapshots/output/tabs_8.snapshot.txt b/tests/snapshots/output/tabs_8.snapshot.txt new file mode 100644 index 00000000..221306da --- /dev/null +++ b/tests/snapshots/output/tabs_8.snapshot.txt @@ -0,0 +1,40 @@ +───────┬──────────────────────────────────────────────────────────────────────── + │ File: sample.rs +───────┼──────────────────────────────────────────────────────────────────────── + 1 │ struct Rectangle { + 2 │ width: u32, + 3 │ height: u32, + 4 │ } + 5 │ + 6 _ │ fn main() { + 7 │ let rect1 = Rectangle { width: 30, height: 50 }; + 8 │ + 9 │ println!( + 10 ~ │ "The perimeter of the rectangle is {} pixels.", + 11 ~ │ perimeter(&rect1) + 12 │ ); + 13 + │ println!(r#"This line contains invalid utf8: "�����"#; + 14 │ } + 15 │ + 16 │ fn area(rectangle: &Rectangle) -> u32 { + 17 │ rectangle.width * rectangle.height + 18 │ } + 19 │ + 20 + │ fn perimeter(rectangle: &Rectangle) -> u32 { + 21 + │ (rectangle.width + rectangle.height) * 2 + 22 + │ } + 23 + │ + 24 │ // Tab alignment: + 25 │ /* + 26 │ Indent + 27 │ 1 2 3 4 + 28 │ 1 ? + 29 │ 22 ? + 30 │ 333 ? + 31 │ 4444 ? + 32 │ 55555 ? + 33 │ 666666 ? + 34 │ 7777777 ? + 35 │ 88888888 ? + 36 ~ │ */ +───────┴──────────────────────────────────────────────────────────────────────── diff --git a/tests/snapshots/output/changes,grid,header,numbers.snapshot.txt b/tests/snapshots/output/tabs_passthrough.snapshot.txt similarity index 84% rename from tests/snapshots/output/changes,grid,header,numbers.snapshot.txt rename to tests/snapshots/output/tabs_passthrough.snapshot.txt index cee4737f..3ad018a1 100644 --- a/tests/snapshots/output/changes,grid,header,numbers.snapshot.txt +++ b/tests/snapshots/output/tabs_passthrough.snapshot.txt @@ -19,8 +19,22 @@ 16 │ fn area(rectangle: &Rectangle) -> u32 { 17 │ rectangle.width * rectangle.height 18 │ } - 19 + │ + 19 │ 20 + │ fn perimeter(rectangle: &Rectangle) -> u32 { 21 + │ (rectangle.width + rectangle.height) * 2 22 + │ } + 23 + │ + 24 │ // Tab alignment: + 25 │ /* + 26 │ Indent + 27 │ 1 2 3 4 + 28 │ 1 ? + 29 │ 22 ? + 30 │ 333 ? + 31 │ 4444 ? + 32 │ 55555 ? + 33 │ 666666 ? + 34 │ 7777777 ? + 35 │ 88888888 ? + 36 ~ │ */ ───────┴──────────────────────────────────────────────────────────────────────── From eb6e43b9a91e1b3d59b208dad8c3889f1ddbc0c8 Mon Sep 17 00:00:00 2001 From: eth-p <32112321+eth-p@users.noreply.github.com> Date: Mon, 10 Sep 2018 20:12:13 -0700 Subject: [PATCH 09/24] Disabled tab expansion when decorations and pager are not used. --- src/app.rs | 400 +++++++++++++++++++++++++++-------------------------- 1 file changed, 204 insertions(+), 196 deletions(-) diff --git a/src/app.rs b/src/app.rs index f2e2a84c..3ab76366 100644 --- a/src/app.rs +++ b/src/app.rs @@ -16,7 +16,7 @@ use errors::*; use line_range::LineRange; use style::{OutputComponent, OutputComponents, OutputWrap}; -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone, Copy, PartialEq)] pub enum PagingMode { Always, QuitIfOneScreen, @@ -133,7 +133,7 @@ impl App { to read from standard input.", ).multiple(true) .empty_values(false), - ) + ) .arg( Arg::with_name("language") .short("l") @@ -147,204 +147,204 @@ impl App { language names and file extensions." ).takes_value(true), ).arg( - Arg::with_name("list-languages") - .long("list-languages") - .conflicts_with("list-themes") - .help("Display all supported languages.") - .long_help("Display a list of supported languages for syntax highlighting."), - ).arg( - Arg::with_name("theme") - .long("theme") - .overrides_with("theme") - .takes_value(true) - .help("Set the color theme for syntax highlighting.") - .long_help( - "Set the theme for syntax highlighting. Use '--list-themes' to \ + Arg::with_name("list-languages") + .long("list-languages") + .conflicts_with("list-themes") + .help("Display all supported languages.") + .long_help("Display a list of supported languages for syntax highlighting."), + ).arg( + Arg::with_name("theme") + .long("theme") + .overrides_with("theme") + .takes_value(true) + .help("Set the color theme for syntax highlighting.") + .long_help( + "Set the theme for syntax highlighting. Use '--list-themes' to \ see all available themes. To set a default theme, export the \ BAT_THEME environment variable (e.g.: export \ BAT_THEME=\"TwoDark\").", - ), - ).arg( - Arg::with_name("list-themes") - .long("list-themes") - .help("Display all supported highlighting themes.") - .long_help("Display a list of supported themes for syntax highlighting."), - ).arg( - Arg::with_name("style") - .long("style") - .value_name("style-components") - .use_delimiter(true) - .takes_value(true) - .possible_values(&[ - "auto", "full", "plain", "changes", "header", "grid", "numbers", - ]).default_value("auto") - .help("Comma-separated list of style elements to display.") - .long_help( - "Configure which elements (line numbers, file headers, grid \ + ), + ).arg( + Arg::with_name("list-themes") + .long("list-themes") + .help("Display all supported highlighting themes.") + .long_help("Display a list of supported themes for syntax highlighting."), + ).arg( + Arg::with_name("style") + .long("style") + .value_name("style-components") + .use_delimiter(true) + .takes_value(true) + .possible_values(&[ + "auto", "full", "plain", "changes", "header", "grid", "numbers", + ]).default_value("auto") + .help("Comma-separated list of style elements to display.") + .long_help( + "Configure which elements (line numbers, file headers, grid \ borders, Git modifications, ..) to display in addition to the \ file contents. The argument is a comma-separated list of \ components to display (e.g. 'numbers,changes,grid') or a \ pre-defined style ('full')", - ), - ).arg( - Arg::with_name("plain") - .overrides_with("plain") - .short("p") - .long("plain") - .conflicts_with("style") - .conflicts_with("number") - .help("Show plain style (alias for '--style=plain').") - .long_help( - "Only show plain style, no decorations. This is an alias for \ + ), + ).arg( + Arg::with_name("plain") + .overrides_with("plain") + .short("p") + .long("plain") + .conflicts_with("style") + .conflicts_with("number") + .help("Show plain style (alias for '--style=plain').") + .long_help( + "Only show plain style, no decorations. This is an alias for \ '--style=plain'", - ), - ).arg( - Arg::with_name("number") - .long("number") - .overrides_with("number") - .short("n") - .conflicts_with("style") - .help("Show line numbers (alias for '--style=numbers').") - .long_help( - "Only show line numbers, no other decorations. This is an alias for \ + ), + ).arg( + Arg::with_name("number") + .long("number") + .overrides_with("number") + .short("n") + .conflicts_with("style") + .help("Show line numbers (alias for '--style=numbers').") + .long_help( + "Only show line numbers, no other decorations. This is an alias for \ '--style=numbers'", - ), - ).arg( - Arg::with_name("line-range") - .long("line-range") - .overrides_with("line-range") - .takes_value(true) - .value_name("N:M") - .help("Only print the lines from N to M.") - .long_help( - "Only print the specified range of lines for each file. \ + ), + ).arg( + Arg::with_name("line-range") + .long("line-range") + .overrides_with("line-range") + .takes_value(true) + .value_name("N:M") + .help("Only print the lines from N to M.") + .long_help( + "Only print the specified range of lines for each file. \ For example:\n \ '--line-range 30:40' prints lines 30 to 40\n \ '--line-range :40' prints lines 1 to 40\n \ '--line-range 40:' prints lines 40 to the end of the file", - ), - ).arg( - Arg::with_name("color") - .long("color") - .overrides_with("color") - .takes_value(true) - .value_name("when") - .possible_values(&["auto", "never", "always"]) - .default_value("auto") - .help("When to use colors.") - .long_help("Specify when to use colored output. The automatic mode \ + ), + ).arg( + Arg::with_name("color") + .long("color") + .overrides_with("color") + .takes_value(true) + .value_name("when") + .possible_values(&["auto", "never", "always"]) + .default_value("auto") + .help("When to use colors.") + .long_help("Specify when to use colored output. The automatic mode \ only enables colors if an interactive terminal is detected."), - ).arg( - Arg::with_name("decorations") - .long("decorations") - .overrides_with("decorations") - .takes_value(true) - .value_name("when") - .possible_values(&["auto", "never", "always"]) - .default_value("auto") - .help("When to show the decorations specified by '--style'.") - .long_help("Specify when to use the decorations that have been specified \ + ).arg( + Arg::with_name("decorations") + .long("decorations") + .overrides_with("decorations") + .takes_value(true) + .value_name("when") + .possible_values(&["auto", "never", "always"]) + .default_value("auto") + .help("When to show the decorations specified by '--style'.") + .long_help("Specify when to use the decorations that have been specified \ via '--style'. The automatic mode only enables decorations if \ an interactive terminal is detected."), - ).arg( - Arg::with_name("paging") - .long("paging") - .overrides_with("paging") - .takes_value(true) - .value_name("when") - .possible_values(&["auto", "never", "always"]) - .default_value("auto") - .help("Specify when to use the pager.") - .long_help("Specify when to use the pager. To control which pager \ + ).arg( + Arg::with_name("paging") + .long("paging") + .overrides_with("paging") + .takes_value(true) + .value_name("when") + .possible_values(&["auto", "never", "always"]) + .default_value("auto") + .help("Specify when to use the pager.") + .long_help("Specify when to use the pager. To control which pager \ is used, set the PAGER or BAT_PAGER environment \ variables (the latter takes precedence). The default \ pager is 'less'. To disable the pager permanently, set \ BAT_PAGER to an empty string."), - ).arg( - Arg::with_name("wrap") - .long("wrap") - .overrides_with("wrap") - .takes_value(true) - .value_name("mode") - .possible_values(&["auto", "never", "character"]) - .default_value("auto") - .help("Specify the text-wrapping mode.") - .long_help("Specify the text-wrapping mode."), - ).arg( - Arg::with_name("unbuffered") - .short("u") - .hidden_short_help(true) - .long_help( - "This option exists for POSIX-compliance reasons ('u' is for \ + ).arg( + Arg::with_name("wrap") + .long("wrap") + .overrides_with("wrap") + .takes_value(true) + .value_name("mode") + .possible_values(&["auto", "never", "character"]) + .default_value("auto") + .help("Specify the text-wrapping mode.") + .long_help("Specify the text-wrapping mode."), + ).arg( + Arg::with_name("unbuffered") + .short("u") + .hidden_short_help(true) + .long_help( + "This option exists for POSIX-compliance reasons ('u' is for \ 'unbuffered'). The output is always unbuffered - this option \ is simply ignored.", - ), - ).arg( - Arg::with_name("tabs") - .long("tabs") - .short("t") - .takes_value(true) - .value_name("width") - .help("Sets the tab width.") - .long_help("Sets the tab width. Use a width of 0 to pass tabs through \ + ), + ).arg( + Arg::with_name("tabs") + .long("tabs") + .short("t") + .takes_value(true) + .value_name("width") + .help("Sets the tab width.") + .long_help("Sets the tab width. Use a width of 0 to pass tabs through \ directly"), - ).arg( - Arg::with_name("terminal-width") - .long("terminal-width") - .takes_value(true) - .value_name("width") - .hidden(true) - .help("Set the width of the terminal"), - ).subcommand( - SubCommand::with_name("cache") - .about("Modify the syntax-definition and theme cache") - .arg( - Arg::with_name("init") - .long("init") - .short("i") - .help("Initialize the syntax/theme cache.") - .long_help( - "Initialize the syntax/theme cache by loading from the \ + ).arg( + Arg::with_name("terminal-width") + .long("terminal-width") + .takes_value(true) + .value_name("width") + .hidden(true) + .help("Set the width of the terminal"), + ).subcommand( + SubCommand::with_name("cache") + .about("Modify the syntax-definition and theme cache") + .arg( + Arg::with_name("init") + .long("init") + .short("i") + .help("Initialize the syntax/theme cache.") + .long_help( + "Initialize the syntax/theme cache by loading from the \ source directory (default: the configuration directory).", - ), - ).arg( - Arg::with_name("clear") - .long("clear") - .short("c") - .help("Remove the cached syntax definitions and themes."), - ).arg( - Arg::with_name("config-dir") - .long("config-dir") - .short("d") - .help("Show bat's configuration directory."), - ).group( - ArgGroup::with_name("cache-actions") - .args(&["init", "clear", "config-dir"]) - .required(arg_group_required), - ).arg( - Arg::with_name("source") - .long("source") - .requires("init") - .takes_value(true) - .value_name("dir") - .help("Use a different directory to load syntaxes and themes from."), - ).arg( - Arg::with_name("target") - .long("target") - .requires("init") - .takes_value(true) - .value_name("dir") - .help( - "Use a different directory to store the cached syntax and theme set.", - ), - ).arg( - Arg::with_name("blank") - .long("blank") - .requires("init") - .help("Create completely new syntax and theme sets \ - (instead of appending to the default sets).") + ), + ).arg( + Arg::with_name("clear") + .long("clear") + .short("c") + .help("Remove the cached syntax definitions and themes."), + ).arg( + Arg::with_name("config-dir") + .long("config-dir") + .short("d") + .help("Show bat's configuration directory."), + ).group( + ArgGroup::with_name("cache-actions") + .args(&["init", "clear", "config-dir"]) + .required(arg_group_required), + ).arg( + Arg::with_name("source") + .long("source") + .requires("init") + .takes_value(true) + .value_name("dir") + .help("Use a different directory to load syntaxes and themes from."), + ).arg( + Arg::with_name("target") + .long("target") + .requires("init") + .takes_value(true) + .value_name("dir") + .help( + "Use a different directory to store the cached syntax and theme set.", ), - ).help_message("Print this help message.") + ).arg( + Arg::with_name("blank") + .long("blank") + .requires("init") + .help("Create completely new syntax and theme sets \ + (instead of appending to the default sets).") + ), + ).help_message("Print this help message.") .version_message("Show version information.") .get_matches() } @@ -353,6 +353,27 @@ impl App { let files = self.files(); let output_components = self.output_components()?; + let paging_mode = match self.matches.value_of("paging") { + Some("always") => PagingMode::Always, + Some("never") => PagingMode::Never, + Some("auto") | _ => if files.contains(&InputFile::StdIn) { + // If we are reading from stdin, only enable paging if we write to an + // interactive terminal and if we do not *read* from an interactive + // terminal. + if self.interactive_output && !atty::is(Stream::Stdin) { + PagingMode::QuitIfOneScreen + } else { + PagingMode::Never + } + } else { + if self.interactive_output { + PagingMode::QuitIfOneScreen + } else { + PagingMode::Never + } + }, + }; + Ok(Config { true_color: is_truecolor_terminal(), language: self.matches.value_of("language"), @@ -376,26 +397,7 @@ impl App { Some("never") => false, Some("auto") | _ => self.interactive_output, }, - paging_mode: match self.matches.value_of("paging") { - Some("always") => PagingMode::Always, - Some("never") => PagingMode::Never, - Some("auto") | _ => if files.contains(&InputFile::StdIn) { - // If we are reading from stdin, only enable paging if we write to an - // interactive terminal and if we do not *read* from an interactive - // terminal. - if self.interactive_output && !atty::is(Stream::Stdin) { - PagingMode::QuitIfOneScreen - } else { - PagingMode::Never - } - } else { - if self.interactive_output { - PagingMode::QuitIfOneScreen - } else { - PagingMode::Never - } - }, - }, + paging_mode, term_width: self .matches .value_of("terminal-width") @@ -410,7 +412,13 @@ impl App { .value_of("tabs") .and_then(|w| w.parse().ok()) .or_else(|| env::var("BAT_TABS").ok().and_then(|w| w.parse().ok())) - .unwrap_or(8), + .unwrap_or( + if output_components.plain() && paging_mode == PagingMode::Never { + 0 + } else { + 8 + }, + ), theme: self .matches .value_of("theme") From f0d936763c552c3c5ca913333c0aef3a9d43900d Mon Sep 17 00:00:00 2001 From: rachitchokshi <36342425+rachitchokshi@users.noreply.github.com> Date: Tue, 11 Sep 2018 12:03:53 -0700 Subject: [PATCH 10/24] provide armhf deb packages (#301) * Enabled deb packaging for armhf architecture closes #280. --- ci/before_deploy.bash | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ci/before_deploy.bash b/ci/before_deploy.bash index 913fce44..16cb261c 100755 --- a/ci/before_deploy.bash +++ b/ci/before_deploy.bash @@ -66,6 +66,10 @@ make_deb() { architecture=arm64 gcc_prefix="aarch64-linux-gnu-" ;; + arm*hf) + architecture=armhf + gcc_prefix="arm-linux-gnueabihf-" + ;; *) echo "make_deb: skipping target '${TARGET}'" >&2 return 0 From 4e3ab4d39915979592c23318bbdb9b5c43b7b9ea Mon Sep 17 00:00:00 2001 From: shik Chen Date: Tue, 11 Sep 2018 14:47:49 +0800 Subject: [PATCH 11/24] Query git diff only when needed In large git repo like chromium, it takes too long time to query git diff. --- src/printer.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/printer.rs b/src/printer.rs index 10a44fba..552c0869 100644 --- a/src/printer.rs +++ b/src/printer.rs @@ -113,9 +113,13 @@ impl<'a> InteractivePrinter<'a> { } // Get the Git modifications - let line_changes = match file { - InputFile::Ordinary(filename) => get_git_diff(filename), - _ => None, + let line_changes = if config.output_components.changes() { + match file { + InputFile::Ordinary(filename) => get_git_diff(filename), + _ => None, + } + } else { + None }; // Determine the type of syntax for highlighting From b4096e562726292fa61bf9548b6ab055df31c898 Mon Sep 17 00:00:00 2001 From: eth-p <32112321+eth-p@users.noreply.github.com> Date: Tue, 11 Sep 2018 13:02:22 -0700 Subject: [PATCH 12/24] Moved tab expansion to happen after syntax highlighting. --- src/preprocessor.rs | 3 +-- src/printer.rs | 25 +++++++++++++++++-------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/preprocessor.rs b/src/preprocessor.rs index 5d266abf..f2970429 100644 --- a/src/preprocessor.rs +++ b/src/preprocessor.rs @@ -1,9 +1,8 @@ use console::AnsiCodeIterator; /// Expand tabs like an ANSI-enabled expand(1). -pub fn expand(line: &str, width: usize) -> String { +pub fn expand(line: &str, width: usize, mut cursor: usize) -> String { let mut buffer = String::with_capacity(line.len() * 2); - let mut cursor = 0; for chunk in AnsiCodeIterator::new(line) { match chunk { diff --git a/src/printer.rs b/src/printer.rs index dc0137da..3e5cb16e 100644 --- a/src/printer.rs +++ b/src/printer.rs @@ -149,6 +149,14 @@ impl<'a> InteractivePrinter<'a> { Ok(()) } + + fn preprocess(&self, text: &str, cursor: usize) -> String { + if self.config.tab_width > 0 { + expand(text, self.config.tab_width, cursor) + } else { + text.to_string() + } + } } impl<'a> Printer for InteractivePrinter<'a> { @@ -201,12 +209,7 @@ impl<'a> Printer for InteractivePrinter<'a> { line_number: usize, line_buffer: &[u8], ) -> Result<()> { - let mut line = String::from_utf8_lossy(&line_buffer).to_string(); - - // Preprocess. - if self.config.tab_width > 0 { - line = expand(&line, self.config.tab_width); - } + let line = String::from_utf8_lossy(&line_buffer).to_string(); // Highlight. let regions = self.highlighter.highlight(line.as_ref()); @@ -218,6 +221,7 @@ impl<'a> Printer for InteractivePrinter<'a> { let mut cursor: usize = 0; let mut cursor_max: usize = self.config.term_width; + let mut cursor_total: usize = 0; let mut panel_wrap: Option = None; // Line decorations. @@ -246,7 +250,7 @@ impl<'a> Printer for InteractivePrinter<'a> { .iter() .map(|&(style, text)| as_terminal_escaped( style, - text, + &*self.preprocess(text, 0), true_color, colored_output, )).collect::>() @@ -274,7 +278,10 @@ impl<'a> Printer for InteractivePrinter<'a> { // Regular text. (text, false) => { - let text = text.trim_right_matches(|c| c == '\r' || c == '\n'); + let text = self.preprocess( + text.trim_right_matches(|c| c == '\r' || c == '\n'), + cursor_total, + ); let mut chars = text.chars(); let mut remaining = text.chars().count(); @@ -285,6 +292,7 @@ impl<'a> Printer for InteractivePrinter<'a> { if remaining <= available { let text = chars.by_ref().take(remaining).collect::(); cursor += remaining; + cursor_total += remaining; write!( handle, @@ -322,6 +330,7 @@ impl<'a> Printer for InteractivePrinter<'a> { // It wraps. let text = chars.by_ref().take(available).collect::(); cursor = 0; + cursor_total += available; remaining -= available; write!( From d90797f8e947f01da74fd2aa065f48df3e50ab0b Mon Sep 17 00:00:00 2001 From: eth-p <32112321+eth-p@users.noreply.github.com> Date: Tue, 11 Sep 2018 13:45:49 -0700 Subject: [PATCH 13/24] Fixed tab expansion not working in --wrap=never mode. --- src/preprocessor.rs | 10 +++++----- src/printer.rs | 29 ++++++++++++----------------- 2 files changed, 17 insertions(+), 22 deletions(-) diff --git a/src/preprocessor.rs b/src/preprocessor.rs index f2970429..0a99e07d 100644 --- a/src/preprocessor.rs +++ b/src/preprocessor.rs @@ -1,7 +1,7 @@ use console::AnsiCodeIterator; /// Expand tabs like an ANSI-enabled expand(1). -pub fn expand(line: &str, width: usize, mut cursor: usize) -> String { +pub fn expand(line: &str, width: usize, cursor: &mut usize) -> String { let mut buffer = String::with_capacity(line.len() * 2); for chunk in AnsiCodeIterator::new(line) { @@ -11,20 +11,20 @@ pub fn expand(line: &str, width: usize, mut cursor: usize) -> String { while let Some(index) = text.find('\t') { // Add previous text. if index > 0 { - cursor += index; + *cursor += index; buffer.push_str(&text[0..index]); } // Add tab. - let spaces = width - (cursor % width); - cursor += spaces; + let spaces = width - (*cursor % width); + *cursor += spaces; buffer.push_str(&*" ".repeat(spaces)); // Next. text = &text[index + 1..text.len()]; } - cursor += text.len(); + *cursor += text.len(); buffer.push_str(text); } } diff --git a/src/printer.rs b/src/printer.rs index 3e5cb16e..ae9823f6 100644 --- a/src/printer.rs +++ b/src/printer.rs @@ -150,7 +150,7 @@ impl<'a> InteractivePrinter<'a> { Ok(()) } - fn preprocess(&self, text: &str, cursor: usize) -> String { + fn preprocess(&self, text: &str, cursor: &mut usize) -> String { if self.config.tab_width > 0 { expand(text, self.config.tab_width, cursor) } else { @@ -243,19 +243,15 @@ impl<'a> Printer for InteractivePrinter<'a> { let true_color = self.config.true_color; let colored_output = self.config.colored_output; - write!( - handle, - "{}", - regions - .iter() - .map(|&(style, text)| as_terminal_escaped( - style, - &*self.preprocess(text, 0), - true_color, - colored_output, - )).collect::>() - .join("") - )?; + for &(style, region) in regions.iter() { + let text = &*self.preprocess(region, &mut cursor_total); + write!(handle, "{}", as_terminal_escaped( + style, + &*text, + true_color, + colored_output, + ))?; + } } else { for &(style, region) in regions.iter() { let mut ansi_iterator = AnsiCodeIterator::new(region); @@ -280,8 +276,9 @@ impl<'a> Printer for InteractivePrinter<'a> { (text, false) => { let text = self.preprocess( text.trim_right_matches(|c| c == '\r' || c == '\n'), - cursor_total, + &mut cursor_total, ); + let mut chars = text.chars(); let mut remaining = text.chars().count(); @@ -292,7 +289,6 @@ impl<'a> Printer for InteractivePrinter<'a> { if remaining <= available { let text = chars.by_ref().take(remaining).collect::(); cursor += remaining; - cursor_total += remaining; write!( handle, @@ -330,7 +326,6 @@ impl<'a> Printer for InteractivePrinter<'a> { // It wraps. let text = chars.by_ref().take(available).collect::(); cursor = 0; - cursor_total += available; remaining -= available; write!( From c1e1f753cfdae56dc3777e6e512bdb0b56ef3750 Mon Sep 17 00:00:00 2001 From: eth-p <32112321+eth-p@users.noreply.github.com> Date: Tue, 11 Sep 2018 13:47:01 -0700 Subject: [PATCH 14/24] Added three new snapshot tests for --tabs and --wrap. --- tests/snapshots/generate_snapshots.py | 9 ++-- .../output/tabs_4_wrapped.snapshot.txt | 40 ++++++++++++++++ .../output/tabs_8_wrapped.snapshot.txt | 40 ++++++++++++++++ .../tabs_passthrough_wrapped.snapshot.txt | 40 ++++++++++++++++ tests/tester.rs | 3 +- tests/tests.rs | 47 ++++++++++--------- 6 files changed, 153 insertions(+), 26 deletions(-) create mode 100644 tests/snapshots/output/tabs_4_wrapped.snapshot.txt create mode 100644 tests/snapshots/output/tabs_8_wrapped.snapshot.txt create mode 100644 tests/snapshots/output/tabs_passthrough_wrapped.snapshot.txt diff --git a/tests/snapshots/generate_snapshots.py b/tests/snapshots/generate_snapshots.py index ea130a4f..7a4798ff 100755 --- a/tests/snapshots/generate_snapshots.py +++ b/tests/snapshots/generate_snapshots.py @@ -15,9 +15,12 @@ def generate_snapshots(): for style in collective_styles: generate_style_snapshot(style) - generate_snapshot("tabs_passthrough", "--tabs=0 --style=full") - generate_snapshot("tabs_4", "--tabs=4 --style=full") - generate_snapshot("tabs_8", "--tabs=8 --style=full") + generate_snapshot("tabs_passthrough", "--tabs=0 --style=full --wrap=never") + generate_snapshot("tabs_passthrough_wrapped", "--tabs=0 --style=full --wrap=character") + generate_snapshot("tabs_4", "--tabs=4 --style=full --wrap=never") + generate_snapshot("tabs_4_wrapped", "--tabs=4 --style=full --wrap=character") + generate_snapshot("tabs_8", "--tabs=8 --style=full --wrap=never") + generate_snapshot("tabs_8_wrapped", "--tabs=8 --style=full --wrap=character") def generate_style_snapshot(style): generate_snapshot(style.replace(",","_"), "--style={}".format(style)) diff --git a/tests/snapshots/output/tabs_4_wrapped.snapshot.txt b/tests/snapshots/output/tabs_4_wrapped.snapshot.txt new file mode 100644 index 00000000..87689c7b --- /dev/null +++ b/tests/snapshots/output/tabs_4_wrapped.snapshot.txt @@ -0,0 +1,40 @@ +───────┬──────────────────────────────────────────────────────────────────────── + │ File: sample.rs +───────┼──────────────────────────────────────────────────────────────────────── + 1 │ struct Rectangle { + 2 │ width: u32, + 3 │ height: u32, + 4 │ } + 5 │ + 6 _ │ fn main() { + 7 │ let rect1 = Rectangle { width: 30, height: 50 }; + 8 │ + 9 │ println!( + 10 ~ │ "The perimeter of the rectangle is {} pixels.", + 11 ~ │ perimeter(&rect1) + 12 │ ); + 13 + │ println!(r#"This line contains invalid utf8: "�����"#; + 14 │ } + 15 │ + 16 │ fn area(rectangle: &Rectangle) -> u32 { + 17 │ rectangle.width * rectangle.height + 18 │ } + 19 │ + 20 + │ fn perimeter(rectangle: &Rectangle) -> u32 { + 21 + │ (rectangle.width + rectangle.height) * 2 + 22 + │ } + 23 + │ + 24 │ // Tab alignment: + 25 │ /* + 26 │ Indent + 27 │ 1 2 3 4 + 28 │ 1 ? + 29 │ 22 ? + 30 │ 333 ? + 31 │ 4444 ? + 32 │ 55555 ? + 33 │ 666666 ? + 34 │ 7777777 ? + 35 │ 88888888 ? + 36 ~ │ */ +───────┴──────────────────────────────────────────────────────────────────────── diff --git a/tests/snapshots/output/tabs_8_wrapped.snapshot.txt b/tests/snapshots/output/tabs_8_wrapped.snapshot.txt new file mode 100644 index 00000000..221306da --- /dev/null +++ b/tests/snapshots/output/tabs_8_wrapped.snapshot.txt @@ -0,0 +1,40 @@ +───────┬──────────────────────────────────────────────────────────────────────── + │ File: sample.rs +───────┼──────────────────────────────────────────────────────────────────────── + 1 │ struct Rectangle { + 2 │ width: u32, + 3 │ height: u32, + 4 │ } + 5 │ + 6 _ │ fn main() { + 7 │ let rect1 = Rectangle { width: 30, height: 50 }; + 8 │ + 9 │ println!( + 10 ~ │ "The perimeter of the rectangle is {} pixels.", + 11 ~ │ perimeter(&rect1) + 12 │ ); + 13 + │ println!(r#"This line contains invalid utf8: "�����"#; + 14 │ } + 15 │ + 16 │ fn area(rectangle: &Rectangle) -> u32 { + 17 │ rectangle.width * rectangle.height + 18 │ } + 19 │ + 20 + │ fn perimeter(rectangle: &Rectangle) -> u32 { + 21 + │ (rectangle.width + rectangle.height) * 2 + 22 + │ } + 23 + │ + 24 │ // Tab alignment: + 25 │ /* + 26 │ Indent + 27 │ 1 2 3 4 + 28 │ 1 ? + 29 │ 22 ? + 30 │ 333 ? + 31 │ 4444 ? + 32 │ 55555 ? + 33 │ 666666 ? + 34 │ 7777777 ? + 35 │ 88888888 ? + 36 ~ │ */ +───────┴──────────────────────────────────────────────────────────────────────── diff --git a/tests/snapshots/output/tabs_passthrough_wrapped.snapshot.txt b/tests/snapshots/output/tabs_passthrough_wrapped.snapshot.txt new file mode 100644 index 00000000..3ad018a1 --- /dev/null +++ b/tests/snapshots/output/tabs_passthrough_wrapped.snapshot.txt @@ -0,0 +1,40 @@ +───────┬──────────────────────────────────────────────────────────────────────── + │ File: sample.rs +───────┼──────────────────────────────────────────────────────────────────────── + 1 │ struct Rectangle { + 2 │ width: u32, + 3 │ height: u32, + 4 │ } + 5 │ + 6 _ │ fn main() { + 7 │ let rect1 = Rectangle { width: 30, height: 50 }; + 8 │ + 9 │ println!( + 10 ~ │ "The perimeter of the rectangle is {} pixels.", + 11 ~ │ perimeter(&rect1) + 12 │ ); + 13 + │ println!(r#"This line contains invalid utf8: "�����"#; + 14 │ } + 15 │ + 16 │ fn area(rectangle: &Rectangle) -> u32 { + 17 │ rectangle.width * rectangle.height + 18 │ } + 19 │ + 20 + │ fn perimeter(rectangle: &Rectangle) -> u32 { + 21 + │ (rectangle.width + rectangle.height) * 2 + 22 + │ } + 23 + │ + 24 │ // Tab alignment: + 25 │ /* + 26 │ Indent + 27 │ 1 2 3 4 + 28 │ 1 ? + 29 │ 22 ? + 30 │ 333 ? + 31 │ 4444 ? + 32 │ 55555 ? + 33 │ 666666 ? + 34 │ 7777777 ? + 35 │ 88888888 ? + 36 ~ │ */ +───────┴──────────────────────────────────────────────────────────────────────── diff --git a/tests/tester.rs b/tests/tester.rs index c7f46c03..2c8de48d 100644 --- a/tests/tester.rs +++ b/tests/tester.rs @@ -38,13 +38,14 @@ impl BatTester { BatTester { temp_dir, exe } } - pub fn test_snapshot(&self, name: &str, style: &str, tab_width: u32) { + pub fn test_snapshot(&self, name: &str, style: &str, tab_width: u32, wrap: bool) { let output = Command::new(&self.exe) .current_dir(self.temp_dir.path()) .args(&[ "sample.rs", "--decorations=always", "--terminal-width=80", + &format!("--wrap={}", if wrap { "character" } else { "never" }), &format!("--tabs={}", tab_width), &format!("--style={}", style), ]).output() diff --git a/tests/tests.rs b/tests/tests.rs index 906bad4a..5c9967a2 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -3,36 +3,39 @@ mod tester; use tester::BatTester; macro_rules! snapshot_tests { - ($($test_name: ident: $style: expr => [tabs: $tabs:expr],)*) => { + ($($test_name: ident: $style: expr => [wrap: $wrap:expr, tabs: $tabs:expr],)*) => { $( #[test] fn $test_name() { let bat_tester = BatTester::new(); - bat_tester.test_snapshot(stringify!($test_name), $style, $tabs); + bat_tester.test_snapshot(stringify!($test_name), $style, $tabs, $wrap); } )* }; } snapshot_tests! { - changes: "changes" => [tabs: 8], - grid: "grid" => [tabs: 8], - header: "header" => [tabs: 8], - numbers: "numbers" => [tabs: 8], - changes_grid: "changes,grid" => [tabs: 8], - changes_header: "changes,header" => [tabs: 8], - changes_numbers: "changes,numbers" => [tabs: 8], - grid_header: "grid,header" => [tabs: 8], - grid_numbers: "grid,numbers" => [tabs: 8], - header_numbers: "header,numbers" => [tabs: 8], - changes_grid_header: "changes,grid,header" => [tabs: 8], - changes_grid_numbers: "changes,grid,numbers" => [tabs: 8], - changes_header_numbers: "changes,header,numbers" => [tabs: 8], - grid_header_numbers: "grid,header,numbers" => [tabs: 8], - changes_grid_header_numbers: "changes,grid,header,numbers" => [tabs: 8], - full: "full" => [tabs: 8], - plain: "plain" => [tabs: 8], - tabs_passthrough: "full" => [tabs: 0], - tabs_4: "full" => [tabs: 4], - tabs_8: "full" => [tabs: 8], + changes: "changes" => [wrap: false, tabs: 8], + grid: "grid" => [wrap: false, tabs: 8], + header: "header" => [wrap: false, tabs: 8], + numbers: "numbers" => [wrap: false, tabs: 8], + changes_grid: "changes,grid" => [wrap: false, tabs: 8], + changes_header: "changes,header" => [wrap: false, tabs: 8], + changes_numbers: "changes,numbers" => [wrap: false, tabs: 8], + grid_header: "grid,header" => [wrap: false, tabs: 8], + grid_numbers: "grid,numbers" => [wrap: false, tabs: 8], + header_numbers: "header,numbers" => [wrap: false, tabs: 8], + changes_grid_header: "changes,grid,header" => [wrap: false, tabs: 8], + changes_grid_numbers: "changes,grid,numbers" => [wrap: false, tabs: 8], + changes_header_numbers: "changes,header,numbers" => [wrap: false, tabs: 8], + grid_header_numbers: "grid,header,numbers" => [wrap: false, tabs: 8], + changes_grid_header_numbers: "changes,grid,header,numbers" => [wrap: false, tabs: 8], + full: "full" => [wrap: false, tabs: 8], + plain: "plain" => [wrap: false, tabs: 8], + tabs_passthrough_wrapped: "full" => [wrap: true, tabs: 0], + tabs_4_wrapped: "full" => [wrap: true, tabs: 4], + tabs_8_wrapped: "full" => [wrap: true, tabs: 8], + tabs_passthrough: "full" => [wrap: false, tabs: 0], + tabs_4: "full" => [wrap: false, tabs: 4], + tabs_8: "full" => [wrap: false, tabs: 8], } From 1e74f0e2a9aa74d07da0037a084a64e62ce0cac6 Mon Sep 17 00:00:00 2001 From: eth-p <32112321+eth-p@users.noreply.github.com> Date: Tue, 11 Sep 2018 13:47:35 -0700 Subject: [PATCH 15/24] Ran `cargo fmt`. --- src/printer.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/printer.rs b/src/printer.rs index ae9823f6..bc095def 100644 --- a/src/printer.rs +++ b/src/printer.rs @@ -245,12 +245,11 @@ impl<'a> Printer for InteractivePrinter<'a> { for &(style, region) in regions.iter() { let text = &*self.preprocess(region, &mut cursor_total); - write!(handle, "{}", as_terminal_escaped( - style, - &*text, - true_color, - colored_output, - ))?; + write!( + handle, + "{}", + as_terminal_escaped(style, &*text, true_color, colored_output,) + )?; } } else { for &(style, region) in regions.iter() { From 503fe0b641724be1e8f1a4827e54264f743214f5 Mon Sep 17 00:00:00 2001 From: eth-p <32112321+eth-p@users.noreply.github.com> Date: Tue, 11 Sep 2018 15:03:13 -0700 Subject: [PATCH 16/24] Fix sample.modified.rs --- tests/snapshots/sample.modified.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/snapshots/sample.modified.rs b/tests/snapshots/sample.modified.rs index 30cbdde6..afa42ab0 100644 --- a/tests/snapshots/sample.modified.rs +++ b/tests/snapshots/sample.modified.rs @@ -10,7 +10,7 @@ fn main() { "The perimeter of the rectangle is {} pixels.", perimeter(&rect1) ); - println!(r#"This line contains invalid utf8: "�����"#; + println!(r#"This line contains invalid utf8: "øˆ€€€"#; } fn area(rectangle: &Rectangle) -> u32 { From 9ef1e9f7924524d4ac62a712a306afa5d336ef87 Mon Sep 17 00:00:00 2001 From: eth-p <32112321+eth-p@users.noreply.github.com> Date: Tue, 11 Sep 2018 15:04:44 -0700 Subject: [PATCH 17/24] Update snapshots. --- tests/snapshots/output/changes.snapshot.txt | 2 +- tests/snapshots/output/changes_grid.snapshot.txt | 2 +- tests/snapshots/output/changes_grid_header.snapshot.txt | 2 +- tests/snapshots/output/changes_grid_header_numbers.snapshot.txt | 2 +- tests/snapshots/output/changes_grid_numbers.snapshot.txt | 2 +- tests/snapshots/output/changes_header.snapshot.txt | 2 +- tests/snapshots/output/changes_header_numbers.snapshot.txt | 2 +- tests/snapshots/output/changes_numbers.snapshot.txt | 2 +- tests/snapshots/output/full.snapshot.txt | 2 +- tests/snapshots/output/grid.snapshot.txt | 2 +- tests/snapshots/output/grid_header.snapshot.txt | 2 +- tests/snapshots/output/grid_header_numbers.snapshot.txt | 2 +- tests/snapshots/output/grid_numbers.snapshot.txt | 2 +- tests/snapshots/output/header.snapshot.txt | 2 +- tests/snapshots/output/header_numbers.snapshot.txt | 2 +- tests/snapshots/output/numbers.snapshot.txt | 2 +- tests/snapshots/output/plain.snapshot.txt | 2 +- tests/snapshots/output/tabs_4.snapshot.txt | 2 +- tests/snapshots/output/tabs_4_wrapped.snapshot.txt | 2 +- tests/snapshots/output/tabs_8.snapshot.txt | 2 +- tests/snapshots/output/tabs_8_wrapped.snapshot.txt | 2 +- tests/snapshots/output/tabs_passthrough.snapshot.txt | 2 +- tests/snapshots/output/tabs_passthrough_wrapped.snapshot.txt | 2 +- 23 files changed, 23 insertions(+), 23 deletions(-) diff --git a/tests/snapshots/output/changes.snapshot.txt b/tests/snapshots/output/changes.snapshot.txt index 73520d6f..be701958 100644 --- a/tests/snapshots/output/changes.snapshot.txt +++ b/tests/snapshots/output/changes.snapshot.txt @@ -10,7 +10,7 @@ _ fn main() { ~ "The perimeter of the rectangle is {} pixels.", ~ perimeter(&rect1) ); -+ println!(r#"This line contains invalid utf8: "�����"#; ++ println!(r#"This line contains invalid utf8: "øˆ€€€"#; } fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/changes_grid.snapshot.txt b/tests/snapshots/output/changes_grid.snapshot.txt index 83e75583..fe6f4730 100644 --- a/tests/snapshots/output/changes_grid.snapshot.txt +++ b/tests/snapshots/output/changes_grid.snapshot.txt @@ -10,7 +10,7 @@ _ │ fn main() { ~ │ "The perimeter of the rectangle is {} pixels.", ~ │ perimeter(&rect1) │ ); -+ │ println!(r#"This line contains invalid utf8: "�����"#; ++ │ println!(r#"This line contains invalid utf8: "øˆ€€€"#; │ } │ │ fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/changes_grid_header.snapshot.txt b/tests/snapshots/output/changes_grid_header.snapshot.txt index 0a32baa8..4f1ed4d8 100644 --- a/tests/snapshots/output/changes_grid_header.snapshot.txt +++ b/tests/snapshots/output/changes_grid_header.snapshot.txt @@ -13,7 +13,7 @@ _ │ fn main() { ~ │ "The perimeter of the rectangle is {} pixels.", ~ │ perimeter(&rect1) │ ); -+ │ println!(r#"This line contains invalid utf8: "�����"#; ++ │ println!(r#"This line contains invalid utf8: "øˆ€€€"#; │ } │ │ fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/changes_grid_header_numbers.snapshot.txt b/tests/snapshots/output/changes_grid_header_numbers.snapshot.txt index 221306da..6c17a73e 100644 --- a/tests/snapshots/output/changes_grid_header_numbers.snapshot.txt +++ b/tests/snapshots/output/changes_grid_header_numbers.snapshot.txt @@ -13,7 +13,7 @@ 10 ~ │ "The perimeter of the rectangle is {} pixels.", 11 ~ │ perimeter(&rect1) 12 │ ); - 13 + │ println!(r#"This line contains invalid utf8: "�����"#; + 13 + │ println!(r#"This line contains invalid utf8: "øˆ€€€"#; 14 │ } 15 │ 16 │ fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/changes_grid_numbers.snapshot.txt b/tests/snapshots/output/changes_grid_numbers.snapshot.txt index 1e1789ee..996dee23 100644 --- a/tests/snapshots/output/changes_grid_numbers.snapshot.txt +++ b/tests/snapshots/output/changes_grid_numbers.snapshot.txt @@ -10,7 +10,7 @@ 10 ~ │ "The perimeter of the rectangle is {} pixels.", 11 ~ │ perimeter(&rect1) 12 │ ); - 13 + │ println!(r#"This line contains invalid utf8: "�����"#; + 13 + │ println!(r#"This line contains invalid utf8: "øˆ€€€"#; 14 │ } 15 │ 16 │ fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/changes_header.snapshot.txt b/tests/snapshots/output/changes_header.snapshot.txt index 8d1d1b8a..52155151 100644 --- a/tests/snapshots/output/changes_header.snapshot.txt +++ b/tests/snapshots/output/changes_header.snapshot.txt @@ -11,7 +11,7 @@ _ fn main() { ~ "The perimeter of the rectangle is {} pixels.", ~ perimeter(&rect1) ); -+ println!(r#"This line contains invalid utf8: "�����"#; ++ println!(r#"This line contains invalid utf8: "øˆ€€€"#; } fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/changes_header_numbers.snapshot.txt b/tests/snapshots/output/changes_header_numbers.snapshot.txt index ddc32872..671e9508 100644 --- a/tests/snapshots/output/changes_header_numbers.snapshot.txt +++ b/tests/snapshots/output/changes_header_numbers.snapshot.txt @@ -11,7 +11,7 @@ 10 ~ "The perimeter of the rectangle is {} pixels.", 11 ~ perimeter(&rect1) 12 ); - 13 + println!(r#"This line contains invalid utf8: "�����"#; + 13 + println!(r#"This line contains invalid utf8: "øˆ€€€"#; 14 } 15 16 fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/changes_numbers.snapshot.txt b/tests/snapshots/output/changes_numbers.snapshot.txt index 298ee617..5637c013 100644 --- a/tests/snapshots/output/changes_numbers.snapshot.txt +++ b/tests/snapshots/output/changes_numbers.snapshot.txt @@ -10,7 +10,7 @@ 10 ~ "The perimeter of the rectangle is {} pixels.", 11 ~ perimeter(&rect1) 12 ); - 13 + println!(r#"This line contains invalid utf8: "�����"#; + 13 + println!(r#"This line contains invalid utf8: "øˆ€€€"#; 14 } 15 16 fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/full.snapshot.txt b/tests/snapshots/output/full.snapshot.txt index 221306da..6c17a73e 100644 --- a/tests/snapshots/output/full.snapshot.txt +++ b/tests/snapshots/output/full.snapshot.txt @@ -13,7 +13,7 @@ 10 ~ │ "The perimeter of the rectangle is {} pixels.", 11 ~ │ perimeter(&rect1) 12 │ ); - 13 + │ println!(r#"This line contains invalid utf8: "�����"#; + 13 + │ println!(r#"This line contains invalid utf8: "øˆ€€€"#; 14 │ } 15 │ 16 │ fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/grid.snapshot.txt b/tests/snapshots/output/grid.snapshot.txt index 45917643..9c707bd8 100644 --- a/tests/snapshots/output/grid.snapshot.txt +++ b/tests/snapshots/output/grid.snapshot.txt @@ -10,7 +10,7 @@ fn main() { "The perimeter of the rectangle is {} pixels.", perimeter(&rect1) ); - println!(r#"This line contains invalid utf8: "�����"#; + println!(r#"This line contains invalid utf8: "øˆ€€€"#; } fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/grid_header.snapshot.txt b/tests/snapshots/output/grid_header.snapshot.txt index fa74ec09..912732e5 100644 --- a/tests/snapshots/output/grid_header.snapshot.txt +++ b/tests/snapshots/output/grid_header.snapshot.txt @@ -13,7 +13,7 @@ fn main() { "The perimeter of the rectangle is {} pixels.", perimeter(&rect1) ); - println!(r#"This line contains invalid utf8: "�����"#; + println!(r#"This line contains invalid utf8: "øˆ€€€"#; } fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/grid_header_numbers.snapshot.txt b/tests/snapshots/output/grid_header_numbers.snapshot.txt index 733b9848..57fb1023 100644 --- a/tests/snapshots/output/grid_header_numbers.snapshot.txt +++ b/tests/snapshots/output/grid_header_numbers.snapshot.txt @@ -13,7 +13,7 @@ 10 │ "The perimeter of the rectangle is {} pixels.", 11 │ perimeter(&rect1) 12 │ ); - 13 │ println!(r#"This line contains invalid utf8: "�����"#; + 13 │ println!(r#"This line contains invalid utf8: "øˆ€€€"#; 14 │ } 15 │ 16 │ fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/grid_numbers.snapshot.txt b/tests/snapshots/output/grid_numbers.snapshot.txt index c7d8fb13..93a0d9e9 100644 --- a/tests/snapshots/output/grid_numbers.snapshot.txt +++ b/tests/snapshots/output/grid_numbers.snapshot.txt @@ -10,7 +10,7 @@ 10 │ "The perimeter of the rectangle is {} pixels.", 11 │ perimeter(&rect1) 12 │ ); - 13 │ println!(r#"This line contains invalid utf8: "�����"#; + 13 │ println!(r#"This line contains invalid utf8: "øˆ€€€"#; 14 │ } 15 │ 16 │ fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/header.snapshot.txt b/tests/snapshots/output/header.snapshot.txt index 6b9b5701..ade4e94f 100644 --- a/tests/snapshots/output/header.snapshot.txt +++ b/tests/snapshots/output/header.snapshot.txt @@ -11,7 +11,7 @@ fn main() { "The perimeter of the rectangle is {} pixels.", perimeter(&rect1) ); - println!(r#"This line contains invalid utf8: "�����"#; + println!(r#"This line contains invalid utf8: "øˆ€€€"#; } fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/header_numbers.snapshot.txt b/tests/snapshots/output/header_numbers.snapshot.txt index 4d445b5f..78f5d084 100644 --- a/tests/snapshots/output/header_numbers.snapshot.txt +++ b/tests/snapshots/output/header_numbers.snapshot.txt @@ -11,7 +11,7 @@ 10 "The perimeter of the rectangle is {} pixels.", 11 perimeter(&rect1) 12 ); - 13 println!(r#"This line contains invalid utf8: "�����"#; + 13 println!(r#"This line contains invalid utf8: "øˆ€€€"#; 14 } 15 16 fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/numbers.snapshot.txt b/tests/snapshots/output/numbers.snapshot.txt index 90ca33c5..25d2a3b9 100644 --- a/tests/snapshots/output/numbers.snapshot.txt +++ b/tests/snapshots/output/numbers.snapshot.txt @@ -10,7 +10,7 @@ 10 "The perimeter of the rectangle is {} pixels.", 11 perimeter(&rect1) 12 ); - 13 println!(r#"This line contains invalid utf8: "�����"#; + 13 println!(r#"This line contains invalid utf8: "øˆ€€€"#; 14 } 15 16 fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/plain.snapshot.txt b/tests/snapshots/output/plain.snapshot.txt index 7188c21f..e2ee1dff 100644 --- a/tests/snapshots/output/plain.snapshot.txt +++ b/tests/snapshots/output/plain.snapshot.txt @@ -10,7 +10,7 @@ fn main() { "The perimeter of the rectangle is {} pixels.", perimeter(&rect1) ); - println!(r#"This line contains invalid utf8: "�����"#; + println!(r#"This line contains invalid utf8: "øˆ€€€"#; } fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/tabs_4.snapshot.txt b/tests/snapshots/output/tabs_4.snapshot.txt index 87689c7b..9e667b0b 100644 --- a/tests/snapshots/output/tabs_4.snapshot.txt +++ b/tests/snapshots/output/tabs_4.snapshot.txt @@ -13,7 +13,7 @@ 10 ~ │ "The perimeter of the rectangle is {} pixels.", 11 ~ │ perimeter(&rect1) 12 │ ); - 13 + │ println!(r#"This line contains invalid utf8: "�����"#; + 13 + │ println!(r#"This line contains invalid utf8: "øˆ€€€"#; 14 │ } 15 │ 16 │ fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/tabs_4_wrapped.snapshot.txt b/tests/snapshots/output/tabs_4_wrapped.snapshot.txt index 87689c7b..9e667b0b 100644 --- a/tests/snapshots/output/tabs_4_wrapped.snapshot.txt +++ b/tests/snapshots/output/tabs_4_wrapped.snapshot.txt @@ -13,7 +13,7 @@ 10 ~ │ "The perimeter of the rectangle is {} pixels.", 11 ~ │ perimeter(&rect1) 12 │ ); - 13 + │ println!(r#"This line contains invalid utf8: "�����"#; + 13 + │ println!(r#"This line contains invalid utf8: "øˆ€€€"#; 14 │ } 15 │ 16 │ fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/tabs_8.snapshot.txt b/tests/snapshots/output/tabs_8.snapshot.txt index 221306da..6c17a73e 100644 --- a/tests/snapshots/output/tabs_8.snapshot.txt +++ b/tests/snapshots/output/tabs_8.snapshot.txt @@ -13,7 +13,7 @@ 10 ~ │ "The perimeter of the rectangle is {} pixels.", 11 ~ │ perimeter(&rect1) 12 │ ); - 13 + │ println!(r#"This line contains invalid utf8: "�����"#; + 13 + │ println!(r#"This line contains invalid utf8: "øˆ€€€"#; 14 │ } 15 │ 16 │ fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/tabs_8_wrapped.snapshot.txt b/tests/snapshots/output/tabs_8_wrapped.snapshot.txt index 221306da..6c17a73e 100644 --- a/tests/snapshots/output/tabs_8_wrapped.snapshot.txt +++ b/tests/snapshots/output/tabs_8_wrapped.snapshot.txt @@ -13,7 +13,7 @@ 10 ~ │ "The perimeter of the rectangle is {} pixels.", 11 ~ │ perimeter(&rect1) 12 │ ); - 13 + │ println!(r#"This line contains invalid utf8: "�����"#; + 13 + │ println!(r#"This line contains invalid utf8: "øˆ€€€"#; 14 │ } 15 │ 16 │ fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/tabs_passthrough.snapshot.txt b/tests/snapshots/output/tabs_passthrough.snapshot.txt index 3ad018a1..2b9a1332 100644 --- a/tests/snapshots/output/tabs_passthrough.snapshot.txt +++ b/tests/snapshots/output/tabs_passthrough.snapshot.txt @@ -13,7 +13,7 @@ 10 ~ │ "The perimeter of the rectangle is {} pixels.", 11 ~ │ perimeter(&rect1) 12 │ ); - 13 + │ println!(r#"This line contains invalid utf8: "�����"#; + 13 + │ println!(r#"This line contains invalid utf8: "øˆ€€€"#; 14 │ } 15 │ 16 │ fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/tabs_passthrough_wrapped.snapshot.txt b/tests/snapshots/output/tabs_passthrough_wrapped.snapshot.txt index 3ad018a1..2b9a1332 100644 --- a/tests/snapshots/output/tabs_passthrough_wrapped.snapshot.txt +++ b/tests/snapshots/output/tabs_passthrough_wrapped.snapshot.txt @@ -13,7 +13,7 @@ 10 ~ │ "The perimeter of the rectangle is {} pixels.", 11 ~ │ perimeter(&rect1) 12 │ ); - 13 + │ println!(r#"This line contains invalid utf8: "�����"#; + 13 + │ println!(r#"This line contains invalid utf8: "øˆ€€€"#; 14 │ } 15 │ 16 │ fn area(rectangle: &Rectangle) -> u32 { From d404139ff7484d6dbf8dbe57ec21b3b4a4176801 Mon Sep 17 00:00:00 2001 From: eth-p <32112321+eth-p@users.noreply.github.com> Date: Wed, 12 Sep 2018 10:08:58 -0700 Subject: [PATCH 18/24] Added validation for --tabs. Also added a comment to explain what 0 represents. --- src/app.rs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/app.rs b/src/app.rs index 3ab76366..5b00658c 100644 --- a/src/app.rs +++ b/src/app.rs @@ -42,6 +42,7 @@ pub struct Config<'a> { pub term_width: usize, /// The width of tab characters. + /// Currently, a value of 0 will cause tabs to be passed through without expanding them. pub tab_width: usize, /// Whether or not to simply loop through all input (`cat` mode) @@ -282,9 +283,14 @@ impl App { ).arg( Arg::with_name("tabs") .long("tabs") - .short("t") .takes_value(true) - .value_name("width") + .value_name("tabs") + .validator( + |t| t.parse::() + .map_err(|_t| "must be a number") + .map(|_t| ()) // Convert to Result<(), &str> + .map_err(|e| e.to_string()) // Convert to Result<(), String> + ) .help("Sets the tab width.") .long_help("Sets the tab width. Use a width of 0 to pass tabs through \ directly"), @@ -410,8 +416,9 @@ impl App { tab_width: self .matches .value_of("tabs") - .and_then(|w| w.parse().ok()) - .or_else(|| env::var("BAT_TABS").ok().and_then(|w| w.parse().ok())) + .map(String::from) + .or_else(|| env::var("BAT_TABS").ok()) + .and_then(|t| t.parse().ok()) .unwrap_or( if output_components.plain() && paging_mode == PagingMode::Never { 0 From b7690d4bb187ab04cd581cc4097f771498220531 Mon Sep 17 00:00:00 2001 From: sharkdp Date: Wed, 12 Sep 2018 20:28:21 +0200 Subject: [PATCH 19/24] Undo change in sample.modified.rs --- tests/snapshots/sample.modified.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/snapshots/sample.modified.rs b/tests/snapshots/sample.modified.rs index afa42ab0..866f359d 100644 --- a/tests/snapshots/sample.modified.rs +++ b/tests/snapshots/sample.modified.rs @@ -10,7 +10,7 @@ fn main() { "The perimeter of the rectangle is {} pixels.", perimeter(&rect1) ); - println!(r#"This line contains invalid utf8: "øˆ€€€"#; + println!(r#"This line contains invalid utf8: "øˆ€€€"#; } fn area(rectangle: &Rectangle) -> u32 { From 3e21d69a92a1a3bb388d75c22f3f62c41cd558cb Mon Sep 17 00:00:00 2001 From: sharkdp Date: Wed, 12 Sep 2018 20:28:30 +0200 Subject: [PATCH 20/24] Re-generate files again --- tests/snapshots/output/changes.snapshot.txt | 2 +- .../output/changes_grid.snapshot.txt | 2 +- .../output/changes_grid_header.snapshot.txt | 2 +- .../changes_grid_header_numbers.snapshot.txt | 2 +- .../output/changes_grid_numbers.snapshot.txt | 2 +- .../output/changes_header.snapshot.txt | 2 +- .../changes_header_numbers.snapshot.txt | 2 +- .../output/changes_numbers.snapshot.txt | 2 +- tests/snapshots/output/full.snapshot.txt | 2 +- tests/snapshots/output/grid.snapshot.txt | 2 +- .../snapshots/output/grid_header.snapshot.txt | 2 +- .../output/grid_header_numbers.snapshot.txt | 2 +- .../output/grid_numbers.snapshot.txt | 2 +- tests/snapshots/output/header.snapshot.txt | 2 +- .../output/header_numbers.snapshot.txt | 2 +- tests/snapshots/output/numbers.snapshot.txt | 2 +- tests/snapshots/output/plain.snapshot.txt | 22 +++++++++---------- tests/snapshots/output/tabs_4.snapshot.txt | 2 +- .../output/tabs_4_wrapped.snapshot.txt | 2 +- tests/snapshots/output/tabs_8.snapshot.txt | 2 +- .../output/tabs_8_wrapped.snapshot.txt | 2 +- .../output/tabs_passthrough.snapshot.txt | 2 +- .../tabs_passthrough_wrapped.snapshot.txt | 2 +- 23 files changed, 33 insertions(+), 33 deletions(-) diff --git a/tests/snapshots/output/changes.snapshot.txt b/tests/snapshots/output/changes.snapshot.txt index be701958..73520d6f 100644 --- a/tests/snapshots/output/changes.snapshot.txt +++ b/tests/snapshots/output/changes.snapshot.txt @@ -10,7 +10,7 @@ _ fn main() { ~ "The perimeter of the rectangle is {} pixels.", ~ perimeter(&rect1) ); -+ println!(r#"This line contains invalid utf8: "øˆ€€€"#; ++ println!(r#"This line contains invalid utf8: "�����"#; } fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/changes_grid.snapshot.txt b/tests/snapshots/output/changes_grid.snapshot.txt index fe6f4730..83e75583 100644 --- a/tests/snapshots/output/changes_grid.snapshot.txt +++ b/tests/snapshots/output/changes_grid.snapshot.txt @@ -10,7 +10,7 @@ _ │ fn main() { ~ │ "The perimeter of the rectangle is {} pixels.", ~ │ perimeter(&rect1) │ ); -+ │ println!(r#"This line contains invalid utf8: "øˆ€€€"#; ++ │ println!(r#"This line contains invalid utf8: "�����"#; │ } │ │ fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/changes_grid_header.snapshot.txt b/tests/snapshots/output/changes_grid_header.snapshot.txt index 4f1ed4d8..0a32baa8 100644 --- a/tests/snapshots/output/changes_grid_header.snapshot.txt +++ b/tests/snapshots/output/changes_grid_header.snapshot.txt @@ -13,7 +13,7 @@ _ │ fn main() { ~ │ "The perimeter of the rectangle is {} pixels.", ~ │ perimeter(&rect1) │ ); -+ │ println!(r#"This line contains invalid utf8: "øˆ€€€"#; ++ │ println!(r#"This line contains invalid utf8: "�����"#; │ } │ │ fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/changes_grid_header_numbers.snapshot.txt b/tests/snapshots/output/changes_grid_header_numbers.snapshot.txt index 6c17a73e..221306da 100644 --- a/tests/snapshots/output/changes_grid_header_numbers.snapshot.txt +++ b/tests/snapshots/output/changes_grid_header_numbers.snapshot.txt @@ -13,7 +13,7 @@ 10 ~ │ "The perimeter of the rectangle is {} pixels.", 11 ~ │ perimeter(&rect1) 12 │ ); - 13 + │ println!(r#"This line contains invalid utf8: "øˆ€€€"#; + 13 + │ println!(r#"This line contains invalid utf8: "�����"#; 14 │ } 15 │ 16 │ fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/changes_grid_numbers.snapshot.txt b/tests/snapshots/output/changes_grid_numbers.snapshot.txt index 996dee23..1e1789ee 100644 --- a/tests/snapshots/output/changes_grid_numbers.snapshot.txt +++ b/tests/snapshots/output/changes_grid_numbers.snapshot.txt @@ -10,7 +10,7 @@ 10 ~ │ "The perimeter of the rectangle is {} pixels.", 11 ~ │ perimeter(&rect1) 12 │ ); - 13 + │ println!(r#"This line contains invalid utf8: "øˆ€€€"#; + 13 + │ println!(r#"This line contains invalid utf8: "�����"#; 14 │ } 15 │ 16 │ fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/changes_header.snapshot.txt b/tests/snapshots/output/changes_header.snapshot.txt index 52155151..8d1d1b8a 100644 --- a/tests/snapshots/output/changes_header.snapshot.txt +++ b/tests/snapshots/output/changes_header.snapshot.txt @@ -11,7 +11,7 @@ _ fn main() { ~ "The perimeter of the rectangle is {} pixels.", ~ perimeter(&rect1) ); -+ println!(r#"This line contains invalid utf8: "øˆ€€€"#; ++ println!(r#"This line contains invalid utf8: "�����"#; } fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/changes_header_numbers.snapshot.txt b/tests/snapshots/output/changes_header_numbers.snapshot.txt index 671e9508..ddc32872 100644 --- a/tests/snapshots/output/changes_header_numbers.snapshot.txt +++ b/tests/snapshots/output/changes_header_numbers.snapshot.txt @@ -11,7 +11,7 @@ 10 ~ "The perimeter of the rectangle is {} pixels.", 11 ~ perimeter(&rect1) 12 ); - 13 + println!(r#"This line contains invalid utf8: "øˆ€€€"#; + 13 + println!(r#"This line contains invalid utf8: "�����"#; 14 } 15 16 fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/changes_numbers.snapshot.txt b/tests/snapshots/output/changes_numbers.snapshot.txt index 5637c013..298ee617 100644 --- a/tests/snapshots/output/changes_numbers.snapshot.txt +++ b/tests/snapshots/output/changes_numbers.snapshot.txt @@ -10,7 +10,7 @@ 10 ~ "The perimeter of the rectangle is {} pixels.", 11 ~ perimeter(&rect1) 12 ); - 13 + println!(r#"This line contains invalid utf8: "øˆ€€€"#; + 13 + println!(r#"This line contains invalid utf8: "�����"#; 14 } 15 16 fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/full.snapshot.txt b/tests/snapshots/output/full.snapshot.txt index 6c17a73e..221306da 100644 --- a/tests/snapshots/output/full.snapshot.txt +++ b/tests/snapshots/output/full.snapshot.txt @@ -13,7 +13,7 @@ 10 ~ │ "The perimeter of the rectangle is {} pixels.", 11 ~ │ perimeter(&rect1) 12 │ ); - 13 + │ println!(r#"This line contains invalid utf8: "øˆ€€€"#; + 13 + │ println!(r#"This line contains invalid utf8: "�����"#; 14 │ } 15 │ 16 │ fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/grid.snapshot.txt b/tests/snapshots/output/grid.snapshot.txt index 9c707bd8..45917643 100644 --- a/tests/snapshots/output/grid.snapshot.txt +++ b/tests/snapshots/output/grid.snapshot.txt @@ -10,7 +10,7 @@ fn main() { "The perimeter of the rectangle is {} pixels.", perimeter(&rect1) ); - println!(r#"This line contains invalid utf8: "øˆ€€€"#; + println!(r#"This line contains invalid utf8: "�����"#; } fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/grid_header.snapshot.txt b/tests/snapshots/output/grid_header.snapshot.txt index 912732e5..fa74ec09 100644 --- a/tests/snapshots/output/grid_header.snapshot.txt +++ b/tests/snapshots/output/grid_header.snapshot.txt @@ -13,7 +13,7 @@ fn main() { "The perimeter of the rectangle is {} pixels.", perimeter(&rect1) ); - println!(r#"This line contains invalid utf8: "øˆ€€€"#; + println!(r#"This line contains invalid utf8: "�����"#; } fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/grid_header_numbers.snapshot.txt b/tests/snapshots/output/grid_header_numbers.snapshot.txt index 57fb1023..733b9848 100644 --- a/tests/snapshots/output/grid_header_numbers.snapshot.txt +++ b/tests/snapshots/output/grid_header_numbers.snapshot.txt @@ -13,7 +13,7 @@ 10 │ "The perimeter of the rectangle is {} pixels.", 11 │ perimeter(&rect1) 12 │ ); - 13 │ println!(r#"This line contains invalid utf8: "øˆ€€€"#; + 13 │ println!(r#"This line contains invalid utf8: "�����"#; 14 │ } 15 │ 16 │ fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/grid_numbers.snapshot.txt b/tests/snapshots/output/grid_numbers.snapshot.txt index 93a0d9e9..c7d8fb13 100644 --- a/tests/snapshots/output/grid_numbers.snapshot.txt +++ b/tests/snapshots/output/grid_numbers.snapshot.txt @@ -10,7 +10,7 @@ 10 │ "The perimeter of the rectangle is {} pixels.", 11 │ perimeter(&rect1) 12 │ ); - 13 │ println!(r#"This line contains invalid utf8: "øˆ€€€"#; + 13 │ println!(r#"This line contains invalid utf8: "�����"#; 14 │ } 15 │ 16 │ fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/header.snapshot.txt b/tests/snapshots/output/header.snapshot.txt index ade4e94f..6b9b5701 100644 --- a/tests/snapshots/output/header.snapshot.txt +++ b/tests/snapshots/output/header.snapshot.txt @@ -11,7 +11,7 @@ fn main() { "The perimeter of the rectangle is {} pixels.", perimeter(&rect1) ); - println!(r#"This line contains invalid utf8: "øˆ€€€"#; + println!(r#"This line contains invalid utf8: "�����"#; } fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/header_numbers.snapshot.txt b/tests/snapshots/output/header_numbers.snapshot.txt index 78f5d084..4d445b5f 100644 --- a/tests/snapshots/output/header_numbers.snapshot.txt +++ b/tests/snapshots/output/header_numbers.snapshot.txt @@ -11,7 +11,7 @@ 10 "The perimeter of the rectangle is {} pixels.", 11 perimeter(&rect1) 12 ); - 13 println!(r#"This line contains invalid utf8: "øˆ€€€"#; + 13 println!(r#"This line contains invalid utf8: "�����"#; 14 } 15 16 fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/numbers.snapshot.txt b/tests/snapshots/output/numbers.snapshot.txt index 25d2a3b9..90ca33c5 100644 --- a/tests/snapshots/output/numbers.snapshot.txt +++ b/tests/snapshots/output/numbers.snapshot.txt @@ -10,7 +10,7 @@ 10 "The perimeter of the rectangle is {} pixels.", 11 perimeter(&rect1) 12 ); - 13 println!(r#"This line contains invalid utf8: "øˆ€€€"#; + 13 println!(r#"This line contains invalid utf8: "�����"#; 14 } 15 16 fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/plain.snapshot.txt b/tests/snapshots/output/plain.snapshot.txt index e2ee1dff..30cbdde6 100644 --- a/tests/snapshots/output/plain.snapshot.txt +++ b/tests/snapshots/output/plain.snapshot.txt @@ -10,7 +10,7 @@ fn main() { "The perimeter of the rectangle is {} pixels.", perimeter(&rect1) ); - println!(r#"This line contains invalid utf8: "øˆ€€€"#; + println!(r#"This line contains invalid utf8: "�����"#; } fn area(rectangle: &Rectangle) -> u32 { @@ -23,14 +23,14 @@ fn perimeter(rectangle: &Rectangle) -> u32 { // Tab alignment: /* - Indent - 1 2 3 4 -1 ? -22 ? -333 ? -4444 ? -55555 ? -666666 ? -7777777 ? -88888888 ? + Indent + 1 2 3 4 +1 ? +22 ? +333 ? +4444 ? +55555 ? +666666 ? +7777777 ? +88888888 ? */ diff --git a/tests/snapshots/output/tabs_4.snapshot.txt b/tests/snapshots/output/tabs_4.snapshot.txt index 9e667b0b..87689c7b 100644 --- a/tests/snapshots/output/tabs_4.snapshot.txt +++ b/tests/snapshots/output/tabs_4.snapshot.txt @@ -13,7 +13,7 @@ 10 ~ │ "The perimeter of the rectangle is {} pixels.", 11 ~ │ perimeter(&rect1) 12 │ ); - 13 + │ println!(r#"This line contains invalid utf8: "øˆ€€€"#; + 13 + │ println!(r#"This line contains invalid utf8: "�����"#; 14 │ } 15 │ 16 │ fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/tabs_4_wrapped.snapshot.txt b/tests/snapshots/output/tabs_4_wrapped.snapshot.txt index 9e667b0b..87689c7b 100644 --- a/tests/snapshots/output/tabs_4_wrapped.snapshot.txt +++ b/tests/snapshots/output/tabs_4_wrapped.snapshot.txt @@ -13,7 +13,7 @@ 10 ~ │ "The perimeter of the rectangle is {} pixels.", 11 ~ │ perimeter(&rect1) 12 │ ); - 13 + │ println!(r#"This line contains invalid utf8: "øˆ€€€"#; + 13 + │ println!(r#"This line contains invalid utf8: "�����"#; 14 │ } 15 │ 16 │ fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/tabs_8.snapshot.txt b/tests/snapshots/output/tabs_8.snapshot.txt index 6c17a73e..221306da 100644 --- a/tests/snapshots/output/tabs_8.snapshot.txt +++ b/tests/snapshots/output/tabs_8.snapshot.txt @@ -13,7 +13,7 @@ 10 ~ │ "The perimeter of the rectangle is {} pixels.", 11 ~ │ perimeter(&rect1) 12 │ ); - 13 + │ println!(r#"This line contains invalid utf8: "øˆ€€€"#; + 13 + │ println!(r#"This line contains invalid utf8: "�����"#; 14 │ } 15 │ 16 │ fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/tabs_8_wrapped.snapshot.txt b/tests/snapshots/output/tabs_8_wrapped.snapshot.txt index 6c17a73e..221306da 100644 --- a/tests/snapshots/output/tabs_8_wrapped.snapshot.txt +++ b/tests/snapshots/output/tabs_8_wrapped.snapshot.txt @@ -13,7 +13,7 @@ 10 ~ │ "The perimeter of the rectangle is {} pixels.", 11 ~ │ perimeter(&rect1) 12 │ ); - 13 + │ println!(r#"This line contains invalid utf8: "øˆ€€€"#; + 13 + │ println!(r#"This line contains invalid utf8: "�����"#; 14 │ } 15 │ 16 │ fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/tabs_passthrough.snapshot.txt b/tests/snapshots/output/tabs_passthrough.snapshot.txt index 2b9a1332..3ad018a1 100644 --- a/tests/snapshots/output/tabs_passthrough.snapshot.txt +++ b/tests/snapshots/output/tabs_passthrough.snapshot.txt @@ -13,7 +13,7 @@ 10 ~ │ "The perimeter of the rectangle is {} pixels.", 11 ~ │ perimeter(&rect1) 12 │ ); - 13 + │ println!(r#"This line contains invalid utf8: "øˆ€€€"#; + 13 + │ println!(r#"This line contains invalid utf8: "�����"#; 14 │ } 15 │ 16 │ fn area(rectangle: &Rectangle) -> u32 { diff --git a/tests/snapshots/output/tabs_passthrough_wrapped.snapshot.txt b/tests/snapshots/output/tabs_passthrough_wrapped.snapshot.txt index 2b9a1332..3ad018a1 100644 --- a/tests/snapshots/output/tabs_passthrough_wrapped.snapshot.txt +++ b/tests/snapshots/output/tabs_passthrough_wrapped.snapshot.txt @@ -13,7 +13,7 @@ 10 ~ │ "The perimeter of the rectangle is {} pixels.", 11 ~ │ perimeter(&rect1) 12 │ ); - 13 + │ println!(r#"This line contains invalid utf8: "øˆ€€€"#; + 13 + │ println!(r#"This line contains invalid utf8: "�����"#; 14 │ } 15 │ 16 │ fn area(rectangle: &Rectangle) -> u32 { From b4c6e412dc01e6e2e794436ede4b953b7e26d981 Mon Sep 17 00:00:00 2001 From: sharkdp Date: Wed, 12 Sep 2018 20:28:42 +0200 Subject: [PATCH 21/24] Make generate_snapshots script more robust --- tests/snapshots/generate_snapshots.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/tests/snapshots/generate_snapshots.py b/tests/snapshots/generate_snapshots.py index 7a4798ff..fcbfdba9 100755 --- a/tests/snapshots/generate_snapshots.py +++ b/tests/snapshots/generate_snapshots.py @@ -1,9 +1,11 @@ #!/usr/bin/env python3 + import itertools import subprocess import pathlib import shutil + def generate_snapshots(): single_styles = ["changes", "grid", "header", "numbers"] collective_styles = ["full", "plain"] @@ -22,33 +24,41 @@ def generate_snapshots(): generate_snapshot("tabs_8", "--tabs=8 --style=full --wrap=never") generate_snapshot("tabs_8_wrapped", "--tabs=8 --style=full --wrap=character") + def generate_style_snapshot(style): - generate_snapshot(style.replace(",","_"), "--style={}".format(style)) + generate_snapshot(style.replace(",", "_"), "--style={}".format(style)) + def generate_snapshot(name, arguments): - command = "../../target/debug/bat --decorations=always {1} sample.rs > output/{0}.snapshot.txt".format( - name, - arguments + command = "cargo run -- --paging=never --color=never --decorations=always " + command += "{args} sample.rs > output/{name}.snapshot.txt".format( + name=name, + args=arguments ) print("generating snapshot for {}".format(name)) subprocess.call(command, shell=True) + def build_bat(): print("building bat") subprocess.call("cargo build", cwd="../..", shell=True) + def prepare_output_dir(): shutil.rmtree("output", ignore_errors=True) pathlib.Path("output").mkdir() + def modify_sample_file(): print("modifying sample.rs to show changes") shutil.copyfile("sample.modified.rs", "sample.rs") + def undo_sample_file_modification(): print("undoing sample.rs modifications") subprocess.call("git checkout -- sample.rs", shell=True) + build_bat() prepare_output_dir() modify_sample_file() From 84ac92efbbcf5ff04778f99cf2f6badf2405a840 Mon Sep 17 00:00:00 2001 From: sharkdp Date: Wed, 12 Sep 2018 20:32:33 +0200 Subject: [PATCH 22/24] Fix test for --style=plain --- tests/tests.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tests.rs b/tests/tests.rs index 5c9967a2..6e76c8b5 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -31,7 +31,7 @@ snapshot_tests! { grid_header_numbers: "grid,header,numbers" => [wrap: false, tabs: 8], changes_grid_header_numbers: "changes,grid,header,numbers" => [wrap: false, tabs: 8], full: "full" => [wrap: false, tabs: 8], - plain: "plain" => [wrap: false, tabs: 8], + plain: "plain" => [wrap: false, tabs: 0], tabs_passthrough_wrapped: "full" => [wrap: true, tabs: 0], tabs_4_wrapped: "full" => [wrap: true, tabs: 4], tabs_8_wrapped: "full" => [wrap: true, tabs: 8], From a05494e9d9960afa5d6cab14483dc1a64658687f Mon Sep 17 00:00:00 2001 From: sharkdp Date: Wed, 12 Sep 2018 20:32:49 +0200 Subject: [PATCH 23/24] Make tests more robust --- tests/tester.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/tester.rs b/tests/tester.rs index 2c8de48d..87de6462 100644 --- a/tests/tester.rs +++ b/tests/tester.rs @@ -43,6 +43,8 @@ impl BatTester { .current_dir(self.temp_dir.path()) .args(&[ "sample.rs", + "--paging=never", + "--color=never", "--decorations=always", "--terminal-width=80", &format!("--wrap={}", if wrap { "character" } else { "never" }), From 97129ab9d8b249611b31740ad597452079458afc Mon Sep 17 00:00:00 2001 From: sharkdp Date: Wed, 12 Sep 2018 20:53:49 +0200 Subject: [PATCH 24/24] Add PowerShell syntax, closes #306 --- .gitmodules | 3 + assets/syntaxes/PowerShell | 1 + assets/syntaxes/PowerShell.sublime-syntax | 466 ++++++++++++++++++++++ 3 files changed, 470 insertions(+) create mode 160000 assets/syntaxes/PowerShell create mode 100644 assets/syntaxes/PowerShell.sublime-syntax diff --git a/.gitmodules b/.gitmodules index c1da3247..7cc9e80d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -88,3 +88,6 @@ [submodule "assets/syntaxes/Crystal"] path = assets/syntaxes/Crystal url = https://github.com/crystal-lang-tools/sublime-crystal.git +[submodule "assets/syntaxes/PowerShell"] + path = assets/syntaxes/PowerShell + url = https://github.com/PowerShell/EditorSyntax diff --git a/assets/syntaxes/PowerShell b/assets/syntaxes/PowerShell new file mode 160000 index 00000000..12b7d725 --- /dev/null +++ b/assets/syntaxes/PowerShell @@ -0,0 +1 @@ +Subproject commit 12b7d7257eb493e45a9af0af9094ec0c2a996712 diff --git a/assets/syntaxes/PowerShell.sublime-syntax b/assets/syntaxes/PowerShell.sublime-syntax new file mode 100644 index 00000000..63488230 --- /dev/null +++ b/assets/syntaxes/PowerShell.sublime-syntax @@ -0,0 +1,466 @@ +%YAML 1.2 +--- +# http://www.sublimetext.com/docs/3/syntax.html +name: PowerShell +file_extensions: + - ps1 + - psm1 + - psd1 +scope: source.powershell +contexts: + main: + - match: "<#" + captures: + 0: punctuation.definition.comment.block.begin.powershell + push: + - meta_scope: comment.block.powershell + - match: "#>" + captures: + 0: punctuation.definition.comment.block.end.powershell + pop: true + - include: commentEmbeddedDocs + - match: '[2-6]>&1|>>|>|<<|<|>|>\||[1-6]>|[1-6]>>' + scope: keyword.operator.redirection.powershell + - include: commands + - include: commentLine + - include: variable + - include: interpolatedStringContent + - include: function + - include: attribute + - include: UsingDirective + - include: type + - include: hashtable + - include: doubleQuotedString + - include: scriptblock + - include: doubleQuotedStringEscapes + - match: (?