Skip to content

Commit 7adffd5

Browse files
authored
suggestion: added style (#691)
* suggestion: added style supports reverse highlighting using nu.config ```nushell style: { text: white selected_text: { attr: r } description_text: white_dimmed } ``` * added reset * fix clippy
1 parent 7d08fc8 commit 7adffd5

File tree

6 files changed

+41
-13
lines changed

6 files changed

+41
-13
lines changed

src/completion/base.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use nu_ansi_term::Style;
12
use std::ops::Range;
23

34
/// A span of source code, with positions in bytes
@@ -79,6 +80,8 @@ pub struct Suggestion {
7980
pub value: String,
8081
/// Optional description for the replacement
8182
pub description: Option<String>,
83+
/// Optional style for the replacement
84+
pub style: Option<Style>,
8285
/// Optional vector of strings in the suggestion. These can be used to
8386
/// represent examples coming from a suggestion
8487
pub extra: Option<Vec<String>>,

src/completion/default.rs

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,17 +55,17 @@ impl Completer for DefaultCompleter {
5555
/// assert_eq!(
5656
/// completions.complete("bat",3),
5757
/// vec![
58-
/// Suggestion {value: "batcave".into(), description: None, extra: None, span: Span { start: 0, end: 3 }, append_whitespace: false},
59-
/// Suggestion {value: "batman".into(), description: None, extra: None, span: Span { start: 0, end: 3 }, append_whitespace: false},
60-
/// Suggestion {value: "batmobile".into(), description: None, extra: None, span: Span { start: 0, end: 3 }, append_whitespace: false},
58+
/// Suggestion {value: "batcave".into(), description: None, style: None, extra: None, span: Span { start: 0, end: 3 }, append_whitespace: false},
59+
/// Suggestion {value: "batman".into(), description: None, style: None, extra: None, span: Span { start: 0, end: 3 }, append_whitespace: false},
60+
/// Suggestion {value: "batmobile".into(), description: None, style: None, extra: None, span: Span { start: 0, end: 3 }, append_whitespace: false},
6161
/// ]);
6262
///
6363
/// assert_eq!(
6464
/// completions.complete("to the bat",10),
6565
/// vec![
66-
/// Suggestion {value: "batcave".into(), description: None, extra: None, span: Span { start: 7, end: 10 }, append_whitespace: false},
67-
/// Suggestion {value: "batman".into(), description: None, extra: None, span: Span { start: 7, end: 10 }, append_whitespace: false},
68-
/// Suggestion {value: "batmobile".into(), description: None, extra: None, span: Span { start: 7, end: 10 }, append_whitespace: false},
66+
/// Suggestion {value: "batcave".into(), description: None, style: None, extra: None, span: Span { start: 7, end: 10 }, append_whitespace: false},
67+
/// Suggestion {value: "batman".into(), description: None, style: None, extra: None, span: Span { start: 7, end: 10 }, append_whitespace: false},
68+
/// Suggestion {value: "batmobile".into(), description: None, style: None, extra: None, span: Span { start: 7, end: 10 }, append_whitespace: false},
6969
/// ]);
7070
/// ```
7171
fn complete(&mut self, line: &str, pos: usize) -> Vec<Suggestion> {
@@ -102,6 +102,7 @@ impl Completer for DefaultCompleter {
102102
Suggestion {
103103
value: format!("{span_line}{ext}"),
104104
description: None,
105+
style: None,
105106
extra: None,
106107
span,
107108
append_whitespace: false,
@@ -176,15 +177,15 @@ impl DefaultCompleter {
176177
/// completions.insert(vec!["test-hyphen","test_underscore"].iter().map(|s| s.to_string()).collect());
177178
/// assert_eq!(
178179
/// completions.complete("te",2),
179-
/// vec![Suggestion {value: "test".into(), description: None, extra: None, span: Span { start: 0, end: 2 }, append_whitespace: false}]);
180+
/// vec![Suggestion {value: "test".into(), description: None, style: None, extra: None, span: Span { start: 0, end: 2 }, append_whitespace: false}]);
180181
///
181182
/// let mut completions = DefaultCompleter::with_inclusions(&['-', '_']);
182183
/// completions.insert(vec!["test-hyphen","test_underscore"].iter().map(|s| s.to_string()).collect());
183184
/// assert_eq!(
184185
/// completions.complete("te",2),
185186
/// vec![
186-
/// Suggestion {value: "test-hyphen".into(), description: None, extra: None, span: Span { start: 0, end: 2 }, append_whitespace: false},
187-
/// Suggestion {value: "test_underscore".into(), description: None, extra: None, span: Span { start: 0, end: 2 }, append_whitespace: false},
187+
/// Suggestion {value: "test-hyphen".into(), description: None, style: None, extra: None, span: Span { start: 0, end: 2 }, append_whitespace: false},
188+
/// Suggestion {value: "test_underscore".into(), description: None, style: None, extra: None, span: Span { start: 0, end: 2 }, append_whitespace: false},
188189
/// ]);
189190
/// ```
190191
pub fn with_inclusions(incl: &[char]) -> Self {
@@ -374,20 +375,23 @@ mod tests {
374375
Suggestion {
375376
value: "null".into(),
376377
description: None,
378+
style: None,
377379
extra: None,
378380
span: Span { start: 0, end: 3 },
379381
append_whitespace: false,
380382
},
381383
Suggestion {
382384
value: "number".into(),
383385
description: None,
386+
style: None,
384387
extra: None,
385388
span: Span { start: 0, end: 3 },
386389
append_whitespace: false,
387390
},
388391
Suggestion {
389392
value: "nushell".into(),
390393
description: None,
394+
style: None,
391395
extra: None,
392396
span: Span { start: 0, end: 3 },
393397
append_whitespace: false,
@@ -415,20 +419,23 @@ mod tests {
415419
Suggestion {
416420
value: "test".into(),
417421
description: None,
422+
style: None,
418423
extra: None,
419424
span: Span { start: 8, end: 9 },
420425
append_whitespace: false,
421426
},
422427
Suggestion {
423428
value: "this is the reedline crate".into(),
424429
description: None,
430+
style: None,
425431
extra: None,
426432
span: Span { start: 8, end: 9 },
427433
append_whitespace: false,
428434
},
429435
Suggestion {
430436
value: "this is the reedline crate".into(),
431437
description: None,
438+
style: None,
432439
extra: None,
433440
span: Span { start: 0, end: 9 },
434441
append_whitespace: false,

src/completion/history.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ impl<'menu> HistoryCompleter<'menu> {
5959
Suggestion {
6060
value: value.to_string(),
6161
description: None,
62+
style: None,
6263
extra: None,
6364
span,
6465
append_whitespace: false,

src/menu/columnar_menu.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -344,9 +344,17 @@ impl ColumnarMenu {
344344
let left_text_size = self.longest_suggestion + self.default_details.col_padding;
345345
let right_text_size = self.get_width().saturating_sub(left_text_size);
346346
format!(
347-
"{}{:max$}{}{}{}",
347+
"{}{}{:max$}{}{}{}{}{}{}",
348+
suggestion
349+
.style
350+
.unwrap_or(self.color.text_style)
351+
.reverse()
352+
.prefix(),
348353
self.color.selected_text_style.prefix(),
349354
&suggestion.value,
355+
RESET,
356+
self.color.description_style.reverse().prefix(),
357+
self.color.selected_text_style.prefix(),
350358
description
351359
.chars()
352360
.take(right_text_size)
@@ -358,7 +366,12 @@ impl ColumnarMenu {
358366
)
359367
} else {
360368
format!(
361-
"{}{}{}{:>empty$}{}",
369+
"{}{}{}{}{:>empty$}{}",
370+
suggestion
371+
.style
372+
.unwrap_or(self.color.text_style)
373+
.reverse()
374+
.prefix(),
362375
self.color.selected_text_style.prefix(),
363376
&suggestion.value,
364377
RESET,
@@ -372,7 +385,7 @@ impl ColumnarMenu {
372385
let right_text_size = self.get_width().saturating_sub(left_text_size);
373386
format!(
374387
"{}{:max$}{}{}{}{}{}",
375-
self.color.text_style.prefix(),
388+
suggestion.style.unwrap_or(self.color.text_style).prefix(),
376389
&suggestion.value,
377390
RESET,
378391
self.color.description_style.prefix(),
@@ -388,7 +401,7 @@ impl ColumnarMenu {
388401
} else {
389402
format!(
390403
"{}{}{}{}{:>empty$}{}{}",
391-
self.color.text_style.prefix(),
404+
suggestion.style.unwrap_or(self.color.text_style).prefix(),
392405
&suggestion.value,
393406
RESET,
394407
self.color.description_style.prefix(),
@@ -813,6 +826,7 @@ mod tests {
813826
Suggestion {
814827
value: name.to_string(),
815828
description: None,
829+
style: None,
816830
extra: None,
817831
span: Span { start: 0, end: pos },
818832
append_whitespace: false,

src/menu/ide_menu.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1473,6 +1473,7 @@ mod tests {
14731473
Suggestion {
14741474
value: name.to_string(),
14751475
description: None,
1476+
style: None,
14761477
extra: None,
14771478
span: Span { start: 0, end: pos },
14781479
append_whitespace: false,

src/menu/menu_functions.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,7 @@ mod tests {
497497
.map(|s| Suggestion {
498498
value: s.into(),
499499
description: None,
500+
style: None,
500501
extra: None,
501502
span: Span::new(0, s.len()),
502503
append_whitespace: false,
@@ -516,6 +517,7 @@ mod tests {
516517
.map(|s| Suggestion {
517518
value: s.into(),
518519
description: None,
520+
style: None,
519521
extra: None,
520522
span: Span::new(0, s.len()),
521523
append_whitespace: false,

0 commit comments

Comments
 (0)