Inline completion (ghost text) coordination layer

Open
#374 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
32/100
Issue type
Feature
Clarity
Mostly clear
Activity status
Quiet
Tech stack
swift

Research direction

Start in CodeEditSourceEditor’s TextViewController and read the inline suggestion rendering primitive in CodeEditTextView, then review the proposed InlineCompletionDelegate and InlineCompletionItem API. Run the existing unit tests with the documented xcodebuild clean test flow; done means request, display, accept, dismiss, cycle, Tab gating, and cursor/edit clearing behave as described.

Written by the indexing model from the issue text.

Description

Description

Add an inline completion (ghost text) coordination layer to CodeEditSourceEditor, built on the inline suggestion rendering primitive in CodeEditTextView. This gives the editor a provider-agnostic way to request, show, accept, cycle, and dismiss inline AI suggestions (the GitHub Copilot UI pattern).

Proposed API:

  • InlineCompletionDelegate: a @MainActor protocol a host conforms to. inlineCompletionsRequested(textView:cursorPosition:) async -> [InlineCompletionItem] returns suggestions; optional inlineCompletionDidShow/Accept/Dismiss hooks report lifecycle.
  • InlineCompletionItem: the suggestion model (insert text plus the range it applies to).
  • TextViewController methods: requestInlineSuggestion() (debounced), setInlineSuggestions(_:selectedIndex:), acceptInlineSuggestion(), dismissInlineSuggestion(), selectNext/PreviousInlineSuggestion().
  • Behavior: requests are debounced and skipped while the completion popup is visible (ghost text and popup never co-exist); Tab accepts when a suggestion is active; moving the cursor or editing dismisses the ghost text.
Alternatives Considered
  • Putting this logic in the app target (CodeEdit) directly. Rejected because the request/accept/dismiss lifecycle is tightly coupled to the editor's cursor, selection, and key handling, which live here. Keeping it in CodeEditSourceEditor lets any host provide completions through a small delegate, rather than each host re-implementing the lifecycle.
  • Mutating the document to preview suggestions. Rejected; the underlying CodeEditTextView primitive renders ghost text as an overlay without touching text storage, so previews never pollute undo or layout.
Additional Context

This is the middle layer of a planned native inline-completion feature for the CodeEdit stack: CodeEditTextView provides the rendering primitive (CodeEditApp/CodeEditTextView#124), CodeEditSourceEditor (this issue) coordinates the lifecycle, and CodeEdit wires up a concrete provider such as GitHub Copilot.

I have a working, documented implementation with unit tests covering request/show, accept, dismiss, cycling, Tab-accept gating, and ghost-text clearing on cursor move and edit. It builds and tests pass via xcodebuild ... clean test (against the CodeEditTextView change above), and SwiftLint is clean. Would the maintainers welcome this in CodeEditSourceEditor?

Screenshots

The user-visible ghost text is shown by the app-level integration in CodeEdit; this layer is the coordination API and is covered by unit tests.

Dominant language
Swift
Stars
720
Forks
162
PR merge metrics
No merged PRs in 30d

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from CodeEditApp/CodeEditSourceEditor

All issues in CodeEditApp/CodeEditSourceEditor

Similar issues

More Swift issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.