Pseudo TotalTerminal(偽の TotalTerminal)

2016/01/28

今年に入ってやっと El Capitan にアップグレードしました。今までは新しい OS は必ずクリーンインストールしていたんですが、今回は Yosemite から直接 El Capitan に。不具合が出るかどうか分かりませんが、今のところ順調。

El Capitan といえば、ちょっと前に TotalTerminal が動かない、という話題を拝見しました。

最終的には Alfred のワークフローで問題は解決したようなのですが、問題としてオモシロイと思ったので作ってみました。


TotalTerminal の挙動をすべて再現できるわけではないのですが、以下の部分を作ってみます。

ひとまずこのスクリプトを実行することで、

  • Terminalが動いていなければ起動して最前面に
  • Terminalが裏にいるなら最前面に
  • Terminalが最前面にいるなら裏に回す

ことはできるようになった。


El CapitanでTotalTerminalが動かないならAppleScriptで代用すればいいじゃない? - TOKOROM BLOG

アプリケーションの状態を調べる方法はいろいろありますが、起動しているかどうかを確認したいなら、AppleScript が定義している application クラスの running 属性を調べてみればいい。

running of application id "com.apple.Terminal"
--> false

結果は真偽値で返ってきます。true なら起動中。これで最初の「Terminal が動いていなければ起動して最前面に」は以下のようにかけます。

if not (running of application id "com.apple.Terminal") then
    -- 起動していないなら起動して最前面に
    activate application id "com.apple.Terminal"
end if

次の「Terminal が裏にいるなら最前面に」も application クラスの frontmost 属性を使って調べることができます。

if not (frontmost of application id "com.apple.Terminal") then
    -- 最前面にいないなら前面に持ってくる
    activate application id "com.apple.Terminal"
end if

frontmosttrue だと最前面にいるということなので最後の「Terminal が最前面にいるなら裏に回す」は次のようになります。

tell application "Finder" to set visible of process "com.apple.Terminal" to false

ここだけ application クラスではどうにもできないので Finder で処理しています。全部を組み合わせると次のようになります。

set appID to "com.apple.Terminal"
set appname to name of application id appID
if not (running of application id appID) then
-- 起動していないなら起動して最前面に
activate application id appID
else
-- 起動しているなら最前面にいるか調べる
if not (frontmost of application id appID) then
-- 最前面にいないなら前面に持ってくる
activate application id appID
-- ウィンドウがないなら新規ウィンドウを作る
reopen application id appID
else
tell application id "com.apple.finder" to set visible of process appname to false
end if
end if

以上をスクリプトファイルとして保存すれば完成。これでも一応動作するのですが、課題も書かれています。

現在の課題としましては、

  • Terminalが起動しているがウィンドウがないときはウィンドウがないままアクティブになる(困ってはないけど勝手にウィンドウ作ってくれればスマート)
  • かっこよくない(冗長かもだが、TotalTerminalみたいにかっこよく動くとより良い)
  • プロセスの名前が常に Terminal でよいのかがよくわからん
  • Terminalが既にカレントのときにCommand+Tabキーを送って裏に回してるけど、もっとスマートな方法あるんじゃない?

などがありそうです。


El CapitanでTotalTerminalが動かないならAppleScriptで代用すればいいじゃない? - TOKOROM BLOG

いくつかは解決できるけど、面倒なものもありますね。

Terminal が最前面に来た時にウィンドウがなければ新しく作るというのは reopen 命令を使えば解決します。

-- 最前面にいないなら前面に持ってくる
activate application id appID
-- ウィンドウがないなら新しく作る
reopen application id appID

次の「かっこよくない」というのは...ウィンドウを上からスライドして表示、非表示のことでしょうね。できなくもないのですが...ちょっと手間が必要ですね。また、いつかということで(結局、やらない)。

「プロセスの名前が常に Terminal でよいのかがよくわからん」というのは、確かに AppleScript ではいつでも問題です。

ちょっと前まではアプリケーション名がバージョンアップにより変わりましたなんてことはよくあり、その度にスクリプトの修正を繰り返していました。

それはさすがに面倒なのでアプリケーションのバンドル ID(bundle identifier)から名前を取得するようにしています。この ID が変更になることはそうそうないので...。ちなみにこの ID を書き換えるだけで他のアプリケーションにも対応できます(あら、不思議)。

最後の Command+Tab キーでの Terminal の非表示はプロセスの属性 visible で変更できるのでそれを用いています。

最後にショートカット割り当てですが ApptivateBetterTouchTool(有料になりましたね)、Karabiner などがあります。

もちろん AppleScript を実行できるランチャーならなんでもいいのですが、個人的には割当が簡単な BetterTouchTool を使っています。


0 件のコメント :

コメントを投稿