Developer's Blog

Python で Xcode を操作してみようという話

iPhone アプリを作成するのに欠かせないのが Xcodeですね。このリッチで優秀な IDE は今も着実に改良を重ね次第に使いやすくなっています。このような環境で開発できることは大変幸せなことであるわけですが、不幸にも僕の体はもはや Emacs 以外のエディタを使うことができません。とりあえずは Xcode の外部エディタに Emacs を設定して急場を凌いでいるわけですが、Xcode の各種機能は組み込みエディタと強力に連携しており、外部エディタを使用しているマイノリティは、大変肩身の狭い思いをしていると言わざるを得ないでしょう。

この状況を改善しなければなりません。そこでその第一歩目として AppleScript 経由で Xcode に以下の操作をさせてみたいと思います。

  • ビルド
  • デバッグ開始
  • 指定したファイルを開く

これができれば、外部エディタからこれらの操作ができることになるので夢が広がりますね。

さて早速始めたいのですが、僕は AppleScript が書けません。なので Python から AppleScript を叩くための py-appscript という Python モジュールを利用して Python で Xcode を操作したいと思います。インストールは EasyInstall を利用して以下で行うのが楽です。

> easy_install appscript

さて前置きも長くなりましたし、説明よりも結論をみていただいた方がてっとり早いのではないかと思います。以下のコードは現在開いているプロジェクトを「ビルド」します。

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Usage: xcode_build.py

from appscript import *

xcode = app('Xcode')  # xcodeオブジェクトを作成して
xcode.build()         # ビルドする

どうでしょうか、これ以上は省略できないくらいシンプルです。これくらいなら隙間時間に試してみる気になります。この勢いで「デバッグ開始」も行ってみましょう。

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Usage: xcode_debug.py

from appscript import *

xcode = app('Xcode')    # xcodeオブジェクトを作成して
xcode.debug()           # シミュレータでdebug起動する

これもシンプルですね!このように app メソッドで Xcode アプリケーションオブジェクトを作成し、このオブジェクトを介して Xcode に様々な操作ができます。そうすると次は「他にどんなことができるんだ!」と思う訳ですが、AppleScript エディタを起動して「ファイル」=>「用語説明を開く」で Xcode を選択して下さい。使用できる操作や関連するオブジェクト(プロジェクトやファイル等)のリファレンスが一覧できます。

最後の「指定したファイルを開く」は少し複雑です。ファイルを開いた後に select_character_range でカーソルをセットしています。こうすることで開きたいファイルの開きたい箇所をパッと開けます。また Xcode オブジェクトを activate することで、Xcode を最前面に持ってきています。

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Usage: open_in_xcode.py file_path file_position

from appscript import *

filepath  = sys.argv[1].replace('/', ':')[1:]
filerange = int(sys.argv[2])

xcode = app("Xcode")             # xcodeオブジェクトを作成して
xcode.activate()                 # xcodeを最前面に
target = xcode.open(filepath)    # 指定したファイルを開いて
target.selected_character_range.set([filerange,filerange])  # 指定箇所にカーソル移動

今回は以上になります。駆け足でしたが Xcode を外部から操作することで広がる可能性を少しでも感じていただけましたでしょうか。本文中のコードはかなり単純化しているので、そのままでは使いにくいです。エラー処理等も含めて色々試していただくきっかけになれば幸いです。また AppleScript のラッパーは Python に加えて Ruby も使用可能なので(Objective-Cにもラッパーがありますが、ここでの用途には合わないです)、Python, Ruby が好きな iPhone プログラマの方はぜひお試しください。

Copyright © 2019 Fenrir Inc. All rights reserved.