Research: should DropTerm adopt an eager/subtle-style display-mode setting for its autosuggestions, and whose semantics fit best?

Date: 2026-10-24 Question: The shipped terminal-side autosuggest feature draws fish-style ghost text immediately whenever the cursor sits at a live prompt and text has been typed, and the user reports it “feels not accurate.” Should DropTerm add a display-mode setting like Zed’s Eager vs Subtle inline-suggestion modes — and if a proven setting exists, which tool’s semantics actually fit a terminal ghost text?

TL;DR

DropTerm should add a display-timing setting, but it should NOT copy Zed’s eager/subtle semantics — verified from Zed’s source, “subtle” does not mean “delayed”: it means the inline prediction renders only while the user physically holds a modifier key (alt by default) and otherwise demotes to a popover/completions-menu surface DropTerm has no analog for; the vocabulary that maps onto a terminal ghost text is the idle-delay knob — an “after you stop typing, wait N ms” gate — proven twice at the exact same layer (single inline suggestion rendered as ghost text): VS Code’s editor.inlineSuggest.minShowDelay (“Controls the minimal delay in milliseconds after which inline suggestions are shown after typing”, default 0, range 0–10000, explicit triggers bypass it) and ble.sh’s complete_auto_delay (default 1 ms, “The delay to start auto completion after the user made the last input”). The recommended shape is one numeric config key — autosuggestions_delay_ms, default 0 (exactly today’s behavior, fish parity) — where the ghost is withheld until typing has been idle for N milliseconds and the accept keys stay live the moment it shows. Zed’s own real timing knob is a different, request-side setting (edit_predictions.<provider>.prediction_debounce, default 75 ms only for Copilot, 0 for Zed’s own provider), which corroborates the delay vocabulary without dragging in Zed’s modifier/popover machinery. On accuracy: no vendor frames a display mode as a fix for wrong suggestions — Zed’s subtle mode was motivated by visual disruption (“so your [buffer] isn’t constantly moving as completions arrive”, sic), and JetBrains handles accuracy with filtering (“uses smart filtering to avoid showing suggestions that tend to be canceled…”); the honest claim for a delay is that it reduces exposure to low-confidence guesses during rapid typing, which is precisely the regime where DropTerm’s shortest-wins catalog/specs guesses are weakest.

Two corrections to the premise, both load-bearing:

  1. Zed’s setting is edit_predictions.mode, not inline_suggestions. There is no inline_suggestions key in Zed’s settings today; the eager/subtle vocabulary lives under edit_predictions.mode (introduced 2025-02, see R1). The names “eager” and “subtle” are real; the feature they name is not a timing control.
  2. The accuracy complaint and the display-mode request are related but distinct. Delay settings address when a suggestion is seen; they change nothing about which suggestion wins. R10 gathers what vendors themselves say about the accuracy angle.

What DropTerm has today

Grounded in the working tree (read 2026-10-24, HEAD 6b64990):

So “feels not accurate” lands on a system where every keystroke past the first character instantly produces exactly one guess, and at 1–3 typed characters the guesses most likely to be wrong (shortest-catalog-word, any-seat long flags) are the only ones cheap enough to fire. The question is whether the industry has a proven setting for that, and what it actually does.

Findings

R1. Zed’s eager/subtle — verified from source: the modes differ by suppression surface and a modifier, not by timing

Primary source: zed-industries/zed @ main commit 9f305aaf88370e8ca39c702242186e3d8f97ecca (2026-10-23). The mode enum, verbatim from crates/settings_content/src/language.rs:410-419:

#[serde(rename_all = "snake_case")]
pub enum EditPredictionsMode {
    /// If provider supports it, display inline when holding modifier key (e.g., alt).
    /// Otherwise, eager preview is used.
    #[serde(alias = "auto")]
    Subtle,
    /// Display inline when there are no language server completions available.
    #[default]
    #[serde(alias = "eager_preview")]
    Eager,
}

The docs say the same thing in user words (zed.dev/docs/ai/edit-prediction, read 2026-10-24): “Edit Prediction has two display modes: eager (default): predictions are displayed inline as long as they don’t conflict with language server completions; subtle: predictions only appear inline when holding a modifier key (alt by default)” — toggleable “via the mode key” or “directly via the UI through the status bar menu”, and “edit prediction modes work with any prediction provider.”

What each mode does in the editor, at the code level:

There is no idle delay and no trigger-key-only mode in this enum. Neither mode waits; both display as soon as their condition holds (eager: prediction arrived and no completion conflict; subtle: alt is held). Timing in Zed lives in a different setting (R2).

The history pins both the semantics and their stability, all from commit messages and diffs fetched via the GitHub API (read 2026-10-24):

R2. Zed’s actual timing knob is a per-provider request debounce — and its defaults are 0

