@@ -3,7 +3,7 @@ use crate::{
3 compositor::{Component, Compositor, Context, EventResult},
3 compositor::{Component, Compositor, Context, EventResult},
5 keymap::{self, Keymaps},
5 keymap::{self, Keymaps},
6− ui::text_color,
6+ ui::{text_color, Completion},
9use helix_core::{
9use helix_core::{
@@ -29,6 +29,7 @@ pub struct EditorView {
29 on_next_key: Option<Box<dyn FnOnce(&mut commands::Context, KeyEvent)>>,
29 on_next_key: Option<Box<dyn FnOnce(&mut commands::Context, KeyEvent)>>,
30 status_msg: Option<String>,
30 status_msg: Option<String>,
31 last_insert: (commands::Command, Vec<KeyEvent>),
31 last_insert: (commands::Command, Vec<KeyEvent>),
32+ completion: Option<Completion>,
34const OFFSET: u16 = 7; // 1 diagnostic + 5 linenr + 1 gutter
35const OFFSET: u16 = 7; // 1 diagnostic + 5 linenr + 1 gutter
@@ -40,6 +41,7 @@ impl EditorView {
40 on_next_key: None,
41 on_next_key: None,
41 status_msg: None,
42 status_msg: None,
42 last_insert: (commands::normal_mode, Vec::new()),
43 last_insert: (commands::normal_mode, Vec::new()),
@@ -435,15 +437,15 @@ impl EditorView {
438− fn insert_mode(&self, cxt: &mut commands::Context, event: KeyEvent) {
440+ fn insert_mode(&self, cx: &mut commands::Context, event: KeyEvent) {
439 if let Some(command) = self.keymap[&Mode::Insert].get(&event) {
441 if let Some(command) = self.keymap[&Mode::Insert].get(&event) {
440− command(cxt);
442+ command(cx);
441 } else if let KeyEvent {
443 } else if let KeyEvent {
442 code: KeyCode::Char(ch),
444 code: KeyCode::Char(ch),
444 } = event
446 } = event
446− commands::insert::insert_char(cxt, ch);
448+ commands::insert::insert_char(cx, ch);
@@ -476,6 +478,18 @@ impl EditorView {
482+ pub fn set_completion(
484+ items: Vec<helix_lsp::lsp::CompletionItem>,
485+ trigger_offset: usize,
488+ let mut completion = Completion::new(items, trigger_offset);
489+ // TODO : propagate required size on resize to completion too
490+ completion.required_size((size.width, size.height));
491+ self.completion = Some(completion);
481impl Component for EditorView {
495impl Component for EditorView {
@@ -512,7 +526,15 @@ impl Component for EditorView {
512 // record last_insert key
526 // record last_insert key
513 self.last_insert.1.push(event);
527 self.last_insert.1.push(event);
515− self.insert_mode(&mut cxt, event)
529+ self.insert_mode(&mut cxt, event);
531+ if let Some(completion) = &mut self.completion {
532+ completion.update(&mut cxt);
533+ if completion.is_empty() {
534+ self.completion = None;
536+ // TODO: if exiting InsertMode, remove completion
517 mode => self.command_mode(mode, &mut cxt, event),
539 mode => self.command_mode(mode, &mut cxt, event),
@@ -547,6 +569,11 @@ impl Component for EditorView {
547 let doc = cx.editor.document(view.doc).unwrap();
569 let doc = cx.editor.document(view.doc).unwrap();
548 self.render_view(doc, view, view.area, surface, &cx.editor.theme, is_focused);
570 self.render_view(doc, view, view.area, surface, &cx.editor.theme, is_focused);
573+ if let Some(completion) = &self.completion {
574+ completion.render(area, surface, cx)
575+ // render completion here
552 fn cursor_position(&self, area: Rect, editor: &Editor) -> Option<Position> {
579 fn cursor_position(&self, area: Rect, editor: &Editor) -> Option<Position> {