@@ -500,7 +500,7 @@ impl Component for EditorView {
500500 cx.editor.resize(Rect::new(0, 0, width, height - 1));
501501 EventResult::Consumed(None)
502502 }
503− Event::Key(event) => {
503+ Event::Key(key) => {
504504 let (view, doc) = cx.editor.current();
505505 let mode = doc.mode();
506506
@@ -519,24 +519,50 @@ impl Component for EditorView {
519519
520520 if let Some(on_next_key) = self.on_next_key.take() {
521521 // if there's a command waiting input, do that first
522− on_next_key(&mut cxt, event);
522+ on_next_key(&mut cxt, key);
523523 } else {
524524 match mode {
525525 Mode::Insert => {
526526 // record last_insert key
527− self.last_insert.1.push(event);
528−
529− self.insert_mode(&mut cxt, event);
527+ self.last_insert.1.push(key);
530528
529+ // let completion swallow the event if necessary
530+ let mut consumed = false;
531531 if let Some(completion) = &mut self.completion {
532− completion.update(&mut cxt);
533− if completion.is_empty() {
534− self.completion = None;
532+ // use a fake context here
533+ let mut cx = Context {
534+ editor: cxt.editor,
535+ callbacks: cxt.callbacks,
536+ executor: cx.executor,
537+ scroll: None,
538+ };
539+ let res = completion.handle_event(event, &mut cx);
540+
541+ if let EventResult::Consumed(callback) = res {
542+ consumed = true;
543+
544+ if callback.is_some() {
545+ // assume close_fn
546+ self.completion = None;
547+ }
548+ }
549+ }
550+
551+ // if completion didn't take the event, we pass it onto commands
552+ if !consumed {
553+ self.insert_mode(&mut cxt, key);
554+
555+ // lastly we recalculate completion
556+ if let Some(completion) = &mut self.completion {
557+ completion.update(&mut cxt);
558+ if completion.is_empty() {
559+ self.completion = None;
560+ }
561+ // TODO: if exiting InsertMode, remove completion
535562 }
536− // TODO: if exiting InsertMode, remove completion
537563 }
538564 }
539− mode => self.command_mode(mode, &mut cxt, event),
565+ mode => self.command_mode(mode, &mut cxt, key),
540566 }
541567 }
542568 self.on_next_key = cxt.on_next_key_callback.take();
@@ -554,7 +580,7 @@ impl Component for EditorView {
554580 // how we entered insert mode is important, and we should track that so
555581 // we can repeat the side effect.
556582
557− self.last_insert.0 = self.keymap[&mode][&event];
583+ self.last_insert.0 = self.keymap[&mode][&key];
558584 self.last_insert.1.clear();
559585 };
560586