Skip to content

Add LSP-backed autocomplete with auto-import to the code editor #9548

@alohaguilherme

Description

@alohaguilherme

Pre-submit Checks

Describe the solution you'd like?

While editing a source file in the Warp code editor, I want a VSCode-grade LSP autocomplete popup as I type:

  • After ~150ms of identifier typing, or immediately on a server-defined trigger character (., ::, <, etc), or on Cmd+./Ctrl+. (manual), a compact
    popup anchors near the cursor with language-aware suggestions sourced from the file's LSP server.
  • The popup is passive by default — Enter still inserts a newline / fires auto-indent until I explicitly navigate with ↑/↓, at which point Enter accepts
    the highlighted item.
  • Accepting an item that requires a new import (e.g. useState from react, HashMap from std::collections, Path from pathlib, an unimported
    package symbol in Go) inserts the symbol AND the import line in a single undoable action.
  • Snippet items (e.g. methods that ship parameter placeholders) expand to literal text with the first placeholder selected so I can immediately type to
    replace it.
  • The popup auto-closes on Esc, on cursor movement out of the typed prefix, on focus loss, or when the prefix no longer matches any item.

Coverage in v1: TypeScript / JavaScript, Rust, Python, Go (the four languages that already have LSP servers configured under crates/lsp/src/servers/).
Adding new languages later requires only registering a server — no UI work.

Out of scope for v1 (tracked as v2):

  • Keyword templates (for → full for-loop expansion, if → if-else block) — these aren't part of LSP, they're VSCode-bundled .code-snippets.
  • Tab/Shift+Tab navigation between snippet stops; v1 selects only the first stop.
  • AI / model-driven completion (separate flow).
  • Multi-cursor editing concurrent with completion.

Gated behind a code_intelligence_completion feature flag and a code.editor.lsp_autocomplete_enabled user setting; with the flag off, behavior is
identical to today.

Is your feature request related to a problem? Please describe.

Yes. The Warp code editor (the surface opened via workspace.open_file_with_target) currently has LSP-backed hover, diagnostics, find references, and
goto-definition wired end-to-end, but there's no textDocument/completion integration. While editing source files, users get no language-aware
suggestions while typing — only the symbols they remember by hand.

There's also no auto-import path: typing an unimported symbol leaves the user to add the import line manually. Concrete pain:

  • A TypeScript user typing useState in a .tsx has to switch to another window to remember the import path, then come back and add import { useState } from 'react'; manually.
  • A Rust user typing HashMap doesn't get use std::collections::HashMap; added automatically.
  • Python and Go users see the same workflow break for any symbol that isn't already imported.

Without completion the code editor is unusable for anything beyond casual edits — users either copy-paste from another IDE or memorize APIs. The
plumbing (LSP servers, capability negotiation, telemetry) is already shipped; the only missing piece is textDocument/completion (and lazy
completionItem/resolve) on the wire and a popup driver in the code editor view.

Additional context

Draft product.md (testable behavior invariants, edge cases, telemetry boundaries) and tech.md (capability declaration, service / model surface,
popup driver, telemetry, feature-flag rollout) are ready to be moved into specs/GH<this-issue-number>/ once the issue is labelled ready-to-spec.

A working implementation also exists locally covering: LSP service / model wiring (completion + completion_resolve), snippet_support +
resolve_support[additionalTextEdits] capabilities, the CodeIntelligenceCompletion feature flag, code.editor.lsp_autocomplete_enabled setting,
popup view with two-state key routing (visible / interactive), forward debounce + monotonic request sequence, client-side prefix filter, lazy
completionItem/resolve, auto-close on cursor-out-of-prefix, snippet first-stop selection, and privacy-conscious telemetry. Happy to break it into
separate PRs once the spec lands.

Operating system (OS)

macOS

How important is this feature to you?

4

Warp Internal (ignore) - linear-label:39cc6478-1249-4ee7-950b-c428edfeecd1

None

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:editor-notebooksEditors, notebooks, markdown rendering, LSP, and code display.enhancementNew feature or request.repro:highThe report includes enough evidence that the issue appears highly reproducible.triagedIssue has received an initial automated triage pass.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions