summaryrefslogtreecommitdiffstats
path: root/src/ansi.go
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2020-11-25 01:40:30 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2020-11-25 01:49:48 +0900
commit3829eab1cf572d26e12dd5d96b1700c07c2905fc (patch)
tree06786ec2c59786e8e0df17f0c66fc341cbb5d6e6 /src/ansi.go
parent3fe8eeedc5f5180f9c9db76fca26844f8c6acf37 (diff)
Support ANSI code for clearing the rest of the line (ESC[0K)
Some programs use it to set the background color for the whole line. fzf --preview "printf 'normal \x1b[42mgreen\x1b[0K \x1b[43myellow\x1b[m\nnormal again'" fzf --preview 'delta <(echo foo) <(echo bar) < /dev/tty' Fix #2249
Diffstat (limited to 'src/ansi.go')
-rw-r--r--src/ansi.go12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/ansi.go b/src/ansi.go
index b15bd91c..0d716c0d 100644
--- a/src/ansi.go
+++ b/src/ansi.go
@@ -19,17 +19,18 @@ type ansiState struct {
fg tui.Color
bg tui.Color
attr tui.Attr
+ lbg tui.Color
}
func (s *ansiState) colored() bool {
- return s.fg != -1 || s.bg != -1 || s.attr > 0
+ return s.fg != -1 || s.bg != -1 || s.attr > 0 || s.lbg >= 0
}
func (s *ansiState) equals(t *ansiState) bool {
if t == nil {
return !s.colored()
}
- return s.fg == t.fg && s.bg == t.bg && s.attr == t.attr
+ return s.fg == t.fg && s.bg == t.bg && s.attr == t.attr && s.lbg == t.lbg
}
func (s *ansiState) ToString() string {
@@ -195,11 +196,14 @@ func interpretCode(ansiCode string, prevState *ansiState) *ansiState {
// State
var state *ansiState
if prevState == nil {
- state = &ansiState{-1, -1, 0}
+ state = &ansiState{-1, -1, 0, -1}
} else {
- state = &ansiState{prevState.fg, prevState.bg, prevState.attr}
+ state = &ansiState{prevState.fg, prevState.bg, prevState.attr, prevState.lbg}
}
if ansiCode[0] != '\x1b' || ansiCode[1] != '[' || ansiCode[len(ansiCode)-1] != 'm' {
+ if strings.HasSuffix(ansiCode, "0K") {
+ state.lbg = prevState.bg
+ }
return state
}