xed is a command-line tool that launches the Xcode application and opens the given documents ( xcodeproj, xcworkspace, etc.), or opens a new document, optionally with the contents of standard input.
If you work from the command line, this tool is a better option than
open (which can open Xcode projects as well). Why?
xedknows about the current selected Xcode version (
openbehaves unpredictably if you have multiple Xcode installed)
- You can use it open all files from a specific commit (with a little help explained below). It is useful on code-reviews or when you want to explore significant changes in the repository
- You can use it as a “quick open” helper. Helps with monorepo phenomena, when you have hundreds of projects in the repository (I will show you an example below)
Note about the current selected Xcode version
The current selected Xcode is controlled by
xcode-select tool. You can check the current selected version with
xcode-select -p (or
xcode-select --print-path) and change it with
sudo xcode-select -s PATH_TO_XCODE (or
sudo xcode-select --switch PATH_TO_XCODE).
Tips & Tricks: There is a trick to get the current selected Xcode version without the tool. But your command line has to have full disk access. In some cases, it can be useful, but I recommend to use
xcode-select if you have no additional requirements. To check the current selected Xcode version without
xcode-select, execute the following command:
$ readlink /private/var/db/xcode_select_link
Launches the current selected Xcode.
Will open the project with the current selected Xcode and terminate (the process that invoked
xed remains in control).
xed SourceFile.swift AnotherExample.swift
Will open the files. There are two possible outcomes:
- Xcode will navigate to these file within the project if the project that contains these files is already opened
- Xcode will open the files as separate units
There are more options, like
--line. Please, consult the man page for
Tips & Tricks: If you are browsing this article on macOS, you can open the
x-man-page://xed link, and it will show you the man page for the command in Terminal.app. There is a special scheme —
x-man-page - than can open man pages for any available commands on macOS.
Open all files with changes
You can browse the git history directly in Xcode, and this is a convenient way to navigate the history. But I am not too fond of the Xcode Code Review tool because of the layout (when they show the original source and the version side-by-side), and there is no option to open all the files in the editor. Sometimes it is useful to open all files changed by the commit as regular source files and navigate them one by one.
To do so, you need a hash of the commit you want to browse. The following command will list all the files in the commit and open them in Xcode:
xed $(git diff-tree --no-commit-id --name-only -r COMMIT_HASH)
You can use the command as an alias for your Bash or zsh configurations.
Note: if the Xcode project for these files is already opened then Xcode will open them in the context of the project. Otherwise, it will open each file in a separate window.
Quick search and open projects
You need a quick way to search and open projects when you have hundreds of them in your git repository. In my case, I work with two monorepos daily, and I have a significant number of different projects in my “projects” folder. To be able to navigate and open them as quickly as possible, I developed a script that scans the current folder for all
.xcodeproj files, produces a list of them according to the provided search term and then open a specific project with the
Let’s take the Firefox iOS project as a simple example. The project contains 65
.xcodeproj files in the repository (most of them are third-party Carthage dependencies). Imagine that I work with the repository every day and have to switch between these projects (check demos, run tests, apply fixes, etc.). To help myself, I am using the following script:
The script will produce the full list of projects when you run it in the Firefox iOS project and ask you to provide a number to select a project to open:
$ sh pxed.sh
If you run it with a search term, “demo” for example, the list will be limited to projects with the keyword in the name:
$ sh pxed.sh demo
Please select a project:
2) ./Carthage/Checkouts/SDWebImage/Examples/SDWebImage Demo.xcodeproj
6) ./Carthage/Checkouts/onepassword-app-extension/Demos/App Demo for iOS Swift/App Demo for iOS Swift.xcodeproj
7) ./Carthage/Checkouts/onepassword-app-extension/Demos/App Demo for iOS/App Demo for iOS.xcodeproj
8) ./Carthage/Checkouts/onepassword-app-extension/Demos/WebView Demo for iOS Swift/WebView Demo for iOS Swift.xcodeproj
9) ./Carthage/Checkouts/onepassword-app-extension/Demos/WebView Demo for iOS/WebView Demo for iOS.xcodeproj
And, finally, the script will open the project straight away if there is only one search result for the keyword:
$ sh pxed.sh sent