Статьи

Святой взлом, Бэтмен! Создайте рабочие процессы Alfred в Ruby

Альфред

Эта статья была рецензирована Фредом Хитом . Спасибо всем рецензентам SitePoint за то, что сделали контент SitePoint как можно лучше!

За последние несколько лет появилось множество инструментов для повышения производительности клавиатуры:

  • Гном До
  • Launchy
  • ртуть
  • синапс
  • LaunchBar

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

Примечание: Альфред является OSX-эксклюзивным.

Одна из замечательных особенностей Альфреда — это возможность создавать свои собственные рабочие процессы . Они могут быть построены с использованием встроенного редактора, опционально включая ваши собственные скрипты, написанные на PHP, Shell, Python…

… и Руби.

В этом уроке мы создадим простой рабочий процесс генератора случайных чисел с использованием сценария Ruby.

Пользовательский поиск

Прежде чем мы перейдем к рабочим процессам, давайте посмотрим, что может сделать Альфред, создав специальный поиск в Интернете для поиска SitePoint. Это достаточно просто сделать в редакторе. Во-первых, нам нужно выяснить URL-адрес, который мы можем использовать для поиска по сайту. Введите что-нибудь в поле поиска SitePoint и посмотрите, какой тип URL генерируется.

На момент написания статьи в поиске сгенерированного ‘ruby’ sitepoint.com/?s=ruby .

Откройте окно настроек Альфреда и перейдите на вкладку «Функции». С левой стороны выберите «Веб-поиск». В правом нижнем углу нажмите «Добавить пользовательский поиск».

web_searches

Название это имя, которое будет отображаться в Альфред. SitePoint работает нормально. Ключевое слово — то, что мы введем. Например, мы могли бы использовать sp .

В качестве URL-адреса поиска введите: http://sitepoint.com/?s={query} . {query} — это универсальный альфредский способ ссылки на аргумент, указанный после ключевого слова.

sitepoint_web_search

После создания пользовательского поиска активируйте Alfred (cmd + пробел по умолчанию) и введите ключевое слово и запрос. Как только вы увидите, что ключевое слово распознано, нажмите Enter, и браузер по умолчанию должен открыть результаты поиска SitePoint для этого запроса.

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

Альфред Рабочие процессы?

Во-первых, прежде чем пытаться что-либо делать с рабочими процессами, убедитесь, что у вас есть Alfred Powerpack — в основном, версия Pro для Alfred.

Рабочие процессы могут выполнять различные задачи, при этом самым простым является поиск. Они представлены наборами узлов, соответствующих различным объектам рабочего процесса:

  1. Триггеры — активируются горячей клавишей или внешним событием
  2. Входные данные — активируются с помощью ключевого слова, необязательный аргумент
  3. Действия — открывать или открывать файлы, выполнять поиск в Интернете, запускать скрипты / команды
  4. Выходы — используйте информацию из других узлов для генерации уведомлений, копирования данных в буфер обмена или запуска сценариев

Рабочий процесс может содержать более одного пути к узлу. Например, вы могли бы иметь ключевое слово для одной вещи и горячую клавишу для чего-то другого.

colors_workflow

Цвета — пример сложного рабочего процесса.

К счастью, для решения многих общих задач вам не нужно создавать собственные рабочие процессы. Пользователи загружают их в течение достаточно долгого времени, и теперь вы можете найти большинство на http://www.packal.org/ .

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

Давайте преобразуем наш поиск по SitePoint в рабочий процесс, чтобы мы могли поделиться им с нашими друзьями. Это достаточно просто сделать в редакторе без кода.

Откройте окно настроек Альфреда и перейдите на вкладку «Рабочие процессы». Левая сторона имеет панель с знаком «+» внизу. Нажмите его и выберите Шаблоны-> Интернет и URL-> Открыть пользовательский URL в указанном браузере .

sitepoint_workflow_create

Это создаст рабочий процесс с узлом Keyword узлом Open URL .

sitepoint_workflow_nodes

Для узла Keyword укажите ключевое слово и заголовок. Вы также можете поместить что-то в поле подтекста, чтобы было более понятно, что делает ключевое слово.

sitepoint_workflow_keyword

Для узла « Open URL добавьте URL, который мы использовали для нашего предыдущего пользовательского поиска, http://sitepoint.com/?s={query} .

sitepoint_workflow_url_open

Теперь, если вы откроете Alfred и введете ключевое слово, которое вы использовали в узле ключевого слова, вы увидите, что оно появилось. Введите аргумент, и ваш браузер по умолчанию откроется с результатами поиска в SitePoint (при условии, что параметр URL для поиска не изменился с момента написания этой статьи — что, безусловно, возможно, если вы читаете в далеком будущем).

Одной из причин создания рабочего процесса является то, что мы можем поделиться им или сохранить его. Под списком рабочих процессов есть кнопка « share . Нажмите на нее и появится кнопка «Экспорт рабочего процесса». После того как вы сохранили его где-то, вы можете проверить его .workflow удалив рабочий процесс из списка и открыв (дважды щелкнув) вновь созданный файл .workflow . Он снова появится в списке и будет доступен для использования снова. Когда мы начнем добавлять ресурсы, такие как скрипты, они станут инкапсулированными в файле .workflow , поэтому это единственное, что нужно передать.

Примечание. Возможно, вам придется указать OSX связать файлы .workflow с Альфредом. В настоящее время не существует способа импортировать рабочие процессы из Alfred.

Приглашение Руби на вечеринку

