Module: Girb::IrbIntegration

Defined in:
lib/girb/irb_integration.rb

Constant Summary collapse

DEBUG_COMMANDS =
%w[next n step s continue c finish break delete backtrace bt info catch debug].freeze

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.auto_continueObject

Returns the value of attribute auto_continue.



63
64
65
# File 'lib/girb/irb_integration.rb', line 63

def auto_continue
  @auto_continue
end

.pending_user_questionObject

Store the original user question for continuation after debug mode transition



107
108
109
# File 'lib/girb/irb_integration.rb', line 107

def pending_user_question
  @pending_user_question
end

Class Method Details

.add_pending_input_command(cmd) ⇒ Object



84
85
86
# File 'lib/girb/irb_integration.rb', line 84

def add_pending_input_command(cmd)
  pending_input_commands << cmd
end

.add_pending_irb_command(cmd) ⇒ Object



69
70
71
# File 'lib/girb/irb_integration.rb', line 69

def add_pending_irb_command(cmd)
  pending_irb_commands << cmd
end

.auto_continue?Boolean

Returns:

  • (Boolean)


102
103
104
# File 'lib/girb/irb_integration.rb', line 102

def auto_continue?
  @auto_continue
end

.debug_command?(cmd) ⇒ Boolean

Returns:

  • (Boolean)


97
98
99
100
# File 'lib/girb/irb_integration.rb', line 97

def debug_command?(cmd)
  name = cmd.strip.split(/\s+/, 2).first&.downcase
  DEBUG_COMMANDS.include?(name)
end

.has_pending_input?Boolean

Returns:

  • (Boolean)


93
94
95
# File 'lib/girb/irb_integration.rb', line 93

def has_pending_input?
  @pending_input_commands && !@pending_input_commands.empty?
end

.install_ai_keybindingObject



182
183
184
185
186
187
188
189
190
# File 'lib/girb/irb_integration.rb', line 182

def self.install_ai_keybinding
  return unless defined?(Reline)

  Reline::LineEditor.prepend(GirbLineEditorExtension)

  # Ctrl+Space (ASCII 0) にバインド
  Reline.core.config.add_default_key_binding_by_keymap(:emacs, [0], :girb_send_to_ai)
  Reline.core.config.add_default_key_binding_by_keymap(:vi_insert, [0], :girb_send_to_ai)
end

.install_debug_hookObject



154
155
156
157
158
159
160
# File 'lib/girb/irb_integration.rb', line 154

def self.install_debug_hook
  return if @debug_hook_installed
  return unless defined?(IRB::Debug)

  IRB::Debug.singleton_class.prepend(Girb::IrbDebugHook)
  @debug_hook_installed = true
end

.install_eval_hookObject



178
179
180
# File 'lib/girb/irb_integration.rb', line 178

def self.install_eval_hook
  IRB::Context.prepend(EvalHook)
end

.install_readmultiline_patchObject



162
163
164
165
166
167
# File 'lib/girb/irb_integration.rb', line 162

def self.install_readmultiline_patch
  return if @readmultiline_patch_installed

  IRB::Irb.prepend(ReadmultilinePatch)
  @readmultiline_patch_installed = true
end

.pending_input_commandsObject

Commands to be injected into IRB’s input stream



80
81
82
# File 'lib/girb/irb_integration.rb', line 80

def pending_input_commands
  @pending_input_commands ||= []
end

.pending_irb_commandsObject



65
66
67
# File 'lib/girb/irb_integration.rb', line 65

def pending_irb_commands
  @pending_irb_commands ||= []
end

.save_session!Object



122
123
124
125
126
127
128
# File 'lib/girb/irb_integration.rb', line 122

def save_session!
  return unless @session_started
  SessionPersistence.save_session
rescue => e
  # exit時のエラーは静かに無視
  STDERR.puts "[girb] Warning: Failed to save session: #{e.message}" if ENV["GIRB_DEBUG"]
end

.session_started?Boolean

Returns:

  • (Boolean)


109
110
111
# File 'lib/girb/irb_integration.rb', line 109

def session_started?
  @session_started
end

.setupObject



131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# File 'lib/girb/irb_integration.rb', line 131

def self.setup
  # コマンドを登録
  require_relative "../irb/command/qq"

  # 例外キャプチャのインストール
  ExceptionCapture.install

  # Ctrl+Space でAI送信するフックをインストール
  install_eval_hook

  # Ctrl+Space キーバインドをインストール
  install_ai_keybinding

  # readmultiline パッチをインストール(コマンド注入用)
  install_readmultiline_patch

  # セッション永続化が有効なら開始
  start_session! if SessionPersistence.enabled?

  # IRB::Debugをフックして、debug開始時にgirb統合をセットアップ
  install_debug_hook
end

.setup_exit_hookObject



169
170
171
172
173
174
175
176
# File 'lib/girb/irb_integration.rb', line 169

def self.setup_exit_hook
  return if @exit_hook_installed
  @exit_hook_installed = true

  at_exit do
    Girb::IrbIntegration.save_session!
  end
end

.start_session!Object



113
114
115
116
117
118
119
120
# File 'lib/girb/irb_integration.rb', line 113

def start_session!
  return if @session_started
  return unless SessionPersistence.enabled?

  SessionPersistence.start_session
  @session_started = true
  setup_exit_hook unless @exit_hook_installed
end

.take_next_input_commandObject



88
89
90
91
# File 'lib/girb/irb_integration.rb', line 88

def take_next_input_command
  @pending_input_commands ||= []
  @pending_input_commands.shift
end

.take_pending_irb_commandsObject



73
74
75
76
77
# File 'lib/girb/irb_integration.rb', line 73

def take_pending_irb_commands
  cmds = @pending_irb_commands || []
  @pending_irb_commands = []
  cmds
end