@kyanny's blog

My thoughts, my life. Views/opinions are my own.

Alfred Workflow の Script Filter で Alfred filters results と任意の入力値を両立させる

結論

Script Filter 単体では不可能なので、Keyword Input などで受け取った入力を Arg and Vars で変数に保存し、Script Filter で実行するスクリプトから参照する。

エクスポートしたワークフローのアーカイブを GitHub に置いた。

github.com

解説

Script filter with query as input and Alfred filters results. - Discussion & Help - Alfred App Community Forum で議論されているように、Script Filter のスクリプトに引数を渡すモードと Alfred filters results を有効化するモードは排他的で、両立できない。つまり、渡した引数に応じて異なる結果を出力するスクリプトの結果をインクリメンタルサーチで絞り込むワークフローは、Script Filter 単体では実現できない。

たとえば、「キーワード fizzbuzz のあとに数字を入力すると 1 からその数字までの FizzBuzz 数列を出力するワークフロー」を考える。理想的な挙動は、以下の動画のように、出力されたリストに対してインクリメンタルサーチが効くこと。

youtu.be

このワークフローを実現するには、Alfred ワークフローを起動する際に引数を与え、その引数を Script Filter のスクリプトに渡し、かつ Alfred filters results を有効化しなければならない。これが Script Filter 単体では実現できない、という話。

ではどうするか。すでに結論で述べたように、Script Filter より前のステップで入力を受け取り、それを Arg and Values ユーティリティで(環境)変数に保存して、スクリプトはその(環境)変数を参照するようにすればよい。

三枚目のスクリーンショットが Arg and Values の設定画面だが、一番上の Argument 欄にはデフォルトで {query} が入力されている。これを残しておくと、Keyword Input に対して入力したクエリが、後続の Script Filter 実行時にも Alfred のサーチバー内に残ってしまい、それがスクリプト実行結果の絞り込みとして作用するので、一見何も出力されていないように見える場合がある。クエリを消せばスクリプトの出力が全部見える。これは annoying なので Argument 欄を空にしておくと、Arg and Vars を通った時点でサーチバーの内容がクリアされるので、Script Filter の動作を邪魔せずに済む。