on master help sign in
Support different kinds of underline rendering
999b45bGokul Soumya
helix-tui/src/backend/crossterm.rs+13−1
@@ -153,7 +153,7 @@ impl ModifierDiff {
153 if removed.contains(Modifier::ITALIC) {
153 if removed.contains(Modifier::ITALIC) {
154 map_error(queue!(w, SetAttribute(CAttribute::NoItalic)))?;
154 map_error(queue!(w, SetAttribute(CAttribute::NoItalic)))?;
155 }
155 }
156− if removed.contains(Modifier::UNDERLINED) {
156+ if removed.intersects(Modifier::ANY_UNDERLINE) {
157 map_error(queue!(w, SetAttribute(CAttribute::NoUnderline)))?;
157 map_error(queue!(w, SetAttribute(CAttribute::NoUnderline)))?;
158 }
158 }
159 if removed.contains(Modifier::DIM) {
159 if removed.contains(Modifier::DIM) {
@@ -179,6 +179,18 @@ impl ModifierDiff {
179 if added.contains(Modifier::UNDERLINED) {
179 if added.contains(Modifier::UNDERLINED) {
180 map_error(queue!(w, SetAttribute(CAttribute::Underlined)))?;
180 map_error(queue!(w, SetAttribute(CAttribute::Underlined)))?;
181 }
181 }
182+ if added.contains(Modifier::UNDERCURLED) {
183+ map_error(queue!(w, SetAttribute(CAttribute::Undercurled)))?;
184+ }
185+ if added.contains(Modifier::UNDERDOTTED) {
186+ map_error(queue!(w, SetAttribute(CAttribute::Underdotted)))?;
187+ }
188+ if added.contains(Modifier::UNDERDASHED) {
189+ map_error(queue!(w, SetAttribute(CAttribute::Underdashed)))?;
190+ }
191+ if added.contains(Modifier::DOUBLE_UNDERLINED) {
192+ map_error(queue!(w, SetAttribute(CAttribute::DoubleUnderlined)))?;
193+ }
182 if added.contains(Modifier::DIM) {
194 if added.contains(Modifier::DIM) {
183 map_error(queue!(w, SetAttribute(CAttribute::Dim)))?;
195 map_error(queue!(w, SetAttribute(CAttribute::Dim)))?;
184 }
196 }
helix-view/src/graphics.rs+24−10
@@ -327,17 +327,27 @@ bitflags! {
327 ///
327 ///
328 /// let m = Modifier::BOLD | Modifier::ITALIC;
328 /// let m = Modifier::BOLD | Modifier::ITALIC;
329 /// ```
329 /// ```
330− #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
330+ #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize), serde(rename_all = "kebab-case"))]
331 pub struct Modifier: u16 {
331 pub struct Modifier: u16 {
332− const BOLD = 0b0000_0000_0001;
332+ const BOLD = 0b0000_0000_0000_0001;
333− const DIM = 0b0000_0000_0010;
333+ const DIM = 0b0000_0000_0000_0010;
334− const ITALIC = 0b0000_0000_0100;
334+ const ITALIC = 0b0000_0000_0000_0100;
335− const UNDERLINED = 0b0000_0000_1000;
335+ const UNDERLINED = 0b0000_0000_0000_1000;
336− const SLOW_BLINK = 0b0000_0001_0000;
336+ const SLOW_BLINK = 0b0000_0000_0001_0000;
337− const RAPID_BLINK = 0b0000_0010_0000;
337+ const RAPID_BLINK = 0b0000_0000_0010_0000;
338− const REVERSED = 0b0000_0100_0000;
338+ const REVERSED = 0b0000_0000_0100_0000;
339− const HIDDEN = 0b0000_1000_0000;
339+ const HIDDEN = 0b0000_0000_1000_0000;
340− const CROSSED_OUT = 0b0001_0000_0000;
340+ const CROSSED_OUT = 0b0000_0001_0000_0000;
341+ const UNDERCURLED = 0b0000_0010_0000_0000;
342+ const UNDERDOTTED = 0b0000_0100_0000_0000;
343+ const UNDERDASHED = 0b0000_1000_0000_0000;
344+ const DOUBLE_UNDERLINED = 0b0001_0000_0000_0000;
345+
346+ const ANY_UNDERLINE = Self::UNDERLINED.bits
347+ | Self::UNDERCURLED.bits
348+ | Self::UNDERDOTTED.bits
349+ | Self::UNDERDASHED.bits
350+ | Self::DOUBLE_UNDERLINED.bits;
341 }
351 }
342}
352}
343
353
@@ -355,6 +365,10 @@ impl FromStr for Modifier {
355 "reversed" => Ok(Self::REVERSED),
365 "reversed" => Ok(Self::REVERSED),
356 "hidden" => Ok(Self::HIDDEN),
366 "hidden" => Ok(Self::HIDDEN),
357 "crossed_out" => Ok(Self::CROSSED_OUT),
367 "crossed_out" => Ok(Self::CROSSED_OUT),
368+ "undercurled" => Ok(Self::UNDERCURLED),
369+ "underdotted" => Ok(Self::UNDERDOTTED),
370+ "underdashed" => Ok(Self::UNDERDASHED),
371+ "double_underlined" => Ok(Self::DOUBLE_UNDERLINED),
358 _ => Err("Invalid modifier"),
372 _ => Err("Invalid modifier"),
359 }
373 }
360 }
374 }
runtime/themes/onedark.toml+1−1
@@ -39,7 +39,7 @@
39"diff.delta" = "gold"
39"diff.delta" = "gold"
40"diff.minus" = "red"
40"diff.minus" = "red"
41
41
42−diagnostic = { modifiers = ["underlined"] }
42+diagnostic = { modifiers = ["undercurled"] }
43"info" = { fg = "blue", modifiers = ["bold"] }
43"info" = { fg = "blue", modifiers = ["bold"] }
44"hint" = { fg = "green", modifiers = ["bold"] }
44"hint" = { fg = "green", modifiers = ["bold"] }
45"warning" = { fg = "yellow", modifiers = ["bold"] }
45"warning" = { fg = "yellow", modifiers = ["bold"] }