Macで特定アプリをアクティブにするホットキーを作ってみた

2023.08.10

Macに限りませんがPCをキーボードで操作していると、 アプリケーションウィンドウの切り替えは結構面倒なものです。 ⌘+Tabで切り替えるのが基本ですが、これは最近使った物順でソートされてるので しばらく使っていないアプリはタブを連打する必要があったりします。

そこで特定のアプリケーションを対象として一発でそれをアクティブにできるような仕組みが欲しくなります。 今回は私がよく使うアプリケーション部門5年連続第一位を記録しているiTerm2を対象として、ホットキー一発でアクティブにできるようにしていきます。

トグル操作でないものが欲しい

iTerm2だとデフォルトでアクティブにするホットキーが用意されています。

しかし個人的にはこれはイマイチです。 なぜなら、iTerm2がアクティブな状態でこのホットキーを実行すると iTerm2から別のアプリにフォーカスが移ってしまうからです。 つまり、この動作はいわゆるトグル操作になっています。

トグル操作だと、「この操作をすれば常にこの状態になる」という発想で操作ができないので使い勝手が落ちます。 キーボードは物理的な操作のレスポンスを手で感じることができるのが利点の一つなので、 画面上のレスポンスを確認せず使えると作業効率が上がります。 そこで、「この操作をすれば常にiTerm2がアクティブでな状態になる」を実現したいという話になります。

また、iTerm2に限らず、任意のアプリで同じことができるのが理想です。

やり方を聞いてみた

こういう、「どうやったらできるかな?」みたいなものはChatGPTに聞いてみるのが一番です。 そしてすんなりと簡単な方法がわかりました。 AppleScriptで次のように書けば、iTerm2をアクティブ化できます。

tell application "iTerm2" activate end tell

"iTerm2"の部分でアプリケーションを指定します。 ここの厳格なルールはちょっとわかっていないのですが、 少なくとも"iTerm"という表記でも動作しました。

さて、このAppleScript、私は特に使い慣れないので 正直どう使うのかちょっとわかりませんでした。 その辺もChatGPTに聞いてみると、スクリプトエディタというアプリで編集するもののようです。

めちゃくちゃ質素で質実剛健さが伝わってくるインターフェイスです。

スクリプトが書けたら実行(再生ボタン押下)したり、 アプリケーションとして書き出したりできるようです。

これでアプリケーションを作って、そのアプリケーションを実行すればiTerm2がアクティブになりますね!

...しかし、アプリケーションAをアクティブにするためにアプリケーションBを起動するというのは間抜けなので、ホットキーを作れないか探して見ます。

作ってみた

結論としてRaycastを使えばできるということがわかりました。1

Extensionsの「+」ボタンから「Create Script Command」を選択すると

なんとApple Scriptがありました!

適当にTitleを入れて作ります。 なお、ここで「iTerm2」のようにアプリケーション本家と紛らわしいような名前をつけても大して問題ありません。 なぜなら今から作るコマンドはホットキーでの実行しか想定していないからです。

詳細なコマンドの作り方は省略しますが、 こんなコマンドを作成すればiTerm2をアクティブにするコマンドができあがります。

#!/usr/bin/osascript

# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title iTerm2
# @raycast.mode silent

# Optional parameters:
# @raycast.icon ?

tell application "iTerm2"
    activate
end tell

Raycastの設定の部分を除けば、先ほどのスクリプトをそのまま貼っただけです。

最後にホットキーを設定すれば、 確実にiTerm2をアクティブにするホットキーの出来上がりです。

もちろん対象となるアプリケーションを変えたものを複数作れば、 様々なアプリのホットキーを作ることができます。 私はChrome、Slackあたりのホットキーも作ることにしました。

使い勝手

普通に使えます。 もちろんトグルではなく、連打してもずっとiTerm2がアクティブなままです!

欲を言うと、iTerm2純正の(トグル操作の)ホットキーに比べるとレスポンスはちょっと遅いです。 純正の方は「押した瞬間に切り替わってる」レベルなのに対して、 こちらは「キーを離したら変わる」くらいの感覚です(適当)。 初回は特に遅くてちょっと待たされる感じがあるのですが、 何回か使っていると特に気にならないレベルのレスポンスになる印象です。

少なくとも私としては日常使いとして特に困らないレベルだと思っています。

おまけ: シェルスクリプトで呼ぶ

先ほどのRaycastのスクリプトの先頭をみると、

#!/usr/bin/osascript

というshebangが書かれていることがわかります。

そうなんです、AppleScriptはこのコマンドを使えばシェルからも呼ぶことができます。 その場合はこんな感じで呼べるようです。

/usr/bin/osascript -e 'tell application "iTerm" to activate'

これを使えば、シェルスクリプトの中からウィンドウをアクティブにするということができます。 例えば、処理が終わったらそれを知らせるためにターミナルをアクティブにする、なんてこともできそうです。 (いきなりアクティブになるとキー入力のフォーカスを取られるので、何も考えず導入しても使いにくいとは思いますが...)

まとめ

特定のアプリケーションのウィンドウをアクティブにするホットキーを作成してみました。 トグル操作ではなく、その「この操作をすれば常にiTerm2がアクティブでな状態になる」が実現できたので、 これで気持ちよく操作ができそうです。

またAppleScriptを使えば他にもOSレイヤーの処理にホットキーを割り当てることができそうなので、 めぼしいものがないか探してみようと思います。


  1. ここは実際は逆で、RayCastでホットキーが設定できることは知ってたので、そこで実行できる方法を探していたというのが本当の流れでした。