summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2021-01-03 00:00:40 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2021-01-03 00:15:00 +0900
commitd779ff7e6dcf068fbcf743bed45127c3b857ec92 (patch)
treee50d90a35c8a59841eaad89af9c5718ab2663237 /src
parentfd8858f8c93e38d50f00cd21430e21d89e2f9399 (diff)
downloadfzf-d779ff7e6dcf068fbcf743bed45127c3b857ec92.tar.gz
Make search toggleable
- `--phony` renamed to `--disabled` for consistency - `--no-phony` is now `--enabled` - Added `enable-search`, `disable-search`, and `toggle-search` actions for `--bind` - Added `--color` options: `query` and `disabled` Close #2303
Diffstat (limited to 'src')
-rw-r--r--src/core.go8
-rw-r--r--src/options.go16
-rw-r--r--src/terminal.go31
-rw-r--r--src/tui/tui.go9
4 files changed, 52 insertions, 12 deletions
diff --git a/src/core.go b/src/core.go
index ef470a80..1c009c69 100644
--- a/src/core.go
+++ b/src/core.go
@@ -237,14 +237,16 @@ func Run(opts *Options, version string, revision string) {
go reader.restart(command)
}
eventBox.Watch(EvtReadNew)
+ query := []rune{}
for {
delay := true
ticks++
input := func() []rune {
- if opts.Phony {
- return []rune{}
+ paused, input := terminal.Input()
+ if !paused {
+ query = input
}
- return []rune(terminal.Input())
+ return query
}
eventBox.Wait(func(events *util.Events) {
if _, fin := (*events)[EvtReadFin]; fin {
diff --git a/src/options.go b/src/options.go
index 691934ed..12c09556 100644
--- a/src/options.go
+++ b/src/options.go
@@ -33,7 +33,7 @@ const usage = `usage: fzf [options]
-d, --delimiter=STR Field delimiter regex (default: AWK-style)
+s, --no-sort Do not sort the result
--tac Reverse the order of the input
- --phony Do not perform search
+ --disabled Do not perform search
--tiebreak=CRI[,..] Comma-separated list of sort criteria to apply
when the scores are tied [length|begin|end|index]
(default: length)
@@ -682,8 +682,10 @@ func parseTheme(defaultTheme *tui.ColorTheme, str string) *tui.ColorTheme {
}
}
switch components[0] {
- case "input":
+ case "query", "input":
mergeAttr(&theme.Input)
+ case "disabled":
+ mergeAttr(&theme.Disabled)
case "fg":
mergeAttr(&theme.Fg)
case "bg":
@@ -875,6 +877,8 @@ func parseKeymap(keymap map[tui.Event][]action, str string) {
appendAction(actToggleOut)
case "toggle-all":
appendAction(actToggleAll)
+ case "toggle-search":
+ appendAction(actToggleSearch)
case "select-all":
appendAction(actSelectAll)
case "deselect-all":
@@ -923,6 +927,10 @@ func parseKeymap(keymap map[tui.Event][]action, str string) {
appendAction(actPreviewHalfPageUp)
case "preview-half-page-down":
appendAction(actPreviewHalfPageDown)
+ case "enable-search":
+ appendAction(actEnableSearch)
+ case "disable-search":
+ appendAction(actDisableSearch)
default:
t := isExecuteAction(specLower)
if t == actIgnore {
@@ -1199,9 +1207,9 @@ func parseOptions(opts *Options, allArgs []string) {
}
case "--no-expect":
opts.Expect = make(map[tui.Event]string)
- case "--no-phony":
+ case "--enabled", "--no-phony":
opts.Phony = false
- case "--phony":
+ case "--disabled", "--phony":
opts.Phony = true
case "--tiebreak":
opts.Criteria = parseTiebreak(nextString(allArgs, &i, "sort criterion required"))
diff --git a/src/terminal.go b/src/terminal.go
index e630db4e..48011628 100644
--- a/src/terminal.go
+++ b/src/terminal.go
@@ -125,6 +125,7 @@ type Terminal struct {
unicode bool
borderShape tui.BorderShape
cleanExit bool
+ paused bool
border tui.Window
window tui.Window
pborder tui.Window
@@ -233,6 +234,7 @@ const (
actSelectAll
actDeselectAll
actToggle
+ actToggleSearch
actToggleAll
actToggleDown
actToggleUp
@@ -270,6 +272,8 @@ const (
actFirst
actLast
actReload
+ actDisableSearch
+ actEnableSearch
)
type placeholderFlags struct {
@@ -488,6 +492,7 @@ func NewTerminal(opts *Options, eventBox *util.EventBox) *Terminal {
unicode: opts.Unicode,
borderShape: opts.BorderShape,
cleanExit: opts.ClearOnExit,
+ paused: opts.Phony,
strong: strongAttr,
cycle: opts.Cycle,
header: header,
@@ -563,10 +568,10 @@ func (t *Terminal) noInfoLine() bool {
}
// Input returns current query string
-func (t *Terminal) Input() []rune {
+func (t *Terminal) Input() (bool, []rune) {
t.mutex.Lock()
defer t.mutex.Unlock()
- return copySlice(t.input)
+ return t.paused, copySlice(t.input)
}
// UpdateCount updates the count information
@@ -925,8 +930,12 @@ func (t *Terminal) printPrompt() {
t.prompt()
before, after := t.updatePromptOffset()
- t.window.CPrint(tui.ColInput, string(before))
- t.window.CPrint(tui.ColInput, string(after))
+ color := tui.ColInput
+ if t.paused {
+ color = tui.ColDisabled
+ }
+ t.window.CPrint(color, string(before))
+ t.window.CPrint(color, string(after))
}
func (t *Terminal) trimMessage(message string, maxWidth int) string {
@@ -1880,7 +1889,8 @@ func (t *Terminal) Loop() {
version++
// We don't display preview window if no match
if items[0] != nil {
- command := t.replacePlaceholder(commandTemplate, false, string(t.Input()), items)
+ _, query := t.Input()
+ command := t.replacePlaceholder(commandTemplate, false, string(query), items)
initialOffset := 0
cmd := util.ExecCommand(command, true)
if pwindow != nil {
@@ -2465,6 +2475,17 @@ func (t *Terminal) Loop() {
t.input = trimQuery(t.history.next())
t.cx = len(t.input)
}
+ case actToggleSearch:
+ t.paused = !t.paused
+ changed = !t.paused
+ req(reqPrompt)
+ case actEnableSearch:
+ t.paused = false
+ changed = true
+ req(reqPrompt)
+ case actDisableSearch:
+ t.paused = true
+ req(reqPrompt)
case actSigStop:
p, err := os.FindProcess(os.Getpid())
if err == nil {
diff --git a/src/tui/tui.go b/src/tui/tui.go
index cc9c7f67..eb09da40 100644
--- a/src/tui/tui.go
+++ b/src/tui/tui.go
@@ -250,6 +250,7 @@ func (p ColorPair) MergeNonDefault(other ColorPair) ColorPair {
type ColorTheme struct {
Colored bool
Input ColorAttr
+ Disabled ColorAttr
Fg ColorAttr
Bg ColorAttr
PreviewFg ColorAttr
@@ -421,6 +422,7 @@ var (
ColPrompt ColorPair
ColNormal ColorPair
ColInput ColorPair
+ ColDisabled ColorPair
ColMatch ColorPair
ColCursor ColorPair
ColCursorEmpty ColorPair
@@ -443,6 +445,7 @@ func EmptyTheme() *ColorTheme {
return &ColorTheme{
Colored: true,
Input: ColorAttr{colUndefined, AttrUndefined},
+ Disabled: ColorAttr{colUndefined, AttrUndefined},
Fg: ColorAttr{colUndefined, AttrUndefined},
Bg: ColorAttr{colUndefined, AttrUndefined},
PreviewFg: ColorAttr{colUndefined, AttrUndefined},
@@ -465,6 +468,7 @@ func NoColorTheme() *ColorTheme {
return &ColorTheme{
Colored: false,
Input: ColorAttr{colDefault, AttrRegular},
+ Disabled: ColorAttr{colDefault, AttrRegular},
Fg: ColorAttr{colDefault, AttrRegular},
Bg: ColorAttr{colDefault, AttrRegular},
PreviewFg: ColorAttr{colDefault, AttrRegular},
@@ -492,6 +496,7 @@ func init() {
Default16 = &ColorTheme{
Colored: true,
Input: ColorAttr{colDefault, AttrUndefined},
+ Disabled: ColorAttr{colUndefined, AttrUndefined},
Fg: ColorAttr{colDefault, AttrUndefined},
Bg: ColorAttr{colDefault, AttrUndefined},
PreviewFg: ColorAttr{colUndefined, AttrUndefined},
@@ -511,6 +516,7 @@ func init() {
Dark256 = &ColorTheme{
Colored: true,
Input: ColorAttr{colDefault, AttrUndefined},
+ Disabled: ColorAttr{colUndefined, AttrUndefined},
Fg: ColorAttr{colDefault, AttrUndefined},
Bg: ColorAttr{colDefault, AttrUndefined},
PreviewFg: ColorAttr{colUndefined, AttrUndefined},
@@ -530,6 +536,7 @@ func init() {
Light256 = &ColorTheme{
Colored: true,
Input: ColorAttr{colDefault, AttrUndefined},
+ Disabled: ColorAttr{colUndefined, AttrUndefined},
Fg: ColorAttr{colDefault, AttrUndefined},
Bg: ColorAttr{colDefault, AttrUndefined},
PreviewFg: ColorAttr{colUndefined, AttrUndefined},
@@ -564,6 +571,7 @@ func initTheme(theme *ColorTheme, baseTheme *ColorTheme, forceBlack bool) {
return c
}
theme.Input = o(baseTheme.Input, theme.Input)
+ theme.Disabled = o(theme.Input, o(baseTheme.Disabled, theme.Disabled))
theme.Fg = o(baseTheme.Fg, theme.Fg)
theme.Bg = o(baseTheme.Bg, theme.Bg)
theme.PreviewFg = o(theme.Fg, o(baseTheme.PreviewFg, theme.PreviewFg))
@@ -597,6 +605,7 @@ func initPalette(theme *ColorTheme) {
ColPrompt = pair(theme.Prompt, theme.Bg)
ColNormal = pair(theme.Fg, theme.Bg)
ColInput = pair(theme.Input, theme.Bg)
+ ColDisabled = pair(theme.Disabled, theme.Bg)
ColMatch = pair(theme.Match, theme.Bg)
ColCursor = pair(theme.Cursor, theme.Gutter)
ColCursorEmpty = pair(blank, theme.Gutter)