summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2020-07-05 16:16:46 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2020-07-05 16:16:46 +0900
commit8e027c445f0eb4495e300522843df335c3b54e60 (patch)
tree8d13e038a930a79e65161d1c1e1dfb0e75500963
parentdda3e3c39a9b903fab3754a7a39a7946a2dd836f (diff)
Support ANSI colors in --prompt string
Close #2086
-rw-r--r--CHANGELOG.md1
-rw-r--r--src/terminal.go19
2 files changed, 17 insertions, 3 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a4d1435f..5a76a488 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -26,6 +26,7 @@ CHANGELOG
# Preview window hidden by default, it appears when you first hit '?'
fzf --bind '?:preview:cat {}' --preview-window hidden
```
+- Added support for ANSI colors in `--prompt` string
- Vim plugin
- `tmux` layout option for using fzf-tmux
```vim
diff --git a/src/terminal.go b/src/terminal.go
index a4bcb4bd..e6bda16e 100644
--- a/src/terminal.go
+++ b/src/terminal.go
@@ -64,7 +64,7 @@ type Terminal struct {
initDelay time.Duration
infoStyle infoStyle
spinner []string
- prompt string
+ prompt func()
promptLen int
pointer string
pointerLen int
@@ -469,7 +469,7 @@ func NewTerminal(opts *Options, eventBox *util.EventBox) *Terminal {
killChan: make(chan int),
tui: renderer,
initFunc: func() { renderer.Init() }}
- t.prompt, t.promptLen = t.processTabs([]rune(opts.Prompt), 0)
+ t.prompt, t.promptLen = t.parsePrompt(opts.Prompt)
t.pointer, t.pointerLen = t.processTabs([]rune(opts.Pointer), 0)
t.marker, t.markerLen = t.processTabs([]rune(opts.Marker), 0)
// Pre-calculated empty pointer and marker signs
@@ -479,6 +479,19 @@ func NewTerminal(opts *Options, eventBox *util.EventBox) *Terminal {
return &t
}
+func (t *Terminal) parsePrompt(prompt string) (func(), int) {
+ var state *ansiState
+ trimmed, colors, _ := extractColor(prompt, state, nil)
+ item := &Item{text: util.ToChars([]byte(trimmed)), colors: colors}
+ output := func() {
+ t.printHighlighted(
+ Result{item: item}, t.strong, tui.ColPrompt, tui.ColPrompt, false, false)
+ }
+ _, promptLen := t.processTabs([]rune(trimmed), 0)
+
+ return output, promptLen
+}
+
func (t *Terminal) noInfoLine() bool {
return t.infoStyle != infoDefault
}
@@ -780,7 +793,7 @@ func (t *Terminal) placeCursor() {
func (t *Terminal) printPrompt() {
t.move(0, 0, true)
- t.window.CPrint(tui.ColPrompt, t.strong, t.prompt)
+ t.prompt()
before, after := t.updatePromptOffset()
t.window.CPrint(tui.ColNormal, t.strong, string(before))