🔄

「またデバッグ出力消し忘れた...」を撲滅するツール「flop」

に公開

TL;DR

C/C++のデバッグ用printf文をコマンド一発で管理できるツールflopを作りました。インタラクティブなTUIで、コメントアウト・有効化・削除を直感的に操作できます。

flopのインタラクティブモード

なぜ作ったのか

42TokyoでC/C++を学習する中で、こんな悩みがありました。

// デバッグ中:あちこちにprintf追加
printf("debug: i = %d\n", i);
printf("debug: array[%d] = %d\n", i, array[i]);

// 提出前:手動で一つずつ削除... 面倒!😫
// しかも、またデバッグが必要になったら書き直し...

42のNorminetteという厳格なコーディング規約では、デバッグ出力を残したままコミットできません。かといって、毎回手動で削除するのは非効率です。

「非効率を解決するツールを作ろう」ということで、flopを開発しました。

flopでできること

flopは3つのコマンドでprintf文を管理します。

flop on     # コメントアウト(無効化)
flop off    # コメント解除(有効化)
flop delete # 完全削除

特徴

📱 インタラクティブTUI(デフォルト)
ripgrepライクなシンタックスハイライトで、選びたい出力文だけを選択できます。

🚀 高速な再帰検索
プロジェクト全体を瞬時にスキャン。.gitignoreも尊重します。

🎯 柔軟なフィルタリング
--debugフラグで"debug"を含む出力のみを対象にできます。

🔍 安全なプレビュー
--previewで変更内容を確認してから実行できます。

対応している出力関数

  • C: printf, fprintf, puts, perror など
  • C++: std::cout, std::cerr, std::clog
  • ファイル: .c, .h, .cpp, .hpp, .cc, .cxx

インストール

# crates.ioから(推奨)
cargo install flop-cli

# ソースから
git clone https://github.com/Justhiro55/flop.git
cd flop
cargo build --release

使い方

基本操作

# インタラクティブモード(デフォルト)
flop on

# 矢印キー or hjkl: 移動
# Space/Tab: 選択トグル
# Enter: 確定 / Esc: キャンセル

実行前:

printf("Starting...\n");
printf("debug: value = %d\n", value);

実行後(flop on):

// printf("Starting...\n");
// printf("debug: value = %d\n", value);

よく使うパターン

# デバッグ出力だけを無効化
flop on --debug

# プレビューで確認してから実行
flop on --preview
flop on  # 問題なければ実行

# 特定ディレクトリを処理
flop on src/

# バッチモード(確認プロンプトあり)
flop on --yes

実践例

例1: 42プロジェクトでの活用

# デバッグしながら開発
vim main.c  # printf追加

# 提出前にプレビュー
flop on --preview

# 問題なければコメントアウト
flop on

# Norminetteチェック→提出
norminette *.c && git push

# 再デバッグが必要になったら
flop off

例2: 段階的なデバッグ

# まずdebug系だけ無効化
flop on --debug

# 動作確認

# すべての出力を無効化
flop on

# 本番環境でテスト

技術的なポイント

TUIの実装

Ratatuiを使用してインタラクティブなUIを実現しました。

  • 2ペイン表示(ファイルリスト + ステートメントリスト)
  • Vim風キーバインド(hjkl)に対応
  • ripgrepライクなシンタックスハイライト

高速な検索

ignoreクレートと正規表現で効率的にファイルをスキャンします。

// 出力関数のパターンマッチング例
let patterns = vec![
    r"printf\s*\(",
    r"std::cout\s*<<",
    // ...
];

大規模プロジェクトでも快適に動作するよう、.gitignoreを尊重した並列処理を実装しています。

安全性の工夫

  • プレビューモード: 変更前に確認
  • 確認プロンプト: 誤操作を防止
  • 可逆性: on/offで元に戻せる設計

まとめ

flopは、C/C++のデバッグ出力管理を効率化するツールです。42TokyoのCommon Coreを通過した節目に、「今まで困っていたこと」を解決するために作りました。
是非、コマンドを通してCLI上でログ管理試してみてください!

今すぐ試せます

cargo install flop-cli
flop on  # カレントディレクトリで実行

今後の予定

  1. Homebrewリリース
    brew install flopでインストール可能に

  2. 多言語対応
    Go(fmt.Println)、Python(print)への拡張

  3. 機能拡張
    ログライブラリ対応、カスタムパターン設定

フィードバックやコントリビューションを歓迎しています!

  • GitHub: Justhiro55/flop
  • Issues: バグ報告や機能リクエストはこちら
  • 対応してほしい言語や使用例の共有もお待ちしています

Discussion