summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBalaji Sivaraman <balaji@balajisivaraman.com>2018-02-20 17:40:03 +0530
committerAndrew Gallant <jamslam@gmail.com>2018-02-20 07:10:03 -0500
commitd57fc580818e655e7b0edca2924e259bd5dc02d2 (patch)
tree677c0ca31cc8f6cdd28ad9e56c50c516e9f0f51a
parentd09538c974194865c79f9a1539cf145fd7e7430c (diff)
termcolor: add underline support
This commit adds underline support to the termcolor crate, and exposes it through ripgrep. Fixes #798
-rw-r--r--FAQ.md8
-rw-r--r--complete/_rg2
-rw-r--r--src/app.rs3
-rw-r--r--src/printer.rs18
-rw-r--r--termcolor/src/lib.rs21
-rw-r--r--tests/tests.rs3
6 files changed, 45 insertions, 10 deletions
diff --git a/FAQ.md b/FAQ.md
index b7facfe3..42f37851 100644
--- a/FAQ.md
+++ b/FAQ.md
@@ -190,10 +190,10 @@ The --colors` flag is a bit more complicated. The general format is:
* `{attribute}` should be one of `fg`, `bg` or `style`, corresponding to
foreground color, background color, or miscellaneous styling (such as whether
to bold the output or not).
-* `{value}` is determined by the value of `{attribute}`. If `{attribute}` is
- `style`, then `{value}` should be one of `nobold`, `bold`, `nointense` or
- `intense`. If `{attribute}` is `fg` or `bg`, then `{value}` should be a
- color.
+* `{value}` is determined by the value of `{attribute}`. If
+ `{attribute}` is `style`, then `{value}` should be one of `nobold`,
+ `bold`, `nointense`, `intense`, `nounderline` or `underline`. If
+ `{attribute}` is `fg` or `bg`, then `{value}` should be a color.
A color is specified by either one of eight of English names, a single 256-bit
number or an RGB triple (with over 16 million possible values, or "true
diff --git a/complete/_rg b/complete/_rg
index 1074597d..6fecf6d8 100644
--- a/complete/_rg
+++ b/complete/_rg
@@ -125,7 +125,7 @@ _rg() {
[[ "${state}" == 'style' ]] &&
_values -S ':' 'style value' \
- bold nobold intense nointense && return 0
+ bold nobold intense nointense underline nounderline && return 0
;;
typespec)
diff --git a/src/app.rs b/src/app.rs
index 327e9bb3..ef18fbe1 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -682,7 +682,8 @@ fn flag_colors(args: &mut Vec<RGArg>) {
This flag specifies color settings for use in the output. This flag may be
provided multiple times. Settings are applied iteratively. Colors are limited
to one of eight choices: red, blue, green, cyan, magenta, yellow, white and
-black. Styles are limited to nobold, bold, nointense or intense.
+black. Styles are limited to nobold, bold, nointense, intense, nounderline
+or underline.
The format of the flag is `{type}:{attribute}:{value}`. `{type}` should be
one of path, line, column or match. `{attribute}` can be fg, bg or style.
diff --git a/src/printer.rs b/src/printer.rs
index 7f0aa9b8..38b8c2b2 100644
--- a/src/printer.rs
+++ b/src/printer.rs
@@ -555,7 +555,8 @@ impl fmt::Display for Error {
}
Error::UnrecognizedStyle(ref name) => {
write!(f, "Unrecognized style attribute '{}'. Choose from: \
- nobold, bold, nointense, intense.", name)
+ nobold, bold, nointense, intense, nounderline, \
+ underline.", name)
}
Error::InvalidFormat(ref original) => {
write!(
@@ -627,7 +628,8 @@ pub struct ColorSpecs {
/// Valid colors are `black`, `blue`, `green`, `red`, `cyan`, `magenta`,
/// `yellow`, `white`.
///
-/// Valid style instructions are `nobold`, `bold`, `intense`, `nointense`.
+/// Valid style instructions are `nobold`, `bold`, `intense`, `nointense`,
+/// `underline`, `nounderline`.
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Spec {
ty: OutType,
@@ -668,6 +670,8 @@ enum Style {
NoBold,
Intense,
NoIntense,
+ Underline,
+ NoUnderline
}
impl ColorSpecs {
@@ -727,6 +731,8 @@ impl SpecValue {
Style::NoBold => { cspec.set_bold(false); }
Style::Intense => { cspec.set_intense(true); }
Style::NoIntense => { cspec.set_intense(false); }
+ Style::Underline => { cspec.set_underline(true); }
+ Style::NoUnderline => { cspec.set_underline(false); }
}
}
}
@@ -806,6 +812,8 @@ impl FromStr for Style {
"nobold" => Ok(Style::NoBold),
"intense" => Ok(Style::Intense),
"nointense" => Ok(Style::NoIntense),
+ "underline" => Ok(Style::Underline),
+ "nounderline" => Ok(Style::NoUnderline),
_ => Err(Error::UnrecognizedStyle(s.to_string())),
}
}
@@ -859,6 +867,12 @@ mod tests {
value: SpecValue::Style(Style::Intense),
});
+ let spec: Spec = "match:style:underline".parse().unwrap();
+ assert_eq!(spec, Spec {
+ ty: OutType::Match,
+ value: SpecValue::Style(Style::Underline),
+ });
+
let spec: Spec = "line:none".parse().unwrap();
assert_eq!(spec, Spec {
ty: OutType::Line,
diff --git a/termcolor/src/lib.rs b/termcolor/src/lib.rs
index 13b9fe24..f1c36cbe 100644
--- a/termcolor/src/lib.rs
+++ b/termcolor/src/lib.rs
@@ -980,6 +980,9 @@ impl<W: io::Write> WriteColor for Ansi<W> {
if spec.bold {
self.write_str("\x1B[1m")?;
}
+ if spec.underline {
+ self.write_str("\x1B[4m")?;
+ }
Ok(())
}
@@ -1212,6 +1215,7 @@ pub struct ColorSpec {
bg_color: Option<Color>,
bold: bool,
intense: bool,
+ underline: bool,
}
impl ColorSpec {
@@ -1251,6 +1255,19 @@ impl ColorSpec {
self
}
+ /// Get whether this is underline or not.
+ ///
+ /// Note that the underline setting has no effect in a Windows console.
+ pub fn underline(&self) -> bool { self.underline }
+
+ /// Set whether the text is underlined or not.
+ ///
+ /// Note that the underline setting has no effect in a Windows console.
+ pub fn set_underline(&mut self, yes: bool) -> &mut ColorSpec {
+ self.underline = yes;
+ self
+ }
+
/// Get whether this is intense or not.
pub fn intense(&self) -> bool { self.intense }
@@ -1262,7 +1279,8 @@ impl ColorSpec {
/// Returns true if this color specification has no colors or styles.
pub fn is_none(&self) -> bool {
- self.fg_color.is_none() && self.bg_color.is_none() && !self.bold
+ self.fg_color.is_none() && self.bg_color.is_none()
+ && !self.bold && !self.underline
}
/// Clears this color specification so that it has no color/style settings.
@@ -1270,6 +1288,7 @@ impl ColorSpec {
self.fg_color = None;
self.bg_color = None;
self.bold = false;
+ self.underline = false;
}
/// Writes this color spec to the given Windows console.
diff --git a/tests/tests.rs b/tests/tests.rs
index 0e144d19..34bf08e4 100644
--- a/tests/tests.rs
+++ b/tests/tests.rs
@@ -1152,7 +1152,8 @@ clean!(regression_428_unrecognized_style, "Sherlok", ".",
let output = cmd.output().unwrap();
let err = String::from_utf8_lossy(&output.stderr);
let expected = "\
-Unrecognized style attribute ''. Choose from: nobold, bold, nointense, intense.
+Unrecognized style attribute ''. Choose from: nobold, bold, nointense, intense, \
+nounderline, underline.
";
assert_eq!(err, expected);
});