From d0b0c9b2ef1f26dbf7e5addf59d73b9634907af2 Mon Sep 17 00:00:00 2001 From: Dmitry Sharshakov Date: Sun, 22 Aug 2021 12:06:43 +0300 Subject: [PATCH] editor: select a range if stack pointer has an end --- Cargo.lock | 1 + helix-term/Cargo.toml | 2 ++ helix-term/src/application.rs | 21 +++++++++++++++++---- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2c9d1f316..57ddb01c2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -388,6 +388,7 @@ dependencies = [ "serde_json", "signal-hook", "signal-hook-tokio", + "smallvec", "tokio", "tokio-stream", "toml", diff --git a/helix-term/Cargo.toml b/helix-term/Cargo.toml index c0b2cfe56..638565850 100644 --- a/helix-term/Cargo.toml +++ b/helix-term/Cargo.toml @@ -56,5 +56,7 @@ toml = "0.5" serde_json = "1.0" serde = { version = "1.0", features = ["derive"] } +smallvec = "1.4" + [target.'cfg(not(windows))'.dependencies] # https://github.com/vorner/signal-hook/issues/100 signal-hook-tokio = { version = "0.3", features = ["futures-v0_3"] } diff --git a/helix-term/src/application.rs b/helix-term/src/application.rs index 0d10c9b53..6579cb510 100644 --- a/helix-term/src/application.rs +++ b/helix-term/src/application.rs @@ -1,4 +1,4 @@ -use helix_core::{syntax, Selection}; +use helix_core::{syntax, Range, Selection}; use helix_dap::Payload; use helix_lsp::{lsp, util::lsp_pos_to_pos, LspProgressMap}; use helix_view::{theme, Editor}; @@ -13,7 +13,7 @@ use crate::{ }; use log::error; - +use smallvec::smallvec; use std::{ io::{stdout, Write}, sync::Arc, @@ -309,19 +309,32 @@ impl Application { }), line, column, + end_line, + end_column, .. }) = &debugger.stack_pointer { let path = src.clone(); let line = *line; let column = *column; + let end_line = *end_line; + let end_column = *end_column; self.editor .open(path, helix_view::editor::Action::Replace) .unwrap(); let (view, doc) = current!(self.editor); - let pos = doc.text().line_to_char(line - 1) + column; - doc.set_selection(view.id, Selection::point(pos)); + let start = doc.text().line_to_char(line - 1) + column; + if let Some(end_line) = end_line { + let end = + doc.text().line_to_char(end_line - 1) + end_column.unwrap_or(0); + doc.set_selection( + view.id, + Selection::new(smallvec![Range::new(start, end)], 0), + ); + } else { + doc.set_selection(view.id, Selection::point(start)); + } align_view(doc, view, Align::Center); } self.editor.set_status(status);