Percol | percol の基本操作

# Percol | percol の基本操作

## 概要
Percol はPython製のインタラクティブな grep ツールです。

同種のツールとして以下があります。

|name|impl lang|github url|
|:--|:--|:--|
|canything|C|https://github.com/keiji0/canything|
|zaw|Shell|https://github.com/zsh-users/zaw|
|peco|Go|https://github.com/peco/peco|
|fzf|Ruby|https://github.com/junegunn/fzf|

## 利用例

### 利用例1：単一ファイル内のテキスト検索

銀行コードと銀行名のリストを絞り込んでみます。

~~~text:banks.txt
0001|みずほ銀行
0005|三菱東京ＵＦＪ銀行
0009|三井住友銀行
0010|りそな銀行
0017|埼玉りそな銀行
0033|ジャパンネット銀行
0034|セブン銀行
0035|ソニー銀行
0036|楽天銀行
0038|住信ＳＢＩネット銀行
0039|じぶん銀行
0040|イオン銀行
0041|大和ネクスト銀行
0116|北海道銀行
0117|青森銀行
0118|みちのく銀行
0119|秋田銀行
0120|北都銀行
0121|荘内銀行
0122|山形銀行
0123|岩手銀行
0124|東北銀行
0125|七十七銀行
0126|東邦銀行
0128|群馬銀行
0129|足利銀行
0130|常陽銀行
0131|筑波銀行
0133|武蔵野銀行
0134|千葉銀行
0135|千葉興業銀行
0137|東京都民銀行
0138|横浜銀行
0140|第四銀行
0141|北越銀行
0142|山梨中央銀行
0143|八十二銀行
0144|北陸銀行
0145|富山銀行
0146|北國銀行
0147|福井銀行
0149|静岡銀行
0150|スルガ銀行
0151|清水銀行
0152|大垣共立銀行
0153|十六銀行
0154|三重銀行
0155|百五銀行
0157|滋賀銀行
0158|京都銀行
0159|近畿大阪銀行
0161|池田泉州銀行
0162|南都銀行
0163|紀陽銀行
0164|但馬銀行
0166|鳥取銀行
0167|山陰合同銀行
0168|中国銀行
0169|広島銀行
0170|山口銀行
0172|阿波銀行
0173|百十四銀行
0174|伊予銀行
0175|四国銀行
0177|福岡銀行
0178|筑邦銀行
0179|佐賀銀行
0180|十八銀行
0181|親和銀行
0182|肥後銀行
0183|大分銀行
0184|宮崎銀行
0185|鹿児島銀行
0187|琉球銀行
0188|沖縄銀行
0190|西日本シティ銀行
0191|北九州銀行
0288|三菱ＵＦＪ信託銀行
0289|みずほ信託銀行
0294|三井住友信託銀行
0297|日本マスタートラスト信託銀行
0304|野村信託銀行
0307|オリックス銀行
0322|新銀行東京
0324|日本トラスティサービス信託銀行
0325|資産管理サービス信託銀行
0397|新生銀行
0398|あおぞら銀行
0401|シティバンク銀行
0402|ジェーピーモルガン銀行
0403|アメリカ銀行
0411|香港上海銀行
0430|ドイツ銀行
0472|ＳＢＪ銀行
0501|北洋銀行
0508|きらやか銀行
0509|北日本銀行
0512|仙台銀行
0513|福島銀行
0514|大東銀行
0516|東和銀行
0517|栃木銀行
0522|京葉銀行
0525|東日本銀行
0526|東京スター銀行
0530|神奈川銀行
0532|大光銀行
0533|長野銀行
0534|富山第一銀行
0537|福邦銀行
0538|静岡中央銀行
0542|愛知銀行
0543|名古屋銀行
0544|中京銀行
0546|第三銀行
0554|関西アーバン銀行
0555|大正銀行
0562|みなと銀行
0565|島根銀行
0566|トマト銀行
0569|もみじ銀行
0570|西京銀行
0572|徳島銀行
0573|香川銀行
0576|愛媛銀行
0578|高知銀行
0582|福岡中央銀行
0583|佐賀共栄銀行
0585|長崎銀行
0587|熊本銀行
0590|豊和銀行
0591|宮崎太陽銀行
0594|南日本銀行
0596|沖縄海邦銀行
0597|八千代銀行
~~~

