次のAppleScriptを使用して[ターミナル]タブを開くことができます。
tell application "Terminal"
set myTab to do script "exec sleep 1"
get myTab
end tell
これにより、次のような文字列が返されますtab 1 of window id 3263 of application "Terminal"
。これは素晴らしいことです。ウィンドウID3263とタブ番号1を確認できます(ただし、 myTabにクエリを実行してこれらの値のみを取得する方法はわかりません)。
Cocoa ScriptingBridgeでは、次のことができます。
SBApplication *terminal;
SBObject *tab;
terminal = [SBApplication applicationWithBundleIdentifier:@"com.apple.terminal"]
tab = [terminal doScript:@"exec sleep 1" in:nil]
タブオブジェクトからウィンドウIDとタブ番号を取得するにはどうすればよいですか?
2009/4/27を編集-なぜですか?
これを実行したい理由に答えて、(上記のように)ターミナルウィンドウでコマンドを開き、タブオブジェクトを取得しています。ただし、このウィンドウを移動/サイズ変更したいので、タブの「ウィンドウ」オブジェクトにアクセスする必要があります。
私はObjective-C(実際にはPerlからブリッジされたObjective-C)を使用しており、標準のOSコンポーネントに固執したいので、NSAppleScriptフレームワークとScriptingBridgeフレームワークしか使用できないと思います(すべてのperlapplescriptモジュールは64ビットで壊れました)炭素除去)。NSAppleScriptを試してみますが、戻り値の処理は非常に難しいようです。
私の現在の解決策は、タブオブジェクトのTTY(一意であることが保証されている)を取得し、タブを含むウィンドウが見つかるまで、すべてのウィンドウのすべてのタブを列挙することです。私はこれが最善の方法ではないと思いました(確かに速くはありません!)。
2009/4/30を編集-解決策
以下の「 has 」の提案に基づいて、 NSAppleEventDescriptorAPIに勇敢に立ち向かいました。executeAndReturnError()
当初、私はNSAppleScriptの呼び出しでのみこれに到達することができました。ただし、NSAppleScriptはScriptingBridgeよりもはるかに遅いことがわかりました。
ClassDumpを使用してさらにいくつかのSBObject呼び出しを抽出した後、文書化されていない呼び出しを見つけましspecifierDescription()
たqualifiedSpecifier()
。前者は私に素敵な「ウィンドウIDYのタブX」文字列を与えてくれます。後者はアップルのイベント記述子を返し、それをデコードできます。
私の最終的なコード(perl)は次のとおりです。
use Foundation;
NSBundle->bundleWithPath_('/System/Library/Frameworks/ScriptingBridge.framework')->load;
# Create an OSType (bid endian long) from a string
sub OSType ($) { return unpack('N', $_[0]) }
my $terminal = SBApplication->applicationWithBundleIdentifier_("com.apple.terminal");
my $tab = $terminal->doScript_in_("exec sleep 1", undef);
my $tab_ev_desc = $tab->qualifiedSpecifier;
my $tab_id = $tab_ev_desc->descriptorForKeyword_(OSType 'seld')->int32Value;
my $win_ev_desc = $tab_ev_desc->descriptorForKeyword_(OSType 'from');
my $window_id = $win_ev_desc->descriptorForKeyword_(OSType 'seld')->int32Value;
print "Window:$window_id Tab:$tab_id\n";