Создайте свой первый пакет Atom
Введение в атом
Atom — это текстовый редактор с открытым исходным кодом (в основном используемый разработчиками), который является мультиплатформенным и разработан компанией GitHub. Он основан на фреймворке Electron, разработанном Github, который позволяет разработчикам создавать собственные настольные приложения для любых операционных систем с помощью написания кода Javascript.
Основная интересная особенность Atom заключается в том, что он также имеет отличный инструмент управления пакетами, а пакеты также написаны на Javascript, поэтому любой может легко создать их. Эта статья призвана рассказать об этом.
Наконец, его сообщество также активно, поскольку у него уже есть много доступных пакетов: 5 285 на данный момент.
Вы можете просмотреть все пакеты, перейдя по следующему адресу: https:/ /atom.io/пакеты
Однако, если вы не можете найти пакет, который соответствует вашим потребностям, вы можете начать создавать свой собственный, и мы увидим, насколько это просто.
Создайте свой первый пакет
Для того, чтобы создать свой собственный пакет, не волнуйтесь, вы не начнете с нуля. Действительно, мы будем использовать команду Package Generator, которая предоставлена нам ядром Atom.
Для этого вам просто нужно перейти в раздел Пакеты -> Генератор пакетов -> Создать пакет Atom.
[note]Для создания пакета вы можете выбрать язык между Javascript и Coffeescript . В этой статье будет использоваться Javascript.[/note]
Когда команда будет выполнена, Atom откроет новое окно в вашем проекте пакета, которое по умолчанию называется my-package.
Структура пакета
Теперь мы подробно рассмотрим, что находится внутри нашего каталога проекта пакета:
├── CHANGELOG.md ├── LICENSE.md ├── README.md ├── keymaps │ └── my-package.json <- Key shortcuts registered by your package ├── lib │ ├── my-package-view.js │ └── my-package.js <- Entry point of your package ├── menus │ └── my-package.json <- Menus declaration of your package into Atom application ├── package.json <- Description and library dependencies of your package ├── spec <- Tests directory (Jasmine) of your package │ ├── my-package-spec.js │ └── my-package-view-spec.js └── styles <- Stylesheets used by your package └── my-package.less
Первым элементом, который нужно добавить в пакет, является файл package.json, который должен содержать всю информацию о вашем пакете, такую как его имя, версия, тип лицензии, ключевые слова, которые позволят вам найти ваш пакет в Реестр Atom, а также зависимости вашего пакета.
Также обратите внимание, что существует раздел под названием activationCommands, который позволяет определить выполняемую команду при загрузке вашего пакета.
Затем у нас есть файл keymaps/my-package.json, который позволяет вам очень легко определять ярлыки в вашем пакете. Вот пример по умолчанию:
{ "atom-workspace": { "ctrl-alt-p": "my-package:toggle" } }
Далее мы перейдем к точке входа вашего пакета. Он находится в файле lib/my-package.js.
Этот файл экспортирует объект по умолчанию, который содержит свойство subscriptions, а также методы activate() и deactivate().
Во время активации пакета (внутри метода activate()) мы зарегистрируем объект типа CompositeDisposable внутри нашего свойства subscriptions, что позволит нам добавить и, возможно, позже удалить некоторые команды, предлагаемые нашим пакетом:
activate(state) { this.subscriptions = new CompositeDisposable(); this.subscriptions.add(atom.commands.add('atom-workspace', { 'my-package:toggle': () => this.toggle() })); }
Теперь, когда наша команда зарегистрирована, мы можем протестировать ее, просто введя следующие слова в палитру команд Atom: Мой пакет: Toggle.
Эта команда выполнит код, содержащийся в toggle() класса и отобразит небольшое модальное окно в верхней части окна.
Вы можете добавить столько команд, сколько хотите, и я настоятельно рекомендую вам отделить свой код.
Добавьте настройки для вашего пакета
Компонент Конфигурация позволяет вашему пакету иметь некоторые настройки.
Чтобы добавить новую настройку, вам просто нужно определить свойство config в классе вашего пакета, которое является объектом, содержащим определение каждой настройки, следующим образом:
config: { "gitlabUrl": { "description": "If you rely on a private Gitlab server, please type your base URI here (default: https://gitlab.com).", "type": "string", "default": "https://gitlab.com" } }
Настройки Atom допускают несколько типов настроек (boolean , color , integer , string , …), поэтому он может соответствовать вашим потребности в установке значений вашими пользователями.
После добавления, если вы перезагрузите свой пакет, вы увидите, что настройки вашего пакета появляются в настройках Atom:
Чтобы получить значение (или значение по умолчанию), определенное пользователем для данного параметра в вашем коде, вам просто нужно использовать следующую строку:
let gitlabUrl = atom.config.get('gitlabUrl');
Обзор компонентов
Итак, теперь вы готовы разработать свой пакет. У нас будет краткий обзор некоторых интересных компонентов, которые Atom предлагает вам и позволяет использовать в вашем пакете.
TextEditor: взаимодействие с текстовым редактором
С помощью компонента TextEditor вы сможете вставлять текст в пользовательский текстовый редактор, сохранять текущий файл, перемещаться вперед и назад по истории, перемещать курсор в редактор, копировать/вставлять в буфер обмена, играть с отступом строки, прокручивать и делать многое другое…
Вот несколько примеров вставки текста в определенное место и автоматического сохранения файла:
editor.setCursorBufferPosition([row, column]); editor.insertText('foo'); editor.save();
ViewRegistry & View: создание и отображение собственного окна
Эти компоненты позволяют создавать представления (модальные окна/окна) внутри Atom и отображать их.
У вас есть пример модального View в пакете по умолчанию:
export default class MyPackageView { constructor(serializedState) { // Create root element this.element = document.createElement('div'); this.element.classList.add('my-package'); // Create message element const message = document.createElement('div'); message.textContent = 'The MyPackage package is Alive! It\'s ALIVE!'; message.classList.add('message'); this.element.appendChild(message); } // ... } let myPackageView = new MyPackageView(state.myPackageViewState); let modalPanel = atom.workspace.addModalPanel({ item: myPackageView.getElement(), visible: false; }); modalPanel.show();
NotificationManager & Notification: оповещайте пользователей с помощью уведомлений
Ваш пакет также может отображать различные уведомления от «успешно» до «фатальной ошибки»:
atom.notifications.addSuccess('My success notification'); atom.notifications.addInfo('My info notification'); atom.notifications.addWarning('My warning notification'); atom.notifications.addError('My error notification'); atom.notifications.addFatalError('My fatal error notification');
GitRepository
Это тоже очень интересно: действительно, вы можете получить доступ ко всем свойствам git текущего используемого репозитория git.
Таким образом, вы сможете получить доступ к текущему имени ветки, удаленному URL-адресу репозитория, а также увидеть, считается ли файл новым или измененным файлом. Давайте посмотрим на это в действии:
let repository = atom.project.getRepositoryForDirectory('/path/to/project'); console.log(repository.getOriginURL()); // -> [email protected]:eko/atom-pull-request.git console.log(repository.getShortHead()); // -> master console.log(repository.isStatusNew('/path/to/file')); // -> true
И многое другое…
Мы только что сделали обзор компонентов, с которыми я играл, но я предлагаю вам прочитать больше по следующей ссылке, если вы хотите пойти дальше: https://atom.io/docs/api/latest/AtomEnvironment.
Протестируйте свой пакет со спецификациями
Наш пакет уже разработан, но мы не должны забывать о тестах. Для этого Атом использует Жасмин.
В вашем пакете по умолчанию уже есть готовый тестовый файл:
import MyPackageView from '../lib/my-package-view'; describe('MyPackageView', () => { it('has one valid test', () => { expect('life').toBe('easy'); }); });
Тесты спецификаций Jasmine записываются следующим образом:
- describe(): набор тестов Jasmine начинается с функции «describe», которая принимает имя в качестве первого аргумента и функцию в качестве второго.
- it(): спецификация добавляется с помощью этой функции, «это» должно содержаться в спецификации,
- expect() : это утверждение, когда мы ожидаем, что что-то произойдет.
Теперь ваша очередь поиграть с Жасмин и проверить логику вашего пакета.
Чтобы запустить тесты спецификаций, вам просто нужно перейти в следующее меню: Вид -> Пакеты -> Выполнить спецификации пакетов .
Опубликуйте свой пакет
Наш пакет готов к развертыванию! Отправим.
Для этого мы будем использовать инструмент командной строки apm, который поставляется вместе с Atom при его установке.
После отправки кода в репозиторий Github просто перейдите в каталог пакета и введите следующую команду. :
$ apm publish --tag v0.0.1 minor Preparing and tagging a new version ✓ Pushing v0.0.1 tag ✓ ...
Эта команда будет отвечать за создание тега новой версии в репозитории и публикацию этой версии в реестре Atom.
Поздравляем, ваш пакет теперь опубликован и доступен по следующему URL-адресу: https://atom.io/packages/‹your-package›!
Непрерывная интеграция
Последний шаг — убедиться, что ваш пакет продолжит работать в будущем, когда вы или ваши участники добавите новые функции, а также когда Atom выпустит новую бета-версию. Для этого вы можете использовать Travis-CI на своем репозитории со следующей конфигурацией:
language: objective-c notifications: email: on_success: never on_failure: change script: 'curl -s https://raw.githubusercontent.com/nikhilkalige/docblockr/develop/spec/atom-build-package.sh | sh' env: global: - APM_TEST_PACKAGES="" matrix: - ATOM_CHANNEL=stable - ATOM_CHANNEL=beta
Вывод
Лично я считаю, что это небольшая революция, позволяющая разработчикам создавать свой собственный редактор и привносить в него те функции, которые они хотят.
Более того, API Atom уже очень богат и очень прост в использовании, и это, безусловно, главная причина, по которой сообщество предлагает большое количество пакетов.
В заключение, как и для всех библиотек, бесполезно изобретать велосипед, создавая уже существующие пакеты. Идея состоит в том, чтобы добавить функции, если они еще не существуют, чтобы обогатить ваш пользовательский опыт.
Автор: Винсент Композье
Twitter: Винсент Композье