aboutsummaryrefslogtreecommitdiff
path: root/helix-term/src/ui/prompt.rs
diff options
context:
space:
mode:
Diffstat (limited to 'helix-term/src/ui/prompt.rs')
-rw-r--r--helix-term/src/ui/prompt.rs45
1 files changed, 26 insertions, 19 deletions
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);
+ }
}
}