@@ -307,6 +307,10 @@ impl Command {
307307 dap_start, "Start debug session",
308308 dap_run, "Begin program execution",
309309 dap_continue, "Continue program execution",
310+ dap_pause, "Pause program execution",
311+ dap_in, "Step in",
312+ dap_out, "Step out",
313+ dap_next, "Step to next",
310314 dap_variable_scopes, "List variable scopes",
311315 dap_terminate, "End debug session",
312316 suspend, "Suspend"
@@ -4394,15 +4398,73 @@ fn dap_continue(cx: &mut Context) {
43944398 .set_status("Debuggee is already running".to_owned());
43954399 return;
43964400 }
4397− // assume 0 to continue all threads for now
4398− // FIXME: spec conformant behavior here
4399− let request = debugger.continue_thread(0);
4401+
4402+ let request = debugger.continue_thread(debugger.stopped_thread.unwrap());
44004403 let _ = block_on(request).unwrap();
44014404 debugger.is_running = true;
44024405 debugger.stack_pointer = None;
44034406 }
44044407}
44054408
4409+fn dap_pause(cx: &mut Context) {
4410+ use helix_lsp::block_on;
4411+
4412+ if let Some(debugger) = &mut cx.editor.debugger {
4413+ if !debugger.is_running {
4414+ cx.editor.set_status("Debuggee is not running".to_owned());
4415+ return;
4416+ }
4417+
4418+ let request = debugger.pause(debugger.stopped_thread.unwrap());
4419+ let _ = block_on(request).unwrap();
4420+ }
4421+}
4422+
4423+fn dap_in(cx: &mut Context) {
4424+ use helix_lsp::block_on;
4425+
4426+ if let Some(debugger) = &mut cx.editor.debugger {
4427+ if debugger.is_running {
4428+ cx.editor
4429+ .set_status("Debuggee is already running".to_owned());
4430+ return;
4431+ }
4432+
4433+ let request = debugger.step_in(debugger.stopped_thread.unwrap());
4434+ let _ = block_on(request).unwrap();
4435+ }
4436+}
4437+
4438+fn dap_out(cx: &mut Context) {
4439+ use helix_lsp::block_on;
4440+
4441+ if let Some(debugger) = &mut cx.editor.debugger {
4442+ if debugger.is_running {
4443+ cx.editor
4444+ .set_status("Debuggee is already running".to_owned());
4445+ return;
4446+ }
4447+
4448+ let request = debugger.step_out(debugger.stopped_thread.unwrap());
4449+ let _ = block_on(request).unwrap();
4450+ }
4451+}
4452+
4453+fn dap_next(cx: &mut Context) {
4454+ use helix_lsp::block_on;
4455+
4456+ if let Some(debugger) = &mut cx.editor.debugger {
4457+ if debugger.is_running {
4458+ cx.editor
4459+ .set_status("Debuggee is already running".to_owned());
4460+ return;
4461+ }
4462+
4463+ let request = debugger.next(debugger.stopped_thread.unwrap());
4464+ let _ = block_on(request).unwrap();
4465+ }
4466+}
4467+
44064468fn dap_variable_scopes(cx: &mut Context) {
44074469 use helix_lsp::block_on;
44084470