Same commit 9f305aaf. Typing triggers refresh_edit_prediction(true /*debounce*/, …, EditPredictionRequestTrigger::BufferEdit, …) from the edit path (crates/editor/src/editor.rs:5304-5308), and refresh_edit_prediction resolves the debounce via debounce_for_delegate (crates/editor/src/edit_prediction.rs:268-281, crates/language/src/language_settings.rs:584-591). The delay comes from prediction_debounce, defined per provider in crates/settings_content/src/language.rs with doc-comment defaults verbatim: “The debounce delay in milliseconds before automatically requesting a prediction after typing stops. Set to 0 to request predictions immediately.” — Copilot “Default: 75” (:268-269), Codestral “Default: 150” (:290-291), and Zed / Mercury / Ollama / OpenAI-compatible all “Default: 0” (:301-302, :312-313, :363-364). The docs page lists the same table and adds: “Set prediction_debounce to 0 to disable the additional delay” and that the editor: show edit prediction command “bypasses the debounce entirely.” The setting was made configurable recently — PR #61568, commit cb1352a29d (2026-08-20), “Add configurable inline completion debounce timeout” — before which the delays were hardcoded per provider.

So even Zed’s timing knob is about when the request fires, not about gating the display of an already-computed local suggestion; and Zed’s own provider’s default is 0 ms. Neither half of Zed’s design maps onto DropTerm, whose suggestions are local, synchronous, and free.

R3. fish — instant display, boolean-only control, no delay and no prefix threshold

fish-shell/fish-shell @ master 9e05df534a6ed4a0bf635aa5eca3c0d5320930da (2026-10-16), plus fishshell.com/docs/current/interactive.html (read 2026-10-24). fish shows the ghost from the first typed character and offers users exactly one knob — off:

fish is DropTerm’s behavioral default (instant, always-on, opt-out) and offers no display-mode precedent beyond on/off.

chrisant996/clink @ master efc97abb68c4f8fe910ac49261d3db6b98107061 (2026-10-23), plus chrisant996.github.io/clink/clink.html (read 2026-10-24). Clink’s answer to “when/how do suggestions appear” is a choice of surface, not timing:

R5. ble.sh — the shell-side idle-delay precedent for ghost text

akinomyoga/ble.sh @ master d81fd54feb0d996fdff20dca27eaf0201f7015cc (2026-09-08). ble.sh’s auto-complete is fish-style ghost text for bash (accept S-RET; right/C-f/end at end of line; M-right one word) and it ships a genuine display-delay knob:

ble.sh is the closest published precedent for “delay N ms after the last input before the ghost shows” in a shell line editor, and it proves the knob coexists with default-on ghost text.

R6. VS Code — editor.inlineSuggest.minShowDelay: a display-delay knob for inline ghost text, added 2025, default 0

microsoft/vscode @ main 02c5a2e2b2e5bb0c1599eea41c153626ca082e14 (2026-10-23). This is the closest analog to what DropTerm would build, because VS Code inline completions are the same shape as DropTerm’s ghost: a single inline suggestion rendered as ghost text at the caret, Tab/word-wise accepted.

R7. JetBrains — inline shows as you type with no inline-delay knob; accuracy is a filtering problem; the popup has the delay

JetBrains official help (read 2026-10-24):

R8. Warp — automatic as you type, toggle only

docs.warp.dev/terminal/command-completions/autosuggestions (read 2026-10-24): “Warp will automatically suggest commands as you type based on shell history and possible completions”; enable/disable “From the Command Palette, type in ‘Autosuggestions’ to toggle”; the only related settings are the accept-key remap (“Tab key behavior” under Settings > Features > Terminal Input) and “Open completions menu as you type.” No delay, no display mode.

R9. Amazon Q / Fig — dead; nothing left to cite

Re-verified 2026-10-24: aws/amazon-q-developer-cli @ main 15cc8f3cd18c4272925ce1c7053268eedff1ea0a no longer contains the figterm/fig_desktop autocomplete crates at all (the crate list is agent/chat clients only); the repository remains “no longer being actively maintained… Kiro CLI, a closed-source product” per its README, as pinned in autosuggest-stage2-crosscheck. There is no shipping Fig/Q display-mode setting to learn from. Honest gap: any claim about Fig’s inline-suggestion settings would have to come from the archived 2024 client, which is not a precedent worth adopting.

R10. The accuracy connection — what vendors themselves say

R11. The vocabulary survey — what maps onto a terminal ghost text

