Skip to content

Commit 9f314fe

Browse files
Simplifying draw to be less nested
Renaming bgoverridable to preservebg in bufwindow.go
1 parent a6e3c2a commit 9f314fe

File tree

1 file changed

+74
-68
lines changed

1 file changed

+74
-68
lines changed

internal/display/bufwindow.go

Lines changed: 74 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)