- PVSM.RU - https://www.pvsm.ru -

О форматировании кода и User Scripts в Xcode 4

О форматировании кода и User Scripts в Xcode 4Когда человеку надоедает делать рутинную работу, у него возникает дикое желание от этой работы избавиться. Однако, в реальной жизни избавиться от нее не так просто, и ее все, же надо делать. В зависимости от вида работы и от ее количества, можно поступать по-разному. Можно продолжать выполнять уже заученные действия, можно уйти в себя и копить злость на всех и вся, на этот мир, на начальника, на PM'a, на <вписать свою причину> А можно попытаться эту рутину автоматизировать.

А пост будет о конкретной задаче, которую надо автоматизировать(Code Formatting) и о том, как все-таки расширить Xcode всякими полезными вкусностями для дальнейших автоматизаций. В прошлый раз это был Copy Paste Detector [1]. А теперь пришло время Code-Formattera. Скажу сразу, что в здесь не поднимается вопрос, нужен ли автоматический Code-Formatter. Предполагается, что Вам он нужен. Если, все же не нужен — можно заглянуть под кат, чтобы вспомнить про возможность использовать внешние скрипты в Xcode.

Исходная задача — обеспечить возможность автоматического форматирования частей исходного кода в Xcode.
Сразу сходу несколько вариантов решения этой задачи:

  1. Продолжать форматировать вручную
  2. Использовать встроенную в Xcode Reindent
  3. Использовать пользовательские скрипты
  4. Использовать внешние программы-форматтеры, копировать в них текст из Xcode, форматировать, копировать текст обратно в Xcode
  5. Использовать Xcode параллельно с другими программами, в которых открыты файлы из Xcode проекта

Посмотрим, как они нам подходят.

Та я и руками поправлю! Я еще с Xcode 1.0 руками форматирую

Есть такие люди. Может, им и правда, не надо форматирование текста. Для тех, же, кому надо, но им лень:
О форматировании кода и User Scripts в Xcode 4
Это я к тому, что если задача (в частности форматирование кода), достаточно большая, то автоматизация выигрывает на долгой дистанции. Все в конце концов сводится к временным затратам. Но, даже если время на написание скрипта + время решения задачи немного больше, по сравнению, если б эту задачу делали руками, то все же, стоит попытаться написать такой скрипт — опыт автоматизации все-таки.

В Xcode и так оно есть… Нету? Значит и не надо.

Мнение автора, относительно команды Reindent, встроенной в Xcode: недостаточно для полнценного форматирования кода. Однако не по наслышке. многи люди, разрабатывающие под Xcode как раз только его и используют. Его, и иногда Code-Style. Иногда Code-Style где-то описан. и ему пытаются следовать.
Весь функционал Re-Indentа заключается в правильном выставлении пробелов/табов, а его настойки которого помещаются на одной вкладке меню Xcode. О форматировании кода и User Scripts в Xcode 4
Хоть этот вариант и не пестрит разнообразностью настроек, но у него есть просто огромное преимущество. Он встроен в Xcode. Не надо ничего устанавливать, никуда лезть в интерен. Выделяем кусок кода, нажимаем ^I. Может быть, именно эта часть нравится людям, яро защищающим Xcode.

Пользовательские скрипты? Так их же не стало в Xcode 4...

Да, в Xcode 4 много чего [2] не стало, по сравнению с Xcode 3. Пользовательские скрипты как раз в ходят в список того, чего не стало в Xcode 4. Люди в свое время были очень этим разочарованы [3].

Однако, добрые люди подумали-подумали, да и выкрутились. Стали использовать Automator Services [4]. Не совсем то, что люди раньше подразумевали под User Scripts в Xcode 3, но, многие задачи, они, все же, решают.

Интеграция в Xcode

Благодаря добрым людям и OpenSource'у интеграция в Uncrustify в Xcode стала ну очень простой задачей.

Проект по интеграции Uncrustify в Xcode через Automator Services лежит на GitHub [5].

Ставим Uncrustify (В последний раз, я ставил uncrustify при помощи homebrew [6], в принципе, как и описано в самом проекте), складываем свои скрипты-сервисы в правильную папку(~/Library/Services/Automator/). Профит. Если все сделано правильно, теперь в меню в Xcode появятся дополнительные команды, позволяющие форматировать код, и которые можно использовать не выходя из Xcode.
О форматировании кода и User Scripts в Xcode 4

А вот, что можно увидеть, выделив кусок кода и нажав правую кнопку:
О форматировании кода и User Scripts в Xcode 4

Куда дальше?

При выполнении всех вышеперечисленных шагов, у Вас появилась возможность автоматически форматировать текст в Xcode.

Что делать дальше — зависит от того, что вам было нужно до этого ;)

Если изначально была поставлена задача по автоматическому/полуавтоматическому форматированию кода, то стоит заняться настройкой файла конфигурации uncrustify.cfg. В этом, может помочь Universal Indent GUI [7] — кросплатформенный редактор code-formatter'ов, в том числе и для uncrustify.

В случае, если интерес был больше к возможности внедрения внешних скриптов в Xcode — то методом проб и ошибок, на примере уже готового подключенного сервиса, можно придмуать много полезных вещей.

Альтернативы

Лично от себя я бы порекомендовал посмотреть в сторону AppCode [8], о котором в свое время уже писали на Хабре [9]. Пусть, даже он и платный с 30-дневным триальным периодом. Вопрос о форматировании там решается совсем на другом уровне:
О форматировании кода и User Scripts в Xcode 4

Итого

Была бы задача. Решение всегда найти можно. Время от времени это решение будет правильным и работать быстро и устраивать многих.

Автор: Kilew


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/objective-c/4022

Ссылки в тексте:

[1] Copy Paste Detector: http://habrahabr.ru/post/137875/

[2] много чего : https://developer.apple.com/library/ios/#releasenotes/DeveloperTools/RN-Xcode/_index.html

[3] разочарованы: http://stackoverflow.com/questions/4935715/xcode-4-user-script

[4] Automator Services: http://www.macosxautomation.com/services/index.html

[5] GitHub: https://github.com/tonyarnold/Xcode-4-Uncrustify-Automator-Services

[6] homebrew: http://mxcl.github.com/homebrew/

[7] Universal Indent GUI : http://universalindent.sourceforge.net/

[8] AppCode: http://www.jetbrains.com/objc/

[9] писали на Хабре: http://habrahabr.ru/post/131206/