Archive for the 'Xcode' Category

2017/10/14 指定EnumがどのFrameworkに所属しているか検索 v2

文字列として与えたCocoaのEnumがどのFrameworkに所属しているかを検索するAppleScriptです。

macOS 10.12.6+Xcode 9.0、macOS 10.13.1beta+Xcode 9.0でためしてみました。指定クラスがどのFrameworkに所属しているかを調べるAppleScriptとは異なり、Enumの定義がどのFrameworkに所属している(らしい)かを調べるものです。Header Fileを調べまくって指定の文字列が入っているFramework名をリストアップします。

このために、「Class名として評価できない」ことを確認してから処理しています。

Xcodeのバンドル内のSDKの奥深くに存在するヘッダーファイル群に対してSpotlightで検索したらヒットしなかったので、(こんな時のために整備しておいた)NSFileManager経由でのファイル取得ルーチンによりHeader Fileを検索しています。

何かの正解というわけではなく、だいたいこのあたり・・・という「あたり」をつけるためのものです。開発環境で実行すると3.5sec程度かかります。

AppleScript名:指定EnumがどのFrameworkに所属しているか検索 v2
– Created 2017-10-13 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”
–http://piyocast.com/as/archives/4896

property NSFileManager : a reference to current application’s NSFileManager
property NSString : a reference to current application’s NSString
property NSPredicate : a reference to current application’s NSPredicate
property NSMutableArray : a reference to current application’s NSMutableArray
property NSUTF8StringEncoding : a reference to current application’s NSUTF8StringEncoding

set a1Res to searchEnumFromHeaderFiles(“NSUTF8StringEncoding”) of me
–>  {”DiscRecording.framework”, “Foundation.framework”, “SpriteKit.framework”}

set a2Res to searchEnumFromHeaderFiles(“NSNumberFormatterRoundUp”) of me
–>  {”Foundation.framework”}

set a3Res to searchEnumFromHeaderFiles(“NSParagraphStyleAttributeName”) of me
–>  {”AppKit.framework”}

on searchEnumFromHeaderFiles(targString)
  set aClass to current application’s NSClassFromString(targString)
  
if aClass is not equal to missing value then return false
  
  
set dPath to POSIX path of (path to application id “com.apple.dt.Xcode”)
  
set aFol to dPath & “Contents/Developer/Platforms/MacOSX.platform/” & “Developer/SDKs/MacOSX.sdk/System/Library/Frameworks”
  
  
set bList to retFullPathWithinAFolderWithRecursiveFilterByExt(aFol, “h”) of me
  
set matchedList to {}
  
  
repeat with i in bList
    set j to contents of i
    
    
set aStr to (NSString’s stringWithContentsOfFile:j encoding:NSUTF8StringEncoding |error|:(missing value))
    
if aStrmissing value then
      set aRange to (aStr’s rangeOfString:targString)
      
      
if aRange’s location() ≠ current application’s NSNotFound and (aRange’s location()) < 9.99999999E+8 then
        set tmpStr to (current application’s NSString’s stringWithString:j)
        
set pathList to tmpStr’s pathComponents()
        
set thePred to (current application’s NSPredicate’s predicateWithFormat:“pathExtension == ’framework’”)
        
set aRes to (pathList’s filteredArrayUsingPredicate:thePred)’s firstObject() as text
        
set the end of matchedList to aRes
      end if
      
    end if
  end repeat
  
  
set aArray to current application’s NSArray’s arrayWithArray:matchedList
  
set bArray to aArray’s valueForKeyPath:“@distinctUnionOfObjects.self”
  
return bArray as list
end searchEnumFromHeaderFiles

–指定フォルダ以下のすべてのファイルを再帰で取得(拡張子で絞り込み)
on retFullPathWithinAFolderWithRecursiveFilterByExt(aFol, aExt)
  set anArray to NSMutableArray’s array()
  
set aPath to NSString’s stringWithString:aFol
  
set dirEnum to NSFileManager’s defaultManager()’s enumeratorAtPath:aPath
  
  
repeat
    set aName to (dirEnum’s nextObject())
    
if aName = missing value then exit repeat
    
set aFullPath to aPath’s stringByAppendingPathComponent:aName
    
anArray’s addObject:aFullPath
  end repeat
  
  
set thePred to NSPredicate’s predicateWithFormat:“pathExtension == [c]%@” argumentArray:{aExt}
  
set bArray to anArray’s filteredArrayUsingPredicate:thePred
  
  
return bArray as list
end retFullPathWithinAFolderWithRecursiveFilterByExt

★Click Here to Open This Script 

2017/02/03 Xcode上のAppleScript編集で困ったトラブル

macOS, Sierra上でXcode 8.2を使ってAppleScriptのプログラムを組んでいたら、Xcodeがクラッシュ。

Xcodeのクラッシュ自体は珍しくもなんともありません。落とす気になれば、いつでも落とせる操作がいくつも存在するXcode。Xcodeが落ちるだけでなく、クラッシュの道連れになって、作っていたXcode Project(Cocoa-AppleScript applet)がおかしなことに。

Xcode内のInterfece BuilderでDelegateを選んでControlクリック。Outletなどの選択(GUI部品とのひもづけ)が行える黒い半透明のパレットが表示されるわけですが、

xcode1_resized.png

のきなみ⚠マークが表示され、あろうことか未接続のOutletや、

iboutlets.png

既存のイベントハンドラまで見えなくなってしまいました。

eventhandlers.png

さらに、おそるべきことにXcode上でAppleScriptを編集してIBOutletを追加したり、イベントハンドラを追加したり、逆にこれらをすべて削除してみてもInterface Builder上では反映されません。ほとんどホラー映画の世界です。削除したハンドラやOutletの情報は一体どこに残っているというのでしょう?

# こういう未経験のトラブルに直面したときに、Mailing Listに話を投げておくと、地球の裏側の時間帯のユーザーで知っている人がいれば(自分が寝ている間に)答えてもらえたりで、とってもMLは便利なんですが、いま動いていないし、、、

あわてて、Xcodeのバージョンを上げたり(8.2→8.3.1Beta)、下げたり(→7.3.1)、何かのOSAXやOSA言語コンポーネントが悪影響を及ぼしているのではないかと疑って調査してみたものの・・・どれも解決策になりません。

並行してedama2さんに相談。問題のXcode Projectをメールで送ってあーでもないこーでもない、と情報交換。

試行錯誤のすえに、問題らしきものが見えてきました。

xcode3.png

XcodeでAppleScriptのファイルを選択し、コンテクストメニューから「Open With External Editor」を選択し、自分の環境では「.applescript」にひもづけてあるASObjC Explorer 4でオープン。ASObjC Explorer 4で編集して保存してみたところ、XcodeにもどりInterface Builder上で、、、、

xcode2_resized.png

正常にOutletやEvent Handler(Received Actions)が表示されるようになりました(!!!!)。

改行コードや文字コードなど? Xcode上で編集中に一部の情報がおかしくなった部分が、外部エディタによる編集で修正されるのか、はたまた外部エディタで保存を行うことでXcode内でScriptの読み直しを行うためでしょうか。

何が原因なのか、正しく追求できているわけではないので、何によって解決されているのかを正しく表現することは困難です。ただし、このような状況に陥ったときに一度お試しいただきたい対処方法であります。

追伸:edama2さん、本当にいろいろお試しいただきありがとうございます。

2017/01/17 MJProjectKitでXcode Projectにアクセスして詳細な情報を取得する

オープンソースのフレームワーク「MJProjectKit」(By Martin Johannesson)を使ってXcode Projectにアクセスし、詳細な情報を取得するAppleScriptです。

同フレームワークは、これだけ破壊力が大きいものなのにあまり有名ではありませんでした。理由はいまひとつわかりませんが、おそらく「使い方がどこにも書かれていなかった」ためではないかと思います。

自分も「なんかいい感じのフレームワークかも」と思いつつ、呼び出しを試してみたものの、エラーが出るばかりでさっぱりでした。

