@@ -494,39 +494,39 @@ func (w *BufWindow) displayBuffer() {
494494 }
495495 bloc .X = bslice
496496
497+ // returns the rune to be drawn, style of it and if the bg should be preserved
497498 getRuneStyle := func (r rune , style tcell.Style , isplaceholder bool ) (rune , tcell.Style , bool ) {
498- bgoverridable := true
499499 if nColsBeforeStart > 0 || vloc .Y < 0 || isplaceholder {
500- return r , style , bgoverridable
500+ return r , style , false
501501 }
502502
503503 for _ , mb := range matchingBraces {
504504 if mb .X == bloc .X && mb .Y == bloc .Y {
505505 if b .Settings ["matchbracestyle" ].(string ) == "highlight" {
506506 if s , ok := config .Colorscheme ["match-brace" ]; ok {
507- return r , s , bgoverridable
507+ return r , s , false
508508 } else {
509- return r , style .Reverse (true ), bgoverridable
509+ return r , style .Reverse (true ), false
510510 }
511511 } else {
512- return r , style .Underline (true ), bgoverridable
512+ return r , style .Underline (true ), false
513513 }
514514 }
515515 }
516516
517517 if r != '\t' && r != ' ' {
518- return r , style , bgoverridable
518+ return r , style , false
519519 }
520520
521- var returnrune rune
521+ var drawrune rune
522522 if r == '\t' {
523523 indentrunes := []rune (b .Settings ["indentchar" ].(string ))
524524 // if empty indentchar settings, use space
525525 if len (indentrunes ) == 0 {
526526 indentrunes = []rune {' ' }
527527 }
528528
529- returnrune = indentrunes [0 ]
529+ drawrune = indentrunes [0 ]
530530 if s , ok := config .Colorscheme ["indent-char" ]; ok && r != ' ' {
531531 fg , _ , _ := s .Decompose ()
532532 style = style .Foreground (fg )
@@ -538,16 +538,17 @@ func (w *BufWindow) displayBuffer() {
538538 }
539539 }
540540
541+ preservebg := false
541542 if b .Settings ["hltaberrors" ].(bool ) && bloc .X < leadingwsEnd {
542543 if s , ok := config .Colorscheme ["tab-error" ]; ok {
543544 if b .Settings ["tabstospaces" ].(bool ) && r == '\t' {
544545 fg , _ , _ := s .Decompose ()
545546 style = style .Background (fg )
546- bgoverridable = false
547+ preservebg = true
547548 } else if ! b .Settings ["tabstospaces" ].(bool ) && r == ' ' {
548549 fg , _ , _ := s .Decompose ()
549550 style = style .Background (fg )
550- bgoverridable = false
551+ preservebg = true
551552 }
552553 }
553554 }
@@ -565,85 +566,90 @@ func (w *BufWindow) displayBuffer() {
565566 if hl {
566567 fg , _ , _ := s .Decompose ()
567568 style = style .Background (fg )
568- bgoverridable = false
569+ preservebg = true
569570 }
570571 }
571572 }
572573 }
573574
574- return returnrune , style , bgoverridable
575+ return drawrune , style , preservebg
575576 }
576577
577- draw := func (r rune , combc []rune , style tcell.Style , highlight bool , showcursor bool , bgoverridable bool ) {
578- if nColsBeforeStart <= 0 && vloc .Y >= 0 {
579- if highlight {
580- if w .Buf .HighlightSearch && w .Buf .SearchMatch (bloc ) {
581- style = config .DefStyle .Reverse (true )
582- if s , ok := config .Colorscheme ["hlsearch" ]; ok {
583- style = s
584- }
585- }
578+ draw := func (r rune , combc []rune , style tcell.Style , highlight bool , showcursor bool , preservebg bool ) {
579+ defer func () {
580+ if nColsBeforeStart <= 0 {
581+ vloc .X ++
582+ }
583+ nColsBeforeStart --
584+ }()
586585
587- _ , origBg , _ := style .Decompose ()
588- _ , defBg , _ := config .DefStyle .Decompose ()
586+ if nColsBeforeStart > 0 || vloc .Y < 0 {
587+ return
588+ }
589589
590- // syntax or hlsearch highlighting with non-default background takes precedence
591- // over cursor-line and color-column
592- if bgoverridable {
593- bgoverridable = origBg == defBg
590+ if highlight {
591+ if w .Buf .HighlightSearch && w .Buf .SearchMatch (bloc ) {
592+ style = config .DefStyle .Reverse (true )
593+ if s , ok := config .Colorscheme ["hlsearch" ]; ok {
594+ style = s
594595 }
596+ }
595597
596- for _ , c := range cursors {
597- if c .HasSelection () &&
598- (bloc .GreaterEqual (c .CurSelection [0 ]) && bloc .LessThan (c .CurSelection [1 ]) ||
599- bloc .LessThan (c .CurSelection [0 ]) && bloc .GreaterEqual (c .CurSelection [1 ])) {
600- // The current character is selected
601- style = config .DefStyle .Reverse (true )
598+ _ , origBg , _ := style .Decompose ()
599+ _ , defBg , _ := config .DefStyle .Decompose ()
602600
603- if s , ok := config .Colorscheme ["selection" ]; ok {
604- style = s
605- }
606- }
601+ // syntax or hlsearch highlighting with non-default background takes precedence
602+ // over cursor-line and color-column
603+ if ! preservebg && origBg != defBg {
604+ preservebg = true
605+ }
607606
608- if b .Settings ["cursorline" ].(bool ) && w .active && bgoverridable &&
609- ! c .HasSelection () && c .Y == bloc .Y {
610- if s , ok := config .Colorscheme ["cursor-line" ]; ok {
611- fg , _ , _ := s .Decompose ()
612- style = style .Background (fg )
613- }
614- }
615- }
607+ for _ , c := range cursors {
608+ if c .HasSelection () &&
609+ (bloc .GreaterEqual (c .CurSelection [0 ]) && bloc .LessThan (c .CurSelection [1 ]) ||
610+ bloc .LessThan (c .CurSelection [0 ]) && bloc .GreaterEqual (c .CurSelection [1 ])) {
611+ // The current character is selected
612+ style = config .DefStyle .Reverse (true )
616613
617- for _ , m := range b .Messages {
618- if bloc .GreaterEqual (m .Start ) && bloc .LessThan (m .End ) ||
619- bloc .LessThan (m .End ) && bloc .GreaterEqual (m .Start ) {
620- style = style .Underline (true )
621- break
614+ if s , ok := config .Colorscheme ["selection" ]; ok {
615+ style = s
622616 }
623617 }
624618
625- if s , ok := config .Colorscheme ["color-column" ]; ok {
626- if colorcolumn != 0 && vloc .X - w .gutterOffset + w .StartCol == colorcolumn && bgoverridable {
619+ if b .Settings ["cursorline" ].(bool ) && w .active && ! preservebg &&
620+ ! c .HasSelection () && c .Y == bloc .Y {
621+ if s , ok := config .Colorscheme ["cursor-line" ]; ok {
627622 fg , _ , _ := s .Decompose ()
628623 style = style .Background (fg )
629624 }
630625 }
631626 }
632627
633- screen .SetContent (w .X + vloc .X , w .Y + vloc .Y , r , combc , style )
628+ for _ , m := range b .Messages {
629+ if bloc .GreaterEqual (m .Start ) && bloc .LessThan (m .End ) ||
630+ bloc .LessThan (m .End ) && bloc .GreaterEqual (m .Start ) {
631+ style = style .Underline (true )
632+ break
633+ }
634+ }
634635
635- if showcursor {
636- for _ , c := range cursors {
637- if c .X == bloc .X && c .Y == bloc .Y && ! c .HasSelection () {
638- w .showCursor (w .X + vloc .X , w .Y + vloc .Y , c .Num == 0 )
639- }
636+ if s , ok := config .Colorscheme ["color-column" ]; ok {
637+ if colorcolumn != 0 && vloc .X - w .gutterOffset + w .StartCol == colorcolumn && ! preservebg {
638+ fg , _ , _ := s .Decompose ()
639+ style = style .Background (fg )
640640 }
641641 }
642642 }
643- if nColsBeforeStart <= 0 {
644- vloc .X ++
643+
644+ screen .SetContent (w .X + vloc .X , w .Y + vloc .Y , r , combc , style )
645+
646+ if showcursor {
647+ for _ , c := range cursors {
648+ if c .X == bloc .X && c .Y == bloc .Y && ! c .HasSelection () {
649+ w .showCursor (w .X + vloc .X , w .Y + vloc .Y , c .Num == 0 )
650+ }
651+ }
645652 }
646- nColsBeforeStart --
647653 }
648654
649655 wrap := func () {
@@ -731,17 +737,17 @@ func (w *BufWindow) displayBuffer() {
731737 }
732738
733739 for _ , r := range word {
734- drawrune , drawstyle , bgoverridable := getRuneStyle (r .r , r .style , false )
735- draw (drawrune , r .combc , drawstyle , true , true , bgoverridable )
740+ drawrune , drawstyle , preservebg := getRuneStyle (r .r , r .style , false )
741+ draw (drawrune , r .combc , drawstyle , true , true , preservebg )
736742
737743 // Draw extra characters for tabs or wide runes
738744 for i := 1 ; i < r .width ; i ++ {
739745 if r .r == '\t' {
740- drawrune , drawstyle , bgoverridable = getRuneStyle ('\t' , r .style , false )
746+ drawrune , drawstyle , preservebg = getRuneStyle ('\t' , r .style , false )
741747 } else {
742- drawrune , drawstyle , bgoverridable = getRuneStyle (' ' , r .style , true )
748+ drawrune , drawstyle , preservebg = getRuneStyle (' ' , r .style , true )
743749 }
744- draw (drawrune , nil , drawstyle , true , false , bgoverridable )
750+ draw (drawrune , nil , drawstyle , true , false , preservebg )
745751 }
746752 bloc .X ++
747753 }
@@ -786,8 +792,8 @@ func (w *BufWindow) displayBuffer() {
786792
787793 if vloc .X != maxWidth {
788794 // Display newline within a selection
789- drawrune , drawstyle , bgoverridable := getRuneStyle (' ' , config .DefStyle , true )
790- draw (drawrune , nil , drawstyle , true , true , bgoverridable )
795+ drawrune , drawstyle , preservebg := getRuneStyle (' ' , config .DefStyle , true )
796+ draw (drawrune , nil , drawstyle , true , true , preservebg )
791797 }
792798
793799 bloc .X = w .StartCol
0 commit comments