on master help sign in
Handle c-n, c-p, etc. autocompletion events.
7c44443Blaž Hrastnik
helix-term/src/ui/completion.rs+1−1
@@ -131,7 +131,7 @@ impl Completion {
131
131
132 let cursor = doc.selection(view.id).cursor();
132 let cursor = doc.selection(view.id).cursor();
133 if self.trigger_offset <= cursor {
133 if self.trigger_offset <= cursor {
134− let fragment = doc.text().slice(self.trigger_offset..=cursor);
134+ let fragment = doc.text().slice(self.trigger_offset..cursor);
135 let text = Cow::from(fragment);
135 let text = Cow::from(fragment);
136 // TODO: logic is same as ui/picker
136 // TODO: logic is same as ui/picker
137 menu.score(&text);
137 menu.score(&text);
helix-term/src/ui/editor.rs+37−11
@@ -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)
502 }
502 }
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();
506
506
@@ -519,24 +519,50 @@ impl Component for EditorView {
519
519
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);
523 } else {
523 } else {
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);
528−
529− self.insert_mode(&mut cxt, event);
530
528
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 {
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 {
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;
560+ }
561+ // TODO: if exiting InsertMode, remove completion
535 }
562 }
536− // TODO: if exiting InsertMode, remove completion
537 }
563 }
538 }
564 }
539− mode => self.command_mode(mode, &mut cxt, event),
565+ mode => self.command_mode(mode, &mut cxt, key),
540 }
566 }
541 }
567 }
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.
556
582
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();
559 };
585 };
560
586