@@ -500,7 +500,7 @@ impl Component for EditorView {
500 cx.editor.resize(Rect::new(0, 0, width, height - 1));
500 cx.editor.resize(Rect::new(0, 0, width, height - 1));
501 EventResult::Consumed(None)
501 EventResult::Consumed(None)
503− Event::Key(event) => {
503+ Event::Key(key) => {
504 let (view, doc) = cx.editor.current();
504 let (view, doc) = cx.editor.current();
505 let mode = doc.mode();
505 let mode = doc.mode();
@@ -519,24 +519,50 @@ impl Component for EditorView {
520 if let Some(on_next_key) = self.on_next_key.take() {
520 if let Some(on_next_key) = self.on_next_key.take() {
521 // if there's a command waiting input, do that first
521 // if there's a command waiting input, do that first
522− on_next_key(&mut cxt, event);
522+ on_next_key(&mut cxt, key);
524 match mode {
524 match mode {
525 Mode::Insert => {
525 Mode::Insert => {
526 // record last_insert key
526 // record last_insert key
527− self.last_insert.1.push(event);
527+ self.last_insert.1.push(key);
529− self.insert_mode(&mut cxt, event);
529+ // let completion swallow the event if necessary
530+ let mut consumed = false;
531 if let Some(completion) = &mut self.completion {
531 if let Some(completion) = &mut self.completion {
532+ // use a fake context here
533+ let mut cx = Context {
535+ callbacks: cxt.callbacks,
536+ executor: cx.executor,
539+ let res = completion.handle_event(event, &mut cx);
541+ if let EventResult::Consumed(callback) = res {
544+ if callback.is_some() {
546+ self.completion = None;
551+ // if completion didn't take the event, we pass it onto commands
553+ self.insert_mode(&mut cxt, key);
555+ // lastly we recalculate completion
556+ if let Some(completion) = &mut self.completion {
532− completion.update(&mut cxt);
557+ completion.update(&mut cxt);
533− if completion.is_empty() {
558+ if completion.is_empty() {
534− self.completion = None;
559+ self.completion = None;
561+ // TODO: if exiting InsertMode, remove completion
536− // TODO: if exiting InsertMode, remove completion
539− mode => self.command_mode(mode, &mut cxt, event),
565+ mode => self.command_mode(mode, &mut cxt, key),
542 self.on_next_key = cxt.on_next_key_callback.take();
568 self.on_next_key = cxt.on_next_key_callback.take();
@@ -554,7 +580,7 @@ impl Component for EditorView {
554 // how we entered insert mode is important, and we should track that so
580 // how we entered insert mode is important, and we should track that so
555 // we can repeat the side effect.
581 // we can repeat the side effect.
557− self.last_insert.0 = self.keymap[&mode][&event];
583+ self.last_insert.0 = self.keymap[&mode][&key];
558 self.last_insert.1.clear();
584 self.last_insert.1.clear();