pecoの学習帳 〜ディレクトリに入る・ファイルにアクセスする〜

最近ようやくpecoが自分の作業上で実用的になってきたので、そのメモです。

pecoの導入については@xtetsujiさんによる以下のQiita記事がとてもわかりやすかったのですが、qiita.com

それでも最初にそれを読んだ時は、ちょっと難しいというか、「ん〜でも結局、これを使うと何が嬉しいんだ? かえって面倒な気すらするが?」という感じもあって、紹介されているコードを手元にコピーはしたものの、とくには使えないまま時間が過ぎてしまって。

でもその後、最近時々紹介している『新しいLinuxの教科書』を読むにつれ、

新しいLinuxの教科書

新しいLinuxの教科書

だんだんLinuxコマンドやシェルスクリプトに馴染みが出てきて、その状態でまたふと上記を含む各種pecoの説明などを見返してみたら、けっこう意味がわかるようになったというか。

ようは、pecoを見てスゴイとか便利とか言っていた人たちは僕の知らない別の前提というか、暗黙の認識を共有していて、その一つがそういうシェルスクリプトLinuxUnix)の知識だったのかな、という。

で、じゃあ何がどう実用的になったのかというと、上記のてつじさんによるサンプルコードを若干変えて、以下のようなのを.bashrcに入れています。

function pd {
    local dir="$( find . -type d 2>/dev/null | peco )"
    if [ ! -z "$dir" ] ; then
        cd "$dir"
    fi
}
function pt {
    local file="$( find . -type f -name "*.[tm]*[td]" 2>/dev/null | peco )"
    if [ ! -z "$file" ] ; then
        vim "$file"
    fi
}
function pf {
    local file="$( find . 2>/dev/null | peco )"
    if [ ! -z "$file" ] ; then
        open "$file"
    fi
}

ほぼてつじさんの書かれたまま、findのオプションだけ変えている感じですが、最初のpdというのはディレクトリを探すときに使うもの、ptはテキストファイルをVimで開くもの、pfはMacのopenコマンドを使ってディレクトリやファイルを(テキストファイルにかぎらず)開くものです。

2>/dev/null というのは基本なくても問題なさそうなんだけど、時々階層の上〜の方で実行するとけっこう違いが出るので、入れています。

で、具体的にこれがどういう時にどうありがたいのかと言うと、僕はいつも大抵ファイル名の最初に「2015-10-09_sample.txt」のように日付や日時を入れていて、これはMacのFinder内で自動的にソートしてくれて見やすいからそうするのですが、ただそれの問題は「あ〜tmuxについて書いたあのテキストファイルを開きたいな」なんて思っても、それが入っているであろうディレクトリには他にも「2015-」で始まるファイルが大量に入っているので、ターミナルからそれを開こうとするといくらタブ補完を使ってもなかなか目当てのものに辿りつけなかったり、だからといってFinderからGUIでアクセスしようとするとそれはそれでCUIとはちょっと頭の使うところが違うので、けっこう消耗するという。

で、そんなときにpecoがあると、たとえばこんなファイル/ディレクトリ構成だったとして

A
├── B
├── C
│   ├── D
│   │   └── E
│   └── F

この中の「E」のファイルを探してるとしたら、今までなら少なくとも「D」を突き止めてからじゃないとアクセスできなかったのが、とりあえず「Aよりは下だ」という程度の大まかな認識でも、そこからpecoに入って、ファイル名のどこでもいい一部、つまり「2015-10-09_tmux.md」ならその中の「tmu」なんて打つだけで候補群の中にそれに該当するものがザラッと出てくる。で、そこへまたスペースを空けて「10-09」などの別語句を打っていくと、さらに絞り込んでいくことも可能という、この便利さと言ったらない。

まあ、そもそもプログラミング的な問題として、上の関数はどうなのかとか、いろいろスマートじゃない点もあるとは思うのですが、少なくとも当社比としては現時点でかなり便利度が高いので、現状報告的に使用例を書いてみました。

ちなみに、上記は既存のファイルへのアクセスが主な使用目的になっていますが、実際にはもっといろいろなことができそうなので、今後はもっと用途を広げていけたらとも思っています。github.com