Rails IRB とデバッガーの共有履歴を停止する

概要

Rails 7.1 と Ruby 3 に移行して以来、Rails コンソールの履歴を使用するのに苦労しています。

以前は、コンソールは独自の履歴を保持し、デバッガーの履歴は別のものでした。したがって、DoSomething というサービスをデバッグしている場合、(c)ontinue、(n)ext などのデバッガー コマンドはコンソール コマンドの履歴の一部にはなりません。

これで、次のようなコンソール履歴が得られました。

DoSomething.call(param)
n
n
n
n
n
c

…DoSomething.call(param) を使用するには 6 回キーを押す必要があります。

履歴を分離する方法はありますか?

.rbdg_history、.irb_history に別々のファイル名を設定しようとしましたが、そもそも IRB、Pry、Debug、Rbdg のどれを使用しているのかがわかりません。コンソールは IRB ですか? Rails コンソールの内部に実際にあるものについての短い概要を入手できれば幸いです。

私は Mac で rbenv を使用しています。

解決策

これは完全な解決策ではありませんが、2 つの歴史を分けるために何が起こらなければならないかを示しています。主な問題は、デバッグ セッション中に変更される共有 Reline::HISTORY です。終了すると、この履歴は .rdbg_history ファイルに書き込まれます。その後、irb も使用しているため、履歴は .irb_history に保存されます。

デバッグが完了したら、履歴を復元する必要があります。

(この行以降) https://github.com/ruby/debug/blob/v1.9.1/lib/debug/console.rb#L200

  diff --git a/lib/debug/console.rb b/lib/debug/console.rb
  index b228086..a162324 100644
  --- a/lib/debug/console.rb
  +++ b/lib/debug/console.rb
  @@ -198,6 +198,8 @@ module DEBUGGER__
                 end
               }
             }
  +
  +          history.slice!(@init_history_lines..-1)
           end
         end
       end

もう 1 つの問題は、終了時に、irb が履歴を保存するまでコードが実行されないことですが、これでは遅すぎます。私が見つけた 1 つの方法は、手動で実行することです。

DEBUGGER__::SESSION.deactivate

例:

$ rm ~/.irb_history ~/.rdbg_history
$ irb
# truncated output for clarity

>> require "debug"
>> debugger

(ruby) puts "from debug"
(rdbg) c    # continue command

>> DEBUGGER__::SESSION.deactivate
>> puts "from irb"
>> exit
$ cat ~/.irb_history      
require "debug"
debugger
puts "from irb"
exit

$ cat ~/.rdbg_history 
puts "from debug"
c
DEBUGGER__::SESSION.deactivate