はじめに
peco
が便利という話を前々から聞いていたのですが、Goで書かれていたこともあり(Goの環境を整えるのが面倒くさかっただけです)
つい最近まで使っていなかったのですが、最近ようやく導入して使い始めました。
とても便利で今までどうして導入しなかったんだろう...というぐらいです。
ところで、先日Qiitaの記事を適当に読んでいたところ次のような記事を見つけました。
おい、peco もいいけど fzf 使えよ
ここの記事の中で紹介されている有名なテキストセレクタの表を眺めていると、pecoも含め、多くがGoで書かれていることが目に止まりました。
僕はGo言語は全然知らないのでなんとも言えませんが最近はやりのCLIツールの多くがGo言語で書かれたりしているように感じますし(というかCLIツールに限らず流行りのソフトウェアがGoで書かれている確率が高い気がする)、この手のツールを作るのもGoに向いているのかもしれません。
しかし、私の好きなD言語でも実装できるはずです。そこで、自分用にpeco
のようなテキストセレクタを実装してみようと思い、doco
を作ってみました。
命名はdeco
だとなんか微妙な気がしたのでdoco
としました。特に深い意味はないです。
doco
というわけで、標準入力で受け取った行をフィルタして標準出力に返すだけの非常にシンプルなテキストセレクタをつくりました。
使い方はpeco
と同様に標準出力をdoco
へパイプで渡すだけで使えます。
cd $(ls -1 | doco)
というような感じで。
ちなみに、peco
よりも便利な点としては、正規表現をサポートしていることです。
たとえば、前述のls -1
の出力をフィルタする際にディレクトリだけをマッチさせたい場合、.*/
と書くことでディレクトリだけを取り出す事ができます。
インストールは、DコンパイラとDのビルドツール兼パッケージマネージャのdubをインストールした状態で
$ cd path/to/install
$ git clone https://github.com/alphaKAI/doco
$ cd doco
$ dub build
$ alias doco=$(pwd)/doco
とするだけです。
既知の問題として、マルチバイト文字が標準出力として受け取った標準出力に含まれていた場合、文字化けします。
これは、doco
はtermobox-d
に依存しており、termbox-d
はtermbox
のDバインディングであるため、termbox
がマルチバイト文字をサポートしていないことに起因します。
この問題はいつか時間のあるときにCLIフレームワークみたいなものを書いて解決しようと考えています。
実装について何か書こうと思っていたのですが、特に書くことが思い浮かばなかったので実装について気になる方はソースコードを読んでください: source/app.d