* 三菱東京ＵＦＪ銀行を絞り込む

絞り込まれていく様子。

~~~bash
$ percol banks.txt
QUERY> 三                                                            (1/6) [1/1]
0005|三菱東京ＵＦＪ銀行
0009|三井住友銀行
0154|三重銀行
0288|三菱ＵＦＪ信託銀行
0294|三井住友信託銀行
0546|第三銀行
~~~

~~~bash
QUERY> 三菱                                                            (1/2) [1/1]
0005|三菱東京ＵＦＪ銀行
288|三菱ＵＦＪ信託銀行
~~~

~~~bash
QUERY> 三菱東京                                                            (1/1) [1/1]
0005|三菱東京ＵＦＪ銀行
~~~

* 絞り込み＋カーソル移動で三井住友銀行を選択する

三を入力後、2番目にデータがあるので下カーソルを一回入力後、Enterで三井住友銀行が標準出力されます

~~~bash
$ percol banks.txt
QUERY> 三                                                            (1/6) [1/1]
0005|三菱東京ＵＦＪ銀行
0009|三井住友銀行
0154|三重銀行
0288|三菱ＵＦＪ信託銀行
0294|三井住友信託銀行
0546|第三銀行

$ percol banks.txt
0009|三井住友銀行
~~~

### 利用例2：複数のコマンドとパイプを利用する

自作 gem [tudu](https://github.com/tbpgr/tudu) の .rb ファイルから version.rb を選択し、 cat で表示する

* 絞り込み前

~~~bash
$ find . -name "*.rb" | percol | xargs cat -n

QUERY>                                                            (1/12)[1/1]
./lib/task.rb
./lib/tasks.rb
./lib/tudu/version.rb
./lib/tudu_core.rb
./lib/tudu_dsl.rb
./lib/tudu_file_keys.rb
./lib/tudu_paths.rb
./lib/tudu_templates.rb
./spec/spec_helper.rb
./spec/tasks_spec.rb
./spec/tudu_core_spec.rb
./spec/tudu_dsl_spec.rb
~~~

* v で絞り込み

~~~bash
QUERY>
v                                                         (1/1)[1/1]
./lib/tudu/version.rb
~~~

* 絞り込めたのでEnterを押下して結果を表示

~~~bash
$ find . -name "*.rb" | percol | xargs cat -n
     1  # encoding: utf-8
     2  # =TodoManage Module
     3  module Tudu
     4    VERSION = '0.0.5'
     5  end
~~~


### 利用例3：複数要素を選択

自作 gem [tudu](https://github.com/tbpgr/tudu) の .rb ファイルから *_spec.rb に一致するファイルを全て選択し、 cat で表示する

* 絞り込み前

~~~bash
$ find . -name "*.rb" | percol | wc

QUERY>                                                         (1/12)[1/1]
./lib/task.rb
./lib/tasks.rb
./lib/tudu/version.rb
./lib/tudu_core.rb
./lib/tudu_dsl.rb
./lib/tudu_file_keys.rb
./lib/tudu_paths.rb
./lib/tudu_templates.rb
./spec/spec_helper.rb
./spec/tasks_spec.rb
./spec/tudu_core_spec.rb
./spec/tudu_dsl_spec.rb
~~~

* spec. で絞り込み

~~~bash
QUERY>
spec.                                                         (1/3)[1/1]
./spec/tasks_spec.rb
./spec/tudu_core_spec.rb
./spec/tudu_dsl_spec.rb
~~~

* Ctrl+Space で必要なファイルを選択します（今回は全て）

* 3件の絞り込み結果に対して、 `wc` を実行した結果が表示されます

~~~bash
$ find . -name "*.rb" | percol | wc
      3       3      70
~~~

## 補足
実際にCUIで1文字入力するたびに、結果のフィルタリングがモリモリ動く様子は
percol の GitHub の README にあるアニメーションGIFをご確認ください。
https://github.com/mooz/percol

## 参照
* percol GitHub
https://github.com/mooz/percol

* tudu GitHub
https://github.com/tbpgr/tudu