воскресенье, 4 сентября 2011 г.

Mac OS Automator - Open In Terminal

В маке есть отличная штука для автоматизации, упрощения и расширения возможностей ОС. Штука эта называется Automator.

Итак... Once time upon...
Была сессия и надо было сконвертировать и переименовать огромное количество грфических файлов шпор... Рутиная монотонная работа... Как раз для Автоматора! =)

Запускаем автоматор. Он предлагает нам следующие варианты:



  • «Процесс» — это самая простая последовательность действий, которая может быть запущена непосредственно из Automator.




  • «Программа» является автономным процессом и может быть сохранена в виде обычного приложения Mac OS X с расширением *.app.




  • «Служба» — это процесс, который зависит от контекста, может быть использован во всей системе или отдельных приложениях.




  • «Действие папки» запускается только для указанной в нем папки и инициализируется добавленными в неё объектами.




  • «Плагины печати» используются для расширения возможностей диалога печати.




  • «Напоминания iCal» — это процессы, которые запускаются благодаря событиям, добавленным в iCal.




  • И, наконец, «Плагин захвата изображений» может быть использован в соответствующем приложении для обработки фотографий, загружаемых с камеры.






  • Я хотел сделать так: выделяешь файлы в папке, жмешь переименовать, указываешь шаблон и вперед! Для реализации задумки нам нужно будет сделать службу.

    Выбираем Службу.
    Службу можно сделать как межпрограммную, так и только для программы Finder, например.

    Реализуется это очень просто:
    выбираем "Заменить текст в именах объектов Finder"



    Вот и все! Но! пока я писал этот пост, у меня в голове всплыла давняя мысль реализовать возможность открытия папки в Терминале  из Finder.


    Для решения этой задачи нам нужно будет написать службу Finder.

    Итак! Создаем новую службу.
    Нужно узнать путь к выбранной папке и сохранить его в переменную...
    Выбранную папку нам предоставит сама служба. А в сохранении пути к ней нам поможет "Установить значение переменной".

    Теперь нужно собственно запустить Терминал и попросить его перейти в нужную нам директорию.

    Вот тут-то и начинается веселье. Запустить терминал можно несколькими способами.


    То есть, можно просто "Запустить программу", можно "Запустить процесс" или даже Shell-скрипт вида /bin/bash :)

    Но нам требуется не просто запустить Терминал, а еще заставить его перейти в конкретную папку...

    Я долго пытался реализовать это стандартными путями вида "Запустить программу", "Запустить shell-скрипт"... Но что-то у меня ничего не вышло.

    Оставалось только "Запустить AppleScript"... Я давно хотел разобраться с этим зверем, поэтому как раз решил совместить приятное с полезным.
    Идея проста: запустить терминал и попросить его перейти в нужную папку.

    Итак, после действия "Установить занчение переменной" добавляем "Запустить AppleScript".


    Вопрос первый: как запустить Терминал?
    Ответ:

    tell application "Terminal"
        activate
    end tell


    Вопрос второй: как заставить его что-нибудь сделать?
    Ответ на этот вопрос я нашел такой: ( если кто знает лучше - пишите! )

    tell application "Terminal"
    	activate
    	do script "echo test"
    end tell

    Итак, запускать и управлять терминалом мы умеем. Теперь это все надо объяснить.

    Видим, что есть некий аргумент input.   Очевидно,что в нем будет содержаться то, что вернет предыдущий модуль. А это в свою очередь путь к папке.

    Но! не так-то все просто! Путь к папке получается в виде: Macintosh HD:Users:user:Desktop:
    А реальный путь, приемленый для Терминала это /Volumes/Macintosh HD/Users/user/Desktop/

    Значит нам надо:
    - заменить все : на / ;
    - добавить в начало /Volumes/ ;
    - заэкранировать пробелы.

    Вот ту еще один сюрприз: у крутого AppleScript нет функции вида str_replace() ))))
    Но есть костыль:

    on replaceText(find, replace, subject)
    	set prevTIDs to text item delimiters of AppleScript
    	set text item delimiters of AppleScript to find
    	set subject to text items of subject
     
    	set text item delimiters of AppleScript to replace
    	set subject to "" & subject
    	set text item delimiters of AppleScript to prevTIDs
     
    	return subject
    end replaceText


    Достаточно оригинальный и красивый способ! Мне понравился! =)

    Итак, все вместе:

    on run {input, parameters}
     
    	(* Add /Volumes/ for creating absolutely posix path *)
    	set input to "/Volumes/" & input as string
     
    	set input to get replaceText(":", "/", input as string)
     
    	set input to get replaceText(" ", "\\ ", input as string)
     
     
    	tell application "Terminal"
    		activate
    		do script "cd " & input as string
    	end tell
    end run
     
    on replaceText(find, replace, subject)
    	set prevTIDs to text item delimiters of AppleScript
    	set text item delimiters of AppleScript to find
    	set subject to text items of subject
     
    	set text item delimiters of AppleScript to replace
    	set subject to "" & subject
    	set text item delimiters of AppleScript to prevTIDs
     
    	return subject
    end replaceText
     


    Теперь у меня в Finder есть такая штука:


    That's all Folks! ;)

    Более подробная информация здесь и здесь ;)

    Хочу сказать, что какого-либо хорошего пособия по AppleScript и Automatorя не видел. Печально. Если у кого есть что, то дайте знать!

    Комментариев нет:

    Отправить комментарий