Интегрированные среды разработки
Настраиваем работу с iOS-проектами в Zed
Zed еще предстоит пройти путь, прежде чем он сможет по-настоящему заменить Xcode. Но это уже хороший шаг на пути к более простому, быстрому и удобному редактору.
Я всегда был энтузиастом текстовых редакторов и постоянно искал способы повысить производительность с помощью инструментов, быстрых клавиш и автоматизации. Когда вы пишете код по семь, восемь, а то и больше часов в день, наличие мощной и эффективной среды редактирования просто необходимо, по крайней мере, для меня. К сожалению, большинство современных IDE часто оказываются громоздкими, обремененными дополнительными функциями, которые вы совсем не используете, и очень медленными. Эти причины подтолкнули меня к изучению альтернатив, таких как Emacs, Spacemacs, Neovim и Vim.
Мое путешествие с хардкорными редакторами началось, когда я написал свою первую статью о Emacs в начале 2017 года. С тех пор я много экспериментировал, перепробовал бесчисленное количество конфигураций, плагинов и подходов. В течение последних двух лет Neovim был моим основным редактором, и я был невероятно продуктивен с ним. Однако недавно я заметил, что несколько опытных членов сообщества Neovim перешли на редактор под названием Zed. Естественно, меня разожгло любопытство.
После глубокого изучения Zed Industries, их видения, философии дизайна, инструментария и подхода мне не потребовалось много времени, чтобы испытать искреннее восхищение. Если такие известные разработчики, как Торстен Болл, перешли в Zed, это, безусловно, значимое подтверждение.
Сегодня я хочу поделиться тем, как я настроил Zed для своего любимого языка программирования Swift. Вместо исчерпывающего обзора самого Zed (возможно, это тема для другой статьи), эта статья посвящена практическим соображениям и практическим шагам по оптимизации вашего опыта программирования на Swift с помощью Zed. Давайте же погрузимся.
Расширение
Первое, что нам нужно сделать, это установить расширение Swift в редакторе Zed, чтобы получить автозавершение, диагностику, ошибки компилятора, предупреждения и другие языковые функции.
Но у нас все равно останутся проблемы, если мы используем кастомные SPM-пакеты или рабочие пространства и нам нужно осуществлять навигацию или получать автодополнение и другую важную информацию о пакетах. Проблема с Swift + iOS/macOS SDK заключается в том, что sourcekit-lsp, предоставляемый Apple, не понимает проекты Xcode. Как же он может обеспечить завершение кода, если не понимает архитектуру проекта, цели, зависимости и т.д.? Именно, что не может.
Поэтому нам нужен серверный протокол Build, который будет разбирать всю информацию о проекте и передавать ее в Language Server Protocol.
Xcode-build-server
Для начала вам нужно скачать xcode-build-server. Вы можете установить его, просто вызвав brew install xcode-build-server
.
После этого необходимо сделать еще один шаг. Вам нужно создать buildServer.json
, который укажет LSP на взаимодействие с xcode-build-server
. Для этого достаточно выполнить одну команду (скорее всего, только один раз за все время существования проекта):
# *.xcworkspace or *.xcodeproj should be unique.
# It can be omitted and will auto choose the unique workspace or project.
# if you use workspace:
xcode-build-server config -scheme <XXX> -workspace *.xcworkspace
# or if you only have a project file:
xcode-build-server config -scheme <XXX> -project *.xcodeproj
После этого нам нужно изменить настройки Zed:
xxxxxxxxxx
~/.config/zed/settings.json
Если вы хотите загрузить LSP с нужного пути:
xxxxxxxxxx
"lsp": {
"sourcekit-lsp": {
"binary": {
"path": "/Applications/Xcode-16.1.0-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/sourcekit-lsp"
}
}
},
"languages": {
"Swift": {
"enable_language_server": true,
"language_servers": ["sourcekit-lsp"],
"formatter": "language_server",
"format_on_save": "on",
"tab_size": 2
}
}
После этого вам просто нужно перезапустить Zed, и вы сможете перейти к определениям внутри SPM пакетов, модулей, рабочих пространств и получить полную поддержку LSP в вашем редакторе.
Сборка, запуск и тестирование
Кажется, что сейчас нам нужен какой-то подход для сборки пакетов Swift, их тестирования и запуска. Конечно, вы можете просто открыть терминал, перейти в директорию и использовать для этого CLI-инструмент Swift, но согласитесь, что это не лучший опыт — каждый раз, когда вам нужно собрать или запустить проект, открывать терминал и работать в нем, поэтому самое простое решение здесь — использовать функцию Tasks в Zed, Определить задачу и затем, когда нам нужно будет ее запустить, мы можем открыть задачу и запустить ее, задача запустит скрипт внутри оболочки. Мы определим сочетание клавиш, к которой мы привяжем нашу задачу, так что на при их нажатии мы запустим все вышеперечисленные вещи и увидим терминал внутри Zed, который запустит нашу команду build, test или run.
Для начала создадим задачу сборки.
Для открытия задач на Zed достаточно нажать cmd + shift + p
, а затем напечатать:
xxxxxxxxxx
open tasks
После открытия:
xxxxxxxxxx
~/.config/zed/tasks.json
Вы найдете пример json-объекта, который показывает, как можно создавать свои собственные задачи, которые могут выполнять команды в терминале. Сейчас нам нужно создать задачу сборки Swift.
Вы можете скопировать и вставить этот json-объект:
xxxxxxxxxx
[
{
"label": "Swift Build",
"command": "swift build",
"env": {},
"use_new_terminal": false,
"allow_concurrent_runs": false,
"reveal": "always",
"reveal_target": "dock",
"hide": "on_success",
"shell": "system"
},
{
"label": "Swift Test",
"command": "swift test",
"env": {},
"use_new_terminal": false,
"allow_concurrent_runs": false,
"reveal": "always",
"reveal_target": "dock",
"hide": "never",
"shell": "system"
},
{
"label": "Swift Run",
"command": "swift run",
"env": {},
"use_new_terminal": false,
"allow_concurrent_runs": false,
"reveal": "always",
"reveal_target": "dock",
"hide": "on_success",
"shell": "system"
}
]
Пояснения к опциям:
label
: имя задачи, отображаемое при порожденииcommand
: команда оболочки, выполняемая задачейuse_new_terminal
: еслиfalse
, запускается внутри встроенного терминала Zedallow_concurrent_runs
: предотвращает одновременный запуск задачи несколько разreveal
: устанавливает, когда показывать терминал (рекомендуется «always
«)hide
: автоматически скрывает терминал после успешного выполненияshell
: использует системную оболочку по умолчанию (обычно zsh или bash)
Сохраните и ваша задача выполнена, теперь нам нужно иметь какую-то привязку клавиш, чтобы легко запускать эту задачу.
Давайте откроем карту клавиш:
xxxxxxxxxx
~/.config/zed/keymaps.js
И после этого вам решать, в каким клавишам вы привяжете запуск, читайте официальную документацию.
Я покажу, как это делаю я:
xxxxxxxxxx
{
"context": "Editor && vim_mode == normal && vim_operator == none && !VimWaiting",
"bindings": {
"space l g": ["task::Spawn", { "task_name": "Lazygit" }],
"space s b": ["task::Spawn", { "task_name": "Swift Build" }],
"space s t": ["task::Spawn", { "task_name": "Swift Test" }],
"space s r": ["task::Spawn", { "task_name": "Swift Run" }],
"space e": "workspace::ToggleLeftDock",
"space o r": "projects::OpenRecent",
"cmd-shift-o": ["workspace::SendKeystrokes", "cmd-p"], /// Remapping cmd-p to more xcode like search withing project files
"space p t": "project_panel::ToggleFocus",
"space f e d": "zed::OpenSettings",
"space o t": "workspace::OpenInTerminal"
}
}
Поскольку я использую режим vim, мне нужно проверять предварительные условия перед запуском, поэтому для меня сборка Swift выполняется по space + s + b
, тестирование по space + s + t
, а запуск по space + s + r
.
Если у вас включена функция on_success
, то каждый раз, когда сборка завершается успешно, она будет скрывать себя. Если у вас будет значение never
, то терминал никогда не будет скрываться, для меня это хорошо для тестов, потому что я вижу и убеждаюсь, что тесты выполняются и они зеленые.
Заключение
Zed еще предстоит пройти путь, прежде чем он сможет по-настоящему заменить Xcode. Но это уже хороший шаг на пути к более простому, быстрому и удобному редактору, который многие из нас хотят получить, к чему-то стабильному и настраиваемому, где работа со Swift, создание и тестирование (по крайней мере, наших Swift-пакетов) снова будут казаться естественными.
Спасибо за чтение и удачного кодинга .
-
Видео и подкасты для разработчиков4 недели назад
Как устроена мобильная архитектура. Интервью с тех. лидером юнита «Mobile Architecture» из AvitoTech
-
Новости4 недели назад
Видео и подкасты о мобильной разработке 2025.10
-
Новости3 недели назад
Видео и подкасты о мобильной разработке 2025.11
-
Видео и подкасты для разработчиков2 недели назад
Javascript для бэкенда – отличная идея: Node.js, NPM, Typescript