きっかけ
生物学を学んでいる身としては論文を読んでるときとかにパパッとライフサイエンス辞書を引けたら嬉しいなと思ったのと,ただ単に検索結果のURLをブラウザで開くだけなら最初からブラウザ使えば良いよねと思ったので,自作してみることにしました.
Go言語を使ったわけ
ライフサイエンス辞書は通常開くウインドウとは別に,こういった検索方法も存在します.最初はこれをただURL開くだけで良いかとも思ったのですが味気なく,しかしJSONやXMLなどのAPIでもないためこれを再利用するにはスクレイピングが必須です.
AlfredのWorkflowでは様々なスクリプトを実行できますし,そのままターミナルを叩けるのですが,スクリプト言語の利用できるライブラリはその環境に依存してしまいます.スクレイピングをするのに外部ライブラリ無しという縛りはあまりにも鬼畜であるので,どうにかしてライブラリを使いつつ,環境依存を減らしたいなと考えたときにGoを思い出しました.
バイナリ一発で動くというのが魅力で,今回の用途に適しているのではないかと考えやったことも無いのにとりあえず書いてみることにしました.
環境
- Alfred v3.3.1
- Go 1.8.1
- Glide 0.12.3
今回はGoのパッケージ管理にGlideを使用しました.なお,このWorkflowを動作させるだけであればGoもGlideも必要ありません.自分でビルドする場合のみ導入してください.
lsd-alfred
リポジトリは以下になります.
できること
ライフサイエンス辞書から単語を引くことが出来ます.英語,日本語どちらでも検索可能です.
検索方法は以下の4通りあります.
- 前方一致:
lsd begin "{query}"
- 後方一致:
lsd end "{query}"
- 部分一致:
lsd in "{query}"
- 完全一致:
lsd eq "{query}"
検索してブラウザで開く
検索した後Shift
+ Enter
でデフォルトブラウザを使用して開きます.
検索してクリップボードにコピー
検索した後Command
+ Enter
でクリップボードにコピーします.
また,最前面の入力ウインドウに対して自動的に入力を行います.この設定はWorkflow中のCopy to Clipboard
中のオプションを変更することで無効にもできます.
検索結果から再検索
検索した後Fn
+ Enter
で再検索をかけます(意味があるのかは分からない…)
検索結果をさらに検索エンジンにかける
検索した後Ctrl
+ Enter
でググります.
検索結果をSpotlight検索にかける
検索した後Alt
+ Enter
でSpotlight検索にかけることができます.(GIF略)
検索結果の一覧ページを開く
See all results
の項目でShift
+ Enter
すると一覧が開きます.(GIF略)
ホットキーを使用して選択文字列を検索
初期では使用できません.使いたい場合,Alfred Workflowの設定を開いてlsd-alfredのHotKeyの項目に好きなキーを割り当ててください.デフォルトでは部分一致検索を行います.
できないこと
まだシソーラスとコーパス検索には対応していません.が,原理的には同様にスクレイピングをするだけで実現可能であるため,実装すれば実現は容易です.
まとめ
作ろうと思い至ってからGoに入門して完成までだいたい2日でここまできたので個人的には満足です.が,まだまだ常用ツールとしては未熟な作りでひどいコードなので少しずつリファクタリングしていきたい…たぶんバグたくさんあるのでPR待ってます(他力本願)
一応.alfredworkflow
なパッケージは以下からダウンロードできます.使用は自己責任で…
Releases · pddg/go-lsd-alfred · GitHub
Alfred Workflowの作り方
ネットを検索していると何か色々とWorkflowの作り方が出てきますが大抵古いです.現在は標準でAlfred 3がエクスポートの機能を持っており,外部ツールを用いる必要はありません.
Alfred無しで(CI等で).alfredworkflow
なパッケージを作るにはどうもzip圧縮して拡張子を変更してやれば良いだけ?っぽいです.
以下簡単に手順です.
- Blank Workflowを作成し,詳細情報を入力
- 作成したWorkflowを二本指タップすると
Open in Finder…
が出てくるのでそれを押す - 開いた場所に実行するスクリプトや必要な設定ファイル等を置く
- 編集する
- Exportする
以上です.
Workflowとスクリプトの連携について
phpなどを使う場合,あらかじめ用意されたworkflow.php
などを利用する方法が出てきますが,今回のように自作バイナリを叩く場合の記述に関しては全然見当たらなかったので本家の英語ドキュメントを軽く読んでやりました.今でも合っている自信が無いです.
Alfred 3からはXMLだけでなくJSONも使用できます.一応XMLは後方互換のために残しているだけのような感じなので,JSONを使用していこうと思います.Workflowで使用するのはScript Filter
です.
{"items": [ { "uid": "ID", "type": "file|default|skipcheck", "title": "title", "subtitle": "subtitle", "arg": "url", "autocomplete": "title", "valid": true "icon": { "type": "fileicon", "path": "path" }, "mods": { "alt": { "valid": true, "arg": "url", "subtitle": "subtitle" } }, "text": { "copy": "Text to copy", "largetype": "Large Text" }, "quicklookurl": "url" } ]}
uid
: ユニークキー.ここの値を元にソートされるっぽい.type
: このオブジェクトがファイルなのか,それ以外なのかを示す.file
を指定すると存在するかのチェックが入るので嫌な場合はskipcheck
にせよと書いてある.arg
: 表示されたオブジェクトを選択してEnterを押したとき,次に渡される値.URLなど.icon
:type
もpath
も空欄にしておくとパッケージに含めたicon.png
が勝手に使用される.valid
: Enter押したときに次のアクションを行うかどうかmods
: 修飾キーと組み合わせたとき,次に渡す値を変化させることが出来る.例えばalt
+Enter
のときはタイトルを出力するが,Cmd
+Enter
のときはURLを出力すると言った挙動に出来る.使える修飾キーはCmd
,Alt
,Ctrl
,Shift
,Fn
text
:copy
の値はコピーしたときクリップボードにコピーされる値.largetype
はCmd
+L
を押したときに表示されるLargeTypeに表示するテキスト.
最終的に上記の形式(全てを含めなくても良い)のJSONを標準出力にPrintするだけで簡単に使えます.最高.
まとめ
Goは言語自体はシンプルなのですが,どうにもエラー処理やスライスの周りで頭が混乱してしまいます.もう少し使えるようになればかなり便利そう…
Alfred 3,Workflowでできることがとても多くて重宝しています.課金して良かった.