5

次の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";
4

3 に答える 3

4

これは古い質問ですが、今日この問題が発生したばかりで、オンラインで良い答えが見つかりませんでした。これは私のために働いた:

tell application "Terminal"
    set newTab to do script "echo hello"
    set theWindow to first window of (every window whose tabs contains newTab)
    set windowId to theWindow's id
    repeat with i from 1 to the count of theWindow's tabs
        if item i of theWindow's tabs is newTab then set tabNumber to i
    end repeat
    get {windowId, tabNumber}
end tell
于 2015-07-17T18:59:07.807 に答える
1

技術的にはできません。より良い質問は、なぜしたいのですか?

(まあ、わかりました。AppleEvent Manager APIまたはobjc-appscriptを使用すると、どちらも生のAEDesc / NSAppleEventDescriptorを取得でき、再帰的に引き離すことができます。または、SBを調べて、存在するかどうかを確認することもできます。基盤となるAEDescを取得するための文書化されていないAPIですが、もちろん、エンプターに注意してください。あるいは、ハッカーに頼らずに実際の目標を達成するためのより良い方法があるかもしれませんが、より多くの情報を提供する必要があります。)

于 2010-04-26T16:57:44.207 に答える
0

このような非常に単純なものはどうですか?

アプリケーション"Terminal"にスクリプトを実行するようにnew_winを設定します""フロントウィンドウエンドのIDにw_idを設定しますtell

于 2012-03-14T17:52:22.660 に答える