素晴らしい記事を見つけました。
プログラムのネーミングに迷ったら GitHub でコード検索すると参考になる説 - Qiita
みなさん、コードを書いていて変数やメソッド名のネーミングって迷いますね。
こんな時に自分たちはチームを横断して「こういう名前考えたんだけど、これってどうかな?」という確認を Slack 上で行っています。先日、この Slack チャンネルを見ていて考えました。
「GitHub で検索すれば世の中のコードでどのぐらい使われているかざっくり分かるので参考になるのでは?説」
というアイデアを実現するため、CLIでサクッとキーワードの件数を検索できるツール ghkw
を作られたとのこと。
% ghkw ninja samurai bushi sensei senpai kohai
RANK | KEYWORD | TOTAL |
---|---|---|
1 | ninja | 3,374,938 |
2 | samurai | 730,748 |
3 | sensei | 213,917 |
4 | senpai | 26,786 |
5 | bushi | 25,493 |
6 | kohai | 2,195 |
うん。良いですね。
ただ…ターミナル立ち上げるのも時々億劫なんだよなあ…。
# Alfredと連携させてみよう
さて、Macのランチャーアプリ Alfred には、強力なコマンド呼び出し機能「Workflows」があります。(有料)
[Alfred Workflows - Extend Alfred and Boost Your Productivity](https://www.alfredapp.com/workflows/)
これを使って、ランチャー内で結果を確認できたら最高なのでは?
ということで、ターミナルを使わなくてもいいようにしてみました。
## 手順
簡単です。
### 1. Alfred の Preference で、①Workflowsを表示し、②新規作成し、③を配置して開く
![image.png](https://qiita-image-store.s3.amazonaws.com/0/34405/7aa178b4-d91d-f419-d367-d4d72fdee8c3.png)
### 2. スクリプトを書く
![image.png](https://qiita-image-store.s3.amazonaws.com/0/34405/3b4c57be-cc58-32eb-f03b-66f0db88c85e.png)
zsh の知識もあまりないですが、ほかの Workflow や参考サイト[^1][^2][^3]を見ながら、見よう見まねでなんとかなりました。
[^1]: [Alfred Workflowのシェルで追加コマンドが利用できない理由とその対策 | 豆腐メンタルは崩れない](http://wbtmiu.herokuapp.com/2014/10/30/b6a2f20af2e75e89c1a52ccde3b182ec/)
[^2]: [zsh の配列操作の基本から応用まで - Qiita](https://qiita.com/mollifier/items/f897b3fddd2d10369333)
[^3]: [Split string with zsh as in Python - Stack Overflow](https://stackoverflow.com/questions/2930238/split-string-with-zsh-as-in-python)
```zsh
PATH=$PATH:/usr/local/bin # 環境変数を設定しないと brew でインストールしたコマンドが使えない
zmodload zsh/regex # zsh で正規表現を使うために必要
result=$(ghkw {query}) # {query} でユーザー入力値が取得できる
arr=( ${(@f)result} ) # ghkw の出力結果を行ごとの配列へと変換
cat<<EOB
<?xml version="1.0"?>
<items>
EOB
for i in $arr; do
cols=("${(@s/|/)i}") # 結果が `|` で区切られているので分割。ちなみに index は 1 始まり
keyword=$(echo $cols[3] | tr -d '[:space:]')
population=$(echo $cols[4] | tr -d '[:space:]')
if [[ $cols[2] -regex-match "[0-9]" ]]; then # 結果(= cols[2] が数字) 以外の行を雑にフィルタ
cat<<EOB
<item uid="$population" arg="$keyword"> # item は uid の順にソートされる
<title>$keyword</title>
<subtitle> hits: $population</subtitle>
<icon>icon.png</icon>
</item>
EOB
fi
done
cat<<EOB
</items>
EOB
3. (Optional) 選択時に GitHub の検索結果を開くようにする
ブロックをつなげて…
https://github.com/search?utf8=%E2%9C%93&q={query}&type=
と設定。
できた!
いいでしょー。