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}, nil

View on GitHub (pinned to bd4efa277b)

Solutions

  1. Pass a positive number of seconds, minimum effectively 0.01: every-1s or every(0.5)
  2. Default your interval variable defensively: INTERVAL="${INTERVAL:-5}"
  3. 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

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


AI-assisted analysis of junegunn/fzf@bd4efa277b (2026-08-15). Data as JSON: /api/errors/b65780f418073d87. Report an issue: GitHub.