junegunn/fzf · error
every() requires a positive number of seconds
Error message
every() requires a positive number of seconds
What it means
parseEveryEvent validates the seconds argument of the every(n) event usable in --bind (e.g. --bind 'every-5s:reload(...)' internally, or load-actions). It rejects values that fail ParseFloat, are NaN/Inf, or are <= 0 — the interval must be a strictly positive finite number.
Source
Thrown at src/options.go:1324
list = append(list, evt)
} else if len(key) == 2 && strings.HasPrefix(lkey, "f") && key[1] >= '1' && key[1] <= '9' {
add(tui.EventType(tui.F1.Int() + int(key[1]) - '1'))
} else if len(runes) == 1 {
evt := tui.Key(runes[0])
chords[evt] = key
list = append(list, evt)
} else {
return nil, list, errors.New("unsupported key: " + key)
}
}
}
return chords, list, nil
}
func parseEveryEvent(arg string) (tui.Event, error) {
secs, err := strconv.ParseFloat(strings.TrimSpace(arg), 64)
if err != nil || math.IsNaN(secs) || math.IsInf(secs, 0) || secs <= 0 {
return tui.Event{}, errors.New("every() requires a positive number of seconds")
}
if secs < 0.01 {
secs = 0.01
}
ms := math.Round(secs * 1000)
if ms > math.MaxInt32 {
return tui.Event{}, errors.New("every() interval is too large")
}
return tui.Event{Type: tui.Every, Char: rune(int32(ms))}, nil
}
func parseScheme(str string) (string, []criterion, error) {
str = strings.ToLower(str)
switch str {
case "history":
return str, []criterion{byScore}, nil
case "path":
return str, []criterion{byScore, byPathname, byLength}, nilView on GitHub (pinned to bd4efa277b)
Solutions
- Pass a positive number of seconds, minimum effectively 0.01: every-1s or every(0.5)
- Default your interval variable defensively: INTERVAL="${INTERVAL:-5}"
- For one-shot reload on focus use load(...) instead of every(0)
Example fix
# before fzf --bind 'every-0s:reload(curl -s localhost:8080/items)' # after fzf --bind 'every-5s:reload(curl -s localhost:8080/items)'
Defensive patterns
Strategy: validation
Validate before calling
INTERVAL="${INTERVAL:-5}"
awk -v i="$INTERVAL" 'BEGIN { if (i == "" || i+0 <= 0 || i != i) exit 1 }' || { echo "every() needs seconds > 0" >&2; exit 1; }
fzf --bind "every-${INTERVAL}s:reload(make)" Prevention
- Always default the interval variable to a positive number
- Remember the effective minimum is 0.01s — do not chase every(0)
- Use load(...) / on-focus events for one-shot reloads instead of zero intervals
When it happens
Trigger: --bind 'every-0s:reload(...)', every(-1), every(abc), every() (empty arg), every(NaN) — each either fails ParseFloat or trips the <=0 / NaN / Inf guard.
Common situations: Scripts templating the interval from a variable that defaults to 0; users assuming every(0) means 'as fast as possible' (minimum is clamped to 0.01s, so pass a positive value); negative values from arithmetic.
Related errors
- every() interval is too large
- invalid format: ${str}
- unsupported key: ${key}
- unknown action: ${spec}
- invalid layout (expected: default / reverse / reverse-list)
AI-assisted analysis of junegunn/fzf@bd4efa277b (2026-08-15).
Data as JSON: /api/errors/b65780f418073d87.
Report an issue: GitHub.