Site icon AppTractor

Настраиваем работу с iOS-проектами в Zed

Я всегда был энтузиастом текстовых редакторов и постоянно искал способы повысить производительность с помощью инструментов, быстрых клавиш и автоматизации. Когда вы пишете код по семь, восемь, а то и больше часов в день, наличие мощной и эффективной среды редактирования просто необходимо, по крайней мере, для меня. К сожалению, большинство современных IDE часто оказываются громоздкими, обремененными дополнительными функциями, которые вы совсем не используете, и очень медленными. Эти причины подтолкнули меня к изучению альтернатив, таких как Emacs, Spacemacs, Neovim и Vim.

Мое путешествие с хардкорными редакторами началось, когда я написал свою первую статью о Emacs в начале 2017 года. С тех пор я много экспериментировал, перепробовал бесчисленное количество конфигураций, плагинов и подходов. В течение последних двух лет Neovim был моим основным редактором, и я был невероятно продуктивен с ним. Однако недавно я заметил, что несколько опытных членов сообщества Neovim перешли на редактор под названием Zed. Естественно, меня разожгло любопытство.

После глубокого изучения Zed Industries, их видения, философии дизайна, инструментария и подхода мне не потребовалось много времени, чтобы испытать искреннее восхищение. Если такие известные разработчики, как Торстен Болл, перешли в Zed, это, безусловно, значимое подтверждение.

Сегодня я хочу поделиться тем, как я настроил Zed для своего любимого языка программирования Swift. Вместо исчерпывающего обзора самого Zed (возможно, это тема для другой статьи), эта статья посвящена практическим соображениям и практическим шагам по оптимизации вашего опыта программирования на Swift с помощью Zed. Давайте же погрузимся.

Расширение

Первое, что нам нужно сделать, это установить расширение Swift в редакторе Zed, чтобы получить автозавершение, диагностику, ошибки компилятора, предупреждения и другие языковые функции.

Настраиваем работу с iOS-проектами в 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:

~/.config/zed/settings.json

Если вы хотите загрузить LSP с нужного пути:

 "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, а затем напечатать:

open tasks

После открытия:

~/.config/zed/tasks.json

Вы найдете пример json-объекта, который показывает, как можно создавать свои собственные задачи, которые могут выполнять команды в терминале. Сейчас нам нужно создать задачу сборки Swift.

Вы можете скопировать и вставить этот json-объект:

[
  {
    "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"
  }
]

Пояснения к опциям:

Сохраните и ваша задача выполнена, теперь нам нужно иметь какую-то привязку клавиш, чтобы легко запускать эту задачу.

Давайте откроем карту клавиш:

~/.config/zed/keymaps.js

И после этого вам решать, в каким клавишам вы привяжете запуск, читайте официальную документацию.

Я покажу, как это делаю я:

 {
    "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-пакетов) снова будут казаться естественными.

Спасибо за чтение и удачного кодинга .

Источник

Exit mobile version