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, + language: Option<(&'static str, Arc)>, } #[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) -> 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, 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); + } } }