@@ -6,6 +6,13 @@ use crate::{
6
6
} ;
7
7
8
8
pub ( super ) fn detect_color_mode ( number_of_colors : u16 ) -> ColorMode {
9
+ // respect the NO_COLOR env variable, and disable colors (https://no-color.org/)
10
+ if let Ok ( no_color) = var ( "NO_COLOR" ) {
11
+ if !no_color. is_empty ( ) {
12
+ return ColorMode :: TwoTone ;
13
+ }
14
+ }
15
+
9
16
// respect COLORTERM being truecolor or 24bit
10
17
if let Ok ( color_term) = var ( "COLORTERM" ) {
11
18
if color_term == "truecolor" || color_term == "24bit" {
@@ -72,6 +79,10 @@ pub(super) fn register_selectable_color_pairs(
72
79
// Copyright (c) 2015 Alexandre Bury - MIT License
73
80
#[ allow( clippy:: integer_division) ]
74
81
fn find_color ( color_mode : ColorMode , color : Color ) -> CrosstermColor {
82
+ if color_mode == ColorMode :: TwoTone {
83
+ return CrosstermColor :: Reset ;
84
+ }
85
+
75
86
match color {
76
87
Color :: Default => CrosstermColor :: Reset ,
77
88
Color :: LightBlack => CrosstermColor :: DarkGrey ,
@@ -195,6 +206,7 @@ mod tests {
195
206
use super :: * ;
196
207
197
208
fn clear_env ( ) {
209
+ remove_var ( "NO_COLOR" ) ;
198
210
remove_var ( "COLORTERM" ) ;
199
211
remove_var ( "TERM" ) ;
200
212
remove_var ( "VTE_VERSION" ) ;
@@ -320,6 +332,22 @@ mod tests {
320
332
assert_eq ! ( detect_color_mode( 0 ) , ColorMode :: TrueColor ) ;
321
333
}
322
334
335
+ #[ test]
336
+ #[ serial]
337
+ fn detect_color_mode_no_color_with_value ( ) {
338
+ clear_env ( ) ;
339
+ set_var ( "NO_COLOR" , "true" ) ;
340
+ assert_eq ! ( detect_color_mode( 16 ) , ColorMode :: TwoTone ) ;
341
+ }
342
+
343
+ #[ test]
344
+ #[ serial]
345
+ fn detect_color_mode_no_color_without_value ( ) {
346
+ clear_env ( ) ;
347
+ set_var ( "NO_COLOR" , "" ) ;
348
+ assert_eq ! ( detect_color_mode( 16 ) , ColorMode :: FourBit ) ;
349
+ }
350
+
323
351
#[ test]
324
352
#[ serial]
325
353
fn detect_color_mode_colorterm_env_is_24bit ( ) {
@@ -344,6 +372,13 @@ mod tests {
344
372
set_var ( "WT_SESSION" , "32a25081-6745-4b65-909d-e8257bdbe852" ) ;
345
373
assert_eq ! ( detect_color_mode( 0 ) , ColorMode :: TrueColor ) ;
346
374
}
375
+
376
+ #[ test]
377
+ fn find_color_two_tone ( ) {
378
+ let color = Color :: DarkRed ;
379
+ assert_eq ! ( find_color( ColorMode :: TwoTone , color) , CrosstermColor :: Reset ) ;
380
+ }
381
+
347
382
#[ rstest]
348
383
#[ case:: black( 0 , 0 , 0 , 0 ) ]
349
384
#[ case:: black( 0 , 0 , 127 , 0 ) ]
@@ -509,7 +544,7 @@ mod tests {
509
544
Color :: LightYellow ,
510
545
Color :: LightBlue ,
511
546
) ;
512
- assert_eq ! ( color, Colors :: new( CrosstermColor :: Red , CrosstermColor :: Yellow ) ) ;
513
- assert_eq ! ( selected, Colors :: new( CrosstermColor :: Red , CrosstermColor :: Yellow ) ) ;
547
+ assert_eq ! ( color, Colors :: new( CrosstermColor :: Reset , CrosstermColor :: Reset ) ) ;
548
+ assert_eq ! ( selected, Colors :: new( CrosstermColor :: Reset , CrosstermColor :: Reset ) ) ;
514
549
}
515
550
}
0 commit comments