現在のXcode project書類「.xcodeproj」はバンドル・パッケージであり、その実体はフォルダです。そこで、バンドル内のファイルまで選択できるように指定し、バンドル内の「project.pbxproj」を指定したところ問題なくXcode Projectの詳細情報にアクセスできました。ファイル選択→Xcode Projectへのアクセスのあたりのサンプルが出ていないと、さすがに使えないと思います(ーー;

dialog21.png

dialog22.png

本AppleScriptを実行するためには、MJProjectKitをビルドして~/Library/Frameworksフォルダに入れておく必要があります。

MJProjectKitは現行のXcode 8を完全にフォローできていないのか、まだ機能が不完全なためか、同フレームワークが用意しているオブジェクト階層をたどるための機能を使ってもうまく行かず、プロジェクト全体の情報をとってきて自前で階層構造をたどったほうがうまく行きそうな気配がしています(作業量が多くてたいへん)。

MJProjectKitは2013年以降メンテナンスされておらず、apparataによりSwiftで書き直された「ProjectKit」のプロジェクトのほうが活発なようです。

Github上でのMartin Johannessonの活動を調べてみると、このProjectKitに関与しているようで、目下apparataの一員として活動しているということなのでしょう。

AppleScript名:MJProjectKitでXcode Projectにアクセスして詳細な情報を取得する
– Created 2017-01-16 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “MJProjectKit” –https://github.com/memfrag/MJProjectKit
–http://piyocast.com/as/archives/4394

set aFile to POSIX path of (choose file with prompt “Select <project .pbxproj> file inside .xcodeproj bundle” with showing package contents)
set aURL to current application’s |NSURL|’s fileURLWithPath:aFile
set xCodePrj to current application’s MJProjectFile’s projectFileWithContentsOfURL:aURL |error|:(missing value)

set projList to xCodePrj’s specification()
set objList to objects of projList
set keyList to objList’s allKeys()
set keyEmu to keyList’s objectEnumerator()
set nArray to current application’s NSMutableArray’s alloc()’s init()

repeat
  set aKey to keyEmu’s nextObject()
  
if aKey = missing value then exit repeat
  
set aVal to objList’s valueForKey:aKey
  
set aKind to (aVal’s isa) as string
  
  
set eachKeyList to (aVal’s allKeys()) as list
  
  
repeat with i in eachKeyList
    set j to contents of i
    
set eachVal to (aVal’s valueForKey:j)
    
log {j, eachVal’s |description|() as string} –To support Apple’s Script Editor
  end repeat
  
end repeat

★Click Here to Open This Script 

2015/07/01 iTunes, iBooks Author, XcodeなどOS X 10.10.4に合わせてアップデート

OS X 10.10.4が公開され、同時にiTunes 12.2.0、iBooks Author 2.3、GarageBand 10.1、Xcode 6.4なども公開されました。

OS X 10.10.4では、既存のバグのうち直ったものもあれば直っていないものもあり・・・かつ長期的にテストするとやっぱり動いていないようなもの(Message.appのメッセージ受信などのイベントハンドラで実行するAppleScriptについては、長期間テストしてみると動かないケースもあったりで)もあり、10.10.x系列のバグ取りに協力すべきなのか10.11系列のテストに移行すべきなのかいまひとつはっきりしません。

とりあえず、AppleScript的に見た各アプリケーションの対応度の変化を調べてみました。用語辞書レベルではとくに変化はないように見えます(すべて前バージョンとdiffで比較してみました)。

iTunes 12.2

AppleScript用語辞書の内容について、前バージョンからの変化はありません。

iBooks Author 2.3

用語辞書はついているものの、アプリケーションの機能をほとんどサポートしておらず、「仕事しているフリ」というレベルです。前バージョンと変化はありません。現状では本アプリで行う仕事を自動化するのに役立つ機能はAppleScriptなどのOSA言語からは一切利用できません(書類のオープンとクローズができる程度)。

GarageBand 10.1

ものすごく割り切ったAppleScript用語辞書がついています。renderPreviewという1つの命令のみ実装されており、

renderPreview v : Render an iLife Preview for a project
 renderPreview [file] : Reference to the project

という内容のようですが、これが本当に役立つものかどうかは不明です。あと、説明がそっけなさすぎて「iLife Preview」の指すものが、GarageBandのファイルなのか、iPhoto/Photos、iTunesなどのiLife Applicationのデータなのかがよくわかりません。

Xcode 6.4

前バージョンからの変更点はAppleScript用語辞書的にはありません。Xcodeによる開発作業やプロジェクトの自動解析などに役立つレベルの実装にはなっていません。

2015/02/06 Xcodeでstringsファイルを取得して、行数をかぞえる

Xcode 6.1.1でASOCのプログラムを作っていて、ローカライズ情報を編集していたら、各言語のローカライズ情報に不整合が出てしまい・・・それを検出するためにためしに作ってみたAppleScriptです。

Xcode Project内のファイル一覧のselectionが取得できないかどうか試してみたものの、Xcodeのselectionはテキストエディタ上で選択したテキストのみであり、(いまさら言うまでもありませんが)それほど(XcodeをAppleScriptからコントロールして)凝った処理ができるわけではありません。

本来であれば、selected fileといった「ファイル一覧で選択中のファイル」を取得できるようにして、それらに対して処理を行うといったScriptが書けるべきです。しかし、現状のXcodeの用語辞書はそういう処理が書けるようにはなっていません。

そこで、用途をおもいっきり狭くして機能を限定的にして、

「Xcode Projectからproject directory(POSIX path)を取得して、mdfindで”MainMenu.strings”ファイルを検索して行数をかぞえる」

というScriptに仕様変更。行数をかぞえて各言語ごとの整合性を比較。行数をかぞえて見当をつけて、最終的にはFileMergeで各言語ごとの差異をチェックすることに。ほぼ作り捨てレベルのScriptです。

xcode10.png

せっかくXcodeのAppleScript用語辞書から、AppleScript Studio関連の膨大な用語を追い出したんですから、もっとまともな用語辞書を備えてもいいはずなんですが、XcodeのAppleScript用語辞書は「現場の開発作業」を何も便利にしないので、もう一回用語辞書を1から作り直したほうがいいと思います。

まるで、やらされ仕事というか、とりあえず仕事をしたという風に見せかけて実質何もよくなっていないという、一番よくない見本です。

Xcodeには文句しか言ったことはありませんが、最近になって、アプリケーションのテスト実行時の言語環境が指定できる機能がつきました。これはいいと思います。

xcode11.png

AppleScript名:Xcodeでstringsファイルを取得して、行数をかぞえる
tell application “Xcode”
  tell workspace document 1
    tell project 1
      set proDir to project directory
      
–> “/Users/me/Documents/Projects/ThisApp/”
    end tell
  end tell
end tell

set strList to getFileListWithSpotLight(“kMDItemFSName”, “MainMenu.strings”, proDir)
set sLenList to {}

repeat with i in strList
  set j to contents of i
  
set sRes to do shell script “wc -l “ & quoted form of POSIX path of j
  
  
set the end of sLenList to sRes
  
end repeat

sLenList
–> {” 161 /Users/me/Documents/Projects/ThisApp/v31__scripting_Final_Finishing/ASDiff/fr.lproj/MainMenu.strings”, ” 161 /Users/me/Documents/Projects/ThisApp/v31__scripting_Final_Finishing/ASDiff/en.lproj/MainMenu.strings”, ” 161 /Users/me/Documents/Projects/ThisApp/v31__scripting_Final_Finishing/ASDiff/ja.lproj/MainMenu.strings”}

–指定階層下で、指定メタデータが指定パラメータであるファイルを取得(alias list)
on getFileListWithSpotLight(aMetaDataItem as string, aParam as string, startDir as {alias, string})
  set sDirText to quoted form of POSIX path of startDir
  
set shellText to “/usr/bin/mdfind ’” & aMetaDataItem & ” == \”" & aParam & “\”’ -onlyin “ & sDirText
  
try
    set aRes to do shell script shellText
  on error
    return {}
  end try
  
set pList to paragraphs of aRes
  
set aList to {}
  
repeat with i in pList
    set aPath to POSIX file i
    
set aPath to aPath as alias
    
set the end of aList to aPath
  end repeat
  
return aList
end getFileListWithSpotLight

★Click Here to Open This Script 

2015/01/20 Xcode上のASOCにScript Editor上のASOCの機能を移植する

最初、AppleScriptObjC(Cocoaの機能を呼び出せるAppleScript)というのは、Xcode上でしか書けないものでした(OS X 10.6で登場)。

asoc1.png

それが、10.7、10.8、10.9、10.10と進化するにしたがい、実行環境や記述環境が広がっていきました(これらのほかに、AutomatorやFileMaker Pro上の実行環境もありますが、ここでは扱いません)。

当初、OS X 10.6で導入されたXcode上のASOCは、同様にXcode上でGUIベースのAppleScriptアプリ開発を行う「AppleScript Studioの置き換え」と言われてきたため、Cocoaの機能を利用するのはもっぱらGUIまわりの部分だけで、内部処理の部分は従来のピュアなAppleScript(Cocoaの機能を利用しない)で作られることが多かったように思います(そうでないケースもありますが)。

OS X 10.10になってCocoaの機能を呼び出すASOCが、ほぼ通常のAppleScriptと不可分の位置付けとなったため、通常のAppleScriptでも積極的にCocoaの機能を利用するよう本Blogでも方向転換を行い、内部処理もCocoaの機能を呼び出すScriptでXcode上のASOCアプリケーション開発も行うようになりました。

実際に、実践的なAppleScriptのプログラム(レコードのリスト同士のdiffを求める)で試してみたところ・・・ピュアなAppleScriptだけで書いたものが420行、処理に10秒ちょっとかかっていたのが、ASOCで1からすべて書き直したところ行数が270行に(40%減)、処理速度は8.4倍の1.2秒までに短縮されました。

# 上記の処理時間計測は、考えられるMAXのサイズのテストデータを処理させたものです

asoc2.png

そこで、GUIアプリ開発環境であるXcode上のASOCにこのScriptを移し替えたいよね、という話に(必然的に)なるわけです。

ASOC on XcodeにASOC on Script EditorのScriptを

ASOC on Xcodeでは、プロジェクト作成時に自動的に作成されるdelegate scriptには、アプリケーション本体のさまざまな挙動(GUIに近い部分とか)を記述し、処理本体部分は別のScriptに追い出して記述するのが自分の流儀です。

というわけで、本体scriptから外部script(bundle内に存在)を呼び出すことになります。このあたりは、XcodeのInterface Builder上で、

asoc3.png

NSObjectの部品を画面上に配置して、そのNSObjectのclassを外部Scriptのscript文で指定したclassと同じものに設定。

asoc4.png

delegate script側で外部script連結用のpropertyを作成して、

asoc5.png

Interface Builder上でpropertyとNSObjectをつなげば、delegate script側から外部scriptのハンドラを呼び出せるようになります。まだ、ここまでは「準備」の部分です。

asoc62.png

ハンドラの書き方、呼び出し方が問題

〜delegate scriptから外部script上のハンドラを呼び出す

asoc7.png

外部script呼び出し用に作成したproperty(ここでは、diffLib)を用い、

  diffLib’s testMe:”TEST”

のように書きます。

呼び出される側のハンドラ側についてはOS X 10.10では、(1)パラメータの型指定、および(2)パラメータ省略時のデフォルト値指定ができるようになっていますが、ASOC on Xcodeでは(1)のみ可能でした。

  on testMe:aStr as string–parameter casting

(2)はコンパイル時にエラーになってしまいます。

  on testMe:aStr as string:”"–default value–Error
  on testMe(aParam as string:”")–Error

外部script内で他のハンドラを呼び出す

asoc8.png

ここで問題。Script Editor上のASOCで書いていたハンドラは、

  testSub(param1,param2)

のような書き方を(自分は)していたわけですが、これをすべてASOC流の、

  testSubWithp1: p2:

などと書き換えるのは大変です。

試行錯誤してみたところ、これを、

  my testSub(param1,param2)

と書けば、あまりASOC on Script Editorのハンドラ名称を書き換えなくても大丈夫でした(よかった)。myと書かないとコンパイルが通らないパターンとか、of meでもコンパイルが通るパターンもあるようで・・・安全のためにmyを使っています。

外部Scriptにおけるuse文

まだプロジェクトが終わっていないので、暫定情報ですが・・・

ASOC on Xcode上ではuse frameworkは書くとエラーになるので書きません。

一応、use AppleScript version “2.4″とかuse scripting additionsといった記述をscript節の内側に書いています。

asoc9.png

だいたいこんな感じでしょうか。試行錯誤をいろいろ行ったおかげで、思ったよりもうまく行っています。

2014/03/24 Xcode 5.1でAppleScriptObjC関連の機能が向上

3月に入ってXcode 5.1がリリースされ、AppleScriptObjCまわりの機能が向上したことが明らかになりました(ちょっとだけ)。

以前のXcode バージョン5.0.2では、OS X 10.9になってあたらしくサポートされた、

 on clicked:sender

  tell current application
   display dialog “TEST”
  end tell

 end clicked:

のような記法を行うと、Interface Builder上で「clicked:」イベントハンドラをGUI部品に紐づけようとしたときに、画面上で見えなくなるという問題がありました。Xcode 5.1では、これが解消されています。

xc51.png

あとは、GC=オンのビルドができなくなっています。いつかはこの日が来ると思っていましたが、案外早く到来しました。

2013/01/29 Xcode 4.6でAppleScript用語辞書の若干の間引きを

Xcode 4.6が一般向けにリリースされたので、AppleScript用語辞書の内容をAS DictionaryでHTMLに書き出して、FileMergeで前バージョンである4.5.2の用語辞書と差分をとってみました。

■Xcode 4.6で削除された用語

project roots
–> list of text
— A list of paths to all directories that contain files referenced in this project.

projectのactive build style属性
– (Obsolete) The active build style. Unless explicitly indicated in a build or clean command, this build style is used.

projectのbreakpoint属性
–by name, index, relative, range, test, id

projectのsymbolic breakpoint属性
–by name, index, relative, range, test, id

この用語辞書の修正にどのぐらいの意味があるのか不明です。あんまり意味があるようには見えません。いきなり大量に使えない用語辞書を付けるよりも、実用的な自動化が行えるレベルの小さくまとまった辞書に差し替えたほうがよさそうに思えます。

2012/12/28 Xcode 4.5.2上で、Xcodeプロジェクト内の選択中のファイル名を取得

Xcode 4.5.2上で、選択中のファイル名を取得するAppleScriptです。選択中のAppleScriptObjCコードを書式つきでHTML書き出しするプログラムを強化する際に作成しました。

XcodeのAppleScript用語辞書はどーしようもなく実用性が低く、実践的なタスクの自動化を行うには不十分です。

iPhoneアプリのプロジェクトのプロパティを変更してビルドしてAppStoreに申請するなどの「本来、できてしかるべき」作業の自動化が行えません(このあたり、Appleの担当が自動化をやりたいと思っていつつも能力不足のため実現できないでいるのか、おかしなプログラムをAppStoreに大量に流し込まれることを避けようとしてお茶を濁そうとしているのかいまひとつ不明)。

それどころか、プロジェクト内で選択中のファイルが何であるかを取得するための属性値すらありません。編集中のソースファイルの選択中のテキスト(文字単位、段落単位)を取得することはできるものの、肝心の編集中のファイルのファイル名の取得はできません。

xc1.png

ただ、「できないできない」と駄々をこねていても仕方がないので、できる範囲で何かやってみようという話です(多いな〜、こういうの)。

Xcodeのウィンドウをよく見ると、タイトル部分にXcode書類名と選択中の書類名が表示されています。

xc2.png

そこで、Windowオブジェクトのname属性を調べてみると、表示されているとおりの文字列を取得できました。

xc3.png

取得したあとにparseして、選択中のファイル名の一丁上がり。

ただし、XcodeのようにひんぱんにバージョンアップするアプリケーションのScriptingは、同様にひんぱんに状況が変わるので、バージョンアップのたびごとに動作の確認が必要になることでしょう。

スクリプト名:Xcodeで選択中のファイルを取得する

–Xcodeのプロジェクト中で選択中のファイルを取得する
tell application “Xcode”
  tell window 1
    set aWintitle to name
  end tell
end tell

set aList to parseByDelim(aWintitle, ” ― “) of me

if (length of aList) is not equal to 2 then
  return –エラー時
end if

set {xcodeDocName, selectedFileName} to aList
–> {”booleanTest.xcodeproj “, “subLib.applescript”}

–取得したファイル名でsource documentにアクセスしてXcodeプロジェクト内のファイルの存在確認
tell application “Xcode”
  tell source document selectedFileName
    properties
  end tell
end tell

–与えられた文字列を、指定デリミタ文字でparseしてリストにして返す
on parseByDelim(aData, aDelim)
  set curDelim to AppleScript’s text item delimiters
  
set AppleScript’s text item delimiters to aDelim
  
set dList to text items of aData
  
set AppleScript’s text item delimiters to curDelim
  
return dList
end parseByDelim

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2012/04/03 AppleScriptObjC Explorer2で編集中のScriptをすべて保存してXcodeでビルド実行 v2

AppleScriptObjC Exlorer 2で、編集中のScriptをすべて保存してXcodeの最前面の(アクティブな)プロジェクトをビルドして実行するAppleScriptです。

……なるべく1行で内容が分かるように心がけていますが、さすがになんのことやら分かりにくいので、説明します。

本ScriptはMac OS X 10.6.8+Xcode 4.1+AppleScriptObjC Explorer 2 2.2.1で作成。Mac OS X 10.7上でも動くはずです。

Xcode 4.0以降でAppleScriptObjCのサポートは「悲惨」のひとことに尽きます。インデントは狂うわ、構文確認時の各種ブロックの補完は行われないわ、AppleScript構文色分けがまったくきかないわで、生産性がダダ下り。AppleScript Studioの頃には、Mac OS X 10.5の頃まではなんとか構文色分けは維持されてきたものですが……。

asoc1.png

さすがに、Xcode 4.x内蔵のテキストエディタに愛想が尽きて、AppleScriptObjC専用外部エディタである「AppleScriptObjC Explorer 2」をお買い上げ。Xcode上のファイル一覧でAppleScriptを選択した状態でコンテクストメニューを表示。「Open With External Editor」を実行してAppleScriptObjC Explorer 2でAppleScriptのテキストを編集させるようにしています。

asoc2.png

これで、構文確認時の各種ブロック(ifブロックとかrepeatブロックとかtellブロックとか)の入力補完や、AppleScript構文色分けなどが利用できます。

ただ……Mac OS X 10.6/10.7ともに、Xcodeの外部エディタとして使用した場合に、AppleScriptObjC Explorer 2からはXcodeプロジェクトのビルドやら実行やらはできません(Mac OS X 10.7上でAppleScriptエディタ上と同様にAppleScriptObjCプログラムを単体で作成・実行できます)。

そこで、AppleScriptObjC Explorer 2側からXcodeのプロジェクトをビルド&実行するようにしてみたのが本AppleScriptです。

ただし、Xcode 4.x系のAppleScript対応機能は、いまだ実装の発展途上というか、工事中で機能不全な状態なので……まともにXcodeのオブジェクト階層をたどっていく気になりません。なげやりに、GUI Scripting経由でメニュー項目を呼び出したりしています。また、ビルド&実行対象は最前面のXcodeプロジェクトであって……複数のプロジェクトをXcode上でオープンしている場合に、外部エディタで編集しているScriptの所属するプロジェクトが、Xcode上でかならずしも最前面になっているわけではありませんので……そのへんは割り切って使っています。

Xcode 4でビルドを行わせる前に、AppleScriptObjC Explorer 2側でオープン中のScriptをすべてファイル保存させています。未保存のAppleScriptが存在した場合には保存をスキップします。

AppleScriptObjC Explorer 2用のScript Menuに入れて呼び出して使っています。

スクリプト名:AppleScriptObjC Explorer2で編集中のScriptをすべて保存してXcodeでビルド実行 v2
tell application “AppleScriptObjC Explorer 2″
  set dList to every document
  
  
set sList to {}
  
repeat with i in dList
    –documentのfile属性を取得(未保存だとmissing valueになっている)  
    
set tmpFile to file of i
    
    
if tmpFile is not equal to missing value then
      tell i –保存済みのdocumentのみ保存を実行
        save
        
set the end of sList to tmpFile
      end tell
    end if
  end repeat
end tell

–複数のプロジェクトをオープンしている場合にはアクティブ(最前面)のプロジェクトを対象に
–すごい投げやりな処理……
tell application “Xcode”
  set curPrjDoc to active workspace document
  
  
–最前面のプロジェクトが、必ずしもAppleScriptObjC Explorer 2で編集中のScriptが所属するプロジェクトとは限らない
  
–編集中のScriptのファイルパスから上位フォルダに存在するXcode書類を探索して、プロジェクトを特定してもいいかも
  
–ただ、Xcodeのタコさ加減にめまいがして、真剣にXcodeをAppleScriptからつっつく気になれない……
  
  
tell curPrjDoc
    build –ビルド
  end tell
  
end tell

–GUI Scriptingから実行指定
activate application “Xcode”
tell application “System Events”
  tell process “Xcode”
    click menu item “Run” of menu 1 of menu bar item “Product” of menu bar 1
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2011/11/20 Xcode 4.2.1、iTunes 10.5.1登場。AS用語辞書に変更なし

Xcodeのバージョン4.2.1、およびiTunesのバージョン10.5.1が登場しています。
ともにAppleScript用語辞書の内容に変更はありません。

2011/11/10 XcodeのAppleScript用語辞書の変遷

XcodeのAppleScriptによる自動化は、割とニーズがあると思ってときおり調べているのですが……肝心のAppleのXcode開発チームがトンチンカンな対応をしているので、正直まだ手応えがありません。

その、悩み多きXcodeのAppleScript対応の歴史をひもとくと……

Xcode 2.5〜3.2.3

Xcodeの最初のバージョン。Project Builder 2.4の続きのバージョン番号を振られて2.5になった。

この間、ずっと用語辞書に変更なし。用語が大量に定義されてはいるものの、ほとんどAppleScript Studioの予約語。Xcode自体の自動化はほとんどできないも同然だった。

唯一、Plugin Suiteを使ってAppleScriptによるXcodeプラグインを作成し、Xcode自身のメニュー構成をAppleScriptから変更して「使わないメニュー項目を整理するプラグイン」や「AppleScript Studio入力補助プラグイン」などが作れる状態。プロジェクト全体に対して何らかの操作を加えるという機能は提供されていなかった(自前でプロジェクト内のファイルを調べるぐらい)。

Xcode 3.2.4

AppleScript Studioの予約語が大量に入っている状態だが、変化が生じる。AppleScriptでXcodeのプラグインを作れる「Plugin Suites」をいきなりバッサリ廃止(一番使い物になった部分を廃止してどうする?)

Appleの担当者が用語辞書に手を加えはじめる。ただし、試行錯誤が随所に見受けられる。ものすごく悩みながらやっている雰囲気。

Xcode 4.0.1

AppleScript Studioの予約語をバッサリ削除。Xcode上のAppleScript開発環境をAppleScriptObjCに移行させ、Xcode自体にAppleScript Studioの予約語をのせておく必要性がなくなったため。

Xcode 4.1

「To Be Removed Suites」「Tier2 Suites」など相変わらず暫定版の香りがする。

Xcode 4.2

「To Be Removed Suites」を削除。「Tier2 Suites」を整理。

しかし、あいかわらず「ユーザーが何をするか」を考慮しないで設計しているので、Scripterから見ても「使い物にならない」雰囲気がたっぷりです。

Xcode 4.xではマイナーバージョンが上がっただけでScriptの互換性がなくなるし、XcodeのAppleScript用語は迷走に迷走を重ね、より「ダメな方向」に進む可能性が。

もう、Xcodeの担当者が○○なことは十分に分ったので、○○さ加減を全世界に宣伝しなくてけっこうです。実用性のある用語を備えるようにしてほしいです。

XcodeをASからこづき回すのは「何のため」なのかをもう一度問い直していただきたい。たとえば……

・大量のプロジェクトのビルド設定を変更して、個別にクリーニングしてビルド、生成した実行ファイルをアーカイブしてSFTPでアップロード

・FileMaker ProのDBからLocalized.stringsファイルを生成。内容を置き換える

・現在編集中のソースファイルの選択部分を取得して、何らかの処理をScriptで加えたあとに選択部分に返す

・すでに存在しているプロジェクトにCode Signingを行い、Sandbox設定を行ったのちにビルド。ビルド時にエラーが出ないかどうかコンソールに出力する

・現在オープン中のプロジェクトが、何のテンプレートを元に作成されたのかを取得(プロジェクトの種別判定)

・プロジェクトの設定へのアクセス、プロジェクト内の各ファイルへのアクセス

・編集中の(テキストベースの)書類に対する操作

……と、ざっとXcodeの自動化処理なんてだいたいこのぐらいができればよさそうなもの。それなのに、ブレークポイントをこづき回してみたり奇怪なオブジェクト階層を作ってみたりと、おおよそ生産的でない仕事を繰り広げている状況です。

2010/10/29 現在編集中のXcodeプロジェクトのビルドターゲットが生成したpreferenceファイルを削除する v4

Xcode 3.2.4で現在編集中のプロジェクトのビルドターゲットがテストラン時に作成したpreferenceファイル(plistファイル)を削除するAppleScriptです。

Shane Stanleyの「AppleScriptObjC Explored」を購入して熟読し、AppleScriptObjCの使い方がようやく掴めてきた今日このごろ。Xcodeも(ADC Online Developperに公開されている中で)最新のXcode 3.2.4をダウンロード。

Xcode上でAppleScriptObjCを使ってようやく作りたいものが作れるようになりかけてきたときに、やっぱり初期設定ファイル(ホーム/ライブラリ/Preferences フォルダ以下に作られるplistファイル)を削除したくなって、従来のバージョンを試してみたところ……なんと、削除されません。

xc1.jpg

いろいろ調べてみると、このわずかにバージョン番号が上がった間にXcodeのプロジェクト仕様に一部変更が(ーー; info.plistファイルのファイル名およびinfo.plist自体をビルド時にプリプロセッサで処理することがデフォルトになったらしく、ビルド前のXcodeプロジェクト内にあるinfo.plistファイルをそのまま読んできただけでは、うまく処理できません。

xc2.jpg

xc3.jpg

そこで、Xcode 3.2.4の仕様に合わせて書き換えてみました。

相変わらず、複数のビルドターゲットを持つXcodeプロジェクトには対応できていませんが、サンプルコードの中にそうのがあったので、そのうち対応するかもしれません。

スクリプト名:現在編集中のXcodeプロジェクトのビルドターゲットが生成したpreferenceファイルを削除する v4
(*

v4 : Xcode 3.2.4に対応

Xcodeプロジェクト内のinfo.plistファイルの記述内容が、プリプロセッサの処理が必要な形式で書かれるように変更されていたため、
${PRODUCT_NAME:identifier}の値をプロジェクトのproduct nameに置換して処理するようにした。

info.plistのファイル名を、プロジェクトのactive targetの名称から取得している。
複数のactive targetを含むようなプロジェクトでは使えないはず
ただし、複数のactive targetのプロジェクトがあれば、各active targetに対してループ処理すればいいだけなので、対応はそれほど難しくはない

*)

–現在編集中のXcodeプロジェクトのパス情報を取得
tell application “Xcode”
  try
    set aPrj to project of active project document
  on error
    activate
    
display dialog “There is no Xcode Project” with icon 1 buttons {“OK”} default button 1
    
return
  end try
  
  
tell aPrj
    set projPath to real path
    
set pName to name of active target –active targetが複数の場合を考慮していない
  end tell
end tell

–現在編集中のプロジェクトに含まれるInfo.plistファイルを検出
set projPath to POSIX file projPath

tell application “Finder”
  set parantFol to (folder of file projPath) as alias
  
tell folder parantFol
    set infoP to every file whose name contains “info.plist”
    
if infoP = {} then
      display dialog “現在編集中のプロジェクトにはInfo.plistが入っていません。” buttons {“OK”} default button 1 with icon 1
      
return
    end if
    
    
set infoP to (first item of infoP) as alias
    
  end tell
end tell

–Info.plistファイルからバンドル情報を取得する
–set pListPath to (parantFol as string) & “Info.plist”
tell application “System Events”
  set vRec to value of property list file (infoP as string) –plist fileから値を読み取る
end tell
set infoRes to |CFBundleIdentifier| of vRec

–plistファイルを消す
set aPath to (path to preferences from user domain) as string
set infoPlistPath to aPath & infoRes & “.plist”

–Xcodeプロジェクト内のinfo.plistは、まだプリプロセッサで書き換えられる前のものが入っているので、書き換えておく
set infoPlistPath to repChar(infoPlistPath, “${PRODUCT_NAME:identifier}”, pName) of me

try
  do shell script “rm -f “ & quoted form of POSIX path of infoPlistPath
  
tell application “Xcode”
    activate
    
display dialog “以下のplistファイルを消去しました。” & return & infoPlistPath buttons {“OK”} default button 1 with icon 1
  end tell
on error
  tell application “Xcode”
    activate
    
display dialog “plistファイルの消去に失敗しました” buttons {“OK”} default button 1 with icon 1
  end tell
end try

–文字置換ルーチン
on repChar(origText, targStr, repStr)
  set {txdl, AppleScript’s text item delimiters} to {AppleScript’s text item delimiters, targStr}
  
set temp to text items of origText
  
set AppleScript’s text item delimiters to repStr
  
set res to temp as text
  
set AppleScript’s text item delimiters to txdl
  
return res
end repChar

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2010/06/27 オープン中のXcodeプロジェクトのフレームワークのパスを取得する

オープン中のXcodeプロジェクトの中に含まれるフレームワークのパスを取得するAppleScriptです。Xcode 3.2.2上でテストしてみました。

xcframew1.jpg

Xcodeプロジェクト内の「Frameworks」グループ内にある「Linked Frameworks」グループと、「Other Frameworks」グループの中に含まれるフレームワークのパス(real path)を取得します。real pathだけでなく、相対パスなどをはじめ、さまざまな情報を取得できるので、まずはpropertiesでプロパティを取得して様子を見てみるとよいのではないでしょうか?

スクリプト名:オープン中のXcodeプロジェクトのフレームワークのパスを取得する
–現在編集中のXcodeプロジェクトのパス情報を取得
tell application "Xcode"
  try
    set aPrj to project of active project document
  on error
    activate
    
display dialog "There is no Xcode Project" with icon 1 buttons {"OK"} default button 1
    
return
  end try
  
  
–各フレームワークの絶対パスを取得
  
tell aPrj
    set gList to name of every group
    
–> {"Scripts", "Resources", "MainMenu.xib", "InfoPlist.strings", "Other Sources", "Frameworks", "Linked Frameworks", "Other Frameworks", "Products"}–名前をとってみただけ
    
    
tell group "Frameworks"
      tell group "Linked Frameworks"
        set cList to contents
        
set linkedFrameworkList to {}
        
repeat with i in cList
          tell i
            set the end of linkedFrameworkList to real path
          end tell
        end repeat
      end tell
      
      
tell group "Other Frameworks"
        set oList to contents
        
set otherFrameworkList to {}
        
repeat with i in oList
          tell i
            set the end of otherFrameworkList to real path
          end tell
        end repeat
      end tell
      
    end tell
  end tell
end tell

log {"linkedFrameworkList", linkedFrameworkList}
(*linkedFrameworkList, /System/Library/Frameworks/Cocoa.framework, /System/Library/Frameworks/AppleScriptKit.framework*)

log {"otherFrameworkList", otherFrameworkList}
(*otherFrameworkList, /System/Library/Frameworks/Foundation.framework, /System/Library/Frameworks/AppKit.framework*)

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2010/06/12 編集中のXcodeプロジェクトに含まれる各Scriptの行数をレポート

Xcodeで編集中のプロジェクトに含まれる各AppleScriptの行数をレポートするAppleScriptです。

まずは、Xcode 3.1.4(Mac OS X 10.5)もしくは3.2.2(Mac OS X 10.6)上でAppleScript Studio/AppleScriptObjCなどのプロジェクトをオープンしている状態で、本Scriptを実行します。

すると、プロジェクトに含まれる(正確にいえば、xcodeprojファイルと同階層にある)「.applescript」のファイルをすべて集計し、プロジェクト全体のAppleScriptの行数と、各Scriptの行数をダイアログで表示します。

xcode1.jpg

なが〜いプログラムを書いてしまったときに、どのへんのプログラムをそろそろ再度分割しなければならないだろうか、といった目安にしたり、こんなにプログラムを書いてしまったのかとイヤ〜な気分になりたい時に使います。

別に、AppleScriptでなくてもObjective-CのプログラムでもC++のプログラムでも集計できますし(拡張子でファイルを指定している箇所を変更するだけ)、プロジェクトの下位フォルダの内容をすべて(entire contentsで)たどって調べてもよいでしょう。

スクリプト名:編集中のXcodeプロジェクトに含まれる各Scriptの行数をレポート
–現在編集中のXcodeプロジェクトのパス情報を取得
tell application “Xcode”
  try
    set aPrj to project of active project document
  on error
    activate
    
display dialog “There is no Xcode Project” with icon 1 buttons {“OK”} default button 1
    
return
  end try
  
  
tell aPrj
    set projName to name
    
set projPath to real path
  end tell
end tell

–現在編集中のプロジェクトに含まれるInfo.plistファイルを検出
set projPath to POSIX file projPath

tell application “Finder”
  set parantFol to (folder of file projPath) as alias
  
tell folder parantFol
    set asList to (every file whose name ends with “.applescript”) as alias list
  end tell
end tell

set resList to {}
set tNum to 0
repeat with i in asList
  tell application “Finder”
    set aName to name of i
  end tell
  
  
set aPosixPath to quoted form of POSIX path of i
  
set aRes to do shell script (“wc -l “ & aPosixPath)
  
set aNum to first item of words of aRes
  
  
  
set tNum to tNum + (aNum as number)
  
set the end of resList to ((aNum as string) & “—–” & aName)
  
end repeat

choose from list resList with prompt (“プロジェクト「” & projName & “」(総行数=” & tNum as string) & “行)内の各Scriptの行数” with title “Script行数レポート”

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2010/06/10 Xcodeで表示中のASのファイルからコメントだけ抽出

Xcodeで表示中のAppleScriptのプログラム(おそらく、AppleScript Studio)から、「–」ではじまるコメント行だけを抽出して、表示するAppleScriptです。

Xcode上で編集中のAppleScript Studioのプログラムを解析してコメントだけを抜き出すAppleScript、ということになります。

ass1.jpg
▲赤い行がコメント(本Blogでもおなじみの書式)

ass2.jpg
▲本AppleScriptを実行したところ。プログラム中のコメントだけを抜き出してダイアログ表示

なが〜いプログラムを組んでしまうと、ファイル数は増えるわ、全体の構造は忘れがちだわで……たまに、全体の構造を見直してみたくなる時があります。そういう場合に使えることでしょう。

行の途中からはじまるコメントには対応していませんし、「(*」〜「*)」でかこったコメントも対応していませんが、そこは個人の趣味なので。そこまで拾って表示したい方は、ぜひ手を加えてみてください。

Xcode 3.1.4 on Mac OS X 10.5.8と、Xcode 3.2.2 on Mac OS X 10.6.3上で動作確認してあります。

ちなみに、Xcode 3.1.4やXcode 3.2.2上ではAppleScript StudioのソースコードをUTF-8で書けるようになっているので、UTF-8で書くようにしています。そのため、AppleScript Studioのソースコードファイルを読むときにUTF8を指定して読み込んでいます。

スクリプト名:Xcodeで表示中のASのファイルからコメントだけ抽出
tell application “Xcode”
  set wCount to count every window
  
if wCount = 0 then
    display dialog “Xcodeで何らかのプロジェクトをオープンした状態で実行してください” buttons {“OK”} default button 1 with icon 1
    
return
  end if
  
  
try
    save
  on error
    return
  end try
  
  
tell window 1
    set aPath to associated file name
  end tell
  
end tell

–Xcode上で表示中の内容がAppleScriptでなければリターン
if aPath does not end with “.applescript” then
  return
end if

–ファイルシステム上から表示中のファイルを直接読み込み
set aText to read POSIX file aPath as «class utf8»
set aList to paragraphs of aText

–ハンドラリストを作成
set hList to {}
set hCount to 1
repeat with i in aList
  set j to contents of i
  
  
ignoring white space
    if j begins with “–” then
      set a to retUTF8(j) of me
      
set the end of hList to a
    end if
  end ignoring
  
  
set hCount to hCount + 1
end repeat

choose from list hList with prompt “Xcodeで表示中のAppleScriptのコメント” with title “コメント抽出結果:”

on retUTF8(theText)
  set the clipboard to (theText as international text) –International はunicodeの同義語
  
set ss to (the clipboard as record)
  
return «class utf8» of ss
end retUTF8

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2010/06/02 Xcodeで表示中のScriptの各ハンドラ行数をカウント

handlercount.jpgXcodeで表示中のAppleScript Studioのプログラムの、各ハンドラ行数をカウントして、長い順にソートして、画面表示するAppleScriptです。Xcode 3.2.2+Mac OS X 10.6.3で動作確認を行っていますが、Xcode 3.1.4+10.5.8でも動作するはずです。

つまりこれは、「Xcode上のAppleScriptのプログラム」を解析するAppleScriptのプログラムです。

AppleScript Studioのプログラムは、1ファイルあたりの編集・実行可能な上限が存在するため、だいたい1000行をメドに複数のファイルに分割する必要があります。Xcode 3.1.4+Mac OS X 10.5.8の環境では、2500行ぐらいに達するとビルドできなくなったり、意味不明のエラーが発生するようになってしまいます。

そんなわけで、行数が増えてくるとハンドラ単位で別ファイルに分割して、分割ローディングする必要が出てくるわけですが、その分割候補となるのが行数の長いハンドラ。

各ハンドラ/イベントハンドラの行数を集計し、長い順にソートし、ダイアログ表示します。AppleScript Studioのプログラムが対象であり、AppleScript ObjCのプログラムは対象にしていません(短いのはテストしているんですが、ASOCではそんなに長いのを組んでいないもので)。

XcodeのエディタでAppleScriptエディタなみにScriptの書式情報にアクセスできれば、かなり突っ込んだ処理も可能なのですが……指定のハンドラと、それに関連するサブルーチンをまとめて別のScriptファイルに移動させるといったことも処理できそうではあるのですが、現状のXcodeの用語辞書では非常に困難です。

スクリプト名:Xcodeで表示中のScriptの各ハンドラ行数をカウント
tell application “Xcode”
  set wCount to count every window
  
if wCount = 0 then
    display dialog “Xcodeで何らかのプロジェクトをオープンした状態で実行してください” buttons {“OK”} default button 1 with icon 1
    
return
  end if
  
  
try
    save
  on error
    return
  end try
  
  
tell window 1
    set aPath to associated file name
  end tell
end tell

–Xcode上で表示中の内容がAppleScriptでなければリターン
if aPath does not end with “.applescript” then
  return
end if

–ファイルシステム上から表示中のファイルを直接読み込み
set aText to read POSIX file aPath
set aList to paragraphs of aText

–ハンドラリストを作成
set hList to {}
set hCount to 1
repeat with i in aList
  set j to contents of i
  
  
ignoring white space
    if ((j begins with “on”) and (j does not contain “on error”)) or ((j begins with “to”) and (j does not contain “on error”)) then
      
      
if j contains “(” and j contains “)” then
        –ハンドラ
        
set j1 to offset of “on “ in j
        
set j2 to offset of “(” in j
        
        
set aHandle to text (j1 + 3) thru (j2 - 1) of j
        
      else if j contains “theObject” then
        –イベントハンドラ
        
set j1 to offset of “on “ in j
        
set j2 to offset of ” theObject” in j
        
        
set aHandle to text (j1 + 3) thru (j2 - 1) of j
      end if
      
      
set the end of hList to {aHandle, hCount}
    end if
  end ignoring
  
  
set hCount to hCount + 1
end repeat

–各ハンドラ末尾をサーチして{ハンドラ名、開始行、終了行、行数}をリスト化
set hCount to 1
repeat with i from 1 to (length of hList)
  set {aHandler, sLine} to contents of item i of hList
  
repeat with h from (sLine + 1) to (length of aList)
    set aCon to contents of item h of aList
    
    
ignoring white space
      if aCon begins with “end “ & aHandler then
        set the end of item i of hList to h
        
set the end of item i of hList to (h - sLine)
        
exit repeat
      end if
    end ignoring
    
  end repeat
end repeat

–降順ソート
set h2List to shellSortListDecending(hList, 4) of me

–表示用のリストを作成
set h3List to {}
repeat with i in h2List
  set {hName, sNum, eNum, tNum} to i
  
set aCon to (tNum as string) & “—–” & hName
  
set the end of h3List to aCon
end repeat

choose from list h3List with prompt “Xcodeで表示中のAppleScriptの各ハンドラ/イベントハンドラの行数” with title “ハンドラ集計結果:”

–シェルソートで入れ子のリストを降順ソート
on shellSortListDecending(a, keyItem)
  set n to length of a
  
set cols to {1391376, 463792, 198768, 86961, 33936, 13776, 4592, 1968, 861, 336, 112, 48, 21, 7, 3, 1}
  
repeat with h in cols
    if (h (n - 1)) then
      repeat with i from h to (n - 1)
        set v to item (i + 1) of a
        
set j to i
        
repeat while (j h) and ((contents of item keyItem of item (j - h + 1) of a) < (item keyItem of v))
          set (item (j + 1) of a) to (item (j - h + 1) of a)
          
set j to j - h
        end repeat
        
set item (j + 1) of a to v
      end repeat
    end if
  end repeat
  
return a
end shellSortListDecending

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2010/04/24 現在編集中のXcodeプロジェクトのビルドターゲットが生成したpreferenceファイルを削除する v3

Xcode 3.1.4上で編集中のプロジェクトで、テスト実行を行った際にユーザーディレクトリ下に作成したplistファイルを削除するAppleScriptです。

以前のバージョンでは、複数のXcodeプロジェクトを同時にオープンしていた際に、最初にオープンしたプロジェクトを対象としてplistの削除を行うという不具合があったため、本バージョンではアクティブな(編集中の、最前面にある)プロジェクトを対象としてplist削除を行うように書き換えてみました。

また、以前のバージョンではどのplistファイルを消したのか、いっさい告知を行っていなかったので……作業終了時にパス名を表示するように機能を追加しました。地味に便利な機能です(display dialogに変数を追加しただけですが)。

Xcodeのプロジェクトを複数ひらいて、過去のプロジェクトを参照したりサンプルコードを参照するという作業は、割とよくあることなので……複数プロジェクトオープン時に最前面のプロジェクトを特定する方法が存在していたのはラッキーでした。

Xcode 3.1.4がターゲットであり、目下最新版のXcode 3.2.2では動作検証を行っていませんが……多分、動くと思います。

このAppleScriptを書いてからというもの、Xcode上でAppleScript Studioのプログラム開発を行う際には必須ともいえる存在となりました。意外と、「中途半端な作りのplistファイル」が残ったままになっているために起きるトラブル(というより、エラーが出なくてはならないのにplistファイルが残っているために見過ごされるエラー)は多く、自分も「okaeri」のリリース後に他人の環境で起動できないトラブル、というのに巻き込まれて……しばらくダメージから回復できませんでした(問題があったら知らせてほしいな〜)。

本Scriptを使用することで、実行環境におけるplistを削除できるため、plist回りのトラブルを回避できます。Xcodeの標準機能としてこれぐらい入れておいてほしいぐらいです(cleanコマンドにこの機能がないのはおかしいよ)。本当にないと困ります。Xcode+AppleScriptでアプリケーション開発を行う際には、毎日使っています。Objective-CやC++などの言語で開発していても、たぶん手放せないものになることでしょう。

Xcodeの自動化は、生産性をひじょーーに左右するものなので、Appleにはもっと真剣に取り組んでもらいたいものです。XcodeのAppleScript用語辞書が中途半端なので、もっと充実させるべきです。

スクリプト名:現在編集中のXcodeプロジェクトのビルドターゲットが生成したpreferenceファイルを削除する v3
–現在編集中のXcodeプロジェクトのパス情報を取得
tell application “Xcode”
  try
    set aPrj to project of active project document
  on error
    activate
    
display dialog “There is no Xcode Project” with icon 1 buttons {“OK”} default button 1
    
return
  end try
  
  
tell aPrj
    set projPath to real path
  end tell
end tell

–現在編集中のプロジェクトに含まれるInfo.plistファイルを検出
set projPath to POSIX file projPath

tell application “Finder”
  set parantFol to (folder of file projPath) as alias
  
tell folder parantFol
    set infoP to exists of file “info.plist”
    
if infoP = false then
      display dialog “現在編集中のプロジェクトにはInfo.plistが入っていません。” buttons {“OK”} default button 1 with icon 1
      
return
    end if
  end tell
end tell

–Info.plistファイルからバンドル情報を取得する
set pListPath to (parantFol as string) & “Info.plist”
tell application “System Events”
  set vRec to value of property list file (pListPath as string) –plist fileから値を読み取る
end tell
set infoRes to |CFBundleIdentifier| of vRec

–plistファイルを消す
set aPath to (path to preferences from user domain) as string
set infoPlistPath to aPath & infoRes & “.plist”

try
  do shell script “rm -f “ & quoted form of POSIX path of infoPlistPath
  
tell application “Xcode”
    activate
    
display dialog “以下のplistファイルを消去しました。” & return & infoPlistPath buttons {“OK”} default button 1 with icon 1
  end tell
on error
  tell application “Xcode”
    activate
    
display dialog “plistファイルの消去に失敗しました” buttons {“OK”} default button 1 with icon 1
  end tell
end try

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2010/03/26 現在編集中のXcodeプロジェクトのビルドターゲットが生成したpreferenceファイルを削除する v2

Xcode上で編集中のプロジェクトのビルドターゲットがテストラン時に生成したplistファイルを削除するAppleScriptです。Xcode 3.1.4をターゲットに作成したものですが、Xcode 3.2.xでも多分動くことでしょう。

AppleScriptによるXcodeの自動化というのは、本当にやりたい処理があってもXcodeのAppleScript対応機能が不十分で実装できないことが多くて実現できないケースが多いのですが……このケースではキレイにできました。Xcodeの単純なプロジェクト(ビルドターゲットが1つだとか、一般的なデスクトップアプリケーションのプロジェクトだとか)向けに作ったので、プラグインとかkextとかのプロジェクトまでは考慮していません。

AppleScriptからXcodeに問い合わせてプロジェクトのタイプなども取得できるとよいのですが……そういう「実践的な機能」というのが載ってこないのがXcodeのAppleScript辞書の不思議なところです。絶対に、AppleScriptの記述経験がほとんどないエンジニアが実装を行わされているに違いない、と思わせるものがあります。

Xcode(AppleScript StudioとかAppleScriptObjC)でプログラムを組んでいて、テストラン時に生成されたplistファイルが邪魔になってきちんと動作検証できないケースがあります。本来はうまく動いてはいけないものが、過去にテストランしたときのplistファイルが残ってしまっていたために「動いてしまった」とか。

そのため、plistファイルを手でいちいち消していました。Xcodeのクリーンコマンドは、ビルドフォルダ内のファイルは消去してくれますが、plistファイルは消してくれません。割とよく使う処理だったので、AppleScriptで自動化してみました。なにげに便利です。

スクリプト名:現在編集中のXcodeプロジェクトのビルドターゲットが生成したpreferenceファイルを削除する v2
–現在編集中のXcodeプロジェクトのパス情報を取得
tell application “Xcode”
  tell project 1
    set projPath to real path
  end tell
end tell

–現在編集中のプロジェクトに含まれるInfo.plistファイルを検出
set projPath to POSIX file projPath

tell application “Finder”
  set parantFol to (folder of file projPath) as alias
  
tell folder parantFol
    set infoP to exists of file “info.plist”
    
if infoP = false then
      display dialog “現在編集中のプロジェクトにはInfo.plistが入っていません。” buttons {“OK”} default button 1 with icon 1
      
return
    end if
  end tell
end tell

–Info.plistファイルからバンドル情報を取得する
set pListPath to (parantFol as string) & “Info.plist”
tell application “System Events”
  set vRec to value of property list file (pListPath as string) –plist fileから値を読み取る
end tell
set infoRes to |CFBundleIdentifier| of vRec

–plistファイルを消す
set aPath to (path to preferences from user domain) as string
set infoPlistPath to aPath & infoRes & “.plist”

try
  do shell script “rm -f “ & quoted form of POSIX path of infoPlistPath
  
tell application “Xcode”
    activate
    
display dialog “plistファイルを消去しました” buttons {“OK”} default button 1 with icon 1
  end tell
on error
  tell application “Xcode”
    activate
    
display dialog “plistファイルの消去に失敗しました” buttons {“OK”} default button 1 with icon 1
  end tell
end try

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/11/07 Xcode 3.2.1でプロジェクトの属性情報を取得する

Xcode 3.2.1で、プロジェクトの論理的な内部構造にアクセスするためのオブジェクトが、どうやら「project」オブジェクトのようです。このprojectオブジェクトの下にブラ下がっているオブジェクトに対して階層的にアクセスを行うことで、AppleScriptでどのような処理を行うことができるかが明らかになります。

特徴的なのは、ビルド結果の実行ファイル(executables)にアクセスできるのと、プロジェクト内のファイルへのアクセスが、一般的なファイルパスで行うのではなく「file reference id ”4F422FE710A3F035008C18C1”」といった形式で行う必要があるということです。他のさまざまなbuild targetなどもこのようなid形式で管理されているため、アプリケーション側の流儀に合わせてアクセスする必要があります。

★何らかのXcodeプロジェクトをオープンした状態で実行してください

スクリプト名:Xcode 3.2.1でプロジェクトの属性情報を取得する
–Xcode 3.2.1でプロジェクトの属性情報を取得する
tell application “Xcode”
  tell project 1
    properties
    
–> {project roots:{”"}, intermediates directory:”/Users/maro/Documents/Develop/AppleScriptObjC/ASOCTaskList/build/ASOC Task List.build/Debug”, root group:group id “29B97314FDCFA39411CA2CEA” of project “ASOC Task List” of application “Xcode”, active architecture:”x86_64″, active target:target id “8D1107260486CEB800E47090″ of project “ASOC Task List” of application “Xcode”, organization name:missing value, active executable:executable id “4FE9A6DD109F2002003C067D” of project “ASOC Task List” of application “Xcode”, real path:”/Users/maro/Documents/Develop/AppleScriptObjC/ASOCTaskList/ASOC Task List.xcodeproj”, path:”/Users/maro/Documents/Develop/AppleScriptObjC/ASOCTaskList/ASOC Task List.xcodeproj”, full path:”/Users/maro/Documents/Develop/AppleScriptObjC/ASOCTaskList/ASOC Task List.xcodeproj”, read only:false, name:”ASOC Task List”, default build configuration type:build configuration type id “C01FCF5008A954540054247B” of project “ASOC Task List” of application “Xcode”, active build style:missing value, id:”29B97313FDCFA39411CA2CEA”, active build configuration type:build configuration type id “C01FCF4F08A954540054247B” of project “ASOC Task List” of application “Xcode”, class:project, project directory:”/Users/maro/Documents/Develop/AppleScriptObjC/ASOCTaskList”, user file reference:file reference id “4F422FE710A3F035008C18C1″ of project “ASOC Task List” of application “Xcode”, active SDK:missing value, product directory:”/Users/maro/Documents/Develop/AppleScriptObjC/ASOCTaskList/build/Debug”, currently building:false, project file reference:file reference id “4F422FE810A3F035008C18C1″ of project “ASOC Task List” of application “Xcode”}
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/11/07 Xcode 3.2.1で最前面のWindowでオープンしているファイルを取得

Xcode 3.2.1で、最前面のウィンドウ(window 1)でオープンしているファイルを取得するAppleScriptです。

Xcodeにかぎらず、アプリケーションがオープンしている書類にアクセスする手段には大きくわけて2つがあり、1つがドキュメント(実在するファイルであることが多い)、もう1つがウィンドウです。実データにアクセスする場合にはドキュメントからたどって行く場合が多く、documentオブジェクト経由のアクセスがほとんどです。

ただし、現在表示されているドキュメント(最前面に表示されているドキュメント)が何なのかを調べたり、ドキュメントの表示方法(複数の表示モードが存在するような場合)を調べるような場合にはWindow経由でアクセスすることになります。

まさに、Xcode 3.2.1で最前面のウィンドウで何を表示しているのかを取得するようなケースでwindow経由のアクセスを行うことになります。

xc1.jpg

Xcodeでは、1つのウィンドウを分割して複数のソースコードを表示できるようになっていますが、Windowオブジェクトが返す書類はつねに1つで、1ウィンドウ内に複数のファイルを表示している場合には、フォーカスが当たっている方(カーソルがアクティブになっている方)を返すようです。1ファイル=1ウィンドウの設定(ウィンドウがたくさんひらく)の場合にも同じです。

windowオブジェクトで注目すべきは、「associated file name」です。Windowでオープン中のドキュメントのフルパスを(aliasではなくPOSIX pathで)取得できます。フルパスを渡すための属性値ということで、正しくは「associated file path」という名前が正解だと思うのですが、なんでこのような名前にしてしまったのか、たいへん不思議です。

★何らかのXcodeプロジェクトをオープンした状態で実行してください

スクリプト名:Xcode 3.2.1で最前面のWindowでオープンしているファイルを取得
–Xcode 3.2.1で最前面のWindowでオープンしているファイルを取得
tell application “Xcode”
  tell window 1
    properties
    
–> {associated file name:”/Users/maro/Documents/Develop/AppleScriptObjC/ASOCTaskList/TaskListAppDelegate.applescript”, bounds:{34, 129, 1307, 1028}, main:false, miniaturized:false, key:false, script:missing value, level:0, sheet:false, modal:false, document edited:false, position:{34, 129}, closeable:true, released when closed:false, name:”TaskListAppDelegate.applescript ― ASOC Task List”, content view:content view of window id 1 of application “Xcode”, minimized title:”TaskListAppDelegate.applescript ― ASOC Task List”, background color:{61166, 61166, 61166}, has shadow:true, has resize indicator:true, miniaturizable:true, maximum size:{5000, 5053}, first responder:text view id 11 of content view of box id 10 of view id 9 of split view id 8 of view id 7 of view id 6 of tab view id 5 of view id 4 of view id 3 of view id 2 of window id 1 of application “Xcode”, resizable:true, current field editor:missing value, visible:true, opaque:true, minimum size:{200, 231}, id:1, alpha value:1.0, class:window, needs display:false, zoomed:false, size:{1273, 899}, zoomable:true, titled:true, minimized image:missing value, floating:false, document:missing value, excluded from windows menu:false, auto display:true, index:1, toolbar:toolbar of window id 1 of application “Xcode”, title:”TaskListAppDelegate.applescript ― ASOC Task List”, menu:main menu of application “Xcode”, can hide:true, hides when deactivated:false}
    
    
–ウィンドウでひらいているファイルのフルパス
    
set aPath to associated file name
    
–> “/Users/maro/Documents/Develop/AppleScriptObjC/ASOCTaskList/TaskListAppDelegate.applescript”
    
    
–Xcode上では複数のドキュメントをウィンドウ分割で表示することも可能だが、あくまでも「フォーカスが当たっている」方のファイルのパスが返ってくる
    
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/11/07 Xcode 3.2.1上でプロジェクト書類の情報を取得する

Xcode 3.2.1にとって、「document」というのはプロジェクトの書類(拡張子が「.xcodeproj」の、青いアイコンの書類)です。そのプロジェクト書類にアクセスするためのオブジェクトが「project document」で、「document」と等価な扱い(同じ結果が返ってくる)のようですが、さまざまな属性を取得して調べてみるとproject documentが使われているようなので、こちらからアクセスしてみました。

期待したような属性値に加えて、SCM(ソースコード管理)関連の属性も入っていたりするので、このあたりの機能をAppleScriptから呼び出せそうな「予感」を感じるものです。

★何らかのXcodeプロジェクトをオープンした状態で実行してください

スクリプト名:Xcode 3.2.1上でプロジェクト書類の情報を取得する
–Xcode 3.2.1上でプロジェクト書類の情報を取得する
tell application “Xcode”
  tell project document 1
    properties –属性情報の一括取得    
    
(*
    –> {path:”/Users/maro/Documents/Develop/AppleScriptObjC/ASOCTaskList/ASOC Task List.xcodeproj”, project:project “ASOC Task List” of application “Xcode”, class:project document, scm transcript:”< ?xml version=\"1.0\" encoding=\"UTF-8\"?>
“, file name:”/Users/maro/Documents/Develop/AppleScriptObjC/ASOCTaskList/ASOC Task List.xcodeproj”, id:7, file kind:”Xcode Project File”, script:missing value, modified:false, file type:”Xcode Project File”, name:”ASOC Task List.xcodeproj”}
*)

    
    
set aPath to path –Xcodeプロジェクトのパス
    
–> “/Users/maro/Documents/Develop/AppleScriptObjC/ASOCTaskList/ASOC Task List.xcodeproj”
    
    
set aSCMtrans to scm transcript
    
(*
–>     –> “< ?xml version=\"1.0\" encoding=\"UTF-8\"?>

    
*)
    set aFileName to file name
    
–> “/Users/maro/Documents/Develop/AppleScriptObjC/ASOCTaskList/ASOC Task List.xcodeproj”
    
    
set anID to id
    
–> 7
    
    
set fKind to file kind
    
–> “Xcode Project File”
    
    
set modifyFlag to modified
    
–> false
    
    
set fType to file type
    
–> “Xcode Project File”
    
    
set aName to name
    
–> “ASOC Task List.xcodeproj”
    
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/11/07 Xcode 3.2.1でアプリケーションの情報を取得する

Xcode 3.2.1でアプリケーションのプロパティを取得してみました。selectionがこの階層のオブジェクトに属しているアプリケーションもあったりするため、その確認です。

結論をいえば、この階層のオブジェクトからはとくに有用なプロパティは存在していませんでした。versionを取得してみるとか、frontmost(最前面にいるかどうか)を取得するか、active project documentで現在編集中のプロジェクト書類を取得できるとか(これは重要)いったところが見どころで、それ以外は無視してよい属性ばかりです。

★何らかのXcodeプロジェクトをオープンした状態で実行してください

スクリプト名:Xcode 3.2.1でアプリケーションの情報を取得する
tell application “Xcode”
  properties
  
–> {frontmost:false, event:event 1 of application “Xcode”, name:”Xcode”, key window:missing value, windows menu:sub menu of menu item id 2 of main menu of application “Xcode”, user defaults:user defaults of application “Xcode”, icon image:image id 3 of application “Xcode”, open panel:open panel of application “Xcode”, script:missing value, main bundle:bundle id 4 of application “Xcode”, version:”3.2.1″, main window:missing value, menu:main menu of application “Xcode”, selection:insertion point 43 of text of text document “TaskListAppDelegate.applescript” of application “Xcode”, class:application, active project document:project document “ASOC Task List.xcodeproj” of application “Xcode”, main menu:main menu of application “Xcode”, save panel:save panel of application “Xcode”, active:false, font panel:font panel of application “Xcode”, hidden:false, color panel:color panel of application “Xcode”, id:1, coordinate system:classic coordinate system, drag info:missing value, services menu:sub menu of menu item id 5 of sub menu of menu item id 6 of main menu of application “Xcode”}
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/11/03 Xcode 3.2.1でAS用語辞書が大幅拡充

AppleScript Studioの用語辞書を抱える必要がなくなり、大幅に身軽になったXcodeのAppleScript用語辞書ですが、バージョン3.2のレベルでは実用的な(Xcodeの自動化のための)AppleScriptを書こうとしても、いまひとつ必要な情報が取り出せなかったり、必要な操作ができませんでした。

第一線のScripter連中にとってはまだまだ「及第点」に到達していないぐらいの出来でした。

Xcode上の作業自動化については、Appleがほとんど有効な手を打ってこなかったために、Apple社員がAppleScript Users ML上で質問を投げては、みんなに無視されて逆ギレするといった……一種の「ほほ笑ましい光景」が定期的に見られていたものです。

単なるバグフィックス版(Chris Espinosa・談)と見られていたXcode 3.2.1のAppleScript用語辞書を書き出して、差分をFileMergeでチェックしてみたところ、なんと172箇所も変更が加わっており……Xcode 3.2とXcode 3.2.1はAppleScript辞書だけ見ると「別物」と言っても過言ではないほど。正直、チェックして腰を抜かしました。

Xcode上で日常的に行う操作が自動化できるのか? Xcodeのコードエディタ上で生産性を向上させるようなソリューションを実現できるのか? Xcodeプロジェクト上のさまざまな属性情報や各種ドキュメント(ソースコードとか、ローカライズ用のファイルとか、Info.plistとかxibファイルとか)にアクセスできるかどうか、ひととおり調べてみる価値はありそうです。

用語辞書だけ増やしてみたものの、バグがあるとか、必要なオブジェクトが用意されていないという話はザラなので、慎重に検証を行ってみたいところです。

2009/07/12 XcodeでクリーニングしてビルドしてZip圧縮

Xcode 3.1.3で、最前面のXcodeプロジェクトをクリーニングしてビルドし、作成したバイナリを指定ファイル名にZip圧縮します。

このScriptでZip圧縮したあとにメールに添付して送信するなり、FTPサーバーにアップロードするなり、いろいろやってみてもよいでしょう。

ただ、ビルドする対象のプロジェクトは、アプリケーションを生成するものだけではないため、そのあたりプロジェクトの種類(プラグイン、Automator Action、ドライバなど)を取得できるようにXcode側がAppleScriptに情報を渡してくれるようになっているとよいのですが、現状ではそうした配慮はありません。

スクリプト名:XcodeでクリーニングしてビルドしてZip圧縮
tell application "Xcode"
  tell project 1
    set bList to name of every build configuration
    
set rBCon to first item of (every build configuration whose name is "Release")
    
    
set cRes to clean with removing precompiled headers
    
> "クリーニングに成功しました"
    
    
set bRes to build using rBCon
    
> "ビルドは問題なく完了しました (1 個の警告)"
    
    
set binPath to product directory
  end tell
end tell

set binPathAlias to POSIX file binPath

tell application "Finder"
  tell folder binPathAlias
    set appFile to (every file whose name ends with ".app") as alias list
  end tell
end tell

set anApp to contents of first item of appFile
set zipAlias to compressFileByZip(anApp, "appArch.zip") of me
> alias "Cherry:Users:maro:Documents:ぴよまるソフトウェア:高速富士山miniプロジェクト:hsmtfj_mini:v3:build:Release:hsmtfj mini.app.zip"

ファイルをZipで圧縮して指定名称にリネーム
on compressFileByZip(aFile, newName)
  set apPath to POSIX path of aFile
  
set folF to false
  
if apPath ends with "/" then
    set apPath to text 1 thru -2 of apPath
    
set folF to true
  end if
  
  
set source to quoted form of apPath a folder
  
set dest to quoted form of (apPath & ".zip")
  
do shell script "ditto -ck " & source & " " & dest
  
  
set apPathStr to aFile as string
  
if folF = true then
    set apPathStr to text 1 thru -2 of apPathStr
  end if
  
set apPathZip to apPathStr & ".zip" as alias
  
  
tell application "Finder"
    set name of apPathZip to newName
  end tell
  
  
return apPathZip
  
end compressFileByZip

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/04/29 Xcodeで表示中のファイルの指定行を表示状態に

Xcode 3.1.2で、表示中のテキスト系ファイルの指定行にカーソルを移動して表示するAppleScriptです。

xcode1.jpg
▲Xcode 3.1.2でAppleScript Studioのプロジェクトをオープンしている状態。Xcode 3.1以降で採用された「ネスティング部分の折りたたみ機能」が特徴

xcode2.jpg
▲本AppleScriptをスクリプトエディタやスクリプトメニューから実行すると、指定行(100行)が表示状態になる

USのAppleScript Users MLにAppleの技術者が投稿したScriptを元にしていますが、クセが強かったのでクセをなくして読みやすく書き直したものです。

実際に、指定行を固定で指定することなどはほとんどなく、Xcode上のプログラムソースコードの内容を外部からアクセスして解析し、必要な部分の行数を動的に計算して求め、その結果の行をフォーカス表示するためにこのようなAppleScriptが必要になるものと思われます。おそらく、XcodeのプラグインをAppleScriptで開発しているユーザーがMLにその方法を質問したものでしょう。

余談になりますが……AppleScriptを読みやすく書くためには、いろいろと国際的な「暗黙のルール」が存在します。

具体的にいえば、極力「it」や「the」を使用しないとか、複数行間で「the result」による値の間接受け渡しを行わず明示的に実行結果を変数に代入するとか、フィルタ参照時に「that」ではなく「whose」を使うなどといったものです。

ほかにも、変数名やサブルーチン名称の大文字小文字のかき分けにも国際的な暗黙のルールが存在し、それに則ることで海外のScripterとの間でスムースな意思疎通が行えるようになります。

スクリプト名:Xcodeで表示中のファイルの指定行数を表示状態に
tell application Xcode
  tell front text document
    set selection to paragraph 100 100行目が選択状態になる
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/01/25 Xcodeでオープン中のプロジェクトで、ビルドターゲット「deployment」を使用してクリーニング実行後、ビルドを行う

Xcode 3.1.2で、ビルドターゲット「Deployment」でクリーニングを行い、ビルドを実行。ビルド実行後に実行バイナリを起動します。

(more…)

2009/01/25 Xcodeでオープン中のプロジェクトで、ビルドターゲット「deployment」を使用してクリーニングを行う

Xcode 3.1.2で、ビルドターゲット「deployment」に対するクリーニングを行います。
(more…)

2009/01/25 Xcodeでオープン中のプロジェクトの各種ビルド設定の詳細情報を仔細にわたって取得する

Xcode 3.1.2で、オープン中のプロジェクトの各種ビルド設定の詳細情報を取得します。
(more…)

2009/01/25 Xcodeでオープン中のプロジェクトをビルドする

Xcode 3.1.2で、オープン中のプロジェクトをビルドします。
(more…)