Add inline completion (ghost text) coordination layer#375
Open
anxkhn wants to merge 1 commit into
Open
Conversation
Add the inline completion plumbing that drives the CodeEditTextView ghost text primitive. A delegate provides completion items, the controller renders the selected item as ghost text anchored at the caret, and keyboard shortcuts accept, dismiss, and cycle through items. - InlineCompletionItem: Identifiable item holding insertText and the range it replaces on acceptance (an empty range is a pure insertion). - InlineCompletionDelegate: @mainactor protocol to request items and observe the show, accept, and dismiss lifecycle, with default empty impls. - InlineCompletionTriggerModel: requests after typing and clears stale ghost text, mirroring SuggestionTriggerCharacterModel. - TextViewController+InlineCompletion: debounced single in-flight request, render, accept, dismiss, and next/previous cycling. - Wire triggers and clears into didReplaceContentsIn and updateCursorPosition, and add Tab-accept, Escape-dismiss, and Option+]/[ cycling key handling. - SourceEditor and TextViewController gain a weak inlineCompletionDelegate, forwarded exactly like completionDelegate.
This was referenced Jun 30, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Adds an inline completion (ghost text) coordination layer to
CodeEditSourceEditor, built on the inline suggestion rendering primitive inCodeEditTextView. It gives the editor a provider-agnostic way to request, show, accept, cycle, and dismiss inline AI suggestions (the GitHub Copilot UI pattern), without any host having to re-implement the lifecycle.What's added:
InlineCompletionDelegate: a@MainActorprotocol a host conforms to.inlineCompletionsRequested(textView:cursorPosition:) async -> [InlineCompletionItem]returns suggestions; optionalinlineCompletionDidShow/Accept/Dismisshooks report lifecycle.InlineCompletionItem: the suggestion model (insert text and the range it applies to).InlineCompletionTriggerModelplusTextViewControllermethods:requestInlineSuggestion()(debounced),setInlineSuggestions(_:selectedIndex:),acceptInlineSuggestion(),dismissInlineSuggestion(),selectNext/PreviousInlineSuggestion().Behavior:
CodeEditTextViewoverlay primitive and never mutates text storage until the suggestion is explicitly accepted.Related Issues
TextView.setInlineSuggestion/clearInlineSuggestionAPI). TheCodeEditTextViewdependency inPackage.swiftshould be bumped to the release that includes it before this is merged.Checklist
Screenshots
This is the coordination layer; the user-visible ghost text is shown by the app-level integration in
CodeEdit. Behavior here is covered by unit tests.Testing
xcodebuild -scheme CodeEditSourceEditor -destination "platform=macOS,name=My Mac" clean test: the full suite passes, including the newInlineCompletionTestssuite (request/show, accept, dismiss, cycling, Tab-accept gating, and ghost-text clearing on cursor move and edit), built against theCodeEditTextViewchange in [chore]: Update CodeEditLanguages to 0.1.9 #125.