かんたんなワークフローのつくりかた:修飾キーを押したときだけワークフローの動作を変更する

 Alfredには、⌃Control⌘Command⌥Optionといった修飾キーをいっしょにEnterを押すと、選択項目の動作を変更する機能がある。

Alfredの環境設定。修飾キーを押した場合の代替アクションを設定できる

 たとえばWebを検索しようと思ってキーワードを入力したのに、同じ名前のアプリケーションがあったせいで、そっちの方が優先されちゃったとき、⌃Controlを押しながらEnterを押すと、デフォルトの検索エンジンにクエリーが投げられるようになっている。

 じつは、この機能はワークフローからも利用できる。
 修飾キーを押しながらワークフローを起動することで、通常とはちがう動作をさせることができるんだ。

修飾キーを押したときのワークフローのサブテキストの変化

 これはGoogle検索のワークフローを改造してつくった、Fallback Searchの例。

 ⇧Shift⌃Controlを押したときは、ワークフロー独自のサブテキスト(※小文字の説明書き)が表示されているけど、⌘Command⌥Optionを押したときは、環境設定で指定したグローバルの代替アクションが表示されている。


 前回つくった特定のURLを開くワークフローを改造して、修飾キーを押したときだけ、URLを開くブラウザを変更してみよう。

 Alfred2時代は、こういうことがしたいとき、その後のアクションをすべて分岐させる必要があった。
 言い方を変えると、途中にクエリー変更用のスクリプトがあったりすると、まったく同じ内容のスクリプトをあちこちにばらまかなくてはならなかった。
 メンテナンスを考えると嬉しくないよね。

 でも、Alfred3では、ワークフローが変数を持てるようになったおかげで、こういう分岐をいったんまとめて、条件に応じて再分岐できるようになったんだ!

1. Arg and Varsの部品をつくり、連結する

Arg and Varsアクションの位置

 ワークフロー作成画面上で右クリックして、[Utilities]→[Arg and Vars]を選択。これを前後と連結する。

 サンプルの場合、[Arg and Vars]のパーツは、ワークフローを起動するキーワードと、クエリーを変更するスクリプトの間に入るかたちになる。

Arg and Vars部品を前後とつないだところ

 元の動作を残しておきたいので、もともとあった接続は削除しない。

2. 接続をダブルクリックして、修飾キーとサブテキストを設定する

接続の設定。ここで修飾キーを設定できる

 キーワードと[Arg and Vars]のパーツをつなぐ接続をダブルクリック。
 ダイアログが表示されるので、[Action Modifier]から修飾キーを選ぶ。

接続に付加できる修飾キーの一覧

 none(修飾キーなし。デフォルト設定)以外に、ctrl(⌃Control)、alt (⌥Option)、cmd (⌘Command)、fn, shiftの5種類が用意されている。

 Modifier Subtextの欄には、修飾キーが押されたときに表示されるテキストを入力する。

3. 変数を設定する

 [Arg and Vars]のパーツを再度開いて、修飾キーが押されたことを記録する変数をつくろう。

Alfred3のArg and Varsダイアログ。変数mod_keyを設定する

 クエリーはそのまま次に渡したいから、[Argument]欄は{query}のまま。
 Variablesの欄にフラグ用の変数名と値を記入する。
 今回は変数名をmod_key、値をctrlにしてみたよ。

4. フィルタの部品をふたつ作成し、前後に接続する

Utilities→Filterの位置

 次に、ワークフローの作成画面を右クリックして、[Utilities]→[Filter]を選択。
 フラスコ型のアイコンができる。
 このFilterは、条件に応じて進路を変更するためのパーツ。
 ふたつ必要だからもう一回繰り返して、それぞれ前後に接続する。

FilterをスクリプトとOpen URLパーツの間に接続した

 サンプルの場合、フラスコ型アイコンのひとつは、URL変更用のスクリプトと、もともとあったOpen URLの間に入る。
 もうひとつのフラスコ型アイコンが、ブラウザ変更用のルート。
 ブラウザを変更したOpen URLのパーツをつくって、こちらとつなぐ。

5. 変数に応じてフローを分岐させる

 デフォルトのルートにしたい、一つ目のフラスコアイコンをダブルクリック。
 変数mod_keyには、⌃Controlを押しながらワークフローを起動した場合にのみ、ctrlという値がセットされるから、それ以外の場合をデフォルトルートに送っちゃえばいい。

Alfred3のフィルタの例。変数と値を条件is not equal toで結ぶ

 最初の欄に{var:mod_key}と入力。
 条件としてis not equal to(〜と等しくない)を選ぶ。
 最後の欄にctrlと入力。

Alfred3のフィルタの例。変数と値を条件is equal toで結ぶ

 もうひとつのルートは、Ctrlが押された場合にのみ進行するルートだから、フラスコアイコンの設定内容は、最初の欄に{var:mod_key}と入力。
 条件としてis equal to(〜と等しい)を選択。
 最後の欄にctrlと入力する。

 これで完成!
 分岐をつくるのはちょっと面倒だけど、スクリプトのパーツが一点に集約されているから、あとからスクリプトを変更した場合でも、変更後のスクリプトをコピペしてまわらなくてすむよ!


 ……でも、待って。
 変数mod_keyのとりうる値がctrlだけならこれでいいけど、もっとたくさんのブラウザに対応させたくなったときはどうしよう?
「変数mod_keyの値がctrl以外」という条件では、デフォルトにしたいルートに適合できなくなっちゃわない?

5. 変数に初期値を設定する

ワークフローの変数を設定するボタンの位置

 Alfred3では、変数にデフォルトの値を設定することができる。
 だから、変数mod_keyが初期値のままならデフォルトのルート、それ以外の値の場合はそれぞれのルート、という分岐を組むことができるんだ。

Alfred3の変数設定ダイアログ

 変数に初期値を設定するには、ワークフロー作成画面右上の[?]アイコンをクリックする。
 左側の[About this Workflow]は、ワークフローに関する解説を記入する欄。
 下の[Workflow Version:]には、そのワークフローのバージョン番号を記入する。
 自作のワークフローを配布するとき必要となる項目だね。

 変数の設定欄は右側。
 右下のアイコンをクリックすると、新しい変数を作成できる。

 サンプルの場合は、変数名としてmod_key、値としてnoneを選択。
 後は一つ目のフィルタの条件を「{var:mod_key} が equal to noneのとき」に変更してやれば、あとから修飾キーを追加しても対応できるワークフローのできあがりだよ!