LoginSignup
7
6

More than 5 years have passed since last update.

pecoがGoで書かれていたのでD言語でdocoを作った

Last updated at Posted at 2016-09-07

はじめに

pecoが便利という話を前々から聞いていたのですが、Goで書かれていたこともあり(Goの環境を整えるのが面倒くさかっただけです)
つい最近まで使っていなかったのですが、最近ようやく導入して使い始めました。

とても便利で今までどうして導入しなかったんだろう...というぐらいです。

ところで、先日Qiitaの記事を適当に読んでいたところ次のような記事を見つけました。
おい、peco もいいけど fzf 使えよ

ここの記事の中で紹介されている有名なテキストセレクタの表を眺めていると、pecoも含め、多くがGoで書かれていることが目に止まりました。

僕はGo言語は全然知らないのでなんとも言えませんが最近はやりのCLIツールの多くがGo言語で書かれたりしているように感じますし(というかCLIツールに限らず流行りのソフトウェアがGoで書かれている確率が高い気がする)、この手のツールを作るのもGoに向いているのかもしれません。

しかし、私の好きなD言語でも実装できるはずです。そこで、自分用にpecoのようなテキストセレクタを実装してみようと思い、docoを作ってみました。
命名はdecoだとなんか微妙な気がしたのでdocoとしました。特に深い意味はないです。

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

とするだけです。

既知の問題として、マルチバイト文字が標準出力として受け取った標準出力に含まれていた場合、文字化けします。
これは、docotermobox-dに依存しており、termbox-dtermboxのDバインディングであるため、termboxがマルチバイト文字をサポートしていないことに起因します。
この問題はいつか時間のあるときにCLIフレームワークみたいなものを書いて解決しようと考えています。

実装について何か書こうと思っていたのですが、特に書くことが思い浮かばなかったので実装について気になる方はソースコードを読んでください: source/app.d

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6