Copilot for Xcode is an Xcode Source Editor Extension that provides Github Copilot and ChatGPT support for Xcode. It uses the LSP provided through Copilot.vim to generate suggestions and displays them as comments or in a separate window.
Thanks to LSP-copilot for showing the way to interact with Copilot. And thanks to LanguageClient for the Language Server Protocol support in Swift.
- Prerequisites
- Permissions Required
- Installation and Setup
- Update
- Commands
- Key Bindings
- Prevent Suggestions Being Committed
- Limitations
- License
- FAQ
For development instruction, check Development.md.
- Node installed to run the Copilot LSP.
- Public network connection.
- Active GitHub Copilot subscription (to use suggestion features).
- Valid OpenAI API key (to use chat features).
- Folder Access
- Accessibility API
If you are concerned about key logging and cannot trust the binary, we recommend examining the code and building it yourself. To address any concerns, you can specifically search for
CGEvent.tapCreate
,AXObserver
,AX___
within the code.
You can install it via Homebrew:
brew install --cask copilot-for-xcode
Or install it manually, by downloading the Copilot for Xcode.app
from the latest release, and extract it to the Applications folder.
Then set it up with the following steps:
-
Open the app, the app will create a launch agent to setup a background running Service that does the real job.
-
Optionally setup the path to Node. The default value is just
node
, Copilot for Xcode.app will try to find the Node from/usr/bin:/usr/local/bin
. If your Node is installed somewhere else, you can runwhich node
from terminal to get the path. -
Enable the extension in
System Settings.app
.From the Apple menu located in the top-left corner of your screen click
System Settings
. Navigate toPrivacy & Security
then toward the bottom clickExtensions
. ClickXcode Source Editor
and tickCopilot
.If you are using macOS Monterey, enter the
Extensions
menu inSystem Preferences.app
with its dedicated icon.
- In the app, refresh the Copilot status (it may fail for the first time, try at least one more time).
- Click "Sign In", and you will be directed to a verification website provided by GitHub, and a user code will be pasted into your clipboard.
- After signing in, go back to the app and click "Confirm Sign-in" to finish.
The first time the app is open and command run, the extension will ask for the necessary permissions.
Alternatively, you may manually grant the required permissions by navigating to the Privacy & Security
tab in the System Settings.app
.
- To grant permissions for the Accessibility API, click
Accessibility
, and dragCopilotForXcodeExtensionService.app
to the list. You can locate the extension app by clickingReveal Extension App in Finder
in the host app.
If you encounter an alert requesting permission that you have previously granted, please remove the permission from the list and add it again to re-grant the necessary permissions.
This app runs whenever you open Copilot for Xcode.app
or Xcode.app
. You can quit it with its menu bar item that looks like a steering wheel.
You can also set it to quit automatically when the above 2 apps are closed.
If the app was installed via Homebrew, you can update it by running:
brew upgrade --cask copilot-for-xcode
Alternatively, You can use the in-app updater or download the latest version manually from the latest release.
If you are upgrading from a version lower than 0.7.0, please run Copilot for Xcode.app
at least once to let it set up the new launch agent for you and re-grant the permissions according to the new rules.
If you want to keep track of the new releases, you can watch the releases of this repo to get notifications about updates.
If you find that some of the features are no longer working, please first try regranting permissions to the app.
- Get Suggestions: Get suggestions for the editing file at the current cursor position.
- Next Suggestion: If there is more than one suggestion, switch to the next one.
- Previous Suggestion: If there is more than one suggestion, switch to the previous one.
- Accept Suggestion: Add the suggestion to the code.
- Reject Suggestion: Remove the suggestion comments.
- Toggle Real-time Suggestions: When turn on, Copilot will auto-insert suggestion comments to your code while editing.
- Real-time Suggestions: Call only by Copilot for Xcode. When suggestions are successfully fetched, Copilot for Xcode will run this command to present the suggestions.
- Prefetch Suggestions: Call only by Copilot for Xcode. In the background, Copilot for Xcode will occasionally run this command to prefetch real-time suggestions.
About real-time suggestions
Whenever you stop typing for a few milliseconds, the app will automatically fetch suggestions for you, you can cancel this by clicking the mouse, or pressing Escape or the arrow keys.
- Chat with Selection: Open a chat window, if there is a selection, the selected code will be added to the prompt.
- Explain Selection: Open a chat window and explain the selected code.
Chat commands are not available in comment mode.
It looks like there is no way to add default key bindings to commands, but you can set them up in Xcode settings > Key Bindings
. You can filter the list by typing copilot
in the search bar.
A recommended setup that should cause no conflict is
Command | Key Binding |
---|---|
Get Suggestions | ⌥? |
Accept Suggestions | ⌥} |
Reject Suggestion | ⌥{ |
Next Suggestion | ⌥> |
Previous Suggestion | ⌥< |
Essentially using ⌥⇧
as the "access" key combination for all bindings.
Another convenient method to access commands is by using the ⇧⌘/
shortcut to search for a command in the menu bar.
Since the suggestions are presented as comments, they are in your code. If you are not careful enough, they can be committed to your git repo. To avoid that, I would recommend adding a pre-commit git hook to prevent this from happening.
#!/bin/sh
# Check if the commit message contains the string
if git diff --cached --diff-filter=ACMR | grep -q "/*========== Copilot Suggestion"; then
echo "Error: Commit contains Copilot suggestions generated by Copilot for Xcode."
exit 1
fi
- The first run of the extension will be slow. Be patient.
- The extension uses some dirty tricks to get the file and project/workspace paths. It may fail, it may be incorrect, especially when you have multiple Xcode windows running, and maybe even worse when they are in different displays. I am not sure about that though.
- The suggestions are presented as C-style comments in comment mode, they may break your code if you are editing a JSON file or something.
- When a real-time suggestion request is triggered, there is a chance that it may briefly block the editor. This can occur at most once for each file after each restart of the extension because the extension needs to initiate real-time suggestion by clicking an item from the menu bar. However, once a command has been executed and some information is cached, the extension will be able to trigger real-time suggestion using a different method.
MIT.