summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Otto <th1000s@posteo.net>2021-10-18 22:52:43 +0200
committerDan Davison <dandavison7@gmail.com>2021-10-25 18:29:43 -0400
commitd64532dc7318fad111abfe3b0d1ff727a1d6be0a (patch)
tree301dd659573f1a8432ffd06e6cb0300ae955fd33
parent4f5e3ebbd1106c5f8e418b5743e2166576c9f0a8 (diff)
Wrap linenumber configs in MinusPlus or LeftRight
-rw-r--r--src/config.rs30
-rw-r--r--src/features/line_numbers.rs33
-rw-r--r--src/features/side_by_side.rs2
-rw-r--r--src/paint.rs5
-rw-r--r--src/subcommands/show_config.rs16
5 files changed, 49 insertions, 37 deletions
diff --git a/src/config.rs b/src/config.rs
index 15860a80..296c505b 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -16,8 +16,9 @@ use crate::delta::State;
use crate::env;
use crate::fatal;
use crate::features::navigate;
-use crate::features::side_by_side;
+use crate::features::side_by_side::{self, LeftRight};
use crate::git_config::{GitConfig, GitConfigEntry};
+use crate::minusplus::MinusPlus;
use crate::paint::BgFillMethod;
use crate::style::{self, Style};
use crate::syntect_utils::FromDeltaStyle;
@@ -88,12 +89,9 @@ pub struct Config {
pub keep_plus_minus_markers: bool,
pub line_fill_method: BgFillMethod,
pub line_numbers: bool,
- pub line_numbers_left_format: String,
- pub line_numbers_left_style: Style,
- pub line_numbers_minus_style: Style,
- pub line_numbers_plus_style: Style,
- pub line_numbers_right_format: String,
- pub line_numbers_right_style: Style,
+ pub line_numbers_format: LeftRight<String>,
+ pub line_numbers_style_leftright: LeftRight<Style>,
+ pub line_numbers_style_minusplus: MinusPlus<Style>,
pub line_numbers_zero_style: Style,
pub line_buffer_size: usize,
pub max_line_distance: f64,
@@ -307,12 +305,18 @@ impl From<cli::Opt> for Config {
line_fill_method
},
line_numbers: opt.line_numbers,
- line_numbers_left_format: opt.line_numbers_left_format,
- line_numbers_left_style,
- line_numbers_minus_style,
- line_numbers_plus_style,
- line_numbers_right_format: opt.line_numbers_right_format,
- line_numbers_right_style,
+ line_numbers_format: LeftRight::new(
+ opt.line_numbers_left_format,
+ opt.line_numbers_right_format,
+ ),
+ line_numbers_style_leftright: LeftRight::new(
+ line_numbers_left_style,
+ line_numbers_right_style,
+ ),
+ line_numbers_style_minusplus: MinusPlus::new(
+ line_numbers_minus_style,
+ line_numbers_plus_style,
+ ),
line_numbers_zero_style,
line_buffer_size: opt.line_buffer_size,
max_line_distance: opt.max_line_distance,
diff --git a/src/features/line_numbers.rs b/src/features/line_numbers.rs
index 8aeb9918..a8491f39 100644
--- a/src/features/line_numbers.rs
+++ b/src/features/line_numbers.rs
@@ -69,9 +69,9 @@ pub fn linenumbers_and_styles<'a>(
let nr_left = line_numbers_data.line_number[Left];
let nr_right = line_numbers_data.line_number[Right];
let (minus_style, zero_style, plus_style) = (
- config.line_numbers_minus_style,
+ config.line_numbers_style_minusplus[Minus],
config.line_numbers_zero_style,
- config.line_numbers_plus_style,
+ config.line_numbers_style_minusplus[Plus],
);
let ((minus_number, plus_number), (minus_style, plus_style)) = match state {
State::HunkMinus(_) => {
@@ -120,7 +120,6 @@ pub fn format_and_paint_line_numbers<'a>(
formatted_numbers.extend(format_and_paint_line_number_field(
line_numbers_data,
Minus,
- &config.line_numbers_left_style,
&styles,
&line_numbers,
config,
@@ -131,7 +130,6 @@ pub fn format_and_paint_line_numbers<'a>(
formatted_numbers.extend(format_and_paint_line_number_field(
line_numbers_data,
Plus,
- &config.line_numbers_right_style,
&styles,
&line_numbers,
config,
@@ -157,11 +155,11 @@ pub type SideBySideLineWidth = MinusPlus<usize>;
// Although it's probably unusual, a single format string can contain multiple placeholders. E.g.
// line-numbers-right-format = "{nm} {np}|"
impl<'a> LineNumbersData<'a> {
- pub fn from_format_strings(left_format: &'a str, right_format: &'a str) -> LineNumbersData<'a> {
+ pub fn from_format_strings(format: &'a MinusPlus<String>) -> LineNumbersData<'a> {
Self {
format_data: MinusPlus::new(
- format::parse_line_number_format(left_format, &*LINE_NUMBERS_PLACEHOLDER_REGEX),
- format::parse_line_number_format(right_format, &*LINE_NUMBERS_PLACEHOLDER_REGEX),
+ format::parse_line_number_format(&format[Left], &*LINE_NUMBERS_PLACEHOLDER_REGEX),
+ format::parse_line_number_format(&format[Right], &*LINE_NUMBERS_PLACEHOLDER_REGEX),
),
line_number: MinusPlus::new(0, 0),
hunk_max_line_number_width: 0,
@@ -212,7 +210,6 @@ impl<'a> LineNumbersData<'a> {
fn format_and_paint_line_number_field<'a>(
line_numbers_data: &'a LineNumbersData,
side: MinusPlusIndex,
- style: &Style,
styles: &MinusPlus<Style>,
line_numbers: &MinusPlus<Option<usize>>,
config: &config::Config,
@@ -221,6 +218,7 @@ fn format_and_paint_line_number_field<'a>(
let format_data = &line_numbers_data.format_data[side];
let plus_file = &line_numbers_data.plus_file;
+ let style = &config.line_numbers_style_leftright[side];
let mut ansi_strings = Vec::new();
let mut suffix = "";
@@ -479,23 +477,32 @@ pub mod tests {
#[test]
fn test_line_numbers_data() {
- let mut data = LineNumbersData::from_format_strings("", "");
+ let format = MinusPlus::new("".into(), "".into());
+ let mut data = LineNumbersData::from_format_strings(&format);
data.initialize_hunk(&[(10, 11), (10000, 100001)], "a".into());
assert_eq!(data.formatted_width(), MinusPlus::new(0, 0));
- let mut data = LineNumbersData::from_format_strings("│", "│+│");
+ let format = MinusPlus::new("│".into(), "│+│".into());
+ let mut data = LineNumbersData::from_format_strings(&format);
+
data.initialize_hunk(&[(10, 11), (10000, 100001)], "a".into());
assert_eq!(data.formatted_width(), MinusPlus::new(1, 3));
- let mut data = LineNumbersData::from_format_strings("│{nm:^3}│", "│{np:^3}│");
+ let format = MinusPlus::new("│{nm:^3}│".into(), "│{np:^3}│".into());
+ let mut data = LineNumbersData::from_format_strings(&format);
+
data.initialize_hunk(&[(10, 11), (10000, 100001)], "a".into());
assert_eq!(data.formatted_width(), MinusPlus::new(8, 8));
- let mut data = LineNumbersData::from_format_strings("│{nm:^3}│ │{np:<12}│ │{nm}│", "");
+ let format = MinusPlus::new("│{nm:^3}│ │{np:<12}│ │{nm}│".into(), "".into());
+ let mut data = LineNumbersData::from_format_strings(&format);
+
data.initialize_hunk(&[(10, 11), (10000, 100001)], "a".into());
assert_eq!(data.formatted_width(), MinusPlus::new(32, 0));
- let mut data = LineNumbersData::from_format_strings("│{np:^3}│ │{nm:<12}│ │{np}│", "");
+ let format = MinusPlus::new("│{np:^3}│ │{nm:<12}│ │{np}│".into(), "".into());
+ let mut data = LineNumbersData::from_format_strings(&format);
+
data.initialize_hunk(&[(10, 11), (10000, 100001)], "a".into());
assert_eq!(data.formatted_width(), MinusPlus::new(32, 0));
}
diff --git a/src/features/side_by_side.rs b/src/features/side_by_side.rs
index b87207d8..ecd0f3d4 100644
--- a/src/features/side_by_side.rs
+++ b/src/features/side_by_side.rs
@@ -42,7 +42,7 @@ pub struct Panel {
pub offset: usize,
}
-type LeftRight<T> = MinusPlus<T>;
+pub type LeftRight<T> = MinusPlus<T>;
pub type SideBySideData = LeftRight<Panel>;
diff --git a/src/paint.rs b/src/paint.rs
index 3ad88628..16abef83 100644
--- a/src/paint.rs
+++ b/src/paint.rs
@@ -55,10 +55,7 @@ impl<'a> Painter<'a> {
let default_syntax = Self::get_syntax(&config.syntax_set, None);
let line_numbers_data = if config.line_numbers {
- line_numbers::LineNumbersData::from_format_strings(
- &config.line_numbers_left_format,
- &config.line_numbers_right_format,
- )
+ line_numbers::LineNumbersData::from_format_strings(&config.line_numbers_format)
} else {
line_numbers::LineNumbersData::default()
};
diff --git a/src/subcommands/show_config.rs b/src/subcommands/show_config.rs
index 5442ae1f..e6e6f246 100644
--- a/src/subcommands/show_config.rs
+++ b/src/subcommands/show_config.rs
@@ -3,6 +3,8 @@ use std::io::Write;
use crate::bat_utils::output::PagingMode;
use crate::cli;
use crate::config;
+use crate::features::side_by_side::{Left, Right};
+use crate::minusplus::*;
use crate::paint::BgFillMethod;
pub fn show_config(config: &config::Config, writer: &mut dyn Write) -> std::io::Result<()> {
@@ -87,13 +89,15 @@ pub fn show_config(config: &config::Config, writer: &mut dyn Write) -> std::io::
line-numbers-right-style = {line_numbers_right_style}
line-numbers-left-format = {line_numbers_left_format}
line-numbers-right-format = {line_numbers_right_format}",
- line_numbers_minus_style = config.line_numbers_minus_style.to_painted_string(),
+ line_numbers_minus_style =
+ config.line_numbers_style_minusplus[Minus].to_painted_string(),
line_numbers_zero_style = config.line_numbers_zero_style.to_painted_string(),
- line_numbers_plus_style = config.line_numbers_plus_style.to_painted_string(),
- line_numbers_left_style = config.line_numbers_left_style.to_painted_string(),
- line_numbers_right_style = config.line_numbers_right_style.to_painted_string(),
- line_numbers_left_format = format_option_value(&config.line_numbers_left_format),
- line_numbers_right_format = format_option_value(&config.line_numbers_right_format),
+ line_numbers_plus_style = config.line_numbers_style_minusplus[Plus].to_painted_string(),
+ line_numbers_left_style = config.line_numbers_style_leftright[Left].to_painted_string(),
+ line_numbers_right_style =
+ config.line_numbers_style_leftright[Right].to_painted_string(),
+ line_numbers_left_format = format_option_value(&config.line_numbers_format[Left]),
+ line_numbers_right_format = format_option_value(&config.line_numbers_format[Right]),
)?
}
writeln!(