summaryrefslogtreecommitdiff
path: root/helix-term
diff options
context:
space:
mode:
authorMichael Davis2023-07-25 19:20:33 +0000
committerBlaž Hrastnik2023-07-27 02:50:19 +0000
commit0dc3753eb2a1af296f5faffaf9c3d29bceb5a37f (patch)
treed3e1a3cff12864b4b51a142c5a88e1a4d0c7e927 /helix-term
parent6a431afc4e650efd2eca4afdf1122b3896e43ee3 (diff)
Syntax-highlight regex prompts
We can use tree-sitter-regex highlighting in prompts for entering regexes, like `search` or `global_search`. The `highlighted_code_block` function from the markdown component makes this a very small change. This could be improved in the future by leaving the parsed syntax tree on the prompt, allowing incremental updates. Prompt lines are usually so short though and tree-sitter-regex is rather small and uncomplicated, so that improvement probably wouldn't make a big difference.
Diffstat (limited to 'helix-term')
-rw-r--r--helix-term/src/ui/mod.rs3
-rw-r--r--helix-term/src/ui/prompt.rs45
2 files changed, 28 insertions, 20 deletions
diff --git a/helix-term/src/ui/mod.rs b/helix-term/src/ui/mod.rs
index 3359155d..8ca1b131 100644
--- a/helix-term/src/ui/mod.rs
+++ b/helix-term/src/ui/mod.rs
@@ -151,7 +151,8 @@ pub fn regex_prompt(
}
}
},
- );
+ )
+ .with_language("regex", std::sync::Arc::clone(&cx.editor.syn_loader));
// Calculate initial completion
prompt.recalculate_completion(cx.editor);
// prompt
diff --git a/helix-term/src/ui/prompt.rs b/helix-term/src/ui/prompt.rs
index 4f383bf5..f376b9c9 100644
--- a/helix-term/src/ui/prompt.rs
+++ b/helix-term/src/ui/prompt.rs
@@ -1,7 +1,9 @@
use crate::compositor::{Component, Compositor, Context, Event, EventResult};
use crate::{alt, ctrl, key, shift, ui};
+use helix_core::syntax;
use helix_view::input::KeyEvent;
use helix_view::keyboard::KeyCode;
+use std::sync::Arc;
use std::{borrow::Cow, ops::RangeFrom};
use tui::buffer::Buffer as Surface;
use tui::widgets::{Block, Borders, Widget};
@@ -32,6 +34,7 @@ pub struct Prompt {
callback_fn: CallbackFn,
pub doc_fn: DocFn,
next_char_handler: Option<PromptCharHandler>,
+ language: Option<(&'static str, Arc<syntax::Loader>)>,
}
#[derive(Clone, Copy, PartialEq, Eq)]
@@ -83,6 +86,7 @@ impl Prompt {
callback_fn: Box::new(callback_fn),
doc_fn: Box::new(|_| None),
next_char_handler: None,
+ language: None,
}
}
@@ -94,6 +98,11 @@ impl Prompt {
self
}
+ pub fn with_language(mut self, language: &'static str, loader: Arc<syntax::Loader>) -> Self {
+ self.language = Some((language, loader));
+ self
+ }
+
pub fn line(&self) -> &String {
&self.line
}
@@ -456,30 +465,28 @@ impl Prompt {
// render buffer text
surface.set_string(area.x, area.y + line, &self.prompt, prompt_color);
- let (input, is_suggestion): (Cow<str>, bool) = if self.line.is_empty() {
- // latest value in the register list
- match self
+ let line_area = area.clip_left(self.prompt.len() as u16).clip_top(line);
+ if self.line.is_empty() {
+ // Show the most recently entered value as a suggestion.
+ if let Some(suggestion) = self
.history_register
.and_then(|reg| cx.editor.registers.last(reg))
- .map(|entry| entry.into())
{
- Some(value) => (value, true),
- None => (Cow::from(""), false),
+ surface.set_string(line_area.x, line_area.y, suggestion, suggestion_color);
}
+ } else if let Some((language, loader)) = self.language.as_ref() {
+ let mut text: ui::text::Text = crate::ui::markdown::highlighted_code_block(
+ self.line.clone(),
+ language,
+ Some(&cx.editor.theme),
+ loader.clone(),
+ None,
+ )
+ .into();
+ text.render(line_area, surface, cx);
} else {
- (self.line.as_str().into(), false)
- };
-
- surface.set_string(
- area.x + self.prompt.len() as u16,
- area.y + line,
- &input,
- if is_suggestion {
- suggestion_color
- } else {
- prompt_color
- },
- );
+ surface.set_string(line_area.x, line_area.y, self.line.clone(), prompt_color);
+ }
}
}