@@ -33,7 +33,7 @@ use crate::{
3333use crate::job::{self, Job, Jobs};
3434use futures_util::FutureExt;
3535use std::num::NonZeroUsize;
36−use std::{fmt, future::Future};
36+use std::{collections::HashMap, fmt, future::Future};
3737
3838use std::{
3939 borrow::Cow,
@@ -302,7 +302,8 @@ impl Command {
302302 surround_delete, "Surround delete",
303303 select_textobject_around, "Select around object",
304304 select_textobject_inner, "Select inside object",
305− toggle_breakpoint, "Toggle breakpoint",
305+ dap_toggle_breakpoint, "Toggle breakpoint",
306+ dap_launch, "Launch debugger",
306307 suspend, "Suspend"
307308 );
308309}
@@ -1337,7 +1338,6 @@ fn append_mode(cx: &mut Context) {
13371338
13381339mod cmd {
13391340 use super::*;
1340− use std::collections::HashMap;
13411341
13421342 use helix_view::editor::Action;
13431343 use ui::completers::{self, Completer};
@@ -1908,27 +1908,20 @@ mod cmd {
19081908 ) -> anyhow::Result<()> {
19091909 use helix_dap::Client;
19101910 use helix_lsp::block_on;
1911− use serde_json::to_value;
19121911 let (_, doc) = current!(cx.editor);
19131912
19141913 // look up config for filetype
19151914 // if multiple available, open picker
19161915
1917− let client = Client::tcp_process("dlv", vec!["dap"], "-l 127.0.0.1:{}", 0);
1918− let mut client = block_on(client)?;
1916+ let debugger = Client::tcp_process("dlv", vec!["dap"], "-l 127.0.0.1:{}", 0);
1917+ let mut debugger = block_on(debugger)?;
19191918
1920− let request = client.initialize("go".to_owned());
1919+ let request = debugger.initialize("go".to_owned());
19211920 let _ = block_on(request)?;
19221921
1923− let mut args = HashMap::new();
1924− args.insert("mode", "debug");
1925− args.insert("program", "main.go");
1926−
1927− let request = client.launch(to_value(args)?);
1928− let _ = block_on(request)?;
1922+ // TODO: either await "initialized" or buffer commands until event is received
19291923
1930− log::error!("4");
1931− cx.editor.debugger = Some(client);
1924+ cx.editor.debugger = Some(debugger);
19321925 Ok(())
19331926 }
19341927
@@ -4281,13 +4274,15 @@ fn suspend(_cx: &mut Context) {
42814274}
42824275
42834276// DAP
4284−fn toggle_breakpoint(cx: &mut Context) {
4277+fn dap_toggle_breakpoint(cx: &mut Context) {
4278+ use helix_lsp::block_on;
4279+
42854280 let (view, doc) = current!(cx.editor);
42864281 let text = doc.text().slice(..);
42874282 let pos = doc.selection(view.id).primary().cursor(text);
42884283
42894284 let breakpoint = helix_dap::SourceBreakpoint {
4290− line: text.char_to_line(pos),
4285+ line: text.char_to_line(pos) + 1, // convert from 0-indexing to 1-indexing (TODO: could set debugger to 0-indexing on init)
42914286 ..Default::default()
42924287 };
42934288
@@ -4304,11 +4299,30 @@ fn toggle_breakpoint(cx: &mut Context) {
43044299 // we shouldn't really allow editing while debug is running though
43054300
43064301 if let Some(debugger) = &mut cx.editor.debugger {
4307− let breakpoints = debugger.breakpoints.entry(path).or_default();
4302+ let breakpoints = debugger.breakpoints.entry(path.clone()).or_default();
43084303 if let Some(pos) = breakpoints.iter().position(|b| b.line == breakpoint.line) {
43094304 breakpoints.remove(pos);
43104305 } else {
43114306 breakpoints.push(breakpoint);
43124307 }
4308+
4309+ let breakpoints = breakpoints.clone();
4310+
4311+ let request = debugger.set_breakpoints(path, breakpoints);
4312+ let _ = block_on(request).unwrap();
4313+ }
4314+}
4315+
4316+fn dap_launch(cx: &mut Context) {
4317+ use helix_lsp::block_on;
4318+ use serde_json::to_value;
4319+
4320+ if let Some(debugger) = &mut cx.editor.debugger {
4321+ let mut args = HashMap::new();
4322+ args.insert("mode", "debug");
4323+ args.insert("program", "main.go");
4324+
4325+ let request = debugger.launch(to_value(args).unwrap());
4326+ let _ = block_on(request).unwrap();
43134327 }
43144328}