Давайте создадим рабочий процесс, который предоставляет ключевое слово, которое генерирует случайное число. Вам не нужны никакие библиотеки для использования Alfred в Ruby. Вот две основные вещи, необходимые для рабочего процесса написания ключевых слов:

  1. {query} используется в качестве аргумента ключевого слова, если необходимо
  2. XML-строка элементов, отправляемых на стандартный stdout

Сначала создайте новый пустой рабочий процесс (назовите его «Случайное число»). В правом верхнем углу рабочей области Node щелкните значок «+»:

skich

Добавьте узел Inputs-> Script Filter . Фильтр сценария запускает сценарий, когда мы вносим изменения в поле ключевого слова, и может показывать нам список элементов (часто предложения или результаты поиска). Выберите ключевое слово (я использовал ‘rando’) и установите Ruby в качестве языка.

Как минимум, для вывода XML нужны узлы xml->items->item->title .

Поместите следующее в область сценариев:

 random = rand(1000) xml = <<EOS <xml> <items> <item> <title>#{random}</title> </item> </items> </xml> EOS puts xml 

Примечание: это наследственность, поэтому отступ имеет значение …

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

Альфред имеет больше, чем входные узлы. Давайте сделаем так, чтобы рабочий процесс скопировал случайное число, сгенерированное в буфер обмена. Чтобы объекты рабочего процесса Альфреда после фильтра сценариев могли получать данные, мы должны указать свойство arg в узлах item XML:

  <item arg="#{random}"> <title>#{random}</title> </item> 

Затем добавьте Outputs->Copy to Clipboard и перетащите в него соединение из фильтра сценариев.

Это немного не интуитивно понятно, но это {query} а не {arg} который относится к значению, установленному для атрибута arg в узлах XML элементов. Итак, в выходном узле буфера обмена просто введите {query} .

Теперь, если вы снова вызовете random ключевое слово и нажмете клавишу ввода, следующий текст должен быть вставлен.

Хотя это работает, было бы полезно, если бы было больше отзывов для пользователя. Создайте Outputs->Post Notification и перетащите в него соединение из фильтра сценариев. Для текста используйте {query} was copied to the clipboard

random_workflow_nodes

И теперь, если вы попробуете ключевое слово еще раз, вы должны увидеть уведомление OSX при нажатии Enter.

Bash — единственный тип сценария Альфреда

Этот пример был довольно тривиальным, но редактирование сложных сценариев Ruby в поле простого сценария Альфреда работать не будет. Поэтому мы переместим код Ruby в файл, а затем выполним его с помощью сценария bash Alfred.

Вот где все может быть сложно.

Если вы используете менеджер версий Ruby, такой как rvm или rbenv , то вы, вероятно, не хотите смешивать гемы между Альфредом и другими вашими проектами Ruby. Стандартная процедура заключается в использовании /usr/bin/ruby в сценариях Альфреда, поэтому вы захотите найти способ добавить для него гемы, а не ваш менеджер Ruby. Если вы обычно используете систему Ruby и зависите от bundler для управления гемами, то все готово.

В противном случае, если вы используете rvm используйте системный ruby ​​перед установкой гемов с помощью:

 $ rvm system 

Теперь измените тип сценария с /usr/bin/ruby на /bin/bash и переместите
сценарий к файлу произвольно называется main.rb в папке рабочего процесса. Вы можете попасть в папку с помощью «Открыть папку рабочего процесса» в правом нижнем углу представления узла фильтра скриптов.

Теперь для нашего скрипта нам просто нужно:

 /usr/bin/ruby main.rb {query} 

final_random_script_filter

Ключевое слово должно снова работать в Альфреде. Теперь, когда мы вернулись в дружественное подсвеченное синтаксисом пространство нашего любимого текстового редактора, мы можем работать над более сложными сценариями.

Лучший формат представления

XML не самый податливый формат. Поскольку наши сценарии Альфреда становятся более сложными, мы хотим, чтобы с ними работало что-то более лаконичное, например хэши Ruby. Есть несколько доступных решений, но давайте попробуем гёку здесь:

 $ gem install gyoku --version 1.3.1 

Теперь мы можем заменить XML на хеш:

 require 'gyoku' random = rand(1000) hash = { xml: { items: { item: [ { title: random, :@arg => random } ] } } } xml = Gyoku.xml(hash) puts xml 

Несколько вещей, о которых стоит упомянуть:

  • :@arg — это то, как мы указываем атрибут XML arg в gyoku .
  • Массив находится на ключе :item а не на :items

Возможно, вы заметили, что наш рабочий процесс на самом деле ничего не делает с {query} заданным для ключевого слова. Давайте исправим это с последним примером кода. Окончательный рабочий процесс будет генерировать несколько случайных целых чисел, которые пользователь указывает:

 require 'gyoku' DEFAULT_ITEMS = 3 num_items = query = (ARGV[0] || DEFAULT_ITEMS).to_i hash = { xml: { items: { item: [] } } } num_items.times do random = rand(1000) item = { :title => random, :@arg => random } hash[:xml][:items][:item] << item end xml = Gyoku.xml(hash) puts xml 

Поскольку мы передаем {query} в /usr/bin/ruby main.rb в узле фильтра скрипта, мы обращаемся к нему через ARGV[0] внутри скрипта. Это строка, поэтому мы конвертируем ее в целое число с помощью String#to_i .

Вывод

У Альфреда действительно есть библиотека Ruby. Но, понимая, как все работает на самом деле, вам не нужно будет зависеть от этого и рискнуть оказаться в неведении, если он не будет работать так, как вы ожидаете.

В следующей статье я надеюсь рассмотреть практические рабочие процессы Ruby, которые взаимодействуют с веб-сервисами и приложениями OSX.