web-dev-qa-db-ja.com

現在のスペースで新しいターミナルウィンドウを開くApplescript

はい、Apple Script。

現在のデスクトップスペースで新しいターミナルウィンドウを開く必要があります。ターミナルが実行されている別のスペースに移動してから、別のターミナルウィンドウを開かないでください。

もちろん、ターミナルが実行されていない場合は、新しいターミナルプロセスを開始する必要があります。

14
zaf
tell application "Terminal"  
    do script " "  
    activate  
end tell

奇妙に思えますが、ターミナルが着信する「doscript」コマンドを処理する方法の奇妙さを利用しています。それぞれに新しいウィンドウを作成します。必要に応じて、実際にそれを便利なものに置き換えることができます。新しいウィンドウを開いた直後に、好きなように実行します。

18
Justin Mrkva

Doスクリプト ""の間にテキストがない場合、ターミナルで追加のコマンドプロンプトは表示されません。

tell application "Terminal"  
    do script ""  
    activate  
end tell
15
Adam

私はそれを行うための3つの異なる方法を考えることができます(最初の2つはどこかから盗まれましたが、どこかを忘れています)。毎回新しいウィンドウを開きたいので、それが最短だったので、applescriptからシェルスクリプトを呼び出す3番目のものを使用します。

10.10以降にOS Xに組み込まれたスクリプトとは異なり、これらはすべて、Finderウィンドウの現在の作業ディレクトリであるターミナルでターミナルを開きます(つまり、開くためにフォルダを選択する必要はありません)。

Finder>ターミナル> Finderサークルを完成させるためのbash関数もいくつか含まれています。

1.既存のタブを再利用するか、新しいターミナルウィンドウを作成します。

tell application "Finder" to set myDir to POSIX path of (insertion location as alias)
tell application "Terminal"
    if (exists window 1) and not busy of window 1 then
        do script "cd " & quoted form of myDir in window 1
    else
        do script "cd " & quoted form of myDir
    end if
    activate
end tell

2.既存のタブを再利用するか、新しい[ターミナル]タブを作成します。

tell application "Finder" to set myDir to POSIX path of (insertion location as alias)
tell application "Terminal"
    if not (exists window 1) then reopen
        activate
    if busy of window 1 then
        tell application "System Events" to keystroke "t" using command down
    end if
    do script "cd " & quoted form of myDir in window 1
end tell

3. Applescriptから呼び出されるシェルスクリプトを介して毎回新しいウィンドウを生成する

tell application "Finder"
    set myDir to POSIX path of (insertion location as alias)
    do Shell script "open -a \"Terminal\" " & quoted form of myDir
end tell

4.(ボーナス)Bashエイリアスを使用して、ターミナルの現在の作業ディレクトリの新しいFinderウィンドウを開きます

このエイリアスを.bash_profileに追加します。

alias f='open -a Finder ./' 

5.(ボーナス)ターミナルウィンドウのディレクトリをフロントファインダーウィンドウのパスに変更します

この関数を.bash_profileに追加します。

cdf() {
      target=`osascript -e 'tell application "Finder" to if (count of Finder windows) > 0 then get POSIX path of (target of front Finder window as text)'`
        if [ "$target" != "" ]; then
            cd "$target"; pwd
        else
            echo 'No Finder window found' >&2
        fi
}
8
shibaku

上記の回答は、ターミナルがすでに実行されている場合にのみ機能します。それ以外の場合は、2つのターミナルウィンドウを同時に開きます。1つはdo scriptのため、もう1つはactivateのためです。

簡単な場合はこれを防ぐことができます... else:

if application "Terminal" is running then
    tell application "Terminal"
        do script ""
        activate
    end tell
else
    tell application "Terminal"
        activate
    end tell
end if

ボーナス:

コマンドを直接実行したい場合は、キーストロークを使用してこれを行うことができます(あまりエレガントではありません-私は知っています!しかし、動作します)

[...]
else
    tell application "Terminal"
        activate
        tell application "System Events" to keystroke "ls -la" 
        tell application "System Events" to key code 36
    end tell
end if
0
Peter Piper