choっと作った便利なツール

以前の記事で、dirmove というディレクトリ間をさくさく移動するための自作コマンドラインツールを紹介しましたが、

note103.hateblo.jp

これを @mattn さんによる cho というコマンドラインツールと組み合わせたらさらに便利になってしまい、以前の時点でも自作ツール史上トップ3ぐらいに使っていましたが、今ではおそらく最も利用しているであろうツールになりました。

DEMO

cho と組み合せた様子はこんな感じです。

f:id:note103:20160626013034g:plain
(初めて打鍵の様子が出るようにしてみた…… powerd by KeyCast

peco との連携はこのように。

f:id:note103:20160626115735g:plain

Cool!

概要

ここでやっていることは大きく二つあって、ひとつはツール名のとおりディレクトリ移動。
もう一つは、移動した先のディレクトリでテキストファイルなどを選択すると、それをオープンする、というもの。

元々は前者のみの機能として作っていたので、素朴に「dirmove」などという名前を付けていましたが、今となってはファイルオープンもけっこう大きな要素なので、変名するか若干検討中です……。

選択

冒頭で挙げたブログ記事でも触れていますが、以前は pecosentaku という2種類のコマンドラインを同様のかたちで組み合わせていました。

しかしその後、 @mattn さんが cho という汎用性の高い小さなツールを公開されて、

mattn.kaoriya.net

これがその sentaku と非常にかぶるというか、ぼくが sentaku でやりたかったことをほぼそのままカバーしていたことから、とりあえず使ってみたいと思って peco, sentaku に続く3つめの連携ツールとして取り入れてみました。

しかしそのうち、大半の操作で cho 連携の方しか使っていない状況になってしまい、後述のように使い分けが可能な peco はともかく、ほぼ同等の役割を果たせる sentaku まわりのコードまで保守(というか)をするのもちょっと負担だなと思うようになり、現状の peco, cho との連携方式に収まりました。

peco との違い・使い分け

上の @mattn さんのブログ記事にもありますが、基本的に cho の機能は j/k キーで上下に1行ずつ動くことだけなので、対象となるファイル名などがある程度明確にわかっている場合は、文字入力しながらインクリメンタルに絞り込んでいける peco のほうが便利です。

また、peco は最上行からさらに上へ進むと最下行へジャンプする、というトグルの動作をするので、大量の選択肢の中から一番下の方を見たい、というときも peco 連携のほうが良いでしょう。

一方、自分の普段の作業を振り返ると、ディレクトリやファイルを選ぶときというのは、あまり明確に対象を意識できていない場合も多く、頭の中の「あんな感じのあれがほしい……」という言語化される前のぼんやりした意識が率先してどんどん先へ進んでいくようなところがあるので、そういう状態でも「とりあえずディレクトリを開いて内部を探していける」、そして「j/k キーを1個ずつ押していくだけで移動できる」という cho との連携は、多くの場面で感覚的なサポートを果たしてくれて便利です。

用途・有効性

このツールがとくに力を発揮するのは、たとえば以下のようなファイルの中から、ひとつだけ対象を選びたいときです。

2008-04-22-67d8eab_project1.txt
2013-05-24-7968fe7_project2.txt
2016-05-25-2f086cd_project3.md
2016-05-26-2ed78da_project4.txt
2016-06-26-5ce1266_project5.md
(以下延々と続く)

このうち、もし3番目のproject3を選びたい場合、コマンドライン上から指定しようとすると、一意を示す要素に辿りつくまでに

# 2を打ってタブ
20 # 1を打ってタブ
201 # 6を打ってタブ
2016-0 # 5を打ってタブ
2016-05-2 # 5を打ってタブ
2016-05-25-2f086cd_project3.md # ようやくすべて出てくる

……と、合計5*2回(数字キー+タブキー)の打鍵が必要になり、この間のストレスはなかなかのものです。

しかし、ここで今回のツールを使えば、目当てのものに辿りつくまで j/k キーを押していくだけで、半ば無意識のうちにファイルを指し示すことができます。

f:id:note103:20160626013550g:plain

オプション

その他の機能として、引数で対象ファイル/ディレクトリの絞込みをできるようにしています。

上の設定で言うと、デフォルトのコマンドは「dfm」のひとつだけで、引数のバリエーションは以下のようになります。

$ dfm   # cho方式で選択, ファイル&ディレクトリともに選択対象, 不可視ファイルを除く
$ dfm p # peco方式で選択
$ dfm . # 不可視ファイルも選択肢に含める
$ dfm f # ファイルのみ選択対象とする
$ dfm d # ディレクトリのみ選択対象とする

それぞれの引数は、複数利用可、順番も自由です。
f と d は片方を選択するものですが、もし両方入れてしまったら後から入れたほうが使われます。

デフォルトを peco ではなく cho にしているのは、それで充分というケースのほうが多いと感じているためですが、前述のように peco のほうが便利な場面も少なくないため、実際にはエイリアスを使って、 peco も簡単に起動できるようにしてあります。
(READMEの設定例をご参照)

まとめ

今回は @mattn さん製の cho を使った自作コマンドラインツール/環境を紹介してみました。

実際には、この他にも同様の仕組みで作成&使用している便利ツールがいくつかあって、それらも合わせて紹介するつもりでしたが、ちょっと長くなりそうだったのでまた別の機会に紹介できればと思います。

cho も peco も機能はシンプルながら大変有用なツールで、日々のちょっとした面倒な作業がチリも積もれば的に大きく改善されていると感じます。

作者のお二方、そしてコントリビューターやコミュニティの皆さんに心から感謝します。