⌘+F1で任意のアプリの新規ウインドウを開く環境構築
macOS環境で⌘キーとファンクションキーの組み合わせで任意のアプリの新規ウインドウを瞬時に開く環境を構築してみます。この仕組みを使うと、瞬時に現在のデスクトップの最前面に目当てのアプリの新規ウインドウを表示することができるので、例えばWebで調べ物をしたいとき、テキストエディタにテキストを貼り付けたいとき、Terminalでコマンドを実行したいとき等に便利です。
便利なユースケース例
Safari / Chrome
ほかのアプリで作業をしていて、Webで調べものをしたくなった際にすぐに新規ブラウザウインドウを立ち上げられます。
Terminal
ほかのアプリで作業をしていて、コマンドラインで操作をしたくなった際にすぐにTerminalウインドウを開けます。
CotEditor
ほかのアプリで作業をしていて、何かテキストを貼り付けたり細かい編集作業をしたくなった際にすぐにCotEditorのテキストウインドウを開けます。
前提
- macOSを使用
- Karabiner Elementsを使用
- AppleScriptを使用
- F1–F12辺りのファンクションキーを使用
新規ウインドウの呼び出し用ホットキーには、⌘
+F1
以降の組み合わせを採用します。理由はこの組み合わせを扱っているアプリが少ないことと、左手のみで操作しやすいことをから採用しました。
Karabiner Elementsでのルール定義
基本的にはKarabiner Elementsを使用します。
Karabiner ElementsのSettingsでComplex Modifications
に以下のようなルールを追加します。私はSafariを常用しているので、Safariで新規ブラウザウインドウを立ち上げる例です。ホットキーには⌘
+F3
を採用しましたが、ここは適宜書き換えても構いません。
{
"description": "command + F3 ▸ New Safari Window",
"manipulators": [
{
"from": {
"key_code": "f3",
"modifiers": {
"mandatory": [
"command"
]
}
},
"to": [
{
"shell_command": "osascript -e 'tell application \"Safari\"' -e 'make new document' -e 'activate' -e 'end tell'"
}
],
"type": "basic"
}
]
}
ポイントはshell_command
を使ってosascript
経由でAppleScriptを実行することです。
Karabiner Elementsで任意のホットキーを検知 → シェルスクリプトを実行 → osascriptコマンドでAppleScriptを実行 …という具合です。
Safariの場合
osascript
では-e
オプションで各行の命令を追加していく形を取るので、to
で繋がない複数行スクリプトの場合はこのような連結方法になると思います。
osascript -e 'tell application \"Safari\"' -e 'make new document' -e 'activate' -e 'end tell'
これは次のAppleScriptをosascript向け構文に書き換えたものです。
tell application "Safari"
make new document
activate
end tell
Google Chromeの場合
Google Chromeの新規ウインドウの場合は、osascriptを次のように書き換えます。Safariと違う点は、新規ウインドウの命令がnew document
ではなく new window
である点です。
osascript -e 'tell application \"Google Chrome\"' -e 'make new window' -e 'activate' -e 'end tell'
これは次のAppleScriptをosascript向け構文に書き換えたものです。
tell application "Google Chrome"
make new window
activate
end tell
CotEditorの場合
CotEditorの新規ウインドウもほぼ似たような構文で実現可能です。
osascript -e 'tell application \"CotEditor\"' -e 'make document' -e 'activate' -e 'end tell'
Terminalの場合
Terminalの新規ウインドウも同様のアプローチで実現可能です。空のシェルスクリプトを実行する形で実現してみました。
osascript -e 'tell application \"Terminal\"' -e 'do script \"\"' -e 'activate' -e 'end tell'
留意
ファンクションキー各単体機能はそのまま有効
KarabinerルールによってF1, F2, F3… 各単体機能は上書きしないため、例えばF1の「ディスプレイの輝度を下げる」等の機能はそのまま使用可能です。
⌘F1等がすでに特定アプリで採用されている場合には機能衝突する
アプリによっては⌘
+F1
等のキーボードショートカットをすでに採用しているものもあるため、それらに対しては機能衝突が起こり得ます。
(おそらくKarabiner側が優先されます)
プライバシー/セキュリティ関係の許可が必要になる可能性
macOSがAppleScriptの実行を制限している場合があるため、プライバシー/セキュリティ関係の許可が必要なら任意に対応してください。
ウインドウオーダーを完全には維持できない
現在展開しているすべてのウインドウオーダーをそのまま維持しながら、任意アプリの新規ウインドウのみを最前面に展開することは、AppleScriptを使った方法では実現が難しいようです。activate
を実行した時点でそのアプリに所属するウインドウがすべて手前側に移動してきてしまう仕様です。
activate
を取り除くとそのアプリをアクティブ化することができなくなり、バックグラウンドで新規ウインドウを展開する形になります。
Discussion