Tool Control Shape Maps to DropTerm?
Zed edit_predictions.mode = eager (default) / subtle suppression surface + hold-alt modifier + popover fallback; needs a completions menu/popover to demote into No — DropTerm has no menu/popover surface, and alt is already the word-accept modifier
Zed edit_predictions.<provider>.prediction_debounce request debounce ms (0/75/150 defaults) Partially — DropTerm’s compute is local and free; the display gate is what matters
VS Code editor.inlineSuggest.minShowDelay display-delay ms after typing, default 0, 0–10000, explicit trigger bypasses Yes — exact fit (same single-ghost-text surface)
Copilot (VS Code) nextEditSuggestions.eagerness = auto/low/medium/high coarse spectrum over frequency+delay (“fewer suggestions with longer delays”) Possible naming layer, hides the number
ble.sh complete_auto_delay idle-delay ms before the ghost shows, default 1, README tip 300 Yes — shell-side ghost text, same semantics
fish fish_autosuggestion_enabled boolean only, default on Already present as autosuggestions_enabled
Clink autosuggest.enable + autosuggest.inline (false) + F2 list + autosuggest.async surface choice; ghost is opt-in; pending-input gate Partially — DropTerm has no second surface; the pending-input gate is a free implementer detail
JetBrains popup autopopup delay; inline: none (filtering policies instead) ms delay for the popup only No — different surface
Warp palette toggle only boolean Already present
min-prefix-chars thresholds nobody ships one — Honest gap: no precedent found in any source above; fish explicitly suggests from the first non-whitespace character (R3), ble.sh gates on cursor position not length (R5)

The two vocabularies with real precedent at DropTerm’s layer are the idle-delay ms (VS Code, ble.sh) and the eagerness spectrum (Copilot NES, which is itself a packaging of delay+frequency). “Eager/subtle” as a word pair is Zed’s, but Zed’s semantics are the one shape that does not transfer.

Recommendation

Adopt VS Code’s minShowDelay semantics, spelled as one numeric DropTerm config key — autosuggestions_delay_ms, default 0 — not Zed’s mode enum. Graded by precedent: the behavior (ghost text withheld until the input has been idle for N ms; 0 preserves fish parity exactly; accept keys unaffected; any keystroke resets the timer) is proven twice at the ghost-text layer — VS Code’s minShowDelay (description, default, range, and explicit-trigger bypass all cited in R6) and ble.sh’s complete_auto_delay (default 1 ms, README tip 300 ms, R5). Concretely:

  1. Semantics (all local, no timers beyond one deadline): while a suggestion qualifies under the existing guard chain, the Showing is withheld (not computed differently — the model is pure and free) until the typed segment has been stable for autosuggestions_delay_ms; any PTY damage that changes before_cursor, or a foreground/scroll/focus transition, restarts the clock. Right/Alt+Right behave exactly as today the moment the ghost is visible; a keystroke that would dismiss also cancels the pending show. Default 0 = today’s behavior bit-for-bit, so the feature ships as an opt-in remedy, the same default posture as VS Code (default: 0) and ble.sh (1, effectively immediate).
  2. Key and docs: one serialized key autosuggestions_delay_ms: u32 in DropTermConfig beside the other autosuggest toggles (src/config.rs:398-428), following the numeric-knob precedent of command_finish_notification_after_secs (src/config.rs:457); documented in docs/configuration.md (every_config_key_is_documented gate) and docs/autosuggestions.md with the honest wording: this changes when the suggestion appears, not which suggestion wins — the accuracy levers are the per-provider toggles and the match policy. A sensible suggested value for “feels noisy” reports is 200–300 ms (ble.sh’s own documented tip is 300).
  3. What the delay buys, honestly: the 1–3-character regime — where the catalog’s shortest-word rule and the specs table’s any-seat long flags produce their weakest guesses — collapses into “ghost appears only once you pause,” which is both the fish/ble.sh interaction rhythm and the moment a single-choice guess is most defensible. It does not make any individual suggestion more correct (R10); if the accuracy complaint persists at pause, the next lever is provider-side (e.g. a catalog/specs minimum word length or fish-style validation), which no peer currently ships as a user setting (R11’s honest gap).
  4. Implementation shape (small, pure-model): add delay_ms to the observation or the engine’s suggest state as an earliest-show deadline set on each typed-segment change; showing() gains one guard (deadline reached). No provider, merge, or accept-path change; the existing per-update step() call (src/terminal/engine.rs:1683) already provides the clock ticks (wakeup-driven updates), so a deadline compare needs no new timer thread.

If the maintainer prefers a named mode over a raw number, the defensible packaging is Copilot’s eagerness spectrum (R6) — autosuggestions_display: "eager" | "balanced" | "relaxed" mapping to 0/300/800 ms — because that vocabulary is published as a delay packaging, unlike Zed’s. The raw ms key is recommended first: it is the smaller surface, it matches both VS Code and ble.sh exactly, and mode names that promise more than “a delay” would mislead.

Rejected, and why

Sources

All fetched 2026-10-24 unless noted.