以下の内容はhttps://onk.hatenablog.jp/entry/2025/12/12/190240より取得しました。


2 画面ファイラーを作ったら最高だった

作ってみたかった

ある日 Slack で雑談していて、

僕の考えた最強の< >ツール なんか作りたいよね。なにかないか。

って流れになった。定番どころで、OS、コンパイラ、ブラウザをまず想像したけど、そう言えばずっとファイラー作りたかったんだよなぁと思い出した。たぶん 15 年ぐらいずっと欲しいって言ってたと思う。

Windows を使っていた頃は あふw ユーザーだったので、あの体験が懐かしいなぁと思いながら暮らす日々でした。*1

2 画面ファイラーの良さは省略します。言うまでもなく最高なので。

作ってみた

やるかーと思って「double_drive」ってプロジェクト名を決めた。あとは AI と壁打ちしながら作ったのがコレです。

デュアルペインで直感的にファイル操作できる

curses を生っぽく使うのかなと考えていたけど、少し調べてみたら TUI な枠を描ける RubyGemsCPAN module がいくつかあったので、せっかくだし使ってみています。

ガワが出来たら中身書くのは簡単ですね。毎日ドッグフーディングしながら欲しいコマンドをどんどん足していくのを楽しんでいる。

主な機能

ごく普通の 2 画面ファイラーです。

自分好みのキーバインドや挙動にできるのは最高で、選択も確認ダイアログも出さずにいきなり c で反対側ペインにコピーしているし、テキストファイルのプレビューでは bat をそのまま起動しています。

アーカイブファイル (zip とか) の中に潜れるようにした瞬間からグッと使い勝手が良くなりました。Mac の Finder が苦手なところなので、それはそう。

他に自分好みの機能としては、例えば x でそのディレクトリをカレントにしたシェルを開くようにしている。この実装は system('tmux', 'new-window', '-c', $current_dir); としていて、tmux は基本立ち上げっぱなしなので、この方が嬉しい。evim を立ち上げるときも同じく tmux の window にしている。こういう細かいところに手が届くのは最高。

余談その1:初回の面白会話

bundle gem double_drive と打った後、Claude Code を立ち上げて

id:onk 新しい gem を作ります。TUI アプリケーション (ファイルマネージャ) です。まずは gemspec を埋めましょう。 https://github.com/onk/double_drive に push するつもりです

 

⏺ gemspecを更新しました。以下の変更を行いました:

  • summary: "A dual-pane terminal-based file manager" - デュアルペインのTUIファイルマネージャという要約
  • description: より詳しい説明を追加
  • homepage: GitHubリポジトリのURL (https://github.com/onk/double_drive)
  • metadata:
    • allowed_push_host を削除(RubyGems.orgにpushする場合は不要)
    • source_code_uriGitHubのURLを設定
    • changelog_uri も追加(一般的なベストプラクティス)

これでgemspecの基本情報が埋まりました。RubyGems.orgに公開する準備が整っています。

 

id:onk よくデュアルペインって分かったねw commit よろしく

 

⏺ コミットしました!double_drive という名前から推測しました😄

変更内容:

人間味があって非常に良い。

Ruby で書いていたけど Perl で作り直した

YAPC::Fukuoka の前からボチボチ触っていたのだけれど、YAPC の後に気持ちが乗っていたので「Perl で作るか」と思って作り直した。

やりたい気持ちの根っこは「Perl 5.42の最新機能はどこまで AI で書けるのか」という疑問の解消です。

package を封印して全て class 構文で書いてみたり、1, 0 を使わずに全て builtin boolean で書いてみたり。

面白かったポイント1:非同期処理

Perl の TUI ライブラリとして、Tickit に乗っかってみた。自分でメインループを回さなくても勝手に非同期に描画されるので、Ruby のときの tty gem とは書き味が違う。callback を多用することになった。

また、確認ダイアログを出して結果を受ける、みたいなのを書こうとして、callback が嫌になって Future::AsyncAwait を使うことにしたのも面白ポイントです。Perl でも async/await を書けるぞ! 本人が実装について語ってるブログ が面白かったので読んでくれ。

面白かったポイント2: class で書くとあんまり Perl っぽくない

全てがインスタンス作ってメソッド呼び出しになるんだよな。それはそうなんだけど。

元々 Perl では関数を import して右から左に書いていく (こういう書き方をするからパイプライン演算子が欲しくなるのだが) コードをよく書いていたと思う。

my $content = path($file)->slurp_utf8;
my $lines = [ map { chomp; $_ } split /\n/, $content ];

こういうのが結構減って、全てが class のインスタンスへのメソッド呼び出しに変わっていくなぁ、というのは面白い気づきだった。いや別に今まで通りに書けばいいんだけど、目の前にオブジェクトがあるとメソッドにしたくなる力が働くんだよね。

あと class を使って書くと綺麗にカプセル化されてしまっていて、Perl の bless で作られたオブジェクト指向でよく扱っていた内臓を直接触るかのようなメタプログラミングがすべて封じられている。めちゃくちゃテスト書きづらい……。

面白かったポイント3: Ruby がよくできすぎてる

akr さんの APIデザインケーススタディ を読んでくれ、という感じなんだけど。

こんなに楽して書いていいんですか、となることが多いね。FileUtils も Open3 も便利……。

面白ポイント4: CJK 対応

TUI ライブラリが全角幅に対応していないことが多いこと多いこと。Pull Request いっぱい出すことになるし、いやしかし描画は確実に遅くなるので自分がメンテナだったとしても入れるか悩むだろうし難しいなぁって思うから出すのも悩むし、困る。

あと Mac でファイルパスを扱っているので NFD/NFC 正規化問題も踏んでる。

面白ポイント5: TUI 上で画像表示

Sixel かなぁ、iTerm2 にして iTerm Image Protocol かなぁ、Kitty にして kitty graphics protocol かなぁ、と考えて、Kitty にしました。

ターミナル上の任意の場所に急に画像を出せるの、自分で使っていても一瞬ビックリするし便利で面白い。

Kyoto.なんか #7 で git の話をしたときの画像

Perl の最新機能を AI は使えたのか

何ら問題ないですね。class 構文もサブルーチンシグネチャも try-catch も builtin boolean も元気に使いこなしてくれる。

boolean は慣れてなくて最初のコードでは絶対 1 を返してくるし、ファイルの末尾に 1; も付けてくるし、try-catch 使わずに eval してくるので、手放しってわけではない。都度「v5.42 って言ったよね」と言うことで自分好みのコードを書かせている。

class と signature は本当に問題なく使ってくれる。

Claude (Sonnet 4.5 でも Haiku 4.5 でも) でも Codex (gpt-5.1-codex-max) でも、Copilot (Gemini 3 Pro) でも、Perl の扱いに関してはあまり差は感じてないなー。

まとめ

ファイラーを作るとあのカオスだった Downloads ディレクトリや .Trash ディレクトリが掃除できました。すごい成果だ。

毎日ドッグフーディングできる (機能を思い付いて改善できる) 遊び場があると楽しいですね。

https://github.com/onk/double-drive_perl

はてなエンジニア Advent Calendar 2025 6 日目でした

すっかり忘れてた orz

*1:そこまで本気で探してもいなかったので mc や ranger 等は使ってなかった




以上の内容はhttps://onk.hatenablog.jp/entry/2025/12/12/190240より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14